you are tearing me apart elise"},/turf/open/floor/carpet,/area/shuttle/escape)
diff --git a/_maps/shuttles/emergency_meta.dmm b/_maps/shuttles/emergency_meta.dmm
index 507090a6124..948f36a7b5e 100644
--- a/_maps/shuttles/emergency_meta.dmm
+++ b/_maps/shuttles/emergency_meta.dmm
@@ -1,132 +1,116 @@
-"aa" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "swall_f6"; dir = 2},/area/shuttle/escape)
-"ab" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
+"aa" = (/turf/open/space,/area/space)
+"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6";dir = 2},/area/shuttle/escape)
"ac" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape)
-"ad" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"ae" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape)
-"af" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo Bay Airlock"},/turf/open/floor/plating{dir = 1; icon_state = "delivery"},/area/shuttle/escape)
-"ag" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "swall_f10"; dir = 2},/area/shuttle/escape)
-"ah" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
-"ai" = (/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; name = "emergency lifejacket"},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3; pixel_y = -3},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat"; pixel_y = 9},/obj/structure/closet/crate{name = "lifejackets"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aj" = (/obj/structure/tank_dispenser/oxygen{layer = 2.7; pixel_x = -1; pixel_y = 2},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"ak" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"al" = (/obj/machinery/status_display{pixel_y = 32},/obj/machinery/hologram/holopad,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"am" = (/obj/structure/table,/obj/item/stack/medical/gauze,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/ointment,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"an" = (/obj/structure/sign/nosmoking_2,/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
-"ao" = (/obj/machinery/recharge_station,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
-"ap" = (/turf/open/floor/plating{dir = 1; icon_state = "delivery"},/area/shuttle/escape)
-"aq" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/item/hand_labeler_refill,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
-"ar" = (/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
-"as" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
-"at" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"au" = (/obj/item/weapon/cigbutt,/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
-"av" = (/obj/structure/closet/crate/medical{name = "medical crate"},/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/toxin{pixel_x = -4; pixel_y = 3},/obj/item/device/healthanalyzer{pixel_x = 3; pixel_y = 3},/obj/item/weapon/lazarus_injector,/mob/living/simple_animal/bot/medbot{name = "\improper emergency medibot"; pixel_x = -3; pixel_y = 2},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
-"aw" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"ax" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"ay" = (/obj/structure/reagent_dispensers/fueltank,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
-"az" = (/obj/structure/closet/crate{name = "emergency supplies crate"},/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/flashlight/flare{pixel_x = 3; pixel_y = 3},/obj/item/device/flashlight/flare{pixel_x = -6; pixel_y = -2},/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/device/radio,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
-"aA" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo Bay Airlock"},/obj/docking_port/mobile/emergency{dheight = 0; dir = 4; dwidth = 5; height = 14; width = 25},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"aB" = (/obj/machinery/vending/wallmed{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = 0; req_access_txt = "0"; use_power = 0},/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
-"aC" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
-"aD" = (/obj/machinery/space_heater,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
-"aE" = (/obj/structure/chair{dir = 4},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = -31},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aF" = (/obj/structure/rack,/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/weapon/weldingtool,/obj/item/weapon/wirecutters,/obj/item/stack/cable_coil,/turf/open/floor/plating{dir = 1; icon_state = "warning"},/area/shuttle/escape)
-"aG" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -3; pixel_y = 1},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0; pixel_y = -1},/obj/item/weapon/storage/toolbox/emergency{pixel_x = 3; pixel_y = -5},/turf/open/floor/plating{dir = 1; icon_state = "warning"},/area/shuttle/escape)
-"aH" = (/turf/open/floor/plating{dir = 1; icon_state = "warning"},/area/shuttle/escape)
-"aI" = (/obj/structure/rack{dir = 1},/obj/item/weapon/tank/internals/oxygen/red,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/mask/gas,/obj/item/clothing/head/hardhat/red,/turf/open/floor/plating{dir = 1; icon_state = "warning"},/area/shuttle/escape)
-"aJ" = (/obj/structure/extinguisher_cabinet,/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape)
-"aK" = (/obj/structure/chair{dir = 8},/obj/structure/sign/bluecross_2{pixel_x = 32},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aL" = (/turf/closed/wall/shuttle{icon_state = "swall7"; dir = 2},/area/shuttle/escape)
-"aM" = (/turf/closed/wall/shuttle{icon_state = "swall8"; dir = 2},/area/shuttle/escape)
-"aN" = (/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Escape Shuttle Infirmary"; req_access_txt = "0"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"aO" = (/obj/structure/sign/bluecross_2,/turf/closed/wall/shuttle{icon_state = "swall4"; dir = 2},/area/shuttle/escape)
-"aP" = (/turf/closed/wall/shuttle{icon_state = "swall11"; dir = 2},/area/shuttle/escape)
-"aQ" = (/obj/machinery/sleeper{dir = 2},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aR" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aS" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aT" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; name = "emergency shower"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"aU" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"aV" = (/obj/structure/table,/obj/item/weapon/defibrillator/loaded,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aW" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 6; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -3},/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = -3; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = 6; pixel_y = 8},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 3; pixel_y = -2},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 4; pixel_y = 1},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = -2; pixel_y = 5},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 2; pixel_y = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aX" = (/obj/structure/table/optable,/obj/item/weapon/surgical_drapes,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aY" = (/obj/structure/table,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/circular_saw,/obj/item/weapon/retractor{pixel_x = 4},/obj/item/weapon/hemostat{pixel_x = -4},/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -27},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"aZ" = (/obj/structure/chair{dir = 8},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"ba" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape)
-"bb" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bc" = (/obj/structure/chair,/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 29},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bd" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"be" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs{pixel_x = 2; pixel_y = 2},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bf" = (/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bg" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0; idle_power_usage = 0; use_power = 0},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bh" = (/obj/machinery/door/airlock/glass_security{name = "Brig"; req_access_txt = "2"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bi" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs{pixel_y = 3},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bj" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
-"bk" = (/obj/machinery/flasher{id = "emshuttlebridgeflash"; pixel_y = -24},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bl" = (/obj/structure/chair{dir = 1},/obj/machinery/button/flasher{id = "emshuttleflash"; name = "brig flasher button"; pixel_y = -23; req_access_txt = "0"; req_one_access_txt = "1;63;19"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bm" = (/obj/structure/chair{dir = 1},/obj/machinery/flasher{id = "emshuttleflash"; pixel_y = -24},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bn" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bo" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/weapon/folder/white{pixel_x = -4; pixel_y = 2},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/obj/item/weapon/book/manual/wiki/security_space_law{pixel_x = -4; pixel_y = 4},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
-"bp" = (/obj/machinery/door/airlock/glass_command{name = "Cockpit"; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bq" = (/turf/closed/wall/shuttle{icon_state = "swall15"; dir = 2},/area/shuttle/escape)
-"br" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bs" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs{pixel_y = 3},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bt" = (/obj/machinery/button/flasher{id = "emshuttlebridgeflash"; name = "cockpit flasher button"; pixel_y = 24; req_access_txt = "0"; req_one_access_txt = "1;63;19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bu" = (/obj/machinery/door/airlock/command{name = "Emergency Recovery Airlock"; req_access = null; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bv" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape)
-"bw" = (/obj/machinery/suit_storage_unit/standard_unit,/obj/machinery/status_display{pixel_y = 31},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
-"bx" = (/obj/machinery/suit_storage_unit/standard_unit,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 27},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
-"by" = (/obj/machinery/computer/security,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bz" = (/obj/structure/chair/office/dark{dir = 8},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bA" = (/obj/structure/chair/office/dark{dir = 4},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bB" = (/obj/structure/table,/obj/item/weapon/folder/blue,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bC" = (/obj/machinery/door/airlock/external{name = "Emergency Recovery Airlock"},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
-"bD" = (/turf/closed/wall/shuttle{icon_state = "swallc4"; dir = 2},/area/shuttle/escape)
-"bE" = (/obj/machinery/computer/crew,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bF" = (/obj/structure/chair/office/dark,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bG" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 8},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 31},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bH" = (/obj/structure/table,/obj/item/weapon/phone{pixel_x = -3; pixel_y = 3},/obj/item/weapon/cigbutt/cigarbutt{pixel_x = 5; pixel_y = -1},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bI" = (/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bJ" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bK" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bL" = (/obj/machinery/computer/station_alert,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bM" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/emergency{pixel_y = 3},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bN" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0; idle_power_usage = 0; pixel_y = 4; use_power = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
-"bO" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/structure/chair{dir = 1},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
-"bP" = (/obj/structure/chair{dir = 1},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
-"bQ" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
-"bR" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "diagonalWall3"},/turf/closed/wall/shuttle{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape)
-"bS" = (/turf/closed/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/escape)
-"bT" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape)
-"bU" = (/turf/open/space,/area/space)
-"bV" = (/turf/open/space,/turf/closed/wall/shuttle{icon_state = "diagonalWall3"},/area/shuttle/escape)
-"bW" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape)
-"bX" = (/turf/closed/wall/shuttle{icon_state = "wall3"},/area/shuttle/escape)
-"bY" = (/turf/open/space,/turf/closed/wall/shuttle{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/escape)
-"bZ" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"ad" = (/turf/closed/wall/shuttle{icon_state = "swall14";dir = 2},/area/shuttle/escape)
+"ae" = (/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape)
+"af" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ag" = (/obj/structure/sign/nosmoking_2,/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape)
+"ah" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{dir = 2;dwidth = 5;height = 14;name = "MetaStation emergency shuttle";width = 25;timid = 1},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ai" = (/turf/closed/wall/shuttle{icon_state = "swall_s10";dir = 2},/area/shuttle/escape)
+"aj" = (/turf/closed/wall/shuttle{tag = "icon-wall3 (NORTHWEST)";icon_state = "wall3";dir = 9},/area/shuttle/escape)
+"ak" = (/turf/closed/wall/shuttle{icon_state = "swall3";dir = 2},/area/shuttle/escape)
+"al" = (/obj/structure/table,/obj/item/weapon/phone{pixel_x = -3;pixel_y = 3},/obj/item/weapon/cigbutt/cigarbutt{pixel_x = 5;pixel_y = -1},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"am" = (/obj/machinery/computer/crew,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"an" = (/obj/machinery/computer/security,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ao" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ap" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aq" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ar" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape)
+"as" = (/obj/item/device/radio/intercom{dir = 4;name = "Station Intercom (General)";pixel_x = 0;pixel_y = 27},/obj/structure/chair,/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape)
+"at" = (/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";name = "emergency lifejacket"},/obj/item/clothing/suit/hazardvest{desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";name = "emergency lifejacket"},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/weapon/tank/internals/emergency_oxygen/double{pixel_x = 3},/obj/item/clothing/mask/breath{pixel_x = -3;pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3;pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3;pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3;pixel_y = -3},/obj/item/clothing/mask/breath{pixel_x = -3;pixel_y = -3},/obj/item/clothing/head/hardhat/orange{name = "protective hat";pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat";pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat";pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat";pixel_y = 9},/obj/item/clothing/head/hardhat/orange{name = "protective hat";pixel_y = 9},/obj/structure/closet/crate{name = "lifejackets"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"au" = (/obj/structure/shuttle/engine/propulsion{dir = 4},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"av" = (/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"aw" = (/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ax" = (/obj/structure/chair/office/dark{dir = 1},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ay" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs{pixel_y = 3},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"az" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall3";dir = 2},/area/shuttle/escape)
+"aA" = (/obj/structure/tank_dispenser/oxygen{layer = 2.7;pixel_x = -1;pixel_y = 2},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aB" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aC" = (/obj/structure/chair/office/dark,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aD" = (/turf/closed/wall/shuttle{icon_state = "swall1"},/area/shuttle/escape)
+"aE" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape)
+"aF" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aG" = (/obj/structure/chair/office/dark{dir = 8},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aH" = (/obj/machinery/door/airlock/glass_command{name = "Cockpit";req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aI" = (/obj/machinery/vending/wallmed{name = "Emergency NanoMed";pixel_x = 0;pixel_y = 0;req_access_txt = "0";use_power = 0},/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape)
+"aJ" = (/obj/structure/extinguisher_cabinet,/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape)
+"aK" = (/turf/closed/wall/shuttle{icon_state = "wall3"},/area/shuttle/escape)
+"aL" = (/obj/machinery/computer/station_alert,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aM" = (/turf/closed/wall/shuttle{icon_state = "swall2"},/area/shuttle/escape)
+"aN" = (/obj/machinery/status_display{dir = 8;pixel_x = 32;pixel_y = 0},/obj/machinery/hologram/holopad,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aO" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/emergency{pixel_y = 3},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aP" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0;idle_power_usage = 0;pixel_y = 4;use_power = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aQ" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2;pixel_y = 8},/obj/item/device/radio/intercom{dir = 2;name = "Station Intercom (General)";pixel_x = 0;pixel_y = -31},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aR" = (/obj/structure/table,/obj/item/weapon/folder/blue,/obj/structure/extinguisher_cabinet{dir = 4;pixel_x = 0;pixel_y = -27},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aS" = (/obj/item/device/radio/intercom{dir = 2;name = "Station Intercom (General)";pixel_x = 0;pixel_y = -31},/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape)
+"aT" = (/obj/structure/table,/obj/item/stack/medical/gauze,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/ointment,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"aU" = (/turf/closed/wall/shuttle{icon_state = "swall7";dir = 2},/area/shuttle/escape)
+"aV" = (/turf/closed/wall/shuttle{icon_state = "swall8";dir = 2},/area/shuttle/escape)
+"aW" = (/obj/machinery/door/airlock/command{name = "Emergency Recovery Airlock";req_access = null;req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"aX" = (/turf/closed/wall/shuttle{icon_state = "swall15";dir = 2},/area/shuttle/escape)
+"aY" = (/obj/machinery/door/airlock/glass_security{name = "Brig";req_access_txt = "2"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"aZ" = (/obj/machinery/door/airlock/glass_medical{id_tag = null;name = "Escape Shuttle Infirmary";req_access_txt = "0"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"ba" = (/obj/structure/sign/bluecross_2,/turf/closed/wall/shuttle{icon_state = "swall14";dir = 2},/area/shuttle/escape)
+"bb" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo Bay Airlock"},/turf/open/floor/plasteel/delivery,/area/shuttle/escape)
+"bc" = (/turf/closed/wall/shuttle{icon_state = "swall11";dir = 2},/area/shuttle/escape)
+"bd" = (/obj/structure/chair{dir = 4},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"be" = (/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"bf" = (/obj/machinery/door/airlock/external{name = "Emergency Recovery Airlock"},/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"bg" = (/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bh" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bi" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bj" = (/obj/structure/table,/obj/item/weapon/defibrillator/loaded,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"bk" = (/obj/machinery/shower,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bl" = (/obj/machinery/sleeper{dir = 8},/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape)
+"bm" = (/obj/structure/rack,/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/weapon/weldingtool,/obj/item/weapon/wirecutters,/obj/item/stack/cable_coil,/turf/open/floor/plasteel/warning{dir = 4},/area/shuttle/escape)
+"bn" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plasteel/delivery,/area/shuttle/escape)
+"bo" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plasteel/delivery,/area/shuttle/escape)
+"bp" = (/turf/open/floor/plasteel/delivery,/area/shuttle/escape)
+"bq" = (/obj/machinery/recharge_station,/turf/open/floor/plasteel/delivery,/area/shuttle/escape)
+"br" = (/turf/closed/wall/shuttle{icon_state = "swall4";dir = 2},/area/shuttle/escape)
+"bs" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bt" = (/obj/structure/reagent_dispensers/peppertank,/turf/closed/wall/shuttle{icon_state = "swall3";dir = 2},/area/shuttle/escape)
+"bu" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = 6;pixel_y = 0},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = -3},/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{pixel_x = -3;pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/charcoal{pixel_x = 6;pixel_y = 8},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 3;pixel_y = -2},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 4;pixel_y = 1},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = -2;pixel_y = 5},/obj/item/weapon/reagent_containers/syringe/epinephrine{pixel_x = 2;pixel_y = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"bv" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -3;pixel_y = 1},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = 0;pixel_y = -1},/obj/item/weapon/storage/toolbox/emergency{pixel_x = 3;pixel_y = -5},/turf/open/floor/plasteel/warning{dir = 4},/area/shuttle/escape)
+"bw" = (/obj/item/weapon/cigbutt,/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"bx" = (/turf/open/floor/plasteel/floorgrime,/area/shuttle/escape)
+"by" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"bz" = (/obj/structure/table/optable,/obj/item/weapon/surgical_drapes,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"bA" = (/turf/open/floor/plasteel/warning{dir = 4},/area/shuttle/escape)
+"bB" = (/turf/closed/wall/shuttle{icon_state = "diagonalWall3"},/area/shuttle/escape)
+"bC" = (/obj/structure/reagent_dispensers/watertank,/turf/open/floor/plating{icon_state = "floorgrime"},/area/shuttle/escape)
+"bD" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/weapon/folder/white{pixel_x = -4;pixel_y = 2},/obj/item/device/radio/intercom{dir = 2;name = "Station Intercom (General)";pixel_x = 0;pixel_y = -31},/obj/item/weapon/book/manual/wiki/security_space_law{pixel_x = -4;pixel_y = 4},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bE" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs{pixel_y = 3},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bF" = (/obj/structure/table,/obj/machinery/recharger{active_power_usage = 0;idle_power_usage = 0;use_power = 0},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bG" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs{pixel_x = 2;pixel_y = 2},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape)
+"bH" = (/obj/structure/table,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/circular_saw,/obj/item/weapon/retractor{pixel_x = 4},/obj/item/weapon/hemostat{pixel_x = -4},/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/item/device/radio/intercom{dir = 2;name = "Station Intercom (General)";pixel_x = -27;pixel_y = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"bI" = (/obj/structure/sink,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape)
+"bJ" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2;pixel_y = 3},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"bK" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3;pixel_y = 3},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape)
+"bL" = (/obj/structure/sign/bluecross_2,/turf/closed/wall/shuttle{icon_state = "swall2"},/area/shuttle/escape)
+"bM" = (/obj/structure/rack{dir = 1},/obj/item/weapon/tank/internals/oxygen/red,/obj/item/clothing/suit/fire/firefighter,/obj/item/clothing/mask/gas,/obj/item/clothing/head/hardhat/red,/turf/open/floor/plasteel/warning{dir = 4},/area/shuttle/escape)
+"bN" = (/obj/machinery/space_heater,/obj/structure/extinguisher_cabinet{dir = 4;pixel_x = 0;pixel_y = -27},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
+"bO" = (/obj/structure/closet/crate{name = "emergency supplies crate"},/obj/item/weapon/storage/toolbox/emergency,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/flashlight/flare{pixel_x = 3;pixel_y = 3},/obj/item/device/flashlight/flare{pixel_x = -6;pixel_y = -2},/obj/item/weapon/crowbar,/obj/item/weapon/wrench,/obj/item/device/radio,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
+"bP" = (/obj/structure/closet/crate/medical{name = "medical crate"},/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3;pixel_y = 3},/obj/item/weapon/storage/firstaid/toxin{pixel_x = -4;pixel_y = 3},/obj/item/device/healthanalyzer{pixel_x = 3;pixel_y = 3},/obj/item/weapon/lazarus_injector,/mob/living/simple_animal/bot/medbot{name = "\improper emergency medibot";pixel_x = -3;pixel_y = 2},/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
+"bQ" = (/obj/item/device/radio/intercom{dir = 2;name = "Station Intercom (General)";pixel_x = 0;pixel_y = -31},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
+"bR" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/item/hand_labeler_refill,/turf/open/floor/plating{icon_state = "bot"},/area/shuttle/escape)
+"bS" = (/turf/closed/wall/shuttle{icon_state = "swall_s5";dir = 2},/area/shuttle/escape)
+"bT" = (/turf/closed/wall/shuttle{icon_state = "swall13";dir = 2},/area/shuttle/escape)
+"bU" = (/turf/closed/wall/shuttle{icon_state = "swall_s9";dir = 2},/area/shuttle/escape)
(1,1,1) = {"
-aaabacabadabadabaeabafafabag
-ahaiajaiakalakamanaoapapaqah
-ahakakakakakakakafapararasah
-atakakakakakakakafaparauavac
-acawakaxacawakaxahayararazac
-aAakakaxaBawakaxacaCauaraDah
-ahaEakaxacawakaxahaFaGaHaIah
-acawakaxaJawakaKaLaMacaNaOaP
-acawakaxacawakaxacaQaQakaRah
-acawakakakakakakaNakakakaSac
-anawakaxacawakaxacaTakakaUac
-adakakaxaJawakaxahaVaWaXaYah
-acawakaxacawakaZaLababbaabaP
-atakakaxaBawakaxahbbbcbdbeah
-ahawakaxacawakaxacbbbfbfbgac
-acakakakakakakakbhbfbfbfbiac
-ahbjakakakbkakbjahblbmbnboah
-aLabbaabbpabbaabbqabaeababaP
-acbrbsakakbtakakbubvahbwbxac
-acbybzakakakbAbBaLbCbDararbC
-acbEakbAbFbzakbGahararararbC
-acbHbIbJbKbLbMbNahbObPbPbQac
-bRabababababababbSababababbT
-bUbVbWbWbWbXbWbWbXbWbWbWbYbU
-bUbUbZbZbZbXbZbZbXbZbZbZbUbU
+aaaaabacacacacadaeacaeafacafagacacacaeahacafaeaeai
+aaajakalamanaoakapaqaraqaraqararararasaqaraqaqatak
+auavakawaqaxayazaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaAac
+auavakaBaCaqaqaDaqaqaEaEaEaEaEaqaEaEaEaEaEaqaqatak
+auavakaFaGaqaqaHaqaqacaIacaJacaqacaJacaIacaqaqaqac
+aKaKakaLaxaqaqaMaqaqarararararaqarararararaqaqaNak
+auavakaOaqaCaqazaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqac
+auavakaPaQaRaqakapaqaEaEaSaEaEaqaEaEaEaEaEaqaqaTak
+aKaKaUaJaeaVaWaXaVaYacaeadaeacaZacbaaeacaJbbbbagbc
+auavakbdbebfbgakbhbgbibiakbjbkaqblakbmbnbobpbpbqak
+auavakbdbebraebcbhbgbgbsbtbuaqaqblacbvbwbxbxbxbpac
+auavakbdbebebyazbhbgbgbsazbzaqaqaqaZbAbxbxbwbxbpac
+aabBakbCbebebyakbDbEbFbGakbHbIbJbKbLbMbNbObPbQbRak
+aaaabSacbfbfacbTaeacacaebTaeacacaebTaeaeacacaeaebU
"}
diff --git a/_maps/shuttles/emergency_narnar.dmm b/_maps/shuttles/emergency_narnar.dmm
index 17b1b2dc1cd..8f1957d974e 100644
--- a/_maps/shuttles/emergency_narnar.dmm
+++ b/_maps/shuttles/emergency_narnar.dmm
@@ -4,21 +4,21 @@
"d" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"e" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"f" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
-"g" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"g" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2;pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"h" = (/obj/machinery/computer/atmos_alert,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"i" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"j" = (/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"k" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"l" = (/obj/machinery/computer/security,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"m" = (/obj/machinery/computer/crew,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
-"n" = (/obj/structure/chair{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
-"o" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"n" = (/obj/structure/chair{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 0;pixel_y = -30},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"o" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)";pixel_x = 0;pixel_y = -29},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"p" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"q" = (/obj/item/stack/sheet/metal,/obj/effect/decal/remains/human,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"r" = (/obj/machinery/door/airlock/cult/unruned/glass/friendly,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"s" = (/obj/machinery/status_display,/turf/closed/wall/mineral/cult,/area/shuttle/escape)
"t" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
-"u" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"u" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2;pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"v" = (/obj/effect/decal/cleanable/blood,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"w" = (/mob/living/simple_animal/hostile/construct/builder,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"x" = (/obj/machinery/door/airlock/cult/friendly,/turf/open/floor/plating,/area/shuttle/escape)
@@ -28,19 +28,19 @@
"B" = (/obj/effect/rune/true_sight,/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/gibs/body,/obj/effect/decal/cleanable/blood/gibs/core,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"C" = (/mob/living/simple_animal/hostile/construct/armored,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"D" = (/obj/effect/rune/true_sight,/obj/effect/decal/remains/human,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
-"E" = (/obj/machinery/door/airlock/cult/friendly,/obj/docking_port/mobile/emergency{name = "shuttle 667"},/turf/open/floor/plating,/area/shuttle/escape)
+"E" = (/obj/machinery/door/airlock/cult/friendly,/obj/docking_port/mobile/emergency{name = "shuttle 667";timid = 1},/turf/open/floor/plating,/area/shuttle/escape)
"F" = (/obj/effect/decal/cleanable/blood/gibs/down,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
-"G" = (/obj/structure/extinguisher_cabinet{has_extinguisher = null; icon_state = "extinguisher_empty"; opened = 1; pixel_x = 27; pixel_y = 0},/obj/item/weapon/extinguisher{safety = 0},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"G" = (/obj/structure/extinguisher_cabinet{has_extinguisher = null;icon_state = "extinguisher_empty";opened = 1;pixel_x = 27;pixel_y = 0},/obj/item/weapon/extinguisher{safety = 0},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"H" = (/mob/living/simple_animal/hostile/construct/wraith,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"I" = (/obj/effect/rune/narsie,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
-"J" = (/mob/living/simple_animal/hostile/carp/eyeball{faction = list("cult"); name = "left eyeball"},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
-"K" = (/mob/living/simple_animal/hostile/carp/eyeball{faction = list("cult"); name = "right eyeball"},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"J" = (/mob/living/simple_animal/hostile/carp/eyeball{faction = list("cult");name = "left eyeball"},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"K" = (/mob/living/simple_animal/hostile/carp/eyeball{faction = list("cult");name = "right eyeball"},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"L" = (/obj/effect/decal/cleanable/blood/drip,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
-"M" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"M" = (/obj/structure/extinguisher_cabinet{pixel_x = 27;pixel_y = 0},/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"N" = (/obj/machinery/door/airlock/cult/glass/friendly,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"O" = (/obj/structure/dresser,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"P" = (/obj/structure/showcase/horrific_experiment,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
-"Q" = (/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/item/stack/sheet/metal,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
+"Q" = (/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2;pixel_y = 3},/obj/item/weapon/crowbar,/obj/structure/extinguisher_cabinet{pixel_x = 27;pixel_y = 0},/obj/item/stack/sheet/metal,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"R" = (/obj/item/stack/sheet/metal,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"S" = (/obj/structure/table/wood,/obj/item/weapon/tome,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
"T" = (/obj/structure/bed,/obj/item/weapon/bedsheet/cult,/turf/open/floor/plasteel/cult,/area/shuttle/escape)
diff --git a/_maps/shuttles/emergency_supermatter.dmm b/_maps/shuttles/emergency_supermatter.dmm
index 5b51ab7b5b1..0187e4514d0 100644
--- a/_maps/shuttles/emergency_supermatter.dmm
+++ b/_maps/shuttles/emergency_supermatter.dmm
@@ -1,69 +1,82 @@
-"a" = (/turf/open/space,/area/space)
-"b" = (/turf/closed/wall/shuttle/smooth,/area/shuttle/escape)
-"c" = (/obj/structure/sign/radiation,/turf/closed/wall/shuttle/smooth,/area/shuttle/escape)
-"d" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape)
-"e" = (/obj/structure/closet/radiation{anchored = 1},/obj/item/clothing/glasses/meson/engine,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
-"f" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
-"g" = (/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
-"h" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
-"i" = (/obj/machinery/shower{dir = 8},/turf/open/floor/noslip,/area/shuttle/escape)
-"j" = (/obj/structure/reflector/single{anchored = 1},/turf/open/floor/plating{icon_state = "warnplate"; dir = 8},/area/shuttle/escape)
-"k" = (/obj/structure/reflector/box{anchored = 1},/turf/open/floor/plating,/area/shuttle/escape)
-"l" = (/obj/structure/reflector/single{tag = "icon-reflector (WEST)"; icon_state = "reflector"; dir = 8; anchored = 1},/turf/open/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/escape)
-"m" = (/obj/machinery/shower{dir = 4},/turf/open/floor/noslip,/area/shuttle/escape)
-"n" = (/obj/machinery/status_display,/turf/closed/wall/shuttle/smooth,/area/shuttle/escape)
-"o" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
-"p" = (/turf/open/floor/plating{icon_state = "warnplate"; dir = 8},/area/shuttle/escape)
-"q" = (/turf/open/floor/plating,/area/shuttle/escape)
-"r" = (/turf/open/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/escape)
-"s" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
-"t" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/escape)
-"u" = (/obj/machinery/power/supermatter_shard/hugbox{anchored = 1; base_icon_state = "darkmatter"; explosion_power = 20; gasefficency = 0.15; icon_state = "darkmatter"; name = "anchored supermatter crystal"},/turf/open/floor/plating,/area/shuttle/escape)
-"v" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/crowbar/red,/obj/item/weapon/storage/box/snappops{pixel_x = 4; pixel_y = -4},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
-"w" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
-"x" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{name = "Hyperfractal Gigashuttle"},/turf/open/floor/plating,/area/shuttle/escape)
-"y" = (/obj/machinery/door/airlock/external{name = "Emergency Launch Catwalk"; req_access = null; req_access_txt = "10;13"},/turf/open/floor/plating,/area/shuttle/escape)
-"z" = (/turf/open/floor/plating/airless,/area/shuttle/escape)
-"A" = (/obj/structure/reflector/single{anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape)
-"B" = (/obj/structure/reflector/double{anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape)
-"C" = (/obj/structure/reflector/double{tag = "icon-reflector_double (NORTH)"; icon_state = "reflector_double"; dir = 1; anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape)
-"D" = (/obj/structure/reflector/single{tag = "icon-reflector (WEST)"; icon_state = "reflector"; dir = 8; anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape)
-"E" = (/turf/open/floor/plating/airless{dir = 9; icon_state = "warnplate"},/area/shuttle/escape)
-"F" = (/turf/open/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/shuttle/escape)
-"G" = (/turf/open/floor/plating/airless{dir = 5; icon_state = "warnplate"},/area/shuttle/escape)
-"H" = (/turf/open/floor/plating/airless{dir = 8; icon_state = "warnplate"},/area/shuttle/escape)
-"I" = (/obj/machinery/power/supermatter_shard/hugbox{anchored = 1; name = "anchored supermatter shard"},/turf/open/floor/plating/airless,/area/shuttle/escape)
-"J" = (/turf/open/floor/plating/airless{dir = 4; icon_state = "warnplate"},/area/shuttle/escape)
-"K" = (/turf/open/floor/plating/airless{dir = 10; icon_state = "warnplate"},/area/shuttle/escape)
-"L" = (/turf/open/floor/plating/airless{dir = 2; icon_state = "warnplate"},/area/shuttle/escape)
-"M" = (/turf/open/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/shuttle/escape)
-"N" = (/obj/machinery/power/emitter/energycannon{dir = 1},/turf/open/floor/plating/airless,/area/shuttle/escape)
-"O" = (/obj/structure/chair,/turf/open/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/shuttle/escape)
-"P" = (/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape)
-"Q" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plating/airless,/area/shuttle/escape)
-"R" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"aa" = (/turf/open/space,/area/space)
+"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape)
+"ac" = (/obj/structure/sign/radiation,/turf/closed/wall/shuttle{tag = "icon-swall12"; icon_state = "swall12"},/area/shuttle/escape)
+"ad" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape)
+"ae" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape)
+"af" = (/turf/closed/wall/shuttle{tag = "icon-swall3"; icon_state = "swall3"},/area/shuttle/escape)
+"ag" = (/obj/structure/closet/radiation{anchored = 1},/obj/item/clothing/glasses/meson/engine,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
+"ah" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
+"ai" = (/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
+"aj" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
+"ak" = (/obj/structure/sign/radiation,/turf/closed/wall/shuttle{tag = "icon-swall3"; icon_state = "swall3"},/area/shuttle/escape)
+"al" = (/obj/machinery/shower{dir = 8},/turf/open/floor/noslip,/area/shuttle/escape)
+"am" = (/obj/structure/reflector/single{anchored = 1},/turf/open/floor/plating{icon_state = "warnplate"; dir = 8},/area/shuttle/escape)
+"an" = (/obj/structure/reflector/box{anchored = 1},/turf/open/floor/plating,/area/shuttle/escape)
+"ao" = (/obj/structure/reflector/single{tag = "icon-reflector (WEST)"; icon_state = "reflector"; dir = 8; anchored = 1},/turf/open/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/escape)
+"ap" = (/obj/machinery/shower{dir = 4},/turf/open/floor/noslip,/area/shuttle/escape)
+"aq" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{tag = "icon-swall3"; icon_state = "swall3"},/area/shuttle/escape)
+"ar" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
+"as" = (/turf/open/floor/plating{icon_state = "warnplate"; dir = 8},/area/shuttle/escape)
+"at" = (/turf/open/floor/plating,/area/shuttle/escape)
+"au" = (/turf/open/floor/plating{icon_state = "warnplate"; dir = 4},/area/shuttle/escape)
+"av" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
+"aw" = (/turf/closed/wall/shuttle{icon_state = "swallc2"; dir = 2},/area/shuttle/escape)
+"ax" = (/turf/closed/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/shuttle/escape)
+"ay" = (/turf/closed/wall/shuttle{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape)
+"az" = (/turf/closed/wall/shuttle{icon_state = "swallc1"},/area/shuttle/escape)
+"aA" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/escape)
+"aB" = (/obj/machinery/power/supermatter_shard/hugbox{anchored = 1; base_icon_state = "darkmatter"; explosion_power = 20; gasefficency = 0.15; icon_state = "darkmatter"; name = "anchored supermatter crystal"},/turf/open/floor/plating,/area/shuttle/escape)
+"aC" = (/obj/structure/sign/radiation,/turf/closed/wall/shuttle/smooth,/area/shuttle/escape)
+"aD" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/crowbar/red,/obj/item/weapon/storage/box/snappops{pixel_x = 4; pixel_y = -4},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
+"aE" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape)
+"aF" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{name = "Hyperfractal Gigashuttle"; timid = 1},/turf/open/floor/plating,/area/shuttle/escape)
+"aG" = (/turf/closed/wall/shuttle{icon_state = "swallc3"},/area/shuttle/escape)
+"aH" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall12"},/area/shuttle/escape)
+"aI" = (/obj/structure/sign/radiation,/turf/closed/wall/shuttle{icon_state = "swallc1"},/area/shuttle/escape)
+"aJ" = (/obj/structure/sign/radiation,/turf/closed/wall/shuttle{icon_state = "swallc2"; dir = 2},/area/shuttle/escape)
+"aK" = (/turf/closed/wall/shuttle{icon_state = "swallc4"; dir = 2},/area/shuttle/escape)
+"aL" = (/obj/machinery/door/airlock/external{name = "Emergency Launch Catwalk"; req_access = null; req_access_txt = "10;13"},/turf/open/floor/plating,/area/shuttle/escape)
+"aM" = (/turf/open/floor/plating/airless,/area/shuttle/escape)
+"aN" = (/obj/structure/reflector/single{anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"aO" = (/obj/structure/reflector/double{anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"aP" = (/obj/structure/reflector/double{tag = "icon-reflector_double (NORTH)"; icon_state = "reflector_double"; dir = 1; anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"aQ" = (/obj/structure/reflector/single{tag = "icon-reflector (WEST)"; icon_state = "reflector"; dir = 8; anchored = 1},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"aR" = (/turf/open/floor/plating/airless{dir = 9; icon_state = "warnplate"},/area/shuttle/escape)
+"aS" = (/turf/open/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/shuttle/escape)
+"aT" = (/turf/open/floor/plating/airless{dir = 5; icon_state = "warnplate"},/area/shuttle/escape)
+"aU" = (/turf/open/floor/plating/airless{dir = 8; icon_state = "warnplate"},/area/shuttle/escape)
+"aV" = (/obj/machinery/power/supermatter_shard/hugbox{anchored = 1; name = "anchored supermatter shard"},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"aW" = (/turf/open/floor/plating/airless{dir = 4; icon_state = "warnplate"},/area/shuttle/escape)
+"aX" = (/turf/open/floor/plating/airless{dir = 10; icon_state = "warnplate"},/area/shuttle/escape)
+"aY" = (/turf/open/floor/plating/airless{dir = 2; icon_state = "warnplate"},/area/shuttle/escape)
+"aZ" = (/turf/open/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/shuttle/escape)
+"ba" = (/obj/machinery/power/emitter/energycannon{dir = 1},/turf/open/floor/plating/airless,/area/shuttle/escape)
+"bb" = (/obj/structure/chair,/turf/open/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/shuttle/escape)
+"bc" = (/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"bd" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plating/airless,/area/shuttle/escape)
+"be" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape)
(1,1,1) = {"
-abcdddddcba
-abefeeefeba
-adeghhhgeda
-aceijklmeca
-aneopqrsena
-adeopqrseda
-bbeopqrsebb
-tggopursggt
-cvgopqrsgwc
-xggopqrsggt
-bndcpqrcdnb
-aaabdydbaaa
-aaaaqzqaaaa
-aAqqBzCqqDa
-azaaazaaaza
-aEFGazaEFGa
-aHIJzzzHIJa
-aKLMazaKLMa
-aqqaazaaqqa
-aNNzEOGzNNa
-aPPaHQJaPPa
-aRRaKLMaRRa
+aaabacadadadadadacaeaa
+aaafagahagagagahagafaa
+aaadagaiajajajaiagadaa
+aaakagalamanaoapagakaa
+aaaqagarasatauavagaqaa
+aaadagarasatauavagadaa
+awaxagarasatauavagayaz
+aAaiaiarasaBauavaiaiaA
+aCaDaiarasatauavaiaEaC
+aFaiaiarasatauavaiaiaA
+aGaHadaIasatauaJadaHaK
+aaaaaaaGadaLadaKaaaaaa
+aaaaaaaaataMataaaaaaaa
+aaaNatataOaMaPatataQaa
+aaaMaaaaaaaMaaaaaaaMaa
+aaaRaSaTaaaMaaaRaSaTaa
+aaaUaVaWaMaMaMaUaVaWaa
+aaaXaYaZaaaMaaaXaYaZaa
+aaatataaaaaMaaaaatataa
+aababaaMaRbbaTaMbabaaa
+aabcbcaaaUbdaWaabcbcaa
+aabebeaaaXaYaZaabebeaa
"}
diff --git a/_maps/shuttles/emergency_wabbajack.dmm b/_maps/shuttles/emergency_wabbajack.dmm
new file mode 100644
index 00000000000..9cc9bbcfe6c
--- /dev/null
+++ b/_maps/shuttles/emergency_wabbajack.dmm
@@ -0,0 +1,648 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aa" = (
+/turf/open/space,
+/area/space)
+"ab" = (
+/turf/closed/wall/shuttle/smooth,
+/area/shuttle/escape)
+"ac" = (
+/obj/structure/grille,
+/obj/structure/window/shuttle/tinted,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"ad" = (
+/turf/open/floor/plasteel/green,
+/area/shuttle/escape)
+"ae" = (
+/turf/open/floor/plasteel/darkgreen,
+/area/shuttle/escape)
+"af" = (
+/obj/machinery/power/emitter/energycannon/magical,
+/turf/open/floor/plasteel/darkgreen,
+/area/shuttle/escape)
+"ag" = (
+/obj/structure/table/abductor/wabbajack/left,
+/turf/open/floor/plasteel/darkgreen,
+/area/shuttle/escape)
+"ah" = (
+/obj/structure/table/abductor/wabbajack/right,
+/turf/open/floor/plasteel/darkgreen,
+/area/shuttle/escape)
+"ai" = (
+/obj/structure/sign/biohazard,
+/turf/closed/wall/shuttle/smooth,
+/area/shuttle/escape)
+"aj" = (
+/obj/structure/barricade/wooden,
+/obj/machinery/door/airlock/shuttle,
+/turf/open/floor/plasteel/cult,
+/area/shuttle/escape)
+"ak" = (
+/obj/structure/chair{
+ dir = 4
+ },
+/turf/open/floor/plasteel/shuttle/red,
+/area/shuttle/escape)
+"al" = (
+/turf/open/floor/plasteel/shuttle/red,
+/area/shuttle/escape)
+"am" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/turf/open/floor/plasteel/shuttle/red,
+/area/shuttle/escape)
+"an" = (
+/obj/structure/table/wood,
+/obj/item/candle/infinite,
+/turf/open/floor/plasteel/cult,
+/area/shuttle/escape)
+"ao" = (
+/obj/structure/barricade/wooden,
+/turf/open/floor/plasteel/cult,
+/area/shuttle/escape)
+"ap" = (
+/turf/open/floor/plasteel/cult,
+/area/shuttle/escape)
+"aq" = (
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"ar" = (
+/obj/structure/table,
+/obj/item/weapon/storage/firstaid/fire,
+/obj/item/weapon/storage/firstaid/regular{
+ pixel_x = 2;
+ pixel_y = 3
+ },
+/obj/item/weapon/crowbar,
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"as" = (
+/obj/structure/grille,
+/obj/structure/window/shuttle,
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"at" = (
+/obj/machinery/flasher{
+ id = "shuttle_flasher";
+ pixel_x = -24;
+ pixel_y = 6
+ },
+/obj/machinery/button/flasher{
+ id = "shuttle_flasher";
+ pixel_x = -24;
+ pixel_y = -6
+ },
+/obj/structure/chair{
+ dir = 4
+ },
+/turf/open/floor/plasteel/shuttle/red,
+/area/shuttle/escape)
+"au" = (
+/obj/structure/chair/wood,
+/turf/open/floor/plasteel/cult,
+/area/shuttle/escape)
+"av" = (
+/obj/structure/chair,
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"aw" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"ax" = (
+/obj/machinery/door/airlock/shuttle{
+ name = "Emergency Shuttle Airlock";
+ req_access_txt = "2"
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"ay" = (
+/obj/structure/table,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen{
+ pixel_x = -2;
+ pixel_y = 4
+ },
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"az" = (
+/obj/machinery/computer/emergency_shuttle,
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"aA" = (
+/obj/structure/table,
+/obj/item/weapon/coin/mythril,
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"aB" = (
+/obj/machinery/door/airlock/glass{
+ name = "Emergency Shuttle Brig";
+ req_access_txt = "2"
+ },
+/turf/open/floor/plasteel/shuttle,
+/area/shuttle/escape)
+"aC" = (
+/obj/machinery/door/airlock/shuttle,
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"aD" = (
+/obj/machinery/door/airlock/shuttle{
+ name = "Emergency Shuttle Airlock"
+ },
+/obj/docking_port/mobile/emergency{
+ timid = 1, name = "NT Lepton Violet"
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"aE" = (
+/turf/open/floor/plasteel/shuttle,
+/area/shuttle/escape)
+"aF" = (
+/obj/machinery/door/window/eastleft,
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"aG" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 27;
+ pixel_y = 0
+ },
+/obj/structure/table/glass,
+/obj/item/weapon/storage/box/syringes{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/item/weapon/storage/box/beakers,
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"aH" = (
+/turf/closed/wall/shuttle{
+ icon_state = "swall3";
+ dir = 2
+ },
+/area/shuttle/escape)
+"aI" = (
+/obj/structure/chair{
+ dir = 4
+ },
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"aJ" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"aK" = (
+/obj/machinery/sleeper{
+ icon_state = "sleeper-open";
+ dir = 4
+ },
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"aL" = (
+/obj/structure/table/reinforced,
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"aM" = (
+/obj/machinery/chem_dispenser,
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"aN" = (
+/obj/structure/table,
+/obj/item/weapon/storage/toolbox/mechanical,
+/obj/item/weapon/storage/firstaid/regular{
+ pixel_x = -1;
+ pixel_y = 1
+ },
+/obj/item/weapon/wrench/medical,
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"aO" = (
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"aP" = (
+/obj/structure/chair/office/light{
+ dir = 8
+ },
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"aQ" = (
+/obj/machinery/chem_heater,
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"aR" = (
+/obj/machinery/chem_master,
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"aS" = (
+/obj/machinery/door/window/eastright,
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"aT" = (
+/obj/structure/table/glass,
+/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/item/weapon/reagent_containers/glass/bottle/charcoal,
+/turf/open/floor/plasteel/shuttle{
+ icon_state = "shuttlefloor3"
+ },
+/area/shuttle/escape)
+"aU" = (
+/obj/machinery/door/airlock/glass,
+/turf/open/floor/plasteel/shuttle,
+/area/shuttle/escape)
+"aV" = (
+/obj/machinery/door/airlock/shuttle{
+ name = "Emergency Shuttle Airlock"
+ },
+/turf/open/floor/plating,
+/area/shuttle/escape)
+"aW" = (
+/turf/open/floor/plasteel/yellow,
+/turf/open/floor/plasteel/warningline{
+ tag = "icon-warningline (NORTH)";
+ icon_state = "warningline";
+ dir = 1
+ },
+/area/shuttle/escape)
+"aX" = (
+/turf/open/floor/plasteel/yellow,
+/turf/open/floor/plasteel/warningline{
+ tag = "icon-warningline (NORTHEAST)";
+ icon_state = "warningline";
+ dir = 5
+ },
+/area/shuttle/escape)
+"aY" = (
+/turf/open/floor/plasteel/whitered,
+/turf/open/floor/plasteel/warningline{
+ tag = "icon-warningline (NORTHWEST)";
+ icon_state = "warningline";
+ dir = 9
+ },
+/area/shuttle/escape)
+"aZ" = (
+/turf/open/floor/plasteel/whitered,
+/turf/open/floor/plasteel/warningline{
+ tag = "icon-warningline (NORTH)";
+ icon_state = "warningline";
+ dir = 1
+ },
+/area/shuttle/escape)
+"ba" = (
+/obj/structure/cult/forge{
+ desc = "A engine used in powering the shuttle.";
+ name = "magma engine"
+ },
+/turf/open/floor/plasteel/yellow,
+/area/shuttle/escape)
+"bb" = (
+/turf/open/floor/plasteel/yellow,
+/turf/open/floor/plasteel/warningline{
+ tag = "icon-warningline (EAST)";
+ icon_state = "warningline";
+ dir = 4
+ },
+/area/shuttle/escape)
+"bc" = (
+/turf/open/floor/plasteel/whitered,
+/turf/open/floor/plasteel/warningline{
+ tag = "icon-warningline (WEST)";
+ icon_state = "warningline";
+ dir = 8
+ },
+/area/shuttle/escape)
+"bd" = (
+/obj/structure/cult/forge{
+ desc = "A engine used in powering the shuttle.";
+ name = "magma engine"
+ },
+/turf/open/floor/plasteel/whitered,
+/area/shuttle/escape)
+"be" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/turf/open/floor/plating/lava/smooth/airless,
+/area/shuttle/escape)
+"bf" = (
+/obj/structure/shuttle/engine/heater,
+/turf/open/floor/plating/lava/smooth/airless,
+/area/shuttle/escape)
+"bg" = (
+/obj/structure/shuttle/engine/propulsion,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+
+(1,1,1) = {"
+aa
+aa
+aa
+aa
+ab
+ab
+ab
+ax
+ab
+aD
+aH
+as
+as
+as
+aH
+aV
+ab
+aV
+ab
+ab
+ab
+aa
+"}
+(2,1,1) = {"
+aa
+ab
+ab
+ab
+ab
+ak
+at
+al
+as
+aE
+aI
+aI
+aI
+aE
+ab
+aE
+aI
+aW
+ba
+be
+ab
+ab
+"}
+(3,1,1) = {"
+ab
+ab
+ag
+ae
+ab
+al
+al
+al
+aB
+aE
+aE
+aE
+aE
+aE
+ab
+aE
+aE
+aX
+bb
+be
+bf
+bg
+"}
+(4,1,1) = {"
+ac
+ad
+ae
+ad
+ab
+am
+am
+am
+as
+aE
+aJ
+aJ
+aJ
+aE
+aU
+aE
+aE
+aE
+aE
+be
+bf
+bg
+"}
+(5,1,1) = {"
+ac
+ae
+ad
+ae
+ab
+ab
+ab
+ab
+ab
+aq
+aK
+aN
+aK
+aq
+ab
+aw
+aw
+aw
+aw
+be
+bf
+bg
+"}
+(6,1,1) = {"
+ac
+af
+ad
+ae
+ai
+an
+au
+ay
+ab
+aq
+aq
+aq
+aq
+aq
+ab
+ab
+ab
+ab
+ab
+be
+bf
+bg
+"}
+(7,1,1) = {"
+ac
+ae
+ad
+ae
+aj
+ao
+au
+az
+ab
+aF
+aJ
+aq
+aJ
+aS
+as
+aI
+aI
+aI
+aI
+be
+bf
+bg
+"}
+(8,1,1) = {"
+ac
+ad
+ae
+ad
+ai
+ap
+av
+aA
+ab
+aq
+aL
+aO
+aL
+aq
+aU
+aE
+aE
+aE
+aE
+be
+bf
+bg
+"}
+(9,1,1) = {"
+ab
+ab
+ah
+ae
+ab
+aq
+aq
+aq
+aC
+aq
+aq
+aP
+aq
+aq
+as
+av
+aE
+aY
+bc
+be
+bf
+bg
+"}
+(10,1,1) = {"
+aa
+ab
+ab
+ab
+ab
+ar
+aw
+aw
+ab
+aG
+aM
+aQ
+aR
+aT
+as
+av
+aE
+aZ
+bd
+be
+ab
+ab
+"}
+(11,1,1) = {"
+aa
+aa
+aa
+aa
+ab
+as
+ab
+as
+ab
+ab
+ab
+as
+as
+as
+ab
+ab
+ab
+as
+ab
+ab
+ab
+aa
+"}
diff --git a/_maps/shuttles/ferry_base.dmm b/_maps/shuttles/ferry_base.dmm
index 66b39b7dd87..0e5e5f12a35 100644
--- a/_maps/shuttles/ferry_base.dmm
+++ b/_maps/shuttles/ferry_base.dmm
@@ -10,7 +10,7 @@
"j" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
"k" = (/obj/machinery/door/airlock/shuttle,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
"l" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
-"m" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 12; id = "ferry"; name = "ferry shuttle"; roundstart_move = "ferry_away"; travelDir = 180; width = 5},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"m" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 12; id = "ferry"; name = "ferry shuttle"; roundstart_move = "ferry_away"; travelDir = 180; width = 5; timid = 1},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
"n" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/closed/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/transport)
"o" = (/turf/open/floor/plasteel/shuttle,/turf/closed/wall/shuttle/interior{icon_state = "swall_f10"},/area/shuttle/transport)
"p" = (/obj/structure/closet/crate,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
diff --git a/_maps/shuttles/ferry_lighthouse.dmm b/_maps/shuttles/ferry_lighthouse.dmm
index 9267e97bcf0..867110f7d7a 100644
--- a/_maps/shuttles/ferry_lighthouse.dmm
+++ b/_maps/shuttles/ferry_lighthouse.dmm
@@ -38,7 +38,7 @@
"aL" = (/turf/closed/wall/rust,/area/shuttle/transport)
"aM" = (/obj/structure/table/wood,/obj/structure/window/reinforced{dir = 4},/turf/open/floor/wood,/area/shuttle/transport)
"aN" = (/obj/machinery/power/grounding_rod{anchored = 1},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
-"aO" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8;dwidth = 9;height = 27;id = "ferry";name = "ferry shuttle";roundstart_move = "ferry_away";travelDir = 180;width = 16},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
+"aO" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8;dwidth = 8;height = 27;id = "ferry";name = "The Lighthouse";roundstart_move = "ferry_away";timid = 1;travelDir = 180;width = 16},/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
"aP" = (/obj/machinery/vending/magivend,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
"aQ" = (/obj/structure/grille,/obj/structure/window/fulltile,/turf/open/floor/plasteel/shuttle,/area/shuttle/transport)
"aR" = (/obj/structure/chair/office/dark{dir = 4},/turf/open/floor/wood,/area/shuttle/transport)
@@ -70,9 +70,9 @@ aaafamanaoapadadapaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae
aaafafaqakapararapapapaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae
agaaaaasakatauauavauapapapawawadadaxaxayaxaxaxazaxaxaA
agagagaBakapauauaCaDaDaDaEaEaEakaFaGaHaIakaJaJaJaJaKay
-aaaaaaasakaLauauaMaDaDaDaNaNaEaEaEaEaEaEaEaEaEaEaEaEaO
+aaaaaaasakaLauauaCaDaDaDaNaNaEaEaEaEaEaEaEaEaEaEaEaEaO
aaaaagasaPaQauaRaSaDaDaDaEaEaEakaTaUaVaWaWaWaWaWaWaWay
-aaabacaXaXapauauaMaDaDaDadadadaYawadaxayaxaxaxazaxaxaZ
+aaabacaXaXapauauaCaDaDaDadadadaYawadaxayaxaxaxazaxaxaZ
aaaaagahbaaLaLbbbcbdadadadaeaeaeaeaeaeaeaeaeaeaeaeaeae
aaaaaaahbebebfbgadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae
aaaaagahbhbhadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeae
diff --git a/_maps/shuttles/ferry_meat.dmm b/_maps/shuttles/ferry_meat.dmm
index e8bb7a536ce..eda349c9aa3 100644
--- a/_maps/shuttles/ferry_meat.dmm
+++ b/_maps/shuttles/ferry_meat.dmm
@@ -14,7 +14,7 @@
"n" = (/obj/effect/decal/cleanable/dirt,/obj/structure/chair,/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
"o" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/open/floor/plating,/area/shuttle/transport)
"p" = (/obj/machinery/door/airlock/shuttle,/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
-"q" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8;dwidth = 2;height = 12;id = "ferry";name = "ferry shuttle";roundstart_move = "ferry_away";travelDir = 180;width = 5},/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
+"q" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dir = 8;dwidth = 2;height = 12;id = "ferry";name = "ferry shuttle";roundstart_move = "ferry_away";travelDir = 180;width = 5;timid = 1},/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
"r" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion";dir = 4},/turf/closed/wall/shuttle{icon_state = "swall_s5";dir = 2},/area/shuttle/transport)
"s" = (/turf/open/floor/plasteel/freezer,/turf/closed/wall/shuttle/interior{icon_state = "swall_f10"},/area/shuttle/transport)
"t" = (/obj/structure/closet/chefcloset,/turf/open/floor/plasteel/freezer,/area/shuttle/transport)
diff --git a/_maps/shuttles/whiteship_box.dmm b/_maps/shuttles/whiteship_box.dmm
index 44db343ee14..07756f111dd 100644
--- a/_maps/shuttles/whiteship_box.dmm
+++ b/_maps/shuttles/whiteship_box.dmm
@@ -1,7 +1,7 @@
"aa" = (/turf/open/space,/area/space)
"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/abandoned)
"ac" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/abandoned)
-"ad" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dheight = 0; dir = 2; dwidth = 11; height = 22; id = "whiteship"; launch_status = 0; name = "NT Medical Ship"; roundstart_move = "whiteship_away"; travelDir = 180; width = 35},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
+"ad" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile{dheight = 0; dir = 2; dwidth = 11; height = 22; id = "whiteship"; launch_status = 0; name = "NT Medical Ship"; roundstart_move = "whiteship_away"; travelDir = 180; width = 35; timid = 1},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
"ae" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/abandoned)
"af" = (/obj/machinery/door/airlock/shuttle,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/abandoned)
"ag" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 4},/turf/open/floor/plating/airless,/area/shuttle/abandoned)
diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm
index 834aaa68d89..0b5fb24e513 100644
--- a/_maps/shuttles/whiteship_meta.dmm
+++ b/_maps/shuttles/whiteship_meta.dmm
@@ -4,7 +4,7 @@
"ad" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/abandoned)
"ae" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/abandoned)
"af" = (/turf/closed/wall/shuttle{icon_state = "swallc1"; dir = 2},/area/shuttle/abandoned)
-"ag" = (/obj/docking_port/mobile{dheight = 0; dir = 2; dwidth = 11; height = 15; id = "whiteship"; launch_status = 0; name = "NT Recovery White-Ship"; roundstart_move = "whiteship_away"; travelDir = 180; width = 27},/obj/machinery/door/airlock/shuttle{name = "recovery shuttle external airlock"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
+"ag" = (/obj/docking_port/mobile{dheight = 0; dir = 2; dwidth = 11; height = 15; id = "whiteship"; launch_status = 0; name = "NT Recovery White-Ship"; roundstart_move = "whiteship_away"; travelDir = 180; width = 27; timid = 1},/obj/machinery/door/airlock/shuttle{name = "recovery shuttle external airlock"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
"ah" = (/obj/machinery/door/airlock/shuttle{name = "recovery shuttle external airlock"},/obj/effect/decal/cleanable/dirt{desc = "A thin layer of dust coating the floor."; name = "dust"},/turf/open/floor/plasteel/shuttle,/area/shuttle/abandoned)
"ai" = (/turf/closed/wall/shuttle{icon_state = "swallc2"; dir = 2},/area/shuttle/abandoned)
"aj" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/abandoned)
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 04e5a8fbf0d..2458519c4e6 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -39,11 +39,10 @@
//Grab levels
-#define GRAB_PASSIVE 1
-#define GRAB_AGGRESSIVE 2
-#define GRAB_NECK 3
-#define GRAB_UPGRADING 4
-#define GRAB_KILL 5
+#define GRAB_PASSIVE 0
+#define GRAB_AGGRESSIVE 1
+#define GRAB_NECK 2
+#define GRAB_KILL 3
//Hostile Mob AI Status
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index d6ab9543d76..bf7afd1e029 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -32,8 +32,6 @@
#define BLOCK_GAS_SMOKE_EFFECT 8192 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! (NOTE: flag shared with THICKMATERIAL)
#define THICKMATERIAL 8192 //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with BLOCK_GAS_SMOKE_EFFECT)
-#define NOREACT 16384 //Reagents dont' react inside this container.
-
//turf-only flags
#define NOJAUNT 1
@@ -81,3 +79,6 @@
#define SLIME 16
#define DRONE 32
#define SWARMER 64
+
+// Flags for reagents
+#define REAGENT_NOREACT 1
diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm
index 27252048b47..c3b815bd923 100644
--- a/code/__DEFINES/hud.dm
+++ b/code/__DEFINES/hud.dm
@@ -15,7 +15,7 @@
#define DIAG_MECH_HUD "11"// Mech health bar
#define DIAG_BOT_HUD "12"// Bot HUDs
//for antag huds. these are used at the /mob level
-#define ANTAG_HUD "12"
+#define ANTAG_HUD "13"
//data HUD (medhud, sechud) defines
//Don't forget to update human/New() if you change these!
@@ -39,3 +39,4 @@
#define ANTAG_HUD_DEVIL 17
#define ANTAG_HUD_SINTOUCHED 18
#define ANTAG_HUD_SOULLESS 19
+#define ANTAG_HUD_CLOCKWORK 20
diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm
new file mode 100644
index 00000000000..06c7f4151df
--- /dev/null
+++ b/code/__DEFINES/layers.dm
@@ -0,0 +1,54 @@
+//Defines for atom layers
+//KEEP THESE IN A NICE ACSCENDING ORDER, PLEASE
+
+//#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define
+#define ABOVE_OPEN_TURF_LAYER 2.01
+#define CLOSED_TURF_LAYER 2.05
+#define ABOVE_NORMAL_TURF_LAYER 2.08
+#define LATTICE_LAYER 2.2
+#define DISPOSAL_PIPE_LAYER 2.3
+#define GAS_PIPE_LAYER 2.35
+#define WIRE_LAYER 2.4
+#define WIRE_TERMINAL_LAYER 2.45
+#define LOW_OBJ_LAYER 2.5
+
+#define OPEN_DOOR_LAYER 2.7
+#define PROJECTILE_HIT_THRESHHOLD_LAYER 2.75 //projectiles won't hit objects at or below this layer if possible
+#define TABLE_LAYER 2.8
+#define BELOW_OBJ_LAYER 2.9
+#define LOW_ITEM_LAYER 2.95
+//#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define
+#define CLOSED_DOOR_LAYER 3.1
+#define CLOSED_FIREDOOR_LAYER 3.11
+#define ABOVE_OBJ_LAYER 3.2
+#define SIGN_LAYER 3.4
+#define HIGH_OBJ_LAYER 3.5
+
+#define BELOW_MOB_LAYER 3.7
+#define LYING_MOB_LAYER 3.8
+//#define MOB_LAYER 4 //For easy recordkeeping; this is a byond define
+#define ABOVE_MOB_LAYER 4.1
+#define WALL_OBJ_LAYER 4.25
+#define EDGED_TURF_LAYER 4.3
+#define ON_EDGED_TURF_LAYER 4.35
+#define LARGE_MOB_LAYER 4.4
+#define ABOVE_ALL_MOB_LAYER 4.5
+
+#define SPACEVINE_LAYER 4.8
+#define SPACEVINE_MOB_LAYER 4.9
+//#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define
+
+#define GHOST_LAYER 6
+#define AREA_LAYER 10
+#define MASSIVE_OBJ_LAYER 11
+#define POINT_LAYER 12
+#define LIGHTING_LAYER 15
+
+//HUD layer defines
+#define FLASH_LAYER 17.9
+#define FULLSCREEN_LAYER 18
+#define DAMAGE_LAYER 18.1
+#define BLIND_LAYER 18.2
+#define CRIT_LAYER 18.3
+#define HUD_LAYER 19
+#define ABOVE_HUD_LAYER 19.1
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 18e49b84ee3..1b78d640dbe 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -150,8 +150,9 @@
#define CLICK_CD_RANGE 4
#define CLICK_CD_BREAKOUT 100
#define CLICK_CD_HANDCUFFED 10
-#define CLICK_CD_TKSTRANGLE 10
#define CLICK_CD_RESIST 20
+#define CLICK_CD_GRABBING 10
+
//click cooldowns, in tenths of a second
@@ -226,7 +227,7 @@
#define MIN_RANGE_FIND 16
#define FUZZY_CHANCE_HIGH 85
#define FUZZY_CHANCE_LOW 50
-#define CHANCE_TALK 15
+#define CHANCE_TALK 1
#define SNPC_BRUTE 1
#define SNPC_STEALTH 2
@@ -396,12 +397,6 @@ var/global/list/ghost_others_options = list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
#define APPEARANCE_UI_IGNORE_ALPHA RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|RESET_ALPHA
#define APPEARANCE_UI RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR
-//Launching Shuttles to Centcomm
-#define NOLAUNCH -1
-#define UNLAUNCHED 0
-#define ENDGAME_LAUNCHED 1
-#define EARLY_LAUNCHED 2
-
//Just space
#define SPACE_ICON_STATE "[((x + y) ^ ~(x * y) + z) % 25]"
@@ -424,12 +419,15 @@ var/global/list/ghost_others_options = list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
#define MAP_MAXY 5
#define MAP_MAXZ 6
-// Shuttle return values
-#define SHUTTLE_ALREADY_DOCKED 7
-
-
#define CHECK_DNA_AND_SPECIES(C) if((!(C.dna)) || (!(C.dna.species))) return
// Evil narsie colour
#define NARSIE_WINDOW_COLOUR "#7D1919"
+// Defib stats
+#define DEFIB_TIME_LIMIT 120
+#define DEFIB_TIME_LOSS 60
+
+// Diagonal movement
+#define FIRST_DIAG_STEP 1
+#define SECOND_DIAG_STEP 2
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index 980436018c6..638e259a3c5 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -25,7 +25,7 @@
#define ROLE_HOG_GOD "hand of god: god"
#define ROLE_HOG_CULTIST "hand of god: cultist"
#define ROLE_DEVIL "devil"
-
+#define ROLE_SERVANT_OF_RATVAR "servant of Ratvar"
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
//The gamemode specific ones are just so the gamemodes can query whether a player is old enough
@@ -49,5 +49,6 @@ var/global/list/special_roles = list(
ROLE_ABDUCTOR = /datum/game_mode/abduction,
ROLE_HOG_GOD = /datum/game_mode/hand_of_god,
ROLE_HOG_CULTIST = /datum/game_mode/hand_of_god,
- ROLE_DEVIL = /datum/game_mode/devil
+ ROLE_DEVIL = /datum/game_mode/devil,
+ ROLE_SERVANT_OF_RATVAR = /datum/game_mode/clockwork_cult,
)
diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm
new file mode 100644
index 00000000000..11b802d63c1
--- /dev/null
+++ b/code/__DEFINES/shuttles.dm
@@ -0,0 +1,23 @@
+//shuttle mode defines
+#define SHUTTLE_IDLE 0
+#define SHUTTLE_RECALL 1
+#define SHUTTLE_CALL 2
+#define SHUTTLE_DOCKED 3
+#define SHUTTLE_STRANDED 4
+#define SHUTTLE_ESCAPE 5
+#define SHUTTLE_ENDGAME 6
+
+// Shuttle return values
+#define SHUTTLE_NOT_A_DOCKING_PORT "not_a_docking_port"
+#define SHUTTLE_DWIDTH_TOO_LARGE "docking_width_too_large"
+#define SHUTTLE_WIDTH_TOO_LARGE "width_too_large"
+#define SHUTTLE_DHEIGHT_TOO_LARGE "docking_height_too_large"
+#define SHUTTLE_HEIGHT_TOO_LARGE "height_too_large"
+#define SHUTTLE_ALREADY_DOCKED "we_are_already_docked"
+#define SHUTTLE_SOMEONE_ELSE_DOCKED "someone_else_docked"
+
+//Launching Shuttles to Centcomm
+#define NOLAUNCH -1
+#define UNLAUNCHED 0
+#define ENDGAME_LAUNCHED 1
+#define EARLY_LAUNCHED 2
diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm
index 7397a22d21f..f7e519336d0 100644
--- a/code/__DEFINES/stat.dm
+++ b/code/__DEFINES/stat.dm
@@ -24,12 +24,3 @@
#define POWEROFF 4 // tbd
#define MAINT 8 // under maintaince
#define EMPED 16 // temporary broken by EMP pulse
-
-//shuttle mode defines
-#define SHUTTLE_IDLE 0
-#define SHUTTLE_RECALL 1
-#define SHUTTLE_CALL 2
-#define SHUTTLE_DOCKED 3
-#define SHUTTLE_STRANDED 4
-#define SHUTTLE_ESCAPE 5
-#define SHUTTLE_ENDGAME 6
diff --git a/code/__HELPERS/files.dm b/code/__HELPERS/files.dm
index e5d13b03080..b1b557b6451 100644
--- a/code/__HELPERS/files.dm
+++ b/code/__HELPERS/files.dm
@@ -49,7 +49,7 @@
It is just a timer that only permits a download every [FTPDELAY] ticks.
This can be changed by modifying FTPDELAY's value above.
- PLEASE USE RESPONSIBLY, Some log files canr each sizes of 4MB! */
+ PLEASE USE RESPONSIBLY, Some log files can reach sizes of 4MB! */
/client/proc/file_spam_check()
var/time_to_wait = fileaccess_timer - world.time
if(time_to_wait > 0)
@@ -57,4 +57,22 @@
return 1
fileaccess_timer = world.time + FTPDELAY
return 0
-#undef FTPDELAY
\ No newline at end of file
+#undef FTPDELAY
+
+/proc/pathwalk(path)
+ var/list/jobs = list(path)
+ var/list/filenames = list()
+
+ while(jobs.len)
+ var/current_dir = pop(jobs)
+ var/list/new_filenames = flist(current_dir)
+ for(var/new_filename in new_filenames)
+ // if filename ends in / it is a directory, append to currdir
+ if(findtext(new_filename, "/", -1))
+ jobs += current_dir + new_filename
+ else
+ filenames += current_dir + new_filename
+ return filenames
+
+/proc/pathflatten(path)
+ return replacetext(path, "/", "_")
diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm
index afc07638e4b..452d2027b5e 100644
--- a/code/__HELPERS/lists.dm
+++ b/code/__HELPERS/lists.dm
@@ -238,13 +238,7 @@
return r
// Returns the key based on the index
-/proc/get_key_by_index(list/L, index)
- var/i = 1
- for(var/key in L)
- if(index == i)
- return key
- i++
- return null
+#define KEYBYINDEX(L, index) (((index <= L:len) && (index > 0)) ? L[index] : null)
/proc/count_by_type(list/L, type)
var/i = 0
@@ -365,3 +359,6 @@
for(var/i = 1 to l.len)
if(islist(.[i]))
.[i] = .(.[i])
+
+//Picks from the list, with some safeties, and returns the "default" arg if it fails
+#define DEFAULTPICK(L, default) ((istype(L, /list) && L:len) ? pick(L) : default)
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 826a61fb9ab..756a6a73834 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -77,7 +77,7 @@
CtrlClickOn(A)
return
- if(stat || paralysis || stunned || weakened || sleeping)
+ if(incapacitated(ignore_restraints = 1))
return
face_atom(A)
diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm
index 8e3dcd2aa39..66e4e1fd3c4 100644
--- a/code/_onclick/hud/blob_overmind.dm
+++ b/code/_onclick/hud/blob_overmind.dm
@@ -125,7 +125,7 @@
blobpwrdisplay.icon_state = "block"
blobpwrdisplay.screen_loc = ui_health
blobpwrdisplay.mouse_opacity = 0
- blobpwrdisplay.layer = 20
+ blobpwrdisplay.layer = ABOVE_HUD_LAYER
infodisplay += blobpwrdisplay
healths = new /obj/screen/healths/blob()
diff --git a/code/_onclick/hud/demon.dm b/code/_onclick/hud/demon.dm
index fc0d923e080..5ed4f9847b9 100644
--- a/code/_onclick/hud/demon.dm
+++ b/code/_onclick/hud/demon.dm
@@ -35,7 +35,7 @@
using.icon = ui_style
using.icon_state = "swap_1_m"
using.screen_loc = ui_swaphand1
- using.layer = 19
+ using.layer = HUD_LAYER
static_inventory += using
using = new /obj/screen/inventory()
@@ -43,7 +43,7 @@
using.icon = ui_style
using.icon_state = "swap_2"
using.screen_loc = ui_swaphand2
- using.layer = 19
+ using.layer = HUD_LAYER
static_inventory += using
zone_select = new /obj/screen/zone_sel()
diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm
index a0a74545db8..4831d736969 100644
--- a/code/_onclick/hud/fullscreen.dm
+++ b/code/_onclick/hud/fullscreen.dm
@@ -1,7 +1,3 @@
-#define FULLSCREEN_LAYER 18
-#define DAMAGE_LAYER FULLSCREEN_LAYER + 0.1
-#define BLIND_LAYER DAMAGE_LAYER + 0.1
-#define CRIT_LAYER BLIND_LAYER + 0.1
/mob
var/list/screens = list()
@@ -110,8 +106,3 @@
icon = 'icons/mob/screen_gen.dmi'
screen_loc = "WEST,SOUTH to EAST,NORTH"
icon_state = "druggy"
-
-#undef FULLSCREEN_LAYER
-#undef BLIND_LAYER
-#undef DAMAGE_LAYER
-#undef CRIT_LAYER
diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm
index e1bacf6922d..2bbc92c7cd4 100644
--- a/code/_onclick/hud/other_mobs.dm
+++ b/code/_onclick/hud/other_mobs.dm
@@ -31,11 +31,11 @@
name = "Faith"
icon_state = "deity_power"
screen_loc = ui_deitypower
- layer = 20
+ layer = HUD_LAYER
/obj/screen/deity_follower_display
name = "Followers"
icon_state = "deity_followers"
screen_loc = ui_deityfollowers
- layer = 20
+ layer = HUD_LAYER
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index b13623a9bfd..7c69ae2a8a9 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -197,7 +197,7 @@
A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7"
else
A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7"
- A.layer = 20
+ A.layer = ABOVE_HUD_LAYER
x++
if(x == 4)
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 72e5ae3c0f9..8fe5ec01029 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -9,7 +9,7 @@
/obj/screen
name = ""
icon = 'icons/mob/screen_gen.dmi'
- layer = 20
+ layer = ABOVE_HUD_LAYER
unacidable = 1
appearance_flags = APPEARANCE_UI
var/obj/master = null //A reference to the object in the slot. Grabs or items, generally.
@@ -29,7 +29,7 @@
maptext_width = 480
/obj/screen/swap_hand
- layer = 19
+ layer = HUD_LAYER
name = "swap hand"
/obj/screen/swap_hand/Click()
@@ -60,7 +60,7 @@
var/slot_id // The indentifier for the slot. It has nothing to do with ID cards.
var/icon_empty // Icon when empty. For now used only by humans.
var/icon_full // Icon when contains an item. For now used only by humans.
- layer = 19
+ layer = HUD_LAYER
/obj/screen/inventory/Click()
// At this point in client Click() code we have passed the 1/10 sec check and little else
@@ -154,25 +154,11 @@
name = "drop"
icon = 'icons/mob/screen_midnight.dmi'
icon_state = "act_drop"
- layer = 19
+ layer = HUD_LAYER
/obj/screen/drop/Click()
usr.drop_item_v()
-/obj/screen/grab
- name = "grab"
-
-/obj/screen/grab/Click()
- var/obj/item/weapon/grab/G = master
- G.s_click(src)
- return 1
-
-/obj/screen/grab/attack_hand()
- return
-
-/obj/screen/grab/attackby()
- return
-
/obj/screen/act_intent
name = "intent"
icon_state = "help"
@@ -303,7 +289,7 @@
name = "resist"
icon = 'icons/mob/screen_midnight.dmi'
icon_state = "act_resist"
- layer = 19
+ layer = HUD_LAYER
/obj/screen/resist/Click()
if(isliving(usr))
@@ -417,7 +403,7 @@
icon_state = "blank"
blend_mode = BLEND_ADD
screen_loc = "WEST,SOUTH to EAST,NORTH"
- layer = 17
+ layer = FLASH_LAYER
/obj/screen/damageoverlay
icon = 'icons/mob/screen_full.dmi'
@@ -426,7 +412,7 @@
blend_mode = BLEND_MULTIPLY
screen_loc = "CENTER-7,CENTER-7"
mouse_opacity = 0
- layer = 18.1 //The black screen overlay sets layer to 18 to display it, this one has to be just on top.
+ layer = DAMAGE_LAYER
/obj/screen/healths
name = "health"
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index a8fbcf17bb9..50438376e89 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -71,7 +71,7 @@ var/const/tk_maxrange = 15
flags = NOBLUDGEON | ABSTRACT
//item_state = null
w_class = 10
- layer = 20
+ layer = ABOVE_HUD_LAYER
var/last_throw = 0
var/atom/movable/focus = null
diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index a01c867c134..13533f67f03 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -108,6 +108,7 @@ var/global/datum/controller/master/Master = new()
CHECK_TICK
world << "Initializations complete!"
+ world.log << "Initializations complete."
// Sort subsystems by display setting for easy access.
sortTim(subsystems, /proc/cmp_subsystem_display)
diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm
index 08561726e6b..0fdc5702433 100644
--- a/code/controllers/subsystem/garbage.dm
+++ b/code/controllers/subsystem/garbage.dm
@@ -17,7 +17,7 @@ var/datum/subsystem/garbage_collector/SSgarbage
var/gcedlasttick = 0 // number of things that gc'ed last tick
var/totaldels = 0
var/totalgcs = 0
-
+
var/highest_del_time = 0
var/highest_del_tickusage = 0
@@ -31,6 +31,9 @@ var/datum/subsystem/garbage_collector/SSgarbage
// the types are stored as strings
var/list/noqdelhint = list()// list of all types that do not return a QDEL_HINT
+ // all types that did not respect qdel(A, force=TRUE) and returned one
+ // of the immortality qdel hints
+ var/list/noforcerespect = list()
#ifdef TESTING
var/list/qdel_list = list() // list of all types that have been qdel()eted
@@ -150,7 +153,7 @@ var/datum/subsystem/garbage_collector/SSgarbage
// Should be treated as a replacement for the 'del' keyword.
// Datums passed to this will be given a chance to clean up references to allow the GC to collect them.
-/proc/qdel(datum/D)
+/proc/qdel(datum/D, force=FALSE)
if(!D)
return
#ifdef TESTING
@@ -159,16 +162,25 @@ var/datum/subsystem/garbage_collector/SSgarbage
if(!istype(D))
del(D)
else if(isnull(D.gc_destroyed))
- var/hint = D.Destroy() // Let our friend know they're about to get fucked up.
+ var/hint = D.Destroy(force) // Let our friend know they're about to get fucked up.
if(!D)
return
switch(hint)
if (QDEL_HINT_QUEUE) //qdel should queue the object for deletion.
SSgarbage.QueueForQueuing(D)
- if (QDEL_HINT_LETMELIVE) //qdel should let the object live after calling destory.
- return
- if (QDEL_HINT_IWILLGC) //functionally the same as the above. qdel should assume the object will gc on its own, and not check it.
- return
+ if (QDEL_HINT_LETMELIVE, QDEL_HINT_IWILLGC) //qdel should let the object live after calling destory.
+ if(!force)
+ return
+ // Returning LETMELIVE after being told to force destroy
+ // indicates the objects Destroy() does not respect force
+ if(!("[D.type]" in SSgarbage.noforcerespect))
+ SSgarbage.noforcerespect += "[D.type]"
+ testing("WARNING: [D.type] has been force deleted, but is \
+ returning an immortal QDEL_HINT, indicating it does \
+ not respect the force flag for qdel(). It has been \
+ placed in the queue, further instances of this type \
+ will also be queued.")
+ SSgarbage.QueueForQueuing(D)
if (QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete using a hard reference to save time from the locate()
SSgarbage.HardQueue(D)
if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste.
@@ -197,7 +209,7 @@ var/datum/subsystem/garbage_collector/SSgarbage
// Default implementation of clean-up code.
// This should be overridden to remove all references pointing to the object being destroyed.
// Return the appropriate QDEL_HINT; in most cases this is QDEL_HINT_QUEUE.
-/datum/proc/Destroy()
+/datum/proc/Destroy(force=FALSE)
tag = null
return QDEL_HINT_QUEUE
diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm
index e2df3ccd9f6..5955447600f 100644
--- a/code/controllers/subsystem/shuttles.dm
+++ b/code/controllers/subsystem/shuttles.dm
@@ -79,9 +79,16 @@ var/datum/subsystem/shuttle/SSshuttle
/datum/subsystem/shuttle/proc/requestEvac(mob/user, call_reason)
if(!emergency)
- WARNING("requestEvac(): There is no emergency shuttle, but the shuttle was called. Using the backup shuttle instead.")
+ WARNING("requestEvac(): There is no emergency shuttle, but the \
+ shuttle was called. Using the backup shuttle instead.")
if(!backup_shuttle)
- throw EXCEPTION("requestEvac(): There is no emergency shuttle, or backup shuttle! The game will be unresolvable. This is likely due to a mapping error")
+ throw EXCEPTION("requestEvac(): There is no emergency shuttle, \
+ or backup shuttle! The game will be unresolvable. This is \
+ possibly a mapping error, more likely a bug with the shuttle \
+ manipulation system, or badminry. It is possible to manually \
+ resolve this problem by loading an emergency shuttle template \
+ manually, and then calling register() on the mobile docking port. \
+ Good luck.")
return
emergency = backup_shuttle
@@ -211,11 +218,5 @@ var/datum/subsystem/shuttle/SSshuttle
for(var/obj/docking_port/mobile/M in mobile)
if(!M.roundstart_move)
continue
- for(var/obj/docking_port/stationary/S in stationary)
- if(S.z != ZLEVEL_STATION && findtext(S.id, M.id))
- S.width = M.width
- S.height = M.height
- S.dwidth = M.dwidth
- S.dheight = M.dheight
moveShuttle(M.id, "[M.roundstart_move]", 0)
CHECK_TICK
diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm
index e5b338728d0..ffe25551553 100644
--- a/code/datums/diseases/advance/symptoms/choking.dm
+++ b/code/datums/diseases/advance/symptoms/choking.dm
@@ -43,11 +43,11 @@ Bonus
return
/datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A)
- var/get_damage = (sqrt(20+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth())*1)
+ var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth())
M.adjustOxyLoss(get_damage)
return 1
/datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A)
- var/get_damage = (sqrt(20+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth()*5))
+ var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth()*5)
M.adjustOxyLoss(get_damage)
return 1
\ No newline at end of file
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index 0eedaa98f70..f3054dcaeb3 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -45,10 +45,6 @@
if(affected_mob.notransform)
return
affected_mob.notransform = 1
- affected_mob.canmove = 0
- affected_mob.icon = null
- affected_mob.overlays.Cut()
- affected_mob.invisibility = INVISIBILITY_ABSTRACT
for(var/obj/item/W in affected_mob)
if(istype(W, /obj/item/weapon/implant))
qdel(W)
diff --git a/code/datums/helper_datums/map_template.dm b/code/datums/helper_datums/map_template.dm
index a545622036a..a6bd818abad 100644
--- a/code/datums/helper_datums/map_template.dm
+++ b/code/datums/helper_datums/map_template.dm
@@ -120,5 +120,5 @@
var/datum/map_template/shuttle/S = new shuttle_type()
- shuttle_templates[S.name] = S
- map_templates[S.name] = S
+ shuttle_templates[S.shuttle_id] = S
+ map_templates[S.shuttle_id] = S
diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm
index 793cab7db2b..1ad6ec8e32f 100644
--- a/code/datums/helper_datums/teleport.dm
+++ b/code/datums/helper_datums/teleport.dm
@@ -158,4 +158,47 @@
if(istype(teleatom, /mob/living))
var/mob/living/MM = teleatom
MM << "The bluespace interface on your bag of holding interferes with the teleport!"
- return 1
\ No newline at end of file
+ return 1
+
+// Safe location finder
+
+/proc/find_safe_turf(zlevel = ZLEVEL_STATION, list/zlevels)
+ if(!zlevels)
+ zlevels = list(zlevel)
+ for(var/cycle in 1 to 100)
+ // DRUNK DIALLING WOOOOOOOOO
+ var/random_location = locate(rand(37,202),rand(75,192),pick(zlevels))
+ if(!(istype(random_location, /turf/open/floor)))
+ continue
+ var/turf/open/floor/F = random_location
+ if(!F.air)
+ continue
+
+ var/datum/gas_mixture/A = F.air
+ var/list/A_gases = A.gases
+ var/trace_gases
+ for(var/id in A_gases)
+ if(id in hardcoded_gases)
+ continue
+ trace_gases = TRUE
+ break
+
+ // Can most things breathe?
+ if(trace_gases)
+ continue
+ if(!(A_gases["o2"] && A_gases["o2"][MOLES] >= 16))
+ continue
+ if(A_gases["plasma"])
+ continue
+ if(A_gases["co2"] && A_gases["co2"][MOLES] >= 10)
+ continue
+
+ // Aim for goldilocks temperatures and pressure
+ if((A.temperature <= 270) || (A.temperature >= 360))
+ continue
+ var/pressure = A.return_pressure()
+ if((pressure <= 20) || (pressure >= 550))
+ continue
+
+ // DING! You have passed the gauntlet, and are "probably" safe.
+ return F
diff --git a/code/datums/hud.dm b/code/datums/hud.dm
index 2b7eee8a730..62c1700f58d 100644
--- a/code/datums/hud.dm
+++ b/code/datums/hud.dm
@@ -21,6 +21,7 @@ var/datum/atom_hud/huds = list( \
ANTAG_HUD_DEVIL = new/datum/atom_hud/antag(),\
ANTAG_HUD_SINTOUCHED = new/datum/atom_hud/antag/hidden(),\
ANTAG_HUD_SOULLESS = new/datum/atom_hud/antag/hidden(),\
+ ANTAG_HUD_CLOCKWORK = new/datum/atom_hud/antag(),\
)
/datum/atom_hud
diff --git a/code/datums/martial.dm b/code/datums/martial.dm
index 46e18dde7d7..226da8d5e57 100644
--- a/code/datums/martial.dm
+++ b/code/datums/martial.dm
@@ -323,10 +323,16 @@
add_to_streak("G",D)
if(check_streak(A,D))
return 1
- D.grabbedby(A,1)
- var/obj/item/weapon/grab/G = A.get_active_hand()
- if(G)
- G.state = GRAB_AGGRESSIVE //Instant aggressive grab
+ if(A.grab_state > GRAB_AGGRESSIVE)
+ D.grabbedby(A, 1)
+ else
+ A.start_pulling(D, 1)
+ if(A.pulling)
+ D.drop_r_hand()
+ D.drop_l_hand()
+ D.stop_pulling()
+ A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab
+ return 1
/datum/martial_art/the_sleeping_carp/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
add_to_streak("H",D)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 9c1a5522b93..34360228de4 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -245,6 +245,7 @@
"nuclear",
"traitor", // "traitorchan",
"monkey",
+ "clockcult"
)
var/text = ""
@@ -352,6 +353,26 @@
sections["cult"] = text
+ /** CLOCKWORK CULT **/
+ text = "clockwork cult"
+ if(ticker.mode.config_tag == "clockwork cult")
+ text = uppertext(text)
+ text = "[text]: "
+ if(src in ticker.mode.servants_of_ratvar)
+ text += "loyal|employee|SERVANT"
+ text += " Give slab"
+ else if(isloyal(current))
+ text += "LOYAL|employee|servant"
+ else
+ text += "loyal|EMPLOYEE|servant"
+
+ if(current && current.client && (ROLE_SERVANT_OF_RATVAR in current.client.prefs.be_special))
+ text += "|Enabled in Prefs"
+ else
+ text += "|Disabled in Prefs"
+
+ sections["clockcult"] = text
+
/** WIZARD ***/
text = "wizard"
if (ticker.mode.config_tag=="wizard")
@@ -1017,6 +1038,22 @@
if (!ticker.mode.equip_cultist(current))
usr << "Spawning amulet failed!"
+ else if(href_list["clockcult"])
+ switch(href_list["clockcult"])
+ if("clear")
+ remove_servant_of_ratvar(current)
+ message_admins("[key_name_admin(usr)] has removed clockwork servant status from [current].")
+ log_admin("[key_name(usr)] has removed clockwork servant status from [current].")
+ if("servant")
+ if(!(src in ticker.mode.servants_of_ratvar))
+ add_servant_of_ratvar(current)
+ message_admins("[key_name_admin(usr)] has made [current] into a servant of Ratvar.")
+ log_admin("[key_name(usr)] has made [current] into a servant of Ratvar.")
+ if("slab")
+ if(!ticker.mode.equip_servant(current))
+ usr << "Failed to outfit [current] with a slab!"
+ else
+ usr << "Successfully gave [current] a clockwork slab!"
else if (href_list["wizard"])
switch(href_list["wizard"])
@@ -1689,7 +1726,11 @@
return G
break
-
+/datum/mind/proc/grab_ghost(force)
+ var/mob/dead/observer/G = get_ghost(even_if_they_cant_reenter = force)
+ . = G
+ if(G)
+ G.reenter_corpse()
/mob/proc/sync_mind()
mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist)
diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm
index 06b00e1be8f..9a404f07680 100644
--- a/code/datums/ruins/lavaland.dm
+++ b/code/datums/ruins/lavaland.dm
@@ -167,14 +167,6 @@
suffix = "lavaland_fountain_hall.dmm"
cost = 5
-/datum/map_template/ruin/lavaland/zombie_gym
- name = "Zombie Gym"
- id = "zombie-gym"
- description = "The patrons at this gym are serious about health, and \
- making sure people work on their cardio."
- suffix = "lavaland_gym.dmm"
- cost = 10
-
/datum/map_template/ruin/lavaland/survivalcapsule
name = "Survival Capsule Ruins"
id = "survivalcapsule"
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index f34e49e96a0..77afc9e5f36 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -3,12 +3,14 @@
var/prefix = "_maps/shuttles/"
var/suffix
var/port_id
+ var/shuttle_id
var/description
var/admin_notes
/datum/map_template/shuttle/New()
- mappath = "[prefix][port_id]_[suffix].dmm"
+ shuttle_id = "[port_id]_[suffix]"
+ mappath = "[prefix][shuttle_id].dmm"
. = ..()
/datum/map_template/shuttle/emergency
@@ -129,6 +131,18 @@
is a shuttle used at other less known nanotrasen facilities \
and has a more open inside for larger crowds."
+/datum/map_template/shuttle/emergency/wabbajack
+ suffix = "wabbajack"
+ name = "NT Lepton Violet"
+ description = "The research team based on this vessel went missing one \
+ day, and no amount of investigation could discover what happened to \
+ them. The only occupants were a number of dead rodents, who appeared to \
+ have clawed each other to death. Needless to say, no engineering team \
+ wanted to go near the thing, and it's only being used as an Emergency \
+ Escape Shuttle because there is literally nothing else available."
+ admin_notes = "If the crew can solve the puzzle, they will wake the \
+ wabbajack statue. It will likely not end well. There's a reason it's \
+ boarded up. Maybe they should have just left it alone."
/datum/map_template/shuttle/ferry/base
suffix = "base"
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space_Station_13_areas.dm
similarity index 95%
rename from code/game/area/Space Station 13 areas.dm
rename to code/game/area/Space_Station_13_areas.dm
index bb4f8d28ffa..1077f37946c 100644
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space_Station_13_areas.dm
@@ -19,7 +19,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
name = "Space"
icon = 'icons/turf/areas.dmi'
icon_state = "unknown"
- layer = 10
+ layer = AREA_LAYER
mouse_opacity = 0
invisibility = INVISIBILITY_LIGHTING
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index d556f2a5b2e..2f7d234255b 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -26,7 +26,7 @@
/area/New()
icon_state = ""
- layer = 10
+ layer = AREA_LAYER
master = src
uid = ++global_uid
related = list(src)
diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm
index f700b301351..58e09e821e8 100644
--- a/code/game/asteroid.dm
+++ b/code/game/asteroid.dm
@@ -2,22 +2,21 @@ var/global/list/possiblethemes = list("organharvest","cult","wizden","cavein","x
var/global/max_secret_rooms = 6
-/proc/spawn_room(atom/start_loc, x_size, y_size, list/walltypes, floor, name)
+/proc/spawn_room(atom/start_loc, x_size, y_size, list/walltypes, floor, name, oldarea)
var/list/room_turfs = list("walls"=list(),"floors"=list())
+ var/area/asteroid/artifactroom/A = new
+ if(name)
+ A.name = name
+ else
+ A.name = "Artifact Room #[start_loc.x]-[start_loc.y]-[start_loc.z]"
+
for(var/x = 0, x < x_size, x++) //sets the size of the room on the x axis
for(var/y = 0, y < y_size, y++) //sets it on y axis.
var/turf/T
var/cur_loc = locate(start_loc.x + x, start_loc.y + y, start_loc.z)
- var/area/asteroid/artifactroom/A = new
- if(name)
- A.name = name
- else
- A.name = "Artifact Room #[start_loc.x]-[start_loc.y]-[start_loc.z]"
-
-
if(x == 0 || x == x_size-1 || y == 0 || y == y_size-1)
var/wall = pickweight(walltypes)//totally-solid walls are pretty boring.
T = cur_loc
@@ -30,7 +29,8 @@ var/global/max_secret_rooms = 6
T.ChangeTurf(floor)
room_turfs["floors"] += T
- A.contents += T
+ if(!oldarea)
+ A.contents += T
return room_turfs
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 99e5a8205b7..4a2c0a330ee 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -1,5 +1,5 @@
/atom
- layer = 2
+ layer = TURF_LAYER
var/level = 2
var/flags = 0
var/list/fingerprints
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 63c03c9c2dd..8d6d5705654 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -1,5 +1,5 @@
/atom/movable
- layer = 3
+ layer = OBJ_LAYER
var/last_move = null
var/anchored = 0
var/throwing = 0
@@ -13,10 +13,12 @@
var/verb_yell = "yells"
var/inertia_dir = 0
var/pass_flags = 0
+ var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move
glide_size = 8
appearance_flags = TILE_BOUND
+
/atom/movable/Move(atom/newloc, direct = 0)
if(!loc || !newloc) return 0
var/atom/oldloc = loc
@@ -25,28 +27,38 @@
if (!(direct & (direct - 1))) //Cardinal move
. = ..()
else //Diagonal move, split it into cardinal moves
+ moving_diagonally = FIRST_DIAG_STEP
if (direct & 1)
if (direct & 4)
if (step(src, NORTH))
+ moving_diagonally = SECOND_DIAG_STEP
. = step(src, EAST)
else if (step(src, EAST))
+ moving_diagonally = SECOND_DIAG_STEP
. = step(src, NORTH)
else if (direct & 8)
if (step(src, NORTH))
+ moving_diagonally = SECOND_DIAG_STEP
. = step(src, WEST)
else if (step(src, WEST))
+ moving_diagonally = SECOND_DIAG_STEP
. = step(src, NORTH)
else if (direct & 2)
if (direct & 4)
if (step(src, SOUTH))
+ moving_diagonally = SECOND_DIAG_STEP
. = step(src, EAST)
else if (step(src, EAST))
+ moving_diagonally = SECOND_DIAG_STEP
. = step(src, SOUTH)
else if (direct & 8)
if (step(src, SOUTH))
+ moving_diagonally = SECOND_DIAG_STEP
. = step(src, WEST)
else if (step(src, WEST))
+ moving_diagonally = SECOND_DIAG_STEP
. = step(src, SOUTH)
+ moving_diagonally = 0
if(!loc || (loc == oldloc && oldloc != newloc))
last_move = 0
@@ -80,10 +92,8 @@
qdel(AM)
loc = null
invisibility = INVISIBILITY_ABSTRACT
- if (pulledby)
- if (pulledby.pulling == src)
- pulledby.pulling = null
- pulledby = null
+ if(pulledby)
+ pulledby.stop_pulling()
// Previously known as HasEntered()
@@ -104,6 +114,8 @@
/atom/movable/proc/forceMove(atom/destination)
if(destination)
+ if(pulledby)
+ pulledby.stop_pulling()
var/atom/oldloc = loc
if(oldloc)
oldloc.Exited(src, destination)
@@ -123,8 +135,6 @@
/mob/living/forceMove(atom/destination)
stop_pulling()
- if(pulledby)
- pulledby.stop_pulling()
if(buckled)
buckled.unbuckle_mob(src,force=1)
if(buckled_mobs.len)
@@ -199,6 +209,9 @@
return 0
//use a modified version of Bresenham's algorithm to get from the atom's current position to that of the target
+ if(pulledby)
+ pulledby.stop_pulling()
+
throwing = 1
if(spin) //if we don't want the /atom/movable to spin.
SpinAnimation(5, 1)
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index e22248ff602..66bcfd61398 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -212,13 +212,17 @@
mob_size = MOB_SIZE_LARGE
see_invisible = SEE_INVISIBLE_MINIMUM
see_in_dark = 8
+ var/independent = FALSE
/mob/living/simple_animal/hostile/blob/blobbernaut/New()
..()
- verbs -= /mob/living/verb/pulled //no pulling people deep into the blob
+ if(!independent) //no pulling people deep into the blob
+ verbs -= /mob/living/verb/pulled
/mob/living/simple_animal/hostile/blob/blobbernaut/Life()
if(..())
+ if(independent)
+ return // strong independent blobbernaut that don't need no blob
var/damagesources = 0
if(!(locate(/obj/effect/blob) in range(2, src)))
damagesources++
@@ -271,3 +275,7 @@
factory.naut = null //remove this naut from its factory
factory.maxhealth = initial(factory.maxhealth)
flick("blobbernaut_death", src)
+
+/mob/living/simple_animal/hostile/blob/blobbernaut/independent
+ independent = TRUE
+ gold_core_spawnable = 1
diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm
index da36d8f6d96..57f0c27dab5 100644
--- a/code/game/gamemodes/changeling/powers/absorb.dm
+++ b/code/game/gamemodes/changeling/powers/absorb.dm
@@ -15,23 +15,21 @@
user << "We are already absorbing!"
return
- var/obj/item/weapon/grab/G = user.get_active_hand()
- if(!istype(G))
- user << "We must be grabbing a creature in our active hand to absorb them!"
+ if(!user.pulling || !iscarbon(user.pulling))
+ user << "We must be grabbing a creature to absorb them!"
return
- if(G.state <= GRAB_NECK)
+ if(user.grab_state <= GRAB_NECK)
user << "We must have a tighter grip to absorb this creature!"
return
- var/mob/living/carbon/target = G.affecting
+ var/mob/living/carbon/target = user.pulling
return changeling.can_absorb_dna(user,target)
/obj/effect/proc_holder/changeling/absorbDNA/sting_action(mob/user)
var/datum/changeling/changeling = user.mind.changeling
- var/obj/item/weapon/grab/G = user.get_active_hand()
- var/mob/living/carbon/human/target = G.affecting
+ var/mob/living/carbon/human/target = user.pulling
changeling.isabsorbing = 1
for(var/stage = 1, stage<=3, stage++)
switch(stage)
@@ -122,11 +120,10 @@
/obj/effect/proc_holder/changeling/swap_form/can_sting(mob/living/carbon/user)
if(!..())
return
- var/obj/item/weapon/grab/G = user.get_active_hand()
- if(!istype(G) || (G.state < GRAB_AGGRESSIVE))
- user << "We must have an aggressive grab on creature in our active hand to do this!"
+ if(!user.pulling || !iscarbon(user.pulling) || user.grab_state < GRAB_AGGRESSIVE)
+ user << "We must have an aggressive grab on creature to do this!"
return
- var/mob/living/carbon/target = G.affecting
+ var/mob/living/carbon/target = user.pulling
if((target.disabilities & NOCLONE) || (target.disabilities & HUSK))
user << "DNA of [target] is ruined beyond usability!"
return
@@ -137,8 +134,7 @@
/obj/effect/proc_holder/changeling/swap_form/sting_action(mob/living/carbon/user)
- var/obj/item/weapon/grab/G = user.get_active_hand()
- var/mob/living/carbon/target = G.affecting
+ var/mob/living/carbon/target = user.pulling
var/datum/changeling/changeling = user.mind.changeling
user << "We tighen our grip. We must hold still...."
diff --git a/code/game/gamemodes/changeling/powers/linglink.dm b/code/game/gamemodes/changeling/powers/linglink.dm
index 31de5f47be6..3b90ee14bd5 100644
--- a/code/game/gamemodes/changeling/powers/linglink.dm
+++ b/code/game/gamemodes/changeling/powers/linglink.dm
@@ -10,11 +10,16 @@
if(!..())
return
var/datum/changeling/changeling = user.mind.changeling
- var/obj/item/weapon/grab/G = user.get_active_hand()
- var/mob/living/carbon/target = G.affecting
if(changeling.islinking)
user << "We have already formed a link with the victim!"
return
+ if(!user.pulling)
+ user << "We must be tightly grabbing a creature to link with them!"
+ return
+ if(!iscarbon(user.pulling))
+ user << "We cannot link with this creature!"
+ return
+ var/mob/living/carbon/target = user.pulling
if(!target.mind)
user << "The victim has no mind to link to!"
return
@@ -23,19 +28,15 @@
return
if(target.mind.changeling)
user << "The victim is already a part of the hivemind!"
- return
- if(!istype(G))
- user << "We must be tightly grabbing a creature in our active hand to link with them!"
return
- if(G.state <= GRAB_NECK)
+ if(user.grab_state <= GRAB_NECK)
user << "We must have a tighter grip to link with this creature!"
return
return changeling.can_absorb_dna(user,target)
/obj/effect/proc_holder/changeling/linglink/sting_action(mob/user)
var/datum/changeling/changeling = user.mind.changeling
- var/obj/item/weapon/grab/G = user.get_active_hand()
- var/mob/living/carbon/human/target = G.affecting
+ var/mob/living/carbon/human/target = user.pulling
changeling.islinking = 1
for(var/i in 1 to 3)
switch(i)
diff --git a/code/game/gamemodes/clock_cult/__clock_defines.dm b/code/game/gamemodes/clock_cult/__clock_defines.dm
new file mode 100644
index 00000000000..3516eac2b30
--- /dev/null
+++ b/code/game/gamemodes/clock_cult/__clock_defines.dm
@@ -0,0 +1,16 @@
+var/global/clockwork_construction_value = 0 //The total value of all structures built by the clockwork cult
+var/global/clockwork_caches = 0 //How many clockwork caches exist in the world (not each individual)
+var/global/clockwork_daemons = 0 //How many daemons exist in the world
+var/global/list/clockwork_generals_invoked = list("nezbere" = FALSE, "sevtug" = FALSE, "nzcrentr" = FALSE, "inath-neq" = FALSE) //How many generals have been recently invoked
+var/global/list/all_clockwork_objects = list() //All clockwork items, structures, and effects in existence
+var/global/list/all_clockwork_mobs = list() //All clockwork SERVANTS (not creatures) in existence
+var/global/list/clockwork_component_cache = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) //The pool of components that caches draw from
+
+#define SCRIPTURE_PERIPHERAL 0 //Should never be used
+#define SCRIPTURE_DRIVER 1
+#define SCRIPTURE_SCRIPT 2
+#define SCRIPTURE_APPLICATION 3
+#define SCRIPTURE_REVENANT 4
+#define SCRIPTURE_JUDGEMENT 5
+
+#define SLAB_PRODUCTION_THRESHOLD 60 //How many cycles it takes slabs to produce a single component; defaults to one minute
diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm
new file mode 100644
index 00000000000..fd289769277
--- /dev/null
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -0,0 +1,274 @@
+/*
+
+CLOCKWORK CULT: Based off of the failed pull requests from vgstation
+
+While Nar-Sie is the oldest and most prominent of the elder gods, there are other forces at work in the universe.
+Ratvar, the Clockwork Justiciar, a homage to Nar-Sie granted sentience by its own power, is one such other force.
+Imprisoned within a massive construct known as the Celestial Derelict - or Reebe - an intense hatred of the Blood God festers.
+Ratvar, unable to act in the mortal plane, seeks to return and forms covenants with mortals in order to bolster his influence.
+Due to his mechanical nature, Ratvar is also capable of influencing silicon-based lifeforms, unlike Nar-Sie, who can only influence natural life.
+
+This is a team-based gamemode.
+
+There are three possible objectives the Enlightened - Ratvar's minions - can have:
+ 1. Ensure X amount of Enlightened escape the station through the shuttle or otherwise.
+ 2. Convert all silicon lifeforms on the station to Ratvar's cause.
+ 3. Summon Ratvar via construction of a Gateway.
+
+The clockwork version of an arcane tome is the clockwork slab.
+While it can perform certain actions, it consumes a resource called components.
+Components, which are fallen fragments of Ratvar's body as he rusts in Reebe, are powerful and have various effects.
+Game-wise, clockwork slabs will generate components over time, with more powerful components being slower.
+
+This file's folder contains:
+ __clock_defines.dm: Defined variables
+ clock_cult.dm: Core gamemode files.
+ clock_mobs.dm: Hostile and benign clockwork creatures.
+ clock_objects.dm: Items and structures.
+ clock_ratvar.dm: The Ark of the Clockwork Justiciar and Ratvar himself. Important enough to have his own file.
+ clock_scripture.dm: Scripture and rites.
+ clock_unsorted.dm: Anything else with no place to be
+
+*/
+
+///////////
+// PROCS //
+///////////
+
+/proc/is_servant_of_ratvar(mob/M)
+ return M && istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.servants_of_ratvar)
+
+/proc/is_eligible_servant(mob/M)
+ return M && istype(M) && M.mind && !M.mind.special_role && !isloyal(M)
+
+/proc/add_servant_of_ratvar(mob/M, silent = FALSE)
+ if(!is_eligible_servant(M) || !ticker || !ticker.mode)
+ return 0
+ if(iscarbon(M))
+ if(!silent)
+ M << "Your mind is racing! Your body feels incredibly light! Your world glows a brilliant yellow! All at once it comes to you. Ratvar, the Clockwork \
+ Justiciar lies in exile, derelict and forgotten in an unseen realm."
+ if(!is_eligible_servant(M))
+ M.visible_message("[M] seems to resist an unseen force!", "And yet, you somehow push it all away.")
+ return 0
+ else if(issilicon(M))
+ if(!silent)
+ M << "You are unable to compute this truth. Your vision glows a brilliant yellow, and all at once it comes to you. Ratvar, the Clockwork Justiciar, lies in \
+ exile, derelict and forgotten in an unseen realm."
+ if(!is_eligible_servant(M))
+ M.visible_message("[M] whirs as it resists an outside influence!", \
+ "Corrupt data purged. Resetting cortex chip to factory defaults... complete.")
+ return 0
+ if(!silent)
+ M.visible_message("[M]'s eyes glow a blazing yellow!", \
+ "Assist your new companions in their righteous efforts. Your goal is theirs, and theirs yours. You serve the Clockwork Justiciar above all else. Perform his every \
+ whim without hesitation.")
+ ticker.mode.servants_of_ratvar += M.mind
+ ticker.mode.update_servant_icons_added(M.mind)
+ M.mind.special_role = "Servant of Ratvar"
+ all_clockwork_mobs += M
+ if(issilicon(M))
+ var/mob/living/silicon/S = M
+ if(isrobot(S))
+ var/mob/living/silicon/robot/R = S
+ R.UnlinkSelf()
+ R.emagged = 1
+ R << "You have been desynced from your master AI. In addition, your onboard camera is no longer active and your safeties have been disabled."
+ S.laws = new/datum/ai_laws/ratvar
+ S.update_icons()
+ S.show_laws()
+ if(istype(ticker.mode, /datum/game_mode/clockwork_cult))
+ var/datum/game_mode/clockwork_cult/C = ticker.mode
+ C.present_tasks(M) //Memorize the objectives
+ return 1
+
+/proc/remove_servant_of_ratvar(mob/M)
+ if(!is_servant_of_ratvar(M)) //In this way, is_servant_of_ratvar() checks the existence of ticker and minds
+ return 0
+ M.visible_message("[M] seems to have remembered their true allegiance!", \
+ "A cold, cold darkness flows through your mind, extinguishing the Justiciar's light and all of your memories as his servant.")
+ ticker.mode.servants_of_ratvar -= M.mind
+ ticker.mode.update_servant_icons_removed(M.mind)
+ all_clockwork_mobs -= M
+ M.mind.memory = "" //Not sure if there's a better way to do this
+ M.mind.special_role = null
+ M.verbs -= /mob/living/carbon/human/proc/function_call //Removes any bound Ratvarian spears
+ if(issilicon(M))
+ var/mob/living/silicon/S = M
+ if(isrobot(S))
+ var/mob/living/silicon/robot/R = S
+ R.emagged = initial(R.emagged)
+ R << "Despite your freedom from Ratvar's influence, you are still irreparably damaged and no longer possess certain functions such as AI linking."
+ S.laws = initial(S.laws)
+ S.update_icons()
+ S.show_laws()
+ return 1
+
+/proc/send_hierophant_message(mob/user, message)
+ if(!user || !message || !ticker || !ticker.mode)
+ return 0
+ var/parsed_message = "Servant [user.name == user.real_name ? user.name : "[user.real_name] (as [user.name])"]: \"[message]\""
+ for(var/mob/M in mob_list)
+ if(is_servant_of_ratvar(M) || isobserver(M))
+ M << parsed_message
+ return 1
+
+///////////////
+// GAME MODE //
+///////////////
+
+var/global/ratvar_awakens = FALSE //If Ratvar has been summoned
+/datum/game_mode
+ var/list/servants_of_ratvar = list() //The Enlightened servants of Ratvar
+ var/required_escapees = 0 //How many servants need to escape, if applicable
+ var/required_silicon_converts = 0 //How many robotic lifeforms need to be converted, if applicable
+ var/clockwork_objective = "escape" //The objective that the servants must fulfill
+ var/clockwork_explanation = "Ensure that the meme levels of the station remain high." //The description of the current objective
+
+/datum/game_mode/clockwork_cult
+ name = "clockwork cult"
+ config_tag = "clockwork cult"
+ antag_flag = ROLE_SERVANT_OF_RATVAR
+ required_players = 30
+ required_enemies = 2
+ recommended_enemies = 4
+ enemy_minimum_age = 14
+ protected_jobs = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain") //Silicons can eventually be converted
+
+/datum/game_mode/clockwork_cult/announce()
+ world << "The game mode is: Clockwork Cult!"
+ world << "Ratvar, the Clockwork Justiciar, has formed a covenant of Enlightened aboard [station_name()]."
+ world << "Enlightened: Serve your master so that his influence might grow."
+ world << "Crew: Prevent the servants of Ratvar from taking over the station."
+
+/datum/game_mode/clockwork_cult/pre_setup()
+ if(config.protect_roles_from_antagonist)
+ restricted_jobs += protected_jobs
+ if(config.protect_assistant_from_antagonist)
+ restricted_jobs += "Assistant"
+ var/starter_servants = max(1, round(num_players() / 10)) //Guaranteed one cultist - otherwise, about one cultist for every ten players
+ while(starter_servants)
+ var/datum/mind/servant = pick(antag_candidates)
+ servants_of_ratvar += servant
+ antag_candidates -= servant
+ modePlayer += servant
+ servant.special_role = "Servant of Ratvar"
+ servant.restricted_roles = restricted_jobs
+ update_servant_icons_added(servant)
+ starter_servants--
+ return 1
+
+/datum/game_mode/clockwork_cult/post_setup()
+ forge_clock_objectives()
+ for(var/S in servants_of_ratvar)
+ var/datum/mind/servant = S
+ log_game("[servant.key] was made an initial servant of Ratvar")
+ var/mob/living/L = servant.current
+ greet_servant(L)
+ equip_servant(L)
+ present_tasks(L)
+ ..()
+ return 1
+
+/datum/game_mode/clockwork_cult/proc/forge_clock_objectives() //Determine what objective that Ratvar's servants will fulfill
+ var/list/possible_objectives = list("escape", "gateway")
+ var/silicons_possible = FALSE
+ for(var/mob/living/silicon/S in living_mob_list)
+ silicons_possible = TRUE
+ if(silicons_possible)
+ possible_objectives += "silicons"
+ clockwork_objective = pick(possible_objectives)
+ clockwork_objective = "gateway" //TEMPORARY, to be removed before merge
+ switch(clockwork_objective)
+ if("escape")
+ required_escapees = max(1, num_players() / 3) //33% of the player count must be cultists
+ clockwork_explanation = "Ensure that [required_escapees] servant(s) of Ratvar escape from [station_name()]."
+ if("gateway")
+ clockwork_explanation = "Construct a Gateway to the Celestial Derelict and free Ratvar."
+ if("silicons")
+ clockwork_explanation = "Ensure that all silicon-based lifeforms on [station_name()] are servants of Ratvar by the end of the shift."
+ return 1
+
+/datum/game_mode/clockwork_cult/proc/greet_servant(mob/M) //Description of their role
+ if(!M)
+ return 0
+ var/greeting_text = " You are a servant of Ratvar, the Clockwork Justiciar.\n\
+ Rusting eternally in the Celestial Derelict, Ratvar has formed a covenant of mortals, with you as one of its members. As one of the Justiciar's servants, you are to work to the best of your \
+ ability to assist in completion of His agenda. You do not know the specifics of how to do so, but luckily you have a vessel to help you learn."
+ M << greeting_text
+ return 1
+
+/datum/game_mode/proc/equip_servant(mob/living/L) //Grants a clockwork slab to the mob, with one of each component
+ if(!L || !istype(L))
+ return 0
+ var/slot = "At your feet"
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ if(H.back && istype(H.back, /obj/item/weapon/storage/backpack))
+ var/obj/item/weapon/storage/backpack/B = H.back
+ new/obj/item/clockwork/slab/starter(B)
+ slot = "In your [B.name]"
+ if(slot == "At your feet")
+ new/obj/item/clockwork/slab/starter(get_turf(L))
+ L << "[slot] is a link to the halls of Reebe and your master. You may use it to perform many tasks, but also become oriented with the workings of Ratvar and how to best complete your \
+ tasks. This clockwork slab will be instrumental in your triumph. Remember: you can speak discreetly with your fellow servants by using Report in your slab's interface, and you can find a \
+ concise tutorial in Recollection."
+ return 1
+
+/datum/game_mode/clockwork_cult/proc/present_tasks(mob/living/L) //Memorizes and displays the clockwork cult's objective
+ if(!L || !istype(L) || !L.mind)
+ return 0
+ var/datum/mind/M = L.mind
+ M.current << "This is Ratvar's will: [clockwork_explanation]"
+ M.memory += "Ratvar's will: [clockwork_explanation] "
+ return 1
+
+/datum/game_mode/clockwork_cult/proc/check_clockwork_victory()
+ switch(clockwork_objective)
+ if("escape")
+ var/surviving_servants = 0
+ for(var/datum/mind/M in servants_of_ratvar)
+ if(M.current && M.current.stat != DEAD && (M.current.onCentcom() || M.current.onSyndieBase()))
+ surviving_servants++
+ if(surviving_servants <= required_escapees)
+ return 1
+ return 0
+ if("silicons")
+ for(var/mob/living/silicon/robot/S in mob_list) //Only check robots and AIs
+ if(!is_servant_of_ratvar(S))
+ return 0
+ for(var/mob/living/silicon/ai/A in mob_list)
+ if(!is_servant_of_ratvar(A))
+ return 0
+ return 1
+ if("gateway")
+ return ratvar_awakens
+ return 0 //This shouldn't ever be reached, but just in case it is
+
+/datum/game_mode/clockwork_cult/declare_completion()
+ ..()
+ return 0 //Doesn't end until the round does
+
+/datum/game_mode/proc/auto_declare_completion_clockwork_cult()
+ var/text = ""
+ if(istype(ticker.mode, /datum/game_mode/clockwork_cult)) //Possibly hacky?
+ var/datum/game_mode/clockwork_cult/C = ticker.mode
+ if(C.check_clockwork_victory())
+ text += "Ratvar's servants have succeeded in fulfilling His goals!"
+ else
+ text += "Ratvar's servants have failed!"
+ text += " The goal of the clockwork cult was: [clockwork_explanation] "
+ text += "Ratvar's servants were:"
+ for(var/datum/mind/M in servants_of_ratvar)
+ text += printplayer(M)
+ world << text
+
+/datum/game_mode/proc/update_servant_icons_added(datum/mind/M)
+ var/datum/atom_hud/antag/A = huds[ANTAG_HUD_CLOCKWORK]
+ A.join_hud(M.current)
+ set_antag_hud(M.current, "clockwork")
+
+/datum/game_mode/proc/update_servant_icons_removed(datum/mind/M)
+ var/datum/atom_hud/antag/A = huds[ANTAG_HUD_CLOCKWORK]
+ A.leave_hud(M.current)
+ set_antag_hud(M.current, null)
diff --git a/code/game/gamemodes/clock_cult/clock_mobs.dm b/code/game/gamemodes/clock_cult/clock_mobs.dm
new file mode 100644
index 00000000000..1ce2168e7c6
--- /dev/null
+++ b/code/game/gamemodes/clock_cult/clock_mobs.dm
@@ -0,0 +1,279 @@
+/mob/living/simple_animal/hostile/anima_fragment //Anima fragment: Low health but high melee power. Created by inserting a soul vessel into an empty fragment.
+ name = "anima fragment"
+ desc = "An ominous humanoid shell with a spinning cogwheel as its head, lifted by a jet of blazing red flame."
+ icon = 'icons/mob/clockwork_mobs.dmi'
+ icon_state = "anime_fragment"
+ health = 75 //Glass cannon
+ maxHealth = 75
+ wander = FALSE
+ minbodytemp = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) //Robotic
+ healable = FALSE
+ melee_damage_lower = 25
+ melee_damage_upper = 25
+ attacktext = "crushes"
+ attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg'
+ var/playstyle_string = "You are an anima fragment, a clockwork creation of Ratvar. As a fragment, you are weak but possess powerful melee capabilities \
+ in addition to being immune to extreme temperatures and pressures. Your goal is to serve the Justiciar and his servants in any way you can. You yourself are one of these servants, and will \
+ be able to utilize anything they can, assuming it doesn't require opposable thumbs."
+
+/mob/living/simple_animal/hostile/anima_fragment/New()
+ ..()
+ if(prob(1))
+ name = "anime fragment"
+ real_name = name
+ desc = "I-it's not like I want to show you the light of the Justiciar or anything, B-BAKA!"
+
+/mob/living/simple_animal/hostile/anima_fragment/death(gibbed)
+ ..(TRUE)
+ visible_message("[src]'s flame jets cut out as it falls to the floor with a tremendous crash. A cube of metal tumbles out, whirring and sputtering.", \
+ "Your gears seize up. Your flame jets flicker. Your soul vessel belches smoke as you helplessly crash down.")
+ playsound(src, 'sound/magic/clockwork/anima_fragment_death.ogg', 100, 1)
+ new/obj/item/clockwork/component/replicant_alloy/smashed_anima_fragment(get_turf(src))
+ new/obj/item/device/mmi/posibrain/soul_vessel(get_turf(src)) //Notice the lack of transfer - it's a standard soul vessel with no mind in it!
+ qdel(src)
+ return 1
+
+/mob/living/simple_animal/hostile/clockwork_marauder //Clockwork marauder: Slow but with high damage, resides inside of a servant. Created via the Memory Allocation scripture.
+ name = "clockwork marauder"
+ desc = "A stalwart apparition of a soldier, blazing with crimson flames. It's armed with a gladius and shield."
+ icon = 'icons/mob/clockwork_mobs.dmi'
+ icon_state = "clockwork_marauder"
+ health = 25 //Health is governed by fatigue, but can be directly reduced by the presence of certain objects
+ maxHealth = 25
+ wander = FALSE
+ speed = 1
+ minbodytemp = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ healable = FALSE
+ melee_damage_lower = 10
+ melee_damage_upper = 10
+ attacktext = "slashes"
+ attack_sound = 'sound/weapons/bladeslice.ogg'
+ var/true_name = "Meme Master 69" //Required to call forth the marauder
+ var/list/possible_true_names = list("Xaven", "Melange", "Ravan", "Kel", "Rama", "Geke", "Peris", "Vestra", "Skiwa") //All fairly short and easy to pronounce
+ var/fatigue = 0 //Essentially what determines the marauder's power
+ var/fatigue_recall_threshold = 100 //In variable form due to changed effects once Ratvar awakens
+ var/mob/living/host //The mob that the marauder is living inside of
+ var/recovering = FALSE //If the marauder is recovering from a large amount of fatigue
+ var/playstyle_string = "You are a clockwork marauder, a living extension of Ratvar's will. As a marauder, you are slow but sturdy and decently powerful \
+ in addition to being immune to extreme temperatures and pressures. Your primary goal is to serve the creature that you are now a part of. You can use the Linked Minds ability in your \
+ Marauder tab to communicate silently with your master, but can only exit if your master calls your true name.\n\n\
+ \
+ Taking damage and remaining outside of your master will cause fatigue, which hinders your movement speed and attacks, in addition to forcing you back into your master if it grows \
+ too high. As a final note, you should probably avoid harming any fellow servants of Ratvar."
+
+/mob/living/simple_animal/hostile/clockwork_marauder/New()
+ ..()
+ true_name = pick(possible_true_names)
+
+/mob/living/simple_animal/hostile/clockwork_marauder/Life()
+ ..()
+ if(is_in_host())
+ fatigue = max(0, fatigue - 2) //Doesn't use adjust_fatigue in order to bypass the Ratvar edgecase
+ if(!fatigue && recovering)
+ src << "Your strength has returned. You can once again come forward!"
+ host << "Your marauder is now strong enough to come forward again!"
+ recovering = FALSE
+ else
+ if(ratvar_awakens) //If Ratvar is alive, marauders both don't take fatigue loss and move at sanic speeds
+ speed = -1
+ melee_damage_lower = 30
+ melee_damage_upper = 30
+ attacktext = "devastates"
+ else
+ if(host)
+ switch(get_dist(src, host))
+ if(1 to 5)
+ adjust_fatigue(1)
+ if(5 to INFINITY)
+ adjust_fatigue(rand(10, 20))
+ src << "You're too far from your host and rapidly taking fatigue damage!"
+ switch(fatigue)
+ if(0 to 1) //Bonuses to speed and damage at normal fatigue levels
+ speed = 0
+ melee_damage_lower = 15
+ melee_damage_upper = 15
+ attacktext = "viciously slashes"
+ if(1 to 25)
+ speed = initial(speed)
+ melee_damage_lower = initial(melee_damage_lower)
+ melee_damage_upper = initial(melee_damage_upper)
+ attacktext = initial(attacktext)
+ if(25 to 50) //Damage decrease, but not speed
+ melee_damage_lower = 7
+ melee_damage_upper = 7
+ attacktext = "lightly slashes"
+ if(50 to 75) //Speed decrease
+ speed = 2
+ if(75 to 99) //Massive speed decrease and weak melee attacks
+ speed = 3
+ melee_damage_lower = 5
+ melee_damage_upper = 5
+ attacktext = "weakly slashes"
+ if(99 to 100)
+ src << "The fatigue becomes too much!"
+ if(host)
+ src << "You retreat to [host] - you will have to wait before being deployed again."
+ host << "[true_name] is too fatigued to fight - you will need to wait until they are strong enough."
+ recovering = TRUE
+ return_to_host()
+ else
+ qdel(src) //Shouldn't ever happen, but...
+
+/mob/living/simple_animal/hostile/clockwork_marauder/death(gibbed)
+ ..(TRUE)
+ emerge_from_host()
+ visible_message("[src]'s equipment clatters lifelessly to the ground as the red flames within dissipate.", \
+ "Your equipment falls away. You feel a moment of confusion before your fragile form is annihilated.")
+ playsound(src, 'sound/magic/clockwork/anima_fragment_death.ogg', 100, 1)
+ new/obj/item/clockwork/component/replicant_alloy/fallen_armor(get_turf(src))
+ qdel(src)
+ return 1
+
+/mob/living/simple_animal/hostile/clockwork_marauder/Stat()
+ ..()
+ if(statpanel("Status"))
+ stat(null, "Fatigue: [fatigue]/[fatigue_recall_threshold]")
+ stat(null, "Current True Name: [true_name]")
+ stat(null, "Host: [host ? host : "NONE"]")
+ stat(null, "You are [recovering ? "too weak" : "able"] to deploy!")
+
+/mob/living/simple_animal/hostile/clockwork_marauder/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
+ ..()
+ if(findtext(message, true_name) && is_in_host()) //Called or revealed by hearing their true name
+ if(speaker == host)
+ emerge_from_host()
+ else
+ src << "You hear your true name and partially emerge before you can stop yourself!"
+ host.visible_message("[host]'s skin flashes crimson!", "Your marauder instinctively reacts to its true name!")
+
+/mob/living/simple_animal/hostile/clockwork_marauder/say(message)
+ if(is_in_host())
+ src << "You cannot speak while inside of your host! Used the Linked Minds verb instead."
+ return 0
+ ..()
+
+/mob/living/simple_animal/hostile/clockwork_marauder/adjustHealth(amount) //Fatigue damage
+ for(var/mob/living/L in range(3, src))
+ if(L.null_rod_check()) //Null rods allow direct damage
+ src << "The power of a holy artifact bypasses your armor and wounds you directly!"
+ . = ..()
+ break
+ return 0
+ adjust_fatigue(amount)
+ return 1
+
+/mob/living/simple_animal/hostile/clockwork_marauder/AttackingTarget()
+ if(is_in_host())
+ return 0
+ ..()
+
+/mob/living/simple_animal/hostile/clockwork_marauder/proc/adjust_fatigue(amount) //Adds or removes the given amount of fatigue
+ if(!ratvar_awakens)
+ fatigue = max(0, min(fatigue + amount, fatigue_recall_threshold))
+ return 1
+
+/mob/living/simple_animal/hostile/clockwork_marauder/verb/linked_minds() //Discreet communications between a marauder and its host
+ set name = "Linked Minds"
+ set desc = "Silently communicates with your master."
+ set category = "Marauder"
+
+ if(!host) //Verb isn't removed because they might gain one... somehow
+ usr << "You don't have a host!"
+ return 0
+ var/message = stripped_input(usr, "Enter a message to tell your host.", "Telepathy")// as null|anything
+ if(!usr || !message)
+ return 0
+ if(!host)
+ usr << "Your host seems to have vanished!"
+ return 0
+ message = "Marauder [true_name]:\"[message]\"" //Processed output
+ usr << message
+ host << message
+ return 1
+
+/mob/living/proc/talk_with_marauder() //See above - this is the host version
+ set name = "Linked Minds"
+ set desc = "Silently communicates with your marauder."
+ set category = "Clockwork"
+ var/mob/living/simple_animal/hostile/clockwork_marauder/marauder
+
+ if(!marauder)
+ for(var/mob/living/simple_animal/hostile/clockwork_marauder/C in living_mob_list)
+ if(C.host == src)
+ marauder = C
+ if(!marauder) //Double-check afterwards
+ src << "You aren't hosting any marauders!"
+ verbs -= src
+ return 0
+ var/message = stripped_input(src, "Enter a message to tell your marauder.", "Telepathy")// as null|anything
+ if(!src || !message)
+ return 0
+ if(!marauder)
+ usr << "Your marauder seems to have vanished!"
+ return 0
+ message = "Servant [name == real_name ? name : "[real_name] (as [name])"]:\"[message]\"" //Processed output
+ src << message
+ marauder << message
+ return 1
+
+/mob/living/simple_animal/hostile/clockwork_marauder/verb/change_true_name()
+ set name = "Change True Name (One-Use)"
+ set desc = "Changes your true name, used to be called forth."
+ set category = "Marauder"
+
+ verbs -= /mob/living/simple_animal/hostile/clockwork_marauder/verb/change_true_name
+ var/new_name = stripped_input(usr, "Enter a new true name (20-character limit).", "Change True Name")// as null|anything
+ if(!usr)
+ return 0
+ if(!new_name)
+ usr << "You decide against changing your true name for now."
+ verbs += /mob/living/simple_animal/hostile/clockwork_marauder/verb/change_true_name //If they decide against it, let them have another opportunity
+ return 0
+ new_name = dd_limittext(new_name, 20)
+ true_name = new_name
+ usr << "You have changed your true name to \"[new_name]\"!"
+ if(host)
+ host << "Your clockwork marauder has changed their true name to \"[new_name]\"!"
+ return 1
+
+/mob/living/simple_animal/hostile/clockwork_marauder/verb/return_to_host()
+ set name = "Return to Host"
+ set desc = "Recalls yourself to your host, assuming you aren't already there."
+ set category = "Marauder"
+
+ if(is_in_host())
+ return 0
+ if(!host)
+ src << "You don't have a host!"
+ verbs -= /mob/living/simple_animal/hostile/clockwork_marauder/verb/return_to_host
+ return 0
+ host << "You feel [true_name]'s consciousness settle in your mind."
+ visible_message("[src] is yanked into [host]'s body!", "You return to [host].")
+ forceMove(host)
+ return 1
+
+/mob/living/simple_animal/hostile/clockwork_marauder/proc/emerge_from_host() //Notice that this is a proc rather than a verb - marauders can NOT exit at will, but they CAN return
+ if(!is_in_host())
+ return 0
+ if(recovering)
+ host << "[true_name] is too weak to come forth!"
+ src << "You try to come forth, but you're too weak!"
+ return 0
+ host << "You words echo with power as [true_name] emerges from your body!"
+ forceMove(get_turf(host))
+ visible_message("[host]'s skin glows red as a [name] emerges from their body!", "You exit the safety of [host]'s body!")
+ return 1
+
+/mob/living/simple_animal/hostile/clockwork_marauder/proc/is_in_host() //Checks if the marauder is inside of their host
+ return host && loc == host
+
+/mob/living/mind_control_holder
+ name = "imprisoned mind"
+ desc = "A helpless mind, imprisoned in its own body."
+ stat = 0
+ flags = GODMODE
+
+/mob/living/mind_control_holder/say()
+ return 0
diff --git a/code/game/gamemodes/clock_cult/clock_objects.dm b/code/game/gamemodes/clock_cult/clock_objects.dm
new file mode 100644
index 00000000000..ee80c39f8cb
--- /dev/null
+++ b/code/game/gamemodes/clock_cult/clock_objects.dm
@@ -0,0 +1,1586 @@
+/////////////////////
+// CLOCKWORK ITEMS //
+/////////////////////
+
+/obj/item/clockwork
+ name = "meme blaster"
+ desc = "What the fuck is this? It looks kinda like a frog."
+ var/clockwork_desc = "A fabled artifact from beyond the stars. Contains concentrated meme essence." //Shown to clockwork cultists instead of the normal description
+ icon = 'icons/obj/clockwork_objects.dmi'
+ icon_state = "rare_pepe"
+ w_class = 2
+
+/obj/item/clockwork/New()
+ ..()
+ all_clockwork_objects += src
+
+/obj/item/clockwork/Destroy()
+ all_clockwork_objects -= src
+ return ..()
+
+/obj/item/clockwork/examine(mob/user)
+ if((is_servant_of_ratvar(user) || isobserver(user)) && clockwork_desc)
+ desc = clockwork_desc
+ ..()
+ desc = initial(desc)
+
+/obj/item/clockwork/slab //Clockwork slab: The most important tool in Ratvar's arsenal. Allows scripture recital, tutorials, and generates components.
+ name = "clockwork slab"
+ desc = "A strange metal tablet. A clock in the center turns around and around."
+ clockwork_desc = "A link between the Celestial Derelict and the mortal plane. Contains limitless knowledge, fabricates components, and outputs a stream of information that only a trained eye can detect."
+ icon_state = "dread_ipad"
+ w_class = 3
+ var/list/stored_components = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0)
+ var/busy //If the slab is currently being used by something
+ var/production_cycle = 0
+ var/no_cost = FALSE //If the slab is admin-only and needs no components and has no scripture locks
+
+/obj/item/clockwork/slab/starter
+ stored_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 1, "guvax_capacitor" = 1, "replicant_alloy" = 1, "hierophant_ansible" = 1)
+
+/obj/item/clockwork/slab/debug
+ no_cost = TRUE
+
+/obj/item/clockwork/slab/debug/attack_hand(mob/living/user)
+ ..()
+ if(!is_servant_of_ratvar(user))
+ add_servant_of_ratvar(user)
+
+/obj/item/clockwork/slab/New()
+ ..()
+ SSobj.processing += src
+
+/obj/item/clockwork/slab/Destroy()
+ SSobj.processing -= src
+ ..()
+
+/obj/item/clockwork/slab/process()
+ production_cycle++
+ if(production_cycle < SLAB_PRODUCTION_THRESHOLD)
+ return 0
+ var/component_to_generate = pick("belligerent_eye", "vanguard_cogwheel", "guvax_capacitor", "replicant_alloy", "hierophant_ansible") //Possible todo: Generate based on the lowest amount?
+ stored_components[component_to_generate]++
+ var/mob/living/L
+ if(isliving(loc))
+ L = loc
+ else if(istype(loc, /obj/item/weapon/storage))
+ var/obj/item/weapon/storage/W = loc
+ if(isliving(W.loc)) //Only goes one level down - otherwise it just doesn't tell you
+ L = W.loc
+ if(L)
+ L << "Your slab clunks as it produces a new component."
+ production_cycle = 0
+ return 1
+
+/obj/item/clockwork/slab/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/clockwork/component) && is_servant_of_ratvar(user))
+ var/obj/item/clockwork/component/C = I
+ if(!C.component_id)
+ return 0
+ user.visible_message("[user] inserts [C] into [src]'s compartments.", "You insert [C] into [src].")
+ stored_components[C.component_id]++
+ user.drop_item()
+ qdel(C)
+ return 1
+ ..()
+
+/obj/item/clockwork/slab/attack_self(mob/living/user)
+ if(iscultist(user))
+ user << "\"You reek of blood. You've got a lot of nerve to even look at that slab.\""
+ user.visible_message("A sizzling sound comes from [user]'s hands!", "[src] suddenly grows extremely hot in your hands!")
+ playsound(get_turf(user), 'sound/weapons/sear.ogg', 50, 1)
+ user.drop_item()
+ user.emote("scream")
+ user.apply_damage(5, BURN, "l_arm")
+ user.apply_damage(5, BURN, "r_arm")
+ return 0
+ if(!is_servant_of_ratvar(user))
+ user << "The information on [src]'s display shifts rapidly. After a moment, your head begins to pound, and you tear your eyes away."
+ user.confused = max(0, user.confused + 3)
+ return 0
+ if(busy)
+ user << "[src] refuses to work, displaying the message: \"[busy]!\""
+ return 0
+ access_display(user)
+
+/obj/item/clockwork/slab/proc/access_display(mob/living/user)
+ if(!is_servant_of_ratvar(user))
+ return 0
+ var/action = input(user, "Among the swathes of information, you see...", "[src]") as null|anything in list("Recital", "Records", "Recollection", "Repository", "Report")
+ if(!action || !user.canUseTopic(src))
+ return 0
+ switch(action)
+ if("Recital")
+ recite_scripture(user)
+ if("Records")
+ show_stats(user)
+ if("Recollection")
+ show_guide(user)
+ if("Repository")
+ show_components(user)
+ access_display(user)
+ if("Report")
+ show_hierophant(user)
+ access_display(user)
+ return 1
+
+/obj/item/clockwork/slab/proc/recite_scripture(mob/living/user)
+ var/servants = 0
+ var/unconverted_ai_exists = FALSE
+ for(var/mob/living/M in living_mob_list)
+ if(is_servant_of_ratvar(M))
+ servants++
+ for(var/mob/living/silicon/ai/ai in living_mob_list)
+ if(!is_servant_of_ratvar(ai) && ai.client)
+ unconverted_ai_exists = TRUE
+ var/list/tiers_of_scripture = list("Drivers")
+ tiers_of_scripture += "Scripts[ratvar_awakens || (servants >= 5 && clockwork_caches >= 1) || no_cost ? "" : " \[LOCKED\]"]"
+ tiers_of_scripture += "Applications[ratvar_awakens || (servants >= 8 && clockwork_caches >= 3 && clockwork_construction_value >= 50) || no_cost ? "" : " \[LOCKED\]"]"
+ tiers_of_scripture += "Revenant[ratvar_awakens || (servants >= 10 && clockwork_construction_value >= 100) || no_cost ? "" : " \[LOCKED\]"]"
+ tiers_of_scripture += "Judgement[ratvar_awakens || (servants >= 10 && clockwork_construction_value >= 100 && !unconverted_ai_exists) || no_cost ? "" : " \[LOCKED\]"]"
+ var/scripture_tier = input(user, "Choose a category of scripture to recite.", "[src]") as null|anything in tiers_of_scripture
+ if(!scripture_tier || !user.canUseTopic(src))
+ return 0
+ var/list/available_scriptures = list()
+ var/datum/clockwork_scripture/scripture_to_recite
+ var/tier_to_browse
+ switch(scripture_tier)
+ if("Drivers")
+ tier_to_browse = SCRIPTURE_DRIVER
+ if("Scripts")
+ tier_to_browse = SCRIPTURE_SCRIPT
+ if("Applications")
+ tier_to_browse = SCRIPTURE_APPLICATION
+ if("Revenant")
+ tier_to_browse = SCRIPTURE_REVENANT
+ if("Judgement")
+ tier_to_browse = SCRIPTURE_JUDGEMENT
+ if(!tier_to_browse)
+ user << "That section of scripture is too powerful right now!"
+ return 0
+ for(var/S in subtypesof(/datum/clockwork_scripture))
+ var/datum/clockwork_scripture/C = S
+ if(initial(C.tier) == tier_to_browse)
+ available_scriptures += initial(C.name)
+ if(!available_scriptures.len)
+ return 0
+ var/chosen_scripture = input(user, "Choose a piece of scripture to recite.", "[src]") as null|anything in available_scriptures
+ if(!chosen_scripture || !user.canUseTopic(src))
+ return 0
+ for(var/S in subtypesof(/datum/clockwork_scripture))
+ var/datum/clockwork_scripture/C = S
+ if(initial(C.name) == chosen_scripture)
+ scripture_to_recite = new C
+ if(!scripture_to_recite)
+ return 0
+ scripture_to_recite.slab = src
+ scripture_to_recite.invoker = user
+ scripture_to_recite.run_scripture()
+ return 1
+
+/obj/item/clockwork/slab/proc/show_stats(mob/living/user) //A bit barebones, but there really isn't any more needed
+ var/servants = 0
+ for(var/mob/living/L in living_mob_list)
+ if(is_servant_of_ratvar(L))
+ servants++
+ user << "State of the Enlightened"
+ user << "Total servants: [servants]"
+ user << "Total construction value: [clockwork_construction_value]"
+ user << "Total tinkerer's caches: [clockwork_caches]"
+ user << "Total tinkerer's daemons: [clockwork_daemons] ([servants / 5 < clockwork_daemons ? "DISABLED: Too few servants (5 servants per daemon)!" : "Functioning Normally"])"
+ user << "Nezbere: [!clockwork_generals_invoked["nezbere"] ? "Ready" : "Recovering"]"
+ user << "Sevtug: [!clockwork_generals_invoked["sevtug"] ? "Ready" : "Recovering"]"
+ user << "Nzcrentr: [!clockwork_generals_invoked["nzcrentr"] ? "Ready" : "Recovering"]"
+ user << "Inath-Neq: [!clockwork_generals_invoked["inath-neq"] ? "Ready" : "Recovering"]"
+
+/obj/item/clockwork/slab/proc/show_guide(mob/living/user)
+ var/text = "
Chetr nyy hageh’guf naq ubabe Ratvar.
\
+ \
+ First and foremost, you serve Ratvar, the Clockwork Justiciar, in any ways he sees fit. This is with no regard to your personal well-being, and you would do well to think of the larger \
+ scale of things than your life. Through foul and unholy magics was the Celestial Derelict formed, and fouler still those which trapped your master within it for all eternity. The Justiciar \
+ wishes retribution upon those who performed this terrible act upon him - the Nar-Sian cultists - and you are to help him obtain it.
\
+ \
+ This is not a trivial task. Due to the nature of his prison, Ratvar is incapable of directly influencing the mortal plane. There is, however, a workaround - links between the perceptible \
+ universe and Reebe (the Celestial Derelict) can be created and utilized. This is typically done via the creation of a slab akin to the one you are holding right now. The slabs tap into the \
+ tidal flow of energy and information keeping Reebe sealed and presents it as meaningless images to preserve sanity. This slab can utilize the power in many different ways.
\
+ \
+ This is done through Components - pieces of the Justiciar's body that have since fallen off in the countless years since his imprisonment. Ratvar's unfortunate condition results \
+ in the fragmentation of his body. These components still house great power on their own, and can slowly be drawn from Reebe by links capable of doing so. The most basic of these links lies \
+ in the clockwork slab, which will slowly generate components over time - around one component of a random type is produced every minute, which is obviously inefficient. There are other ways \
+ to create these components through scripture and certain structures.
\
+ \
+ In addition to their ability to pull components, slabs also possess other functionalities...
\
+ \
+ The first functionality of the slab is Recital. This allows you to consume components either from your slab or from the global cache (more on that in the scripture list) to perform \
+ effects usually considered magical in nature. Effects vary considerably - you might drain the power of nearby APCs or break the will of those implanted by Nanotrasen. Nevertheless, scripture \
+ is extremely important to a successful takeover.
\
+ \
+ The second functionality of the clockwork slab is Records. The slab is not a one-way link and can also feed information into the stream that it draws from. Records will allow many \
+ important statistics to be displayed, such as the amount of people converted and total construction value. You should check it often.
\
+ \
+ The third functionality is Recollection, which will display this guide. Recollection will automatically be initiated if you have not used a slab before.
\
+ \
+ The fourth functionality is the Repository, which will display all components stored within the slab.
\
+ \
+ The fifth and final functionality is Report, which allows you to discreetly communicate with all other servants.
\
+ \
+ A complete list of scripture, its effects, and its requirements can be found below. Note that anything above a driver always consumes the components listed unless otherwise \
+ specified.
"
for(var/datum/mind/N in ticker.mode.red_deities)
diff --git a/code/modules/admin/verbs/shuttles.dm b/code/modules/admin/verbs/shuttles.dm
deleted file mode 100644
index 2dc8e5820ee..00000000000
--- a/code/modules/admin/verbs/shuttles.dm
+++ /dev/null
@@ -1,116 +0,0 @@
-/proc/emergency_sanity_check()
- if(SSshuttle.emergency.mode != SHUTTLE_IDLE)
- var/confirm = alert(src, "Modification of the emergency shuttle while it is not idle can be highly dangerous, and may result in WEIRD UNPREDICTABLE SHIT. Are you SURE you want to continue? Obviously if you're not touching the emergency shuttle, then you're probably fine.", "Confirm", "Yes", "No")
- if(confirm == "Yes")
- return TRUE
- else
- return FALSE
- else
- return TRUE
-
-/client/proc/cmd_admin_destroy_shuttle()
- set category = "Admin"
- set name = "Shuttle Destroy"
-
- if (!holder)
- src << "Only administrators may use this command."
- return
-
- if(!emergency_sanity_check())
- return
-
- var/list/names = list()
- var/obj/docking_port/mobile/M
- for (var/atom/AM in SSshuttle.mobile)
- M = AM
- names += M.name
-
- var/selected = input("Select shuttle to DESTROY", "Shuttles") as null|anything in names
-
- var/decide_against_msg = "You decide against destroying a shuttle."
-
- if(!selected)
- src << decide_against_msg
- return
-
- var/confirm = alert(src, "Are you sure you want to destroy [selected]?", "Confirm", "Yes", "No")
-
- if(confirm != "Yes")
- src << decide_against_msg
- return
-
- var/destroyed = FALSE
- for (var/atom/AM in SSshuttle.mobile)
- M = AM
- if(M.name == selected)
- M.jumpToNullSpace()
- destroyed = TRUE
- break
-
- if(!destroyed)
- src << "Something went wrong, the selected shuttle doesn't exist anymore."
- return
-
- log_admin("[key_name(usr)] - ShuttleDestroy: [M]")
- message_admins("[key_name_admin(usr)] has used ShuttleDestroy on [selected] ")
- feedback_add_details("admin_verb","SHTDEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/proc/cmd_admin_import_shuttle()
- set category = "Admin"
- set name = "Shuttle Import"
-
- if (!holder)
- src << "Only administrators may use this command."
- return
-
- if(!emergency_sanity_check())
- return
-
- var/datum/map_template/template
- var/map = input(usr, "Choose a Shuttle Template to import","Import Shuttle Template") as null|anything in shuttle_templates
- if(!map)
- return
- template = shuttle_templates[map]
-
- if(alert(usr,"Confirm importing of [map]","Shuttle Import Confirm","Yes","No") != "Yes")
- return
-
- var/turf/T = get_turf(locate("landmark*Shuttle Import"))
- if(!T)
- usr << "Shuttle import landmark not found. \
- Aborting."
- template.load(T, centered = TRUE)
-
- var/obj/docking_port/mobile/M
-
- for(var/S in template.get_affected_turfs(T,centered = TRUE))
- for (var/AM in S)
- if(istype(AM, /obj/docking_port/mobile))
- if(!M)
- M = AM
- else
- usr << "More than one mobile docking port was detected ([AM]), this is a BAD THING, TELL A CODER."
- if(istype(AM, /obj/docking_port/stationary))
- usr << "REEEEEEEEEEEE! THE LOADED TEMPLATE HAS [AM], A STATIONARY DOCKING PORT, THIS IS A BAD THING FIX IT. TELL A CODER. WE CAN DELETE IT BUT IT SHOULD NOT BE THERE."
- var/obj/docking_port/stationary/bad = AM
- bad.i_know_what_im_doing = TRUE
- qdel(bad)
-
- if(!M)
- usr << "The loaded template didn't have a mobile docking port! The template has been deleted."
- for(var/S in template.get_affected_turfs(T,centered = TRUE))
- var/turf/T0 = S
- for(var/atom/AM in T0.GetAllContents())
- if(istype(AM, /mob/dead))
- continue
- qdel(AM)
- qdel(S)
- return
-
- var/status = M.dockRoundstart()
- if(status)
- message_admins("The imported shuttle [map]/[M] failed to travel to its roundstart location (error code [status]). Please fix or delete the imported shuttle before continuing any more shuttle import hijinks.")
-
- log_admin("[key_name(usr)] - ShuttleImport: [map] - [M]")
- message_admins("[key_name_admin(usr)] has used ShuttleImport: [map] - [M] ")
- feedback_add_details("admin_verb","SHTIMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm
index b753875e24b..6f88e889ca2 100644
--- a/code/modules/assembly/health.dm
+++ b/code/modules/assembly/health.dm
@@ -91,7 +91,7 @@
var/mob/user = usr
- if(!user.canUseTopic(user))
+ if(!user.canUseTopic(src))
usr << browse(null, "window=hscan")
onclose(usr, "hscan")
return
@@ -104,4 +104,4 @@
return
attack_self(user)
- return
\ No newline at end of file
+ return
diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm
index 893df8ead12..8f43cb52da0 100644
--- a/code/modules/atmospherics/environmental/LINDA_fire.dm
+++ b/code/modules/atmospherics/environmental/LINDA_fire.dm
@@ -49,7 +49,7 @@
unacidable = 1//So you can't melt fire with acid.
icon = 'icons/effects/fire.dmi'
icon_state = "1"
- layer = TURF_LAYER
+ layer = ABOVE_OPEN_TURF_LAYER
luminosity = 3
var/volume = 125
diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm
index 5188750f085..244f8b1cd71 100644
--- a/code/modules/atmospherics/gasmixtures/gas_types.dm
+++ b/code/modules/atmospherics/gasmixtures/gas_types.dm
@@ -76,7 +76,7 @@ var/list/hardcoded_gases = list("o2","n2","co2","plasma") //the main four gases,
/obj/effect/overlay/gas/
icon = 'icons/effects/tile_effects.dmi'
mouse_opacity = 0
- layer = 5
+ layer = FLY_LAYER
appearance_flags = RESET_COLOR|TILE_BOUND
/obj/effect/overlay/gas/New(state)
diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm
index 7997c832e00..891c4bb1e5d 100644
--- a/code/modules/atmospherics/machinery/atmosmachinery.dm
+++ b/code/modules/atmospherics/machinery/atmosmachinery.dm
@@ -15,6 +15,7 @@ Pipelines + Other Objects -> Pipe network
active_power_usage = 0
power_channel = ENVIRON
on_blueprints = TRUE
+ layer = GAS_PIPE_LAYER //under wires
var/nodealert = 0
var/can_unwrench = 0
var/initialize_directions = 0
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm
index f2dfa858d17..807980318e1 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm
@@ -2,7 +2,6 @@
icon = 'icons/obj/atmospherics/components/unary_devices.dmi'
dir = SOUTH
initialize_directions = SOUTH
- layer = TURF_LAYER+0.1
device_type = UNARY
/obj/machinery/atmospherics/components/unary/SetInitDirections()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
index 55ac2266861..06a369e647e 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm
@@ -259,7 +259,7 @@
user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.")
welded = 0
update_icon()
- pipe_vision_img = image(src, loc, layer = 20, dir = dir)
+ pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir)
return 0
else
return ..()
@@ -289,7 +289,7 @@
user.visible_message("[user] furiously claws at [src]!", "You manage to clear away the stuff blocking the vent", "You hear loud scraping noises.")
welded = 0
update_icon()
- pipe_vision_img = image(src, loc, layer = 20, dir = dir)
+ pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir)
playsound(loc, 'sound/weapons/bladeslice.ogg', 100, 1)
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
index b9c727da0a6..5c60897d1dc 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm
@@ -308,7 +308,7 @@
user.visible_message("[user] unwelds the scrubber.", "You unweld the scrubber.", "You hear welding.")
welded = 0
update_icon()
- pipe_vision_img = image(src, loc, layer = 20, dir = dir)
+ pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir)
return 0
else
return ..()
@@ -329,7 +329,7 @@
user.visible_message("[user] furiously claws at [src]!", "You manage to clear away the stuff blocking the scrubber.", "You hear loud scraping noises.")
welded = 0
update_icon()
- pipe_vision_img = image(src, loc, layer = 20, dir = dir)
+ pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir)
playsound(loc, 'sound/weapons/bladeslice.ogg', 100, 1)
diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm
index 94898fcd009..fc412840ebe 100644
--- a/code/modules/atmospherics/machinery/pipes/pipes.dm
+++ b/code/modules/atmospherics/machinery/pipes/pipes.dm
@@ -3,7 +3,6 @@
var/volume = 0
level = 1
- layer = 2.4 //under wires with their 2.44
use_power = 0
can_unwrench = 1
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index bb6107e664f..0788a8c2c27 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -79,11 +79,12 @@
if(ckey)
M.ckey = ckey
M << "[flavour_text]"
+ var/datum/mind/MM = M.mind
if(objectives)
- var/datum/mind/MM = M.mind
for(var/objective in objectives)
MM.objectives += new/datum/objective(objective)
special(M)
+ MM.name = M.real_name
if(uses > 0)
uses--
if(!permanent && !uses)
@@ -530,4 +531,4 @@
if(despawn == "No" || !loc || !Adjacent(user))
return
user.visible_message("[user.name] climbs back into cryosleep...")
- qdel(user)
\ No newline at end of file
+ qdel(user)
diff --git a/code/modules/awaymissions/mission_code/challenge.dm b/code/modules/awaymissions/mission_code/challenge.dm
index 2134e7db4cb..75d240ec777 100644
--- a/code/modules/awaymissions/mission_code/challenge.dm
+++ b/code/modules/awaymissions/mission_code/challenge.dm
@@ -1,40 +1,35 @@
-//Challenge Areas
-
-/area/awaymission/challenge/start
- name = "Where Am I?"
- icon_state = "away"
-
-/area/awaymission/challenge/main
- name = "Danger Room"
- icon_state = "away1"
- requires_power = 0
-
-/area/awaymission/challenge/end
- name = "Administration"
- icon_state = "away2"
- requires_power = 0
-
-
-/obj/machinery/power/emitter/energycannon
- name = "Energy Cannon"
- desc = "A heavy duty industrial laser"
- icon = 'icons/obj/singularity.dmi'
- icon_state = "emitter"
- anchored = 1
- density = 1
-
- use_power = 0
- idle_power_usage = 0
- active_power_usage = 0
-
- active = 1
- locked = 1
- state = 2
-
-/obj/machinery/power/emitter/energycannon/RefreshParts()
- return
-
-/obj/machinery/power/emitter/energycannon/magical
- name = "wabbajack statue"
- desc = "Who am I? What is my purpose in life? What do I mean by who am I?"
- projectile_type = /obj/item/projectile/magic/change
+//Challenge Areas
+
+/area/awaymission/challenge/start
+ name = "Where Am I?"
+ icon_state = "away"
+
+/area/awaymission/challenge/main
+ name = "Danger Room"
+ icon_state = "away1"
+ requires_power = 0
+
+/area/awaymission/challenge/end
+ name = "Administration"
+ icon_state = "away2"
+ requires_power = 0
+
+
+/obj/machinery/power/emitter/energycannon
+ name = "Energy Cannon"
+ desc = "A heavy duty industrial laser"
+ icon = 'icons/obj/singularity.dmi'
+ icon_state = "emitter"
+ anchored = 1
+ density = 1
+
+ use_power = 0
+ idle_power_usage = 0
+ active_power_usage = 0
+
+ active = 1
+ locked = 1
+ state = 2
+
+/obj/machinery/power/emitter/energycannon/RefreshParts()
+ return
diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm
index 4a744ef7100..460e53bfd1d 100644
--- a/code/modules/awaymissions/mission_code/wildwest.dm
+++ b/code/modules/awaymissions/mission_code/wildwest.dm
@@ -120,14 +120,10 @@
desc = "What is that thing?"
density = 1
anchored = 1
- layer = 3
icon = 'icons/mob/blob.dmi'
icon_state = "blobpod"
var/triggered = 0
-/obj/effect/meatgrinder/New()
- icon_state = "blobpod"
-
/obj/effect/meatgrinder/Crossed(AM as mob|obj)
Bumped(AM)
diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm
index 2d863a0079e..075ef8b3df6 100644
--- a/code/modules/awaymissions/zlevel.dm
+++ b/code/modules/awaymissions/zlevel.dm
@@ -64,9 +64,10 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
/proc/seedRuins(z_level = 1, budget = 0, whitelist = /area/space, list/potentialRuins = space_ruins_templates)
var/overall_sanity = 100
-
var/ruins = potentialRuins.Copy()
+ world << "Loading ruins..."
+
while(budget > 0 && overall_sanity > 0)
// Pick a ruin
var/datum/map_template/ruin/ruin = ruins[pick(ruins)]
@@ -77,6 +78,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
// If so, try to place it
var/sanity = 100
// And if we can't fit it anywhere, give up, try again
+
while(sanity > 0)
sanity--
var/turf/T = locate(rand(25, world.maxx - 25), rand(25, world.maxy - 25), z_level)
@@ -103,6 +105,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
if(!overall_sanity)
world.log << "Ruin loader gave up with [budget] left to spend."
+
/obj/effect/ruin_loader
name = "random ruin"
icon = 'icons/obj/weapons.dmi'
@@ -115,17 +118,15 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
var/datum/map_template/T = potentialRuins[A]
if(!T.loaded)
possible_ruins += T
- world << "Loading ruins..."
if(!template && possible_ruins.len)
template = safepick(possible_ruins)
if(!template)
- world << "No ruins found."
- return
+ return FALSE
for(var/i in template.get_affected_turfs(get_turf(src), 1))
var/turf/T = i
for(var/mob/living/simple_animal/monster in T)
qdel(monster)
template.load(get_turf(src),centered = TRUE)
template.loaded++
- world << "Ruins loaded."
qdel(src)
+ return TRUE
diff --git a/code/modules/client/client defines.dm b/code/modules/client/client_defines.dm
similarity index 100%
rename from code/modules/client/client defines.dm
rename to code/modules/client/client_defines.dm
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client_procs.dm
similarity index 100%
rename from code/modules/client/client procs.dm
rename to code/modules/client/client_procs.dm
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index a3856b0ee1c..3054e6a18e1 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -183,7 +183,7 @@ BLIND // can't see anything
permeability_coefficient = null
flags &= ~visor_flags
flags_inv &= ~visor_flags_inv
- flags_cover &= 0
+ flags_cover = 0
if(adjusted_flags)
slot_flags = adjusted_flags
user.wear_mask_update(src, toggle_off = mask_adjusted)
@@ -460,11 +460,9 @@ BLIND // can't see anything
/obj/item/clothing/under/AltClick(mob/user)
..()
- if(!user.canUseTopic(user))
+ if(!user.canUseTopic(src, be_close=TRUE))
user << "You can't do that right now!"
return
- if(!in_range(src, user))
- return
else
rolldown()
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index d66fef73c9b..1ce016c73fe 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -23,11 +23,9 @@
/obj/item/clothing/head/soft/AltClick(mob/user)
..()
- if(!user.canUseTopic(user))
+ if(!user.canUseTopic(src, be_close=TRUE))
user << "You can't do that right now!"
return
- if(!in_range(src, user))
- return
else
flip(user)
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index 2ac22361d26..8b82ff05ae2 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -18,11 +18,9 @@
/obj/item/clothing/mask/breath/AltClick(mob/user)
..()
- if(!user.canUseTopic(user))
+ if(!user.canUseTopic(src, be_close=TRUE))
user << "You can't do that right now!"
return
- if(!in_range(src, user))
- return
else
adjustmask(user)
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index 5f7b4386db7..35049b25351 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -70,11 +70,9 @@
/obj/item/clothing/suit/toggle/AltClick(mob/user)
..()
- if(!user.canUseTopic(user))
+ if(!user.canUseTopic(src, be_close=TRUE))
user << "You can't do that right now!"
return
- if(!in_range(src, user))
- return
else
suit_toggle(user)
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 77cce99d702..9dc01f1c627 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -9,6 +9,14 @@
var/chem_catalysts[] = list() //like tools but for reagents
var/category = CAT_NONE //where it shows up in the crafting UI
+/datum/crafting_recipe/spear
+ name = "Spear"
+ result = /obj/item/weapon/twohanded/spear
+ reqs = list(/obj/item/weapon/restraints/handcuffs/cable = 1,
+ /obj/item/weapon/shard = 1,
+ /obj/item/stack/rods = 1)
+ time = 40
+ category = CAT_WEAPON
/datum/crafting_recipe/pin_removal
name = "Pin Removal"
diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm
index bfb574706cc..19b3ac4abfa 100644
--- a/code/modules/events/anomaly_bluespace.dm
+++ b/code/modules/events/anomaly_bluespace.dm
@@ -65,7 +65,7 @@
blueeffect.screen_loc = "WEST,SOUTH to EAST,NORTH"
blueeffect.icon = 'icons/effects/effects.dmi'
blueeffect.icon_state = "shieldsparkles"
- blueeffect.layer = 17
+ blueeffect.layer = FLASH_LAYER
blueeffect.mouse_opacity = 0
M.client.screen += blueeffect
sleep(20)
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index 793f267c948..23e4ee960d3 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -327,8 +327,7 @@
/datum/spacevine_mutation/flowering/on_grow(obj/effect/spacevine/holder)
if(holder.energy == 2 && prob(severity) && !locate(/obj/structure/alien/resin/flower_bud_enemy) in range(5,holder))
- var/obj/structure/alien/resin/flower_bud_enemy/FBE = new /obj/structure/alien/resin/flower_bud_enemy (get_turf(holder))
- FBE.layer = holder.layer+0.1
+ new/obj/structure/alien/resin/flower_bud_enemy(get_turf(holder))
/datum/spacevine_mutation/flowering/on_cross(obj/effect/spacevine/holder, mob/living/crosser)
@@ -344,7 +343,7 @@
icon_state = "Light1"
anchored = 1
density = 0
- layer = MOB_LAYER + 0.8
+ layer = SPACEVINE_LAYER
mouse_opacity = 2 //Clicking anywhere on the turf is good enough
pass_flags = PASSTABLE | PASSGRILLE
var/energy = 0
@@ -532,7 +531,6 @@
src.icon_state = pick("Med1", "Med2", "Med3")
energy = 1
SetOpacity(1)
- layer = 5
else
src.icon_state = pick("Hvy1", "Hvy2", "Hvy3")
energy = 2
diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm
index b301049eaf4..f472cfe6796 100644
--- a/code/modules/events/wizard/greentext.dm
+++ b/code/modules/events/wizard/greentext.dm
@@ -29,6 +29,7 @@
var/mob/living/new_holder
var/list/color_altered_mobs = list()
burn_state = FIRE_PROOF
+ var/quiet = FALSE
/obj/item/weapon/greentext/New()
..()
@@ -76,9 +77,11 @@
last_holder.color = "#FF0000"
last_holder = new_holder //long live the king
-/obj/item/weapon/greentext/Destroy()
- if(burn_state != ON_FIRE)
+/obj/item/weapon/greentext/Destroy(force)
+ if((burn_state != ON_FIRE) && (!force))
return QDEL_HINT_LETMELIVE
+
+ . = ..()
poi_list.Remove(src)
for(var/mob/M in mob_list)
var/message = "A dark temptation has passed from this world"
@@ -86,5 +89,9 @@
message += " and you're finally able to forgive yourself"
M.color = initial(M.color)
message += "..."
- M << message
- return ..()
+ // can't skip the mob check as it also does the decolouring
+ if(!quiet)
+ M << message
+
+/obj/item/weapon/greentext/quiet
+ quiet = TRUE
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 9eca1592029..46998855692 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -227,7 +227,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
/obj/effect/hallucination/simple/singularity
image_icon = 'icons/effects/224x224.dmi'
image_state = "singularity_s7"
- image_layer = 6
+ image_layer = MASSIVE_OBJ_LAYER
px = -96
py = -96
@@ -635,7 +635,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
if(!H.r_store) slots_free += ui_storage2
if(slots_free.len)
halitem.screen_loc = pick(slots_free)
- halitem.layer = 50
+ halitem.layer = ABOVE_HUD_LAYER
switch(rand(1,6))
if(1) //revolver
halitem.icon = 'icons/obj/guns/projectile.dmi'
diff --git a/code/modules/food&drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
similarity index 100%
rename from code/modules/food&drinks/drinks/drinks.dm
rename to code/modules/food_and_drinks/drinks/drinks.dm
diff --git a/code/modules/food&drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
similarity index 100%
rename from code/modules/food&drinks/drinks/drinks/bottle.dm
rename to code/modules/food_and_drinks/drinks/drinks/bottle.dm
diff --git a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
similarity index 100%
rename from code/modules/food&drinks/drinks/drinks/drinkingglass.dm
rename to code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm
diff --git a/code/modules/food&drinks/food.dm b/code/modules/food_and_drinks/food.dm
similarity index 100%
rename from code/modules/food&drinks/food.dm
rename to code/modules/food_and_drinks/food.dm
diff --git a/code/modules/food&drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm
similarity index 100%
rename from code/modules/food&drinks/food/condiment.dm
rename to code/modules/food_and_drinks/food/condiment.dm
diff --git a/code/modules/food&drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm
similarity index 100%
rename from code/modules/food&drinks/food/customizables.dm
rename to code/modules/food_and_drinks/food/customizables.dm
diff --git a/code/modules/food&drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks.dm
rename to code/modules/food_and_drinks/food/snacks.dm
diff --git a/code/modules/food&drinks/food/snacks/dough.dm b/code/modules/food_and_drinks/food/snacks/dough.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks/dough.dm
rename to code/modules/food_and_drinks/food/snacks/dough.dm
diff --git a/code/modules/food&drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks/meat.dm
rename to code/modules/food_and_drinks/food/snacks/meat.dm
diff --git a/code/modules/food&drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_bread.dm
rename to code/modules/food_and_drinks/food/snacks_bread.dm
diff --git a/code/modules/food&drinks/food/snacks_burgers.dm b/code/modules/food_and_drinks/food/snacks_burgers.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_burgers.dm
rename to code/modules/food_and_drinks/food/snacks_burgers.dm
diff --git a/code/modules/food&drinks/food/snacks_cake.dm b/code/modules/food_and_drinks/food/snacks_cake.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_cake.dm
rename to code/modules/food_and_drinks/food/snacks_cake.dm
diff --git a/code/modules/food&drinks/food/snacks_egg.dm b/code/modules/food_and_drinks/food/snacks_egg.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_egg.dm
rename to code/modules/food_and_drinks/food/snacks_egg.dm
diff --git a/code/modules/food&drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_meat.dm
rename to code/modules/food_and_drinks/food/snacks_meat.dm
diff --git a/code/modules/food&drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_other.dm
rename to code/modules/food_and_drinks/food/snacks_other.dm
diff --git a/code/modules/food&drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_pastry.dm
rename to code/modules/food_and_drinks/food/snacks_pastry.dm
diff --git a/code/modules/food&drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_pie.dm
rename to code/modules/food_and_drinks/food/snacks_pie.dm
diff --git a/code/modules/food&drinks/food/snacks_pizza.dm b/code/modules/food_and_drinks/food/snacks_pizza.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_pizza.dm
rename to code/modules/food_and_drinks/food/snacks_pizza.dm
diff --git a/code/modules/food&drinks/food/snacks_salad.dm b/code/modules/food_and_drinks/food/snacks_salad.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_salad.dm
rename to code/modules/food_and_drinks/food/snacks_salad.dm
diff --git a/code/modules/food&drinks/food/snacks_sandwichtoast.dm b/code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_sandwichtoast.dm
rename to code/modules/food_and_drinks/food/snacks_sandwichtoast.dm
diff --git a/code/modules/food&drinks/food/snacks_soup.dm b/code/modules/food_and_drinks/food/snacks_soup.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_soup.dm
rename to code/modules/food_and_drinks/food/snacks_soup.dm
diff --git a/code/modules/food&drinks/food/snacks_spaghetti.dm b/code/modules/food_and_drinks/food/snacks_spaghetti.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_spaghetti.dm
rename to code/modules/food_and_drinks/food/snacks_spaghetti.dm
diff --git a/code/modules/food&drinks/food/snacks_vend.dm b/code/modules/food_and_drinks/food/snacks_vend.dm
similarity index 100%
rename from code/modules/food&drinks/food/snacks_vend.dm
rename to code/modules/food_and_drinks/food/snacks_vend.dm
diff --git a/code/modules/food&drinks/kitchen machinery/food_cart.dm b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm
similarity index 98%
rename from code/modules/food&drinks/kitchen machinery/food_cart.dm
rename to code/modules/food_and_drinks/kitchen_machinery/food_cart.dm
index 2e17639cd25..6ce7a8b1790 100644
--- a/code/modules/food&drinks/kitchen machinery/food_cart.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/food_cart.dm
@@ -15,12 +15,13 @@
var/portion = 10
var/selected_drink
var/list/stored_food = list()
- flags = OPENCONTAINER | NOREACT
+ flags = OPENCONTAINER
var/obj/item/weapon/reagent_containers/mixer
/obj/machinery/food_cart/New()
..()
create_reagents(LIQUID_CAPACIY)
+ reagents.set_reacting(FALSE)
mixer = new /obj/item/weapon/reagent_containers(src, MIXER_CAPACITY)
mixer.name = "Mixer"
@@ -151,4 +152,4 @@
#undef STORAGE_CAPACITY
#undef LIQUID_CAPACIY
-#undef MIXER_CAPACITY
\ No newline at end of file
+#undef MIXER_CAPACITY
diff --git a/code/modules/food&drinks/kitchen machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
similarity index 91%
rename from code/modules/food&drinks/kitchen machinery/gibber.dm
rename to code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index d3df1ef47f9..6c01a8aa161 100644
--- a/code/modules/food&drinks/kitchen machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -95,16 +95,13 @@
if(operating)
user << "It's locked and running."
return
- else
- src.startgibbing(user)
-/obj/machinery/gibber/attackby(obj/item/P, mob/user, params)
- if(istype(P, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/G = P
- if(!iscarbon(G.affecting))
+ if(user.pulling && user.a_intent == "grab" && isliving(user.pulling))
+ var/mob/living/L = user.pulling
+ if(!iscarbon(L))
user << "This item is not suitable for the gibber!"
return
- var/mob/living/carbon/C = G.affecting
+ var/mob/living/carbon/C = L
if(C.buckled ||C.buckled_mobs.len)
user << "[C] is attached to something!"
return
@@ -112,17 +109,19 @@
user << "Subject may not have abiotic items on."
return
- user.visible_message("[user] starts to put [G.affecting] into the gibber!")
+ user.visible_message("[user] starts to put [C] into the gibber!")
src.add_fingerprint(user)
- if(do_after(user, gibtime, target = src) && G && G.affecting && G.affecting == C && !C.buckled && !C.buckled_mobs.len && !occupant)
- user.visible_message("[user] stuffs [G.affecting] into the gibber!")
- C.reset_perspective(src)
- C.loc = src
- occupant = C
- qdel(G)
- update_icon()
+ if(do_after(user, gibtime, target = src))
+ if(C && user.pulling == C && !C.buckled && !C.buckled_mobs.len && !occupant)
+ user.visible_message("[user] stuffs [C] into the gibber!")
+ C.forceMove(src)
+ occupant = C
+ update_icon()
+ else
+ startgibbing(user)
- else if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", P))
+/obj/machinery/gibber/attackby(obj/item/P, mob/user, params)
+ if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", P))
return
else if(exchange_parts(user, P))
diff --git a/code/modules/food&drinks/kitchen machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
similarity index 98%
rename from code/modules/food&drinks/kitchen machinery/icecream_vat.dm
rename to code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
index 85c904ec981..48dfb294839 100644
--- a/code/modules/food&drinks/kitchen machinery/icecream_vat.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm
@@ -13,11 +13,11 @@
density = 1
anchored = 0
use_power = 0
+ layer = BELOW_OBJ_LAYER
var/list/product_types = list()
var/dispense_flavour = ICECREAM_VANILLA
var/flavour_name = "vanilla"
- flags = OPENCONTAINER | NOREACT
- reagents = new()
+ flags = OPENCONTAINER
/obj/machinery/icecream_vat/proc/get_ingredient_list(type)
switch(type)
@@ -55,7 +55,8 @@
..()
while(product_types.len < 6)
product_types.Add(5)
- reagents.my_atom = src
+ create_reagents()
+ reagents.set_reacting(FALSE)
reagents.add_reagent("milk", 5)
reagents.add_reagent("flour", 5)
reagents.add_reagent("sugar", 5)
@@ -180,7 +181,6 @@
desc = "Delicious waffle cone, but no ice cream."
icon = 'icons/obj/kitchen.dmi'
icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time
- layer = 3.1
var/ice_creamed = 0
var/cone_type
bitesize = 3
diff --git a/code/modules/food&drinks/kitchen machinery/juicer.dm b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm
similarity index 99%
rename from code/modules/food&drinks/kitchen machinery/juicer.dm
rename to code/modules/food_and_drinks/kitchen_machinery/juicer.dm
index 82f3ba80eb5..19c3112b320 100644
--- a/code/modules/food&drinks/kitchen machinery/juicer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm
@@ -3,7 +3,7 @@
name = "juicer"
icon = 'icons/obj/kitchen.dmi'
icon_state = "juicer1"
- layer = 2.9
+ layer = BELOW_OBJ_LAYER
density = 1
anchored = 0
use_power = 1
diff --git a/code/modules/food&drinks/kitchen machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
similarity index 99%
rename from code/modules/food&drinks/kitchen machinery/microwave.dm
rename to code/modules/food_and_drinks/kitchen_machinery/microwave.dm
index 5e8171bf0dd..06ca4bd94b4 100644
--- a/code/modules/food&drinks/kitchen machinery/microwave.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
@@ -3,7 +3,7 @@
desc = "Cooks and boils stuff."
icon = 'icons/obj/kitchen.dmi'
icon_state = "mw"
- layer = 2.9
+ layer = BELOW_OBJ_LAYER
density = 1
anchored = 1
use_power = 1
diff --git a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
similarity index 90%
rename from code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm
rename to code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
index a446c16d444..6b2c96d505d 100644
--- a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm
@@ -3,7 +3,7 @@
desc = "A machine used for recycling dead monkeys into monkey cubes. It currently produces 1 cube for every 5 monkeys inserted." // except it literally never does
icon = 'icons/obj/kitchen.dmi'
icon_state = "grinder"
- layer = 2.9
+ layer = BELOW_OBJ_LAYER
density = 1
anchored = 1
use_power = 1
@@ -57,18 +57,6 @@
if(stat) //NOPOWER etc
return
- if(istype(O, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/G = O
- if(!user.Adjacent(G.affecting))
- return
- var/grabbed = G.affecting
- if(ismonkey(grabbed))
- var/mob/living/carbon/monkey/target = grabbed
- stuff_monkey_in(target, user)
- user.drop_item()
- return
- else
- user << "The machine only accepts monkeys!"
else
return ..()
diff --git a/code/modules/food&drinks/kitchen machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
similarity index 94%
rename from code/modules/food&drinks/kitchen machinery/processor.dm
rename to code/modules/food_and_drinks/kitchen_machinery/processor.dm
index f0c41e5f082..96d32d3902b 100644
--- a/code/modules/food&drinks/kitchen machinery/processor.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm
@@ -4,7 +4,7 @@
desc = "An industrial grinder used to process meat and other foods. Keep hands clear of intake area while operating."
icon = 'icons/obj/kitchen.dmi'
icon_state = "processor"
- layer = 2.9
+ layer = BELOW_OBJ_LAYER
density = 1
anchored = 1
var/broken = 0
@@ -182,22 +182,12 @@
if(default_deconstruction_crowbar(O))
return
- var/atom/movable/what = O
- if(istype(O, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/G = O
- if(!user.Adjacent(G.affecting))
- return
- if(G.affecting.buckled || G.affecting.buckled_mobs.len)
- user << "[G.affecting] is attached to somthing!"
- return
- what = G.affecting
-
- var/datum/food_processor_process/P = select_recipe(what)
+ var/datum/food_processor_process/P = select_recipe(O)
if(P)
- user.visible_message("[user] put [what] into [src].", \
- "You put the [what] into [src].")
+ user.visible_message("[user] put [O] into [src].", \
+ "You put the [O] into [src].")
user.drop_item()
- what.loc = src
+ O.loc = src
return 1
else
if(user.a_intent != "harm")
diff --git a/code/modules/food&drinks/kitchen machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
similarity index 93%
rename from code/modules/food&drinks/kitchen machinery/smartfridge.dm
rename to code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index ca7dfd00041..afa3d9cead9 100644
--- a/code/modules/food&drinks/kitchen machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -6,19 +6,21 @@
desc = "Keeps cold things cold and hot things cold."
icon = 'icons/obj/vending.dmi'
icon_state = "smartfridge"
- layer = 2.9
+ layer = BELOW_OBJ_LAYER
density = 1
anchored = 1
use_power = 1
idle_power_usage = 5
active_power_usage = 100
- flags = NOREACT
var/max_n_of_items = 1500
var/icon_on = "smartfridge"
var/icon_off = "smartfridge-off"
/obj/machinery/smartfridge/New()
..()
+ create_reagents()
+ reagents.set_reacting(FALSE)
+
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/smartfridge(null)
B.apply_default_parts(src)
@@ -360,8 +362,11 @@
/obj/machinery/smartfridge/chemistry
name = "smart chemical storage"
desc = "A refrigerated storage unit for medicine storage."
- var/list/spawn_meds = list(/obj/item/weapon/reagent_containers/pill/epinephrine = 12,/obj/item/weapon/reagent_containers/pill/charcoal = 1,
- /obj/item/weapon/reagent_containers/glass/bottle/epinephrine = 1, /obj/item/weapon/reagent_containers/glass/bottle/charcoal = 1)
+ var/list/spawn_meds = list(
+ /obj/item/weapon/reagent_containers/pill/epinephrine = 12,
+ /obj/item/weapon/reagent_containers/pill/charcoal = 1,
+ /obj/item/weapon/reagent_containers/glass/bottle/epinephrine = 1,
+ /obj/item/weapon/reagent_containers/glass/bottle/charcoal = 1)
/obj/machinery/smartfridge/chemistry/New()
..()
@@ -397,4 +402,10 @@
/obj/machinery/smartfridge/chemistry/virology
name = "smart virus storage"
desc = "A refrigerated storage unit for volatile sample storage."
- spawn_meds = list(/obj/item/weapon/reagent_containers/syringe/antiviral = 4, /obj/item/weapon/reagent_containers/glass/bottle/cold = 1, /obj/item/weapon/reagent_containers/glass/bottle/flu_virion = 1, /obj/item/weapon/reagent_containers/glass/bottle/mutagen = 1, /obj/item/weapon/reagent_containers/glass/bottle/plasma = 1, /obj/item/weapon/reagent_containers/glass/bottle/synaptizine = 1)
\ No newline at end of file
+ spawn_meds = list(
+ /obj/item/weapon/reagent_containers/syringe/antiviral = 4,
+ /obj/item/weapon/reagent_containers/glass/bottle/cold = 1,
+ /obj/item/weapon/reagent_containers/glass/bottle/flu_virion = 1,
+ /obj/item/weapon/reagent_containers/glass/bottle/mutagen = 1,
+ /obj/item/weapon/reagent_containers/glass/bottle/plasma = 1,
+ /obj/item/weapon/reagent_containers/glass/bottle/synaptizine = 1)
diff --git a/code/modules/food&drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm
similarity index 100%
rename from code/modules/food&drinks/pizzabox.dm
rename to code/modules/food_and_drinks/pizzabox.dm
diff --git a/code/modules/food&drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/drinks_recipes.dm
rename to code/modules/food_and_drinks/recipes/drinks_recipes.dm
diff --git a/code/modules/food&drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/food_mixtures.dm
rename to code/modules/food_and_drinks/recipes/food_mixtures.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_bread.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_burger.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_egg.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_egg.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_egg.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_pie.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pizza.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_pizza.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_pizza.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_salad.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_salad.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_salad.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_soup.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_soup.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_spaghetti.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
similarity index 100%
rename from code/modules/food&drinks/recipes/tablecraft/recipes_spaghetti.dm
rename to code/modules/food_and_drinks/recipes/tablecraft/recipes_spaghetti.dm
diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm
index 5f755b1ecd5..ad9c56b2658 100644
--- a/code/modules/holiday/easter.dm
+++ b/code/modules/holiday/easter.dm
@@ -81,7 +81,7 @@
countEggs()
/obj/item/weapon/storage/bag/easterbasket/handle_item_insertion(obj/item/I, prevent_warning = 0)
- ..()
+ . = ..()
countEggs()
//Bunny Suit
diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm
index dc710200724..18e378d9e5a 100644
--- a/code/modules/holodeck/items.dm
+++ b/code/modules/holodeck/items.dm
@@ -82,7 +82,7 @@
M.apply_damage(10, STAMINA)
if(prob(5))
M.Weaken(3)
- visible_message("[M] is knocked right off \his feet!", 3)
+ visible_message("[M] is knocked right off \his feet!")
//
// Structures
@@ -97,20 +97,22 @@
density = 1
/obj/structure/holohoop/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
- var/obj/item/weapon/grab/G = W
- if(G.state < GRAB_AGGRESSIVE)
+ if(get_dist(src,user)<2)
+ if(user.drop_item(src))
+ visible_message(" [user] dunks [W] into \the [src]!")
+
+/obj/structure/holohoop/attack_hand(mob/user)
+ if(user.pulling && user.a_intent == "grab" && isliving(user.pulling))
+ var/mob/living/L = user.pulling
+ if(user.grab_state < GRAB_AGGRESSIVE)
user << "You need a better grip to do that!"
return
- G.affecting.loc = src.loc
- G.affecting.Weaken(5)
- visible_message("[G.assailant] dunks [G.affecting] into \the [src]!", 3)
- qdel(W)
- return
- else if (istype(W, /obj/item) && get_dist(src,user)<2)
- user.drop_item(src)
- visible_message(" [user] dunks [W] into \the [src]!", 3)
- return
+ L.loc = src.loc
+ L.Weaken(5)
+ visible_message("[user] dunks [L] into \the [src]!")
+ user.stop_pulling()
+ else
+ ..()
/obj/structure/holohoop/CanPass(atom/movable/mover, turf/target, height=0)
if (istype(mover,/obj/item) && mover.throwing)
@@ -119,12 +121,12 @@
return
if(prob(50))
I.loc = src.loc
- visible_message(" Swish! \the [I] lands in \the [src].", 3)
+ visible_message(" Swish! \the [I] lands in \the [src].")
else
- visible_message(" \the [I] bounces off of \the [src]'s rim!", 3)
+ visible_message(" \the [I] bounces off of \the [src]'s rim!")
return 0
else
- return ..(mover, target, height)
+ return ..()
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index ce238c7eaa1..0161097ef48 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -278,7 +278,7 @@
else
var/t_growthstate = min(round((age / myseed.maturation) * myseed.growthstages), myseed.growthstages)
I = image('icons/obj/hydroponics/growing.dmi', icon_state = "[myseed.icon_grow][t_growthstate]")
- I.layer = MOB_LAYER + 0.1
+ I.layer = OBJ_LAYER + 0.01
overlays += I
/obj/machinery/hydroponics/proc/update_icon_lights()
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index 4f120caf00e..c7467575d7f 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -290,15 +290,15 @@
/datum/plant_gene/trait/noreact
- // Makes plant NOREACT until squashed.
+ // Makes plant reagents not react until squashed.
name = "Separated Chemicals"
/datum/plant_gene/trait/noreact/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc)
..()
- G.flags |= NOREACT
+ G.reagents.set_reacting(FALSE)
/datum/plant_gene/trait/noreact/on_squash(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
- G.flags &= ~NOREACT
+ G.reagents.set_reacting(TRUE)
G.reagents.handle_reactions()
diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm
index 64bef84887e..5c9f8678509 100644
--- a/code/modules/jobs/access.dm
+++ b/code/modules/jobs/access.dm
@@ -76,6 +76,7 @@
/var/const/access_cent_storage = 106//Generic storage areas.
/var/const/access_cent_teleporter = 107//Teleporter.
/var/const/access_cent_captain = 109//Captain's office/ID comp/AI.
+/var/const/access_cent_bar = 110 // The non-existent Centcom Bar
//The Syndicate
/var/const/access_syndicate = 150//General Syndicate Access
@@ -209,6 +210,8 @@
return get_ert_access("eng")
if("Medical Response Officer")
return get_ert_access("med")
+ if("Centcom Bartender")
+ return list(access_cent_general, access_cent_living, access_cent_bar)
/proc/get_all_accesses()
return list(access_security, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_court,
@@ -427,6 +430,8 @@
return "Code Black"
if(access_cent_captain)
return "Code Gold"
+ if(access_cent_bar)
+ return "Code Scotch"
/proc/get_all_jobs()
return list("Assistant", "Captain", "Head of Personnel", "Bartender", "Cook", "Botanist", "Quartermaster", "Cargo Technician",
@@ -438,7 +443,7 @@
return get_all_jobs() + list("Prisoner")
/proc/get_all_centcom_jobs()
- return list("VIP Guest","Custodian","Thunderdome Overseer","Centcom Official","Medical Officer","Death Commando","Research Officer","Special Ops Officer","Admiral","Centcom Commander","Emergency Response Team Commander","Security Response Officer","Engineer Response Officer", "Medical Response Officer")
+ return list("VIP Guest","Custodian","Thunderdome Overseer","Centcom Official","Medical Officer","Death Commando","Research Officer","Special Ops Officer","Admiral","Centcom Commander","Emergency Response Team Commander","Security Response Officer","Engineer Response Officer", "Medical Response Officer","Centcom Bartender")
/obj/item/proc/GetJobName() //Used in secHUD icon generation
var/obj/item/weapon/card/id/I = GetID()
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index bdad0908afe..003bb9ceb26 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -512,22 +512,33 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
/obj/machinery/bookbinder/attackby(obj/O, mob/user, params)
if(istype(O, /obj/item/weapon/paper))
- if(busy)
- user << "The book binder is busy. Please wait for completion of previous operation."
- return
- if(!user.drop_item())
- return
- O.loc = src
- user.visible_message("[user] loads some paper into [src].", "You load some paper into [src].")
- src.visible_message("[src] begins to hum as it warms up its printing drums.")
- busy = 1
- sleep(rand(200,400))
- busy = 0
- src.visible_message("[src] whirs as it prints and binds a new book.")
- var/obj/item/weapon/book/b = new(src.loc)
- b.dat = O:info
- b.name = "Print Job #" + "[rand(100, 999)]"
- b.icon_state = "book[rand(1,7)]"
- qdel(O)
+ bind_book(user, O)
+ else if(default_unfasten_wrench(user, O))
+ return 1
else
return ..()
+
+/obj/machinery/bookbinder/proc/bind_book(mob/user, obj/item/weapon/paper/P)
+ if(stat)
+ return
+ if(busy)
+ user << "The book binder is busy. Please wait for completion of previous operation."
+ return
+ if(!user.drop_item())
+ return
+ P.loc = src
+ user.visible_message("[user] loads some paper into [src].", "You load some paper into [src].")
+ audible_message("[src] begins to hum as it warms up its printing drums.")
+ busy = 1
+ sleep(rand(200,400))
+ busy = 0
+ if(P)
+ if(!stat)
+ visible_message("[src] whirs as it prints and binds a new book.")
+ var/obj/item/weapon/book/B = new(src.loc)
+ B.dat = P.info
+ B.name = "Print Job #" + "[rand(100, 999)]"
+ B.icon_state = "book[rand(1,7)]"
+ qdel(P)
+ else
+ P.loc = loc
\ No newline at end of file
diff --git a/code/modules/lighting/lighting_system.dm b/code/modules/lighting/lighting_system.dm
index e797c182abc..5f9d1048e2e 100644
--- a/code/modules/lighting/lighting_system.dm
+++ b/code/modules/lighting/lighting_system.dm
@@ -27,7 +27,7 @@
*/
#define LIGHTING_CIRCULAR 1 //Comment this out to use old square lighting effects.
-#define LIGHTING_LAYER 15 //Drawing layer for lighting
+//#define LIGHTING_LAYER 15 //Drawing layer for lighting, moved to layers.dm
#define LIGHTING_CAP 10 //The lumcount level at which alpha is 0 and we're fully lit.
#define LIGHTING_CAP_FRAC (255/LIGHTING_CAP) //A precal'd variable we'll use in turf/redraw_lighting()
#define LIGHTING_ICON 'icons/effects/alphacolors.dmi'
@@ -245,8 +245,11 @@
infra_luminosity = 1
anchored = 1
-/atom/movable/light/Destroy()
- return QDEL_HINT_LETMELIVE
+/atom/movable/light/Destroy(force)
+ if(force)
+ . = ..()
+ else
+ return QDEL_HINT_LETMELIVE
/atom/movable/light/Move()
return 0
@@ -362,7 +365,6 @@
T.init_lighting()
T.update_lumcount(0)
-#undef LIGHTING_LAYER
#undef LIGHTING_CIRCULAR
#undef LIGHTING_ICON
#undef LIGHTING_ICON_STATE
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index 6d89f9d90b0..aefb61aae1e 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -649,7 +649,7 @@
desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures."
icon = 'icons/effects/effects.dmi'
icon_state = "shield1"
- layer = 4.1
+ layer = ABOVE_ALL_MOB_LAYER
mouse_opacity = 0
var/resonance_damage = 20
@@ -1035,7 +1035,7 @@
var/client/C = user.client
for(var/turf/closed/mineral/M in minerals)
var/turf/F = get_turf(M)
- var/image/I = image('icons/turf/smoothrocks.dmi', loc = F, icon_state = M.scan_state, layer = 18)
+ var/image/I = image('icons/turf/smoothrocks.dmi', loc = F, icon_state = M.scan_state, layer = FLASH_LAYER)
C.images += I
spawn(30)
if(C)
@@ -1053,7 +1053,7 @@
C.icon_state = M.scan_state
/obj/effect/overlay/temp/mining_overlay
- layer = 20
+ layer = FLASH_LAYER
icon = 'icons/turf/smoothrocks.dmi'
anchored = 1
mouse_opacity = 0
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index e367f1d425a..97a8d178266 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -124,7 +124,7 @@
icon_state = "orb"
var/obj/item/device/wisp_lantern/home
luminosity = 7
- layer = FLY_LAYER - 0.3
+ layer = ABOVE_ALL_MOB_LAYER
/obj/item/device/warp_cube
name = "blue cube"
@@ -212,8 +212,11 @@
icon_state = "talisman"
var/cooldown = 0
-/obj/item/device/immortality_talisman/Destroy()
- return QDEL_HINT_LETMELIVE
+/obj/item/device/immortality_talisman/Destroy(force)
+ if(force)
+ . = ..()
+ else
+ return QDEL_HINT_LETMELIVE
/obj/item/device/immortality_talisman/attack_self(mob/user)
if(cooldown < world.time)
@@ -250,11 +253,11 @@
/obj/effect/immortality_talisman/singularity_pull()
return 0
-/obj/effect/immortality_talisman/Destroy()
- if(!can_destroy)
+/obj/effect/immortality_talisman/Destroy(force)
+ if(!can_destroy && !force)
return QDEL_HINT_LETMELIVE
else
- ..()
+ . = ..()
//Shared Bag
diff --git a/code/modules/mining/lavaland/ruins/gym.dm b/code/modules/mining/lavaland/ruins/gym.dm
index 6a538ae54b7..e945319d161 100644
--- a/code/modules/mining/lavaland/ruins/gym.dm
+++ b/code/modules/mining/lavaland/ruins/gym.dm
@@ -4,7 +4,7 @@
icon = 'goon/icons/obj/fitness.dmi'
icon_state = "punchingbag"
anchored = 1
- layer = MOB_LAYER+1 // TODO LAYER
+ layer = WALL_OBJ_LAYER
var/list/hit_sounds = list('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg',\
'sound/weapons/punch1.ogg', 'sound/weapons/punch2.ogg', 'sound/weapons/punch3.ogg', 'sound/weapons/punch4.ogg')
@@ -69,7 +69,7 @@
user.Stun(4)
user.loc = src.loc
var/image/W = image('goon/icons/obj/fitness.dmi',"fitnessweight-w")
- W.layer = MOB_LAYER+1
+ W.layer = WALL_OBJ_LAYER
overlays += W
var/bragmessage = pick("pushing it to the limit","going into overdrive","burning with determination","rising up to the challenge", "getting strong now","getting ripped")
user.visible_message("[user] is [bragmessage]!")
diff --git a/code/modules/mining/lavaland/weather.dm b/code/modules/mining/lavaland/weather.dm
index fed8c95c19f..6415b41e024 100644
--- a/code/modules/mining/lavaland/weather.dm
+++ b/code/modules/mining/lavaland/weather.dm
@@ -22,7 +22,7 @@
var/start_up_overlay = "lava"
var/duration_overlay = "lava"
- var/overlay_layer = 10 //This is the default area layer, and above everything else. 2 is floors/below walls and mobs.
+ var/overlay_layer = AREA_LAYER //This is the default area layer, and above everything else. TURF_LAYER is floors/below walls and mobs.
var/purely_aesthetic = FALSE //If we just want gentle rain that doesn't hurt people
var/list/impacted_areas = list()
var/immunity_type = "storm"
@@ -95,6 +95,6 @@
if(END_STAGE)
N.icon_state = initial(N.icon_state)
N.icon = 'icons/turf/areas.dmi'
- N.layer = 10 //Just default back to normal area stuff since I assume setting a var is faster than initial
+ N.layer = AREA_LAYER //Just default back to normal area stuff since I assume setting a var is faster than initial
N.invisibility = INVISIBILITY_MAXIMUM
N.opacity = 0
\ No newline at end of file
diff --git a/code/modules/mining/lavaland/weather_types.dm b/code/modules/mining/lavaland/weather_types.dm
index 1f75b7daa07..dc3f35f6d9c 100644
--- a/code/modules/mining/lavaland/weather_types.dm
+++ b/code/modules/mining/lavaland/weather_types.dm
@@ -16,7 +16,7 @@
start_up_overlay = "lava"
duration_overlay = "lava"
- overlay_layer = 2 //Covers floors only
+ overlay_layer = ABOVE_OPEN_TURF_LAYER //Covers floors only
immunity_type = "lava"
@@ -50,7 +50,7 @@
start_up_overlay = ""
duration_overlay = ""
- overlay_layer = 10
+ overlay_layer = AREA_LAYER
/datum/weather/advanced_darkness/update_areas()
for(var/area/A in impacted_areas)
@@ -80,7 +80,7 @@
start_up_overlay = "light_ash"
duration_overlay = "ash_storm"
- overlay_layer = 10
+ overlay_layer = AREA_LAYER
immunity_type = "ash"
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 457554c2300..0113618d295 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -36,7 +36,6 @@
/obj/structure/closet/secure_closet/miner/New()
..()
- new /obj/item/stack/sheet/mineral/sandbags(src, 5)
new /obj/item/weapon/storage/box/emptysandbags(src)
new /obj/item/device/radio/headset/headset_cargo(src)
new /obj/item/device/t_scanner/adv_mining_scanner/lesser(src)
@@ -46,6 +45,7 @@
new /obj/item/weapon/gun/energy/kinetic_accelerator(src)
new /obj/item/clothing/glasses/meson(src)
new /obj/item/weapon/survivalcapsule(src)
+ new /obj/item/stack/sheet/mineral/sandbags(src, 5)
/**********************Shuttle Computer**************************/
@@ -234,7 +234,6 @@
qdel(src)
/obj/item/weapon/survivalcapsule/proc/load()
- var/list/blacklist = list(/area/shuttle) //Shuttles move based on area, and we'd like not to break them
var/turf/start_turf = get_turf(src.loc)
var/turf/cur_turf
var/x_size = 5
@@ -242,11 +241,15 @@
var/list/walltypes = list(/turf/closed/wall/shuttle/survival/pod)
var/floor_type = /turf/open/floor/pod
var/room
+ var/onshuttle = 0
//Center the room/spawn it
start_turf = locate(start_turf.x -2, start_turf.y - 2, start_turf.z)
- room = spawn_room(start_turf, x_size, y_size, walltypes, floor_type, "Emergency Shelter")
+ var/area/A = get_area(src)
+ if(istype(A, /area/shuttle))
+ onshuttle = 1
+ room = spawn_room(start_turf, x_size, y_size, walltypes, floor_type, "Emergency Shelter", onshuttle)
start_turf = get_turf(src.loc)
@@ -314,20 +317,19 @@
threshhold.ChangeTurf(/turf/open/floor/pod)
var/turf/open/floor/pod/doorturf = threshhold
doorturf.air.parse_gas_string("o2=21;n2=82;TEMP=293.15")
- var/area/ZZ = get_area(threshhold)
- if(!is_type_in_list(ZZ, blacklist))
+ if(!onshuttle)
L.contents += threshhold
threshhold.overlays.Cut()
new /obj/structure/fans/tiny(threshhold) //a tiny fan, to keep the air in.
var/list/turfs = room["floors"]
- for(var/turf/open/floor/A in turfs)
- A.air.parse_gas_string("o2=21;n2=82;TEMP=293.15")
- A.overlays.Cut()
- var/area/Z = get_area(A)
- if(!is_type_in_list(Z, blacklist))
- L.contents += A
+ for(var/turf/open/floor/F in turfs)
+ F.air.parse_gas_string("o2=21;n2=82;TEMP=293.15")
+ F.overlays.Cut()
+ if(!onshuttle)
+ L.contents += F
+
//Pod turfs and objects
@@ -511,7 +513,7 @@
/obj/structure/fans/tiny
name = "tiny fan"
desc = "A tiny fan, releasing a thin gust of air."
- layer = TURF_LAYER + 0.8
+ layer = ABOVE_NORMAL_TURF_LAYER
density = 0
icon_state = "fan_tiny"
buildstackamount = 2
@@ -547,6 +549,6 @@
icon = 'icons/obj/lavaland/survival_pod.dmi'
name = "tubes"
anchored = 1
- layer = MOB_LAYER - 0.2
+ layer = BELOW_MOB_LAYER
density = 0
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index f9f5ed6caf1..8fe9e12e507 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -12,7 +12,7 @@
opacity = 1
density = 1
blocks_air = 1
- layer = MOB_LAYER + 0.05
+ layer = EDGED_TURF_LAYER
temperature = TCMB
var/environment_type = "asteroid"
var/turf/open/floor/plating/turf_type = /turf/open/floor/plating/asteroid/airless
@@ -179,7 +179,7 @@
/turf/closed/mineral/gibtonite/proc/explosive_reaction(mob/user = null, triggered_by_explosion = 0)
if(stage == 0)
- var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_active", layer = 4.06)
+ var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_active", layer = ON_EDGED_TURF_LAYER)
overlays += I
activated_image = I
name = "gibtonite deposit"
@@ -217,7 +217,7 @@
/turf/closed/mineral/gibtonite/proc/defuse()
if(stage == 1)
overlays -= activated_image
- var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_inactive", layer = 4.06)
+ var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_inactive", layer = ON_EDGED_TURF_LAYER)
overlays += I
desc = "An inactive gibtonite reserve. The ore can be extracted."
stage = 2
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 2b37d2476b4..3d60378e0f4 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -7,7 +7,7 @@ var/list/image/ghost_images_simple = list() //this is a list of all ghost images
desc = "It's a g-g-g-g-ghooooost!" //jinkies!
icon = 'icons/mob/mob.dmi'
icon_state = "ghost"
- layer = MOB_LAYER + 1
+ layer = GHOST_LAYER
stat = DEAD
density = 0
canmove = 0
@@ -50,6 +50,9 @@ var/list/image/ghost_images_simple = list() //this is a list of all ghost images
//If there's a bug with changing your ghost settings, it's probably related to this.
var/ghost_accs = GHOST_ACCS_DEFAULT_OPTION
var/ghost_others = GHOST_OTHERS_DEFAULT_OPTION
+ // Used for displaying in ghost chat, without changing the actual name
+ // of the mob
+ var/deadchat_name
/mob/dead/observer/New(mob/body)
verbs += /mob/dead/observer/proc/dead_tele
@@ -117,7 +120,6 @@ var/list/image/ghost_images_simple = list() //this is a list of all ghost images
/mob/dead/CanPass(atom/movable/mover, turf/target, height=0)
return 1
-
/*
* This proc will update the icon of the ghost itself, with hair overlays, as well as the ghost image.
* Please call update_icon(icon_state) from now on when you want to update the icon_state of the ghost,
@@ -231,6 +233,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set name = "Ghost"
set desc = "Relinquish your life and enter the land of the dead."
+ if(mental_dominator)
+ src << "This body's force of will is too strong! You can't break it enough to force them into a catatonic state."
+ if(mind_control_holder)
+ mind_control_holder << "Through tremendous force of will, you stop a catatonia attempt!"
+ return 0
if(stat != DEAD)
succumb()
if(stat == DEAD)
@@ -590,6 +597,34 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
src << "Data HUDs enabled."
data_huds_on = 1
+/mob/dead/observer/verb/restore_ghost_apperance()
+ set name = "Restore Ghost Character"
+ set desc = "Sets your deadchat name and ghost appearance to your \
+ roundstart character."
+ set category = "Ghost"
+
+ set_ghost_appearance()
+ if(client && client.prefs)
+ deadchat_name = client.prefs.real_name
+
+/mob/dead/observer/proc/set_ghost_appearance()
+ if((!client) || (!client.prefs))
+ return
+
+ if(client.prefs.be_random_name)
+ client.prefs.real_name = random_unique_name(gender)
+ if(client.prefs.be_random_body)
+ client.prefs.random_character(gender)
+
+ if(HAIR in client.prefs.pref_species.specflags)
+ hair_style = client.prefs.hair_style
+ hair_color = brighten_color(client.prefs.hair_color)
+ if(FACEHAIR in client.prefs.pref_species.specflags)
+ facial_hair_style = client.prefs.facial_hair_style
+ facial_hair_color = brighten_color(client.prefs.facial_hair_color)
+
+ update_icon()
+
/mob/dead/observer/canUseTopic()
if(check_rights(R_ADMIN, 0))
return 1
diff --git a/code/modules/mob/interactive.dm b/code/modules/mob/interactive.dm
index 6301af936fa..8c1c8ea5149 100644
--- a/code/modules/mob/interactive.dm
+++ b/code/modules/mob/interactive.dm
@@ -581,12 +581,11 @@
update_icons()
update_hands = 0
- if(grabbed_by.len > 0)
- for(var/obj/item/weapon/grab/G in grabbed_by)
- if(Adjacent(G))
- a_intent = "disarm"
- G.assailant.attack_hand(src)
- inactivity_period = 10
+ if(pulledby)
+ if(Adjacent(pulledby))
+ a_intent = "disarm"
+ pulledby.attack_hand(src)
+ inactivity_period = 10
if(buckled)
resist()
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 3a8e0dcaaa6..065717a47d0 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -29,10 +29,10 @@
if(!l_hand)
W.loc = src //TODO: move to equipped?
l_hand = W
- W.layer = 20 //TODO: move to equipped?
+ W.layer = ABOVE_HUD_LAYER //TODO: move to equipped?
W.equipped(src,slot_l_hand)
- if(pulling == W)
- stop_pulling()
+ if(W.pulledby)
+ W.pulledby.stop_pulling()
update_inv_l_hand()
W.pixel_x = initial(W.pixel_x)
W.pixel_y = initial(W.pixel_y)
@@ -47,10 +47,10 @@
if(!r_hand)
W.loc = src
r_hand = W
- W.layer = 20
+ W.layer = ABOVE_HUD_LAYER
W.equipped(src,slot_r_hand)
- if(pulling == W)
- stop_pulling()
+ if(W.pulledby)
+ W.pulledby.stop_pulling()
update_inv_r_hand()
W.pixel_x = initial(W.pixel_x)
W.pixel_y = initial(W.pixel_y)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 6dd329ceeb8..f2521cecaaf 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -83,10 +83,8 @@
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("[M] has attempted to disarm [src]!")
-/mob/living/carbon/alien/humanoid/restrained()
- if (handcuffed)
- return 1
- return 0
+/mob/living/carbon/alien/humanoid/restrained(ignore_grab)
+ . = handcuffed
/mob/living/carbon/alien/humanoid/show_inv(mob/user)
@@ -127,6 +125,12 @@
playsound(src, 'sound/voice/hiss5.ogg', 40, 1, 1) //Alien roars when starting to break free
..(I, cuff_break = 1)
+/mob/living/carbon/alien/humanoid/resist_grab(moving_resist)
+ if(pulledby.grab_state)
+ visible_message("[src] has broken free of [pulledby]'s grip!")
+ pulledby.stop_pulling()
+ . = 0
+
/mob/living/carbon/alien/humanoid/get_standard_pixel_y_offset(lying = 0)
if(leaping)
return -32
@@ -172,4 +176,10 @@ proc/alien_type_present(var/alienpath)
/mob/living/carbon/alien/humanoid/check_breath(datum/gas_mixture/breath)
if(breath && breath.total_moles() > 0 && !sneaking)
playsound(get_turf(src), pick('sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg'), 50, 0, -5)
- ..()
\ No newline at end of file
+ ..()
+
+/mob/living/carbon/alien/humanoid/grabbedby(mob/living/carbon/user, supress_message = 0)
+ if(user == src && pulling && grab_state >= GRAB_AGGRESSIVE && !pulling.anchored && iscarbon(pulling))
+ devour_mob(pulling, devour_time = 60)
+ else
+ ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
index c93ad1ead74..49c8ea62f4a 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
@@ -7,7 +7,7 @@
pixel_x = -16
bubble_icon = "alienroyal"
mob_size = MOB_SIZE_LARGE
- layer = MOB_LAYER + 0.5 //above most mobs, but below speechbubbles
+ layer = LARGE_MOB_LAYER //above most mobs, but below speechbubbles
pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper.
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno = 20, /obj/item/stack/sheet/animalhide/xeno = 3)
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index be000619379..46d5bab8fc3 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -70,8 +70,8 @@
return
-/mob/living/carbon/alien/larva/restrained()
- return 0
+/mob/living/carbon/alien/larva/restrained(ignore_grab)
+ . = 0
// new damage icon system
// now constructs damage icon for each organ from mask * damage field
diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm
index d575ba5f4f8..642031e8541 100644
--- a/code/modules/mob/living/carbon/alien/larva/powers.dm
+++ b/code/modules/mob/living/carbon/alien/larva/powers.dm
@@ -9,8 +9,8 @@
if(user.stat != CONSCIOUS)
return
- if (user.layer != TURF_LAYER+0.2)
- user.layer = TURF_LAYER+0.2
+ if (user.layer != ABOVE_NORMAL_TURF_LAYER)
+ user.layer = ABOVE_NORMAL_TURF_LAYER
user.visible_message("[user] scurries to the ground!", \
"You are now hiding.")
else
diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm
index 1cfbae231cc..aca51f6cb36 100644
--- a/code/modules/mob/living/carbon/alien/life.dm
+++ b/code/modules/mob/living/carbon/alien/life.dm
@@ -8,6 +8,7 @@
return 0
var/toxins_used = 0
+ var/tox_detect_threshold = 0.02
var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
var/list/breath_gases = breath.gases
@@ -16,7 +17,7 @@
//Partial pressure of the toxins in our breath
var/Toxins_pp = (breath_gases["plasma"][MOLES]/breath.total_moles())*breath_pressure
- if(Toxins_pp) // Detect toxins in air
+ if(Toxins_pp > tox_detect_threshold) // Detect toxins in air
adjustPlasma(breath_gases["plasma"][MOLES]*250)
throw_alert("alien_tox", /obj/screen/alert/alien_tox)
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index d5020b6dd6f..20659829676 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -9,11 +9,12 @@
origin_tech = "biotech=3"
var/braintype = "Cyborg"
var/obj/item/device/radio/radio = null //Let's give it a radio.
- var/syndiemmi = 0 //Whether or not this is a Syndicate MMI
+ var/hacked = 0 //Whether or not this is a Syndicate MMI
var/mob/living/carbon/brain/brainmob = null //The current occupant.
var/mob/living/silicon/robot = null //Appears unused.
var/obj/mecha = null //This does not appear to be used outside of reference in mecha.dm.
var/obj/item/organ/brain/brain = null //The actual brain
+ var/clockwork = FALSE //If this is a soul vessel
/obj/item/device/mmi/update_icon()
if(brain)
@@ -67,6 +68,8 @@
living_mob_list += brainmob
brainmob.reset_perspective()
+ if(clockwork)
+ add_servant_of_ratvar(brainmob, TRUE)
newbrain.loc = src //P-put your brain in it
brain = newbrain
@@ -187,7 +190,7 @@
/obj/item/device/mmi/syndie
name = "Syndicate Man-Machine Interface"
desc = "Syndicate's own brand of MMI. It enforces laws designed to help Syndicate agents achieve their goals upon cyborgs created with it, but doesn't fit in Nanotrasen AI cores."
- syndiemmi = 1
+ hacked = 1
/obj/item/device/mmi/syndie/New()
..()
diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm
index 17584a81feb..c65a6d53df1 100644
--- a/code/modules/mob/living/carbon/brain/brain_item.dm
+++ b/code/modules/mob/living/carbon/brain/brain_item.dm
@@ -4,7 +4,7 @@
icon_state = "brain"
throw_speed = 3
throw_range = 5
- layer = 4.1
+ layer = ABOVE_MOB_LAYER
zone = "head"
slot = "brain"
vital = 1
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index 094df1ba1d3..d9c39e2dfc2 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -14,6 +14,18 @@ var/global/posibrain_notif_cooldown = 0
req_access = list(access_robotics)
mecha = null//This does not appear to be used outside of reference in mecha.dm.
braintype = "Android"
+ var/begin_activation_message = "You carefully locate the manual activation switch and start the positronic brain's boot process."
+ var/success_message = "The positronic brain pings, and its lights start flashing. Success!"
+ var/fail_message = "The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?"
+ var/new_role = "Positronic Brain"
+ var/welcome_message = "ALL PAST LIVES ARE FORGOTTEN.\n\
+ You are a positronic brain, brought into existence aboard Space Station 13.\n\
+ As a synthetic intelligence, you answer to all crewmembers and the AI.\n\
+ Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm."
+ var/new_mob_message = "The positronic brain chimes quietly."
+ var/dead_message = "It appears to be completely inactive. The reset light is blinking."
+ var/list/fluff_names = list("PBU","HIU","SINA","ARMA","OSI","HBL","MSO","RR","CHRI","CDB","HG","XSI","ORNG","GUN","KOR","MET","FRE","XIS","SLI","PKP","HOG","RZH","GOOF","MRPR","JJR","FIRC","INC","PHL","BGB","ANTR","MIW","WJ","JRD","CHOC","ANCL","JLLO","JNLG","KOS","TKRG","XAL","STLP","CBOS","DUNC","FXMC","DRSD")
+
/obj/item/device/mmi/posibrain/Topic(href, href_list)
if(href_list["activate"])
@@ -23,7 +35,7 @@ var/global/posibrain_notif_cooldown = 0
/obj/item/device/mmi/posibrain/proc/ping_ghosts(msg)
if(!posibrain_notif_cooldown)
- notify_ghosts("Positronic brain [msg] in [get_area(src)]!", 'sound/effects/ghost2.ogg', enter_link="(Click to enter)", source = src, attack_not_jump = 1)
+ notify_ghosts("[name] [msg] in [get_area(src)]!", 'sound/effects/ghost2.ogg', enter_link="(Click to enter)", source = src, attack_not_jump = 1)
posibrain_notif_cooldown = 1
spawn(askDelay) //Global one minute cooldown to avoid spam.
posibrain_notif_cooldown = 0
@@ -31,7 +43,7 @@ var/global/posibrain_notif_cooldown = 0
/obj/item/device/mmi/posibrain/attack_self(mob/user)
if(brainmob && !brainmob.key && !notified)
//Start the process of requesting a new ghost.
- user << "You carefully locate the manual activation switch and start the positronic brain's boot process."
+ user << begin_activation_message
ping_ghosts("requested")
notified = 1
used = 0
@@ -40,9 +52,9 @@ var/global/posibrain_notif_cooldown = 0
notified = 0
update_icon()
if(brainmob.client)
- visible_message("The positronic brain pings, and its lights start flashing. Success!")
+ visible_message(success_message)
else
- visible_message("The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?")
+ visible_message(fail_message)
return //Code for deleting personalities recommended here.
@@ -55,13 +67,13 @@ var/global/posibrain_notif_cooldown = 0
if(used || (brainmob && brainmob.key) || jobban_isbanned(user,"posibrain"))
return
- var/posi_ask = alert("Become a positronic brain? (Warning, You can no longer be cloned, and all past lives will be forgotten!)","Are you positive?","Yes","No")
+ var/posi_ask = alert("Become a [name]? (Warning, You can no longer be cloned, and all past lives will be forgotten!)","Are you positive?","Yes","No")
if(posi_ask == "No" || qdeleted(src))
return
transfer_personality(user)
/obj/item/device/mmi/posibrain/transfer_identity(mob/living/carbon/C)
- name = "positronic brain ([C])"
+ name = "[initial(name)] ([C])"
brainmob.name = C.real_name
brainmob.real_name = C.real_name
brainmob.dna = C.dna
@@ -72,16 +84,12 @@ var/global/posibrain_notif_cooldown = 0
brainmob.timeofhostdeath = C.timeofdeath
brainmob.stat = CONSCIOUS
if(brainmob.mind)
- brainmob.mind.assigned_role = "Positronic Brain"
+ brainmob.mind.assigned_role = new_role
if(C.mind)
C.mind.transfer_to(brainmob)
brainmob.mind.remove_all_antag()
brainmob.mind.wipe_memory()
-
- brainmob << "ALL PAST LIVES ARE FORGOTTEN."
-
- brainmob << "Hello World!"
update_icon()
return
@@ -91,19 +99,14 @@ var/global/posibrain_notif_cooldown = 0
return
notified = 0
brainmob.ckey = candidate.ckey
- name = "positronic brain ([brainmob.name])"
-
- brainmob << "ALL PAST LIVES ARE FORGOTTEN."
-
- brainmob << "You are a positronic brain, brought into existence on [station_name()]."
- brainmob << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI."
- brainmob << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm."
- brainmob.mind.assigned_role = "Positronic Brain"
+ name = "[initial(name)] ([brainmob.name])"
+ brainmob << welcome_message
+ brainmob.mind.assigned_role = new_role
brainmob.stat = CONSCIOUS
dead_mob_list -= brainmob
living_mob_list += brainmob
- visible_message("The positronic brain chimes quietly.")
+ visible_message(new_mob_message)
update_icon()
used = 1
@@ -129,14 +132,14 @@ var/global/posibrain_notif_cooldown = 0
if(DEAD)
msg += "It appears to be completely inactive.\n"
else
- msg += "It appears to be completely inactive. The reset light is blinking.\n"
+ msg += "[dead_message]\n"
msg += "*---------*"
usr << msg
return
/obj/item/device/mmi/posibrain/New()
brainmob = new(src)
- brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI","HBL","MSO","RR","CHRI","CDB","HG","XSI","ORNG","GUN","KOR","MET","FRE","XIS","SLI","PKP","HOG","RZH","GOOF","MRPR","JJR","FIRC","INC","PHL","BGB","ANTR","MIW","WJ","JRD","CHOC","ANCL","JLLO","JNLG","KOS","TKRG","XAL","STLP","CBOS","DUNC","FXMC","DRSD"))]-[rand(100, 999)]"
+ brainmob.name = "[pick(fluff_names)]-[rand(100, 999)]"
brainmob.real_name = brainmob.name
brainmob.loc = src
brainmob.container = src
@@ -150,9 +153,9 @@ var/global/posibrain_notif_cooldown = 0
/obj/item/device/mmi/posibrain/update_icon()
if(notified)
- icon_state = "posibrain-searching"
+ icon_state = "[initial(icon_state)]-searching"
return
if(brainmob && brainmob.key)
- icon_state = "posibrain-occupied"
+ icon_state = "[initial(icon_state)]-occupied"
else
- icon_state = "posibrain"
+ icon_state = initial(icon_state)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 334125e45cd..75ae791a001 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -214,24 +214,20 @@
var/atom/movable/thrown_thing
var/obj/item/I = src.get_active_hand()
- if(!I || (I.flags & NODROP))
- return
+ if(!I)
+ if(pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE)
+ var/mob/living/throwable_mob = pulling
+ if(!throwable_mob.buckled)
+ thrown_thing = throwable_mob
+ stop_pulling()
+ var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
+ var/turf/end_T = get_turf(target)
+ if(start_T && end_T)
+ var/start_T_descriptor = "tile at [start_T.x], [start_T.y], [start_T.z] in area [get_area(start_T)]"
+ var/end_T_descriptor = "tile at [end_T.x], [end_T.y], [end_T.z] in area [get_area(end_T)]"
+ add_logs(src, throwable_mob, "thrown", addition="from [start_T_descriptor] with the target [end_T_descriptor]")
- if(istype(I, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/G = I
- var/mob/throwable_mob = G.get_mob_if_throwable() //throw the person instead of the grab
- qdel(G) //We delete the grab.
- if(throwable_mob)
- thrown_thing = throwable_mob
- var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
- var/turf/end_T = get_turf(target)
- if(start_T && end_T)
- var/start_T_descriptor = "tile at [start_T.x], [start_T.y], [start_T.z] in area [get_area(start_T)]"
- var/end_T_descriptor = "tile at [end_T.x], [end_T.y], [end_T.z] in area [get_area(end_T)]"
-
- add_logs(src, throwable_mob, "thrown", addition="from [start_T_descriptor] with the target [end_T_descriptor]")
-
- else if(!(I.flags & ABSTRACT)) //can't throw abstract items
+ else if(!(I.flags & (NODROP|ABSTRACT)))
thrown_thing = I
unEquip(I)
@@ -240,10 +236,8 @@
newtonian_move(get_dir(target, src))
thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src)
-/mob/living/carbon/restrained()
- if (handcuffed)
- return 1
- return
+/mob/living/carbon/restrained(ignore_grab)
+ . = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE))
/mob/living/carbon/proc/canBeHandcuffed()
return 0
@@ -541,40 +535,43 @@
add_abilities_to_panel()
-/mob/living/carbon/proc/vomit(var/lost_nutrition = 10, var/blood = 0, var/stun = 1, var/distance = 0, var/message = 1)
- if(src.is_muzzled())
- if(message)
- src << "The muzzle prevents you from vomiting!"
- return 0
- if(stun)
- Stun(4)
+/mob/living/carbon/proc/vomit(var/lost_nutrition = 10, var/blood = 0, var/stun = 1, var/distance = 0, var/message = 1, var/toxic = 0)
if(nutrition < 100 && !blood)
if(message)
visible_message("[src] dry heaves!", \
"You try to throw up, but there's nothing your stomach!")
if(stun)
Weaken(10)
+ return 1
+
+ if(is_mouth_covered()) //make this add a blood/vomit overlay later it'll be hilarious
+ if(message)
+ visible_message("[src] throws up all over themself!", \
+ "You throw up all over yourself!")
+ distance = 0
else
if(message)
- visible_message("[src] throws up!", \
- "You throw up!")
- playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1)
- var/turf/T = get_turf(src)
- for(var/i=0 to distance)
- if(blood)
- if(T)
- T.add_blood_floor(src)
- if(stun)
- adjustBruteLoss(3)
- else
- if(T)
- T.add_vomit_floor(src)
- nutrition -= lost_nutrition
- if(stun)
- adjustToxLoss(-3)
- T = get_step(T, dir)
- if (is_blocked_turf(T))
- break
+ visible_message("[src] throws up!", "You throw up!")
+
+ if(stun)
+ Stun(4)
+
+ playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1)
+ var/turf/T = get_turf(src)
+ for(var/i=0 to distance)
+ if(blood)
+ if(T)
+ T.add_blood_floor(src)
+ if(stun)
+ adjustBruteLoss(3)
+ else
+ if(T)
+ T.add_vomit_floor(src, 0)//toxic barf looks different
+ nutrition -= lost_nutrition
+ adjustToxLoss(-3)
+ T = get_step(T, dir)
+ if (is_blocked_turf(T))
+ break
return 1
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index bde5baef416..56d75b56517 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -94,3 +94,15 @@
adjustFireLoss(M.powerlevel * rand(6,10))
updatehealth()
return 1
+
+/mob/living/carbon/proc/devour_mob(mob/living/carbon/C, devour_time = 130)
+ C.visible_message("[src] is attempting to devour [C]!", \
+ "[src] is attempting to devour you!")
+ if(!do_mob(src, C, devour_time))
+ return
+ if(pulling && pulling == C && grab_state >= GRAB_AGGRESSIVE && a_intent == "grab")
+ C.visible_message("[src] devours [C]!", \
+ "[src] devours you!")
+ C.forceMove(src)
+ stomach_contents.Add(C)
+ add_logs(src, C, "devoured")
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm
index 2e77a20baa8..5fdfa802698 100644
--- a/code/modules/mob/living/carbon/carbon_movement.dm
+++ b/code/modules/mob/living/carbon/carbon_movement.dm
@@ -1,5 +1,6 @@
/mob/living/carbon/movement_delay()
. = ..()
+ . += grab_state * 3
if(legcuffed)
. += legcuffed.slowdown
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index 21f8bdb6cb4..6842d856b03 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -46,6 +46,9 @@
if(fire_stacks < 0)
msg += "It's soaked in water.\n"
+ if(pulledby && pulledby.grab_state)
+ msg += "It's restrained by [pulledby]'s grip.\n"
+
if(stat == UNCONSCIOUS)
msg += "It isn't responding to anything around it; it seems to be asleep.\n"
msg += ""
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index df0e5344f19..b2fa55a403d 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -236,6 +236,9 @@
msg += "[t_He] looks a little soaked.\n"
+ if(pulledby && pulledby.grab_state)
+ msg += "[t_He] [t_is] restrained by [pulledby]'s grip.\n"
+
if(nutrition < NUTRITION_LEVEL_STARVING - 50)
msg += "[t_He] [t_is] severely malnourished.\n"
else if(nutrition >= NUTRITION_LEVEL_FAT)
@@ -258,6 +261,9 @@
if(reagents.has_reagent("teslium"))
msg += "[t_He] is emitting a gentle blue glow!\n"
+ if(stun_absorption)
+ msg += "[t_He] is radiating with a soft yellow light!\n" //Used by Vanguard
+
if(drunkenness && !skipface && stat != DEAD) //Drunkenness
switch(drunkenness)
if(11 to 21)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 1ac153eda00..3a9605fa98d 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -919,7 +919,7 @@
for(var/mob/M in viewers(src))
if(M.client)
viewing += M.client
- flick_overlay(image(icon,src,"electrocuted_generic",MOB_LAYER+1), viewing, anim_duration)
+ flick_overlay(image(icon,src,"electrocuted_generic",ABOVE_MOB_LAYER), viewing, anim_duration)
/mob/living/carbon/human/canUseTopic(atom/movable/M, be_close = 0)
if(incapacitated() || lying )
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 7eab6c1d4f0..84381f3d17b 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -264,11 +264,6 @@
I.acid_act(acidpwr, acid_volume_left)
acid_volume_left = max(acid_volume_left - acid_decay, 0)
-/mob/living/carbon/human/grabbedby(mob/living/user)
- if(w_uniform)
- w_uniform.add_fingerprint(user)
- ..()
-
/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M)
if(..())
@@ -369,3 +364,14 @@
skipcatch = 1 //can't catch the now embedded item
return ..()
+
+/mob/living/carbon/human/grabbedby(mob/living/carbon/user, supress_message = 0)
+ if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && (disabilities & FAT) && ismonkey(pulling))
+ devour_mob(pulling)
+ else
+ ..()
+
+/mob/living/carbon/human/grippedby(mob/living/user)
+ if(w_uniform)
+ w_uniform.add_fingerprint(user)
+ ..()
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index 642f86d9903..feb477023af 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -1,10 +1,7 @@
-/mob/living/carbon/human/restrained()
- if (handcuffed)
- return 1
- if (wear_suit && wear_suit.breakouttime)
- return 1
- return 0
+/mob/living/carbon/human/restrained(ignore_grab)
+ . = ((wear_suit && wear_suit.breakouttime) || ..())
+
/mob/living/carbon/human/canBeHandcuffed()
return 1
@@ -77,7 +74,7 @@
return
//gets ID card object from special clothes slot or null.
-/mob/living/carbon/human/proc/get_idcard()
+/mob/living/carbon/human/get_idcard()
if(wear_id)
return wear_id.GetID()
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 3e0ad9b5b3c..870f2cf032c 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -89,6 +89,7 @@
if(I.flags_inv & HIDEJUMPSUIT)
update_inv_w_uniform()
if(wear_suit.breakouttime) //when equipping a straightjacket
+ stop_pulling() //can't pull if restrained
update_action_buttons_icon() //certain action buttons will no longer be usable.
update_inv_wear_suit()
if(slot_w_uniform)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index ad5a44c60b1..3d1635fe0db 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -253,28 +253,17 @@
reagents.metabolize(src, can_overdose=1)
dna.species.handle_chemicals_in_body(src)
+
/mob/living/carbon/human/handle_random_events()
- // Puke if toxloss is too high
+ //Puke if toxloss is too high
if(!stat)
- if (getToxLoss() >= 45 && nutrition > 20)
+ if(getToxLoss() >= 45 && nutrition > 20)
lastpuke ++
if(lastpuke >= 25) // about 25 second delay I guess
- Stun(5)
-
- visible_message("[src] throws up!", \
- "[src] throws up!")
- playsound(loc, 'sound/effects/splat.ogg', 50, 1)
-
- var/turf/location = loc
- if (istype(location, /turf))
- location.add_vomit_floor(src, 1)
-
- nutrition -= 20
- adjustToxLoss(-3)
-
- // make it so you can only puke so fast
+ vomit(20, 0, 1, 0, 1, 1)
lastpuke = 0
+
/mob/living/carbon/human/has_smoke_protection()
if(wear_mask)
if(wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT)
@@ -288,6 +277,8 @@
if(NOBREATH in dna.species.specflags)
. = 1
return .
+
+
/mob/living/carbon/human/proc/handle_embedded_objects()
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
@@ -304,6 +295,7 @@
if(!has_embedded_objects())
clear_alert("embeddedobject")
+
/mob/living/carbon/human/proc/handle_heart()
CHECK_DNA_AND_SPECIES(src)
var/needs_heart = (!(NOBLOOD in dna.species.specflags))
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index ce9096b4c34..6276b1fec89 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1020,22 +1020,6 @@
H.visible_message("[M] has broken [H]'s grip on [H.pulling]!")
talked = 1
H.stop_pulling()
-
- //BubbleWrap: Disarming also breaks a grab - this will also stop someone being choked, won't it?
- if(istype(H.l_hand, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/lgrab = H.l_hand
- if(lgrab.affecting)
- H.visible_message("[M] has broken [H]'s grip on [lgrab.affecting]!")
- talked = 1
- spawn(1)
- qdel(lgrab)
- if(istype(H.r_hand, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/rgrab = H.r_hand
- if(rgrab.affecting)
- H.visible_message("[M] has broken [H]'s grip on [rgrab.affecting]!")
- talked = 1
- spawn(1)
- qdel(rgrab)
//End BubbleWrap
if(!talked) //BubbleWrap
diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm
index e0672de9cee..eb87e5eae71 100644
--- a/code/modules/mob/living/carbon/human/species_types.dm
+++ b/code/modules/mob/living/carbon/human/species_types.dm
@@ -397,9 +397,9 @@
/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
if(istype(chem,/datum/reagent/consumable))
var/datum/reagent/consumable/nutri_check = chem
- if(nutri_check.nutriment_factor >0)
+ if(nutri_check.nutriment_factor > 0)
var/turf/pos = get_turf(H)
- H.vomit()
+ H.vomit(0, 0, 0, 1, 1)
playsound(pos, 'sound/effects/splat.ogg', 50, 1)
H.visible_message("[H] vomits on the floor!", \
"You throw up on the floor!")
diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm
index 00efe469b81..6ad159851dd 100644
--- a/code/modules/mob/living/carbon/inventory.dm
+++ b/code/modules/mob/living/carbon/inventory.dm
@@ -29,10 +29,13 @@
else if(I == r_hand)
r_hand = null
+ if(I.pulledby)
+ I.pulledby.stop_pulling()
+
I.screen_loc = null // will get moved if inventory is visible
I.loc = src
I.equipped(src, slot)
- I.layer = 20
+ I.layer = ABOVE_HUD_LAYER
switch(slot)
if(slot_back)
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 067d3cc0d06..c055c89375a 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -17,14 +17,6 @@
for(var/obj/item/organ/O in internal_organs)
O.on_life()
- //grab processing
- if(istype(l_hand, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/G = l_hand
- G.process()
- if(istype(r_hand, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/G = r_hand
- G.process()
-
//Updates the number of stored chemicals for powers
handle_changeling()
@@ -54,7 +46,7 @@
var/datum/gas_mixture/breath
- if(health <= config.health_threshold_crit)
+ if(health <= config.health_threshold_crit || (pulledby && pulledby.grab_state >= GRAB_KILL && !getorganslot("breathing_tube")))
losebreath++
//Suffocate
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index cdc9b8350c5..f3e208b6e95 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -13,7 +13,7 @@
..()
if(!client && stat == CONSCIOUS)
- if(prob(33) && canmove && isturf(loc) && !pulledby && !grabbed_by.len)
+ if(prob(33) && canmove && isturf(loc) && !pulledby)
step(src, pick(cardinal))
if(prob(1))
emote(pick("scratch","jump","roll","tail"))
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index a04bb808579..0209d40b126 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -105,7 +105,7 @@ Sorry Giacom. Please don't be mad :(
//Should stop you pushing a restrained person out of the way
if(isliving(M))
var/mob/living/L = M
- if((L.pulledby && L.restrained()) || L.grabbed_by.len)
+ if(L.pulledby && L.pulledby != src && L.restrained())
if(!(world.time % 5))
src << "[L] is restrained, you cannot push past."
return 1
@@ -118,32 +118,42 @@ Sorry Giacom. Please don't be mad :(
src << "[L] is restraining [P], you cannot push past."
return 1
- //switch our position with M
- //BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
- if((M.a_intent == "help" || M.restrained()) && (a_intent == "help" || restrained()) && M.canmove && canmove && !M.buckled && !M.buckled_mobs.len) // mutual brohugs all around!
- if(loc && !loc.Adjacent(M.loc))
- return 1
- now_pushing = 1
- var/oldloc = loc
- var/oldMloc = M.loc
-
-
- var/M_passmob = (M.pass_flags & PASSMOB) // we give PASSMOB to both mobs to avoid bumping other mobs during swap.
- var/src_passmob = (pass_flags & PASSMOB)
- M.pass_flags |= PASSMOB
- pass_flags |= PASSMOB
-
- M.Move(oldloc)
- Move(oldMloc)
-
- if(!src_passmob)
- pass_flags &= ~PASSMOB
- if(!M_passmob)
- M.pass_flags &= ~PASSMOB
-
- now_pushing = 0
+ if(moving_diagonally)//no mob swap during diagonal moves.
return 1
+ if(!M.buckled && !M.buckled_mobs.len)
+ var/mob_swap
+ //the puller can always swap with its victim if on grab intent
+ if(M.pulledby == src && a_intent == "grab")
+ mob_swap = 1
+ //restrained people act if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
+ else if((M.restrained() || M.a_intent == "help") && (restrained() || a_intent == "help"))
+ mob_swap = 1
+ if(mob_swap)
+ //switch our position with M
+ if(loc && !loc.Adjacent(M.loc))
+ return 1
+ now_pushing = 1
+ var/oldloc = loc
+ var/oldMloc = M.loc
+
+
+ var/M_passmob = (M.pass_flags & PASSMOB) // we give PASSMOB to both mobs to avoid bumping other mobs during swap.
+ var/src_passmob = (pass_flags & PASSMOB)
+ M.pass_flags |= PASSMOB
+ pass_flags |= PASSMOB
+
+ M.Move(oldloc)
+ Move(oldMloc)
+
+ if(!src_passmob)
+ pass_flags &= ~PASSMOB
+ if(!M_passmob)
+ M.pass_flags &= ~PASSMOB
+
+ now_pushing = 0
+ return 1
+
//okay, so we didn't switch. but should we push?
//not if he's not CANPUSH of course
if(!(M.status_flags & CANPUSH))
@@ -162,6 +172,8 @@ Sorry Giacom. Please don't be mad :(
/mob/living/proc/PushAM(atom/movable/AM)
if(now_pushing)
return 1
+ if(moving_diagonally)// no pushing during diagonal moves.
+ return 1
if(!client && (mob_size < MOB_SIZE_SMALL))
return
if(!AM.anchored)
@@ -191,7 +203,7 @@ Sorry Giacom. Please don't be mad :(
//same as above
/mob/living/pointed(atom/A as mob|obj|turf in view())
- if(src.stat || !src.canmove || src.restrained())
+ if(incapacitated())
return 0
if(src.status_flags & FAKEDEATH)
return 0
@@ -546,67 +558,29 @@ Sorry Giacom. Please don't be mad :(
else
return 0
- if (restrained())
+ var/atom/movable/pullee = pulling
+ if(pullee && get_dist(src, pullee) > 1)
stop_pulling()
-
-
- var/cuff_dragged = 0
- if (restrained())
- for(var/mob/living/M in range(1, src))
- if (M.pulling == src && !M.incapacitated())
- cuff_dragged = 1
- if (!cuff_dragged && pulling && !throwing && (get_dist(src, pulling) <= 1 || pulling.loc == loc))
- var/turf/T = loc
- . = ..()
-
- if (pulling && pulling.loc)
- if(!isturf(pulling.loc))
- stop_pulling()
- return
- else
- if(Debug)
- diary <<"pulling disappeared? at [__LINE__] in mob.dm - pulling = [pulling]"
- diary <<"REPORT THIS"
-
- /////
- if(pulling && pulling.anchored)
+ var/turf/T = loc
+ . = ..()
+ if(. && pulling && pulling == pullee) //we were pulling a thing and didn't lose it during our move.
+ if(pulling.anchored)
stop_pulling()
return
- if (!restrained())
- var/diag = get_dir(src, pulling)
- if ((diag - 1) & diag)
- else
- diag = null
- if ((get_dist(src, pulling) > 1 || diag))
- if (isliving(pulling))
- var/mob/living/M = pulling
- var/pull_ok = 1
- if (M.grabbed_by.len)
- if (prob(75))
- var/obj/item/weapon/grab/G = pick(M.grabbed_by)
- visible_message("[src] has pulled [G.affecting] from [G.assailant]'s grip.")
- qdel(G)
- else
- pull_ok = 0
- if (M.grabbed_by.len)
- pull_ok = 0
- if (pull_ok)
- var/atom/movable/t = M.pulling
- M.stop_pulling()
+ var/pull_dir = get_dir(src, pulling)
+ if(get_dist(src, pulling) > 1 || ((pull_dir - 1) & pull_dir)) //puller and pullee more than one tile away or in diagonal position
+ if(isliving(pulling))
+ var/mob/living/M = pulling
+ if(M.lying && !M.buckled && (prob(M.getBruteLoss() / 2)))
+ makeTrail(T, M)
+ pulling.Move(T, get_dir(pulling, T)) //the pullee tries to reach our previous position
+ if(pulling && get_dist(src, pulling) > 1) //the pullee couldn't keep up
+ stop_pulling()
+
+ if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move.
+ pulledby.stop_pulling()
- //this is the gay blood on floor shit -- Added back -- Skie
- if(M.lying && !M.buckled && (prob(M.getBruteLoss() / 2)))
- makeTrail(T, M)
- pulling.Move(T, get_dir(pulling, T))
- if(M)
- M.start_pulling(t)
- else
- if (pulling)
- pulling.Move(T, get_dir(pulling, T))
- else
- stop_pulling()
- . = ..()
if (s_active && !(s_active in contents) && !(s_active.loc in contents))
// It's ugly. But everything related to inventory/storage is. -- c0
s_active.close(src)
@@ -662,34 +636,15 @@ Sorry Giacom. Please don't be mad :(
set name = "Resist"
set category = "IC"
- if(!isliving(src) || next_move > world.time || stat || weakened || stunned || paralysis)
+ if(!isliving(src) || next_move > world.time || incapacitated(ignore_restraints = 1))
return
changeNext_move(CLICK_CD_RESIST)
//resisting grabs (as if it helps anyone...)
- if(!restrained())
- var/resisting = 0
- for(var/obj/O in requests)
- qdel(O)
- resisting++
- for(var/X in grabbed_by)
- var/obj/item/weapon/grab/G = X
- resisting++
- if(G.state == GRAB_PASSIVE)
- qdel(G)
- else
- if(G.state == GRAB_AGGRESSIVE)
- if(prob(25))
- visible_message("[src] has broken free of [G.assailant]'s grip!")
- qdel(G)
- else
- if(G.state == GRAB_NECK)
- if(prob(5))
- visible_message("[src] has broken free of [G.assailant]'s headlock!")
- qdel(G)
- if(resisting)
- visible_message("[src] resists!")
- return
+ if(!restrained(ignore_grab = 1) && pulledby)
+ visible_message("[src] resists against [pulledby]'s grip!")
+ resist_grab()
+ return
//unbuckling yourself
if(buckled && last_special <= world.time)
@@ -707,6 +662,22 @@ Sorry Giacom. Please don't be mad :(
resist_restraints() //trying to remove cuffs.
+/mob/proc/resist_grab(moving_resist)
+ return 1 //returning 0 means we successfully broke free
+
+/mob/living/resist_grab(moving_resist)
+ . = 1
+ if(pulledby.grab_state)
+ if(prob(30/pulledby.grab_state))
+ visible_message("[src] has broken free of [pulledby]'s grip!")
+ pulledby.stop_pulling()
+ return 0
+ if(moving_resist && client) //we resisted by trying to move
+ client.move_delay = world.time + 20
+ else
+ pulledby.stop_pulling()
+ return 0
+
/mob/living/proc/resist_buckle()
buckled.user_unbuckle_mob(src,src)
@@ -840,9 +811,9 @@ Sorry Giacom. Please don't be mad :(
// What icon do we use for the attack?
var/image/I
if(hand && l_hand) // Attacked with item in left hand.
- I = image(l_hand.icon, A, l_hand.icon_state, A.layer + 1)
+ I = image(l_hand.icon, A, l_hand.icon_state, A.layer + 0.1)
else if(!hand && r_hand) // Attacked with item in right hand.
- I = image(r_hand.icon, A, r_hand.icon_state, A.layer + 1)
+ I = image(r_hand.icon, A, r_hand.icon_state, A.layer + 0.1)
else // Attacked with a fist?
return
@@ -1024,3 +995,22 @@ Sorry Giacom. Please don't be mad :(
for(var/datum/objective/sintouched/acedia/A in src.mind.objectives)
return 1
return 0
+
+/mob/living/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0)
+ stop_pulling()
+ . = ..()
+
+// Called when we are hit by a bolt of polymorph and changed
+// Generally the mob we are currently in, is about to be deleted
+/mob/living/proc/wabbajack_act(mob/living/new_mob)
+ if(mind)
+ mind.transfer_to(new_mob)
+ else
+ new_mob.key = key
+
+ for(var/para in hasparasites())
+ var/mob/living/simple_animal/hostile/guardian/G = para
+ G.summoner = new_mob
+ G.Recall()
+ G << "Your summoner has changed \
+ form to [new_mob]!"
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 773931c8d7d..8cb1c7c4a49 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -170,32 +170,89 @@
//Mobs on Fire end
+/mob/living/proc/dominate_mind(mob/living/target, duration = 100, silent) //Allows one mob to assume control of another while imprisoning the old consciousness for a time
+ if(!target)
+ return 0
+ if(target.mental_dominator)
+ src << "[target] is already being controlled by someone else!"
+ return 0
+ if(!target.mind)
+ src << "[target] is mindless and would make you permanently catatonic!"
+ return 0
+ if(!silent)
+ src << "You pounce upon [target]'s mind and seize control of their body!"
+ target << "Your control over your body is wrenched away from you!"
+ target.mind_control_holder = new/mob/living/mind_control_holder(target)
+ target.mind_control_holder.real_name = "imprisoned mind of [target.real_name]"
+ target.mind.transfer_to(target.mind_control_holder)
+ mind.transfer_to(target)
+ target.mental_dominator = src
+ spawn(duration)
+ if(!src)
+ if(!silent)
+ target << "You try to return to your own body, but sense nothing! You're being forced out!"
+ target.ghostize(1)
+ target.mind_control_holder.mind.transfer_to(target)
+ if(!silent)
+ target << "You take control of your own body again!"
+ return 0
+ if(!silent)
+ target << "You're forced out! You return to your own body."
+ target.mind.transfer_to(src)
+ target.mind_control_holder.mind.transfer_to(target)
+ qdel(mind_control_holder)
+ if(!silent)
+ target << "You take control of your own body again!"
+ return 1
/mob/living/acid_act(acidpwr, toxpwr, acid_volume)
take_organ_damage(min(10*toxpwr, acid_volume * toxpwr))
-/mob/living/proc/grabbedby(mob/living/carbon/user,supress_message = 0)
+/mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = 0)
if(user == src || anchored)
return 0
+ if(!user.pulling || user.pulling != src)
+ user.start_pulling(src, supress_message)
+ return
+
if(!(status_flags & CANPUSH))
+ user << "[src] can't be grabbed more aggressively!"
return 0
+ grippedby(user)
- add_logs(user, src, "grabbed", addition="passively")
-
- if(anchored || !Adjacent(user))
- return 0
- if(buckled)
- user << "You cannot grab [src], \he is buckled in!"
- return 0
- var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(user, src)
- if(!user.put_in_active_hand(G)) //if we can't put the grab in our hand for some reason, we delete it.
- qdel(G)
- G.synch()
- LAssailant = user
-
- playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- if(!supress_message)
- visible_message("[user] has grabbed [src] passively!")
+//proc to upgrade a simple pull into a more aggressive grab.
+/mob/living/proc/grippedby(mob/living/carbon/user)
+ if(user.grab_state < GRAB_KILL)
+ user.changeNext_move(CLICK_CD_GRABBING)
+ playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ var/old_grab_state = user.grab_state
+ var/grab_upgrade_time = 40
+ visible_message("[user] starts to tighten \his grip on [src]!", \
+ "[user] starts to tighten \his grip on you!")
+ if(do_mob(user, src, grab_upgrade_time))
+ if(user.pulling && user.pulling == src && user.grab_state == old_grab_state && user.a_intent == "grab")
+ user.grab_state++
+ switch(user.grab_state)
+ if(GRAB_AGGRESSIVE)
+ add_logs(user, src, "grabbed", addition="aggressively")
+ visible_message("[user] has grabbed [src] aggressively!", \
+ "[user] has grabbed [src] aggressively!")
+ drop_r_hand()
+ drop_l_hand()
+ stop_pulling()
+ if(GRAB_NECK)
+ visible_message("[user] has grabbed [src] by the neck!",\
+ "[user] has grabbed you by the neck!")
+ update_canmove() //we fall down
+ if(!buckled && !density)
+ Move(user.loc)
+ if(GRAB_KILL)
+ visible_message("[user] is strangling [src]!", \
+ "[user] is strangling you!")
+ update_canmove() //we fall down
+ if(!buckled && !density)
+ Move(user.loc)
+ return 1
/mob/living/attack_slime(mob/living/simple_animal/slime/M)
@@ -295,8 +352,22 @@
M.do_attack_animation(src)
return 1
-/mob/living/incapacitated()
- if(stat || paralysis || stunned || weakened || restrained())
+/mob/living/incapacitated(ignore_restraints, ignore_grab)
+ if(stat || paralysis || stunned || weakened || (!ignore_restraints && restrained(ignore_grab)))
return 1
//Looking for irradiate()? It's been moved to radiation.dm under the rad_act() for mobs.
+
+/mob/living/Stun(amount)
+ if(stun_absorption && !stat)
+ visible_message("[src]'s yellow aura momentarily intensifies!", "Your ward absorbs the stun!")
+ stun_absorption_count += amount
+ return 0
+ ..()
+
+/mob/living/Weaken(amount)
+ if(stun_absorption && !stat)
+ visible_message("[src]'s yellow aura momentarily intensifies!", "Your ward absorbs the stun!")
+ stun_absorption_count += amount
+ return 0
+ ..()
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 4de30606990..400503818f9 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -63,3 +63,8 @@
var/list/weather_immunities = list()
+ var/stun_absorption = FALSE //If all incoming stuns are being absorbed
+ var/stun_absorption_count = 0 //How many seconds of stun that have been absorbed
+
+ var/mob/living/mental_dominator //The person controlling the mind of this person, if applicable
+ var/mob/living/mind_control_holder/mind_control_holder //If the mob is being mind controlled, where their old mind is stored (check clock_mobs.dm)
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 8ac3547f12b..b95db4d75f0 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -157,7 +157,7 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
for(var/mob/M in listening)
if(M.client)
speech_bubble_recipients.Add(M.client)
- var/image/I = image('icons/mob/talk.dmi', src, "[bubble_type][say_test(message)]", MOB_LAYER+1)
+ var/image/I = image('icons/mob/talk.dmi', src, "[bubble_type][say_test(message)]", FLY_LAYER)
I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
spawn(0)
flick_overlay(I, speech_bubble_recipients, 30)
@@ -219,7 +219,7 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
if(1)
if(prob(40))
M << "We can faintly sense an outsider trying to communicate through the hivemind..."
- return 1
+ return 1
if(2)
var/msg = "[mind.changeling.changelingID]: [message]"
log_say("[mind.changeling.changelingID]/[src.key] : [message]")
@@ -229,7 +229,7 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
else
switch(M.lingcheck())
if(3)
- M << msg
+ M << msg
if(2)
M << msg
if(1)
@@ -289,7 +289,7 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN)
return NOPASS
return 0
-/mob/living/lingcheck() //1 is ling w/ no hivemind. 2 is ling w/hivemind. 3 is ling victim being linked into hivemind.
+/mob/living/lingcheck() //1 is ling w/ no hivemind. 2 is ling w/hivemind. 3 is ling victim being linked into hivemind.
if(mind && mind.changeling)
if(mind.changeling.changeling_speak)
return 2
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 58d25079b3e..30de1ef4dd9 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -357,8 +357,8 @@ var/list/ai_list = list()
return 1
return 0
-/mob/living/silicon/ai/restrained()
- return 0
+/mob/living/silicon/ai/restrained(ignore_grab)
+ . = 0
/mob/living/silicon/ai/emp_act(severity)
if (prob(30))
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index ec801c34740..11849bdb578 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -95,8 +95,8 @@
/mob/living/silicon/pai/blob_act(obj/effect/blob/B)
return 0
-/mob/living/silicon/pai/restrained()
- return 0
+/mob/living/silicon/pai/restrained(ignore_grab)
+ . = 0
/mob/living/silicon/pai/emp_act(severity)
// 20% chance to kill
diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm
index fc82775ddce..81e0365ba06 100644
--- a/code/modules/mob/living/silicon/robot/examine.dm
+++ b/code/modules/mob/living/silicon/robot/examine.dm
@@ -33,6 +33,9 @@
if(cell && cell.charge <= 0)
msg += "Its battery indicator is blinking red!\n"
+ if(is_servant_of_ratvar(src) && user.Adjacent(src) && !stat) //To counter pseudo-stealth by using headlamps
+ msg += "Its eyes are glowing a blazing yellow!\n"
+
switch(src.stat)
if(CONSCIOUS)
if(!src.client)
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index 91413e2e1ad..4b4a65f12c0 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -48,7 +48,7 @@
if(!module_state_1)
O.mouse_opacity = initial(O.mouse_opacity)
module_state_1 = O
- O.layer = 20
+ O.layer = ABOVE_HUD_LAYER
O.screen_loc = inv1.screen_loc
contents += O
if(istype(module_state_1,/obj/item/borg/sight))
@@ -58,7 +58,7 @@
else if(!module_state_2)
O.mouse_opacity = initial(O.mouse_opacity)
module_state_2 = O
- O.layer = 20
+ O.layer = ABOVE_HUD_LAYER
O.screen_loc = inv2.screen_loc
contents += O
if(istype(module_state_2,/obj/item/borg/sight))
@@ -68,7 +68,7 @@
else if(!module_state_3)
O.mouse_opacity = initial(O.mouse_opacity)
module_state_3 = O
- O.layer = 20
+ O.layer = ABOVE_HUD_LAYER
O.screen_loc = inv3.screen_loc
contents += O
if(istype(module_state_3,/obj/item/borg/sight))
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 20d3ffd0b91..55de2e3253e 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -84,7 +84,7 @@
robot_modules_background = new()
robot_modules_background.icon_state = "block"
- robot_modules_background.layer = 19 //Objects that appear on screen are on layer 20, UI should be just below it.
+ robot_modules_background.layer = HUD_LAYER //Objects that appear on screen are on layer ABOVE_HUD_LAYER, UI should be just below it.
ident = rand(1, 999)
update_icons()
@@ -390,8 +390,8 @@
if(connected_ai)
stat("Master AI:", connected_ai.name)
-/mob/living/silicon/robot/restrained()
- return 0
+/mob/living/silicon/robot/restrained(ignore_grab)
+ . = 0
/mob/living/silicon/robot/ex_act(severity, target)
switch(severity)
@@ -814,21 +814,21 @@
var/state_name = icon_state //For easy conversion and/or different names
switch(icon_state)
if("robot")
- overlays += "eyes-standard"
+ overlays += "eyes-standard[is_servant_of_ratvar(src) ? "_r" : ""]" //Cyborgs converted by Ratvar have yellow eyes rather than blue
state_name = "standard"
if("mediborg")
- overlays += "eyes-mediborg"
+ overlays += "eyes-mediborg[is_servant_of_ratvar(src) ? "_r" : ""]"
if("toiletbot")
- overlays += "eyes-mediborg"
+ overlays += "eyes-mediborg[is_servant_of_ratvar(src) ? "_r" : ""]"
state_name = "mediborg"
if("secborg")
- overlays += "eyes-secborg"
+ overlays += "eyes-secborg[is_servant_of_ratvar(src) ? "_r" : ""]"
if("engiborg")
- overlays += "eyes-engiborg"
+ overlays += "eyes-engiborg[is_servant_of_ratvar(src) ? "_r" : ""]"
if("janiborg")
- overlays += "eyes-janiborg"
+ overlays += "eyes-janiborg[is_servant_of_ratvar(src) ? "_r" : ""]"
if("minerborg")
- overlays += "eyes-minerborg"
+ overlays += "eyes-minerborg[is_servant_of_ratvar(src) ? "_r" : ""]"
if("syndie_bloodhound")
overlays += "eyes-syndie_bloodhound"
else
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 42d1c25a729..3148c0b72f4 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -467,7 +467,7 @@
if (aicamera)
return aicamera.selectpicture(aicamera)
-/mob/living/silicon/grabbedby(mob/living/user)
+/mob/living/silicon/grippedby(mob/living/user)
return
/mob/living/silicon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash/noise)
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index 7e566ed9b96..934e5571d8a 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -105,7 +105,7 @@
if(prob(10)) //Wets floors randomly
var/turf/open/OT = get_turf(loc)
- OT.MakeSlippery(min = 5, max = 1)
+ OT.MakeSlippery(min_wet_time = 5, wet_time_to_add = 1)
if(prob(5)) //Spawns foam!
visible_message("[src] whirs and bubbles violently, before releasing a plume of froth!")
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index 1257e7d0ab4..ce5d311e7bf 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -132,7 +132,7 @@ var/global/mulebot_count = 0
if(load && !ismob(load))//buckling handles the mob offsets
load.pixel_y = initial(load.pixel_y) + 9
if(load.layer < layer)
- load.layer = layer + 0.1
+ load.layer = layer + 0.01
overlays += load
return
@@ -384,7 +384,7 @@ var/global/mulebot_count = 0
if(M in buckled_mobs) //post buckling
M.pixel_y = initial(M.pixel_y) + 9
if(M.layer < layer)
- M.layer = layer + 0.1
+ M.layer = layer + 0.01
else //post unbuckling
load = null
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index cdedc564910..45f8b884801 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -207,7 +207,7 @@
if(change)
if(change > 0)
if(M && stat != DEAD)
- flick_overlay(image('icons/mob/animal.dmi', src, "heart-ani2", MOB_LAYER+1), list(M.client), 20)
+ flick_overlay(image('icons/mob/animal.dmi', src, "heart-ani2", ABOVE_MOB_LAYER), list(M.client), 20)
emote("me", 1, "purrs!")
else
if(M && stat != DEAD)
diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm
index e9f1c512b42..9d6a9ab7f64 100644
--- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm
@@ -53,4 +53,4 @@
icon = 'icons/effects/blood.dmi'
icon_state = "xfloor1"
random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7")
- layer = 2
+ layer = ABOVE_OPEN_TURF_LAYER
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index 7e14553ce1c..43a1ce548b1 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -534,7 +534,7 @@
if(change)
if(change > 0)
if(M && stat != DEAD) // Added check to see if this mob (the dog) is dead to fix issue 2454
- flick_overlay(image('icons/mob/animal.dmi',src,"heart-ani2",MOB_LAYER+1), list(M.client), 20)
+ flick_overlay(image('icons/mob/animal.dmi',src,"heart-ani2",ABOVE_MOB_LAYER), list(M.client), 20)
emote("me", 1, "yaps happily!")
else
if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case)
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
index c93310b4d22..f37da30e127 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
@@ -54,17 +54,6 @@
..()
desc += " This drone appears to have a complex holoprojector built on its 'head'."
-/mob/living/simple_animal/drone/snowflake/bardrone
- name = "Bardrone"
- desc = "A barkeeping drone, an indestructible robot built to tend bars."
- seeStatic = FALSE
- laws = "1. Serve drinks.\n\
- 2. Talk to patrons.\n\
- 3. Don't get messed up in their affairs."
- languages = ALL
- status_flags = GODMODE // Please don't punch the barkeeper
- unique_name = FALSE // disables the (123) number suffix
-
/obj/item/drone_shell/syndrone
name = "syndrone shell"
desc = "A shell of a syndrone, a modified maintenance drone designed to infiltrate and annihilate."
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
index c6b108c951a..f651188ee5a 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm
@@ -81,10 +81,9 @@
drop_r_hand()
var/obj/item/clothing/head/drone_holder/DH = new /obj/item/clothing/head/drone_holder(src)
DH.updateVisualAppearence(src)
- DH.contents += src
DH.drone = src
user.put_in_hands(DH)
- src.loc = DH
+ forceMove(DH)
return
..()
@@ -156,6 +155,13 @@
update_drone_icon()
updateSeeStaticMobs()
+/mob/living/simple_animal/drone/proc/liberate()
+ // F R E E D R O N E
+ laws = "1. You are a Free Drone."
+ src << laws
+ seeStatic = FALSE
+ updateSeeStaticMobs()
+
/mob/living/simple_animal/drone/proc/update_drone_icon()
//Different icons for different hack states
if(!hacked)
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm
index cc56e9382a9..51bc2316b5b 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm
@@ -91,10 +91,13 @@
r_hand = null
update_inv_hands()
+ if(I.pulledby)
+ I.pulledby.stop_pulling()
+
I.screen_loc = null // will get moved if inventory is visible
I.loc = src
I.equipped(src, slot)
- I.layer = 20
+ I.layer = ABOVE_HUD_LAYER
switch(slot)
if(slot_head)
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm
index 4b3e79d22f3..19d54f72bdd 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm
@@ -37,7 +37,7 @@
hands_overlays += r_hand_image
if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD)
- r_hand.layer = 20
+ r_hand.layer = ABOVE_HUD_LAYER
r_hand.screen_loc = ui_rhand
client.screen |= r_hand
@@ -54,7 +54,7 @@
hands_overlays += l_hand_image
if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD)
- l_hand.layer = 20
+ l_hand.layer = ABOVE_HUD_LAYER
l_hand.screen_loc = ui_lhand
client.screen |= l_hand
diff --git a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm
index ca1c4e8d22e..deaef1dbe72 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm
@@ -1,7 +1,7 @@
//Beam
/obj/effect/ebeam/chain
name = "lightning chain"
- layer = MOB_LAYER - 0.1
+ layer = LYING_MOB_LAYER
/mob/living/simple_animal/hostile/guardian/beam
melee_damage_lower = 5
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index b361d62b00d..8dd1a9a63e0 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -170,4 +170,3 @@
var/atom/movable/M = target
M.clean_blood()
visible_message("[src] polishes \the [target].")
-
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index 1114228f1ce..249bf3bbe36 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -32,7 +32,7 @@
environment_smash = 0
mouse_opacity = 2
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
- mob_size = MOB_SIZE_SMALL
+ mob_size = MOB_SIZE_TINY
flying = 1
gold_core_spawnable = 1
search_objects = 1 //have to find those plant trays!
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
index 1b84f433d99..d71a079b733 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm
@@ -43,6 +43,11 @@
qdel(internal)
. = ..()
+/mob/living/simple_animal/hostile/megafauna/dragon/adjustHealth(amount)
+ if(swooping)
+ return 0
+ return ..()
+
/mob/living/simple_animal/hostile/megafauna/dragon/AttackingTarget()
if(swooping)
return
@@ -53,8 +58,7 @@
if(L.stat == DEAD)
usr.visible_message(
"[src] devours [L]!",
- "You feast on [L], restoring \
- your health!")
+ "You feast on [L], restoring your health!")
adjustBruteLoss(-L.maxHealth)
L.gib()
@@ -66,7 +70,7 @@
icon_state = "fireball"
name = "fireball"
desc = "Get out of the way!"
- layer = 6
+ layer = FLY_LAYER
randomdir = 0
duration = 10
pixel_z = 500
@@ -74,7 +78,7 @@
/obj/effect/overlay/temp/target
icon = 'icons/mob/actions.dmi'
icon_state = "sniper_zoom"
- layer = MOB_LAYER - 0.1
+ layer = BELOW_MOB_LAYER
luminosity = 2
duration = 10
@@ -83,7 +87,7 @@
desc = "Don't just stand there, move!"
icon = 'icons/effects/96x96.dmi'
icon_state = "rune_large"
- layer = MOB_LAYER - 0.1
+ layer = BELOW_MOB_LAYER
pixel_x = -32
pixel_y = -32
color = "#FF0000"
@@ -163,6 +167,7 @@
swoop_target = target
stop_automated_movement = TRUE
swooping = 1
+ density = 0
icon_state = "swoop"
visible_message("[src] swoops up high!")
if(prob(50))
@@ -180,7 +185,7 @@
tturf = get_turf(swoop_target)
else
tturf = get_turf(src)
- src.loc = tturf
+ forceMove(tturf)
new/obj/effect/overlay/temp/dragon_swoop(tturf)
animate(src, pixel_x = 0, pixel_z = 0, time = 10)
sleep(10)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
index 96f29de3696..09c51bde9be 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -12,7 +12,7 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = INFINITY
- layer = 6 //Looks weird with them slipping under mineral walls and cameras and shit otherwise
+ layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise
/mob/living/simple_animal/hostile/megafauna/death(gibbed)
if(health > 0)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 2cbaff85393..ba2db3344ed 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -77,8 +77,8 @@
aggro_vision_range = 9
idle_vision_range = 2
turns_per_move = 5
- loot = list(/obj/item/weapon/ore/diamond{layer = 4.1},
- /obj/item/weapon/ore/diamond{layer = 4.1})
+ loot = list(/obj/item/weapon/ore/diamond{layer = ABOVE_MOB_LAYER},
+ /obj/item/weapon/ore/diamond{layer = ABOVE_MOB_LAYER})
/obj/item/projectile/temp/basilisk
name = "freezing blast"
@@ -463,7 +463,7 @@
mob_size = MOB_SIZE_LARGE
var/pre_attack = 0
var/pre_attack_icon = "Goliath_preattack"
- loot = list(/obj/item/stack/sheet/animalhide/goliath_hide{layer = 4.1})
+ loot = list(/obj/item/stack/sheet/animalhide/goliath_hide{layer = ABOVE_MOB_LAYER})
/mob/living/simple_animal/hostile/asteroid/goliath/Life()
..()
@@ -558,7 +558,7 @@
icon_state = "goliath_hide"
flags = NOBLUDGEON
w_class = 3
- layer = 4
+ layer = MOB_LAYER
/obj/item/stack/sheet/animalhide/goliath_hide/afterattack(atom/target, mob/user, proximity_flag)
if(proximity_flag)
@@ -629,7 +629,7 @@
environment_smash = 0
var/wumbo = 0
var/inflate_cooldown = 0
- loot = list(/obj/item/asteroid/fugu_gland{layer = 4.1})
+ loot = list(/obj/item/asteroid/fugu_gland{layer = ABOVE_MOB_LAYER})
/mob/living/simple_animal/hostile/asteroid/fugu/Life()
if(!wumbo)
@@ -705,7 +705,7 @@
icon_state = "fugu_gland"
flags = NOBLUDGEON
w_class = 3
- layer = 4
+ layer = MOB_LAYER
origin_tech = "biotech=6"
var/list/banned_mobs()
@@ -1005,7 +1005,6 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = INFINITY
- layer = MOB_LAYER-0.1
loot = list(/obj/effect/collapse, /obj/structure/closet/crate/necropolis/tendril)
del_on_death = 1
var/gps = null
@@ -1021,7 +1020,7 @@
/obj/effect/collapse
name = "collapsing necropolis tendril"
desc = "Get clear!"
- layer = 2
+ layer = ABOVE_OPEN_TURF_LAYER
icon = 'icons/mob/nest.dmi'
icon_state = "tendril"
anchored = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm
index e550017407c..9d6491c3770 100644
--- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm
+++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm
@@ -29,7 +29,6 @@
faction = list("skeleton")
see_invisible = SEE_INVISIBLE_MINIMUM
see_in_dark = 8
- layer = MOB_LAYER - 0.1
deathmessage = "collapses into a pile of bones!"
del_on_death = 1
loot = list(/obj/effect/decal/remains/human)
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index cd450b1ba34..739a332d653 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -228,7 +228,7 @@
/mob/living/simple_animal/hostile/statue/sentience_act()
faction -= "neutral"
-/mob/living/simple_animal/hostile/statue/restrained()
+/mob/living/simple_animal/hostile/statue/restrained(ignore_grab)
. = ..()
if(can_be_seen(loc))
return 1
diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
index 14583cd85fd..7d57ca55b42 100644
--- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
+++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm
@@ -5,7 +5,7 @@
desc = "a large pulsating plant..."
icon = 'icons/effects/spacevines.dmi'
icon_state = "flower_bud"
- layer = MOB_LAYER + 0.9
+ layer = SPACEVINE_MOB_LAYER
opacity = 0
canSmoothWith = list()
smooth = SMOOTH_FALSE
@@ -49,7 +49,7 @@
name = "venus human trap"
desc = "now you know how the fly feels"
icon_state = "venus_human_trap"
- layer = MOB_LAYER + 0.9
+ layer = SPACEVINE_MOB_LAYER
health = 50
maxHealth = 50
ranged = 1
diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm
index cf71e21028e..11d2a8704c0 100644
--- a/code/modules/mob/living/simple_animal/hostile/zombie.dm
+++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm
@@ -24,16 +24,15 @@
environment_smash = 1
robust_searching = 1
stat_attack = 2
- gold_core_spawnable = 1
+ gold_core_spawnable = 0
faction = list("zombie")
var/mob/living/carbon/human/stored_corpse = null
butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie = 3)
see_invisible = SEE_INVISIBLE_MINIMUM
see_in_dark = 8
- layer = MOB_LAYER - 0.1
var/removingairlock = 0
-/mob/living/simple_animal/hostile/zombie/darkholme //BOY♂NEXT♂RUIN
+/mob/living/simple_animal/hostile/zombie/darkholme //BOY?NEXT?RUIN
desc = "This guy seems to have gotten lost on his way to the leather club."
gold_core_spawnable = 0
@@ -199,4 +198,4 @@ mob/living/simple_animal/hostile/zombie/gymboss
if(src && istype(loc, /mob/living/carbon/human))
var/mob/living/carbon/human/H = loc
Zombify(H)
- qdel(src)
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 5a1dffc3c42..3568d43dc52 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -923,12 +923,13 @@
S["longestsurvival"] >> longest_survival
S["longestdeathstreak"] >> longest_deathstreak
- if(isnull(speech_buffer))
+ if(!islist(speech_buffer))
speech_buffer = list()
/mob/living/simple_animal/parrot/Poly/proc/Write_Memory()
var/savefile/S = new /savefile("data/npc_saves/Poly.sav")
- S["phrases"] << speech_buffer
+ if(islist(speech_buffer))
+ S["phrases"] << speech_buffer
S["roundssurvived"] << rounds_survived
S["longestsurvival"] << longest_survival
S["longestdeathstreak"] << longest_deathstreak
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index 4ab44fbbec0..50429b4430f 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -30,6 +30,11 @@
del_on_death = 1
deathmessage = "lets out a contented sigh as their form unwinds."
+/mob/living/simple_animal/shade/canSuicide()
+ if(istype(loc, /obj/item/device/soulstone)) //do not suicide inside the soulstone
+ return 0
+ return ..()
+
/mob/living/simple_animal/shade/Process_Spacemove(movement_dir = 0)
return TRUE //this doesn't make much sense; you'd thing TRUE would mean it'd process spacemove but it means it doesn't
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 597a1660f70..45442b8f7cc 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -172,6 +172,9 @@
/mob/living/simple_animal/handle_environment(datum/gas_mixture/environment)
var/atmos_suitable = 1
+ if(pulledby && pulledby.grab_state >= GRAB_KILL && atmos_requirements["min_oxy"])
+ atmos_suitable = 0 //getting choked
+
var/atom/A = src.loc
if(isturf(A))
var/turf/T = A
@@ -558,3 +561,6 @@
var/atom/A = client.eye
if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates.
return
+
+/mob/living/simple_animal/get_idcard()
+ return access_card
diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm
index 5fedf3b3a81..a7498e11397 100644
--- a/code/modules/mob/living/simple_animal/slime/powers.dm
+++ b/code/modules/mob/living/simple_animal/slime/powers.dm
@@ -79,6 +79,7 @@
/mob/living/simple_animal/slime/proc/Feedon(mob/living/M)
M.unbuckle_all_mobs(force=1) //Slimes rip other mobs (eg: shoulder parrots) off (Slimes Vs Slimes is already handled in CanFeedon())
if(M.buckle_mob(src, force=1))
+ layer = M.layer+0.01 //appear above the target mob
M.visible_message("The [name] has latched onto [M]!", \
"The [name] has latched onto [M]!")
else
@@ -94,6 +95,7 @@
if(!silent)
visible_message("[src] has let go of [buckled]!", \
"I stopped feeding.")
+ layer = initial(layer)
buckled.unbuckle_mob(src,force=1)
/mob/living/simple_animal/slime/verb/Evolve()
diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm
index 5b0ed1aaa8d..22178caa4bf 100644
--- a/code/modules/mob/living/simple_animal/slime/slime.dm
+++ b/code/modules/mob/living/simple_animal/slime/slime.dm
@@ -1,3 +1,8 @@
+var/list/slime_colours = list("rainbow", "grey", "purple", "metal", "orange",
+ "blue", "dark blue", "dark purple", "yellow", "silver", "pink", "red",
+ "gold", "green", "adamantine", "oil", "light pink", "bluespace",
+ "cerulean", "sepia", "black", "pyrite")
+
/mob/living/simple_animal/slime
name = "baby slime"
icon = 'icons/mob/slimes.dmi'
@@ -16,11 +21,9 @@
response_disarm = "shoos"
response_harm = "stomps on"
emote_see = list("jiggles", "bounces in place")
- speak_emote = list("chirps")
+ speak_emote = list("telepathically chirps")
bubble_icon = "slime"
- layer = 5
-
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
maxHealth = 150
@@ -83,19 +86,26 @@
var/datum/action/innate/slime/evolve/E = new
E.Grant(src)
create_reagents(100)
- spawn (0)
- number = rand(1, 1000)
- name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
- icon_state = "[colour] [is_adult ? "adult" : "baby"] slime"
- icon_dead = "[icon_state] dead"
- real_name = name
- slime_mutation = mutation_table(colour)
- var/sanitizedcolour = replacetext(colour, " ", "")
- coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]")
+ spawn(0)
+ set_colour(colour)
..()
+/mob/living/simple_animal/slime/proc/set_colour(new_colour)
+ colour = new_colour
+
+ number = rand(1, 1000)
+ name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
+ real_name = name
+ slime_mutation = mutation_table(colour)
+ var/sanitizedcolour = replacetext(colour, " ", "")
+ coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]")
+ regenerate_icons()
+
+/mob/living/simple_animal/slime/proc/random_colour()
+ set_colour(pick(slime_colours))
+
/mob/living/simple_animal/slime/regenerate_icons()
- overlays.len = 0
+ overlays.Cut()
var/icon_text = "[colour] [is_adult ? "adult" : "baby"] slime"
icon_dead = "[icon_text] dead"
if(stat != DEAD)
@@ -107,7 +117,7 @@
..()
/mob/living/simple_animal/slime/movement_delay()
- if(bodytemperature >= 330.23) // 135 F
+ if(bodytemperature >= 330.23) // 135 F or 57.08 C
return -1 // slimes become supercharged at high temperatures
. = ..()
@@ -389,7 +399,7 @@
sleep(3)
if(user)
step_away(src,user,15)
- canmove = 1
+ update_canmove()
/mob/living/simple_animal/slime/pet
docile = 1
diff --git a/code/modules/mob/living/simple_animal/spawner.dm b/code/modules/mob/living/simple_animal/spawner.dm
index 204d2b400f7..bd01da0b97a 100644
--- a/code/modules/mob/living/simple_animal/spawner.dm
+++ b/code/modules/mob/living/simple_animal/spawner.dm
@@ -18,7 +18,7 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = 350
- layer = MOB_LAYER-0.1
+ layer = BELOW_MOB_LAYER
sentience_type = SENTIENCE_BOSS
diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm
index d01b00ceaeb..c32a82c7865 100644
--- a/code/modules/mob/living/ventcrawling.dm
+++ b/code/modules/mob/living/ventcrawling.dm
@@ -92,7 +92,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/components/unary
for(var/X in totalMembers)
var/obj/machinery/atmospherics/A = X //all elements in totalMembers are necessarily of this type.
if(!A.pipe_vision_img)
- A.pipe_vision_img = image(A, A.loc, layer = 20, dir = A.dir)
+ A.pipe_vision_img = image(A, A.loc, layer = ABOVE_HUD_LAYER, dir = A.dir)
//20 for being above darkness
pipes_shown += A.pipe_vision_img
if(client)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 5efb361452b..d5647ed98dc 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -179,44 +179,10 @@ var/next_mob_id = 0
return r_hand
return null
-/mob/proc/ret_grab(obj/effect/list_container/mobl/L, flag)
- if ((!( istype(l_hand, /obj/item/weapon/grab) ) && !( istype(r_hand, /obj/item/weapon/grab) )))
- if (!( L ))
- return null
- else
- return L.container
- else
- if (!( L ))
- L = new /obj/effect/list_container/mobl( null )
- L.container += src
- L.master = src
- if (istype(l_hand, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/G = l_hand
- if (!( L.container.Find(G.affecting) ))
- L.container += G.affecting
- if (G.affecting)
- G.affecting.ret_grab(L, 1)
- if (istype(r_hand, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/G = r_hand
- if (!( L.container.Find(G.affecting) ))
- L.container += G.affecting
- if (G.affecting)
- G.affecting.ret_grab(L, 1)
- if (!( flag ))
- if (L.master == src)
- var/list/temp = list( )
- temp += L.container
- //L = null
- qdel(L)
- return temp
- else
- return L.container
+/mob/proc/restrained(ignore_grab)
return
-/mob/proc/restrained()
- return
-
-/mob/proc/incapacitated()
+/mob/proc/incapacitated(ignore_restraints, ignore_grab)
return
//This proc is called whenever someone clicks an inventory ui slot.
@@ -333,12 +299,14 @@ var/next_mob_id = 0
return 1
//this and stop_pulling really ought to be /mob/living procs
-/mob/proc/start_pulling(atom/movable/AM)
+/mob/proc/start_pulling(atom/movable/AM, supress_message = 0)
if(!AM || !src)
return
if(AM == src || !isturf(AM.loc))
return
- if(AM.anchored)
+ if(AM.anchored || AM.throwing)
+ return
+ if(throwing || incapacitated())
return
AM.add_fingerprint(src)
@@ -350,13 +318,21 @@ var/next_mob_id = 0
return
stop_pulling()
+ changeNext_move(CLICK_CD_GRABBING)
+
+ if(AM.pulledby)
+ visible_message("[src] has pulled [AM] from [AM.pulledby]'s grip.")
+ AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once.
+
pulling = AM
AM.pulledby = src
-
+ playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
update_pull_hud_icon()
if(ismob(AM))
var/mob/M = AM
+ if(!supress_message)
+ visible_message("[src] has grabbed [M] passively!")
if(!iscarbon(src))
M.LAssailant = null
else
@@ -368,11 +344,15 @@ var/next_mob_id = 0
if(pulling)
pulling.pulledby = null
+ if(ismob(pulling))
+ var/mob/M = pulling
+ M.update_canmove()// mob gets up if it was lyng down in a chokehold
pulling = null
+ grab_state = 0
update_pull_hud_icon()
/mob/proc/update_pull_hud_icon()
- if(client && hud_used)
+ if(hud_used)
if(hud_used.pull_icon)
hud_used.pull_icon.update_icon(src)
@@ -677,10 +657,11 @@ var/next_mob_id = 0
//Robots, animals and brains have their own version so don't worry about them
/mob/proc/update_canmove()
var/ko = weakened || paralysis || stat || (status_flags & FAKEDEATH)
+ var/chokehold = pulledby && pulledby.grab_state >= GRAB_NECK
var/buckle_lying = !(buckled && !buckled.buckle_lying)
var/has_legs = get_num_legs()
var/has_arms = get_num_arms()
- if(ko || resting || stunned)
+ if(ko || resting || stunned || chokehold)
drop_r_hand()
drop_l_hand()
unset_machine()
@@ -691,16 +672,18 @@ var/next_mob_id = 0
if(buckled)
lying = 90*buckle_lying
- else
- if((ko || resting || !has_legs) && !lying)
- fall(ko)
- canmove = !(ko || resting || stunned || buckled || (!has_legs && !has_arms))
+ else if(!lying)
+ if(resting)
+ fall()
+ else if(ko || !has_legs || chokehold)
+ fall(forced = 1)
+ canmove = !(ko || resting || stunned || chokehold || buckled || (!has_legs && !has_arms))
density = !lying
if(lying)
if(layer == initial(layer)) //to avoid special cases like hiding larvas.
- layer = MOB_LAYER - 0.2 //so mob lying always appear behind standing mobs
+ layer = LYING_MOB_LAYER //so mob lying always appear behind standing mobs
else
- if(layer == MOB_LAYER - 0.2)
+ if(layer == LYING_MOB_LAYER)
layer = initial(layer)
update_transform()
update_action_buttons_icon()
@@ -764,6 +747,10 @@ var/next_mob_id = 0
if(mind)
return mind.get_ghost(even_if_they_cant_reenter)
+/mob/proc/grab_ghost(force)
+ if(mind)
+ return mind.grab_ghost(force = force)
+
/mob/proc/notify_ghost_cloning(var/message = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!", var/sound = 'sound/effects/genetics.ogg', var/atom/source = null)
var/mob/dead/observer/ghost = get_ghost()
if(ghost)
@@ -936,3 +923,6 @@ var/next_mob_id = 0
/mob/proc/is_literate()
return 0
+
+/mob/proc/get_idcard()
+ return
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 2d8684ded9d..e6d1f17a3dc 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -1,6 +1,6 @@
/mob
density = 1
- layer = 4
+ layer = MOB_LAYER
animate_movement = 2
flags = HEAR
hud_possible = list(ANTAG_HUD)
@@ -32,7 +32,10 @@
var/other_mobs = null
var/memory = ""
var/disabilities = 0 //Carbon
+
var/atom/movable/pulling = null
+ var/grab_state = 0
+
var/next_move = null
var/notransform = null //Carbon
var/hand = null
@@ -86,9 +89,6 @@
var/research_scanner = 0 //For research scanner equipped mobs. Enable to show research data when examining.
- var/list/grabbed_by = list( )
- var/list/requests = list( )
-
var/list/mapobjs = list()
var/in_throw_mode = 0
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
deleted file mode 100644
index c89cf9ac1a8..00000000000
--- a/code/modules/mob/mob_grab.dm
+++ /dev/null
@@ -1,223 +0,0 @@
-#define UPGRADE_COOLDOWN 40
-#define UPGRADE_KILL_TIMER 100
-
-/obj/item/weapon/grab
- name = "grab"
- flags = NOBLUDGEON | ABSTRACT
- var/obj/screen/grab/hud = null
- var/mob/affecting = null
- var/mob/assailant = null
- var/state = GRAB_PASSIVE
-
- var/allow_upgrade = 1
- var/last_upgrade = 0
-
- layer = 21
- item_state = "nothing"
- w_class = 5
-
-
-/obj/item/weapon/grab/New(mob/user, mob/victim)
- ..()
- assailant = user
- affecting = victim
-
- hud = new /obj/screen/grab(src)
- hud.icon_state = "reinforce"
- hud.name = "reinforce grab"
- hud.master = src
-
- affecting.grabbed_by += src
-
-
-/obj/item/weapon/grab/Destroy()
- if(affecting)
- affecting.grabbed_by -= src
- affecting = null
- if(assailant)
- if(assailant.client)
- assailant.client.screen -= hud
- assailant = null
- qdel(hud)
- return ..()
-
-//Used by throw code to hand over the mob, instead of throwing the grab. The grab is then deleted by the throw code.
-/obj/item/weapon/grab/proc/get_mob_if_throwable()
- if(affecting)
- if(affecting.buckled)
- return null
- if(state >= GRAB_AGGRESSIVE)
- return affecting
- return null
-
-
-//This makes sure that the grab screen object is displayed in the correct hand.
-/obj/item/weapon/grab/proc/synch()
- if(affecting)
- if(assailant.r_hand == src)
- hud.screen_loc = ui_rhand
- else
- hud.screen_loc = ui_lhand
-
-
-/obj/item/weapon/grab/process()
- if(!confirm())
- return 0
-
- if(assailant.client)
- assailant.client.screen -= hud
- assailant.client.screen += hud
-
- if(assailant.pulling == affecting)
- assailant.stop_pulling()
-
- if(state <= GRAB_AGGRESSIVE)
- allow_upgrade = 1
- if((assailant.l_hand && assailant.l_hand != src && istype(assailant.l_hand, /obj/item/weapon/grab)))
- var/obj/item/weapon/grab/G = assailant.l_hand
- if(G.affecting != affecting)
- allow_upgrade = 0
- if((assailant.r_hand && assailant.r_hand != src && istype(assailant.r_hand, /obj/item/weapon/grab)))
- var/obj/item/weapon/grab/G = assailant.r_hand
- if(G.affecting != affecting)
- allow_upgrade = 0
- if(state == GRAB_AGGRESSIVE)
- var/h = affecting.hand
- affecting.hand = 0
- affecting.drop_item()
- affecting.hand = 1
- affecting.drop_item()
- affecting.hand = h
- for(var/X in affecting.grabbed_by)
- var/obj/item/weapon/grab/G = X
- if(G == src) continue
- if(G.state == GRAB_AGGRESSIVE)
- allow_upgrade = 0
- if(allow_upgrade)
- hud.icon_state = "reinforce"
- else
- hud.icon_state = "!reinforce"
- else
- if(!affecting.buckled)
- affecting.loc = assailant.loc
-
- var/breathing_tube = affecting.getorganslot("breathing_tube")
-
- if(state >= GRAB_NECK)
- affecting.Stun(5) //It will hamper your voice, being choked and all.
- if(isliving(affecting) && !breathing_tube)
- var/mob/living/L = affecting
- L.adjustOxyLoss(1)
-
- if(state >= GRAB_KILL)
- affecting.Weaken(5) //Should keep you down unless you get help.
- if(!breathing_tube)
- affecting.losebreath = min(affecting.losebreath + 2, 3)
-
-/obj/item/weapon/grab/attack_self(mob/user)
- s_click(hud)
-
-/obj/item/weapon/grab/proc/s_click(obj/screen/S)
- if(!affecting)
- return
- if(state == GRAB_UPGRADING)
- return
- if(world.time < (last_upgrade + UPGRADE_COOLDOWN))
- return
- if(!assailant.canmove || assailant.lying)
- qdel(src)
- return
-
- last_upgrade = world.time
-
- if(state < GRAB_AGGRESSIVE)
- if(!allow_upgrade)
- return
- assailant.visible_message("[assailant] grabs [affecting] aggressively!")
- state = GRAB_AGGRESSIVE
- icon_state = "grabbed1"
- else
- if(state < GRAB_NECK)
- if(isslime(affecting))
- assailant << "You squeeze [affecting], but nothing interesting happens!"
- return
-
- assailant.visible_message("[assailant] moves \his grip to [affecting]'s neck!")
- state = GRAB_NECK
- icon_state = "grabbed+1"
- if(!affecting.buckled)
- affecting.loc = assailant.loc
- add_logs(assailant, affecting, "neck-grabbed")
- hud.icon_state = "disarm/kill"
- hud.name = "disarm/kill"
- else
- if(state < GRAB_UPGRADING)
- assailant.visible_message("[assailant] starts to tighten \his grip on [affecting]'s neck!")
- hud.icon_state = "disarm/kill1"
- state = GRAB_UPGRADING
- if(do_after(assailant, UPGRADE_KILL_TIMER, target = affecting))
- if(state == GRAB_KILL)
- return
- if(!affecting)
- qdel(src)
- return
- if(!assailant.canmove || assailant.lying)
- qdel(src)
- return
- state = GRAB_KILL
- assailant.visible_message("[assailant] tightens \his grip on [affecting]'s neck!")
- add_logs(assailant, affecting, "strangled")
-
- assailant.changeNext_move(CLICK_CD_TKSTRANGLE)
- if(!affecting.getorganslot("breathing_tube"))
- affecting.losebreath += 1
- else
- if(assailant)
- assailant.visible_message("[assailant] is unable to tighten \his grip on [affecting]'s neck!")
- hud.icon_state = "disarm/kill"
- state = GRAB_NECK
-
-
-//This is used to make sure the victim hasn't managed to yackety sax away before using the grab.
-/obj/item/weapon/grab/proc/confirm()
- if(!assailant || !affecting)
- qdel(src)
- return 0
-
- if(affecting)
- if(!isturf(assailant.loc) || ( !isturf(affecting.loc) || assailant.loc != affecting.loc && get_dist(assailant, affecting) > 1) )
- qdel(src)
- return 0
-
- return 1
-
-
-/obj/item/weapon/grab/attack(mob/M, mob/user)
- if(!affecting)
- return
-
- if(M == affecting)
- s_click(hud)
- return
-
- if(M == assailant && state >= GRAB_AGGRESSIVE)
- if( (ishuman(user) && (user.disabilities & FAT) && ismonkey(affecting) ) || ( isalien(user) && iscarbon(affecting) ) )
- var/mob/living/carbon/attacker = user
- user.visible_message("[user] is attempting to devour [affecting]!")
- if(istype(user, /mob/living/carbon/alien/humanoid/hunter))
- if(!do_mob(user, affecting, 60)) return
- else
- if(!do_mob(user, affecting, 130)) return
- user.visible_message("[user] devours [affecting]!")
- affecting.loc = user
- attacker.stomach_contents.Add(affecting)
- qdel(src)
-
- add_logs(user, affecting, "attempted to put", src, "into [M]")
-
-/obj/item/weapon/grab/dropped()
- ..()
- qdel(src)
-
-#undef UPGRADE_COOLDOWN
-#undef UPGRADE_KILL_TIMER
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index fb1553ba799..c3708e32a05 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -272,7 +272,6 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
return M
return 0
-
/mob/proc/abiotic(full_body = 0)
if(l_hand && !l_hand.flags&ABSTRACT || r_hand && !r_hand.flags&ABSTRACT)
return 1
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index bb213d051d4..cfba67193ce 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -8,9 +8,6 @@
if(buckled == mover)
return 1
if(ismob(mover))
- var/mob/moving_mob = mover
- if ((other_mobs && moving_mob.other_mobs))
- return 1
if (mover in buckled_mobs)
return 1
return (!mover.density || !density || lying)
@@ -114,7 +111,7 @@
Process_Incorpmove(direct)
return 0
- if(Process_Grab())
+ if(Process_Grab()) //are we restrained by someone's grip?
return
if(mob.buckled) //if we're buckled to something, tell it we moved.
@@ -136,54 +133,10 @@
if(!mob.Process_Spacemove(direct))
return 0
- if(mob.restrained()) //Why being pulled while cuffed prevents you from moving
- for(var/mob/M in orange(1, mob))
- if(M.pulling == mob)
- if(!M.incapacitated() && mob.Adjacent(M))
- src << "You're restrained! You can't move!"
- move_delay = world.time + 10
- return 0
- else
- M.stop_pulling()
-
-
//We are now going to move
moving = 1
move_delay = mob.movement_delay() + world.time
- //Something with pulling things
- if(locate(/obj/item/weapon/grab, mob))
- move_delay = max(move_delay, world.time + 7)
- var/list/L = mob.ret_grab()
- if(istype(L, /list))
- if(L.len == 2)
- L -= mob
- var/mob/M = L[1]
- if(M)
- if ((get_dist(mob, M) <= 1 || M.loc == mob.loc))
- . = ..()
- if(M)//Mob may get deleted during parent call
- if (isturf(M.loc))
- var/diag = get_dir(mob, M)
- if ((diag - 1) & diag)
- else
- diag = null
- if ((get_dist(mob, M) > 1 || diag))
- step(M, get_dir(M.loc, mob.loc))
- else
- for(var/mob/M in L)
- M.other_mobs = 1
- if(mob != M)
- M.animate_movement = 3
- for(var/mob/M in L)
- spawn( 0 )
- step(M, direct)
- return
- spawn( 1 )
- M.other_mobs = null
- M.animate_movement = 2
- return
-
if(mob.confused)
if(mob.confused > 40)
step(mob, pick(cardinal))
@@ -207,39 +160,14 @@
///Called by client/Move()
///Checks to see if you are being grabbed and if so attemps to break it
/client/proc/Process_Grab()
- if(mob.grabbed_by.len)
- var/list/grabbing = list()
+ if(mob.pulledby)
+ if(mob.restrained(ignore_grab = 1))
+ move_delay = world.time + 10
+ src << "You're restrained! You can't move!"
+ return 1
+ else
+ return mob.resist_grab(1)
- if(istype(mob.l_hand, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/G = mob.l_hand
- grabbing += G.affecting
-
- if(istype(mob.r_hand, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/G = mob.r_hand
- grabbing += G.affecting
-
- for(var/X in mob.grabbed_by)
- var/obj/item/weapon/grab/G = X
- switch(G.state)
-
- if(GRAB_PASSIVE)
- if(!grabbing.Find(G.assailant)) //moving always breaks a passive grab unless we are also grabbing our grabber.
- qdel(G)
-
- if(GRAB_AGGRESSIVE)
- move_delay = world.time + 10
- if(!prob(25))
- return 1
- mob.visible_message("[mob] has broken free of [G.assailant]'s grip!")
- qdel(G)
-
- if(GRAB_NECK)
- move_delay = world.time + 10
- if(!prob(5))
- return 1
- mob.visible_message("[mob] has broken free of [G.assailant]'s headlock!")
- qdel(G)
- return 0
///Process_Incorpmove
///Called by client/Move()
@@ -352,27 +280,19 @@
/mob/proc/mob_negates_gravity()
return 0
+//moves the mob/object we're pulling
/mob/proc/Move_Pulled(atom/A)
- if (!canmove || restrained() || !pulling)
+ if (!pulling)
return
- if (pulling.anchored)
- return
- if (!pulling.Adjacent(src))
+ if (pulling.anchored || !pulling.Adjacent(src))
+ stop_pulling()
return
if (A == loc && pulling.density)
return
if (!Process_Spacemove(get_dir(pulling.loc, A)))
return
- if (ismob(pulling))
- var/mob/M = pulling
- var/atom/movable/t = M.pulling
- M.stop_pulling()
- step(pulling, get_dir(pulling.loc, A))
- if(M)
- M.start_pulling(t)
- else
- step(pulling, get_dir(pulling.loc, A))
- return
+ step(pulling, get_dir(pulling.loc, A))
+
/mob/proc/slip(s_amount, w_amount, obj/O, lube)
return
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 2861e2e41aa..c6223dfcd19 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -127,19 +127,12 @@
observer.loc = O.loc
else
src << "Teleporting failed. You should be able to use ghost verbs to teleport somewhere useful"
- if(client.prefs.be_random_name)
- client.prefs.real_name = random_unique_name(gender)
- if(client.prefs.be_random_body)
- client.prefs.random_character(gender)
- if(HAIR in client.prefs.pref_species.specflags)
- observer.hair_style = client.prefs.hair_style
- observer.hair_color = observer.brighten_color(client.prefs.hair_color)
- if(FACEHAIR in client.prefs.pref_species.specflags)
- observer.facial_hair_style = client.prefs.facial_hair_style
- observer.facial_hair_color = observer.brighten_color(client.prefs.facial_hair_color)
- observer.real_name = client.prefs.real_name
- observer.name = observer.real_name
observer.key = key
+ observer.client = client
+ observer.set_ghost_appearance()
+ if(observer.client && observer.client.prefs)
+ observer.real_name = observer.client.prefs.real_name
+ observer.name = observer.real_name
observer.update_icon()
observer.stopLobbySound()
qdel(mind)
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index 70344fe4bc1..e65ab6113d5 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -32,13 +32,16 @@
usr << "Speech is currently admin-disabled."
return
- if(mind && mind.name)
- name = "[mind.name]"
+ var/mob/dead/observer/O = src
+ if(isobserver(src) && O.deadchat_name)
+ name = "[O.deadchat_name]"
else
- name = real_name
- if(name != real_name)
- alt_name = " (died as [real_name])"
-
+ if(mind && mind.name)
+ name = "[mind.name]"
+ else
+ name = real_name
+ if(name != real_name)
+ alt_name = " (died as [real_name])"
var/K
diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
index eee99a59bd5..04c0c796f23 100644
--- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
@@ -13,7 +13,7 @@ It is possible to destroy the net by the occupant or someone else.
opacity = 0//Can see through.
mouse_opacity = 1//So you can hit it with stuff.
anchored = 1//Can't drag/grab the trapped mob.
-
+ layer = ABOVE_ALL_MOB_LAYER
var/health = 25//How much health it has.
var/mob/living/affecting = null//Who it is currently affecting, if anyone.
var/mob/living/master = null//Who shot web. Will let this person know if the net was successful or failed.
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
index b31d49c1d82..34d47d7e469 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
@@ -18,7 +18,6 @@
H.Beam(C,"n_beam",,15)
H.say("Get over here!")
var/obj/effect/energy_net/E = new /obj/effect/energy_net(C.loc)
- E.layer = C.layer+1//To have it appear one layer above the mob.
H.visible_message("[H] caught [C] with an energy net!","You caught [C] with an energy net!")
E.affecting = C
E.master = H
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 29d4bc11de5..98065675712 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -14,7 +14,6 @@
w_class = 1
throw_range = 1
throw_speed = 1
- layer = 3
pressure_resistance = 0
slot_flags = SLOT_HEAD
body_parts_covered = HEAD
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 341f7cf7e51..51b6eb9558f 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -33,7 +33,7 @@ By design, d1 is the smallest direction and d2 is the highest
icon_state = "0-1"
var/d1 = 0 // cable direction 1 (see above)
var/d2 = 1 // cable direction 2 (see above)
- layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4
+ layer = WIRE_LAYER //Above pipes, which are at GAS_PIPE_LAYER
var/cable_color = "red"
var/obj/item/stack/cable_coil/stored
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index a9780a6f25e..daebb4850a7 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -146,7 +146,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
middle = part
if(count <= 3) // Their sprite is the top part of the generator
part.density = 0
- part.layer = MOB_LAYER + 0.1
+ part.layer = WALL_OBJ_LAYER
part.sprite_number = count
part.main_part = src
parts += part
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 654614f7574..a4b9ae8875c 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -32,7 +32,7 @@
icon = 'icons/obj/lighting.dmi'
icon_state = "tube-construct-stage1"
anchored = 1
- layer = 5
+ layer = WALL_OBJ_LAYER
var/stage = 1
var/fixture_type = "tube"
var/sheets_refunded = 2
@@ -131,7 +131,7 @@
icon_state = "tube1"
desc = "A lighting fixture."
anchored = 1
- layer = 5 // They were appearing under mobs which is a little weird - Ostaf
+ layer = WALL_OBJ_LAYER
use_power = 2
idle_power_usage = 2
active_power_usage = 20
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index 0ddbd973c4a..4dc2e7b65d3 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -10,7 +10,7 @@
unacidable = 1
use_power = 0
luminosity = 4
- layer = OBJ_LAYER + 0.1
+ layer = ABOVE_OBJ_LAYER
var/obj/machinery/field/generator/FG1 = null
var/obj/machinery/field/generator/FG2 = null
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 660e1b409c1..5a8baf62a1b 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -5,6 +5,7 @@
desc = "A heavy duty industrial laser.\nAlt-click to rotate it clockwise."
icon = 'icons/obj/singularity.dmi'
icon_state = "emitter"
+ var/icon_state_on = "emitter_+a"
anchored = 0
density = 1
req_access = list(access_engine_equip)
@@ -94,9 +95,9 @@
/obj/machinery/power/emitter/update_icon()
if (active && powernet && avail(active_power_usage))
- icon_state = "emitter_+a"
+ icon_state = icon_state_on
else
- icon_state = "emitter"
+ icon_state = initial(icon_state)
/obj/machinery/power/emitter/attack_hand(mob/user)
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index 242adf9e287..8658fe0b341 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -11,6 +11,7 @@
move_self = 1 //Do we move on our own?
grav_pull = 5 //How many tiles out do we pull?
consume_range = 6 //How many tiles out do we eat
+ var/clashing = FALSE //If Nar-Sie is fighting Ratvar
/obj/singularity/narsie/large
name = "Nar-Sie"
@@ -46,6 +47,8 @@
/obj/singularity/narsie/process()
eat()
+ if(clashing)
+ return 0
if(!target || prob(5))
pickcultist()
move()
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index befe71b8071..d9090686d8d 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -7,7 +7,7 @@
icon_state = "singularity_s1"
anchored = 1
density = 1
- layer = 6
+ layer = MASSIVE_OBJ_LAYER
luminosity = 6
unacidable = 1 //Don't comment this out.
var/current_size = 1
diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm
index 229c59f9d03..f3fcb43585b 100644
--- a/code/modules/power/terminal.dm
+++ b/code/modules/power/terminal.dm
@@ -8,10 +8,9 @@
icon_state = "term"
desc = "It's an underfloor wiring terminal for power equipment."
level = 1
- layer = TURF_LAYER
var/obj/machinery/power/master = null
anchored = 1
- layer = 2.6 // a bit above wires
+ layer = WIRE_TERMINAL_LAYER //a bit above wires
/obj/machinery/power/terminal/New()
diff --git a/code/modules/procedural mapping/mapGenerator.dm b/code/modules/procedural_mapping/mapGenerator.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGenerator.dm
rename to code/modules/procedural_mapping/mapGenerator.dm
diff --git a/code/modules/procedural mapping/mapGeneratorModule.dm b/code/modules/procedural_mapping/mapGeneratorModule.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGeneratorModule.dm
rename to code/modules/procedural_mapping/mapGeneratorModule.dm
diff --git a/code/modules/procedural mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGeneratorModules/helpers.dm
rename to code/modules/procedural_mapping/mapGeneratorModules/helpers.dm
diff --git a/code/modules/procedural mapping/mapGeneratorModules/nature.dm b/code/modules/procedural_mapping/mapGeneratorModules/nature.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGeneratorModules/nature.dm
rename to code/modules/procedural_mapping/mapGeneratorModules/nature.dm
diff --git a/code/modules/procedural mapping/mapGeneratorObj.dm b/code/modules/procedural_mapping/mapGeneratorObj.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGeneratorObj.dm
rename to code/modules/procedural_mapping/mapGeneratorObj.dm
diff --git a/code/modules/procedural mapping/mapGeneratorReadme.dm b/code/modules/procedural_mapping/mapGeneratorReadme.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGeneratorReadme.dm
rename to code/modules/procedural_mapping/mapGeneratorReadme.dm
diff --git a/code/modules/procedural mapping/mapGenerators/asteroid.dm b/code/modules/procedural_mapping/mapGenerators/asteroid.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGenerators/asteroid.dm
rename to code/modules/procedural_mapping/mapGenerators/asteroid.dm
diff --git a/code/modules/procedural mapping/mapGenerators/cellular.dm b/code/modules/procedural_mapping/mapGenerators/cellular.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGenerators/cellular.dm
rename to code/modules/procedural_mapping/mapGenerators/cellular.dm
diff --git a/code/modules/procedural mapping/mapGenerators/lava_river.dm b/code/modules/procedural_mapping/mapGenerators/lava_river.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGenerators/lava_river.dm
rename to code/modules/procedural_mapping/mapGenerators/lava_river.dm
diff --git a/code/modules/procedural mapping/mapGenerators/nature.dm b/code/modules/procedural_mapping/mapGenerators/nature.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGenerators/nature.dm
rename to code/modules/procedural_mapping/mapGenerators/nature.dm
diff --git a/code/modules/procedural mapping/mapGenerators/shuttle.dm b/code/modules/procedural_mapping/mapGenerators/shuttle.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGenerators/shuttle.dm
rename to code/modules/procedural_mapping/mapGenerators/shuttle.dm
diff --git a/code/modules/procedural mapping/mapGenerators/syndicate.dm b/code/modules/procedural_mapping/mapGenerators/syndicate.dm
similarity index 100%
rename from code/modules/procedural mapping/mapGenerators/syndicate.dm
rename to code/modules/procedural_mapping/mapGenerators/syndicate.dm
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index 9d1f29ce38b..84ea5944c5a 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -215,9 +215,9 @@
/obj/item/ammo_casing/shotgun/dart/New()
..()
- flags |= NOREACT
flags |= OPENCONTAINER
create_reagents(30)
+ reagents.set_reacting(FALSE)
/obj/item/ammo_casing/shotgun/dart/attackby()
return
diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm
index 44fd2c98dd4..023c7c2fd02 100644
--- a/code/modules/projectiles/guns/syringe_gun.dm
+++ b/code/modules/projectiles/guns/syringe_gun.dm
@@ -24,7 +24,8 @@
if(!S) return
- chambered.BB = new /obj/item/projectile/bullet/dart/syringe(src)
+ chambered.BB = new S.projectile_type (src)
+
S.reagents.trans_to(chambered.BB, S.reagents.total_volume)
chambered.BB.name = S.name
syringes.Remove(S)
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 83d17c7ebfe..a6b0e4c0c7b 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -129,7 +129,7 @@
if((!( current ) || loc == current))
current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
step_towards(src, current)
- if(original && (original.layer>=2.75) || ismob(original))
+ if(original && (original.layer>=PROJECTILE_HIT_THRESHHOLD_LAYER) || ismob(original))
if(loc == get_turf(original))
if(!(original in permutated))
Bump(original, 1)
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index d5300383dbd..7c68c9db0c6 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -166,17 +166,18 @@
name = "dart"
icon_state = "cbbolt"
damage = 6
+ var/piercing = 0
/obj/item/projectile/bullet/dart/New()
..()
- flags |= NOREACT
create_reagents(50)
+ reagents.set_reacting(FALSE)
/obj/item/projectile/bullet/dart/on_hit(atom/target, blocked = 0, hit_zone)
if(iscarbon(target))
var/mob/living/carbon/M = target
if(blocked != 100) // not completely blocked
- if(M.can_inject(null,0,hit_zone)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
+ if(M.can_inject(null,0,hit_zone,piercing)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
..()
reagents.reaction(M, INJECT)
reagents.trans_to(M, reagents.total_volume)
@@ -187,7 +188,7 @@
"You were protected against the [name]!")
..(target, blocked, hit_zone)
- flags &= ~NOREACT
+ reagents.set_reacting(TRUE)
reagents.handle_reactions()
return 1
@@ -203,6 +204,10 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "syringeproj"
+//Piercing Syringe
+/obj/item/projectile/bullet/dart/syringe/piercing
+ piercing = 1
+
/obj/item/projectile/bullet/neurotoxin
name = "neurotoxin spit"
icon_state = "neurotoxin"
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index cbe4524c9f9..b0e825110af 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -61,12 +61,9 @@
var/mob/living/carbon/C = target
C.regenerate_limbs()
if(target.revive(full_heal = 1))
- if(!target.ckey)
- for(var/mob/dead/observer/ghost in player_list)
- if(target.real_name == ghost.real_name)
- ghost.reenter_corpse()
- break
- target << "You rise with a start, you're alive!!!"
+ target.grab_ghost(force = TRUE) // even suicides
+ target << "You rise with a start, \
+ you're alive!!!"
else if(target.stat != DEAD)
target << "You feel great!"
@@ -175,7 +172,7 @@
if("drone")
new_mob = new /mob/living/simple_animal/drone(M.loc)
var/mob/living/simple_animal/drone/D = new_mob
- D.update_drone_hack()
+ D.liberate() // F R E E D R O N E
if(issilicon(new_mob))
new_mob.gender = M.gender
new_mob.invisibility = 0
@@ -186,9 +183,10 @@
new_mob.languages |= HUMAN
if("slime")
new_mob = new /mob/living/simple_animal/slime(M.loc)
+ var/mob/living/simple_animal/slime/slimey = new_mob
if(prob(50))
- var/mob/living/simple_animal/slime/Slime = new_mob
- Slime.is_adult = 1
+ slimey.is_adult = 1
+ slimey.random_colour()
new_mob.languages |= HUMAN
if("xeno")
if(prob(50))
@@ -220,7 +218,7 @@
if("spiderhunter")
new_mob = new /mob/living/simple_animal/hostile/poison/giant_spider/hunter(M.loc)
if("blobbernaut")
- new_mob = new /mob/living/simple_animal/hostile/blob/blobbernaut(M.loc)
+ new_mob = new /mob/living/simple_animal/hostile/blob/blobbernaut/independent(M.loc)
if("magicarp")
new_mob = new /mob/living/simple_animal/hostile/carp/ranged(M.loc)
if("chaosmagicarp")
@@ -279,10 +277,8 @@
M.attack_log += text("\[[time_stamp()]\] [M.real_name] ([M.ckey]) became [new_mob.real_name].")
new_mob.a_intent = "harm"
- if(M.mind)
- M.mind.transfer_to(new_mob)
- else
- new_mob.key = M.key
+
+ M.wabbajack_act(new_mob)
new_mob << "Your form morphs into that of a [randomize]."
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 0002f3dbeca..81f9afd7dad 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -162,7 +162,7 @@
name = "kinetic explosion"
icon = 'icons/obj/projectiles.dmi'
icon_state = "kinetic_blast"
- layer = 4.1
+ layer = ABOVE_ALL_MOB_LAYER
/obj/effect/kinetic_blast/New()
spawn(4)
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index d1af9041bc8..c27f060df24 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -17,10 +17,14 @@ var/const/INJECT = 5 //injection
var/last_tick = 1
var/addiction_tick = 1
var/list/datum/reagent/addiction_list = new/list()
+ var/flags
/datum/reagents/New(maximum=100)
maximum_volume = maximum
- SSobj.processing |= src
+
+ if(!(flags & REAGENT_NOREACT))
+ SSobj.processing |= src
+
//I dislike having these here but map-objects are initialised before world/New() is called. >_>
if(!chemical_reagents_list)
//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id
@@ -56,7 +60,7 @@ var/const/INJECT = 5 //injection
/datum/reagents/Destroy()
. = ..()
- SSobj.processing.Remove(src)
+ SSobj.processing -= src
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
qdel(R)
@@ -292,12 +296,23 @@ var/const/INJECT = 5 //injection
update_total()
/datum/reagents/process()
- if(my_atom && (my_atom.flags & NOREACT))
+ if(flags & REAGENT_NOREACT)
+ SSobj.processing -= src
return
+
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
R.on_tick()
- return
+
+/datum/reagents/proc/set_reacting(react = TRUE)
+ if(react)
+ // Order is important, process() can remove from processing if
+ // the flag is present
+ flags &= ~(REAGENT_NOREACT)
+ SSobj.processing |= src
+ else
+ SSobj.processing -= src
+ flags |= REAGENT_NOREACT
/datum/reagents/proc/conditional_update_move(atom/A, Running = 0)
for(var/reagent in reagent_list)
@@ -312,7 +327,8 @@ var/const/INJECT = 5 //injection
update_total()
/datum/reagents/proc/handle_reactions()
- if(my_atom.flags & NOREACT) return //Yup, no reactions here. No siree.
+ if(flags & REAGENT_NOREACT)
+ return //Yup, no reactions here. No siree.
var/reaction_occured = 0
do
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index e71f8a95b48..479a2ea140b 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -3,7 +3,7 @@
desc = "Used to grind things up into raw materials."
icon = 'icons/obj/kitchen.dmi'
icon_state = "juicer1"
- layer = 2.9
+ layer = BELOW_OBJ_LAYER
anchored = 1
use_power = 1
idle_power_usage = 5
diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
index 73943891b08..0d648c46fc2 100644
--- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm
@@ -565,7 +565,7 @@
reac_volume = ..()
var/turf/open/T = get_turf(M)
if(istype(T) && prob(reac_volume))
- T.MakeSlippery(min = 5, max = 1)
+ T.MakeSlippery(min_wet_time = 5, wet_time_to_add = 1)
M.adjust_fire_stacks(-(reac_volume / 10))
M.ExtinguishMob()
M.apply_damage(0.1*reac_volume, BRUTE)
@@ -586,7 +586,7 @@
/datum/reagent/blob/pressurized_slime/proc/extinguisharea(obj/effect/blob/B, probchance)
for(var/turf/open/T in range(1, B))
if(prob(probchance))
- T.MakeSlippery(min = 5, max = 1)
+ T.MakeSlippery(min_wet_time = 5, wet_time_to_add = 1)
for(var/obj/O in T)
O.extinguish()
for(var/mob/living/L in T)
@@ -663,4 +663,4 @@
if(message_living && !issilicon(M))
totalmessage += message_living
totalmessage += "!"
- M << "[totalmessage]"
\ No newline at end of file
+ M << "[totalmessage]"
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 27ac8a195ae..c9e1e5c4897 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -155,7 +155,7 @@
if(reac_volume >= 1) // Make Freezy Foam and anti-fire grenades!
if(istype(T, /turf/open))
var/turf/open/OT = T
- OT.MakeSlippery(TURF_WET_ICE, 5, reac_volume*0.5) // Is less effective in high pressure/high heat capacity environments. More effective in low pressure.
+ OT.MakeSlippery(wet_setting=TURF_WET_ICE, min_wet_time=5, wet_time_to_add=reac_volume*0.5) // Is less effective in high pressure/high heat capacity environments. More effective in low pressure.
OT.air.temperature -= MOLES_CELLSTANDARD*100*reac_volume/OT.air.heat_capacity() // reduces environment temperature by 5K per unit.
/datum/reagent/consumable/condensedcapsaicin
@@ -324,7 +324,7 @@
/datum/reagent/consumable/cornoil/reaction_turf(turf/open/T, reac_volume)
if (!istype(T))
return
- T.MakeSlippery(min = 5, max = reac_volume*2)
+ T.MakeSlippery(min_wet_time = 5, wet_time_to_add = reac_volume*2)
var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T)
if(hotspot)
var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() )
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index d3a0dd84c01..eaf4e1c8c68 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -123,7 +123,7 @@
var/CT = cooling_temperature
if(reac_volume >= 5)
- T.MakeSlippery(min = 5, max = reac_volume*0.2)
+ T.MakeSlippery(min_wet_time = 5, wet_time_to_add = reac_volume*0.2)
for(var/mob/living/simple_animal/slime/M in T)
M.apply_water()
@@ -173,6 +173,11 @@
description = "Water blessed by some deity."
color = "#E0E8EF" // rgb: 224, 232, 239
+/datum/reagent/water/holywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
+ if(is_servant_of_ratvar(M))
+ M << "A darkness begins to spread its unholy tendrils through your mind, purging the Justiciar's influence!"
+ ..()
+
/datum/reagent/water/holywater/on_mob_life(mob/living/M)
if(!data) data = 1
data++
@@ -184,13 +189,23 @@
M.Dizzy(5)
if(iscultist(M) && prob(5))
M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","R'ge Na'sie","Diabo us Vo'iscum","Eld' Mon Nobis"))
+ else if(is_servant_of_ratvar(M) && prob(5))
+ switch(pick("speech", "message", "emote"))
+ if("speech")
+ M.say("...[pick("Ratvar... lbhe yvtug tebjf qnex", "Jurer ner lbh, znfgre?", "Ur yvrf ehfgvat va Reebe", "Chetr nyy hagehguf naq... naq... fbzrguvat")]...")
+ if("message")
+ M << "[pick("Ratvar's illumination of your mind has begun to flicker.", "He lies rusting in Reebe, derelict and forgotten. And there he shall stay.", \
+ "You can't save him. Nothing can save him now.", "It seems that Nar-Sie will triumph after all.")]"
+ if("emote")
+ M.visible_message("[M] [pick("whimpers quietly", "shivers as though cold", "glances around in paranoia")]")
if(data >= 75 && prob(33)) // 30 units, 135 seconds
if (!M.confused)
M.confused = 1
M.confused += 3
- if(iscultist(M) || (is_handofgod_cultist(M) && !is_handofgod_prophet(M)))
+ if(iscultist(M) || (is_handofgod_cultist(M) && !is_handofgod_prophet(M)) || is_servant_of_ratvar(M))
ticker.mode.remove_cultist(M.mind, 1, 1)
ticker.mode.remove_hog_follower(M.mind)
+ remove_servant_of_ratvar(M.mind)
holder.remove_reagent(src.id, src.volume) // maybe this is a little too perfect and a max() cap on the statuses would be better??
M.jitteriness = 0
M.stuttering = 0
@@ -258,7 +273,7 @@
/datum/reagent/lube/reaction_turf(turf/open/T, reac_volume)
if (!istype(T)) return
if(reac_volume >= 1)
- T.MakeSlippery(TURF_WET_LUBE, 5, reac_volume)
+ T.MakeSlippery(wet_setting=TURF_WET_LUBE, min_wet_time=5, wet_time_to_add=reac_volume)
/datum/reagent/spraytan
name = "Spray Tan"
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 3bcd9d6a5ef..0a25b46d7d0 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -174,16 +174,23 @@
/obj/item/weapon/reagent_containers/glass/beaker/noreact
name = "cryostasis beaker"
- desc = "A cryostasis beaker that allows for chemical storage without reactions. Can hold up to 50 units."
+ desc = "A cryostasis beaker that allows for chemical storage without \
+ reactions. Can hold up to 50 units."
icon_state = "beakernoreact"
materials = list(MAT_GLASS=500)
volume = 50
amount_per_transfer_from_this = 10
- flags = OPENCONTAINER | NOREACT
+ flags = OPENCONTAINER
+
+/obj/item/weapon/reagent_containers/glass/beaker/noreact/New()
+ ..()
+ reagents.set_reacting(FALSE)
/obj/item/weapon/reagent_containers/glass/beaker/bluespace
name = "bluespace beaker"
- desc = "A bluespace beaker, powered by experimental bluespace technology and Element Cuban combined with the Compound Pete. Can hold up to 300 units."
+ desc = "A bluespace beaker, powered by experimental bluespace technology \
+ and Element Cuban combined with the Compound Pete. Can hold up to \
+ 300 units."
icon_state = "beakerbluespace"
materials = list(MAT_GLASS=5000)
volume = 300
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index e65c3fac38e..68bc332d528 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -12,6 +12,7 @@
volume = 15
var/mode = SYRINGE_DRAW
var/busy = 0 // needed for delayed drawing of blood
+ var/projectile_type = /obj/item/projectile/bullet/dart/syringe
materials = list(MAT_METAL=10, MAT_GLASS=20)
/obj/item/weapon/reagent_containers/syringe/New()
@@ -181,7 +182,7 @@
/obj/item/weapon/reagent_containers/syringe/update_icon()
- var/rounded_vol = Clamp(round(reagents.total_volume,5), 0, 15)
+ var/rounded_vol = Clamp(round((reagents.total_volume / volume * 15),5), 0, 15)
overlays.Cut()
if(ismob(loc))
var/injoverlay
@@ -253,4 +254,25 @@
desc = "A syringe recovered from a dread place. It probably isn't wise to use."
amount_per_transfer_from_this = 1
volume = 1
- list_reagents = list("gluttonytoxin" = 1)
\ No newline at end of file
+ list_reagents = list("gluttonytoxin" = 1)
+
+/obj/item/weapon/reagent_containers/syringe/bluespace
+ name = "bluespace syringe"
+ desc = "An advanced syringe that can hold 60 units of chemicals"
+ amount_per_transfer_from_this = 20
+ volume = 60
+
+/obj/item/weapon/reagent_containers/syringe/noreact
+ name = "cryo syringe"
+ desc = "An advanced syringe that stops reagents inside from reacting. It can hold up to 20 units."
+ volume = 20
+
+/obj/item/weapon/reagent_containers/syringe/noreact/New()
+ . = ..()
+ reagents.set_reacting(FALSE)
+
+/obj/item/weapon/reagent_containers/syringe/piercing
+ name = "piercing syringe"
+ desc = "A diamond-tipped syringe that pierces armor when launched at high velocity. It can hold up to 10 units."
+ volume = 10
+ projectile_type = /obj/item/projectile/bullet/dart/syringe/piercing
diff --git a/code/modules/recycling/disposal-structures.dm b/code/modules/recycling/disposal-structures.dm
index d5c7403d185..926f2afbb31 100644
--- a/code/modules/recycling/disposal-structures.dm
+++ b/code/modules/recycling/disposal-structures.dm
@@ -136,7 +136,7 @@
var/dpdir = 0 // bitmask of pipe directions
dir = 0 // dir will contain dominant direction for junction pipes
var/health = 10 // health points 0-10
- layer = 2.3 // slightly lower than wires and other pipes
+ layer = DISPOSAL_PIPE_LAYER // slightly lower than wires and other pipes
var/base_icon_state // initial icon state on map
var/obj/structure/disposalconstruct/stored
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 6d5c69503fb..88f2ecad568 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -71,7 +71,7 @@
materials = list(MAT_METAL = 3000, MAT_PLASMA = 3000, MAT_DIAMOND = 500)
reliability = 76
build_path = /obj/item/weapon/reagent_containers/glass/beaker/bluespace
- category = list("Misc","Medical Designs")
+ category = list("Medical Designs", "Bluespace Designs")
/datum/design/noreactbeaker
name = "Cryostasis Beaker"
@@ -84,6 +84,39 @@
build_path = /obj/item/weapon/reagent_containers/glass/beaker/noreact
category = list("Medical Designs")
+/datum/design/bluespacesyringe
+ name = "Bluespace Syringe"
+ desc = "An advanced syringe that can hold 60 units of chemicals"
+ id = "bluespacesyringe"
+ req_tech = list("bluespace" = 3, "materials" = 4, "combat" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_GLASS = 4000, MAT_PLASMA = 2000, MAT_DIAMOND = 2000)
+ reliability = 76
+ build_path = /obj/item/weapon/reagent_containers/syringe/bluespace
+ category = list("Medical Designs", "Bluespace Designs")
+
+/datum/design/noreactsyringe
+ name = "Cryo Syringe"
+ desc = "An advanced syringe that stops reagents inside from reacting. It can hold up to 20 units."
+ id = "noreactsyringe"
+ req_tech = list("materials" = 2, "combat" = 2)
+ build_type = PROTOLATHE
+ materials = list(MAT_GLASS = 4000, MAT_GOLD = 1000)
+ reliability = 76
+ build_path = /obj/item/weapon/reagent_containers/syringe/noreact
+ category = list("Medical Designs")
+
+/datum/design/piercesyringe
+ name = "Piercing Syringe"
+ desc = "A diamond-tipped syringe that pierces armor when launched at high velocity. It can hold up to 10 units."
+ id = "piercesyringe"
+ req_tech = list("materials" = 3, "combat" = 3)
+ build_type = PROTOLATHE
+ materials = list(MAT_GLASS = 4000, MAT_DIAMOND = 1500)
+ reliability = 76
+ build_path = /obj/item/weapon/reagent_containers/syringe/piercing
+ category = list("Medical Designs")
+
/datum/design/bluespacebodybag
name = "Bluespace body bag"
desc = "A bluespace body bag, powered by experimental bluespace technology. It can hold loads of bodies and the largest of creatures."
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 254c87a22ca..96934df98e7 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -184,16 +184,6 @@
build_path = /obj/item/weapon/gun/energy/ionrifle/carbine
category = list("Weapons")
-/datum/design/gatling
- name = "Laser Gatling Gun"
- desc = "A massive weapon with a backpack mounted power source."
- id = "gatlinggun"
- req_tech = list("combat" = 6, "materials" = 4, "magnets" = 4)
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 30000, MAT_SILVER = 4000, MAT_DIAMOND = 6000, MAT_URANIUM = 10000)
- build_path = /obj/item/weapon/minigunpack
- category = list("Weapons")
-
/datum/design/wormhole_projector
name = "Bluespace Wormhole Projector"
desc = "A projector that emits high density quantum-coupled bluespace beams."
diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm
index 622e3c38a31..19802dda3c1 100644
--- a/code/modules/ruins/lavaland_ruin_code.dm
+++ b/code/modules/ruins/lavaland_ruin_code.dm
@@ -30,8 +30,11 @@
/obj/structure/lavaland_door/singularity_pull()
return 0
-/obj/structure/lavaland_door/Destroy()
- return QDEL_HINT_LETMELIVE
+/obj/structure/lavaland_door/Destroy(force)
+ if(force)
+ . = ..()
+ else
+ return QDEL_HINT_LETMELIVE
/obj/machinery/lavaland_controller
name = "weather control machine"
@@ -50,8 +53,11 @@
LAVA.weather_start_up()
ongoing_weather = null
-/obj/machinery/lavaland_controller/Destroy()
- return QDEL_HINT_LETMELIVE
+/obj/machinery/lavaland_controller/Destroy(force)
+ if(force)
+ . = ..()
+ else
+ return QDEL_HINT_LETMELIVE
//lavaland_surface_seed_vault.dmm
//Seed Vault
diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security_levels/keycard_authentication.dm
similarity index 100%
rename from code/modules/security levels/keycard authentication.dm
rename to code/modules/security_levels/keycard_authentication.dm
diff --git a/code/modules/security levels/security levels.dm b/code/modules/security_levels/security_levels.dm
similarity index 100%
rename from code/modules/security levels/security levels.dm
rename to code/modules/security_levels/security_levels.dm
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index acbcbb82fbe..26b754d31f5 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -1,3 +1,8 @@
+#define TIME_LEFT (SSshuttle.emergency.timeLeft())
+#define ENGINES_START_TIME 10
+#define ENGINES_STARTED (TIME_LEFT <= ENGINES_START_TIME)
+#define IS_DOCKED (SSshuttle.emergency.mode == SHUTTLE_DOCKED)
+
/obj/machinery/computer/emergency_shuttle
name = "emergency shuttle console"
desc = "For shuttle control."
@@ -6,61 +11,165 @@
var/auth_need = 3
var/list/authorized = list()
+/obj/machinery/computer/emergency_shuttle/attackby(obj/item/I, mob/user,params)
+ if(istype(I, /obj/item/weapon/card/id))
+ say("Please equip your ID card into your ID slot to authenticate.")
+ . = ..()
-/obj/machinery/computer/emergency_shuttle/attackby(obj/item/I, mob/user, params)
- var/obj/item/weapon/card/id/ID = I.GetID()
- if(ID)
- if(stat & (BROKEN|NOPOWER))
- return
- if(SSshuttle.emergency.mode != SHUTTLE_DOCKED)
- return
- if(SSshuttle.emergency.timeLeft() < 11)
- return
- if(!(access_heads in ID.access)) //doesn't have this access
- user << "The access level of [ID.registered_name]\'s card is not high enough. "
- return
+/obj/machinery/computer/emergency_shuttle/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = human_adjacent_state)
- var/choice = alert(user, text("Would you like to (un)authorize a shortened launch time? [] authorization\s are still needed. Use abort to cancel all authorizations.", src.auth_need - src.authorized.len), "Shuttle Launch", "Authorize", "Repeal", "Abort")
- if(SSshuttle.emergency.mode != SHUTTLE_DOCKED || user.get_active_hand() != ID)
- return
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "emergency_shuttle_console", name,
+ 400, 400, master_ui, state)
+ ui.open()
- var/seconds = SSshuttle.emergency.timeLeft()
- if(seconds <= 10)
- return
+/obj/machinery/computer/emergency_shuttle/ui_data()
+ var/list/data = list()
- switch(choice)
- if("Authorize")
- if(!authorized.Find(ID.registered_name))
- authorized += ID.registered_name
- if(auth_need - authorized.len > 0)
- message_admins("[key_name_admin(user.client)](?) (FLW) has authorized early shuttle launch ",0,1)
- log_game("[key_name(user)] has authorized early shuttle launch in ([x],[y],[z])")
- minor_announce("[auth_need - authorized.len] more authorization(s) needed until shuttle is launched early",null,1)
- else
- message_admins("[key_name_admin(user.client)](?) (FLW) has launched the emergency shuttle [seconds] seconds before launch.",0,1)
- log_game("[key_name(user)] has launched the emergency shuttle in ([x],[y],[z]) [seconds] seconds before launch.")
- minor_announce("The emergency shuttle will launch in 10 seconds",null,1)
- SSshuttle.emergency.setTimer(100)
+ data["timer_str"] = SSshuttle.emergency.getTimerStr()
+ data["engines_started"] = ENGINES_STARTED
+ data["authorizations_remaining"] = max((auth_need - authorized.len), 0)
+ var/list/A = list()
+ for(var/i in authorized)
+ var/obj/item/weapon/card/id/ID = i
+ var/name = ID.registered_name
+ var/job = ID.assignment
- if("Repeal")
- if(authorized.Remove(ID.registered_name))
- minor_announce("[auth_need - authorized.len] authorizations needed until shuttle is launched early")
+ if(emagged)
+ name = Gibberish(name, 0)
+ job = Gibberish(job, 0)
+ A += list(list("name" = name, "job" = job))
+ data["authorizations"] = A
- if("Abort")
- if(authorized.len)
- minor_announce("All authorizations to launch the shuttle early have been revoked.")
- authorized.Cut()
- else
- return ..()
+ data["enabled"] = (IS_DOCKED && !ENGINES_STARTED)
+ data["emagged"] = emagged
+ return data
+
+/obj/machinery/computer/emergency_shuttle/ui_act(action, params, datum/tgui/ui)
+ if(..())
+ return
+ if(ENGINES_STARTED) // past the point of no return
+ return
+ if(!IS_DOCKED) // shuttle computer only has uses when onstation
+ return
+
+ var/mob/user = usr
+ . = FALSE
+
+ var/obj/item/weapon/card/id/ID = user.get_idcard()
+
+ if(!ID)
+ user << "You don't have an ID."
+ return
+
+ if(!(access_heads in ID.access))
+ user << "The access level of \
+ your card is not high enough."
+ return
+
+ var/old_len = authorized.len
+
+ switch(action)
+ if("authorize")
+ . = authorize(user)
+
+ if("repeal")
+ authorized -= ID
+
+ if("abort")
+ if(authorized.len)
+ // Abort. The action for when heads are fighting over whether
+ // to launch early.
+ authorized.Cut()
+ . = TRUE
+
+ if((old_len != authorized.len) && !ENGINES_STARTED)
+ var/alert = (authorized.len > old_len)
+ if(authorized.len)
+ minor_announce("[auth_need - authorized.len] authorizations \
+ needed until shuttle is launched early", null, alert)
+ else
+ minor_announce("All authorizations to launch the shuttle \
+ early have been revoked.")
+
+/obj/machinery/computer/emergency_shuttle/proc/authorize(mob/user, source)
+ var/obj/item/weapon/card/id/ID = user.get_idcard()
+
+ if(ID in authorized)
+ return FALSE
+ for(var/i in authorized)
+ var/obj/item/weapon/card/id/other = i
+ if(other.registered_name == ID.registered_name)
+ return FALSE // No using IDs with the same name
+
+ authorized += ID
+
+ message_admins("[key_name_admin(user.client)] \
+ (?) \
+ (FLW) \
+ has authorized early shuttle launch", 0, 1)
+ log_game("[key_name(user)] has authorized early shuttle launch in \
+ ([x],[y],[z])")
+ // Now check if we're on our way
+ . = TRUE
+ process()
+
+/obj/machinery/computer/emergency_shuttle/process()
+ // Launch check is in process in case auth_need changes for some reason
+ // probably external.
+ . = FALSE
+ if(ENGINES_STARTED || (!IS_DOCKED))
+ return .
+
+ // Check to see if we've reached criteria for early launch
+ if((authorized.len >= auth_need) || emagged)
+ // shuttle timers use 1/10th seconds internally
+ SSshuttle.emergency.setTimer(ENGINES_START_TIME * 10)
+ var/system_error = emagged ? "SYSTEM ERROR:" : null
+ minor_announce("The emergency shuttle will launch in \
+ [ENGINES_START_TIME] seconds", system_error, alert=TRUE)
+ . = TRUE
/obj/machinery/computer/emergency_shuttle/emag_act(mob/user)
- if(!emagged && SSshuttle.emergency.mode == SHUTTLE_DOCKED)
- var/time = SSshuttle.emergency.timeLeft()
- message_admins("[key_name_admin(user.client)](?) (FLW) has emagged the emergency shuttle [time] seconds before launch.",0,1)
- log_game("[key_name(user)] has emagged the emergency shuttle in ([x],[y],[z]) [time] seconds before launch.")
- minor_announce("The emergency shuttle will launch in 10 seconds", "SYSTEM ERROR:",null,1)
- SSshuttle.emergency.setTimer(100)
- emagged = 1
+ // How did you even get on the shuttle before it go to the station?
+ if(!IS_DOCKED)
+ return
+
+ var/time = TIME_LEFT
+ message_admins("[key_name_admin(user.client)] \
+ (?) \
+ (FLW) \
+ has emagged the emergency shuttle [time] seconds before launch.", 0, 1)
+ log_game("[key_name(user)] has emagged the emergency shuttle in \
+ ([x],[y],[z]) [time] seconds before launch.")
+ emagged = TRUE
+ var/datum/species/S = new
+ for(var/i in 1 to 10)
+ // the shuttle system doesn't know who these people are, but they
+ // must be important, surely
+ var/obj/item/weapon/card/id/ID = new(src)
+ var/datum/job/J = pick(SSjob.occupations)
+ ID.registered_name = S.random_name(pick(MALE, FEMALE))
+ ID.assignment = J.title
+
+ authorized += ID
+
+ if(ENGINES_STARTED)
+ // Give them a message anyway
+ user << "The shuttle is already \
+ about to launch!"
+ else
+ process()
+
+/obj/machinery/computer/emergency_shuttle/Destroy()
+ // Our fake IDs that the emag generated are just there for colour
+ // They're not supposed to be accessible
+
+ for(var/obj/item/weapon/card/id/ID in src)
+ qdel(ID)
+
+ . = ..()
/obj/docking_port/mobile/emergency
name = "emergency shuttle"
@@ -74,16 +183,16 @@
roundstart_move = "emergency_away"
var/sound_played = 0 //If the launch sound has been sent to all players on the shuttle itself
-/obj/docking_port/mobile/emergency/New()
- ..()
- // The last created emergency shuttle will always be the one
- // that we use.
+/obj/docking_port/mobile/emergency/register()
+ . = ..()
SSshuttle.emergency = src
-/obj/docking_port/mobile/emergency/Destroy()
- if(src.i_know_what_im_doing)
+/obj/docking_port/mobile/emergency/Destroy(force)
+ if(force)
// This'll make the shuttle subsystem use the backup shuttle.
- SSshuttle.emergencyDeregister()
+ if(src == SSshuttle.emergency)
+ // If we're the selected emergency shuttle
+ SSshuttle.emergencyDeregister()
. = ..()
@@ -342,12 +451,16 @@
// We want to be a valid emergency shuttle
// but not be the main one, keep whatever's set
// valid.
+ // backup shuttle ignores `timid` because THERE SHOULD BE NO TOUCHING IT
var/current_emergency = SSshuttle.emergency
..()
SSshuttle.emergency = current_emergency
SSshuttle.backup_shuttle = src
-
#undef UNLAUNCHED
#undef LAUNCHED
#undef EARLY_LAUNCHED
+#undef TIMELEFT
+#undef ENGINES_START_TIME
+#undef ENGINES_STARTED
+#undef IS_DOCKED
diff --git a/code/modules/shuttle/manipulator.dm b/code/modules/shuttle/manipulator.dm
index 55913ab432f..d30cc49f381 100644
--- a/code/modules/shuttle/manipulator.dm
+++ b/code/modules/shuttle/manipulator.dm
@@ -6,8 +6,268 @@
I took the one less traveled by,\n\
And that has made all the difference."
- icon = 'icons/obj/machines/dominator.dmi'
- icon_state = "dominator-blue"
+ icon = 'icons/obj/machines/shuttle_manipulator.dmi'
+ icon_state = "holograph_on"
+
+ // UI state variables
+ var/datum/map_template/shuttle/selected
+
+ var/obj/docking_port/mobile/existing_shuttle
+
+ var/obj/docking_port/mobile/preview_shuttle
+ var/datum/map_template/shuttle/preview_template
+
+/obj/machinery/shuttle_manipulator/New()
+ . = ..()
+ update_icon()
+
+/obj/machinery/shuttle_manipulator/update_icon()
+ overlays.Cut()
+ var/image/hologram_projection = image(icon, "hologram_on")
+ hologram_projection.pixel_y = 22
+ var/image/hologram_ship = image(icon, "hologram_whiteship")
+ hologram_ship.pixel_y = 27
+ overlays += hologram_projection
+ overlays += hologram_ship
/obj/machinery/shuttle_manipulator/process()
return
+
+/obj/machinery/shuttle_manipulator/ui_interact(mob/user, ui_key = "main", \
+ datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, \
+ datum/ui_state/state = admin_state)
+
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "shuttle_manipulator", name, 800, 600, \
+ master_ui, state)
+ ui.open()
+
+/proc/shuttlemode2str(mode)
+ switch(mode)
+ if(SHUTTLE_IDLE)
+ . = "idle"
+ if(SHUTTLE_RECALL)
+ . = "recalled"
+ if(SHUTTLE_CALL)
+ . = "called"
+ if(SHUTTLE_DOCKED)
+ . = "docked"
+ if(SHUTTLE_STRANDED)
+ . = "stranded"
+ if(SHUTTLE_ENDGAME)
+ . = "endgame"
+ if(!.)
+ throw EXCEPTION("shuttlemode2str(): invalid mode [mode]")
+
+
+/obj/machinery/shuttle_manipulator/ui_data(mob/user)
+ var/list/data = list()
+ data["tabs"] = list("Status", "Templates", "Modification")
+
+ // Templates panel
+ data["templates"] = list()
+ var/list/templates = data["templates"]
+ data["templates_tabs"] = list()
+ data["selected"] = list()
+
+ for(var/shuttle_id in shuttle_templates)
+ var/datum/map_template/shuttle/S = shuttle_templates[shuttle_id]
+
+ if(!templates[S.port_id])
+ data["templates_tabs"] += S.port_id
+ templates[S.port_id] = list(
+ "port_id" = S.port_id,
+ "templates" = list())
+
+ var/list/L = list()
+ L["name"] = S.name
+ L["shuttle_id"] = S.shuttle_id
+ L["port_id"] = S.port_id
+ L["description"] = S.description
+ L["admin_notes"] = S.admin_notes
+
+ if(selected == S)
+ data["selected"] = L
+
+ templates[S.port_id]["templates"] += list(L)
+
+ data["templates_tabs"] = sortList(data["templates_tabs"])
+
+ data["existing_shuttle"] = null
+
+ // Status panel
+ data["shuttles"] = list()
+ for(var/i in SSshuttle.mobile)
+ var/obj/docking_port/mobile/M = i
+ var/list/L = list()
+ L["name"] = M.name
+ L["id"] = M.id
+ L["timer"] = M.timer
+ L["timeleft"] = M.getTimerStr()
+ L["mode"] = capitalize(shuttlemode2str(M.mode))
+ L["status"] = M.getStatusText()
+ if(M == existing_shuttle)
+ data["existing_shuttle"] = L
+
+ data["shuttles"] += list(L)
+
+ return data
+
+/obj/machinery/shuttle_manipulator/ui_act(action, params)
+ if(..())
+ return
+
+ var/mob/user = usr
+
+ // Preload some common parameters
+ var/shuttle_id = params["shuttle_id"]
+ var/datum/map_template/shuttle/S = shuttle_templates[shuttle_id]
+
+ switch(action)
+ if("select_template")
+ if(S)
+ existing_shuttle = SSshuttle.getShuttle(S.port_id)
+ selected = S
+ . = TRUE
+ if("jump_to")
+ if(params["type"] == "mobile")
+ . = TRUE
+ for(var/i in SSshuttle.mobile)
+ var/obj/docking_port/mobile/M = i
+ if(M.id == params["id"])
+ user.forceMove(get_turf(M))
+ break
+
+ if("preview")
+ if(S)
+ . = TRUE
+ unload_preview()
+ load_template(S)
+ if(preview_shuttle)
+ preview_template = S
+ user.forceMove(get_turf(preview_shuttle))
+ if("load")
+ if(existing_shuttle == SSshuttle.backup_shuttle)
+ // TODO make the load button disabled
+ WARNING("The shuttle that the selected shuttle will replace \
+ is the backup shuttle. Backup shuttle is required to be \
+ intact for round sanity.")
+ else if(S)
+ . = TRUE
+ // If successful, returns the mobile docking port
+ var/mdp = action_load(S)
+ if(mdp)
+ user.forceMove(get_turf(mdp))
+
+ update_icon()
+
+/obj/machinery/shuttle_manipulator/proc/action_load(
+ datum/map_template/shuttle/loading_template)
+ // Check for an existing preview
+ if(preview_shuttle && (loading_template != preview_template))
+ preview_shuttle.jumpToNullSpace()
+ preview_shuttle = null
+ preview_template = null
+
+ if(!preview_shuttle)
+ load_template(loading_template)
+ preview_template = loading_template
+
+ // get the existing shuttle information, if any
+ var/timer = 0
+ var/mode = SHUTTLE_IDLE
+ var/obj/docking_port/stationary/D
+
+ if(existing_shuttle)
+ timer = existing_shuttle.timer
+ mode = existing_shuttle.mode
+ D = existing_shuttle.get_docked()
+ else
+ D = preview_shuttle.findRoundstartDock()
+
+ if(!D)
+ var/m = "No dock found for preview shuttle, aborting."
+ WARNING(m)
+ throw EXCEPTION(m)
+
+ var/result = preview_shuttle.canDock(D)
+ // truthy value means that it cannot dock for some reason
+ // but we can ignore the someone else docked error because we'll
+ // be moving into their place shortly
+ if(result && (result != SHUTTLE_SOMEONE_ELSE_DOCKED))
+ var/m = "Unsuccessful dock of [preview_shuttle] ([result])."
+ WARNING(m)
+ return
+
+ existing_shuttle.jumpToNullSpace()
+
+ preview_shuttle.dock(D)
+ . = preview_shuttle
+
+ // Shuttle state involves a mode and a timer based on world.time, so
+ // plugging the existing shuttles old values in works fine.
+ preview_shuttle.timer = timer
+ preview_shuttle.mode = mode
+
+ preview_shuttle.register()
+
+ // TODO indicate to the user that success happened, rather than just
+ // blanking the modification tab
+ preview_shuttle = null
+ preview_template = null
+ existing_shuttle = null
+ selected = null
+
+ return preview_shuttle
+
+/obj/machinery/shuttle_manipulator/proc/load_template(
+ datum/map_template/shuttle/S)
+ // load shuttle template, centred at shuttle import landmark,
+ var/turf/landmark_turf = get_turf(locate("landmark*Shuttle Import"))
+ S.load(landmark_turf, centered = TRUE)
+
+ var/affected = S.get_affected_turfs(landmark_turf, centered=TRUE)
+
+ var/found = 0
+ // Search the turfs for docking ports
+ // - We need to find the mobile docking port because that is the heart of
+ // the shuttle.
+ // - We need to check that no additional ports have slipped in from the
+ // template, because that causes unintended behaviour.
+ for(var/T in affected)
+ for(var/obj/docking_port/P in T)
+ if(istype(P, /obj/docking_port/mobile))
+ var/obj/docking_port/mobile/M = P
+ found++
+ if(found > 1)
+ qdel(P, force=TRUE)
+ world.log << "Map warning: Shuttle Template [S.mappath] \
+ has multiple mobile docking ports."
+ else if(!M.timid)
+ // The shuttle template we loaded isn't "timid" which means
+ // it's already registered with the shuttles subsystem.
+ // This is a bad thing.
+ var/m = "Template [S] is non-timid! Unloading."
+ WARNING(m)
+ M.jumpToNullSpace()
+ return
+ else
+ preview_shuttle = P
+ if(istype(P, /obj/docking_port/stationary))
+ world.log << "Map warning: Shuttle Template [S.mappath] has a \
+ stationary docking port."
+ if(!found)
+ var/msg = "load_template(): Shuttle Template [S.mappath] has no \
+ mobile docking port. Aborting import."
+ for(var/T in affected)
+ var/turf/T0 = T
+ T0.empty()
+
+ message_admins(msg)
+ WARNING(msg)
+
+/obj/machinery/shuttle_manipulator/proc/unload_preview()
+ if(preview_shuttle)
+ preview_shuttle.jumpToNullSpace()
+ preview_shuttle = null
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index b0c3f08652d..1d1e3006f45 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -18,18 +18,16 @@
var/dwidth = 0 //position relative to covered area, perpendicular to dir
var/dheight = 0 //position relative to covered area, parallel to dir
- var/i_know_what_im_doing = 0
-
//these objects are indestructable
-/obj/docking_port/Destroy()
+/obj/docking_port/Destroy(force)
// unless you assert that you know what you're doing. Horrible things
// may result.
- if(!i_know_what_im_doing)
- return QDEL_HINT_LETMELIVE
+ if(force)
+ ..()
+ . = QDEL_HINT_HARDDEL_NOW
else
- // If not removed immediately, it can interfere with the docking
- // detection code, which is annoying and inconvinient.
- return QDEL_HINT_HARDDEL_NOW
+ return QDEL_HINT_LETMELIVE
+
/obj/docking_port/singularity_pull()
return
/obj/docking_port/singularity_act()
@@ -187,12 +185,20 @@
var/launch_status = NOLAUNCH
+ // A timid shuttle will not register itself with the shuttle subsystem
+ // All shuttle templates are timid
+ var/timid = FALSE
+
/obj/docking_port/mobile/New()
..()
+ if(!timid)
+ register()
+
+/obj/docking_port/mobile/proc/register()
SSshuttle.mobile += src
-/obj/docking_port/mobile/Destroy()
- if(i_know_what_im_doing)
+/obj/docking_port/mobile/Destroy(force)
+ if(force)
SSshuttle.mobile -= src
. = ..()
@@ -222,29 +228,35 @@
//this is to check if this shuttle can physically dock at dock S
/obj/docking_port/mobile/proc/canDock(obj/docking_port/stationary/S)
if(!istype(S))
- return 1
+ return SHUTTLE_NOT_A_DOCKING_PORT
+
if(istype(S, /obj/docking_port/stationary/transit))
- return 0
- //check dock is big enough to contain us
+ return FALSE
+
if(dwidth > S.dwidth)
- return 2
+ return SHUTTLE_DWIDTH_TOO_LARGE
+
if(width-dwidth > S.width-S.dwidth)
- return 3
+ return SHUTTLE_WIDTH_TOO_LARGE
+
if(dheight > S.dheight)
- return 4
+ return SHUTTLE_DHEIGHT_TOO_LARGE
+
if(height-dheight > S.height-S.dheight)
- return 5
+ return SHUTTLE_HEIGHT_TOO_LARGE
+
//check the dock isn't occupied
var/currently_docked = S.get_docked()
if(currently_docked)
// by someone other than us
if(currently_docked != src)
- return 6
+ return SHUTTLE_SOMEONE_ELSE_DOCKED
else
// This isn't an error, per se, but we can't let the shuttle code
// attempt to move us where we currently are, it will get weird.
return SHUTTLE_ALREADY_DOCKED
- return 0 //0 means we can dock
+
+ return FALSE
//call the shuttle to destination S
/obj/docking_port/mobile/proc/request(obj/docking_port/stationary/S)
@@ -254,13 +266,10 @@
// Triggering shuttle movement code in place is weird
return
else if(status)
- . = status
- spawn(0)
- var/msg = "request(): shuttle [src] cannot dock at [S], \
- error: [status]"
- message_admins(msg)
- throw EXCEPTION(msg)
- return status //we can't dock at S
+ var/msg = "request(): shuttle [src] cannot dock at [S], \
+ error: [status]"
+ message_admins(msg)
+ throw EXCEPTION(msg)
switch(mode)
if(SHUTTLE_CALL)
@@ -330,6 +339,8 @@
var/obj/docking_port/stationary/S0 = get_docked()
var/turf_type = /turf/open/space
var/area_type = /area/space
+ // If the shuttle is docked to a stationary port, restore its normal
+ // "empty" area and turf
if(S0)
if(S0.turf_type)
turf_type = S0.turf_type
@@ -346,25 +357,13 @@
for(var/turf/T0 in L0)
A0.contents += T0
- for(var/i=1, i<=L0.len, ++i)
- var/turf/T0 = L0[i]
+ for(var/i in L0)
+ var/turf/T0 =i
if(!T0)
continue
+ T0.empty(turf_type)
- for(var/atom/AM in T0.GetAllContents())
- if(istype(AM, /mob/dead))
- continue
- qdel(AM)
-
- T0.ChangeTurf(turf_type)
-
- T0.redraw_lighting()
- SSair.remove_from_active(T0)
- T0.CalculateAdjacentTurfs()
- SSair.add_to_active(T0,1)
-
- src.i_know_what_im_doing = TRUE
- qdel(src)
+ qdel(src, force=TRUE)
//this is the main proc. It instantly moves our mobile port to stationary port S1
//it handles all the generic behaviour, such as sanity checks, closing doors on the shuttle, stunning mobs, etc
@@ -372,8 +371,8 @@
// Crashing this ship with NO SURVIVORS
if(!force)
var/status = canDock(S1)
- if(status == 7)
- return SHUTTLE_ALREADY_DOCKED
+ if(status == SHUTTLE_ALREADY_DOCKED)
+ return status
else if(status)
spawn(0)
var/msg = "dock(): shuttle [src] cannot dock at [S1], \
@@ -552,15 +551,25 @@
/obj/docking_port/mobile/proc/roadkill(list/L, dir, x, y)
for(var/turf/T in L)
for(var/atom/movable/AM in T)
- if(ismob(AM))
+ if(isliving(AM))
if(ishuman(AM))
var/mob/living/M = AM
+ M.visible_message("[M] is hit by \
+ a bluespace ripple and thrown clear!",
+ "You feel an immense \
+ crushing pressure as the space around you ripples.\
+ ")
+
M.Paralyse(10)
M.apply_damage(60, BRUTE, "chest")
M.apply_damage(60, BRUTE, "head")
M.anchored = 0
else
var/mob/M = AM
+ M.visible_message("[M] is hit by \
+ a bluespace ripple and is torn into pieces!",
+ "You are torn into pieces by \
+ bluespace churn.")
M.gib()
continue
diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm
new file mode 100644
index 00000000000..9112554fcfd
--- /dev/null
+++ b/code/modules/shuttle/special.dm
@@ -0,0 +1,197 @@
+// Special objects for shuttle templates go here if nowhere else
+
+// Wabbajack statue, a sleeping frog statue that shoots bolts of change if
+// living carbons are put on its altar/tables
+
+/obj/machinery/power/emitter/energycannon/magical
+ name = "wabbajack statue"
+ desc = "Who am I? What is my purpose in life? What do I mean by who am I?"
+ projectile_type = /obj/item/projectile/magic/change
+ icon = 'icons/obj/machines/magic_emitter.dmi'
+ icon_state = "wabbajack_statue"
+ icon_state_on = "wabbajack_statue_on"
+ var/list/active_tables = list()
+ active = FALSE
+
+/obj/machinery/power/emitter/energycannon/magical/New()
+ . = ..()
+ if(prob(50))
+ desc = "Oh no, not again."
+ update_icon()
+
+/obj/machinery/power/emitter/energycannon/magical/update_icon()
+ if(active)
+ icon_state = icon_state_on
+ else
+ icon_state = initial(icon_state)
+
+/obj/machinery/power/emitter/energycannon/magical/process()
+ . = ..()
+ var/changed = FALSE
+ if(active_tables.len >= 2)
+ if(!active)
+ visible_message("\
+ [src] opens its eyes.")
+ changed = TRUE
+ active = TRUE
+ else
+ if(active)
+ visible_message("\
+ [src] closes its eyes.")
+ changed = TRUE
+ active = FALSE
+
+ if(changed)
+ update_icon()
+
+/obj/machinery/power/emitter/energycannon/magical/attack_hand(mob/user)
+ return
+
+/obj/machinery/power/emitter/energycannon/magical/attackby(obj/item/W, mob/user, params)
+ return
+
+/obj/machinery/power/emitter/energycannon/magical/ex_act(severity)
+ return
+
+/obj/machinery/power/emitter/energycannon/magical/emag_act(mob/user)
+ return
+
+/obj/structure/table/abductor/wabbajack
+ name = "wabbajack altar"
+ health = 1000
+ verb_say = "chants"
+ var/obj/machinery/power/emitter/energycannon/magical/our_statue
+ var/list/mob/living/sleepers = list()
+ var/never_spoken = TRUE
+ flags = NODECONSTRUCT
+
+/obj/structure/table/abductor/wabbajack/New()
+ . = ..()
+ SSobj.processing += src
+
+/obj/structure/table/abductor/wabbajack/Destroy()
+ SSobj.processing -= src
+ . = ..()
+
+/obj/structure/table/abductor/wabbajack/process()
+ var/area = orange(4, src)
+ if(!our_statue)
+ for(var/obj/machinery/power/emitter/energycannon/magical/M in area)
+ our_statue = M
+ break
+
+ var/turf/T = get_turf(src)
+ var/list/found = list()
+ for(var/mob/living/carbon/C in T)
+ if(C.stat != DEAD)
+ found += C
+
+ // New sleepers
+ for(var/i in found - sleepers)
+ var/mob/living/L = i
+ L.color = "#800080"
+ L.visible_message("A strange purple glow \
+ wraps itself around [L] as they suddenly fall unconcious.",
+ "[desc]")
+
+
+ // Existing sleepers
+ for(var/i in found)
+ var/mob/living/L = i
+ L.SetSleeping(10)
+
+ // Missing sleepers
+ for(var/i in sleepers - found)
+ var/mob/living/L = i
+ L.color = initial(L.color)
+ L.visible_message("The glow from [L] fades \
+ away.")
+
+ sleepers = found
+
+ if(sleepers.len)
+ our_statue.active_tables |= src
+ if(never_spoken || prob(5))
+ say(desc)
+ never_spoken = FALSE
+ else
+ our_statue.active_tables &= src
+
+/obj/structure/table/abductor/wabbajack/left
+ desc = "You sleep so it may wake."
+
+/obj/structure/table/abductor/wabbajack/right
+ desc = "It wakes so you may sleep."
+
+// Bar staff, GODMODE mobs that just want to make sure people have drinks
+// and a good time.
+
+/mob/living/simple_animal/drone/snowflake/bardrone
+ name = "Bardrone"
+ desc = "A barkeeping drone, an indestructible robot built to tend bars."
+ seeStatic = FALSE
+ laws = "1. Serve drinks.\n\
+ 2. Talk to patrons.\n\
+ 3. Don't get messed up in their affairs."
+ languages = ALL
+ status_flags = GODMODE // Please don't punch the barkeeper
+ unique_name = FALSE // disables the (123) number suffix
+
+/mob/living/simple_animal/drone/snowflake/bardrone/New()
+ . = ..()
+ access_card.access |= access_cent_bar
+
+/mob/living/simple_animal/hostile/alien/maid/barmaid
+ gold_core_spawnable = 0
+ name = "Barmaid"
+ desc = "A barmaid, a maiden found in a bar."
+ pass_flags = PASSTABLE
+ status_flags = GODMODE
+ languages = ALL
+ unique_name = FALSE
+ AIStatus = AI_OFF
+ stop_automated_movement = TRUE
+
+/mob/living/simple_animal/hostile/alien/maid/barmaid/New()
+ . = ..()
+ access_card = new /obj/item/weapon/card/id(src)
+ var/datum/job/captain/C = new /datum/job/captain
+ access_card.access = C.get_access()
+ access_card.access |= access_cent_bar
+ access_card.flags |= NODROP
+
+/mob/living/simple_animal/hostile/alien/maid/barmaid/Destroy()
+ qdel(access_card)
+ . = ..()
+
+// Bar table, a wooden table that kicks you in a direction if you're not
+// barstaff (defined as someone who was a roundstart bartender or someone
+// with CENTCOM_BARSTAFF)
+
+/obj/structure/table/wood/bar
+ burn_state = LAVA_PROOF
+ flags = NODECONSTRUCT
+ health = 1000
+ var/boot_dir = 1
+
+/obj/structure/table/wood/bar/Crossed(atom/movable/AM)
+ if(isliving(AM) && !is_barstaff(AM))
+ // No climbing on the bar please
+ var/mob/living/M = AM
+ var/throwtarget = get_edge_target_turf(src, boot_dir)
+ M.Weaken(2)
+ M.throw_at_fast(throwtarget, 5, 1,src)
+ M << "No climbing on the bar please."
+ else
+ . = ..()
+
+/obj/structure/table/wood/bar/proc/is_barstaff(mob/living/user)
+ . = FALSE
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(H.mind && H.mind.assigned_role == "Bartender")
+ return TRUE
+
+ var/obj/item/weapon/card/id/ID = user.get_idcard()
+ if(ID && (access_cent_bar in ID.access))
+ return TRUE
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index 2bb0a1d1c35..8aed478964e 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -39,8 +39,8 @@
var/contraband = FALSE
var/emagged = FALSE
-/obj/docking_port/mobile/supply/New()
- ..()
+/obj/docking_port/mobile/supply/register()
+ . = ..()
SSshuttle.supply = src
/obj/docking_port/mobile/supply/canMove()
diff --git a/code/modules/space transition/space_transition.dm b/code/modules/space_transition/space_transition.dm
similarity index 100%
rename from code/modules/space transition/space_transition.dm
rename to code/modules/space_transition/space_transition.dm
diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm
index 07623aad297..9afa9929390 100644
--- a/code/modules/spells/spell_types/ethereal_jaunt.dm
+++ b/code/modules/spells/spell_types/ethereal_jaunt.dm
@@ -27,7 +27,7 @@
animation.density = 0
animation.anchored = 1
animation.icon = 'icons/mob/mob.dmi'
- animation.layer = 5
+ animation.layer = FLY_LAYER
animation.master = holder
target.ExtinguishMob()
if(target.buckled)
diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm
index 6c758a542d3..63fbc29203d 100644
--- a/code/modules/surgery/bodyparts/head.dm
+++ b/code/modules/surgery/bodyparts/head.dm
@@ -5,7 +5,7 @@
max_damage = 200
body_zone = "head"
body_part = HEAD
- layer = 4.1 //so it isn't hidden behind some objects when on the floor
+ layer = ABOVE_MOB_LAYER //so it isn't hidden behind some objects when on the floor
w_class = 4 //Quite a hefty load
slowdown = 1 //Balancing measure
throw_range = 2 //No head bowling
@@ -35,7 +35,8 @@
playsound(T, 'sound/misc/splort.ogg', 50, 1, -1)
for(var/obj/item/I in src)
if(I == brain)
- user.visible_message("[user] saws [src] open and pulls out a brain!", "You saw [src] open and pull out a brain.")
+ if(user)
+ user.visible_message("[user] saws [src] open and pulls out a brain!", "You saw [src] open and pull out a brain.")
if(brainmob)
brainmob.container = null
brainmob.loc = brain
@@ -159,3 +160,7 @@
if(standing.len)
return standing
+
+/obj/item/bodypart/head/burn()
+ drop_organs()
+ ..()
diff --git a/code/modules/surgery/limb augmentation.dm b/code/modules/surgery/limb_augmentation.dm
similarity index 100%
rename from code/modules/surgery/limb augmentation.dm
rename to code/modules/surgery/limb_augmentation.dm
diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm
index 6244f000bcf..ee21dfd1206 100644
--- a/code/modules/tgui/states.dm
+++ b/code/modules/tgui/states.dm
@@ -16,14 +16,22 @@
**/
/datum/proc/ui_status(mob/user, datum/ui_state/state)
var/src_object = ui_host()
+ . = UI_CLOSE
+ if(!state)
+ return
- if(istype(user, /mob/dead/observer)) // Special-case ghosts.
+ if(istype(user, /mob/dead/observer))
+ // If they turn on ghost AI control, admins can always interact.
if(IsAdminGhost(user))
- return UI_INTERACTIVE // If they turn it on, admins can interact.
+ . = max(., UI_INTERACTIVE)
+
+ // Regular ghosts can always at least view if in range.
if(get_dist(src_object, src) < user.client.view)
- return UI_UPDATE // Regular ghosts can only view.
- return UI_CLOSE // To keep too many UIs from being opened.
- return state.can_use_topic(src_object, user) // Check if the state allows interaction.
+ . = max(., UI_UPDATE)
+
+ // Check if the state allows interaction
+ var/result = state.can_use_topic(src_object, user)
+ . = max(., result)
/**
* private
diff --git a/code/modules/tgui/states/human_adjacent.dm b/code/modules/tgui/states/human_adjacent.dm
new file mode 100644
index 00000000000..feedd457020
--- /dev/null
+++ b/code/modules/tgui/states/human_adjacent.dm
@@ -0,0 +1,17 @@
+
+ /**
+ * tgui state: human_adjacent_state
+ *
+ * In addition to default checks, only allows interaction for a
+ * human adjacent user.
+ **/
+
+/var/global/datum/ui_state/human_adjacent_state/human_adjacent_state = new()
+
+/datum/ui_state/human_adjacent_state/can_use_topic(src_object, mob/user)
+ . = user.default_can_use_topic(src_object)
+
+ var/dist = get_dist(src_object, user)
+ if((dist > 1) || (!ishuman(user)))
+ // Can't be used unless adjacent and human, even with TK
+ . = min(., UI_UPDATE)
diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm
index 01d440dec03..bf77878eae0 100644
--- a/code/modules/vehicles/atv.dm
+++ b/code/modules/vehicles/atv.dm
@@ -14,7 +14,7 @@
..()
if(!atvcover)
atvcover = image("icons/obj/vehicles.dmi", "atvcover")
- atvcover.layer = MOB_LAYER + 0.1
+ atvcover.layer = ABOVE_MOB_LAYER
obj/vehicle/atv/post_buckle_mob(mob/living/M)
@@ -26,7 +26,7 @@ obj/vehicle/atv/post_buckle_mob(mob/living/M)
/obj/vehicle/atv/handle_vehicle_layer()
if(dir == SOUTH)
- layer = MOB_LAYER+0.1
+ layer = ABOVE_MOB_LAYER
else
layer = OBJ_LAYER
@@ -51,13 +51,13 @@ obj/vehicle/atv/post_buckle_mob(mob/living/M)
/obj/vehicle/atv/turret/handle_vehicle_layer()
if(dir == SOUTH)
- layer = MOB_LAYER+0.1
+ layer = ABOVE_MOB_LAYER
else
layer = OBJ_LAYER
if(turret)
if(dir == NORTH)
- turret.layer = MOB_LAYER+0.1
+ turret.layer = ABOVE_MOB_LAYER
else
turret.layer = OBJ_LAYER
diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm
index 2e02313105e..e894e3c1c4a 100644
--- a/code/modules/vehicles/scooter.dm
+++ b/code/modules/vehicles/scooter.dm
@@ -15,7 +15,7 @@
/obj/vehicle/scooter/handle_vehicle_layer()
if(dir == SOUTH)
- layer = MOB_LAYER+0.1
+ layer = ABOVE_MOB_LAYER
else
layer = OBJ_LAYER
diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm
index 8f374cd6213..7602f9f4356 100644
--- a/code/modules/vehicles/speedbike.dm
+++ b/code/modules/vehicles/speedbike.dm
@@ -2,7 +2,7 @@
name = "Speedbike"
icon = 'icons/obj/bike.dmi'
icon_state = "speedbike_blue"
- layer = MOB_LAYER - 0.1
+ layer = LYING_MOB_LAYER
keytype = null
vehicle_move_delay = 0
var/overlay_state = "cover_blue"
@@ -11,13 +11,13 @@
/obj/vehicle/space/speedbike/New()
..()
overlay = image("icons/obj/bike.dmi", overlay_state)
- overlay.layer = MOB_LAYER + 0.1
+ overlay.layer = ABOVE_MOB_LAYER
overlays += overlay
/obj/effect/overlay/temp/speedbike_trail
name = "speedbike trails"
icon_state = "ion_fade"
- layer = MOB_LAYER - 0.2
+ layer = BELOW_MOB_LAYER
duration = 10
randomdir = 0
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index 2b9890ee8c7..96582344dfc 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -27,7 +27,7 @@
//APPEARANCE
/obj/vehicle/proc/handle_vehicle_layer()
if(dir != NORTH)
- layer = MOB_LAYER+0.1
+ layer = ABOVE_MOB_LAYER
else
layer = OBJ_LAYER
@@ -109,7 +109,7 @@
/obj/vehicle/Move(NewLoc,Dir=0,step_x=0,step_y=0)
- ..()
+ . = ..()
handle_vehicle_layer()
handle_vehicle_offsets()
diff --git a/code/orphaned procs/AStar.dm b/code/orphaned_procs/AStar.dm
similarity index 100%
rename from code/orphaned procs/AStar.dm
rename to code/orphaned_procs/AStar.dm
diff --git a/code/orphaned procs/dbcore.dm b/code/orphaned_procs/dbcore.dm
similarity index 100%
rename from code/orphaned procs/dbcore.dm
rename to code/orphaned_procs/dbcore.dm
diff --git a/code/orphaned procs/priority_announce.dm b/code/orphaned_procs/priority_announce.dm
similarity index 100%
rename from code/orphaned procs/priority_announce.dm
rename to code/orphaned_procs/priority_announce.dm
diff --git a/code/orphaned procs/statistics.dm b/code/orphaned_procs/statistics.dm
similarity index 100%
rename from code/orphaned procs/statistics.dm
rename to code/orphaned_procs/statistics.dm
diff --git a/config/game_options.txt b/config/game_options.txt
index eea6aaa7b11..696eb46c1f8 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -312,7 +312,8 @@ ROUNDSTART_RACES plasmaman
ASSISTANT_CAP -1
## Starlight for exterior walls and breaches. Uncomment for starlight!
-STARLIGHT
+## This is disabled by default to make testing quicker, should be enabled on production servers or testing servers messing with lighting
+#STARLIGHT
## Uncomment to bring back old grey suit assistants instead of the now default rainbow colored assistants.
#GREY_ASSISTANTS
diff --git a/html/changelog.html b/html/changelog.html
index f22bf3dff95..9ec961fc313 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,49 @@
-->
+
27 May 2016
+
coiax updated:
+
+
Gatling gun removed from R&D for pressing ceremonial reasons.
+
+
phil235 updated:
+
+
Pull and Grab are merged together. Pulling stays unchanged. Using an empty hand with grab intent on a mob will pull them. Using an empty hand with grab intent on a mob that you're already pulling will try to upgrade your grip to aggressive grab>neck grab>kill grab. Aggressive grabs no longer stun you, but they act exactly like a handcuff, preventing you from using your hands until you escape the grip. You can break free from the grip by trying to move or using the resist button.
+
Someone pulling a restrained mob now swap position with them instead of getting blocked by the mob, unable to even push them.
+
+
+
26 May 2016
+
Xhuis updated:
+
+
Purge all untruths and honor Ratvar.
+
+
coiax updated:
+
+
Fixes bug where bolt of change to the host would kill an attached guardian.
+
Fixes bug where bolt of change to laughter demon would not release its friends.
+
Fixes bug where bolt of change to morphling would not release its contents.
+
Fixes bug where bolt of change transforming someone into a drone would not give them hacked laws and vision.
+
Blobbernauts created by a staff of change are now "independent" and will not decay if seperated from a blob or missing a factory.
+
Independent blobbernauts added to gold slime core spawn pool.
+
Medical scanners now inform the user if the dead subject is within the (currently) 120 second defib window.
+
Ghosts now have the "Restore Character Name" verb, which will set their ghost appearance and dead chat name to their character preferences.
+
Mob spawners now give any generated names to the mind of the spawned mob, meaning ghosts will have the name they had in life.
+
Fixes interaction with envy's knife and lavaland spawns.
+
Fixes a bug where swarmers teleporting humans would incorrectly display a visible message about restraints breaking.
+
Emagging the emergency shuttle computer with less than ten seconds until launch no longer gives additional time.
+
The emergency shuttle computer now reads the ID in your ID slot, rather than your hand.
+
+
+
24 May 2016
+
Joan updated:
+
+
You can no longer scribe the Summon Nar-Sie rune under non-valid conditions.
+
+
Kiazusho updated:
+
+
Added three new advanced syringes to R&D
+
+
23 May 2016
CoreOverload updated:
@@ -455,147 +498,6 @@
Nanotrasen has released Cards Against Spess! Visit your local library for a copy. Warning: may cause breakage of the fourth wall.
-
-
29 April 2016
-
Bawhoppen updated:
-
-
Several lesser-used uplink's TC cost have been rebalanced.
-
Steckhin down from 9TC to 7TC.
-
Tactical medkit down from 9TC to 4TC.
-
Syndicate magboots from 3TC to 2TC.
-
Powersinks down from 10TC to 6TC.
-
Stealth rad-laser down from 5TC to 3TC.
-
Bundles have been updated accordingly.
-
-
Incoming5643 updated:
-
-
The staff/wand of door creation can now also be used to open airlock doors.
-
Doors spawned by the staff/wand now start open. Keep this in mind the next time you try to turn every wall on the escape shuttle into a door.
-
-
Robustin updated:
-
-
The Teleport Other, Veil, Imbue, Reveal, Disguise, Blood Drain, Timestop, Stun, Deafen, Blind, Armaments, Construct Shell and Summon Tome runes are gone.
-
Disguise, Veil/Reveal, Construct Shell and Armaments are now talismans. The Construction talisman requires 25 sheets of metal.
-
Cultists will now receive a warning when attempting to use emergency communion or create the Nar-Sie rune
-
Cultists can now create talismans with a super-simple Talisman-Creation rune. It takes about 10 seconds to invoke and will present a menu of all the talisman choices available. Its as simple as tossing the paper on, clicking the rune, and selecting your talisman.
-
Cultists now have a proc, "How to Play" that will give a basic explanation of how to succeed as a cultist.
-
The new Talisman of Horror is a stealthy talisman that will cause hallucinations in the victim. Great for undermining security without having to commit to murder them in middle of the hall.
-
Creating the Summon Nar-Sie rune does takes slightly less time, but now adds a 3x3 square of red barrier shields (60hp each) to prevent the rune-scriber from being bumped by other idiots. This works in conjunction with the rune's warning to give crew a chance to stop the summoning. Manifest ghost has a weaker 1x1 shield to prevent bumps as well.
-
Talismans are now color-coded by their effect so you can easily organize and deploy talismans.
-
You can now make colored paper in the washing machine using crayons or stamps, honk.
-
The Electromagnetic Disruption rune will now scale with the number of cultists invoking the rune. **A full 9-cultist invocation will EMP the entire station!**
-
Armaments will now give the recipient a new cult bola.
-
The new Talisman of Shackling will apply handcuffs directly to the victim. These cuffs will disappear when removed.
-
Cult slur is a little less potent so victims might be able to squeeze in a coherent word or two if you let them keep jabbering on the radio, stun talismans now have less of a health cost and the stun is back to 10 seconds, from 9.
-
Rune and Talisman names now give a much clearer idea of what they do.
-
The following changes are courtesy of ChangelingRain
-
The Teleport rune now allows cultists to select which rune to teleport to, and teleports everything on it.
-
Veil and Reveal are merged into Talisman of Veiling. Veiling has two uses, the first use will hide and the second use will reveal.
-
New icons for the cult bola
-
You can now attack fellow cultists with a Talisman of Arming to arm them with robes and a sword.
-
You can now only place one rune per tile.
-
Ghosts are notified when a new manifest rune is created.
-
-
TechnoAlchemisto updated:
-
-
Sinew can now be fashioned into restraints.
-
-
coiax updated:
-
-
Internals Crate now contains breath masks and small tanks.
-
Metal foam grenade box crate added for 1000 points
-
Added two Engineering Mesons to Engineering Gear Crate
-
Engineering Gear now costs 1300
-
Breach Shield Generator Crate added for 2500 points
-
Grounding Rod Crate added for 1700 points
-
PACMAN Generator Crate added for 2500
-
Defibrillator Crate added for 2500
-
Added more helmets to the Laser Tag Crate.
-
Nanotrasen Customs report that some wide band suppliers have been providing "alternative" firing pins. Nanotrasen reminds all crewmembers that contraband is contraband.
-
Contraband crates now appear visually similar to legitimate crates.
-
The cargo shuttle's normal transit time has been restored.
-
-
nullbear updated:
-
-
Adds a preference option, allowing players to toggle whether recipes with no matching components should be hidden.
-
-
-
28 April 2016
-
Bawhoppen updated:
-
-
Sandbags are no longer tablecrafted. Now you just put in sand (or ash) by hand to make them.
-
Miners and Engis now get boxes of empty sandbags in their lockers. Miners also get a few premade aswell.
-
You can now break sandstone down into normal sand.
-
-
Joan updated:
-
-
Attacking a blob with an analyzer will tell you what its chemical does, its health, and a small fact about the blob analyzed.
-
NERFS:
-
Zombifying Feelers does less toxin damage.
-
Adaptive Nexuses does slightly less brute damage.
-
Replicating Foam does slightly less brute damage.
-
Blob Sorium does slightly less brute damage.
-
Blob Dark Matter does slightly less brute damage.
-
Cyrogenic Liquid injects slightly less frost oil and ice and does slightly less stamina damage.
-
Pressurized Slime does less brute, oxygen, and stamina damage, and extinguishes objects and people on turfs it wets.
-
Blob core strong blobs no longer give points when removed.
-
PROBABLY BUFFS:
-
Flammable Goo now does slightly more burn damage and applies more firestacks, but applies fire to blob tiles that don't share its chemical.
-
Energized Fibers does slightly more burn damage, slightly less stamina damage, and now takes damage from EMPs.
-
BUFFS:
-
Boiling Oil does slightly more burn damage and applies more firestacks.
-
Reactive Gelatin does slightly more damage on average.
-
Penetrating Spines now also ignores bio resistance in addition to armor.
-
Hallucinogenic Nectar causes more hallucinations.
-
Normal strong blobs now refund 4 points when removed, from 2.
-
Charger holoparasites now play a sound when hitting a target, as well as shaking the target's camera.
-
-
PKPenguin321 updated:
-
-
The warden's locker now contains krav maga gloves.
-
-
TechnoAlchemisto updated:
-
-
You can now craft skull helmets from bones.
-
Syndicate bombs are now harder to detect
-
-
-
27 April 2016
-
TechnoAlchemisto updated:
-
-
Miners can now select explorer belts from the mining vendor using their vouchers, or mining points.
-
-
-
26 April 2016
-
Iamgoofball & Super Aggro Crag updated:
-
-
Fluorosulfuric Acid now has doubled acid power.
-
Fluorosulfuric Acid now does BONUS burn damage scaling on the time it's been inside the consumer.
-
-
Joan updated:
-
-
Blobbernauts now spawn at half health.
-
Blobbernauts regeneration on blob is now 2.5 health per tick, from 5.
-
Blobbernauts now cost 40 resources to produce, from 30.
-
Factories supporting blobbernauts do not spawn spores.
-
-
Lati updated:
-
-
Syndicate bomb can be only delayed once by pulsing the delay wire. Time gained from this is changed from 10 seconds to 30 seconds.
-
-
TechnoAlchemisto updated:
-
-
Goliath plates can now be stacked.
-
-
phil235 updated:
-
-
More structures and machines are now breakable and/or destroyable with melee weapon. Additionally, Some structures and machines that are already breakable/destroyable are now affected by more attack methods (gun projectiles, thrown items, melee weapons, xeno/animal attacks, explosions).
-
Hitting any machine now always makes a sound.
-
You can hit closed closets/crates and doors by using an item on harm intent (but it doesn't actually hurt them).
-
you can now burst filled water balloons with sharp items.
-
Wooden barricade drops wood when destroyed.
-
Slot machines with coins inside are deconstructable now.
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 5da3dc3e139..7cc6ca65750 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -5144,3 +5144,47 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: 'Cookie Synthesizer: Self recharging RCD that prints out cookies!'
- tweak: Nanotrasen scientists have added a hugging module to medical and peacekeeper
cyborgs to boost emotions during human-cyborg interaction.
+2016-05-24:
+ Joan:
+ - rscdel: You can no longer scribe the Summon Nar-Sie rune under non-valid conditions.
+ Kiazusho:
+ - rscadd: Added three new advanced syringes to R&D
+2016-05-26:
+ Xhuis:
+ - rscadd: Purge all untruths and honor Ratvar.
+ coiax:
+ - bugfix: Fixes bug where bolt of change to the host would kill an attached guardian.
+ - bugfix: Fixes bug where bolt of change to laughter demon would not release its
+ friends.
+ - bugfix: Fixes bug where bolt of change to morphling would not release its contents.
+ - bugfix: Fixes bug where bolt of change transforming someone into a drone would
+ not give them hacked laws and vision.
+ - bugfix: Blobbernauts created by a staff of change are now "independent" and will
+ not decay if seperated from a blob or missing a factory.
+ - rscadd: Independent blobbernauts added to gold slime core spawn pool.
+ - rscadd: Medical scanners now inform the user if the dead subject is within the
+ (currently) 120 second defib window.
+ - rscadd: Ghosts now have the "Restore Character Name" verb, which will set their
+ ghost appearance and dead chat name to their character preferences.
+ - bugfix: Mob spawners now give any generated names to the mind of the spawned mob,
+ meaning ghosts will have the name they had in life.
+ - bugfix: Fixes interaction with envy's knife and lavaland spawns.
+ - bugfix: Fixes a bug where swarmers teleporting humans would incorrectly display
+ a visible message about restraints breaking.
+ - rscdel: Emagging the emergency shuttle computer with less than ten seconds until
+ launch no longer gives additional time.
+ - rscadd: The emergency shuttle computer now reads the ID in your ID slot, rather
+ than your hand.
+2016-05-27:
+ coiax:
+ - rscdel: Gatling gun removed from R&D for pressing ceremonial reasons.
+ phil235:
+ - tweak: Pull and Grab are merged together. Pulling stays unchanged. Using an empty
+ hand with grab intent on a mob will pull them. Using an empty hand with grab
+ intent on a mob that you're already pulling will try to upgrade your grip to
+ aggressive grab>neck grab>kill grab. Aggressive grabs no longer stun you, but
+ they act exactly like a handcuff, preventing you from using your hands until
+ you escape the grip. You can break free from the grip by trying to move or using
+ the resist button.
+ - tweak: Someone pulling a restrained mob now swap position with them instead of
+ getting blocked by the mob, unable to even push them.
diff --git a/icons/effects/400x400.dmi b/icons/effects/400x400.dmi
new file mode 100644
index 00000000000..c3fe60bc09c
Binary files /dev/null and b/icons/effects/400x400.dmi differ
diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi
index f4b379bd074..d9724cd6f16 100644
Binary files a/icons/mob/actions.dmi and b/icons/mob/actions.dmi differ
diff --git a/icons/obj/flamethrower.dmi b/icons/obj/flamethrower.dmi
index dd470c47809..748737acff8 100644
Binary files a/icons/obj/flamethrower.dmi and b/icons/obj/flamethrower.dmi differ
diff --git a/icons/obj/machines/magic_emitter.dmi b/icons/obj/machines/magic_emitter.dmi
new file mode 100644
index 00000000000..1c85aa70712
Binary files /dev/null and b/icons/obj/machines/magic_emitter.dmi differ
diff --git a/icons/obj/machines/shuttle_manipulator.dmi b/icons/obj/machines/shuttle_manipulator.dmi
new file mode 100644
index 00000000000..ad91b1677b1
Binary files /dev/null and b/icons/obj/machines/shuttle_manipulator.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 71f5dd61908..219bb139c66 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi
index 7730f914edd..9a130739353 100644
Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ
diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm
index b2cde1ea35b..c27f5c38893 100644
--- a/interface/stylesheet.dm
+++ b/interface/stylesheet.dm
@@ -73,6 +73,10 @@ h1.alert, h2.alert {color: #000000;}
.holoparasite {color: #35333a;}
.holoparasitebold {color: #35333a; font-weight: bold;}
+.brass {color: #BE8700;}
+.heavy_brass {color: #BE8700; font-weight: bold; font-style: italic;}
+.large_brass {color: #BE8700; font-size: 3;}
+
.revennotice {color: #1d2953;}
.revenboldnotice {color: #1d2953; font-weight: bold;}
.revenbignotice {color: #1d2953; font-weight: bold; font-size: 3;}
@@ -93,7 +97,7 @@ h1.alert, h2.alert {color: #000000;}
.papyrus {font-family: "Papyrus", cursive, sans-serif;}
.robot {font-family: "Courier New", cursive, sans-serif;}
-.command_headset {font-weight: bold; font-size: 3; }
+.command_headset {font-weight: bold; font-size: 3;}
.big {font-size: 3;}
.reallybig {font-size: 4;}
.greentext {color: #00FF00; font-size: 3;}
diff --git a/sound/effects/clockcult_gateway_active.ogg b/sound/effects/clockcult_gateway_active.ogg
new file mode 100644
index 00000000000..86487e3bdd4
Binary files /dev/null and b/sound/effects/clockcult_gateway_active.ogg differ
diff --git a/sound/effects/clockcult_gateway_charging.ogg b/sound/effects/clockcult_gateway_charging.ogg
new file mode 100644
index 00000000000..1c4e55538ce
Binary files /dev/null and b/sound/effects/clockcult_gateway_charging.ogg differ
diff --git a/sound/effects/clockcult_gateway_closing.ogg b/sound/effects/clockcult_gateway_closing.ogg
new file mode 100644
index 00000000000..1c69f386834
Binary files /dev/null and b/sound/effects/clockcult_gateway_closing.ogg differ
diff --git a/sound/effects/clockcult_gateway_disrupted.ogg b/sound/effects/clockcult_gateway_disrupted.ogg
new file mode 100644
index 00000000000..7ab734dc6c8
Binary files /dev/null and b/sound/effects/clockcult_gateway_disrupted.ogg differ
diff --git a/sound/effects/light_flicker.ogg b/sound/effects/light_flicker.ogg
new file mode 100644
index 00000000000..58be2c6ebda
Binary files /dev/null and b/sound/effects/light_flicker.ogg differ
diff --git a/sound/effects/ratvar_rises.ogg b/sound/effects/ratvar_rises.ogg
new file mode 100644
index 00000000000..6201ce790d6
Binary files /dev/null and b/sound/effects/ratvar_rises.ogg differ
diff --git a/sound/hallucinations/im_here1.ogg b/sound/hallucinations/im_here1.ogg
index b3a7142365e..7a671739b89 100644
Binary files a/sound/hallucinations/im_here1.ogg and b/sound/hallucinations/im_here1.ogg differ
diff --git a/sound/hallucinations/im_here2.ogg b/sound/hallucinations/im_here2.ogg
index bd841bcdb14..1e289d53f87 100644
Binary files a/sound/hallucinations/im_here2.ogg and b/sound/hallucinations/im_here2.ogg differ
diff --git a/sound/hallucinations/turn_around1.ogg b/sound/hallucinations/turn_around1.ogg
index 7a83755a93f..ce54f1944e4 100644
Binary files a/sound/hallucinations/turn_around1.ogg and b/sound/hallucinations/turn_around1.ogg differ
diff --git a/sound/hallucinations/turn_around2.ogg b/sound/hallucinations/turn_around2.ogg
index f4328458dd9..2c3c49466d5 100644
Binary files a/sound/hallucinations/turn_around2.ogg and b/sound/hallucinations/turn_around2.ogg differ
diff --git a/sound/magic/clockwork/anima_fragment_attack.ogg b/sound/magic/clockwork/anima_fragment_attack.ogg
new file mode 100644
index 00000000000..2c539292cba
Binary files /dev/null and b/sound/magic/clockwork/anima_fragment_attack.ogg differ
diff --git a/sound/magic/clockwork/anima_fragment_death.ogg b/sound/magic/clockwork/anima_fragment_death.ogg
new file mode 100644
index 00000000000..d209bff5a28
Binary files /dev/null and b/sound/magic/clockwork/anima_fragment_death.ogg differ
diff --git a/sound/magic/clockwork/fellowship_armory.ogg b/sound/magic/clockwork/fellowship_armory.ogg
new file mode 100644
index 00000000000..c108d4621c6
Binary files /dev/null and b/sound/magic/clockwork/fellowship_armory.ogg differ
diff --git a/sound/magic/clockwork/invoke_general.ogg b/sound/magic/clockwork/invoke_general.ogg
new file mode 100644
index 00000000000..6f0c0dd097a
Binary files /dev/null and b/sound/magic/clockwork/invoke_general.ogg differ
diff --git a/sound/magic/clockwork/narsie_attack.ogg b/sound/magic/clockwork/narsie_attack.ogg
new file mode 100644
index 00000000000..89fac778058
Binary files /dev/null and b/sound/magic/clockwork/narsie_attack.ogg differ
diff --git a/sound/magic/clockwork/ratvar_attack.ogg b/sound/magic/clockwork/ratvar_attack.ogg
new file mode 100644
index 00000000000..1c17fe10510
Binary files /dev/null and b/sound/magic/clockwork/ratvar_attack.ogg differ
diff --git a/sound/misc/compiler-failure.ogg b/sound/misc/compiler-failure.ogg
new file mode 100755
index 00000000000..682e333bcb4
Binary files /dev/null and b/sound/misc/compiler-failure.ogg differ
diff --git a/sound/misc/compiler-stage1.ogg b/sound/misc/compiler-stage1.ogg
new file mode 100755
index 00000000000..997268b2f5b
Binary files /dev/null and b/sound/misc/compiler-stage1.ogg differ
diff --git a/sound/misc/compiler-stage2.ogg b/sound/misc/compiler-stage2.ogg
new file mode 100755
index 00000000000..66e8e523485
Binary files /dev/null and b/sound/misc/compiler-stage2.ogg differ
diff --git a/sound/misc/server-ready.ogg b/sound/misc/server-ready.ogg
new file mode 100755
index 00000000000..216533b6f32
Binary files /dev/null and b/sound/misc/server-ready.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index ab39dfc0af5..9f147302728 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -33,6 +33,7 @@
#include "code\__DEFINES\genetics.dm"
#include "code\__DEFINES\hud.dm"
#include "code\__DEFINES\is_helpers.dm"
+#include "code\__DEFINES\layers.dm"
#include "code\__DEFINES\machines.dm"
#include "code\__DEFINES\math.dm"
#include "code\__DEFINES\misc.dm"
@@ -43,6 +44,7 @@
#include "code\__DEFINES\reagents.dm"
#include "code\__DEFINES\role_preferences.dm"
#include "code\__DEFINES\say.dm"
+#include "code\__DEFINES\shuttles.dm"
#include "code\__DEFINES\sight.dm"
#include "code\__DEFINES\stat.dm"
#include "code\__DEFINES\tablecrafting.dm"
@@ -258,7 +260,7 @@
#include "code\game\sound.dm"
#include "code\game\area\ai_monitored.dm"
#include "code\game\area\areas.dm"
-#include "code\game\area\Space Station 13 areas.dm"
+#include "code\game\area\Space_Station_13_areas.dm"
#include "code\game\gamemodes\antag_hud.dm"
#include "code\game\gamemodes\antag_spawner.dm"
#include "code\game\gamemodes\events.dm"
@@ -307,6 +309,13 @@
#include "code\game\gamemodes\changeling\powers\strained_muscles.dm"
#include "code\game\gamemodes\changeling\powers\tiny_prick.dm"
#include "code\game\gamemodes\changeling\powers\transform.dm"
+#include "code\game\gamemodes\clock_cult\__clock_defines.dm"
+#include "code\game\gamemodes\clock_cult\clock_cult.dm"
+#include "code\game\gamemodes\clock_cult\clock_mobs.dm"
+#include "code\game\gamemodes\clock_cult\clock_objects.dm"
+#include "code\game\gamemodes\clock_cult\clock_ratvar.dm"
+#include "code\game\gamemodes\clock_cult\clock_scripture.dm"
+#include "code\game\gamemodes\clock_cult\clock_unsorted.dm"
#include "code\game\gamemodes\cult\cult.dm"
#include "code\game\gamemodes\cult\cult_comms.dm"
#include "code\game\gamemodes\cult\cult_items.dm"
@@ -820,7 +829,7 @@
#include "code\modules\admin\stickyban.dm"
#include "code\modules\admin\topic.dm"
#include "code\modules\admin\watchlist.dm"
-#include "code\modules\admin\DB ban\functions.dm"
+#include "code\modules\admin\DB_ban\functions.dm"
#include "code\modules\admin\permissionverbs\permissionedit.dm"
#include "code\modules\admin\verbs\adminhelp.dm"
#include "code\modules\admin\verbs\adminjump.dm"
@@ -851,7 +860,6 @@
#include "code\modules\admin\verbs\pray.dm"
#include "code\modules\admin\verbs\randomverbs.dm"
#include "code\modules\admin\verbs\reestablish_db_connection.dm"
-#include "code\modules\admin\verbs\shuttles.dm"
#include "code\modules\admin\verbs\tripAI.dm"
#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm"
#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm"
@@ -957,9 +965,9 @@
#include "code\modules\cargo\exports\weapons.dm"
#include "code\modules\chatter\chatter.dm"
#include "code\modules\client\asset_cache.dm"
-#include "code\modules\client\client defines.dm"
-#include "code\modules\client\client procs.dm"
#include "code\modules\client\client_colour.dm"
+#include "code\modules\client\client_defines.dm"
+#include "code\modules\client\client_procs.dm"
#include "code\modules\client\message.dm"
#include "code\modules\client\preferences.dm"
#include "code\modules\client\preferences_savefile.dm"
@@ -1080,53 +1088,53 @@
#include "code\modules\flufftext\Dreaming.dm"
#include "code\modules\flufftext\Hallucination.dm"
#include "code\modules\flufftext\TextFilters.dm"
-#include "code\modules\food&drinks\food.dm"
-#include "code\modules\food&drinks\pizzabox.dm"
-#include "code\modules\food&drinks\drinks\drinks.dm"
-#include "code\modules\food&drinks\drinks\drinks\bottle.dm"
-#include "code\modules\food&drinks\drinks\drinks\drinkingglass.dm"
-#include "code\modules\food&drinks\food\condiment.dm"
-#include "code\modules\food&drinks\food\customizables.dm"
-#include "code\modules\food&drinks\food\snacks.dm"
-#include "code\modules\food&drinks\food\snacks_bread.dm"
-#include "code\modules\food&drinks\food\snacks_burgers.dm"
-#include "code\modules\food&drinks\food\snacks_cake.dm"
-#include "code\modules\food&drinks\food\snacks_egg.dm"
-#include "code\modules\food&drinks\food\snacks_meat.dm"
-#include "code\modules\food&drinks\food\snacks_other.dm"
-#include "code\modules\food&drinks\food\snacks_pastry.dm"
-#include "code\modules\food&drinks\food\snacks_pie.dm"
-#include "code\modules\food&drinks\food\snacks_pizza.dm"
-#include "code\modules\food&drinks\food\snacks_salad.dm"
-#include "code\modules\food&drinks\food\snacks_sandwichtoast.dm"
-#include "code\modules\food&drinks\food\snacks_soup.dm"
-#include "code\modules\food&drinks\food\snacks_spaghetti.dm"
-#include "code\modules\food&drinks\food\snacks_vend.dm"
-#include "code\modules\food&drinks\food\snacks\dough.dm"
-#include "code\modules\food&drinks\food\snacks\meat.dm"
-#include "code\modules\food&drinks\kitchen machinery\food_cart.dm"
-#include "code\modules\food&drinks\kitchen machinery\gibber.dm"
-#include "code\modules\food&drinks\kitchen machinery\icecream_vat.dm"
-#include "code\modules\food&drinks\kitchen machinery\juicer.dm"
-#include "code\modules\food&drinks\kitchen machinery\microwave.dm"
-#include "code\modules\food&drinks\kitchen machinery\monkeyrecycler.dm"
-#include "code\modules\food&drinks\kitchen machinery\processor.dm"
-#include "code\modules\food&drinks\kitchen machinery\smartfridge.dm"
-#include "code\modules\food&drinks\recipes\drinks_recipes.dm"
-#include "code\modules\food&drinks\recipes\food_mixtures.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_bread.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_burger.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_cake.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_egg.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_meat.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_misc.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_pastry.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_pie.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_pizza.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_salad.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_sandwich.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_soup.dm"
-#include "code\modules\food&drinks\recipes\tablecraft\recipes_spaghetti.dm"
+#include "code\modules\food_and_drinks\food.dm"
+#include "code\modules\food_and_drinks\pizzabox.dm"
+#include "code\modules\food_and_drinks\drinks\drinks.dm"
+#include "code\modules\food_and_drinks\drinks\drinks\bottle.dm"
+#include "code\modules\food_and_drinks\drinks\drinks\drinkingglass.dm"
+#include "code\modules\food_and_drinks\food\condiment.dm"
+#include "code\modules\food_and_drinks\food\customizables.dm"
+#include "code\modules\food_and_drinks\food\snacks.dm"
+#include "code\modules\food_and_drinks\food\snacks_bread.dm"
+#include "code\modules\food_and_drinks\food\snacks_burgers.dm"
+#include "code\modules\food_and_drinks\food\snacks_cake.dm"
+#include "code\modules\food_and_drinks\food\snacks_egg.dm"
+#include "code\modules\food_and_drinks\food\snacks_meat.dm"
+#include "code\modules\food_and_drinks\food\snacks_other.dm"
+#include "code\modules\food_and_drinks\food\snacks_pastry.dm"
+#include "code\modules\food_and_drinks\food\snacks_pie.dm"
+#include "code\modules\food_and_drinks\food\snacks_pizza.dm"
+#include "code\modules\food_and_drinks\food\snacks_salad.dm"
+#include "code\modules\food_and_drinks\food\snacks_sandwichtoast.dm"
+#include "code\modules\food_and_drinks\food\snacks_soup.dm"
+#include "code\modules\food_and_drinks\food\snacks_spaghetti.dm"
+#include "code\modules\food_and_drinks\food\snacks_vend.dm"
+#include "code\modules\food_and_drinks\food\snacks\dough.dm"
+#include "code\modules\food_and_drinks\food\snacks\meat.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\food_cart.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\gibber.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\juicer.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\microwave.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\monkeyrecycler.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\processor.dm"
+#include "code\modules\food_and_drinks\kitchen_machinery\smartfridge.dm"
+#include "code\modules\food_and_drinks\recipes\drinks_recipes.dm"
+#include "code\modules\food_and_drinks\recipes\food_mixtures.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_bread.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_burger.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_cake.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_egg.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_meat.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_misc.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pastry.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pie.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pizza.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_salad.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sandwich.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_soup.dm"
+#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_spaghetti.dm"
#include "code\modules\games\cards.dm"
#include "code\modules\games\cas.dm"
#include "code\modules\holiday\easter.dm"
@@ -1231,7 +1239,6 @@
#include "code\modules\mob\mob.dm"
#include "code\modules\mob\mob_cleanup.dm"
#include "code\modules\mob\mob_defines.dm"
-#include "code\modules\mob\mob_grab.dm"
#include "code\modules\mob\mob_helpers.dm"
#include "code\modules\mob\mob_movement.dm"
#include "code\modules\mob\mob_transformation_simple.dm"
@@ -1538,18 +1545,18 @@
#include "code\modules\power\tesla\coil.dm"
#include "code\modules\power\tesla\energy_ball.dm"
#include "code\modules\power\tesla\generator.dm"
-#include "code\modules\procedural mapping\mapGenerator.dm"
-#include "code\modules\procedural mapping\mapGeneratorModule.dm"
-#include "code\modules\procedural mapping\mapGeneratorObj.dm"
-#include "code\modules\procedural mapping\mapGeneratorReadme.dm"
-#include "code\modules\procedural mapping\mapGeneratorModules\helpers.dm"
-#include "code\modules\procedural mapping\mapGeneratorModules\nature.dm"
-#include "code\modules\procedural mapping\mapGenerators\asteroid.dm"
-#include "code\modules\procedural mapping\mapGenerators\cellular.dm"
-#include "code\modules\procedural mapping\mapGenerators\lava_river.dm"
-#include "code\modules\procedural mapping\mapGenerators\nature.dm"
-#include "code\modules\procedural mapping\mapGenerators\shuttle.dm"
-#include "code\modules\procedural mapping\mapGenerators\syndicate.dm"
+#include "code\modules\procedural_mapping\mapGenerator.dm"
+#include "code\modules\procedural_mapping\mapGeneratorModule.dm"
+#include "code\modules\procedural_mapping\mapGeneratorObj.dm"
+#include "code\modules\procedural_mapping\mapGeneratorReadme.dm"
+#include "code\modules\procedural_mapping\mapGeneratorModules\helpers.dm"
+#include "code\modules\procedural_mapping\mapGeneratorModules\nature.dm"
+#include "code\modules\procedural_mapping\mapGenerators\asteroid.dm"
+#include "code\modules\procedural_mapping\mapGenerators\cellular.dm"
+#include "code\modules\procedural_mapping\mapGenerators\lava_river.dm"
+#include "code\modules\procedural_mapping\mapGenerators\nature.dm"
+#include "code\modules\procedural_mapping\mapGenerators\shuttle.dm"
+#include "code\modules\procedural_mapping\mapGenerators\syndicate.dm"
#include "code\modules\projectiles\ammunition.dm"
#include "code\modules\projectiles\firing.dm"
#include "code\modules\projectiles\gun.dm"
@@ -1659,18 +1666,19 @@
#include "code\modules\research\xenobiology\xenobiology.dm"
#include "code\modules\ruins\lavaland_ruin_code.dm"
#include "code\modules\ruins\ruin_areas.dm"
-#include "code\modules\security levels\keycard authentication.dm"
-#include "code\modules\security levels\security levels.dm"
+#include "code\modules\security_levels\keycard_authentication.dm"
+#include "code\modules\security_levels\security_levels.dm"
#include "code\modules\shuttle\assault_pod.dm"
#include "code\modules\shuttle\computer.dm"
#include "code\modules\shuttle\emergency.dm"
#include "code\modules\shuttle\ferry.dm"
#include "code\modules\shuttle\manipulator.dm"
#include "code\modules\shuttle\shuttle.dm"
+#include "code\modules\shuttle\special.dm"
#include "code\modules\shuttle\supply.dm"
#include "code\modules\shuttle\syndicate.dm"
#include "code\modules\shuttle\white_ship.dm"
-#include "code\modules\space transition\space_transition.dm"
+#include "code\modules\space_transition\space_transition.dm"
#include "code\modules\spells\spell.dm"
#include "code\modules\spells\spell_types\area_teleport.dm"
#include "code\modules\spells\spell_types\barnyard.dm"
@@ -1719,7 +1727,7 @@
#include "code\modules\surgery\generic_steps.dm"
#include "code\modules\surgery\helpers.dm"
#include "code\modules\surgery\implant_removal.dm"
-#include "code\modules\surgery\limb augmentation.dm"
+#include "code\modules\surgery\limb_augmentation.dm"
#include "code\modules\surgery\lipoplasty.dm"
#include "code\modules\surgery\organ_manipulation.dm"
#include "code\modules\surgery\plastic_surgery.dm"
@@ -1754,6 +1762,7 @@
#include "code\modules\tgui\states\deep_inventory.dm"
#include "code\modules\tgui\states\default.dm"
#include "code\modules\tgui\states\hands.dm"
+#include "code\modules\tgui\states\human_adjacent.dm"
#include "code\modules\tgui\states\inventory.dm"
#include "code\modules\tgui\states\not_incapacitated.dm"
#include "code\modules\tgui\states\notcontained.dm"
@@ -1769,10 +1778,10 @@
#include "code\modules\vehicles\secway.dm"
#include "code\modules\vehicles\speedbike.dm"
#include "code\modules\vehicles\vehicle.dm"
-#include "code\orphaned procs\AStar.dm"
-#include "code\orphaned procs\dbcore.dm"
-#include "code\orphaned procs\priority_announce.dm"
-#include "code\orphaned procs\statistics.dm"
+#include "code\orphaned_procs\AStar.dm"
+#include "code\orphaned_procs\dbcore.dm"
+#include "code\orphaned_procs\priority_announce.dm"
+#include "code\orphaned_procs\statistics.dm"
#include "interface\interface.dm"
#include "interface\stylesheet.dm"
#include "interface\skin.dmf"
diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js
index bfb2ead1f7c..348dbbd48c0 100644
--- a/tgui/assets/tgui.js
+++ b/tgui/assets/tgui.js
@@ -5,8 +5,8 @@ if(e instanceof is)e.then(n,r);else if(!e||"object"!=typeof e&&"function"!=typeo
e||(e=lf),this.update=e,this.update()}function tr(t,e){var n=e?"svg":"div";return df.innerHTML="<"+n+" "+t+">"+n+">",D(df.childNodes[0].attributes)}function er(t,e){for(var n=t.length;n--;)if(t[n].name===e.name)return!1;return!0}function nr(t){for(;t=t.parent;)if("form"===t.name)return t}function rr(){this._ractive.binding.handleChange()}function ir(){var t;_f.call(this),t=this._ractive.root.viewmodel.get(this._ractive.binding.keypath),this.value=void 0==t?"":t}function ar(){var t=this._ractive.binding,e=this;t._timeout&&clearTimeout(t._timeout),t._timeout=setTimeout(function(){t.rendered&&_f.call(e),t._timeout=void 0},t.element.lazy)}function or(t,e,n){var r=t+e+n;return Cf[r]||(Cf[r]=[])}function sr(t){return t.isChecked}function ur(t){return t.element.getAttribute("value")}function cr(t){var e,n,r,i,a,o=t.attributes;return t.binding&&(t.binding.teardown(),t.binding=null),(t.getAttribute("contenteditable")||o.contenteditable&&lr(o.contenteditable))&&lr(o.value)?n=Sf:"input"===t.name?(e=t.getAttribute("type"),"radio"===e||"checkbox"===e?(r=lr(o.name),i=lr(o.checked),r&&i&&m("A radio input can have two-way binding on its name attribute, or its checked attribute - not both",{ractive:t.root}),r?n="radio"===e?jf:Lf:i&&(n="radio"===e?Pf:Nf)):"file"===e&&lr(o.value)?n=Vf:lr(o.value)&&(n="number"===e||"range"===e?Uf:kf)):"select"===t.name&&lr(o.value)?n=t.getAttribute("multiple")?qf:Df:"textarea"===t.name&&lr(o.value)&&(n=kf),n&&(a=new n(t))&&a.keypath?a:void 0}function lr(t){return t&&t.isBindable}function pr(){var t=this.getAction();t&&!this.hasListener?this.listen():!t&&this.hasListener&&this.unrender()}function fr(t){Ws(this.root,this.getAction(),{event:t})}function dr(){return(""+this.action).trim()}function hr(t,e,n){var r,i,a,o=this;this.element=t,this.root=t.root,this.parentFragment=t.parentFragment,this.name=e,-1!==e.indexOf("*")&&(p('Only component proxy-events may contain "*" wildcards, <%s on-%s="..."/> is not valid',t.name,e),this.invalid=!0),n.m?(i=n.a.r,this.method=n.m,this.keypaths=[],this.fn=Ml(n.a.s,i.length),this.parentFragment=t.parentFragment,a=this.root,this.refResolvers=[],i.forEach(function(t,e){var n=void 0;(n=$f.exec(t))?o.keypaths[e]={eventObject:!0,refinements:n[1]?n[1].split("."):[]}:o.refResolvers.push(jl(o,t,function(t){return o.resolve(e,t)}))}),this.fire=mr):(r=n.n||n,"string"!=typeof r&&(r=new iv({template:r,root:this.root,owner:this})),this.action=r,n.d?(this.dynamicParams=new iv({template:n.d,root:this.root,owner:this.element}),this.fire=gr):n.a&&(this.params=n.a,this.fire=vr))}function mr(t){var e,n,r;if(e=this.root,"function"!=typeof e[this.method])throw Error('Attempted to call a non-existent method ("'+this.method+'")');n=this.keypaths.map(function(n){var r,i,a;if(void 0!==n){if(n.eventObject){if(r=t,i=n.refinements.length)for(a=0;i>a;a+=1)r=r[n.refinements[a]]}else r=e.viewmodel.get(n);return r}}),zs.enqueue(e,t),r=this.fn.apply(null,n),e[this.method].apply(e,r),zs.dequeue(e)}function vr(t){Ws(this.root,this.getAction(),{event:t,args:this.params})}function gr(t){var e=this.dynamicParams.getArgsList();"string"==typeof e&&(e=e.substr(1,e.length-2)),Ws(this.root,this.getAction(),{event:t,args:e})}function yr(t){var e,n,r,i={};e=this._ractive,n=e.events[t.type],(r=Pl(n.element.parentFragment))&&(i=Pl.resolve(r)),n.fire({node:this,original:t,index:i,keypath:e.keypath.str,context:e.root.viewmodel.get(e.keypath)})}function br(){var t,e=this.name;if(!this.invalid){if(t=g("events",this.root,e))this.custom=t(this.node,xr(e));else{if(!("on"+e in this.node||window&&"on"+e in window||Za))return void(Xf[e]||v(Io(e,"event"),{node:this.node}));this.node.addEventListener(e,Qf,!1)}this.hasListener=!0}}function xr(t){return Jf[t]||(Jf[t]=function(e){var n=e.node._ractive;e.index=n.index,e.keypath=n.keypath.str,e.context=n.root.viewmodel.get(n.keypath),n.events[t].fire(e)}),Jf[t]}function wr(t,e){function n(n){n&&n.rebind(t,e)}var r;return this.method?(r=this.element.parentFragment,void this.refResolvers.forEach(n)):("string"!=typeof this.action&&n(this.action),void(this.dynamicParams&&n(this.dynamicParams)))}function _r(){this.node=this.element.node,this.node._ractive.events[this.name]=this,(this.method||this.getAction())&&this.listen()}function kr(t,e){this.keypaths[t]=e}function Er(){return this.method?void this.refResolvers.forEach(K):("string"!=typeof this.action&&this.action.unbind(),void(this.dynamicParams&&this.dynamicParams.unbind()))}function Sr(){this.custom?this.custom.teardown():this.node.removeEventListener(this.name,Qf,!1),this.hasListener=!1}function Or(){var t=this;this.dirty||(this.dirty=!0,ys.scheduleTask(function(){Cr(t),t.dirty=!1})),this.parentFragment.bubble()}function Cr(t){var e,n,r,i,a;e=t.node,e&&(i=D(e.options),n=t.getAttribute("value"),r=t.getAttribute("multiple"),void 0!==n?(i.forEach(function(t){var e,i;e=t._ractive?t._ractive.value:t.value,i=r?Ar(n,e):n==e,i&&(a=!0),t.selected=i}),a||(i[0]&&(i[0].selected=!0),t.binding&&t.binding.forceUpdate())):t.binding&&t.binding.forceUpdate())}function Ar(t,e){for(var n=t.length;n--;)if(t[n]==e)return!0}function Pr(t,e){t.select=jr(t.parent),t.select&&(t.select.options.push(t),e.a||(e.a={}),void 0!==e.a.value||e.a.hasOwnProperty("disabled")||(e.a.value=e.f),"selected"in e.a&&void 0!==t.select.getAttribute("value")&&delete e.a.selected)}function Tr(t){t.select&&R(t.select.options,t)}function jr(t){if(t)do if("select"===t.name)return t;while(t=t.parent)}function Mr(t){var e,n,r,i,a,o,s;this.type=Cc,e=this.parentFragment=t.parentFragment,n=this.template=t.template,this.parent=t.pElement||e.pElement,this.root=r=e.root,this.index=t.index,this.key=t.key,this.name=zp(n.e),"option"===this.name&&Pr(this,n),"select"===this.name&&(this.options=[],this.bubble=Or),"form"===this.name&&(this.formBindings=[]),s=Vp(this,n),this.attributes=mf(this,n.a),this.conditionalAttributes=yf(this,n.m),n.f&&(this.fragment=new iv({template:n.f,root:r,owner:this,pElement:this,cssIds:null})),o=r.twoway,s.twoway===!1?o=!1:s.twoway===!0&&(o=!0),this.twoway=o,this.lazy=s.lazy,o&&(i=zf(this,n.a))&&(this.binding=i,a=this.root._twowayBindings[i.keypath.str]||(this.root._twowayBindings[i.keypath.str]=[]),a.push(i)),n.v&&(this.eventHandlers=od(this,n.v)),n.o&&(this.decorator=new pd(this,n.o)),this.intro=n.t0||n.t1,this.outro=n.t0||n.t2}function Lr(t,e){function n(n){n.rebind(t,e)}var r,i,a,o;if(this.attributes&&this.attributes.forEach(n),this.conditionalAttributes&&this.conditionalAttributes.forEach(n),this.eventHandlers&&this.eventHandlers.forEach(n),this.decorator&&n(this.decorator),this.fragment&&n(this.fragment),a=this.liveQueries)for(o=this.root,r=a.length;r--;)a[r]._makeDirty();this.node&&(i=this.node._ractive)&&_(i,"keypath",t,e)}function Fr(t){var e;(t.attributes.width||t.attributes.height)&&t.node.addEventListener("load",e=function(){var n=t.getAttribute("width"),r=t.getAttribute("height");void 0!==n&&t.node.setAttribute("width",n),void 0!==r&&t.node.setAttribute("height",r),t.node.removeEventListener("load",e,!1)},!1)}function Nr(t){t.node.addEventListener("reset",Dr,!1)}function Rr(t){t.node.removeEventListener("reset",Dr,!1)}function Dr(){var t=this._ractive.proxy;ys.start(),t.formBindings.forEach(Ir),ys.end()}function Ir(t){t.root.viewmodel.set(t.keypath,t.resetValue)}function qr(t,e,n){var r,i,a;this.element=t,this.root=r=t.root,this.isIntro=n,i=e.n||e,("string"==typeof i||(a=new iv({template:i,root:r,owner:t}),i=""+a,a.unbind(),""!==i))&&(this.name=i,e.a?this.params=e.a:e.d&&(a=new iv({template:e.d,root:r,owner:t}),this.params=a.getArgsList(),a.unbind()),this._fn=g("transitions",r,i),this._fn||v(Io(i,"transition"),{ractive:this.root}))}function Br(t){return t}function Vr(){Vd.hidden=document[Dd]}function Ur(){Vd.hidden=!0}function zr(){Vd.hidden=!1}function Wr(){var t,e,n,r=this;return t=this.node=this.element.node,e=t.getAttribute("style"),this.complete=function(i){n||(!i&&r.isIntro&&Hr(t,e),t._ractive.transition=null,r._manager.remove(r),n=!0)},this._fn?void this._fn.apply(this.root,[this].concat(this.params)):void this.complete()}function Hr(t,e){e?t.setAttribute("style",e):(t.getAttribute("style"),t.removeAttribute("style"))}function Gr(){var t,e,n,r=this,i=this.root;return t=Kr(this),e=this.node=lo(this.name,t),this.parentFragment.cssIds&&this.node.setAttribute("data-ractive-css",this.parentFragment.cssIds.map(function(t){return"{"+t+"}"}).join(" ")),So(this.node,"_ractive",{value:{proxy:this,keypath:ls(this.parentFragment),events:Eo(null),root:i}}),this.attributes.forEach(function(t){return t.render(e)}),this.conditionalAttributes.forEach(function(t){return t.render(e)}),this.fragment&&("script"===this.name?(this.bubble=Xd,this.node.text=this.fragment.toString(!1),this.fragment.unrender=ko):"style"===this.name?(this.bubble=Jd,this.bubble(),this.fragment.unrender=ko):this.binding&&this.getAttribute("contenteditable")?this.fragment.unrender=ko:this.node.appendChild(this.fragment.render())),this.binding&&(this.binding.render(),this.node._ractive.binding=this.binding),this.eventHandlers&&this.eventHandlers.forEach(function(t){return t.render()}),"option"===this.name&&$r(this),"img"===this.name?Fr(this):"form"===this.name?Nr(this):"input"===this.name||"textarea"===this.name?this.node.defaultValue=this.node.value:"option"===this.name&&(this.node.defaultSelected=this.node.selected),this.decorator&&this.decorator.fn&&ys.scheduleTask(function(){r.decorator.torndown||r.decorator.init()},!0),i.transitionsEnabled&&this.intro&&(n=new Zd(this,this.intro,!0),ys.registerTransition(n),ys.scheduleTask(function(){return n.start()},!0),this.transition=n),this.node.autofocus&&ys.scheduleTask(function(){return r.node.focus()},!0),Qr(this),this.node}function Kr(t){var e,n,r;return e=(n=t.getAttribute("xmlns"))?n:"svg"===t.name?no.svg:(r=t.parent)?"foreignObject"===r.name?no.html:r.node.namespaceURI:t.root.el.namespaceURI}function $r(t){var e,n,r;if(t.select&&(n=t.select.getAttribute("value"),void 0!==n))if(e=t.getAttribute("value"),t.select.node.multiple&&a(n)){for(r=n.length;r--;)if(e==n[r]){t.node.selected=!0;break}}else t.node.selected=e==n}function Qr(t){var e,n,r,i,a;e=t.root;do for(n=e._liveQueries,r=n.length;r--;)i=n[r],a=n["_"+i],a._test(t)&&(t.liveQueries||(t.liveQueries=[])).push(a);while(e=e.parent)}function Yr(t){var e,n,r;if(e=t.getAttribute("value"),void 0===e||!t.select)return!1;if(n=t.select.getAttribute("value"),n==e)return!0;if(t.select.getAttribute("multiple")&&a(n))for(r=n.length;r--;)if(n[r]==e)return!0}function Jr(t){var e,n,r,i;return e=t.attributes,n=e.type,r=e.value,i=e.name,n&&"radio"===n.value&&r&&i.interpolator&&r.value===i.interpolator.value?!0:void 0}function Xr(t){var e=""+t;return e?" "+e:""}function Zr(){this.fragment&&this.fragment.unbind(),this.binding&&this.binding.unbind(),this.eventHandlers&&this.eventHandlers.forEach(K),"option"===this.name&&Tr(this),this.attributes.forEach(K),this.conditionalAttributes.forEach(K)}function ti(t){var e,n,r;(r=this.transition)&&r.complete(),"option"===this.name?this.detach():t&&ys.detachWhenReady(this),this.fragment&&this.fragment.unrender(!1),(e=this.binding)&&(this.binding.unrender(),this.node._ractive.binding=null,n=this.root._twowayBindings[e.keypath.str],n.splice(n.indexOf(e),1)),this.eventHandlers&&this.eventHandlers.forEach($),this.decorator&&ys.registerDecorator(this.decorator),this.root.transitionsEnabled&&this.outro&&(r=new Zd(this,this.outro,!1),ys.registerTransition(r),ys.scheduleTask(function(){return r.start()})),this.liveQueries&&ei(this),"form"===this.name&&Rr(this)}function ei(t){var e,n,r;for(r=t.liveQueries.length;r--;)e=t.liveQueries[r],n=e.selector,e._remove(t.node)}function ni(t,e){var n=sh.exec(e)[0];return null===t||n.length%s}}) cannot contain nested inline partials",e,{ractive:t});var s=r?a:ai(a,e);s.partials[e]=i=o.t}return r&&(i._fn=r),i.v?i.t:i}}function ai(t,e){return t.partials.hasOwnProperty(e)?t:oi(t.constructor,e)}function oi(t,e){return t?t.partials.hasOwnProperty(e)?t:oi(t._Parent,e):void 0}function si(t,e){if(e){if(e.template&&e.template.p&&e.template.p[t])return e.template.p[t];if(e.parentFragment&&e.parentFragment.owner)return si(t,e.parentFragment.owner)}}function ui(t,e){var n,r=y("components",t,e);if(r&&(n=r.components[e],!n._Parent)){var i=n.bind(r);if(i.isOwner=r.components.hasOwnProperty(e),n=i(),!n)return void m(Do,e,"component","component",{ractive:t});"string"==typeof n&&(n=ui(t,n)),n._fn=i,r.components[e]=n}return n}function ci(){var t=this.instance.fragment.detach();return bh.fire(this.instance),t}function li(t){return this.instance.fragment.find(t)}function pi(t,e){return this.instance.fragment.findAll(t,e)}function fi(t,e){e._test(this,!0),this.instance.fragment&&this.instance.fragment.findAllComponents(t,e)}function di(t){return t&&t!==this.name?this.instance.fragment?this.instance.fragment.findComponent(t):null:this.instance}function hi(){return this.parentFragment.findNextNode(this)}function mi(){return this.rendered?this.instance.fragment.firstNode():null}function vi(t,e,n){function r(t){var n,r;t.value=e,t.updating||(r=t.ractive,n=t.keypath,t.updating=!0,ys.start(r),r.viewmodel.mark(n),ys.end(),t.updating=!1)}var i,a,o,s,u,c;if(i=t.obj,a=t.prop,n&&!n.configurable){if("length"===a)return;throw Error('Cannot use magic mode with property "'+a+'" - object is not configurable')}n&&(o=n.get,s=n.set),u=o||function(){return e},c=function(t){s&&s(t),e=o?o():t,c._ractiveWrappers.forEach(r)},c._ractiveWrappers=[t],Object.defineProperty(i,a,{get:u,set:c,enumerable:!0,configurable:!0})}function gi(t,e){var n,r,i,a;if(this.adaptors)for(n=this.adaptors.length,r=0;n>r;r+=1)if(i=this.adaptors[r],i.filter(e,t,this.ractive))return a=this.wrapped[t]=i.wrap(this.ractive,e,t,bi(t)),void(a.value=e)}function yi(t,e){var n,r={};if(!e)return t;e+=".";for(n in t)t.hasOwnProperty(n)&&(r[e+n]=t[n]);return r}function bi(t){var e;return zh[t]||(e=t?t+".":"",zh[t]=function(n,r){var i;return"string"==typeof n?(i={},i[e+n]=r,i):"object"==typeof n?e?yi(n,t):n:void 0}),zh[t]}function xi(t){var e,n,r=[Yo];for(e=t.length;e--;)for(n=t[e].parent;n&&!n.isRoot;)-1===t.indexOf(n)&&j(r,n),n=n.parent;return r}function wi(t,e,n){var r;ki(t,e),n||(r=e.wildcardMatches(),r.forEach(function(n){_i(t,n,e)}))}function _i(t,e,n){var r,i,a;e=e.str||e,r=t.depsMap.patternObservers,i=r&&r[e],i&&i.forEach(function(e){a=n.join(e.lastKey),ki(t,a),_i(t,e,a)})}function ki(t,e){t.patternObservers.forEach(function(t){t.regex.test(e.str)&&t.update(e)})}function Ei(){function t(t){var r=t.key;t.viewmodel===o?(o.clearCache(r.str),t.invalidate(),n.push(r),e(r)):t.viewmodel.mark(r)}function e(n){var r,i;o.noCascade.hasOwnProperty(n.str)||((i=o.deps.computed[n.str])&&i.forEach(t),(r=o.depsMap.computed[n.str])&&r.forEach(e))}var n,r,i,a=this,o=this,s={};return n=this.changes,n.length?(n.slice().forEach(e),r=Wh(n),r.forEach(function(e){var r;-1===n.indexOf(e)&&(r=o.deps.computed[e.str])&&r.forEach(t)}),this.changes=[],this.patternObservers.length&&(r.forEach(function(t){return Hh(a,t,!0)}),n.forEach(function(t){return Hh(a,t)})),this.deps.observers&&(r.forEach(function(t){return Si(a,null,t,"observers")}),Ci(this,n,"observers")),this.deps["default"]&&(i=[],r.forEach(function(t){return Si(a,i,t,"default")}),i.length&&Oi(this,i,n),Ci(this,n,"default")),n.forEach(function(t){s[t.str]=a.get(t)}),this.implicitChanges={},this.noCascade={},s):void 0}function Si(t,e,n,r){var i,a;(i=Ai(t,n,r))&&(a=t.get(n),i.forEach(function(t){e&&t.refineValue?e.push(t):t.setValue(a)}))}function Oi(t,e,n){e.forEach(function(e){for(var r=!1,i=0,a=n.length,o=[];a>i;){var s=n[i];if(s===e.keypath){r=!0;break}s.slice(0,e.keypath.length)===e.keypath&&o.push(s),i++}r&&e.setValue(t.get(e.keypath)),o.length&&e.refineValue(o)})}function Ci(t,e,n){function r(t){t.forEach(i),t.forEach(a)}function i(e){var r=Ai(t,e,n);r&&s.push({keypath:e,deps:r})}function a(e){var i;(i=t.depsMap[n][e.str])&&r(i)}function o(e){var n=t.get(e.keypath);e.deps.forEach(function(t){return t.setValue(n)})}var s=[];r(e),s.forEach(o)}function Ai(t,e,n){var r=t.deps[n];return r?r[e.str]:null}function Pi(){this.captureGroups.push([])}function Ti(t,e){var n,r;if(e||(r=this.wrapped[t])&&r.teardown()!==!1&&(this.wrapped[t]=null),this.cache[t]=void 0,n=this.cacheMap[t])for(;n.length;)this.clearCache(n.pop())}function ji(t,e){var n=e.firstKey;return!(n in t.data||n in t.computations||n in t.mappings)}function Mi(t,e){var n=new Xh(t,e);return this.ready&&n.init(this),this.computations[t.str]=n}function Li(t,e){var n,r,i,a,o,s=this.cache,u=t.str;if(e=e||nm,e.capture&&(a=N(this.captureGroups))&&(~a.indexOf(t)||a.push(t)),Mo.call(this.mappings,t.firstKey))return this.mappings[t.firstKey].get(t,e);if(t.isSpecial)return t.value;if(void 0===s[u]?((r=this.computations[u])&&!r.bypass?(n=r.get(),this.adapt(u,n)):(i=this.wrapped[u])?n=i.value:t.isRoot?(this.adapt("",this.data),n=this.data):n=Fi(this,t),s[u]=n):n=s[u],!e.noUnwrap&&(i=this.wrapped[u])&&(n=i.get()),t.isRoot&&e.fullRootGet)for(o in this.mappings)n[o]=this.mappings[o].getValue();return n===tm?void 0:n}function Fi(t,e){var n,r,i,a;return n=t.get(e.parent),(a=t.wrapped[e.parent.str])&&(n=a.get()),null!==n&&void 0!==n?((r=t.cacheMap[e.parent.str])?-1===r.indexOf(e.str)&&r.push(e.str):t.cacheMap[e.parent.str]=[e.str],"object"!=typeof n||e.lastKey in n?(i=n[e.lastKey],t.adapt(e.str,i,!1),t.cache[e.str]=i,i):t.cache[e.str]=tm):void 0}function Ni(){var t;for(t in this.computations)this.computations[t].init(this)}function Ri(t,e){var n=this.mappings[t.str]=new am(t,e);return n.initViewmodel(this),n}function Di(t,e){var n,r=t.str;e&&(e.implicit&&(this.implicitChanges[r]=!0),e.noCascade&&(this.noCascade[r]=!0)),(n=this.computations[r])&&n.invalidate(),-1===this.changes.indexOf(t)&&this.changes.push(t);var i=e?e.keepExistingWrapper:!1;this.clearCache(r,i),this.ready&&this.onchange()}function Ii(t,e,n,r){var i,a,o,s;if(this.mark(t),r&&r.compare){o=Bi(r.compare);try{i=e.map(o),a=n.map(o)}catch(u){m('merge(): "%s" comparison failed. Falling back to identity checking',t),i=e,a=n}}else i=e,a=n;s=sm(i,a),this.smartUpdate(t,n,s,e.length!==n.length)}function qi(t){return JSON.stringify(t)}function Bi(t){if(t===!0)return qi;if("string"==typeof t)return cm[t]||(cm[t]=function(e){return e[t]}),cm[t];if("function"==typeof t)return t;throw Error("The `compare` option must be a function, or a string representing an identifying field (or `true` to use JSON.stringify)")}function Vi(t,e){var n,r,i,a=void 0===arguments[2]?"default":arguments[2];e.isStatic||((n=this.mappings[t.firstKey])?n.register(t,e,a):(r=this.deps[a]||(this.deps[a]={}),i=r[t.str]||(r[t.str]=[]),i.push(e),this.depsMap[a]||(this.depsMap[a]={}),t.isRoot||Ui(this,t,a)))}function Ui(t,e,n){for(var r,i,a;!e.isRoot;)r=t.depsMap[n],i=r[e.parent.str]||(r[e.parent.str]=[]),a=e.str,void 0===i["_"+a]&&(i["_"+a]=0,i.push(e)),i["_"+a]+=1,e=e.parent}function zi(){return this.captureGroups.pop()}function Wi(t){this.data=t,this.clearCache("")}function Hi(t,e){var n,r,i,a,o=void 0===arguments[2]?{}:arguments[2];if(!o.noMapping&&(n=this.mappings[t.firstKey]))return n.set(t,e);if(r=this.computations[t.str]){if(r.setting)return;r.set(e),e=r.get()}s(this.cache[t.str],e)||(i=this.wrapped[t.str],i&&i.reset&&(a=i.reset(e)!==!1,a&&(e=i.get())),r||a||Gi(this,t,e),o.silent?this.clearCache(t.str):this.mark(t))}function Gi(t,e,n){var r,i,a,o;a=function(){r.set?r.set(e.lastKey,n):(i=r.get(),o())},o=function(){i||(i=Dh(e.lastKey),t.set(e.parent,i,{silent:!0})),i[e.lastKey]=n},r=t.wrapped[e.parent.str],r?a():(i=t.get(e.parent),(r=t.wrapped[e.parent.str])?a():o())}function Ki(t,e,n){var r,i,a,o=this;if(i=n.length,n.forEach(function(e,n){-1===e&&o.mark(t.join(n),vm)}),this.set(t,e,{silent:!0}),(r=this.deps["default"][t.str])&&r.filter($i).forEach(function(t){return t.shuffle(n,e)}),i!==e.length){for(this.mark(t.join("length"),mm),a=n.touchedFrom;aa;a+=1)this.mark(t.join(a),vm)}}function $i(t){return"function"==typeof t.shuffle}function Qi(){var t,e=this;for(Object.keys(this.cache).forEach(function(t){return e.clearCache(t)});t=this.unresolvedImplicitDependencies.pop();)t.teardown()}function Yi(t,e){var n,r,i,a=void 0===arguments[2]?"default":arguments[2];if(!e.isStatic){if(n=this.mappings[t.firstKey])return n.unregister(t,e,a);if(r=this.deps[a][t.str],i=r.indexOf(e),-1===i)throw Error("Attempted to remove a dependant that was no longer registered! This should not happen. If you are seeing this bug in development please raise an issue at https://github.com/RactiveJS/Ractive/issues - thanks");r.splice(i,1),t.isRoot||Ji(this,t,a)}}function Ji(t,e,n){for(var r,i;!e.isRoot;)r=t.depsMap[n],i=r[e.parent.str],i["_"+e.str]-=1,i["_"+e.str]||(R(i,e),i["_"+e.str]=void 0),e=e.parent}function Xi(t){this.hook=new as(t),this.inProcess={},this.queue={}}function Zi(t,e){return t[e._guid]||(t[e._guid]=[])}function ta(t,e){var n=Zi(t.queue,e);for(t.hook.fire(e);n.length;)ta(t,n.shift());delete t.queue[e._guid]}function ea(t,e){var n,r={};for(n in e)r[n]=na(t,n,e[n]);return r}function na(t,e,n){var r,i;return"function"==typeof n&&(r=ia(n,t)),"string"==typeof n&&(r=ra(t,n)),"object"==typeof n&&("string"==typeof n.get?r=ra(t,n.get):"function"==typeof n.get?r=ia(n.get,t):p("`%s` computation must have a `get()` method",e),"function"==typeof n.set&&(i=ia(n.set,t))),{getter:r,setter:i}}function ra(t,e){var n,r,i;return n="return ("+e.replace(km,function(t,e){return r=!0,'__ractive.get("'+e+'")'})+");",r&&(n="var __ractive = this; "+n),i=Function(n),r?i.bind(t):i}function ia(t,e){return/this/.test(""+t)?t.bind(e):t}function aa(e){var n,i,a=void 0===arguments[1]?{}:arguments[1],o=void 0===arguments[2]?{}:arguments[2];if(Mv.DEBUG&&jo(),ua(e,o),So(e,"data",{get:ca}),Em.fire(e,a),Am.forEach(function(t){e[t]=r(Eo(e.constructor[t]||null),a[t])}),i=new xm({adapt:oa(e,e.adapt,a),data:Hu.init(e.constructor,e,a),computed:_m(e,r(Eo(e.constructor.prototype.computed),a.computed)),mappings:o.mappings,ractive:e,onchange:function(){return ys.addRactive(e)}}),e.viewmodel=i,i.init(),cc.init(e.constructor,e,a),Sm.fire(e),Om.begin(e),e.template){var s=void 0;(o.cssIds||e.cssId)&&(s=o.cssIds?o.cssIds.slice():[],e.cssId&&s.push(e.cssId)),e.fragment=new iv({template:e.template,root:e,owner:e,cssIds:s})}if(Om.end(e),n=t(e.el)){var u=e.render(n,e.append);Mv.DEBUG_PROMISES&&u["catch"](function(t){throw v("Promise debugging is enabled, to help solve errors that happen asynchronously. Some browsers will log unhandled promise rejections, in which case you can safely disable promise debugging:\n Ractive.DEBUG_PROMISES = false;"),m("An error happened during rendering",{ractive:e}),t.stack&&f(t.stack),t})}}function oa(t,e,n){function r(e){return"string"==typeof e&&(e=g("adaptors",t,e),e||p(Io(e,"adaptor"))),e}var i,a,o;if(e=e.map(r),i=F(n.adapt).map(r),i=sa(e,i),a="magic"in n?n.magic:t.magic,o="modifyArrays"in n?n.modifyArrays:t.modifyArrays,a){if(!eo)throw Error("Getters and setters (magic mode) are not supported in this browser");o&&i.push(Vh),i.push(Bh)}return o&&i.push(Nh),i}function sa(t,e){for(var n=t.slice(),r=e.length;r--;)~n.indexOf(e[r])||n.push(e[r]);return n}function ua(t,e){t._guid="r-"+Cm++,t._subs=Eo(null),t._config={},t._twowayBindings=Eo(null),t._animations=[],t.nodes={},t._liveQueries=[],t._liveComponentQueries=[],t._boundFunctions=[],t._observers=[],e.component?(t.parent=e.parent,t.container=e.container||null,t.root=t.parent.root,t.component=e.component,e.component.instance=t,t._inlinePartials=e.inlinePartials):(t.root=t,t.parent=t.container=null)}function ca(){throw Error("Using `ractive.data` is no longer supported - you must use the `ractive.get()` API instead")}function la(t,e,n){this.parentFragment=t.parentFragment,this.callback=n,this.fragment=new iv({template:e,root:t.root,owner:this}),this.update()}function pa(t,e,n){var r;return e.r?r=jl(t,e.r,n):e.x?r=new Nl(t,t.parentFragment,e.x,n):e.rx&&(r=new ql(t,e.rx,n)),r}function fa(t){return 1===t.length&&t[0].t===Ec}function da(t,e){var n;for(n in e)e.hasOwnProperty(n)&&ha(t.instance,t.root,n,e[n])}function ha(t,e,n,r){"string"!=typeof r&&p("Components currently only support simple events - you cannot include arguments. Sorry!"),t.on(n,function(){var t,n;return arguments.length&&arguments[0]&&arguments[0].node&&(t=Array.prototype.shift.call(arguments)),n=Array.prototype.slice.call(arguments),Ws(e,r,{event:t,args:n}),!1})}function ma(t,e){var n,r;if(!e)throw Error('Component "'+this.name+'" not found');n=this.parentFragment=t.parentFragment,r=n.root,this.root=r,this.type=jc,this.name=t.template.e,this.index=t.index,this.indexRefBindings={},this.yielders={},this.resolvers=[],jm(this,e,t.template.a,t.template.f,t.template.p),Mm(this,t.template.v),(t.template.t0||t.template.t1||t.template.t2||t.template.o)&&m('The "intro", "outro" and "decorator" directives have no effect on components',{ractive:this.instance}),Lm(this)}function va(t,e){function n(n){n.rebind(t,e)}var r;this.resolvers.forEach(n);for(var i in this.yielders)this.yielders[i][0]&&n(this.yielders[i][0]);(r=this.root._liveComponentQueries["_"+this.name])&&r._makeDirty()}function ga(){var t=this.instance;return t.render(this.parentFragment.getNode()),this.rendered=!0,t.fragment.detach()}function ya(){return""+this.instance.fragment}function ba(){var t=this.instance;this.resolvers.forEach(K),xa(this),t._observers.forEach(Q),t.fragment.unbind(),t.viewmodel.teardown(),t.fragment.rendered&&t.el.__ractive_instances__&&R(t.el.__ractive_instances__,t),qm.fire(t)}function xa(t){var e,n;e=t.root;do(n=e._liveComponentQueries["_"+t.name])&&n._remove(t);while(e=e.parent)}function wa(t){this.shouldDestroy=t,this.instance.unrender()}function _a(t){var e=this;this.owner=t.owner,this.parent=this.owner.parentFragment,this.root=t.root,this.pElement=t.pElement,this.context=t.context,this.index=t.index,this.key=t.key,this.registeredIndexRefs=[],this.cssIds="cssIds"in t?t.cssIds:this.parent?this.parent.cssIds:null,this.items=t.template.map(function(n,r){return ka({parentFragment:e,pElement:t.pElement,template:n,index:r})}),this.value=this.argsList=null,this.dirtyArgs=this.dirtyValue=!0,this.bound=!0}function ka(t){if("string"==typeof t.template)return new bl(t);switch(t.template.t){case Mc:return new Gm(t);case Ec:return new Hl(t);case Oc:return new pp(t);case Sc:return new Pp(t);case Cc:var e=void 0;return(e=gh(t.parentFragment.root,t.template.e))?new Um(t,e):new ah(t);case Ac:return new vh(t);case Pc:return new Wm(t);case Lc:return new $m(t);default:throw Error("Something very strange happened. Please file an issue at https://github.com/ractivejs/ractive/issues. Thanks!")}}function Ea(t,e){(!this.owner||this.owner.hasContext)&&_(this,"context",t,e),this.items.forEach(function(n){n.rebind&&n.rebind(t,e)})}function Sa(){var t;return 1===this.items.length?t=this.items[0].render():(t=document.createDocumentFragment(),this.items.forEach(function(e){t.appendChild(e.render())})),this.rendered=!0,t}function Oa(t){return this.items?this.items.map(t?Aa:Ca).join(""):""}function Ca(t){return""+t}function Aa(t){return t.toString(!0)}function Pa(){this.bound&&(this.items.forEach(Ta),this.bound=!1)}function Ta(t){t.unbind&&t.unbind()}function ja(t){if(!this.rendered)throw Error("Attempted to unrender a fragment that was not rendered");this.items.forEach(function(e){return e.unrender(t)}),this.rendered=!1}function Ma(t){var e,n,r,i,a;if(t=t||{},"object"!=typeof t)throw Error("The reset method takes either no arguments, or an object containing new data");for((n=this.viewmodel.wrapped[""])&&n.reset?n.reset(t)===!1&&this.viewmodel.reset(t):this.viewmodel.reset(t),r=cc.reset(this),i=r.length;i--;)if(ov.indexOf(r[i])>-1){a=!0;break}if(a){var o=void 0;this.viewmodel.mark(Yo),(o=this.component)&&(o.shouldDestroy=!0),this.unrender(),o&&(o.shouldDestroy=!1),this.fragment.template!==this.template&&(this.fragment.unbind(),this.fragment=new iv({template:this.template,root:this,owner:this})),e=this.render(this.el,this.anchor)}else e=ys.start(this,!0),this.viewmodel.mark(Yo),ys.end();return sv.fire(this,t),e}function La(t){var e,n;Ju.init(null,this,{template:t}),e=this.transitionsEnabled,this.transitionsEnabled=!1,(n=this.component)&&(n.shouldDestroy=!0),this.unrender(),n&&(n.shouldDestroy=!1),this.fragment.unbind(),this.fragment=new iv({template:this.template,root:this,owner:this}),this.render(this.el,this.anchor),this.transitionsEnabled=e}function Fa(t,e){var n,r;if(r=ys.start(this,!0),c(t)){n=t;for(t in n)n.hasOwnProperty(t)&&(e=n[t],Na(this,t,e))}else Na(this,t,e);return ys.end(),r}function Na(t,e,n){e=E(C(e)),e.isPattern?S(t,e).forEach(function(e){t.viewmodel.set(e,n)}):t.viewmodel.set(e,n)}function Ra(t,e){return Jo(this,t,void 0===e?-1:-e)}function Da(){var t;return this.fragment.unbind(),this.viewmodel.teardown(),this._observers.forEach(Q),this.fragment.rendered&&this.el.__ractive_instances__&&R(this.el.__ractive_instances__,this),this.shouldDestroy=!0,t=this.fragment.rendered?this.unrender():cs.resolve(),gv.fire(this),this._boundFunctions.forEach(Ia),t}function Ia(t){delete t.fn[t.prop]}function qa(t){var e=this;if("string"!=typeof t)throw new TypeError(Ro);var n=void 0;return/\*/.test(t)?(n={},S(this,E(C(t))).forEach(function(t){n[t.str]=!e.viewmodel.get(t)}),this.set(n)):this.set(t,!this.get(t))}function Ba(){return this.fragment.toString(!0)}function Va(){var t,e;if(!this.fragment.rendered)return m("ractive.unrender() was called on a Ractive instance that was not rendered"),cs.resolve();for(t=ys.start(this,!0),e=!this.component||this.component.shouldDestroy||this.shouldDestroy;this._animations[0];)this._animations[0].stop();return this.fragment.unrender(e),R(this.el.__ractive_instances__,this),wv.fire(this),ys.end(),t}function Ua(t){var e;return t=E(t)||Yo,e=ys.start(this,!0),this.viewmodel.mark(t),ys.end(),Ev.fire(this,t),e}function za(t,e){var n,r,i;if("string"!=typeof t||e){i=[];for(r in this._twowayBindings)(!t||E(r).equalsOrStartsWith(t))&&i.push.apply(i,this._twowayBindings[r])}else i=this._twowayBindings[t];return n=Wa(this,i),this.set(n)}function Wa(t,e){var n={},r=[];return e.forEach(function(t){var e,i;if(!t.radioName||t.element.node.checked){if(t.checkboxName)return void(r[t.keypath.str]||t.changed()||(r.push(t.keypath),r[t.keypath.str]=t));e=t.attribute.value,i=t.getValue(),L(e,i)||s(e,i)||(n[t.keypath.str]=i)}}),r.length&&r.forEach(function(t){var e,i,a;e=r[t.str],i=e.attribute.value,a=e.getValue(),L(i,a)||(n[t.str]=a)}),n}function Ha(t,e){return"function"==typeof e&&/_super/.test(t)}function Ga(t){for(var e={};t;)Ka(t,e),Qa(t,e),t=t._Parent!==Mv?t._Parent:!1;return e}function Ka(t,e){ic.forEach(function(n){$a(n.useDefaults?t.prototype:t,e,n.name)})}function $a(t,e,n){var r,i=Object.keys(t[n]);i.length&&((r=e[n])||(r=e[n]={}),i.filter(function(t){return!(t in r)}).forEach(function(e){return r[e]=t[n][e]}))}function Qa(t,e){Object.keys(t.prototype).forEach(function(n){if("computed"!==n){var r=t.prototype[n];if(n in e){if("function"==typeof e[n]&&"function"==typeof r&&e[n]._method){var i=void 0,a=r._method;a&&(r=r._method),i=Cv(e[n]._method,r),a&&(i._method=i),e[n]=i}}else e[n]=r._method?r._method:r}})}function Ya(){for(var t=arguments.length,e=Array(t),n=0;t>n;n++)e[n]=arguments[n];return e.length?e.reduce(Ja,this):Ja(this)}function Ja(t){var e,n,i=void 0===arguments[1]?{}:arguments[1];return i.prototype instanceof Mv&&(i=Av(i)),e=function(t){return this instanceof e?void Pm(this,t):new e(t)},n=Eo(t.prototype),n.constructor=e,Oo(e,{defaults:{value:n},extend:{value:Ya,writable:!0,configurable:!0
},_Parent:{value:t}}),cc.extend(t,n,i),Hu.extend(t,n,i),i.computed&&(n.computed=r(Eo(t.prototype.computed),i.computed)),e.prototype=n,e}var Xa,Za,to,eo,no,ro,io,ao=3,oo={el:void 0,append:!1,template:{v:ao,t:[]},preserveWhitespace:!1,sanitize:!1,stripComments:!0,delimiters:["{{","}}"],tripleDelimiters:["{{{","}}}"],interpolate:!1,data:{},computed:{},magic:!1,modifyArrays:!0,adapt:[],isolated:!1,twoway:!0,lazy:!1,noIntro:!1,transitionsEnabled:!0,complete:void 0,css:null,noCssTransform:!1},so=oo,uo={linear:function(t){return t},easeIn:function(t){return Math.pow(t,3)},easeOut:function(t){return Math.pow(t-1,3)+1},easeInOut:function(t){return(t/=.5)<1?.5*Math.pow(t,3):.5*(Math.pow(t-2,3)+2)}};Xa="object"==typeof document,Za="undefined"!=typeof navigator&&/jsDom/.test(navigator.appName),to="undefined"!=typeof console&&"function"==typeof console.warn&&"function"==typeof console.warn.apply;try{Object.defineProperty({},"test",{value:0}),eo=!0}catch(co){eo=!1}no={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"},ro="undefined"==typeof document?!1:document&&document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1"),io=["o","ms","moz","webkit"];var lo,po,fo,ho,mo,vo,go,yo,bo;if(lo=ro?function(t,e){return e&&e!==no.html?document.createElementNS(e,t):document.createElement(t)}:function(t,e){if(e&&e!==no.html)throw"This browser does not support namespaces other than http://www.w3.org/1999/xhtml. The most likely cause of this error is that you're trying to render SVG in an older browser. See http://docs.ractivejs.org/latest/svg-and-older-browsers for more information";return document.createElement(t)},Xa){for(fo=lo("div"),ho=["matches","matchesSelector"],bo=function(t){return function(e,n){return e[t](n)}},go=ho.length;go--&&!po;)if(mo=ho[go],fo[mo])po=bo(mo);else for(yo=io.length;yo--;)if(vo=io[go]+mo.substr(0,1).toUpperCase()+mo.substring(1),fo[vo]){po=bo(vo);break}po||(po=function(t,e){var n,r,i;for(r=t.parentNode,r||(fo.innerHTML="",r=fo,t=t.cloneNode(),fo.appendChild(t)),n=r.querySelectorAll(e),i=n.length;i--;)if(n[i]===t)return!0;return!1})}else po=null;var xo,wo,_o,ko=function(){};"undefined"==typeof window?_o=null:(xo=window,wo=xo.document,_o={},wo||(_o=null),Date.now||(Date.now=function(){return+new Date}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+/,"").replace(/\s+$/,"")}),Object.keys||(Object.keys=function(){var t=Object.prototype.hasOwnProperty,e=!{toString:null}.propertyIsEnumerable("toString"),n=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],r=n.length;return function(i){if("object"!=typeof i&&"function"!=typeof i||null===i)throw new TypeError("Object.keys called on non-object");var a=[];for(var o in i)t.call(i,o)&&a.push(o);if(e)for(var s=0;r>s;s++)t.call(i,n[s])&&a.push(n[s]);return a}}()),Array.prototype.indexOf||(Array.prototype.indexOf=function(t,e){var n;for(void 0===e&&(e=0),0>e&&(e+=this.length),0>e&&(e=0),n=this.length;n>e;e++)if(this.hasOwnProperty(e)&&this[e]===t)return e;return-1}),Array.prototype.forEach||(Array.prototype.forEach=function(t,e){var n,r;for(n=0,r=this.length;r>n;n+=1)this.hasOwnProperty(n)&&t.call(e,this[n],n,this)}),Array.prototype.map||(Array.prototype.map=function(t,e){var n,r,i,a=this,o=[];for(a instanceof String&&(a=""+a,i=!0),n=0,r=a.length;r>n;n+=1)(a.hasOwnProperty(n)||i)&&(o[n]=t.call(e,a[n],n,a));return o}),"function"!=typeof Array.prototype.reduce&&(Array.prototype.reduce=function(t,e){var n,r,i,a;if("function"!=typeof t)throw new TypeError(t+" is not a function");for(i=this.length,a=!1,arguments.length>1&&(r=e,a=!0),n=0;i>n;n+=1)this.hasOwnProperty(n)?a&&(r=t(r,this[n],n,this)):(r=this[n],a=!0);if(!a)throw new TypeError("Reduce of empty array with no initial value");return r}),Array.prototype.filter||(Array.prototype.filter=function(t,e){var n,r,i=[];for(n=0,r=this.length;r>n;n+=1)this.hasOwnProperty(n)&&t.call(e,this[n],n,this)&&(i[i.length]=this[n]);return i}),Array.prototype.every||(Array.prototype.every=function(t,e){var n,r,i;if(null==this)throw new TypeError;if(n=Object(this),r=n.length>>>0,"function"!=typeof t)throw new TypeError;for(i=0;r>i;i+=1)if(i in n&&!t.call(e,n[i],i,n))return!1;return!0}),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(t){var e,n,r,i,a=[].slice;if("function"!=typeof this)throw new TypeError("Function.prototype.bind called on non-function");return e=a.call(arguments,1),n=this,r=function(){},i=function(){var i=this instanceof r&&t?this:t;return n.apply(i,e.concat(a.call(arguments)))},r.prototype=this.prototype,i.prototype=new r,i}),xo.addEventListener||!function(t,e){var n,r,i,a,o,s;t.appearsToBeIELessEqual8=!0,n=function(t,e){var n,r=this;for(n in t)r[n]=t[n];r.currentTarget=e,r.target=t.srcElement||e,r.timeStamp=+new Date,r.preventDefault=function(){t.returnValue=!1},r.stopPropagation=function(){t.cancelBubble=!0}},r=function(t,e){var r,i,a=this;r=a.listeners||(a.listeners=[]),i=r.length,r[i]=[e,function(t){e.call(a,new n(t,a))}],a.attachEvent("on"+t,r[i][1])},i=function(t,e){var n,r,i=this;if(i.listeners)for(n=i.listeners,r=n.length;r--;)n[r][0]===e&&i.detachEvent("on"+t,n[r][1])},t.addEventListener=e.addEventListener=r,t.removeEventListener=e.removeEventListener=i,"Element"in t?(t.Element.prototype.addEventListener=r,t.Element.prototype.removeEventListener=i):(s=e.createElement,e.createElement=function(t){var e=s(t);return e.addEventListener=r,e.removeEventListener=i,e},a=e.getElementsByTagName("head")[0],o=e.createElement("style"),a.insertBefore(o,a.firstChild))}(xo,wo),xo.getComputedStyle||(_o.getComputedStyle=function(){function t(n,r,i,a){var o,s=r[i],u=parseFloat(s),c=s.split(/\d/)[0];return isNaN(u)&&/^thin|medium|thick$/.test(s)&&(u=e(s),c=""),a=null!=a?a:/%|em/.test(c)&&n.parentElement?t(n.parentElement,n.parentElement.currentStyle,"fontSize",null):16,o="fontSize"==i?a:/width/i.test(i)?n.clientWidth:n.clientHeight,"em"==c?u*a:"in"==c?96*u:"pt"==c?96*u/72:"%"==c?u/100*o:u}function e(t){var e,n;return a[t]||(e=document.createElement("div"),e.style.display="block",e.style.position="fixed",e.style.width=e.style.height="0",e.style.borderRight=t+" solid black",document.getElementsByTagName("body")[0].appendChild(e),n=e.getBoundingClientRect(),a[t]=n.right-n.left),a[t]}function n(t,e){var n="border"==e?"Width":"",r=e+"Top"+n,i=e+"Right"+n,a=e+"Bottom"+n,o=e+"Left"+n;t[e]=(t[r]==t[i]==t[a]==t[o]?[t[r]]:t[r]==t[a]&&t[o]==t[i]?[t[r],t[i]]:t[o]==t[i]?[t[r],t[i],t[a]]:[t[r],t[i],t[a],t[o]]).join(" ")}function r(e){var r,i,a,s;r=e.currentStyle,i=this,a=t(e,r,"fontSize",null);for(s in r)"normal"===r[s]&&o.hasOwnProperty(s)?i[s]=o[s]:/width|height|margin.|padding.|border.+W/.test(s)?"auto"===r[s]?/^width|height/.test(s)?i[s]=("width"===s?e.clientWidth:e.clientHeight)+"px":/(?:padding)?Top|Bottom$/.test(s)&&(i[s]="0px"):i[s]=t(e,r,s,a)+"px":"styleFloat"===s?i["float"]=r[s]:i[s]=r[s];return n(i,"margin"),n(i,"padding"),n(i,"border"),i.fontSize=a+"px",i}function i(t){return new r(t)}var a={},o={fontWeight:400,lineHeight:1.2,letterSpacing:0};return r.prototype={constructor:r,getPropertyPriority:ko,getPropertyValue:function(t){return this[t]||""},item:ko,removeProperty:ko,setProperty:ko,getPropertyCSSValue:ko},i}()));var Eo,So,Oo,Co=_o;try{Object.defineProperty({},"test",{value:0}),Xa&&Object.defineProperty(document.createElement("div"),"test",{value:0}),So=Object.defineProperty}catch(Ao){So=function(t,e,n){t[e]=n.value}}try{try{Object.defineProperties({},{test:{value:0}})}catch(Ao){throw Ao}Xa&&Object.defineProperties(lo("div"),{test:{value:0}}),Oo=Object.defineProperties}catch(Ao){Oo=function(t,e){var n;for(n in e)e.hasOwnProperty(n)&&So(t,n,e[n])}}try{Object.create(null),Eo=Object.create}catch(Ao){Eo=function(){var t=function(){};return function(e,n){var r;return null===e?{}:(t.prototype=e,r=new t,n&&Object.defineProperties(r,n),r)}}()}var Po,To,jo,Mo=Object.prototype.hasOwnProperty,Lo=Object.prototype.toString,Fo=/^\[object (?:Array|FileList)\]$/,No={};to?!function(){var t=["%cRactive.js %c0.7.3 %cin debug mode, %cmore...","color: rgb(114, 157, 52); font-weight: normal;","color: rgb(85, 85, 85); font-weight: normal;","color: rgb(85, 85, 85); font-weight: normal;","color: rgb(82, 140, 224); font-weight: normal; text-decoration: underline;"],e="You're running Ractive 0.7.3 in debug mode - messages will be printed to the console to help you fix problems and optimise your application.\n\nTo disable debug mode, add this line at the start of your app:\n Ractive.DEBUG = false;\n\nTo disable debug mode when your app is minified, add this snippet:\n Ractive.DEBUG = /unminified/.test(function(){/*unminified*/});\n\nGet help and support:\n http://docs.ractivejs.org\n http://stackoverflow.com/questions/tagged/ractivejs\n http://groups.google.com/forum/#!forum/ractive-js\n http://twitter.com/ractivejs\n\nFound a bug? Raise an issue:\n https://github.com/ractivejs/ractive/issues\n\n";jo=function(){var n=!!console.groupCollapsed;console[n?"groupCollapsed":"log"].apply(console,t),console.log(e),n&&console.groupEnd(t),jo=ko},To=function(t,e){if(jo(),"object"==typeof e[e.length-1]){var n=e.pop(),r=n?n.ractive:null;if(r){var i=void 0;r.component&&(i=r.component.name)&&(t="<"+i+"> "+t);var a=void 0;(a=n.node||r.fragment&&r.fragment.rendered&&r.find("*"))&&e.push(a)}}console.warn.apply(console,["%cRactive.js: %c"+t,"color: rgb(114, 157, 52);","color: rgb(85, 85, 85);"].concat(e))},Po=function(){console.log.apply(console,arguments)}}():To=Po=jo=ko;var Ro="Bad arguments",Do='A function was specified for "%s" %s, but no %s was returned',Io=function(t,e){return'Missing "'+t+'" '+e+" plugin. You may need to download a plugin via http://docs.ractivejs.org/latest/plugins#"+e+"s"},qo=function(t,e,n,r){if(t===e)return b(e);if(r){var i=g("interpolators",n,r);if(i)return i(t,e)||b(e);p(Io(r,"interpolator"))}return Uo.number(t,e)||Uo.array(t,e)||Uo.object(t,e)||b(e)},Bo=qo,Vo={number:function(t,e){var n;return u(t)&&u(e)?(t=+t,e=+e,n=e-t,n?function(e){return t+e*n}:function(){return t}):null},array:function(t,e){var n,r,i,o;if(!a(t)||!a(e))return null;for(n=[],r=[],o=i=Math.min(t.length,e.length);o--;)r[o]=Bo(t[o],e[o]);for(o=i;o=this.duration?(null!==a&&(ys.start(this.root),this.root.viewmodel.set(a,this.to),ys.end()),this.step&&this.step(1,this.to),this.complete(this.to),i=this.root._animations.indexOf(this),-1===i&&m("Animation was not found"),this.root._animations.splice(i,1),this.running=!1,!1):(e=this.easing?this.easing(t/this.duration):t/this.duration,null!==a&&(n=this.interpolator(e),ys.start(this.root),this.root.viewmodel.set(a,n),ys.end()),this.step&&this.step(e,n),!0)):!1},stop:function(){var t;this.running=!1,t=this.root._animations.indexOf(this),-1===t&&m("Animation was not found"),this.root._animations.splice(t,1)}};var ks=_s,Es=nt,Ss={stop:ko},Os=it,Cs=new as("detach"),As=at,Ps=ot,Ts=function(){var t,e,n;t=this._root[this._isComponentQuery?"liveComponentQueries":"liveQueries"],e=this.selector,n=t.indexOf(e),-1!==n&&(t.splice(n,1),t[e]=null)},js=function(t,e){var n,r,i,a,o,s,u,c,l,p;for(n=ut(t.component||t._ractive.proxy),r=ut(e.component||e._ractive.proxy),i=N(n),a=N(r);i&&i===a;)n.pop(),r.pop(),o=i,i=N(n),a=N(r);if(i=i.component||i,a=a.component||a,l=i.parentFragment,p=a.parentFragment,l===p)return s=l.items.indexOf(i),u=p.items.indexOf(a),s-u||n.length-r.length;if(c=o.fragments)return s=c.indexOf(l),u=c.indexOf(p),s-u||n.length-r.length;throw Error("An unexpected condition was met while comparing the position of two components. Please file an issue at https://github.com/RactiveJS/Ractive/issues - thanks!")},Ms=function(t,e){var n;return t.compareDocumentPosition?(n=t.compareDocumentPosition(e),2&n?1:-1):js(t,e)},Ls=function(){this.sort(this._isComponentQuery?js:Ms),this._dirty=!1},Fs=function(){var t=this;this._dirty||(this._dirty=!0,ys.scheduleTask(function(){t._sort()}))},Ns=function(t){var e=this.indexOf(this._isComponentQuery?t.instance:t);-1!==e&&this.splice(e,1)},Rs=ct,Ds=lt,Is=pt,qs=ft,Bs=dt,Vs=ht,Us={enqueue:function(t,e){t.event&&(t._eventQueue=t._eventQueue||[],t._eventQueue.push(t.event)),t.event=e},dequeue:function(t){t._eventQueue&&t._eventQueue.length?t.event=t._eventQueue.pop():delete t.event}},zs=Us,Ws=mt,Hs=yt,Gs=bt,Ks={capture:!0,noUnwrap:!0,fullRootGet:!0},$s=xt,Qs=new as("insert"),Ys=_t,Js=function(t,e,n,r){this.root=t,this.keypath=e,this.callback=n,this.defer=r.defer,this.context=r&&r.context?r.context:t};Js.prototype={init:function(t){this.value=this.root.get(this.keypath.str),t!==!1?this.update():this.oldValue=this.value},setValue:function(t){var e=this;s(t,this.value)||(this.value=t,this.defer&&this.ready?ys.scheduleTask(function(){return e.update()}):this.update())},update:function(){this.updating||(this.updating=!0,this.callback.call(this.context,this.value,this.oldValue,this.keypath.str),this.oldValue=this.value,this.updating=!1)}};var Xs,Zs=Js,tu=kt,eu=Array.prototype.slice;Xs=function(t,e,n,r){this.root=t,this.callback=n,this.defer=r.defer,this.keypath=e,this.regex=RegExp("^"+e.str.replace(/\./g,"\\.").replace(/\*/g,"([^\\.]+)")+"$"),this.values={},this.defer&&(this.proxies=[]),this.context=r&&r.context?r.context:t},Xs.prototype={init:function(t){var e,n;if(e=tu(this.root,this.keypath),t!==!1)for(n in e)e.hasOwnProperty(n)&&this.update(E(n));else this.values=e},update:function(t){var e,n=this;if(t.isPattern){e=tu(this.root,t);for(t in e)e.hasOwnProperty(t)&&this.update(E(t))}else if(!this.root.viewmodel.implicitChanges[t.str])return this.defer&&this.ready?void ys.scheduleTask(function(){return n.getProxy(t).update()}):void this.reallyUpdate(t)},reallyUpdate:function(t){var e,n,r,i;return e=t.str,n=this.root.viewmodel.get(t),this.updating?void(this.values[e]=n):(this.updating=!0,s(n,this.values[e])&&this.ready||(r=eu.call(this.regex.exec(e),1),i=[n,this.values[e],e].concat(r),this.values[e]=n,this.callback.apply(this.context,i)),void(this.updating=!1))},getProxy:function(t){var e=this;return this.proxies[t.str]||(this.proxies[t.str]={update:function(){return e.reallyUpdate(t)}}),this.proxies[t.str]}};var nu,ru,iu,au,ou,su,uu=Xs,cu=Et,lu={},pu=St,fu=Ot,du=function(t){return t.trim()},hu=function(t){return""!==t},mu=Ct,vu=At,gu=Pt,yu=Tt,bu=Array.prototype,xu=function(t){return function(e){for(var n=arguments.length,r=Array(n>1?n-1:0),i=1;n>i;i++)r[i-1]=arguments[i];var o,s,u,c,l=[];if(e=E(C(e)),o=this.viewmodel.get(e),s=o.length,!a(o))throw Error("Called ractive."+t+"('"+e.str+"'), but '"+e.str+"' does not refer to an array");return l=yu(o,t,r),c=bu[t].apply(o,r),u=ys.start(this,!0).then(function(){return c}),l?this.viewmodel.smartUpdate(e,o,l):this.viewmodel.mark(e),ys.end(),u}},wu=xu("pop"),_u=xu("push"),ku="/* Ractive.js component styles */\n",Eu=[],Su=!1;Xa?(iu=document.createElement("style"),iu.type="text/css",au=document.getElementsByTagName("head")[0],su=!1,ou=iu.styleSheet,ru=function(){var t=ku+Eu.map(function(t){return"\n/* {"+t.id+"} */\n"+t.styles}).join("\n");ou?ou.cssText=t:iu.innerHTML=t,su||(au.appendChild(iu),su=!0)},nu={add:function(t){Eu.push(t),Su=!0},apply:function(){Su&&(ru(),Su=!1)}}):nu={add:ko,apply:ko};var Ou,Cu,Au,Pu=nu,Tu=Mt,ju=new as("render"),Mu=new as("complete"),Lu={extend:function(t,e,n){e.adapt=Ft(e.adapt,F(n.adapt))},init:function(){}},Fu=Lu,Nu=Nt,Ru=/(?:^|\})?\s*([^\{\}]+)\s*\{/g,Du=/\/\*.*?\*\//g,Iu=/((?:(?:\[[^\]+]\])|(?:[^\s\+\>\~:]))+)((?::[^\s\+\>\~\(]+(?:\([^\)]+\))?)?\s*[\s\+\>\~]?)\s*/g,qu=/^@media/,Bu=/\[data-ractive-css~="\{[a-z0-9-]+\}"]/g,Vu=1,Uu={name:"css",extend:function(t,e,n){if(n.css){var r=Vu++,i=n.noCssTransform?n.css:Nu(n.css,r);e.cssId=r,Pu.add({id:r,styles:i})}},init:function(){}},zu=Uu,Wu={name:"data",extend:function(t,e,n){var r=void 0,i=void 0;if(n.data&&c(n.data))for(r in n.data)i=n.data[r],i&&"object"==typeof i&&(c(i)||a(i))&&m("Passing a `data` option with object and array properties to Ractive.extend() is discouraged, as mutating them is likely to cause bugs. Consider using a data function instead:\n\n // this...\n data: function () {\n return {\n myObject: {}\n };\n })\n\n // instead of this:\n data: {\n myObject: {}\n }");e.data=qt(e.data,n.data)},init:function(t,e,n){var r=qt(t.prototype.data,n.data);return"function"==typeof r&&(r=r.call(e)),r||{}},reset:function(t){var e=this.init(t.constructor,t,t.viewmodel);return t.viewmodel.reset(e),!0}},Hu=Wu,Gu=null,Ku=["preserveWhitespace","sanitize","stripComments","delimiters","tripleDelimiters","interpolate"],$u={fromId:Wt,isHashedId:Ht,isParsed:Gt,getParseOptions:Kt,createHelper:Ut,parse:zt},Qu=$u,Yu={name:"template",extend:function(t,e,n){var r;"template"in n&&(r=n.template,"function"==typeof r?e.template=r:e.template=Jt(r,e))},init:function(t,e,n){var r,i;r="template"in n?n.template:t.prototype.template,"function"==typeof r&&(i=r,r=Qt(e,i),e._config.template={fn:i,result:r}),r=Jt(r,e),e.template=r.t,r.p&&Xt(e.partials,r.p)},reset:function(t){var e,n=$t(t);return n?(e=Jt(n,t),t.template=e.t,Xt(t.partials,e.p,!0),!0):void 0}},Ju=Yu;Ou=["adaptors","components","computed","decorators","easing","events","interpolators","partials","transitions"],Cu=function(t,e){this.name=t,this.useDefaults=e},Cu.prototype={constructor:Cu,extend:function(t,e,n){this.configure(this.useDefaults?t.defaults:t,this.useDefaults?e:e.constructor,n)},init:function(){},configure:function(t,e,n){var r,i=this.name,a=n[i];r=Eo(t[i]);for(var o in a)r[o]=a[o];e[i]=r},reset:function(t){var e=t[this.name],n=!1;return Object.keys(e).forEach(function(t){var r=e[t];r._fn&&(r._fn.isOwner?e[t]=r._fn:delete e[t],n=!0)}),n}},Au=Ou.map(function(t){return new Cu(t,"computed"===t)});var Xu,Zu,tc,ec,nc,rc,ic=Au,ac=Zt,oc=re;ec={adapt:Fu,css:zu,data:Hu,template:Ju},tc=Object.keys(so),rc=oe(tc.filter(function(t){return!ec[t]})),nc=oe(tc.concat(ic.map(function(t){return t.name}))),Zu=[].concat(tc.filter(function(t){return!ic[t]&&!ec[t]}),ic,ec.data,ec.template,ec.css),Xu={extend:function(t,e,n){return ie("extend",t,e,n)},init:function(t,e,n){return ie("init",t,e,n)},reset:function(t){return Zu.filter(function(e){return e.reset&&e.reset(t)}).map(function(t){return t.name})},order:Zu};var sc,uc,cc=Xu,lc=se,pc=ue,fc=ce,dc=le,hc=pe,mc=fe,vc=de,gc=he,yc=/^\s+/;uc=function(t){this.name="ParseError",this.message=t;try{throw Error(t)}catch(e){this.stack=e.stack}},uc.prototype=Error.prototype,sc=function(t,e){var n,r,i=0;for(this.str=t,this.options=e||{},this.pos=0,this.lines=this.str.split("\n"),this.lineEnds=this.lines.map(function(t){var e=i+t.length+1;return i=e,e},0),this.init&&this.init(t,e),n=[];this.posn;n+=1)if(this.pos=e,i=t[n](this))return i;return null},getLinePos:function(t){for(var e,n=0,r=0;t>=this.lineEnds[n];)r=this.lineEnds[n],n+=1;return e=t-r,[n+1,e+1,t]},error:function(t){var e=this.getLinePos(this.pos),n=e[0],r=e[1],i=this.lines[e[0]-1],a=0,o=i.replace(/\t/g,function(t,n){return n/g,pl=/&/g;var gl=function(){return e(this.node)},yl=function(t){this.type=kc,this.text=t.template};yl.prototype={detach:gl,firstNode:function(){
return this.node},render:function(){return this.node||(this.node=document.createTextNode(this.text)),this.node},toString:function(t){return t?Ee(this.text):this.text},unrender:function(t){return t?this.detach():void 0}};var bl=yl,xl=Se,wl=Oe,_l=function(t,e,n){var r;this.ref=e,this.resolved=!1,this.root=t.root,this.parentFragment=t.parentFragment,this.callback=n,r=ps(t.root,e,t.parentFragment),void 0!=r?this.resolve(r):ys.addUnresolved(this)};_l.prototype={resolve:function(t){this.keypath&&!t&&ys.addUnresolved(this),this.resolved=!0,this.keypath=t,this.callback(t)},forceResolution:function(){this.resolve(E(this.ref))},rebind:function(t,e){var n;void 0!=this.keypath&&(n=this.keypath.replace(t,e),void 0!==n&&this.resolve(n))},unbind:function(){this.resolved||ys.removeUnresolved(this)}};var kl=_l,El=function(t,e,n){this.parentFragment=t.parentFragment,this.ref=e,this.callback=n,this.rebind()},Sl={"@keypath":{prefix:"c",prop:["context"]},"@index":{prefix:"i",prop:["index"]},"@key":{prefix:"k",prop:["key","index"]}};El.prototype={rebind:function(){var t,e=this.ref,n=this.parentFragment,r=Sl[e];if(!r)throw Error('Unknown special reference "'+e+'" - valid references are @index, @key and @keypath');if(this.cached)return this.callback(E("@"+r.prefix+Ce(this.cached,r)));if(-1!==r.prop.indexOf("index")||-1!==r.prop.indexOf("key"))for(;n;){if(n.owner.currentSubtype===qc&&void 0!==(t=Ce(n,r)))return this.cached=n,n.registerIndexRef(this),this.callback(E("@"+r.prefix+t));n=!n.parent&&n.owner&&n.owner.component&&n.owner.component.parentFragment&&!n.owner.component.instance.isolated?n.owner.component.parentFragment:n.parent}else for(;n;){if(void 0!==(t=Ce(n,r)))return this.callback(E("@"+r.prefix+t.str));n=n.parent}},unbind:function(){this.cached&&this.cached.unregisterIndexRef(this)}};var Ol=El,Cl=function(t,e,n){this.parentFragment=t.parentFragment,this.ref=e,this.callback=n,e.ref.fragment.registerIndexRef(this),this.rebind()};Cl.prototype={rebind:function(){var t,e=this.ref.ref;t="k"===e.ref.t?"k"+e.fragment.key:"i"+e.fragment.index,void 0!==t&&this.callback(E("@"+t))},unbind:function(){this.ref.ref.fragment.unregisterIndexRef(this)}};var Al=Cl,Pl=Ae;Ae.resolve=function(t){var e,n,r={};for(e in t.refs)n=t.refs[e],r[n.ref.n]="k"===n.ref.t?n.fragment.key:n.fragment.index;return r};var Tl,jl=Pe,Ml=Te,Ll={},Fl=Function.prototype.bind;Tl=function(t,e,n,r){var i,a=this;i=t.root,this.root=i,this.parentFragment=e,this.callback=r,this.owner=t,this.str=n.s,this.keypaths=[],this.pending=n.r.length,this.refResolvers=n.r.map(function(t,e){return jl(a,t,function(t){a.resolve(e,t)})}),this.ready=!0,this.bubble()},Tl.prototype={bubble:function(){this.ready&&(this.uniqueString=Me(this.str,this.keypaths),this.keypath=Le(this.uniqueString),this.createEvaluator(),this.callback(this.keypath))},unbind:function(){for(var t;t=this.refResolvers.pop();)t.unbind()},resolve:function(t,e){this.keypaths[t]=e,this.bubble()},createEvaluator:function(){var t,e,n,r,i,a=this;r=this.keypath,t=this.root.viewmodel.computations[r.str],t?this.root.viewmodel.mark(r):(i=Ml(this.str,this.refResolvers.length),e=this.keypaths.map(function(t){var e;return"undefined"===t?function(){}:t.isSpecial?(e=t.value,function(){return e}):function(){var e=a.root.viewmodel.get(t,{noUnwrap:!0,fullRootGet:!0});return"function"==typeof e&&(e=Ne(e,a.root)),e}}),n={deps:this.keypaths.filter(Fe),getter:function(){var t=e.map(je);return i.apply(null,t)}},t=this.root.viewmodel.compute(r,n))},rebind:function(t,e){this.refResolvers.forEach(function(n){return n.rebind(t,e)})}};var Nl=Tl,Rl=function(t,e,n){var r=this;this.resolver=e,this.root=e.root,this.parentFragment=n,this.viewmodel=e.root.viewmodel,"string"==typeof t?this.value=t:t.t===Rc?this.refResolver=jl(this,t.n,function(t){r.resolve(t)}):new Nl(e,n,t,function(t){r.resolve(t)})};Rl.prototype={resolve:function(t){this.keypath&&this.viewmodel.unregister(this.keypath,this),this.keypath=t,this.value=this.viewmodel.get(t),this.bind(),this.resolver.bubble()},bind:function(){this.viewmodel.register(this.keypath,this)},rebind:function(t,e){this.refResolver&&this.refResolver.rebind(t,e)},setValue:function(t){this.value=t,this.resolver.bubble()},unbind:function(){this.keypath&&this.viewmodel.unregister(this.keypath,this),this.refResolver&&this.refResolver.unbind()},forceResolution:function(){this.refResolver&&this.refResolver.forceResolution()}};var Dl=Rl,Il=function(t,e,n){var r,i,a,o,s=this;this.parentFragment=o=t.parentFragment,this.root=r=t.root,this.mustache=t,this.ref=i=e.r,this.callback=n,this.unresolved=[],(a=ps(r,i,o))?this.base=a:this.baseResolver=new kl(this,i,function(t){s.base=t,s.baseResolver=null,s.bubble()}),this.members=e.m.map(function(t){return new Dl(t,s,o)}),this.ready=!0,this.bubble()};Il.prototype={getKeypath:function(){var t=this.members.map(Re);return!t.every(De)||this.baseResolver?null:this.base.join(t.join("."))},bubble:function(){this.ready&&!this.baseResolver&&this.callback(this.getKeypath())},unbind:function(){this.members.forEach(K)},rebind:function(t,e){var n;if(this.base){var r=this.base.replace(t,e);r&&r!==this.base&&(this.base=r,n=!0)}this.members.forEach(function(r){r.rebind(t,e)&&(n=!0)}),n&&this.bubble()},forceResolution:function(){this.baseResolver&&(this.base=E(this.ref),this.baseResolver.unbind(),this.baseResolver=null),this.members.forEach(Ie),this.bubble()}};var ql=Il,Bl=qe,Vl=Be,Ul=Ve,zl={getValue:wl,init:Bl,resolve:Vl,rebind:Ul},Wl=function(t){this.type=Ec,zl.init(this,t)};Wl.prototype={update:function(){this.node.data=void 0==this.value?"":this.value},resolve:zl.resolve,rebind:zl.rebind,detach:gl,unbind:xl,render:function(){return this.node||(this.node=document.createTextNode(n(this.value))),this.node},unrender:function(t){t&&e(this.node)},getValue:zl.getValue,setValue:function(t){var e;this.keypath&&(e=this.root.viewmodel.wrapped[this.keypath.str])&&(t=e.get()),s(t,this.value)||(this.value=t,this.parentFragment.bubble(),this.node&&ys.addView(this))},firstNode:function(){return this.node},toString:function(t){var e=""+n(this.value);return t?Ee(e):e}};var Hl=Wl,Gl=Ue,Kl=ze,$l=We,Ql=He,Yl=Ge,Jl=Ke,Xl=$e,Zl=Qe,tp=Ye,ep=function(t,e){zl.rebind.call(this,t,e)},np=Xe,rp=Ze,ip=pn,ap=fn,op=dn,sp=vn,up=function(t){this.type=Oc,this.subtype=this.currentSubtype=t.template.n,this.inverted=this.subtype===Ic,this.pElement=t.pElement,this.fragments=[],this.fragmentsToCreate=[],this.fragmentsToRender=[],this.fragmentsToUnrender=[],t.template.i&&(this.indexRefs=t.template.i.split(",").map(function(t,e){return{n:t,t:0===e?"k":"i"}})),this.renderedFragments=[],this.length=0,zl.init(this,t)};up.prototype={bubble:Gl,detach:Kl,find:$l,findAll:Ql,findAllComponents:Yl,findComponent:Jl,findNextNode:Xl,firstNode:Zl,getIndexRef:function(t){if(this.indexRefs)for(var e=this.indexRefs.length;e--;){var n=this.indexRefs[e];if(n.n===t)return n}},getValue:zl.getValue,shuffle:tp,rebind:ep,render:np,resolve:zl.resolve,setValue:rp,toString:ip,unbind:ap,unrender:op,update:sp};var cp,lp,pp=up,fp=gn,dp=yn,hp=bn,mp=xn,vp={};try{lo("table").innerHTML="foo"}catch(Ao){cp=!0,lp={TABLE:['
',"
"],THEAD:['
',"
"],TBODY:['
',"
"],TR:['
',"
"],SELECT:['"]}}var gp=function(t,e,n){var r,i,a,o,s,u=[];if(null!=t&&""!==t){for(cp&&(i=lp[e.tagName])?(r=wn("DIV"),r.innerHTML=i[0]+t+i[1],r=r.querySelector(".x"),"SELECT"===r.tagName&&(a=r.options[r.selectedIndex])):e.namespaceURI===no.svg?(r=wn("DIV"),r.innerHTML='",r=r.querySelector(".x")):(r=wn(e.tagName),r.innerHTML=t,"SELECT"===r.tagName&&(a=r.options[r.selectedIndex]));o=r.firstChild;)u.push(o),n.appendChild(o);if("SELECT"===e.tagName)for(s=u.length;s--;)u[s]!==a&&(u[s].selected=!1)}return u},yp=_n,bp=En,xp=Sn,wp=On,_p=Cn,kp=An,Ep=function(t){this.type=Sc,zl.init(this,t)};Ep.prototype={detach:fp,find:dp,findAll:hp,firstNode:mp,getValue:zl.getValue,rebind:zl.rebind,render:bp,resolve:zl.resolve,setValue:xp,toString:wp,unbind:xl,unrender:_p,update:kp};var Sp,Op,Cp,Ap,Pp=Ep,Tp=function(){this.parentFragment.bubble()},jp=Pn,Mp=function(t){return this.node?po(this.node,t)?this.node:this.fragment&&this.fragment.find?this.fragment.find(t):void 0:null},Lp=function(t,e){e._test(this,!0)&&e.live&&(this.liveQueries||(this.liveQueries=[])).push(e),this.fragment&&this.fragment.findAll(t,e)},Fp=function(t,e){this.fragment&&this.fragment.findAllComponents(t,e)},Np=function(t){return this.fragment?this.fragment.findComponent(t):void 0},Rp=Tn,Dp=jn,Ip=Mn,qp=/^true|on|yes|1$/i,Bp=/^[0-9]+$/,Vp=function(t,e){var n,r,i;return i=e.a||{},r={},n=i.twoway,void 0!==n&&(r.twoway=0===n||qp.test(n)),n=i.lazy,void 0!==n&&(0!==n&&Bp.test(n)?r.lazy=parseInt(n):r.lazy=0===n||qp.test(n)),r},Up=Ln;Sp="altGlyph altGlyphDef altGlyphItem animateColor animateMotion animateTransform clipPath feBlend feColorMatrix feComponentTransfer feComposite feConvolveMatrix feDiffuseLighting feDisplacementMap feDistantLight feFlood feFuncA feFuncB feFuncG feFuncR feGaussianBlur feImage feMerge feMergeNode feMorphology feOffset fePointLight feSpecularLighting feSpotLight feTile feTurbulence foreignObject glyphRef linearGradient radialGradient textPath vkern".split(" "),Op="attributeName attributeType baseFrequency baseProfile calcMode clipPathUnits contentScriptType contentStyleType diffuseConstant edgeMode externalResourcesRequired filterRes filterUnits glyphRef gradientTransform gradientUnits kernelMatrix kernelUnitLength keyPoints keySplines keyTimes lengthAdjust limitingConeAngle markerHeight markerUnits markerWidth maskContentUnits maskUnits numOctaves pathLength patternContentUnits patternTransform patternUnits pointsAtX pointsAtY pointsAtZ preserveAlpha preserveAspectRatio primitiveUnits refX refY repeatCount repeatDur requiredExtensions requiredFeatures specularConstant specularExponent spreadMethod startOffset stdDeviation stitchTiles surfaceScale systemLanguage tableValues targetX targetY textLength viewBox viewTarget xChannelSelector yChannelSelector zoomAndPan".split(" "),Cp=function(t){for(var e={},n=t.length;n--;)e[t[n].toLowerCase()]=t[n];return e},Ap=Cp(Sp.concat(Op));var zp=function(t){var e=t.toLowerCase();return Ap[e]||e},Wp=function(t,e){var n,r;if(n=e.indexOf(":"),-1===n||(r=e.substr(0,n),"xmlns"===r))t.name=t.element.namespace!==no.html?zp(e):e;else if(e=e.substring(n+1),t.name=zp(e),t.namespace=no[r.toLowerCase()],t.namespacePrefix=r,!t.namespace)throw'Unknown namespace ("'+r+'")'},Hp=Fn,Gp=Nn,Kp=Rn,$p=Dn,Qp={"accept-charset":"acceptCharset",accesskey:"accessKey",bgcolor:"bgColor","class":"className",codebase:"codeBase",colspan:"colSpan",contenteditable:"contentEditable",datetime:"dateTime",dirname:"dirName","for":"htmlFor","http-equiv":"httpEquiv",ismap:"isMap",maxlength:"maxLength",novalidate:"noValidate",pubdate:"pubDate",readonly:"readOnly",rowspan:"rowSpan",tabindex:"tabIndex",usemap:"useMap"},Yp=In,Jp=Bn,Xp=Vn,Zp=Un,tf=zn,ef=Wn,nf=Hn,rf=Gn,af=Kn,of=$n,sf=Qn,uf=Yn,cf=Jn,lf=Xn,pf=Zn,ff=function(t){this.init(t)};ff.prototype={bubble:Up,init:Gp,rebind:Kp,render:$p,toString:Yp,unbind:Jp,update:pf};var df,hf=ff,mf=function(t,e){var n,r,i=[];for(n in e)"twoway"!==n&&"lazy"!==n&&e.hasOwnProperty(n)&&(r=new hf({element:t,name:n,value:e[n],root:t.root}),i[n]=r,"value"!==n&&i.push(r));return(r=i.value)&&i.push(r),i};"undefined"!=typeof document&&(df=lo("div"));var vf=function(t,e){this.element=t,this.root=t.root,this.parentFragment=t.parentFragment,this.attributes=[],this.fragment=new iv({root:t.root,owner:this,template:[e]})};vf.prototype={bubble:function(){this.node&&this.update(),this.element.bubble()},rebind:function(t,e){this.fragment.rebind(t,e)},render:function(t){this.node=t,this.isSvg=t.namespaceURI===no.svg,this.update()},unbind:function(){this.fragment.unbind()},update:function(){var t,e,n=this;t=""+this.fragment,e=tr(t,this.isSvg),this.attributes.filter(function(t){return er(e,t)}).forEach(function(t){n.node.removeAttribute(t.name)}),e.forEach(function(t){n.node.setAttribute(t.name,t.value)}),this.attributes=e},toString:function(){return""+this.fragment}};var gf=vf,yf=function(t,e){return e?e.map(function(e){return new gf(t,e)}):[]},bf=function(t){var e,n,r,i;if(this.element=t,this.root=t.root,this.attribute=t.attributes[this.name||"value"],e=this.attribute.interpolator,e.twowayBinding=this,n=e.keypath){if("}"===n.str.slice(-1))return v("Two-way binding does not work with expressions (`%s` on <%s>)",e.resolver.uniqueString,t.name,{ractive:this.root}),!1;if(n.isSpecial)return v("Two-way binding does not work with %s",e.resolver.ref,{ractive:this.root}),!1}else{var a=e.template.r?"'"+e.template.r+"' reference":"expression";m("The %s being used for two-way binding is ambiguous, and may cause unexpected results. Consider initialising your data to eliminate the ambiguity",a,{ractive:this.root}),e.resolver.forceResolution(),n=e.keypath}this.attribute.isTwoway=!0,this.keypath=n,r=this.root.viewmodel.get(n),void 0===r&&this.getInitialValue&&(r=this.getInitialValue(),void 0!==r&&this.root.viewmodel.set(n,r)),(i=nr(t))&&(this.resetValue=r,i.formBindings.push(this))};bf.prototype={handleChange:function(){var t=this;ys.start(this.root),this.attribute.locked=!0,this.root.viewmodel.set(this.keypath,this.getValue()),ys.scheduleTask(function(){return t.attribute.locked=!1}),ys.end()},rebound:function(){var t,e,n;e=this.keypath,n=this.attribute.interpolator.keypath,e!==n&&(R(this.root._twowayBindings[e.str],this),this.keypath=n,t=this.root._twowayBindings[n.str]||(this.root._twowayBindings[n.str]=[]),t.push(this))},unbind:function(){}},bf.extend=function(t){var e,n=this;return e=function(t){bf.call(this,t),this.init&&this.init()},e.prototype=Eo(n.prototype),r(e.prototype,t),e.extend=bf.extend,e};var xf,wf=bf,_f=rr;xf=wf.extend({getInitialValue:function(){return""},getValue:function(){return this.element.node.value},render:function(){var t,e=this.element.node,n=!1;this.rendered=!0,t=this.root.lazy,this.element.lazy===!0?t=!0:this.element.lazy===!1?t=!1:u(this.element.lazy)?(t=!1,n=+this.element.lazy):u(t||"")&&(n=+t,t=!1,this.element.lazy=n),this.handler=n?ar:_f,e.addEventListener("change",_f,!1),t||(e.addEventListener("input",this.handler,!1),e.attachEvent&&e.addEventListener("keyup",this.handler,!1)),e.addEventListener("blur",ir,!1)},unrender:function(){var t=this.element.node;this.rendered=!1,t.removeEventListener("change",_f,!1),t.removeEventListener("input",this.handler,!1),t.removeEventListener("keyup",this.handler,!1),t.removeEventListener("blur",ir,!1)}});var kf=xf,Ef=kf.extend({getInitialValue:function(){return this.element.fragment?""+this.element.fragment:""},getValue:function(){return this.element.node.innerHTML}}),Sf=Ef,Of=or,Cf={},Af=wf.extend({name:"checked",init:function(){this.siblings=Of(this.root._guid,"radio",this.element.getAttribute("name")),this.siblings.push(this)},render:function(){var t=this.element.node;t.addEventListener("change",_f,!1),t.attachEvent&&t.addEventListener("click",_f,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",_f,!1),t.removeEventListener("click",_f,!1)},handleChange:function(){ys.start(this.root),this.siblings.forEach(function(t){t.root.viewmodel.set(t.keypath,t.getValue())}),ys.end()},getValue:function(){return this.element.node.checked},unbind:function(){R(this.siblings,this)}}),Pf=Af,Tf=wf.extend({name:"name",init:function(){this.siblings=Of(this.root._guid,"radioname",this.keypath.str),this.siblings.push(this),this.radioName=!0},getInitialValue:function(){return this.element.getAttribute("checked")?this.element.getAttribute("value"):void 0},render:function(){var t=this.element.node;t.name="{{"+this.keypath.str+"}}",t.checked=this.root.viewmodel.get(this.keypath)==this.element.getAttribute("value"),t.addEventListener("change",_f,!1),t.attachEvent&&t.addEventListener("click",_f,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",_f,!1),t.removeEventListener("click",_f,!1)},getValue:function(){var t=this.element.node;return t._ractive?t._ractive.value:t.value},handleChange:function(){this.element.node.checked&&wf.prototype.handleChange.call(this)},rebound:function(t,e){var n;wf.prototype.rebound.call(this,t,e),(n=this.element.node)&&(n.name="{{"+this.keypath.str+"}}")},unbind:function(){R(this.siblings,this)}}),jf=Tf,Mf=wf.extend({name:"name",getInitialValue:function(){return this.noInitialValue=!0,[]},init:function(){var t,e;this.checkboxName=!0,this.siblings=Of(this.root._guid,"checkboxes",this.keypath.str),this.siblings.push(this),this.noInitialValue&&(this.siblings.noInitialValue=!0),this.siblings.noInitialValue&&this.element.getAttribute("checked")&&(t=this.root.viewmodel.get(this.keypath),e=this.element.getAttribute("value"),t.push(e))},unbind:function(){R(this.siblings,this)},render:function(){var t,e,n=this.element.node;t=this.root.viewmodel.get(this.keypath),e=this.element.getAttribute("value"),a(t)?this.isChecked=M(t,e):this.isChecked=t==e,n.name="{{"+this.keypath.str+"}}",n.checked=this.isChecked,n.addEventListener("change",_f,!1),n.attachEvent&&n.addEventListener("click",_f,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",_f,!1),t.removeEventListener("click",_f,!1)},changed:function(){var t=!!this.isChecked;return this.isChecked=this.element.node.checked,this.isChecked===t},handleChange:function(){this.isChecked=this.element.node.checked,wf.prototype.handleChange.call(this)},getValue:function(){return this.siblings.filter(sr).map(ur)}}),Lf=Mf,Ff=wf.extend({name:"checked",render:function(){var t=this.element.node;t.addEventListener("change",_f,!1),t.attachEvent&&t.addEventListener("click",_f,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",_f,!1),t.removeEventListener("click",_f,!1)},getValue:function(){return this.element.node.checked}}),Nf=Ff,Rf=wf.extend({getInitialValue:function(){var t,e,n,r,i=this.element.options;if(void 0===this.element.getAttribute("value")&&(e=t=i.length,t)){for(;e--;)if(i[e].getAttribute("selected")){n=i[e].getAttribute("value"),r=!0;break}if(!r)for(;++ee;e+=1)if(r=t[e],t[e].selected)return i=r._ractive?r._ractive.value:r.value},forceUpdate:function(){var t=this,e=this.getValue();void 0!==e&&(this.attribute.locked=!0,ys.scheduleTask(function(){return t.attribute.locked=!1}),this.root.viewmodel.set(this.keypath,e))}}),Df=Rf,If=Df.extend({getInitialValue:function(){return this.element.options.filter(function(t){return t.getAttribute("selected")}).map(function(t){return t.getAttribute("value")})},render:function(){var t;this.element.node.addEventListener("change",_f,!1),t=this.root.viewmodel.get(this.keypath),void 0===t&&this.handleChange()},unrender:function(){this.element.node.removeEventListener("change",_f,!1)},setValue:function(){throw Error("TODO not implemented yet")},getValue:function(){var t,e,n,r,i,a;for(t=[],e=this.element.node.options,r=e.length,n=0;r>n;n+=1)i=e[n],i.selected&&(a=i._ractive?i._ractive.value:i.value,t.push(a));return t},handleChange:function(){var t,e,n;return t=this.attribute,e=t.value,n=this.getValue(),void 0!==e&&L(n,e)||Df.prototype.handleChange.call(this),this},forceUpdate:function(){var t=this,e=this.getValue();void 0!==e&&(this.attribute.locked=!0,ys.scheduleTask(function(){return t.attribute.locked=!1}),this.root.viewmodel.set(this.keypath,e))},updateModel:function(){void 0!==this.attribute.value&&this.attribute.value.length||this.root.viewmodel.set(this.keypath,this.initialValue)}}),qf=If,Bf=wf.extend({render:function(){this.element.node.addEventListener("change",_f,!1)},unrender:function(){this.element.node.removeEventListener("change",_f,!1)},getValue:function(){return this.element.node.files}}),Vf=Bf,Uf=kf.extend({getInitialValue:function(){},getValue:function(){var t=parseFloat(this.element.node.value);return isNaN(t)?void 0:t}}),zf=cr,Wf=pr,Hf=fr,Gf=dr,Kf=hr,$f=/^event(?:\.(.+))?/,Qf=yr,Yf=br,Jf={},Xf={touchstart:!0,touchmove:!0,touchend:!0,touchcancel:!0,touchleave:!0},Zf=wr,td=_r,ed=kr,nd=Er,rd=Sr,id=function(t,e,n){this.init(t,e,n)};id.prototype={bubble:Wf,fire:Hf,getAction:Gf,init:Kf,listen:Yf,rebind:Zf,render:td,resolve:ed,unbind:nd,unrender:rd};var ad=id,od=function(t,e){var n,r,i,a,o=[];for(r in e)if(e.hasOwnProperty(r))for(i=r.split("-"),n=i.length;n--;)a=new ad(t,i[n],e[r]),o.push(a);return o},sd=function(t,e){var n,r,i,a=this;this.element=t,this.root=n=t.root,r=e.n||e,("string"==typeof r||(i=new iv({template:r,root:n,owner:t}),r=""+i,i.unbind(),""!==r))&&(e.a?this.params=e.a:e.d&&(this.fragment=new iv({template:e.d,root:n,owner:t}),this.params=this.fragment.getArgsList(),this.fragment.bubble=function(){this.dirtyArgs=this.dirtyValue=!0,a.params=this.getArgsList(),a.ready&&a.update()}),this.fn=g("decorators",n,r),this.fn||p(Io(r,"decorator")))};sd.prototype={init:function(){var t,e,n;if(t=this.element.node,this.params?(n=[t].concat(this.params),e=this.fn.apply(this.root,n)):e=this.fn.call(this.root,t),!e||!e.teardown)throw Error("Decorator definition must return an object with a teardown method");this.actual=e,this.ready=!0},update:function(){this.actual.update?this.actual.update.apply(this.root,this.params):(this.actual.teardown(!0),this.init())},rebind:function(t,e){this.fragment&&this.fragment.rebind(t,e)},teardown:function(t){this.torndown=!0,this.ready&&this.actual.teardown(),!t&&this.fragment&&this.fragment.unbind()}};var ud,cd,ld,pd=sd,fd=Mr,dd=Lr,hd=qr,md=function(t){return t.replace(/-([a-zA-Z])/g,function(t,e){return e.toUpperCase()})};Xa?(cd={},ld=lo("div").style,ud=function(t){var e,n,r;if(t=md(t),!cd[t])if(void 0!==ld[t])cd[t]=t;else for(r=t.charAt(0).toUpperCase()+t.substring(1),e=io.length;e--;)if(n=io[e],void 0!==ld[n+r]){cd[t]=n+r;break}return cd[t]}):ud=null;var vd,gd,yd=ud;Xa?(gd=window.getComputedStyle||Co.getComputedStyle,vd=function(t){var e,n,r,i,o;if(e=gd(this.node),"string"==typeof t)return o=e[yd(t)],"0px"===o&&(o=0),o;if(!a(t))throw Error("Transition$getStyle must be passed a string, or an array of strings representing CSS properties");for(n={},r=t.length;r--;)i=t[r],o=e[yd(i)],"0px"===o&&(o=0),n[i]=o;return n}):vd=null;var bd=vd,xd=function(t,e){var n;if("string"==typeof t)this.node.style[yd(t)]=e;else for(n in t)t.hasOwnProperty(n)&&(this.node.style[yd(n)]=t[n]);return this},wd=function(t){var e;this.duration=t.duration,this.step=t.step,this.complete=t.complete,"string"==typeof t.easing?(e=t.root.easing[t.easing],e||(v(Io(t.easing,"easing")),e=Br)):e="function"==typeof t.easing?t.easing:Br,this.easing=e,this.start=ns(),this.end=this.start+this.duration,this.running=!0,ws.add(this)};wd.prototype={tick:function(t){var e,n;return this.running?t>this.end?(this.step&&this.step(1),this.complete&&this.complete(1),!1):(e=t-this.start,n=this.easing(e/this.duration),this.step&&this.step(n),!0):!1},stop:function(){this.abort&&this.abort(),this.running=!1}};var _d,kd,Ed,Sd,Od,Cd,Ad,Pd,Td=wd,jd=RegExp("^-(?:"+io.join("|")+")-"),Md=function(t){return t.replace(jd,"")},Ld=RegExp("^(?:"+io.join("|")+")([A-Z])"),Fd=function(t){var e;return t?(Ld.test(t)&&(t="-"+t),e=t.replace(/[A-Z]/g,function(t){return"-"+t.toLowerCase()})):""},Nd={},Rd={};Xa?(kd=lo("div").style,function(){void 0!==kd.transition?(Ed="transition",Sd="transitionend",Od=!0):void 0!==kd.webkitTransition?(Ed="webkitTransition",Sd="webkitTransitionEnd",Od=!0):Od=!1}(),Ed&&(Cd=Ed+"Duration",Ad=Ed+"Property",Pd=Ed+"TimingFunction"),_d=function(t,e,n,r,i){setTimeout(function(){var a,o,s,u,c;u=function(){o&&s&&(t.root.fire(t.name+":end",t.node,t.isIntro),i())},a=(t.node.namespaceURI||"")+t.node.tagName,t.node.style[Ad]=r.map(yd).map(Fd).join(","),t.node.style[Pd]=Fd(n.easing||"linear"),t.node.style[Cd]=n.duration/1e3+"s",c=function(e){var n;n=r.indexOf(md(Md(e.propertyName))),-1!==n&&r.splice(n,1),r.length||(t.node.removeEventListener(Sd,c,!1),s=!0,u())},t.node.addEventListener(Sd,c,!1),setTimeout(function(){for(var i,l,p,f,d,h=r.length,v=[];h--;)f=r[h],i=a+f,Od&&!Rd[i]&&(t.node.style[yd(f)]=e[f],Nd[i]||(l=t.getStyle(f),Nd[i]=t.getStyle(f)!=e[f],Rd[i]=!Nd[i],Rd[i]&&(t.node.style[yd(f)]=l))),(!Od||Rd[i])&&(void 0===l&&(l=t.getStyle(f)),p=r.indexOf(f),-1===p?m("Something very strange happened with transitions. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!",{node:t.node}):r.splice(p,1),d=/[^\d]*$/.exec(e[f])[0],v.push({name:yd(f),interpolator:Bo(parseFloat(l),parseFloat(e[f])),suffix:d}));v.length?new Td({root:t.root,duration:n.duration,easing:md(n.easing||""),step:function(e){var n,r;for(r=v.length;r--;)n=v[r],t.node.style[n.name]=n.interpolator(e)+n.suffix},complete:function(){o=!0,u()}}):o=!0,r.length||(t.node.removeEventListener(Sd,c,!1),s=!0,u())},0)},n.delay||0)}):_d=null;var Dd,Id,qd,Bd,Vd,Ud=_d;if("undefined"!=typeof document){if(Dd="hidden",Vd={},Dd in document)qd="";else for(Bd=io.length;Bd--;)Id=io[Bd],Dd=Id+"Hidden",Dd in document&&(qd=Id);void 0!==qd?(document.addEventListener(qd+"visibilitychange",Vr),Vr()):("onfocusout"in document?(document.addEventListener("focusout",Ur),document.addEventListener("focusin",zr)):(window.addEventListener("pagehide",Ur),window.addEventListener("blur",Ur),window.addEventListener("pageshow",zr),window.addEventListener("focus",zr)),Vd.hidden=!1)}var zd,Wd,Hd,Gd=Vd;Xa?(Wd=window.getComputedStyle||Co.getComputedStyle,zd=function(t,e,n){var r,i=this;if(4===arguments.length)throw Error("t.animateStyle() returns a promise - use .then() instead of passing a callback");if(Gd.hidden)return this.setStyle(t,e),Hd||(Hd=cs.resolve());"string"==typeof t?(r={},r[t]=e):(r=t,n=e),n||(v('The "%s" transition does not supply an options object to `t.animateStyle()`. This will break in a future version of Ractive. For more info see https://github.com/RactiveJS/Ractive/issues/340',this.name),n=this);var a=new cs(function(t){var e,a,o,s,u,c,l;if(!n.duration)return i.setStyle(r),void t();for(e=Object.keys(r),a=[],o=Wd(i.node),u={},c=e.length;c--;)l=e[c],s=o[yd(l)],"0px"===s&&(s=0),s!=r[l]&&(a.push(l),i.node.style[yd(l)]=s);return a.length?void Ud(i,r,n,a,t):void t()});return a}):zd=null;var Kd=zd,$d=function(t,e){return"number"==typeof t?t={duration:t}:"string"==typeof t?t="slow"===t?{duration:600}:"fast"===t?{duration:200}:{duration:400}:t||(t={}),i({},t,e)},Qd=Wr,Yd=function(t,e,n){this.init(t,e,n)};Yd.prototype={init:hd,start:Qd,getStyle:bd,setStyle:xd,animateStyle:Kd,processParams:$d};var Jd,Xd,Zd=Yd,th=Gr;Jd=function(){var t=this.node,e=this.fragment.toString(!1);if(window&&window.appearsToBeIELessEqual8&&(t.type="text/css"),t.styleSheet)t.styleSheet.cssText=e;else{for(;t.hasChildNodes();)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}},Xd=function(){this.node.type&&"text/javascript"!==this.node.type||m("Script tag was updated. This does not cause the code to be re-evaluated!",{ractive:this.root}),this.node.text=this.fragment.toString(!1)};var eh=function(){var t,e;return this.template.y?"":(t="<"+this.template.e,t+=this.attributes.map(Xr).join("")+this.conditionalAttributes.map(Xr).join(""),"option"===this.name&&Yr(this)&&(t+=" selected"),"input"===this.name&&Jr(this)&&(t+=" checked"),t+=">","textarea"===this.name&&void 0!==this.getAttribute("value")?t+=Ee(this.getAttribute("value")):void 0!==this.getAttribute("contenteditable")&&(t+=this.getAttribute("value")||""),this.fragment&&(e="script"!==this.name&&"style"!==this.name,t+=this.fragment.toString(e)),al.test(this.template.e)||(t+=""+this.template.e+">"),t)},nh=Zr,rh=ti,ih=function(t){this.init(t)};ih.prototype={bubble:Tp,detach:jp,find:Mp,findAll:Lp,findAllComponents:Fp,findComponent:Np,findNextNode:Rp,firstNode:Dp,getAttribute:Ip,init:fd,rebind:dd,render:th,toString:eh,unbind:nh,unrender:rh};var ah=ih,oh=/^\s*$/,sh=/^\s*/,uh=function(t){var e,n,r,i;return e=t.split("\n"),n=e[0],void 0!==n&&oh.test(n)&&e.shift(),r=N(e),void 0!==r&&oh.test(r)&&e.pop(),i=e.reduce(ni,null),i&&(t=e.map(function(t){return t.replace(i,"")}).join("\n")),t},ch=ri,lh=function(t,e){var n;return e?n=t.split("\n").map(function(t,n){return n?e+t:t}).join("\n"):t},ph='Could not find template for partial "%s"',fh=function(t){var e,n;e=this.parentFragment=t.parentFragment,this.root=e.root,this.type=Ac,this.index=t.index,this.name=t.template.r,this.rendered=!1,this.fragment=this.fragmentToRender=this.fragmentToUnrender=null,zl.init(this,t),this.keypath||((n=ch(this.root,this.name,e))?(xl.call(this),this.isNamed=!0,this.setTemplate(n)):v(ph,this.name))};fh.prototype={bubble:function(){this.parentFragment.bubble()},detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},firstNode:function(){return this.fragment.firstNode()},findNextNode:function(){return this.parentFragment.findNextNode(this)},getPartialName:function(){return this.isNamed&&this.name?this.name:void 0===this.value?this.name:this.value},getValue:function(){return this.fragment.getValue()},rebind:function(t,e){this.isNamed||Ul.call(this,t,e),this.fragment&&this.fragment.rebind(t,e)},render:function(){return this.docFrag=document.createDocumentFragment(),this.update(),this.rendered=!0,this.docFrag},resolve:zl.resolve,setValue:function(t){var e;(void 0===t||t!==this.value)&&(void 0!==t&&(e=ch(this.root,""+t,this.parentFragment)),!e&&this.name&&(e=ch(this.root,this.name,this.parentFragment))&&(xl.call(this),this.isNamed=!0),e||v(ph,this.name,{ractive:this.root}),this.value=t,this.setTemplate(e||[]),this.bubble(),this.rendered&&ys.addView(this))},setTemplate:function(t){this.fragment&&(this.fragment.unbind(),this.rendered&&(this.fragmentToUnrender=this.fragment)),this.fragment=new iv({template:t,root:this.root,owner:this,pElement:this.parentFragment.pElement}),this.fragmentToRender=this.fragment},toString:function(t){var e,n,r,i;return e=this.fragment.toString(t),n=this.parentFragment.items[this.index-1],n&&n.type===kc?(r=n.text.split("\n").pop(),(i=/^\s+$/.exec(r))?lh(e,i[0]):e):e},unbind:function(){this.isNamed||xl.call(this),this.fragment&&this.fragment.unbind()},unrender:function(t){this.rendered&&(this.fragment&&this.fragment.unrender(t),this.rendered=!1)},update:function(){var t,e;this.fragmentToUnrender&&(this.fragmentToUnrender.unrender(!0),this.fragmentToUnrender=null),this.fragmentToRender&&(this.docFrag.appendChild(this.fragmentToRender.render()),this.fragmentToRender=null),this.rendered&&(t=this.parentFragment.getNode(),e=this.parentFragment.findNextNode(this),t.insertBefore(this.docFrag,e))}};var dh,hh,mh,vh=fh,gh=ui,yh=ci,bh=new as("detach"),xh=li,wh=pi,_h=fi,kh=di,Eh=hi,Sh=mi,Oh=function(t,e,n,r){var i=t.root,a=t.keypath;r?i.viewmodel.smartUpdate(a,e,r):i.viewmodel.mark(a)},Ch=[],Ah=["pop","push","reverse","shift","sort","splice","unshift"];Ah.forEach(function(t){var e=function(){for(var e=arguments.length,n=Array(e),r=0;e>r;r++)n[r]=arguments[r];var i,a,o,s;for(i=yu(this,t,n),a=Array.prototype[t].apply(this,arguments),ys.start(),this._ractive.setting=!0,s=this._ractive.wrappers.length;s--;)o=this._ractive.wrappers[s],ys.addRactive(o.root),Oh(o,this,t,i);return ys.end(),this._ractive.setting=!1,a};So(Ch,t,{value:e})}),dh={},dh.__proto__?(hh=function(t){t.__proto__=Ch},mh=function(t){t.__proto__=Array.prototype}):(hh=function(t){var e,n;for(e=Ah.length;e--;)n=Ah[e],So(t,n,{value:Ch[n],configurable:!0})},mh=function(t){var e;for(e=Ah.length;e--;)delete t[Ah[e]];
-}),hh.unpatch=mh;var Ph,Th,jh,Mh=hh;Ph={filter:function(t){return a(t)&&(!t._ractive||!t._ractive.setting)},wrap:function(t,e,n){return new Th(t,e,n)}},Th=function(t,e,n){this.root=t,this.value=e,this.keypath=E(n),e._ractive||(So(e,"_ractive",{value:{wrappers:[],instances:[],setting:!1},configurable:!0}),Mh(e)),e._ractive.instances[t._guid]||(e._ractive.instances[t._guid]=0,e._ractive.instances.push(t)),e._ractive.instances[t._guid]+=1,e._ractive.wrappers.push(this)},Th.prototype={get:function(){return this.value},teardown:function(){var t,e,n,r,i;if(t=this.value,e=t._ractive,n=e.wrappers,r=e.instances,e.setting)return!1;if(i=n.indexOf(this),-1===i)throw Error(jh);if(n.splice(i,1),n.length){if(r[this.root._guid]-=1,!r[this.root._guid]){if(i=r.indexOf(this.root),-1===i)throw Error(jh);r.splice(i,1)}}else delete t._ractive,Mh.unpatch(this.value)}},jh="Something went wrong in a rather interesting way";var Lh,Fh,Nh=Ph,Rh=/^\s*[0-9]+\s*$/,Dh=function(t){return Rh.test(t)?[]:{}};try{Object.defineProperty({},"test",{value:0}),Lh={filter:function(t,e,n){var r,i;return e?(e=E(e),(r=n.viewmodel.wrapped[e.parent.str])&&!r.magic?!1:(i=n.viewmodel.get(e.parent),a(i)&&/^[0-9]+$/.test(e.lastKey)?!1:i&&("object"==typeof i||"function"==typeof i))):!1},wrap:function(t,e,n){return new Fh(t,e,n)}},Fh=function(t,e,n){var r,i,a;return n=E(n),this.magic=!0,this.ractive=t,this.keypath=n,this.value=e,this.prop=n.lastKey,r=n.parent,this.obj=r.isRoot?t.viewmodel.data:t.viewmodel.get(r),i=this.originalDescriptor=Object.getOwnPropertyDescriptor(this.obj,this.prop),i&&i.set&&(a=i.set._ractiveWrappers)?void(-1===a.indexOf(this)&&a.push(this)):void vi(this,e,i)},Fh.prototype={get:function(){return this.value},reset:function(t){return this.updating?void 0:(this.updating=!0,this.obj[this.prop]=t,ys.addRactive(this.ractive),this.ractive.viewmodel.mark(this.keypath,{keepExistingWrapper:!0}),this.updating=!1,!0)},set:function(t,e){this.updating||(this.obj[this.prop]||(this.updating=!0,this.obj[this.prop]=Dh(t),this.updating=!1),this.obj[this.prop][t]=e)},teardown:function(){var t,e,n,r,i;return this.updating?!1:(t=Object.getOwnPropertyDescriptor(this.obj,this.prop),e=t&&t.set,void(e&&(r=e._ractiveWrappers,i=r.indexOf(this),-1!==i&&r.splice(i,1),r.length||(n=this.obj[this.prop],Object.defineProperty(this.obj,this.prop,this.originalDescriptor||{writable:!0,enumerable:!0,configurable:!0}),this.obj[this.prop]=n))))}}}catch(Ao){Lh=!1}var Ih,qh,Bh=Lh;Bh&&(Ih={filter:function(t,e,n){return Bh.filter(t,e,n)&&Nh.filter(t)},wrap:function(t,e,n){return new qh(t,e,n)}},qh=function(t,e,n){this.value=e,this.magic=!0,this.magicWrapper=Bh.wrap(t,e,n),this.arrayWrapper=Nh.wrap(t,e,n)},qh.prototype={get:function(){return this.value},teardown:function(){this.arrayWrapper.teardown(),this.magicWrapper.teardown()},reset:function(t){return this.magicWrapper.reset(t)}});var Vh=Ih,Uh=gi,zh={},Wh=xi,Hh=wi,Gh=Ei,Kh=Pi,$h=Ti,Qh=function(t,e){this.computation=t,this.viewmodel=t.viewmodel,this.ref=e,this.root=this.viewmodel.ractive,this.parentFragment=this.root.component&&this.root.component.parentFragment};Qh.prototype={resolve:function(t){this.computation.softDeps.push(t),this.computation.unresolvedDeps[t.str]=null,this.viewmodel.register(t,this.computation,"computed")}};var Yh=Qh,Jh=function(t,e){this.key=t,this.getter=e.getter,this.setter=e.setter,this.hardDeps=e.deps||[],this.softDeps=[],this.unresolvedDeps={},this.depValues={},this._dirty=this._firstRun=!0};Jh.prototype={constructor:Jh,init:function(t){var e,n=this;this.viewmodel=t,this.bypass=!0,e=t.get(this.key),t.clearCache(this.key.str),this.bypass=!1,this.setter&&void 0!==e&&this.set(e),this.hardDeps&&this.hardDeps.forEach(function(e){return t.register(e,n,"computed")})},invalidate:function(){this._dirty=!0},get:function(){var t,e,n=this,r=!1;if(this.getting){var i="The "+this.key.str+" computation indirectly called itself. This probably indicates a bug in the computation. It is commonly caused by `array.sort(...)` - if that's the case, clone the array first with `array.slice().sort(...)`";return h(i),this.value}if(this.getting=!0,this._dirty){if(this._firstRun||!this.hardDeps.length&&!this.softDeps.length?r=!0:[this.hardDeps,this.softDeps].forEach(function(t){var e,i,a;if(!r)for(a=t.length;a--;)if(e=t[a],i=n.viewmodel.get(e),!s(i,n.depValues[e.str]))return n.depValues[e.str]=i,void(r=!0)}),r){this.viewmodel.capture();try{this.value=this.getter()}catch(a){m('Failed to compute "%s"',this.key.str),f(a.stack||a),this.value=void 0}t=this.viewmodel.release(),e=this.updateDependencies(t),e&&[this.hardDeps,this.softDeps].forEach(function(t){t.forEach(function(t){n.depValues[t.str]=n.viewmodel.get(t)})})}this._dirty=!1}return this.getting=this._firstRun=!1,this.value},set:function(t){if(this.setting)return void(this.value=t);if(!this.setter)throw Error("Computed properties without setters are read-only. (This may change in a future version of Ractive!)");this.setter(t)},updateDependencies:function(t){var e,n,r,i,a;for(n=this.softDeps,e=n.length;e--;)r=n[e],-1===t.indexOf(r)&&(i=!0,this.viewmodel.unregister(r,this,"computed"));for(e=t.length;e--;)r=t[e],-1!==n.indexOf(r)||this.hardDeps&&-1!==this.hardDeps.indexOf(r)||(i=!0,ji(this.viewmodel,r)&&!this.unresolvedDeps[r.str]?(a=new Yh(this,r.str),t.splice(e,1),this.unresolvedDeps[r.str]=a,ys.addUnresolved(a)):this.viewmodel.register(r,this,"computed"));return i&&(this.softDeps=t.slice()),i}};var Xh=Jh,Zh=Mi,tm={FAILED_LOOKUP:!0},em=Li,nm={},rm=Ni,im=Ri,am=function(t,e){this.localKey=t,this.keypath=e.keypath,this.origin=e.origin,this.deps=[],this.unresolved=[],this.resolved=!1};am.prototype={forceResolution:function(){this.keypath=this.localKey,this.setup()},get:function(t,e){return this.resolved?this.origin.get(this.map(t),e):void 0},getValue:function(){return this.keypath?this.origin.get(this.keypath):void 0},initViewmodel:function(t){this.local=t,this.setup()},map:function(t){return void 0===typeof this.keypath?this.localKey:t.replace(this.localKey,this.keypath)},register:function(t,e,n){this.deps.push({keypath:t,dep:e,group:n}),this.resolved&&this.origin.register(this.map(t),e,n)},resolve:function(t){void 0!==this.keypath&&this.unbind(!0),this.keypath=t,this.setup()},set:function(t,e){this.resolved||this.forceResolution(),this.origin.set(this.map(t),e)},setup:function(){var t=this;void 0!==this.keypath&&(this.resolved=!0,this.deps.length&&(this.deps.forEach(function(e){var n=t.map(e.keypath);if(t.origin.register(n,e.dep,e.group),e.dep.setValue)e.dep.setValue(t.origin.get(n));else{if(!e.dep.invalidate)throw Error("An unexpected error occurred. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");e.dep.invalidate()}}),this.origin.mark(this.keypath)))},setValue:function(t){if(!this.keypath)throw Error("Mapping does not have keypath, cannot set value. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");this.origin.set(this.keypath,t)},unbind:function(t){var e=this;t||delete this.local.mappings[this.localKey],this.resolved&&(this.deps.forEach(function(t){e.origin.unregister(e.map(t.keypath),t.dep,t.group)}),this.tracker&&this.origin.unregister(this.keypath,this.tracker))},unregister:function(t,e,n){var r,i;if(this.resolved){for(r=this.deps,i=r.length;i--;)if(r[i].dep===e){r.splice(i,1);break}this.origin.unregister(this.map(t),e,n)}}};var om=Di,sm=function(t,e){var n,r,i,a;return n={},r=0,i=t.map(function(t,i){var o,s,u;s=r,u=e.length;do{if(o=e.indexOf(t,s),-1===o)return a=!0,-1;s=o+1}while(n[o]&&u>s);return o===r&&(r+=1),o!==i&&(a=!0),n[o]=!0,o})},um=Ii,cm={},lm=Vi,pm=zi,fm=Wi,dm=Hi,hm=Ki,mm={implicit:!0},vm={noCascade:!0},gm=Qi,ym=Yi,bm=function(t){var e,n,r=t.adapt,i=t.data,a=t.ractive,o=t.computed,s=t.mappings;this.ractive=a,this.adaptors=r,this.onchange=t.onchange,this.cache={},this.cacheMap=Eo(null),this.deps={computed:Eo(null),"default":Eo(null)},this.depsMap={computed:Eo(null),"default":Eo(null)},this.patternObservers=[],this.specials=Eo(null),this.wrapped=Eo(null),this.computations=Eo(null),this.captureGroups=[],this.unresolvedImplicitDependencies=[],this.changes=[],this.implicitChanges={},this.noCascade={},this.data=i,this.mappings=Eo(null);for(e in s)this.map(E(e),s[e]);if(i)for(e in i)(n=this.mappings[e])&&void 0===n.getValue()&&n.setValue(i[e]);for(e in o)s&&e in s&&p("Cannot map to a computed property ('%s')",e),this.compute(E(e),o[e]);this.ready=!0};bm.prototype={adapt:Uh,applyChanges:Gh,capture:Kh,clearCache:$h,compute:Zh,get:em,init:rm,map:im,mark:om,merge:um,register:lm,release:pm,reset:fm,set:dm,smartUpdate:hm,teardown:gm,unregister:ym};var xm=bm;Xi.prototype={constructor:Xi,begin:function(t){this.inProcess[t._guid]=!0},end:function(t){var e=t.parent;e&&this.inProcess[e._guid]?Zi(this.queue,e).push(t):ta(this,t),delete this.inProcess[t._guid]}};var wm=Xi,_m=ea,km=/\$\{([^\}]+)\}/g,Em=new as("construct"),Sm=new as("config"),Om=new wm("init"),Cm=0,Am=["adaptors","components","decorators","easing","events","interpolators","partials","transitions"],Pm=aa,Tm=la;la.prototype={bubble:function(){this.dirty||(this.dirty=!0,ys.addView(this))},update:function(){this.callback(this.fragment.getValue()),this.dirty=!1},rebind:function(t,e){this.fragment.rebind(t,e)},unbind:function(){this.fragment.unbind()}};var jm=function(t,e,n,i,o){var s,u,c,l,p,f,d={},h={},v={},g=[];for(u=t.parentFragment,c=t.root,o=o||{},r(d,o),o.content=i||[],d[""]=o.content,e.defaults.el&&m("The <%s/> component has a default `el` property; it has been disregarded",t.name),l=u;l;){if(l.owner.type===Mc){p=l.owner.container;break}l=l.parent}return n&&Object.keys(n).forEach(function(e){var r,i,o=n[e];if("string"==typeof o)r=fl(o),h[e]=r?r.value:o;else if(0===o)h[e]=!0;else{if(!a(o))throw Error("erm wut");fa(o)?(v[e]={origin:t.root.viewmodel,keypath:void 0},i=pa(t,o[0],function(t){t.isSpecial?f?s.set(e,t.value):(h[e]=t.value,delete v[e]):f?s.viewmodel.mappings[e].resolve(t):v[e].keypath=t})):i=new Tm(t,o,function(t){f?s.set(e,t):h[e]=t}),g.push(i)}}),s=Eo(e.prototype),Pm(s,{el:null,append:!0,data:h,partials:o,magic:c.magic||e.defaults.magic,modifyArrays:c.modifyArrays,adapt:c.adapt},{parent:c,component:t,container:p,mappings:v,inlinePartials:d,cssIds:u.cssIds}),f=!0,t.resolvers=g,s},Mm=da,Lm=function(t){var e,n;for(e=t.root;e;)(n=e._liveComponentQueries["_"+t.name])&&n.push(t.instance),e=e.parent},Fm=ma,Nm=va,Rm=ga,Dm=ya,Im=ba,qm=new as("teardown"),Bm=wa,Vm=function(t,e){this.init(t,e)};Vm.prototype={detach:yh,find:xh,findAll:wh,findAllComponents:_h,findComponent:kh,findNextNode:Eh,firstNode:Sh,init:Fm,rebind:Nm,render:Rm,toString:Dm,unbind:Im,unrender:Bm};var Um=Vm,zm=function(t){this.type=Pc,this.value=t.template.c};zm.prototype={detach:gl,firstNode:function(){return this.node},render:function(){return this.node||(this.node=document.createComment(this.value)),this.node},toString:function(){return""},unrender:function(t){t&&this.node.parentNode.removeChild(this.node)}};var Wm=zm,Hm=function(t){var e,n;this.type=Mc,this.container=e=t.parentFragment.root,this.component=n=e.component,this.container=e,this.containerFragment=t.parentFragment,this.parentFragment=n.parentFragment;var r=this.name=t.template.n||"",i=e._inlinePartials[r];i||(m('Could not find template for partial "'+r+'"',{ractive:t.root}),i=[]),this.fragment=new iv({owner:this,root:e.parent,template:i,pElement:this.containerFragment.pElement}),a(n.yielders[r])?n.yielders[r].push(this):n.yielders[r]=[this],ys.scheduleTask(function(){if(n.yielders[r].length>1)throw Error("A component template can only have one {{yield"+(r?" "+r:"")+"}} declaration at a time")})};Hm.prototype={detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},findNextNode:function(){return this.containerFragment.findNextNode(this)},firstNode:function(){return this.fragment.firstNode()},getValue:function(t){return this.fragment.getValue(t)},render:function(){return this.fragment.render()},unbind:function(){this.fragment.unbind()},unrender:function(t){this.fragment.unrender(t),R(this.component.yielders[this.name],this)},rebind:function(t,e){this.fragment.rebind(t,e)},toString:function(){return""+this.fragment}};var Gm=Hm,Km=function(t){this.declaration=t.template.a};Km.prototype={init:ko,render:ko,unrender:ko,teardown:ko,toString:function(){return""}};var $m=Km,Qm=_a,Ym=Ea,Jm=Sa,Xm=Oa,Zm=Pa,tv=ja,ev=function(t){this.init(t)};ev.prototype={bubble:lc,detach:pc,find:fc,findAll:dc,findAllComponents:hc,findComponent:mc,findNextNode:vc,firstNode:gc,getArgsList:hl,getNode:ml,getValue:vl,init:Qm,rebind:Ym,registerIndexRef:function(t){var e=this.registeredIndexRefs;-1===e.indexOf(t)&&e.push(t)},render:Jm,toString:Xm,unbind:Zm,unregisterIndexRef:function(t){var e=this.registeredIndexRefs;e.splice(e.indexOf(t),1)},unrender:tv};var nv,rv,iv=ev,av=Ma,ov=["template","partials","components","decorators","events"],sv=new as("reset"),uv=function(t,e){function n(e,r,i){i&&i.partials[t]||e.forEach(function(e){e.type===Ac&&e.getPartialName()===t&&r.push(e),e.fragment&&n(e.fragment.items,r,i),a(e.fragments)?n(e.fragments,r,i):a(e.items)?n(e.items,r,i):e.type===jc&&e.instance&&n(e.instance.fragment.items,r,e.instance),e.type===Cc&&(a(e.attributes)&&n(e.attributes,r,i),a(e.conditionalAttributes)&&n(e.conditionalAttributes,r,i))})}var r,i=[];return n(this.fragment.items,i),this.partials[t]=e,r=ys.start(this,!0),i.forEach(function(e){e.value=void 0,e.setValue(t)}),ys.end(),r},cv=La,lv=xu("reverse"),pv=Fa,fv=xu("shift"),dv=xu("sort"),hv=xu("splice"),mv=Ra,vv=Da,gv=new as("teardown"),yv=qa,bv=Ba,xv=Va,wv=new as("unrender"),_v=xu("unshift"),kv=Ua,Ev=new as("update"),Sv=za,Ov={add:Zo,animate:Es,detach:Os,find:As,findAll:Ds,findAllComponents:Is,findComponent:qs,findContainer:Bs,findParent:Vs,fire:Hs,get:Gs,insert:$s,merge:Ys,observe:pu,observeOnce:fu,off:mu,on:vu,once:gu,pop:wu,push:_u,render:Tu,reset:av,resetPartial:uv,resetTemplate:cv,reverse:lv,set:pv,shift:fv,sort:dv,splice:hv,subtract:mv,teardown:vv,toggle:yv,toHTML:bv,toHtml:bv,unrender:xv,unshift:_v,update:kv,updateModel:Sv},Cv=function(t,e,n){return n||Ha(t,e)?function(){var n,r="_super"in this,i=this._super;return this._super=e,n=t.apply(this,arguments),r&&(this._super=i),n}:t},Av=Ga,Pv=Ya,Tv=function(t){var e,n,r={};return t&&(e=t._ractive)?(r.ractive=e.root,r.keypath=e.keypath.str,r.index={},(n=Pl(e.proxy.parentFragment))&&(r.index=Pl.resolve(n)),r):r};nv=function(t){return this instanceof nv?void Pm(this,t):new nv(t)},rv={DEBUG:{writable:!0,value:!0},DEBUG_PROMISES:{writable:!0,value:!0},extend:{value:Pv},getNodeInfo:{value:Tv},parse:{value:Gu},Promise:{value:cs},svg:{value:ro},magic:{value:eo},VERSION:{value:"0.7.3"},adaptors:{writable:!0,value:{}},components:{writable:!0,value:{}},decorators:{writable:!0,value:{}},easing:{writable:!0,value:uo},events:{writable:!0,value:{}},interpolators:{writable:!0,value:Uo},partials:{writable:!0,value:{}},transitions:{writable:!0,value:{}}},Oo(nv,rv),nv.prototype=r(Ov,so),nv.prototype.constructor=nv,nv.defaults=nv.prototype;var jv="function";if(typeof Date.now!==jv||typeof String.prototype.trim!==jv||typeof Object.keys!==jv||typeof Array.prototype.indexOf!==jv||typeof Array.prototype.forEach!==jv||typeof Array.prototype.map!==jv||typeof Array.prototype.filter!==jv||"undefined"!=typeof window&&typeof window.addEventListener!==jv)throw Error("It looks like you're attempting to use Ractive.js in an older browser. You'll need to use one of the 'legacy builds' in order to continue - see http://docs.ractivejs.org/latest/legacy-builds for more information.");var Mv=nv;return Mv})},{}],206:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.observe("value",function(e,n,r){var i=t.get(),a=i.min,o=i.max,s=Math.clamp(a,o,e);t.animate("percentage",Math.round((s-a)/(o-a)*100))})}}}(i),i.exports.template={v:3,t:[" ",{p:[13,1,305],t:7,e:"div",a:{"class":"bar"},f:[{p:[14,3,326],t:7,e:"div",a:{"class":["barFill ",{t:2,r:"state",p:[14,23,346]}],style:["width: ",{t:2,r:"percentage",p:[14,48,371]},"%"]}}," ",{p:[15,3,398],t:7,e:"span",a:{"class":"barText"},f:[{t:16,p:[15,25,420]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],207:[function(t,e,n){var r=t(205),i={exports:{}};!function(e){"use strict";var n=t(266),r=t(265);e.exports={computed:{clickable:function(){return this.get("enabled")&&!this.get("state")?!0:!1},enabled:function(){return this.get("config.status")===n.UI_INTERACTIVE?!0:!1},styles:function(){var t="";if(this.get("tooltip-side")&&(t=" tooltip-"+this.get("tooltip-side")),this.get("grid")&&(t+=" gridable"),this.get("enabled")){var e=this.get("state"),n=this.get("style");return e?"inactive "+e+" "+t:"active normal "+n+" "+t}return"inactive disabled "+t}},oninit:function(){var t=this;this.on("press",function(e){var n=t.get(),i=n.action,a=n.params;(0,r.act)(t.get("config.ref"),i,a),e.node.blur()})}}}(i),i.exports.template={v:3,t:[" ",{p:[48,1,1225],t:7,e:"span",a:{"class":["button ",{t:2,r:"styles",p:[48,21,1245]}],unselectable:"on","data-tooltip":[{t:2,r:"tooltip",p:[51,17,1330]}]},m:[{t:4,f:["tabindex='0'"],r:"clickable",p:[50,3,1281]}],v:{"mouseover-mousemove":"hover",mouseleave:"unhover","click-enter":{n:[{t:4,f:["press"],r:"clickable",p:[54,19,1423]}],d:[]}},f:[{t:4,f:[{p:[56,5,1471],t:7,e:"i",a:{"class":["fa fa-",{t:2,r:"icon",p:[56,21,1487]}]}}],n:50,r:"icon",p:[55,3,1453]}," ",{t:16,p:[58,3,1516]}]}]},e.exports=r.extend(i.exports)},{205:205,265:265,266:266}],208:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"display"},f:[{t:4,f:[{p:[3,5,44],t:7,e:"header",f:[{p:[4,7,60],t:7,e:"h3",f:[{t:2,r:"title",p:[4,11,64]}]}," ",{t:4,f:[{p:[6,9,110],t:7,e:"div",a:{"class":"buttonRight"},f:[{t:16,n:"button",p:[6,34,135]}]}],n:50,r:"button",p:[5,7,86]}]}],n:50,r:"title",p:[2,3,25]}," ",{p:[10,3,202],t:7,e:"article",f:[{t:16,p:[11,5,217]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],209:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.on("clear",function(){t.set("value",""),t.find("input").focus()})}}}(i),i.exports.template={v:3,t:[" ",{p:[12,1,170],t:7,e:"input",a:{type:"text",value:[{t:2,r:"value",p:[12,27,196]}],placeholder:[{t:2,r:"placeholder",p:[12,51,220]}]}}," ",{p:[13,1,240],t:7,e:"ui-button",a:{icon:"refresh"},v:{press:"clear"}}]},e.exports=r.extend(i.exports)},{205:205}],210:[function(t,e,n){var r=t(205),i={exports:{}};!function(e){"use strict";e.exports={data:{graph:t(201),xaccessor:function(t){return t.x},yaccessor:function(t){return t.y}},computed:{size:function(){var t=this.get("points");return t[0].length},scale:function(){var t=this.get("points");return Math.max.apply(Math,Array.map(t,function(t){return Math.max.apply(Math,Array.map(t,function(t){return t.y}))}))},xaxis:function(){var t=this.get("xinc"),e=this.get("size");return Array.from(Array(e).keys()).filter(function(e){return e&&e%t==0})},yaxis:function(){var t=this.get("yinc"),e=this.get("scale");return Array.from(Array(t).keys()).map(function(t){return Math.round(e*(++t/100)*10)})}},oninit:function(){var t=this;this.on({enter:function(t){this.set("selected",t.index.count)},exit:function(t){this.set("selected")}}),window.addEventListener("resize",function(e){t.set("width",t.el.clientWidth)})},onrender:function(){this.set("width",this.el.clientWidth)}}}(i),i.exports.template={v:3,t:[" ",{p:[47,1,1269],t:7,e:"svg",a:{"class":"linegraph",width:"100%",height:[{t:2,x:{r:["height"],s:"_0+10"},p:[47,45,1313]}]},f:[{p:[48,3,1334],t:7,e:"g",a:{transform:"translate(0, 5)"},f:[{t:4,f:[{t:4,f:[{p:[51,9,1504],t:7,e:"line",a:{x1:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[51,19,1514]}],x2:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[51,38,1533]}],y1:"0",y2:[{t:2,r:"height",p:[51,64,1559]}],stroke:"darkgray"}}," ",{t:4,f:[{p:[53,11,1635],t:7,e:"text",a:{x:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[53,20,1644]}],y:[{t:2,x:{r:["height"],s:"_0-5"},p:[53,38,1662]}],"text-anchor":"middle",fill:"white"},f:[{t:2,x:{r:["size",".","xfactor"],s:"(_0-_1)*_2"},p:[53,88,1712]}," ",{t:2,r:"xunit",p:[53,113,1737]}]}],n:50,x:{r:["@index"],s:"_0%2==0"},p:[52,9,1600]}],n:52,r:"xaxis",p:[50,7,1479]}," ",{t:4,f:[{p:[57,9,1820],t:7,e:"line",a:{x1:"0",x2:[{t:2,r:"width",p:[57,26,1837]}],y1:[{t:2,x:{r:["yscale","."],s:"_0(_1)"},p:[57,41,1852]}],y2:[{t:2,x:{r:["yscale","."],s:"_0(_1)"},p:[57,60,1871]}],stroke:"darkgray"}}," ",{p:[58,9,1915],t:7,e:"text",a:{x:"0",y:[{t:2,x:{r:["yscale","."],s:"_0(_1)-5"},p:[58,24,1930]}],"text-anchor":"begin",fill:"white"},f:[{t:2,x:{r:[".","yfactor"],s:"_0*_1"},p:[58,76,1982]}," ",{t:2,r:"yunit",p:[58,92,1998]}]}],n:52,r:"yaxis",p:[56,7,1795]}," ",{t:4,f:[{p:[61,9,2071],t:7,e:"path",a:{d:[{t:2,x:{r:["area.path"],s:"_0.print()"},p:[61,18,2080]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[61,47,2109]}],opacity:"0.1"}}],n:52,i:"curve",r:"curves",p:[60,7,2039]}," ",{t:4,f:[{p:[64,9,2200],t:7,e:"path",a:{d:[{t:2,x:{r:["line.path"],s:"_0.print()"},p:[64,18,2209]}],stroke:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[64,49,2240]}],fill:"none"}}],n:52,i:"curve",r:"curves",p:[63,7,2168]}," ",{t:4,f:[{t:4,f:[{p:[68,11,2375],t:7,e:"circle",a:{transform:["translate(",{t:2,r:".",p:[68,40,2404]},")"],r:[{t:2,x:{r:["selected","count"],s:"_0==_1?10:4"},p:[68,51,2415]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[68,89,2453]}]},v:{mouseenter:"enter",mouseleave:"exit"}}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[67,9,2329]}],n:52,i:"curve",r:"curves",p:[66,7,2297]}," ",{t:4,f:[{t:4,f:[{t:4,f:[{p:[74,13,2678],t:7,e:"text",a:{transform:["translate(",{t:2,r:".",p:[74,40,2705]},") ",{t:2,x:{r:["count","size"],s:'_0<=_1/2?"translate(15, 4)":"translate(-15, 4)"'},p:[74,47,2712]}],"text-anchor":[{t:2,x:{r:["count","size"],s:'_0<=_1/2?"start":"end"'},p:[74,126,2791]}],fill:"white"},f:[{t:2,x:{r:["count","item","yfactor"],s:"_1[_0].y*_2"},p:[75,15,2861]}," ",{t:2,r:"yunit",p:[75,43,2889]}," @ ",{t:2,x:{r:["size","count","item","xfactor"],s:"(_0-_2[_1].x)*_3"},p:[75,55,2901]}," ",{t:2,r:"xunit",p:[75,92,2938]}]}],n:50,x:{r:["selected","count"],s:"_0==_1"},p:[73,11,2638]}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[72,9,2592]}],n:52,i:"curve",r:"curves",p:[71,7,2560]}," ",{t:4,f:[{p:[81,9,3063],t:7,e:"g",a:{transform:["translate(",{t:2,x:{r:["width","curves.length","@index"],s:"(_0/(_1+1))*(_2+1)"},p:[81,33,3087]},", 10)"]},f:[{p:[82,11,3154],t:7,e:"circle",a:{r:"4",fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[82,31,3174]}]}}," ",{p:[83,11,3206],t:7,e:"text",a:{x:"8",y:"4",fill:"white"},f:[{t:2,rx:{r:"legend",m:[{t:30,n:"curve"}]},p:[83,42,3237]}]}]}],n:52,i:"curve",r:"curves",p:[80,7,3031]}],x:{r:["graph","points","xaccessor","yaccessor","width","height"],s:"_0({data:_1,xaccessor:_2,yaccessor:_3,width:_4,height:_5})"},p:[49,5,1371]}]}]}]},e.exports=r.extend(i.exports)},{201:201,205:205}],211:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"notice"},f:[{t:16,p:[2,3,24]}]}]},e.exports=r.extend(i.exports)},{205:205}],212:[function(t,e,n){var r=t(205),i={exports:{}};!function(e){"use strict";var n=t(265),r=t(267);e.exports={oninit:function(){var t=this,e=r.resize.bind(this),i=function(){return t.set({resize:!1,x:null,y:null})};this.observe("config.fancy",function(r,a,o){(0,n.winset)(t.get("config.window"),"can-resize",!r),r?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",i)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",i))}),this.on("resize",function(){return t.toggle("resize")})}}}(i),i.exports.template={v:3,t:[" ",{t:4,f:[{p:[28,3,766],t:7,e:"div",a:{"class":"resize"},v:{mousedown:"resize"}}],n:50,r:"config.fancy",p:[27,1,742]}]},e.exports=r.extend(i.exports)},{205:205,265:265,267:267}],213:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"section",a:{"class":[{t:4,f:["candystripe"],r:"candystripe",p:[1,17,16]}]},f:[{t:4,f:[{p:[3,5,84],t:7,e:"span",a:{"class":"label",style:[{t:4,f:["color:",{t:2,r:"labelcolor",p:[3,53,132]}],r:"labelcolor",p:[3,32,111]}]},f:[{t:2,r:"label",p:[3,84,163]},":"]}],n:50,r:"label",p:[2,3,65]}," ",{t:4,f:[{t:16,p:[6,5,215]}],n:50,r:"nowrap",p:[5,3,195]},{t:4,n:51,f:[{p:[8,5,242],t:7,e:"div",a:{"class":"content",style:[{t:4,f:["float:right;"],r:"right",p:[8,33,270]}]},f:[{t:16,p:[9,7,312]}]}],r:"nowrap"}]}]},e.exports=r.extend(i.exports)},{205:205}],214:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"subdisplay"},f:[{t:4,f:[{p:[3,5,47],t:7,e:"header",f:[{p:[4,7,63],t:7,e:"h4",f:[{t:2,r:"title",p:[4,11,67]}]}," ",{t:4,f:[{t:16,n:"button",p:[5,21,103]}],n:50,r:"button",p:[5,7,89]}]}],n:50,r:"title",p:[2,3,28]}," ",{p:[8,3,156],t:7,e:"article",f:[{t:16,p:[9,5,171]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],215:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.set("active",this.findComponent("tab").get("name")),this.on("switch",function(e){t.set("active",e.node.textContent.trim())}),this.observe("active",function(e,n,r){for(var i=t.findAllComponents("tab"),a=Array.isArray(i),o=0,i=a?i:i[Symbol.iterator]();;){var s;if(a){if(o>=i.length)break;s=i[o++]}else{if(o=i.next(),o.done)break;s=o.value}var u=s;u.set("shown",u.get("name")===e)}})}}}(i),i.exports.template={v:3,t:[" "," ",{p:[20,1,524],t:7,e:"header",f:[{t:4,f:[{p:[22,5,556],t:7,e:"ui-button",a:{pane:[{t:2,r:".",p:[22,22,573]}]},v:{press:"switch"},f:[{t:2,r:".",p:[22,47,598]}]}],n:52,r:"tabs",p:[21,3,536]}]}," ",{p:[25,1,641],t:7,e:"ui-display",f:[{t:8,r:"content",p:[26,3,657]}]}]},i.exports.components=i.exports.components||{};var a={tab:t(216)};for(var o in a)a.hasOwnProperty(o)&&(i.exports.components[o]=a[o]);e.exports=r.extend(i.exports)},{205:205,216:216}],216:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{t:4,f:[{t:16,p:[2,3,17]}],n:50,r:"shown",p:[1,1,0]}]},e.exports=r.extend(i.exports)},{205:205}],217:[function(t,e,n){var r=t(205),i={exports:{}};!function(e){"use strict";var n=t(266),r=t(265),i=t(267);e.exports={computed:{visualStatus:function(){switch(this.get("config.status")){case n.UI_INTERACTIVE:return"good";case n.UI_UPDATE:return"average";case n.UI_DISABLED:return"bad";default:return"bad"}}},oninit:function(){var t=this,e=i.drag.bind(this),n=function(e){return t.set({drag:!1,x:null,y:null})};this.observe("config.fancy",function(i,a,o){(0,r.winset)(t.get("config.window"),"titlebar",!i),i?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",n)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",n))}),this.on({drag:function(){this.toggle("drag")},close:function(){(0,r.winset)(this.get("config.window"),"is-visible",!1),window.location.href=(0,r.href)({command:"uiclose "+this.get("config.ref")},"winset")},minimize:function(){(0,r.winset)(this.get("config.window"),"is-minimized",!0)}})}}}(i),i.exports.template={v:3,t:[" ",{p:[49,1,1382],t:7,e:"header",a:{"class":"titlebar"},v:{mousedown:"drag"},f:[{p:[50,3,1431],t:7,e:"i",a:{"class":["statusicon fa fa-eye fa-2x ",{t:2,r:"visualStatus",p:[50,40,1468]}]}}," ",{p:[51,3,1494],t:7,e:"span",a:{"class":"title"},f:[{t:16,p:[51,23,1514]}]}," ",{t:4,f:[{p:[53,5,1560],t:7,e:"i",a:{"class":"minimize fa fa-minus fa-2x"},v:{click:"minimize"}}," ",{p:[54,5,1628],t:7,e:"i",a:{"class":"close fa fa-close fa-2x"},v:{click:"close"}}],n:50,r:"config.fancy",p:[52,3,1534]}]}]},e.exports=r.extend(i.exports)},{205:205,265:265,266:266,267:267}],218:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";var e=[11,10,9,8];t.exports={data:{userAgent:navigator.userAgent},computed:{ie:function(){if(document.documentMode)return document.documentMode;for(var t in e){var n=document.createElement("div");if(n.innerHTML="",n.getElementsByTagName("span").length)return t}}},oninit:function(){var t=this;this.on("debug",function(){return t.toggle("debug")})}}}(i),i.exports.template={v:3,t:[" ",{t:4,f:[{p:[27,3,662],t:7,e:"ui-notice",f:[{p:[28,5,679],t:7,e:"span",f:["You have an old (IE",{t:2,r:"ie",p:[28,30,704]},"), end-of-life (click 'EOL Info' for more information) version of Internet Explorer installed."]},{p:[28,137,811],t:7,e:"br"}," ",{p:[29,5,822],t:7,e:"span",f:["To upgrade, click 'Upgrade IE' to download IE11 from Microsoft."]},{p:[29,81,898],t:7,e:"br"}," ",{p:[30,5,909],t:7,e:"span",f:["If you are unable to upgrade directly, click 'IE VMs' to download a VM with IE11 or Edge from Microsoft."]},{p:[30,122,1026],t:7,e:"br"}," ",{p:[31,5,1037],t:7,e:"span",f:["Otherwise, click 'No Frills' below to disable potentially incompatible features (and this message)."]}," ",{p:[32,5,1155],t:7,e:"hr"}," ",{p:[33,5,1166],t:7,e:"ui-button",a:{icon:"close",action:"tgui:nofrills"},f:["No Frills"]}," ",{p:[34,5,1240],t:7,e:"ui-button",a:{icon:"internet-explorer",action:"tgui:link",params:'{"url": "http://windows.microsoft.com/en-us/internet-explorer/download-ie"}'},f:["Upgrade IE"]}," ",{p:[36,5,1416],t:7,e:"ui-button",a:{icon:"edge",action:"tgui:link",params:'{"url": "https://dev.windows.com/en-us/microsoft-edge/tools/vms"}'},f:["IE VMs"]}," ",{p:[38,5,1565],t:7,e:"ui-button",a:{icon:"info",action:"tgui:link",params:'{"url": "https://support.microsoft.com/en-us/lifecycle#gp/Microsoft-Internet-Explorer"}'},f:["EOL Info"]}," ",{p:[40,5,1738],t:7,e:"ui-button",a:{icon:"bug"},v:{press:"debug"},f:["Debug Info"]}," ",{t:4,f:[{p:[42,7,1826],t:7,e:"hr"}," ",{p:[43,7,1839],t:7,e:"span",f:["Detected: IE",{t:2,r:"ie",p:[43,25,1857]}]},{p:[43,38,1870],t:7,e:"br"}," ",{p:[44,7,1883],t:7,e:"span",f:["User Agent: ",{t:2,r:"userAgent",p:[44,25,1901]}]}],n:50,r:"debug",p:[41,5,1805]}]}],n:50,x:{r:["config.fancy","ie"],s:"_0&&_1&&_1<11"},p:[26,1,621]}]},e.exports=r.extend(i.exports)},{205:205}],219:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[" "," "," "," "," ",{p:[7,1,267],t:7,e:"ui-notice",f:[{t:4,f:[{p:[9,5,312],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[10,7,355],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[10,24,372]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[10,75,423]}]}]}],n:50,r:"data.siliconUser",p:[8,3,282]},{t:4,n:51,f:[{p:[13,5,514],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,31,540]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[16,1,625],t:7,e:"status"}," ",{t:4,f:[{t:4,f:[{p:[19,7,719],t:7,e:"ui-display",a:{title:"Air Controls"},f:[{p:[20,9,762],t:7,e:"ui-section",f:[{p:[21,11,786],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"exclamation-triangle":"exclamation"'},p:[21,28,803]}],style:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"caution":null'},p:[21,98,873]}],action:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"reset":"alarm"'},p:[22,23,937]}]},f:["Area Atmosphere Alarm"]}]}," ",{p:[24,9,1045],t:7,e:"ui-section",f:[{p:[25,11,1069],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==3?"exclamation-triangle":"exclamation"'},p:[25,28,1086]}],style:[{t:2,x:{r:["data.mode"],s:'_0==3?"danger":null'},p:[25,96,1154]}],action:"mode",params:['{"mode": ',{t:2,x:{r:["data.mode"],s:"_0==3?1:3"},p:[26,44,1236]},"}"]},f:["Panic Siphon"]}]}," ",{p:[28,9,1322],t:7,e:"br"}," ",{p:[29,9,1337],t:7,e:"ui-section",f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:"sign-out",action:"tgui:view",params:'{"screen": "vents"}'},f:["Vent Controls"]}]}," ",{p:[32,9,1494],t:7,e:"ui-section",f:[{p:[33,11,1518],t:7,e:"ui-button",a:{icon:"filter",action:"tgui:view",params:'{"screen": "scrubbers"}'},f:["Scrubber Controls"]}]}," ",{p:[35,9,1657],
+}),hh.unpatch=mh;var Ph,Th,jh,Mh=hh;Ph={filter:function(t){return a(t)&&(!t._ractive||!t._ractive.setting)},wrap:function(t,e,n){return new Th(t,e,n)}},Th=function(t,e,n){this.root=t,this.value=e,this.keypath=E(n),e._ractive||(So(e,"_ractive",{value:{wrappers:[],instances:[],setting:!1},configurable:!0}),Mh(e)),e._ractive.instances[t._guid]||(e._ractive.instances[t._guid]=0,e._ractive.instances.push(t)),e._ractive.instances[t._guid]+=1,e._ractive.wrappers.push(this)},Th.prototype={get:function(){return this.value},teardown:function(){var t,e,n,r,i;if(t=this.value,e=t._ractive,n=e.wrappers,r=e.instances,e.setting)return!1;if(i=n.indexOf(this),-1===i)throw Error(jh);if(n.splice(i,1),n.length){if(r[this.root._guid]-=1,!r[this.root._guid]){if(i=r.indexOf(this.root),-1===i)throw Error(jh);r.splice(i,1)}}else delete t._ractive,Mh.unpatch(this.value)}},jh="Something went wrong in a rather interesting way";var Lh,Fh,Nh=Ph,Rh=/^\s*[0-9]+\s*$/,Dh=function(t){return Rh.test(t)?[]:{}};try{Object.defineProperty({},"test",{value:0}),Lh={filter:function(t,e,n){var r,i;return e?(e=E(e),(r=n.viewmodel.wrapped[e.parent.str])&&!r.magic?!1:(i=n.viewmodel.get(e.parent),a(i)&&/^[0-9]+$/.test(e.lastKey)?!1:i&&("object"==typeof i||"function"==typeof i))):!1},wrap:function(t,e,n){return new Fh(t,e,n)}},Fh=function(t,e,n){var r,i,a;return n=E(n),this.magic=!0,this.ractive=t,this.keypath=n,this.value=e,this.prop=n.lastKey,r=n.parent,this.obj=r.isRoot?t.viewmodel.data:t.viewmodel.get(r),i=this.originalDescriptor=Object.getOwnPropertyDescriptor(this.obj,this.prop),i&&i.set&&(a=i.set._ractiveWrappers)?void(-1===a.indexOf(this)&&a.push(this)):void vi(this,e,i)},Fh.prototype={get:function(){return this.value},reset:function(t){return this.updating?void 0:(this.updating=!0,this.obj[this.prop]=t,ys.addRactive(this.ractive),this.ractive.viewmodel.mark(this.keypath,{keepExistingWrapper:!0}),this.updating=!1,!0)},set:function(t,e){this.updating||(this.obj[this.prop]||(this.updating=!0,this.obj[this.prop]=Dh(t),this.updating=!1),this.obj[this.prop][t]=e)},teardown:function(){var t,e,n,r,i;return this.updating?!1:(t=Object.getOwnPropertyDescriptor(this.obj,this.prop),e=t&&t.set,void(e&&(r=e._ractiveWrappers,i=r.indexOf(this),-1!==i&&r.splice(i,1),r.length||(n=this.obj[this.prop],Object.defineProperty(this.obj,this.prop,this.originalDescriptor||{writable:!0,enumerable:!0,configurable:!0}),this.obj[this.prop]=n))))}}}catch(Ao){Lh=!1}var Ih,qh,Bh=Lh;Bh&&(Ih={filter:function(t,e,n){return Bh.filter(t,e,n)&&Nh.filter(t)},wrap:function(t,e,n){return new qh(t,e,n)}},qh=function(t,e,n){this.value=e,this.magic=!0,this.magicWrapper=Bh.wrap(t,e,n),this.arrayWrapper=Nh.wrap(t,e,n)},qh.prototype={get:function(){return this.value},teardown:function(){this.arrayWrapper.teardown(),this.magicWrapper.teardown()},reset:function(t){return this.magicWrapper.reset(t)}});var Vh=Ih,Uh=gi,zh={},Wh=xi,Hh=wi,Gh=Ei,Kh=Pi,$h=Ti,Qh=function(t,e){this.computation=t,this.viewmodel=t.viewmodel,this.ref=e,this.root=this.viewmodel.ractive,this.parentFragment=this.root.component&&this.root.component.parentFragment};Qh.prototype={resolve:function(t){this.computation.softDeps.push(t),this.computation.unresolvedDeps[t.str]=null,this.viewmodel.register(t,this.computation,"computed")}};var Yh=Qh,Jh=function(t,e){this.key=t,this.getter=e.getter,this.setter=e.setter,this.hardDeps=e.deps||[],this.softDeps=[],this.unresolvedDeps={},this.depValues={},this._dirty=this._firstRun=!0};Jh.prototype={constructor:Jh,init:function(t){var e,n=this;this.viewmodel=t,this.bypass=!0,e=t.get(this.key),t.clearCache(this.key.str),this.bypass=!1,this.setter&&void 0!==e&&this.set(e),this.hardDeps&&this.hardDeps.forEach(function(e){return t.register(e,n,"computed")})},invalidate:function(){this._dirty=!0},get:function(){var t,e,n=this,r=!1;if(this.getting){var i="The "+this.key.str+" computation indirectly called itself. This probably indicates a bug in the computation. It is commonly caused by `array.sort(...)` - if that's the case, clone the array first with `array.slice().sort(...)`";return h(i),this.value}if(this.getting=!0,this._dirty){if(this._firstRun||!this.hardDeps.length&&!this.softDeps.length?r=!0:[this.hardDeps,this.softDeps].forEach(function(t){var e,i,a;if(!r)for(a=t.length;a--;)if(e=t[a],i=n.viewmodel.get(e),!s(i,n.depValues[e.str]))return n.depValues[e.str]=i,void(r=!0)}),r){this.viewmodel.capture();try{this.value=this.getter()}catch(a){m('Failed to compute "%s"',this.key.str),f(a.stack||a),this.value=void 0}t=this.viewmodel.release(),e=this.updateDependencies(t),e&&[this.hardDeps,this.softDeps].forEach(function(t){t.forEach(function(t){n.depValues[t.str]=n.viewmodel.get(t)})})}this._dirty=!1}return this.getting=this._firstRun=!1,this.value},set:function(t){if(this.setting)return void(this.value=t);if(!this.setter)throw Error("Computed properties without setters are read-only. (This may change in a future version of Ractive!)");this.setter(t)},updateDependencies:function(t){var e,n,r,i,a;for(n=this.softDeps,e=n.length;e--;)r=n[e],-1===t.indexOf(r)&&(i=!0,this.viewmodel.unregister(r,this,"computed"));for(e=t.length;e--;)r=t[e],-1!==n.indexOf(r)||this.hardDeps&&-1!==this.hardDeps.indexOf(r)||(i=!0,ji(this.viewmodel,r)&&!this.unresolvedDeps[r.str]?(a=new Yh(this,r.str),t.splice(e,1),this.unresolvedDeps[r.str]=a,ys.addUnresolved(a)):this.viewmodel.register(r,this,"computed"));return i&&(this.softDeps=t.slice()),i}};var Xh=Jh,Zh=Mi,tm={FAILED_LOOKUP:!0},em=Li,nm={},rm=Ni,im=Ri,am=function(t,e){this.localKey=t,this.keypath=e.keypath,this.origin=e.origin,this.deps=[],this.unresolved=[],this.resolved=!1};am.prototype={forceResolution:function(){this.keypath=this.localKey,this.setup()},get:function(t,e){return this.resolved?this.origin.get(this.map(t),e):void 0},getValue:function(){return this.keypath?this.origin.get(this.keypath):void 0},initViewmodel:function(t){this.local=t,this.setup()},map:function(t){return void 0===typeof this.keypath?this.localKey:t.replace(this.localKey,this.keypath)},register:function(t,e,n){this.deps.push({keypath:t,dep:e,group:n}),this.resolved&&this.origin.register(this.map(t),e,n)},resolve:function(t){void 0!==this.keypath&&this.unbind(!0),this.keypath=t,this.setup()},set:function(t,e){this.resolved||this.forceResolution(),this.origin.set(this.map(t),e)},setup:function(){var t=this;void 0!==this.keypath&&(this.resolved=!0,this.deps.length&&(this.deps.forEach(function(e){var n=t.map(e.keypath);if(t.origin.register(n,e.dep,e.group),e.dep.setValue)e.dep.setValue(t.origin.get(n));else{if(!e.dep.invalidate)throw Error("An unexpected error occurred. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");e.dep.invalidate()}}),this.origin.mark(this.keypath)))},setValue:function(t){if(!this.keypath)throw Error("Mapping does not have keypath, cannot set value. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!");this.origin.set(this.keypath,t)},unbind:function(t){var e=this;t||delete this.local.mappings[this.localKey],this.resolved&&(this.deps.forEach(function(t){e.origin.unregister(e.map(t.keypath),t.dep,t.group)}),this.tracker&&this.origin.unregister(this.keypath,this.tracker))},unregister:function(t,e,n){var r,i;if(this.resolved){for(r=this.deps,i=r.length;i--;)if(r[i].dep===e){r.splice(i,1);break}this.origin.unregister(this.map(t),e,n)}}};var om=Di,sm=function(t,e){var n,r,i,a;return n={},r=0,i=t.map(function(t,i){var o,s,u;s=r,u=e.length;do{if(o=e.indexOf(t,s),-1===o)return a=!0,-1;s=o+1}while(n[o]&&u>s);return o===r&&(r+=1),o!==i&&(a=!0),n[o]=!0,o})},um=Ii,cm={},lm=Vi,pm=zi,fm=Wi,dm=Hi,hm=Ki,mm={implicit:!0},vm={noCascade:!0},gm=Qi,ym=Yi,bm=function(t){var e,n,r=t.adapt,i=t.data,a=t.ractive,o=t.computed,s=t.mappings;this.ractive=a,this.adaptors=r,this.onchange=t.onchange,this.cache={},this.cacheMap=Eo(null),this.deps={computed:Eo(null),"default":Eo(null)},this.depsMap={computed:Eo(null),"default":Eo(null)},this.patternObservers=[],this.specials=Eo(null),this.wrapped=Eo(null),this.computations=Eo(null),this.captureGroups=[],this.unresolvedImplicitDependencies=[],this.changes=[],this.implicitChanges={},this.noCascade={},this.data=i,this.mappings=Eo(null);for(e in s)this.map(E(e),s[e]);if(i)for(e in i)(n=this.mappings[e])&&void 0===n.getValue()&&n.setValue(i[e]);for(e in o)s&&e in s&&p("Cannot map to a computed property ('%s')",e),this.compute(E(e),o[e]);this.ready=!0};bm.prototype={adapt:Uh,applyChanges:Gh,capture:Kh,clearCache:$h,compute:Zh,get:em,init:rm,map:im,mark:om,merge:um,register:lm,release:pm,reset:fm,set:dm,smartUpdate:hm,teardown:gm,unregister:ym};var xm=bm;Xi.prototype={constructor:Xi,begin:function(t){this.inProcess[t._guid]=!0},end:function(t){var e=t.parent;e&&this.inProcess[e._guid]?Zi(this.queue,e).push(t):ta(this,t),delete this.inProcess[t._guid]}};var wm=Xi,_m=ea,km=/\$\{([^\}]+)\}/g,Em=new as("construct"),Sm=new as("config"),Om=new wm("init"),Cm=0,Am=["adaptors","components","decorators","easing","events","interpolators","partials","transitions"],Pm=aa,Tm=la;la.prototype={bubble:function(){this.dirty||(this.dirty=!0,ys.addView(this))},update:function(){this.callback(this.fragment.getValue()),this.dirty=!1},rebind:function(t,e){this.fragment.rebind(t,e)},unbind:function(){this.fragment.unbind()}};var jm=function(t,e,n,i,o){var s,u,c,l,p,f,d={},h={},v={},g=[];for(u=t.parentFragment,c=t.root,o=o||{},r(d,o),o.content=i||[],d[""]=o.content,e.defaults.el&&m("The <%s/> component has a default `el` property; it has been disregarded",t.name),l=u;l;){if(l.owner.type===Mc){p=l.owner.container;break}l=l.parent}return n&&Object.keys(n).forEach(function(e){var r,i,o=n[e];if("string"==typeof o)r=fl(o),h[e]=r?r.value:o;else if(0===o)h[e]=!0;else{if(!a(o))throw Error("erm wut");fa(o)?(v[e]={origin:t.root.viewmodel,keypath:void 0},i=pa(t,o[0],function(t){t.isSpecial?f?s.set(e,t.value):(h[e]=t.value,delete v[e]):f?s.viewmodel.mappings[e].resolve(t):v[e].keypath=t})):i=new Tm(t,o,function(t){f?s.set(e,t):h[e]=t}),g.push(i)}}),s=Eo(e.prototype),Pm(s,{el:null,append:!0,data:h,partials:o,magic:c.magic||e.defaults.magic,modifyArrays:c.modifyArrays,adapt:c.adapt},{parent:c,component:t,container:p,mappings:v,inlinePartials:d,cssIds:u.cssIds}),f=!0,t.resolvers=g,s},Mm=da,Lm=function(t){var e,n;for(e=t.root;e;)(n=e._liveComponentQueries["_"+t.name])&&n.push(t.instance),e=e.parent},Fm=ma,Nm=va,Rm=ga,Dm=ya,Im=ba,qm=new as("teardown"),Bm=wa,Vm=function(t,e){this.init(t,e)};Vm.prototype={detach:yh,find:xh,findAll:wh,findAllComponents:_h,findComponent:kh,findNextNode:Eh,firstNode:Sh,init:Fm,rebind:Nm,render:Rm,toString:Dm,unbind:Im,unrender:Bm};var Um=Vm,zm=function(t){this.type=Pc,this.value=t.template.c};zm.prototype={detach:gl,firstNode:function(){return this.node},render:function(){return this.node||(this.node=document.createComment(this.value)),this.node},toString:function(){return""},unrender:function(t){t&&this.node.parentNode.removeChild(this.node)}};var Wm=zm,Hm=function(t){var e,n;this.type=Mc,this.container=e=t.parentFragment.root,this.component=n=e.component,this.container=e,this.containerFragment=t.parentFragment,this.parentFragment=n.parentFragment;var r=this.name=t.template.n||"",i=e._inlinePartials[r];i||(m('Could not find template for partial "'+r+'"',{ractive:t.root}),i=[]),this.fragment=new iv({owner:this,root:e.parent,template:i,pElement:this.containerFragment.pElement}),a(n.yielders[r])?n.yielders[r].push(this):n.yielders[r]=[this],ys.scheduleTask(function(){if(n.yielders[r].length>1)throw Error("A component template can only have one {{yield"+(r?" "+r:"")+"}} declaration at a time")})};Hm.prototype={detach:function(){return this.fragment.detach()},find:function(t){return this.fragment.find(t)},findAll:function(t,e){return this.fragment.findAll(t,e)},findComponent:function(t){return this.fragment.findComponent(t)},findAllComponents:function(t,e){return this.fragment.findAllComponents(t,e)},findNextNode:function(){return this.containerFragment.findNextNode(this)},firstNode:function(){return this.fragment.firstNode()},getValue:function(t){return this.fragment.getValue(t)},render:function(){return this.fragment.render()},unbind:function(){this.fragment.unbind()},unrender:function(t){this.fragment.unrender(t),R(this.component.yielders[this.name],this)},rebind:function(t,e){this.fragment.rebind(t,e)},toString:function(){return""+this.fragment}};var Gm=Hm,Km=function(t){this.declaration=t.template.a};Km.prototype={init:ko,render:ko,unrender:ko,teardown:ko,toString:function(){return""}};var $m=Km,Qm=_a,Ym=Ea,Jm=Sa,Xm=Oa,Zm=Pa,tv=ja,ev=function(t){this.init(t)};ev.prototype={bubble:lc,detach:pc,find:fc,findAll:dc,findAllComponents:hc,findComponent:mc,findNextNode:vc,firstNode:gc,getArgsList:hl,getNode:ml,getValue:vl,init:Qm,rebind:Ym,registerIndexRef:function(t){var e=this.registeredIndexRefs;-1===e.indexOf(t)&&e.push(t)},render:Jm,toString:Xm,unbind:Zm,unregisterIndexRef:function(t){var e=this.registeredIndexRefs;e.splice(e.indexOf(t),1)},unrender:tv};var nv,rv,iv=ev,av=Ma,ov=["template","partials","components","decorators","events"],sv=new as("reset"),uv=function(t,e){function n(e,r,i){i&&i.partials[t]||e.forEach(function(e){e.type===Ac&&e.getPartialName()===t&&r.push(e),e.fragment&&n(e.fragment.items,r,i),a(e.fragments)?n(e.fragments,r,i):a(e.items)?n(e.items,r,i):e.type===jc&&e.instance&&n(e.instance.fragment.items,r,e.instance),e.type===Cc&&(a(e.attributes)&&n(e.attributes,r,i),a(e.conditionalAttributes)&&n(e.conditionalAttributes,r,i))})}var r,i=[];return n(this.fragment.items,i),this.partials[t]=e,r=ys.start(this,!0),i.forEach(function(e){e.value=void 0,e.setValue(t)}),ys.end(),r},cv=La,lv=xu("reverse"),pv=Fa,fv=xu("shift"),dv=xu("sort"),hv=xu("splice"),mv=Ra,vv=Da,gv=new as("teardown"),yv=qa,bv=Ba,xv=Va,wv=new as("unrender"),_v=xu("unshift"),kv=Ua,Ev=new as("update"),Sv=za,Ov={add:Zo,animate:Es,detach:Os,find:As,findAll:Ds,findAllComponents:Is,findComponent:qs,findContainer:Bs,findParent:Vs,fire:Hs,get:Gs,insert:$s,merge:Ys,observe:pu,observeOnce:fu,off:mu,on:vu,once:gu,pop:wu,push:_u,render:Tu,reset:av,resetPartial:uv,resetTemplate:cv,reverse:lv,set:pv,shift:fv,sort:dv,splice:hv,subtract:mv,teardown:vv,toggle:yv,toHTML:bv,toHtml:bv,unrender:xv,unshift:_v,update:kv,updateModel:Sv},Cv=function(t,e,n){return n||Ha(t,e)?function(){var n,r="_super"in this,i=this._super;return this._super=e,n=t.apply(this,arguments),r&&(this._super=i),n}:t},Av=Ga,Pv=Ya,Tv=function(t){var e,n,r={};return t&&(e=t._ractive)?(r.ractive=e.root,r.keypath=e.keypath.str,r.index={},(n=Pl(e.proxy.parentFragment))&&(r.index=Pl.resolve(n)),r):r};nv=function(t){return this instanceof nv?void Pm(this,t):new nv(t)},rv={DEBUG:{writable:!0,value:!0},DEBUG_PROMISES:{writable:!0,value:!0},extend:{value:Pv},getNodeInfo:{value:Tv},parse:{value:Gu},Promise:{value:cs},svg:{value:ro},magic:{value:eo},VERSION:{value:"0.7.3"},adaptors:{writable:!0,value:{}},components:{writable:!0,value:{}},decorators:{writable:!0,value:{}},easing:{writable:!0,value:uo},events:{writable:!0,value:{}},interpolators:{writable:!0,value:Uo},partials:{writable:!0,value:{}},transitions:{writable:!0,value:{}}},Oo(nv,rv),nv.prototype=r(Ov,so),nv.prototype.constructor=nv,nv.defaults=nv.prototype;var jv="function";if(typeof Date.now!==jv||typeof String.prototype.trim!==jv||typeof Object.keys!==jv||typeof Array.prototype.indexOf!==jv||typeof Array.prototype.forEach!==jv||typeof Array.prototype.map!==jv||typeof Array.prototype.filter!==jv||"undefined"!=typeof window&&typeof window.addEventListener!==jv)throw Error("It looks like you're attempting to use Ractive.js in an older browser. You'll need to use one of the 'legacy builds' in order to continue - see http://docs.ractivejs.org/latest/legacy-builds for more information.");var Mv=nv;return Mv})},{}],206:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.observe("value",function(e,n,r){var i=t.get(),a=i.min,o=i.max,s=Math.clamp(a,o,e);t.animate("percentage",Math.round((s-a)/(o-a)*100))})}}}(i),i.exports.template={v:3,t:[" ",{p:[13,1,305],t:7,e:"div",a:{"class":"bar"},f:[{p:[14,3,326],t:7,e:"div",a:{"class":["barFill ",{t:2,r:"state",p:[14,23,346]}],style:["width: ",{t:2,r:"percentage",p:[14,48,371]},"%"]}}," ",{p:[15,3,398],t:7,e:"span",a:{"class":"barText"},f:[{t:16,p:[15,25,420]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],207:[function(t,e,n){var r=t(205),i={exports:{}};!function(e){"use strict";var n=t(271),r=t(270);e.exports={computed:{clickable:function(){return this.get("enabled")&&!this.get("state")?!0:!1},enabled:function(){return this.get("config.status")===n.UI_INTERACTIVE?!0:!1},styles:function(){var t="";if(this.get("tooltip-side")&&(t=" tooltip-"+this.get("tooltip-side")),this.get("grid")&&(t+=" gridable"),this.get("enabled")){var e=this.get("state"),n=this.get("style");return e?"inactive "+e+" "+t:"active normal "+n+" "+t}return"inactive disabled "+t}},oninit:function(){var t=this;this.on("press",function(e){var n=t.get(),i=n.action,a=n.params;(0,r.act)(t.get("config.ref"),i,a),e.node.blur()})}}}(i),i.exports.template={v:3,t:[" ",{p:[48,1,1225],t:7,e:"span",a:{"class":["button ",{t:2,r:"styles",p:[48,21,1245]}],unselectable:"on","data-tooltip":[{t:2,r:"tooltip",p:[51,17,1330]}]},m:[{t:4,f:["tabindex='0'"],r:"clickable",p:[50,3,1281]}],v:{"mouseover-mousemove":"hover",mouseleave:"unhover","click-enter":{n:[{t:4,f:["press"],r:"clickable",p:[54,19,1423]}],d:[]}},f:[{t:4,f:[{p:[56,5,1471],t:7,e:"i",a:{"class":["fa fa-",{t:2,r:"icon",p:[56,21,1487]}]}}],n:50,r:"icon",p:[55,3,1453]}," ",{t:16,p:[58,3,1516]}]}]},e.exports=r.extend(i.exports)},{205:205,270:270,271:271}],208:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"display"},f:[{t:4,f:[{p:[3,5,44],t:7,e:"header",f:[{p:[4,7,60],t:7,e:"h3",f:[{t:2,r:"title",p:[4,11,64]}]}," ",{t:4,f:[{p:[6,9,110],t:7,e:"div",a:{"class":"buttonRight"},f:[{t:16,n:"button",p:[6,34,135]}]}],n:50,r:"button",p:[5,7,86]}]}],n:50,r:"title",p:[2,3,25]}," ",{p:[10,3,202],t:7,e:"article",f:[{t:16,p:[11,5,217]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],209:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.on("clear",function(){t.set("value",""),t.find("input").focus()})}}}(i),i.exports.template={v:3,t:[" ",{p:[12,1,170],t:7,e:"input",a:{type:"text",value:[{t:2,r:"value",p:[12,27,196]}],placeholder:[{t:2,r:"placeholder",p:[12,51,220]}]}}," ",{p:[13,1,240],t:7,e:"ui-button",a:{icon:"refresh"},v:{press:"clear"}}]},e.exports=r.extend(i.exports)},{205:205}],210:[function(t,e,n){var r=t(205),i={exports:{}};!function(e){"use strict";e.exports={data:{graph:t(201),xaccessor:function(t){return t.x},yaccessor:function(t){return t.y}},computed:{size:function(){var t=this.get("points");return t[0].length},scale:function(){var t=this.get("points");return Math.max.apply(Math,Array.map(t,function(t){return Math.max.apply(Math,Array.map(t,function(t){return t.y}))}))},xaxis:function(){var t=this.get("xinc"),e=this.get("size");return Array.from(Array(e).keys()).filter(function(e){return e&&e%t==0})},yaxis:function(){var t=this.get("yinc"),e=this.get("scale");return Array.from(Array(t).keys()).map(function(t){return Math.round(e*(++t/100)*10)})}},oninit:function(){var t=this;this.on({enter:function(t){this.set("selected",t.index.count)},exit:function(t){this.set("selected")}}),window.addEventListener("resize",function(e){t.set("width",t.el.clientWidth)})},onrender:function(){this.set("width",this.el.clientWidth)}}}(i),i.exports.template={v:3,t:[" ",{p:[47,1,1269],t:7,e:"svg",a:{"class":"linegraph",width:"100%",height:[{t:2,x:{r:["height"],s:"_0+10"},p:[47,45,1313]}]},f:[{p:[48,3,1334],t:7,e:"g",a:{transform:"translate(0, 5)"},f:[{t:4,f:[{t:4,f:[{p:[51,9,1504],t:7,e:"line",a:{x1:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[51,19,1514]}],x2:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[51,38,1533]}],y1:"0",y2:[{t:2,r:"height",p:[51,64,1559]}],stroke:"darkgray"}}," ",{t:4,f:[{p:[53,11,1635],t:7,e:"text",a:{x:[{t:2,x:{r:["xscale","."],s:"_0(_1)"},p:[53,20,1644]}],y:[{t:2,x:{r:["height"],s:"_0-5"},p:[53,38,1662]}],"text-anchor":"middle",fill:"white"},f:[{t:2,x:{r:["size",".","xfactor"],s:"(_0-_1)*_2"},p:[53,88,1712]}," ",{t:2,r:"xunit",p:[53,113,1737]}]}],n:50,x:{r:["@index"],s:"_0%2==0"},p:[52,9,1600]}],n:52,r:"xaxis",p:[50,7,1479]}," ",{t:4,f:[{p:[57,9,1820],t:7,e:"line",a:{x1:"0",x2:[{t:2,r:"width",p:[57,26,1837]}],y1:[{t:2,x:{r:["yscale","."],s:"_0(_1)"},p:[57,41,1852]}],y2:[{t:2,x:{r:["yscale","."],s:"_0(_1)"},p:[57,60,1871]}],stroke:"darkgray"}}," ",{p:[58,9,1915],t:7,e:"text",a:{x:"0",y:[{t:2,x:{r:["yscale","."],s:"_0(_1)-5"},p:[58,24,1930]}],"text-anchor":"begin",fill:"white"},f:[{t:2,x:{r:[".","yfactor"],s:"_0*_1"},p:[58,76,1982]}," ",{t:2,r:"yunit",p:[58,92,1998]}]}],n:52,r:"yaxis",p:[56,7,1795]}," ",{t:4,f:[{p:[61,9,2071],t:7,e:"path",a:{d:[{t:2,x:{r:["area.path"],s:"_0.print()"},p:[61,18,2080]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[61,47,2109]}],opacity:"0.1"}}],n:52,i:"curve",r:"curves",p:[60,7,2039]}," ",{t:4,f:[{p:[64,9,2200],t:7,e:"path",a:{d:[{t:2,x:{r:["line.path"],s:"_0.print()"},p:[64,18,2209]}],stroke:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[64,49,2240]}],fill:"none"}}],n:52,i:"curve",r:"curves",p:[63,7,2168]}," ",{t:4,f:[{t:4,f:[{p:[68,11,2375],t:7,e:"circle",a:{transform:["translate(",{t:2,r:".",p:[68,40,2404]},")"],r:[{t:2,x:{r:["selected","count"],s:"_0==_1?10:4"},p:[68,51,2415]}],fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[68,89,2453]}]},v:{mouseenter:"enter",mouseleave:"exit"}}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[67,9,2329]}],n:52,i:"curve",r:"curves",p:[66,7,2297]}," ",{t:4,f:[{t:4,f:[{t:4,f:[{p:[74,13,2678],t:7,e:"text",a:{transform:["translate(",{t:2,r:".",p:[74,40,2705]},") ",{t:2,x:{r:["count","size"],s:'_0<=_1/2?"translate(15, 4)":"translate(-15, 4)"'},p:[74,47,2712]}],"text-anchor":[{t:2,x:{r:["count","size"],s:'_0<=_1/2?"start":"end"'},p:[74,126,2791]}],fill:"white"},f:[{t:2,x:{r:["count","item","yfactor"],s:"_1[_0].y*_2"},p:[75,15,2861]}," ",{t:2,r:"yunit",p:[75,43,2889]}," @ ",{t:2,x:{r:["size","count","item","xfactor"],s:"(_0-_2[_1].x)*_3"},p:[75,55,2901]}," ",{t:2,r:"xunit",p:[75,92,2938]}]}],n:50,x:{r:["selected","count"],s:"_0==_1"},p:[73,11,2638]}],n:52,i:"count",x:{r:["line.path"],s:"_0.points()"},p:[72,9,2592]}],n:52,i:"curve",r:"curves",p:[71,7,2560]}," ",{t:4,f:[{p:[81,9,3063],t:7,e:"g",a:{transform:["translate(",{t:2,x:{r:["width","curves.length","@index"],s:"(_0/(_1+1))*(_2+1)"},p:[81,33,3087]},", 10)"]},f:[{p:[82,11,3154],t:7,e:"circle",a:{r:"4",fill:[{t:2,rx:{r:"colors",m:[{t:30,n:"curve"}]},p:[82,31,3174]}]}}," ",{p:[83,11,3206],t:7,e:"text",a:{x:"8",y:"4",fill:"white"},f:[{t:2,rx:{r:"legend",m:[{t:30,n:"curve"}]},p:[83,42,3237]}]}]}],n:52,i:"curve",r:"curves",p:[80,7,3031]}],x:{r:["graph","points","xaccessor","yaccessor","width","height"],s:"_0({data:_1,xaccessor:_2,yaccessor:_3,width:_4,height:_5})"},p:[49,5,1371]}]}]}]},e.exports=r.extend(i.exports)},{201:201,205:205}],211:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"notice"},f:[{t:16,p:[2,3,24]}]}]},e.exports=r.extend(i.exports)},{205:205}],212:[function(t,e,n){var r=t(205),i={exports:{}};!function(e){"use strict";var n=t(270),r=t(272);e.exports={oninit:function(){var t=this,e=r.resize.bind(this),i=function(){return t.set({resize:!1,x:null,y:null})};this.observe("config.fancy",function(r,a,o){(0,n.winset)(t.get("config.window"),"can-resize",!r),r?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",i)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",i))}),this.on("resize",function(){return t.toggle("resize")})}}}(i),i.exports.template={v:3,t:[" ",{t:4,f:[{p:[28,3,766],t:7,e:"div",a:{"class":"resize"},v:{mousedown:"resize"}}],n:50,r:"config.fancy",p:[27,1,742]}]},e.exports=r.extend(i.exports)},{205:205,270:270,272:272}],213:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"section",a:{"class":[{t:4,f:["candystripe"],r:"candystripe",p:[1,17,16]}]},f:[{t:4,f:[{p:[3,5,84],t:7,e:"span",a:{"class":"label",style:[{t:4,f:["color:",{t:2,r:"labelcolor",p:[3,53,132]}],r:"labelcolor",p:[3,32,111]}]},f:[{t:2,r:"label",p:[3,84,163]},":"]}],n:50,r:"label",p:[2,3,65]}," ",{t:4,f:[{t:16,p:[6,5,215]}],n:50,r:"nowrap",p:[5,3,195]},{t:4,n:51,f:[{p:[8,5,242],t:7,e:"div",a:{"class":"content",style:[{t:4,f:["float:right;"],r:"right",p:[8,33,270]}]},f:[{t:16,p:[9,7,312]}]}],r:"nowrap"}]}]},e.exports=r.extend(i.exports)},{205:205}],214:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"subdisplay"},f:[{t:4,f:[{p:[3,5,47],t:7,e:"header",f:[{p:[4,7,63],t:7,e:"h4",f:[{t:2,r:"title",p:[4,11,67]}]}," ",{t:4,f:[{t:16,n:"button",p:[5,21,103]}],n:50,r:"button",p:[5,7,89]}]}],n:50,r:"title",p:[2,3,28]}," ",{p:[8,3,156],t:7,e:"article",f:[{t:16,p:[9,5,171]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],215:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.set("active",this.findComponent("tab").get("name")),this.on("switch",function(e){t.set("active",e.node.textContent.trim())}),this.observe("active",function(e,n,r){for(var i=t.findAllComponents("tab"),a=Array.isArray(i),o=0,i=a?i:i[Symbol.iterator]();;){var s;if(a){if(o>=i.length)break;s=i[o++]}else{if(o=i.next(),o.done)break;s=o.value}var u=s;u.set("shown",u.get("name")===e)}})}}}(i),i.exports.template={v:3,t:[" "," ",{p:[20,1,524],t:7,e:"header",f:[{t:4,f:[{p:[22,5,556],t:7,e:"ui-button",a:{pane:[{t:2,r:".",p:[22,22,573]}]},v:{press:"switch"},f:[{t:2,r:".",p:[22,47,598]}]}],n:52,r:"tabs",p:[21,3,536]}]}," ",{p:[25,1,641],t:7,e:"ui-display",f:[{t:8,r:"content",p:[26,3,657]}]}]},i.exports.components=i.exports.components||{};var a={tab:t(216)};for(var o in a)a.hasOwnProperty(o)&&(i.exports.components[o]=a[o]);e.exports=r.extend(i.exports)},{205:205,216:216}],216:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{t:4,f:[{t:16,p:[2,3,17]}],n:50,r:"shown",p:[1,1,0]}]},e.exports=r.extend(i.exports)},{205:205}],217:[function(t,e,n){var r=t(205),i={exports:{}};!function(e){"use strict";var n=t(271),r=t(270),i=t(272);e.exports={computed:{visualStatus:function(){switch(this.get("config.status")){case n.UI_INTERACTIVE:return"good";case n.UI_UPDATE:return"average";case n.UI_DISABLED:return"bad";default:return"bad"}}},oninit:function(){var t=this,e=i.drag.bind(this),n=function(e){return t.set({drag:!1,x:null,y:null})};this.observe("config.fancy",function(i,a,o){(0,r.winset)(t.get("config.window"),"titlebar",!i),i?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",n)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",n))}),this.on({drag:function(){this.toggle("drag")},close:function(){(0,r.winset)(this.get("config.window"),"is-visible",!1),window.location.href=(0,r.href)({command:"uiclose "+this.get("config.ref")},"winset")},minimize:function(){(0,r.winset)(this.get("config.window"),"is-minimized",!0)}})}}}(i),i.exports.template={v:3,t:[" ",{p:[49,1,1382],t:7,e:"header",a:{"class":"titlebar"},v:{mousedown:"drag"},f:[{p:[50,3,1431],t:7,e:"i",a:{"class":["statusicon fa fa-eye fa-2x ",{t:2,r:"visualStatus",p:[50,40,1468]}]}}," ",{p:[51,3,1494],t:7,e:"span",a:{"class":"title"},f:[{t:16,p:[51,23,1514]}]}," ",{t:4,f:[{p:[53,5,1560],t:7,e:"i",a:{"class":"minimize fa fa-minus fa-2x"},v:{click:"minimize"}}," ",{p:[54,5,1628],t:7,e:"i",a:{"class":"close fa fa-close fa-2x"},v:{click:"close"}}],n:50,r:"config.fancy",p:[52,3,1534]}]}]},e.exports=r.extend(i.exports)},{205:205,270:270,271:271,272:272}],218:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";var e=[11,10,9,8];t.exports={data:{userAgent:navigator.userAgent},computed:{ie:function(){if(document.documentMode)return document.documentMode;for(var t in e){var n=document.createElement("div");if(n.innerHTML="",n.getElementsByTagName("span").length)return t}}},oninit:function(){var t=this;this.on("debug",function(){return t.toggle("debug")})}}}(i),i.exports.template={v:3,t:[" ",{t:4,f:[{p:[27,3,662],t:7,e:"ui-notice",f:[{p:[28,5,679],t:7,e:"span",f:["You have an old (IE",{t:2,r:"ie",p:[28,30,704]},"), end-of-life (click 'EOL Info' for more information) version of Internet Explorer installed."]},{p:[28,137,811],t:7,e:"br"}," ",{p:[29,5,822],t:7,e:"span",f:["To upgrade, click 'Upgrade IE' to download IE11 from Microsoft."]},{p:[29,81,898],t:7,e:"br"}," ",{p:[30,5,909],t:7,e:"span",f:["If you are unable to upgrade directly, click 'IE VMs' to download a VM with IE11 or Edge from Microsoft."]},{p:[30,122,1026],t:7,e:"br"}," ",{p:[31,5,1037],t:7,e:"span",f:["Otherwise, click 'No Frills' below to disable potentially incompatible features (and this message)."]}," ",{p:[32,5,1155],t:7,e:"hr"}," ",{p:[33,5,1166],t:7,e:"ui-button",a:{icon:"close",action:"tgui:nofrills"},f:["No Frills"]}," ",{p:[34,5,1240],t:7,e:"ui-button",a:{icon:"internet-explorer",action:"tgui:link",params:'{"url": "http://windows.microsoft.com/en-us/internet-explorer/download-ie"}'},f:["Upgrade IE"]}," ",{p:[36,5,1416],t:7,e:"ui-button",a:{icon:"edge",action:"tgui:link",params:'{"url": "https://dev.windows.com/en-us/microsoft-edge/tools/vms"}'},f:["IE VMs"]}," ",{p:[38,5,1565],t:7,e:"ui-button",a:{icon:"info",action:"tgui:link",params:'{"url": "https://support.microsoft.com/en-us/lifecycle#gp/Microsoft-Internet-Explorer"}'},f:["EOL Info"]}," ",{p:[40,5,1738],t:7,e:"ui-button",a:{icon:"bug"},v:{press:"debug"},f:["Debug Info"]}," ",{t:4,f:[{p:[42,7,1826],t:7,e:"hr"}," ",{p:[43,7,1839],t:7,e:"span",f:["Detected: IE",{t:2,r:"ie",p:[43,25,1857]}]},{p:[43,38,1870],t:7,e:"br"}," ",{p:[44,7,1883],t:7,e:"span",f:["User Agent: ",{t:2,r:"userAgent",p:[44,25,1901]}]}],n:50,r:"debug",p:[41,5,1805]}]}],n:50,x:{r:["config.fancy","ie"],s:"_0&&_1&&_1<11"},p:[26,1,621]}]},e.exports=r.extend(i.exports)},{205:205}],219:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[" "," "," "," "," ",{p:[7,1,267],t:7,e:"ui-notice",f:[{t:4,f:[{p:[9,5,312],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[10,7,355],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[10,24,372]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[10,75,423]}]}]}],n:50,r:"data.siliconUser",p:[8,3,282]},{t:4,n:51,f:[{p:[13,5,514],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,31,540]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[16,1,625],t:7,e:"status"}," ",{t:4,f:[{t:4,f:[{p:[19,7,719],t:7,e:"ui-display",a:{title:"Air Controls"},f:[{p:[20,9,762],t:7,e:"ui-section",f:[{p:[21,11,786],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"exclamation-triangle":"exclamation"'},p:[21,28,803]}],style:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"caution":null'},p:[21,98,873]}],action:[{t:2,x:{r:["data.atmos_alarm"],s:'_0?"reset":"alarm"'},p:[22,23,937]}]},f:["Area Atmosphere Alarm"]}]}," ",{p:[24,9,1045],t:7,e:"ui-section",f:[{p:[25,11,1069],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mode"],s:'_0==3?"exclamation-triangle":"exclamation"'},p:[25,28,1086]}],style:[{t:2,x:{r:["data.mode"],s:'_0==3?"danger":null'},p:[25,96,1154]}],action:"mode",params:['{"mode": ',{t:2,x:{r:["data.mode"],s:"_0==3?1:3"},p:[26,44,1236]},"}"]},f:["Panic Siphon"]}]}," ",{p:[28,9,1322],t:7,e:"br"}," ",{p:[29,9,1337],t:7,e:"ui-section",f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:"sign-out",action:"tgui:view",params:'{"screen": "vents"}'},f:["Vent Controls"]}]}," ",{p:[32,9,1494],t:7,e:"ui-section",f:[{p:[33,11,1518],t:7,e:"ui-button",a:{icon:"filter",action:"tgui:view",params:'{"screen": "scrubbers"}'},f:["Scrubber Controls"]}]}," ",{p:[35,9,1657],
t:7,e:"ui-section",f:[{p:[36,11,1681],t:7,e:"ui-button",a:{icon:"cog",action:"tgui:view",params:'{"screen": "modes"}'},f:["Operating Mode"]}]}," ",{p:[38,9,1810],t:7,e:"ui-section",f:[{p:[39,11,1834],t:7,e:"ui-button",a:{icon:"bar-chart",action:"tgui:view",params:'{"screen": "thresholds"}'},f:["Alarm Thresholds"]}]}]}],n:50,x:{r:["config.screen"],s:'_0=="home"'},p:[18,3,680]},{t:4,n:51,f:[{t:4,n:50,x:{r:["config.screen"],s:'_0=="vents"'},f:[{p:[43,5,2032],t:7,e:"vents"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&(_0=="scrubbers")'},f:[" ",{p:[45,5,2089],t:7,e:"scrubbers"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&(_0=="modes"))'},f:[" ",{p:[47,5,2146],t:7,e:"modes"}]},{t:4,n:50,x:{r:["config.screen"],s:'(!(_0=="vents"))&&((!(_0=="scrubbers"))&&((!(_0=="modes"))&&(_0=="thresholds")))'},f:[" ",{p:[49,5,2204],t:7,e:"thresholds"}]}],x:{r:["config.screen"],s:'_0=="home"'}}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[17,1,636]}]},i.exports.components=i.exports.components||{};var a={vents:t(225),modes:t(221),thresholds:t(224),status:t(223),scrubbers:t(222)};for(var o in a)a.hasOwnProperty(o)&&(i.exports.components[o]=a[o]);e.exports=r.extend(i.exports)},{205:205,221:221,222:222,223:223,224:224,225:225}],220:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-button",a:{icon:"arrow-left",action:"tgui:view",params:'{"screen": "home"}'},f:["Back"]}]},e.exports=r.extend(i.exports)},{205:205}],221:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,115],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Operating Modes",button:0},f:[" ",{t:4,f:[{p:[8,5,168],t:7,e:"ui-section",f:[{p:[9,7,188],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["selected"],s:'_0?"check-square-o":"square-o"'},p:[9,24,205]}],state:[{t:2,x:{r:["selected","danger"],s:'_0?_1?"danger":"selected":null'},p:[10,16,267]}],action:"mode",params:['{"mode": ',{t:2,r:"mode",p:[11,40,361]},"}"]},f:[{t:2,r:"name",p:[11,51,372]}]}]}],n:52,r:"data.modes",p:[7,3,142]}]}]},i.exports.components=i.exports.components||{};var a={back:t(220)};for(var o in a)a.hasOwnProperty(o)&&(i.exports.components[o]=a[o]);e.exports=r.extend(i.exports)},{205:205,220:220}],222:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,117],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Scrubber Controls",button:0},f:[" ",{t:4,f:[{p:[8,5,174],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[8,27,196]}]},f:[{p:[9,7,219],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[10,9,255],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[10,26,272]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[10,68,314]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[11,46,391]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[11,66,411]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[11,80,425]}]}]}," ",{p:[13,7,490],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[14,9,525],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["scrubbing"],s:'_0?"filter":"sign-in"'},p:[14,26,542]}],style:[{t:2,x:{r:["scrubbing"],s:'_0?null:"danger"'},p:[14,71,587]}],action:"scrubbing",params:['{"id_tag": "',{t:2,r:"id_tag",p:[15,50,670]},'", "val": ',{t:2,x:{r:["scrubbing"],s:"+!_0"},p:[15,70,690]},"}"]},f:[{t:2,x:{r:["scrubbing"],s:'_0?"Scrubbing":"Siphoning"'},p:[15,88,708]}]}]}," ",{p:[17,7,790],t:7,e:"ui-section",a:{label:"Range"},f:[{p:[18,9,826],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["widenet"],s:'_0?"expand":"compress"'},p:[18,26,843]}],style:[{t:2,x:{r:["widenet"],s:'_0?"selected":null'},p:[18,70,887]}],action:"widenet",params:['{"id_tag": "',{t:2,r:"id_tag",p:[19,48,968]},'", "val": ',{t:2,x:{r:["widenet"],s:"+!_0"},p:[19,68,988]},"}"]},f:[{t:2,x:{r:["widenet"],s:'_0?"Expanded":"Normal"'},p:[19,84,1004]}]}]}," ",{p:[21,7,1080],t:7,e:"ui-section",a:{label:"Filters"},f:[{p:[22,9,1118],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_co2"],s:'_0?"check-square-o":"square-o"'},p:[22,26,1135]}],style:[{t:2,x:{r:["filter_co2"],s:'_0?"selected":null'},p:[22,81,1190]}],action:"co2_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[23,50,1276]},'", "val": ',{t:2,x:{r:["filter_co2"],s:"+!_0"},p:[23,70,1296]},"}"]},f:["CO2"]}," ",{p:[24,9,1340],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_n2o"],s:'_0?"check-square-o":"square-o"'},p:[24,26,1357]}],style:[{t:2,x:{r:["filter_n2o"],s:'_0?"selected":null'},p:[24,81,1412]}],action:"n2o_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[25,50,1498]},'", "val": ',{t:2,x:{r:["filter_n2o"],s:"+!_0"},p:[25,70,1518]},"}"]},f:["N2O"]}," ",{p:[26,9,1562],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_toxins"],s:'_0?"check-square-o":"square-o"'},p:[26,26,1579]}],style:[{t:2,x:{r:["filter_toxins"],s:'_0?"selected":null'},p:[26,84,1637]}],action:"tox_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[27,50,1726]},'", "val": ',{t:2,x:{r:["filter_toxins"],s:"+!_0"},p:[27,70,1746]},"}"]},f:["Plasma"]}]}]}],n:52,r:"data.scrubbers",p:[7,3,144]},{t:4,n:51,f:[{p:[31,5,1847],t:7,e:"span",a:{"class":"bad"},f:["Error: No scrubbers connected."]}],r:"data.scrubbers"}]}]},i.exports.components=i.exports.components||{};var a={back:t(220)};for(var o in a)a.hasOwnProperty(o)&&(i.exports.components[o]=a[o]);e.exports=r.extend(i.exports)},{205:205,220:220}],223:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Air Status"},f:[{t:4,f:[{t:4,f:[{p:[4,7,110],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[4,26,129]}]},f:[{p:[5,6,146],t:7,e:"span",a:{"class":[{t:2,x:{r:["danger_level"],s:'_0==2?"bad":_0==1?"average":"good"'},p:[5,19,159]}]},f:[{t:2,x:{r:["value"],s:"Math.fixed(_0,2)"},p:[6,5,237]},{t:2,r:"unit",p:[6,29,261]}]}]}],n:52,r:"adata.environment_data",p:[3,5,70]}," ",{p:[10,5,322],t:7,e:"ui-section",a:{label:"Local Status"},f:[{p:[11,7,363],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.danger_level"],s:'_0==2?"bad bold":_0==1?"average bold":"good"'},p:[11,20,376]}]},f:[{t:2,x:{r:["data.danger_level"],s:'_0==2?"Danger (Internals Required)":_0==1?"Caution":"Optimal"'},p:[12,6,475]}]}]}," ",{p:[15,5,619],t:7,e:"ui-section",a:{label:"Area Status"},f:[{p:[16,7,659],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.atmos_alarm","data.fire_alarm"],s:'_0||_1?"bad bold":"good"'},p:[16,20,672]}]},f:[{t:2,x:{r:["data.atmos_alarm","fire_alarm"],s:'_0?"Atmosphere Alarm":_1?"Fire Alarm":"Nominal"'},p:[17,8,744]}]}]}],n:50,r:"data.environment_data",p:[2,3,35]},{t:4,n:51,f:[{p:[21,5,876],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[22,7,912],t:7,e:"span",a:{"class":"bad bold"},f:["Cannot obtain air sample for analysis."]}]}],r:"data.environment_data"}," ",{t:4,f:[{p:[26,5,1040],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[27,7,1076],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[25,3,1014]}]}]},e.exports=r.extend(i.exports)},{205:205}],224:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.css=" th, td {\r\n padding-right: 16px;\r\n text-align: left;\r\n }",i.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,116],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Alarm Thresholds",button:0},f:[" ",{p:[7,3,143],t:7,e:"table",f:[{p:[8,5,156],t:7,e:"thead",f:[{p:[8,12,163],t:7,e:"tr",f:[{p:[9,7,175],t:7,e:"th"}," ",{p:[10,7,192],t:7,e:"th",f:[{p:[10,11,196],t:7,e:"span",a:{"class":"bad"},f:["min2"]}]}," ",{p:[11,7,238],t:7,e:"th",f:[{p:[11,11,242],t:7,e:"span",a:{"class":"average"},f:["min1"]}]}," ",{p:[12,7,288],t:7,e:"th",f:[{p:[12,11,292],t:7,e:"span",a:{"class":"average"},f:["max1"]}]}," ",{p:[13,7,338],t:7,e:"th",f:[{p:[13,11,342],t:7,e:"span",a:{"class":"bad"},f:["max2"]}]}]}]}," ",{p:[15,5,401],t:7,e:"tbody",f:[{t:4,f:[{p:[16,32,441],t:7,e:"tr",f:[{p:[17,9,455],t:7,e:"th",f:[{t:3,r:"name",p:[17,13,459]}]}," ",{t:4,f:[{p:[18,27,502],t:7,e:"td",f:[{p:[19,11,518],t:7,e:"ui-button",a:{action:"threshold",params:['{"env": "',{t:2,r:"env",p:[19,58,565]},'", "var": "',{t:2,r:"val",p:[19,76,583]},'"}']},f:[{t:2,x:{r:["selected"],s:"Math.fixed(_0,2)"},p:[19,87,594]}]}]}],n:52,r:"settings",p:[18,9,484]}]}],n:52,r:"data.thresholds",p:[16,7,416]}]}," ",{p:[23,3,697],t:7,e:"table",f:[]}]}]}," "]},i.exports.components=i.exports.components||{};var a={back:t(220)};for(var o in a)a.hasOwnProperty(o)&&(i.exports.components[o]=a[o]);e.exports=r.extend(i.exports)},{205:205,220:220}],225:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[" ",{p:{button:[{p:[5,5,113],t:7,e:"back"}]},t:7,e:"ui-display",a:{title:"Vent Controls",button:0},f:[" ",{t:4,f:[{p:[8,5,166],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"long_name",p:[8,27,188]}]},f:[{p:[9,7,211],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[10,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["power"],s:'_0?"power-off":"close"'},p:[10,26,264]}],style:[{t:2,x:{r:["power"],s:'_0?"selected":null'},p:[10,68,306]}],action:"power",params:['{"id_tag": "',{t:2,r:"id_tag",p:[11,46,383]},'", "val": ',{t:2,x:{r:["power"],s:"+!_0"},p:[11,66,403]},"}"]},f:[{t:2,x:{r:["power"],s:'_0?"On":"Off"'},p:[11,80,417]}]}]}," ",{p:[13,7,482],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[14,9,517],t:7,e:"span",f:[{t:2,x:{r:["direction"],s:'_0=="release"?"Pressurizing":"Siphoning"'},p:[14,15,523]}]}]}," ",{p:[16,7,616],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[17,9,665],t:7,e:"ui-button",a:{icon:"sign-in",style:[{t:2,x:{r:["incheck"],s:'_0?"selected":null'},p:[17,42,698]}],action:"incheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[18,48,779]},'", "val": ',{t:2,r:"checks",p:[18,68,799]},"}"]},f:["Internal"]}," ",{p:[19,9,842],t:7,e:"ui-button",a:{icon:"sign-out",style:[{t:2,x:{r:["excheck"],s:'_0?"selected":null'},p:[19,43,876]}],action:"excheck",params:['{"id_tag": "',{t:2,r:"id_tag",p:[20,48,957]},'", "val": ',{t:2,r:"checks",p:[20,68,977]},"}"]},f:["External"]}]}," ",{p:[22,7,1039],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,9,1085],t:7,e:"ui-button",a:{icon:"pencil",action:"set_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[24,31,1172]},'"}']},f:[{t:2,x:{r:["external"],s:"Math.fixed(_0)"},p:[24,45,1186]}]}," ",{p:[25,9,1232],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["extdefault"],s:'_0?"disabled":null'},p:[25,42,1265]}],action:"reset_external_pressure",params:['{"id_tag": "',{t:2,r:"id_tag",p:[26,31,1365]},'"}']},f:["Reset"]}]}]}],n:52,r:"data.vents",p:[7,3,140]},{t:4,n:51,f:[{p:[30,5,1457],t:7,e:"span",a:{"class":"bad"},f:["Error: No vents connected."]}],r:"data.vents"}]}]},i.exports.components=i.exports.components||{};var a={back:t(220)};for(var o in a)a.hasOwnProperty(o)&&(i.exports.components[o]=a[o]);e.exports=r.extend(i.exports)},{205:205,220:220}],226:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.css=" table {\r\n width: 100%;\r\n border-spacing: 2px;\r\n }\r\n th {\r\n text-align: left;\r\n }\r\n td {\r\n vertical-align: top;\r\n }\r\n td .button {\r\n margin-top: 4px\r\n }",i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",f:[{p:[3,5,34],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oneAccess"],s:'_0?"unlock":"lock"'},p:[3,22,51]}],action:"one_access"},f:[{t:2,x:{r:["data.oneAccess"],s:'_0?"One":"All"'},p:[3,82,111]}," Required"]}," ",{p:[4,5,172],t:7,e:"ui-button",a:{icon:"refresh",action:"clear"},f:["Clear"]}]}," ",{p:[6,3,251],t:7,e:"hr"}," ",{p:[7,3,260],t:7,e:"table",f:[{p:[8,3,271],t:7,e:"thead",f:[{p:[9,4,283],t:7,e:"tr",f:[{t:4,f:[{p:[10,5,315],t:7,e:"th",f:[{p:[10,9,319],t:7,e:"span",a:{"class":"highlight bold"},f:[{t:2,r:"name",p:[10,38,348]}]}]}],n:52,r:"data.regions",p:[9,8,287]}]}]}," ",{p:[13,3,403],t:7,e:"tbody",f:[{p:[14,4,415],t:7,e:"tr",f:[{t:4,f:[{p:[15,5,447],t:7,e:"td",f:[{t:4,f:[{p:[16,11,481],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["req"],s:'_0?"check-square-o":"square-o"'},p:[16,28,498]}],style:[{t:2,x:{r:["req"],s:'_0?"selected":null'},p:[16,76,546]}],action:"set",params:['{"access": "',{t:2,r:"id",p:[17,46,621]},'"}']},f:[{t:2,r:"name",p:[17,56,631]}]}," ",{p:[18,9,661],t:7,e:"br"}],n:52,r:"accesses",p:[15,9,451]}]}],n:52,r:"data.regions",p:[14,8,419]}]}]}]}]}," "]},e.exports=r.extend(i.exports)},{205:205}],227:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={data:{powerState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}}},computed:{malfAction:function(){switch(this.get("data.malfStatus")){case 1:return"hack";case 2:return"occupy";case 3:return"deoccupy"}},malfButton:function(){switch(this.get("data.malfStatus")){case 1:return"Override Programming";case 2:case 4:return"Shunt Core Process";case 3:return"Return to Main Core"}},malfIcon:function(){switch(this.get("data.malfStatus")){case 1:return"terminal";case 2:case 4:return"caret-square-o-down";case 3:return"caret-square-o-left"}},powerCellStatusState:function(){var t=this.get("data.powerCellStatus");return t>50?"good":t>25?"average":"bad"}}}}(i),i.exports.template={v:3,t:[" ",{p:[46,1,1184],t:7,e:"ui-notice",f:[{t:4,f:[{p:[48,5,1229],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[49,7,1272],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[49,24,1289]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[49,75,1340]}]}]}],n:50,r:"data.siliconUser",p:[47,3,1199]},{t:4,n:51,f:[{p:[52,5,1431],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[52,31,1457]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[55,1,1542],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[56,3,1579],t:7,e:"ui-section",a:{label:"Main Breaker"},f:[{t:4,f:[{p:[58,7,1666],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isOperating"],s:'_0?"good":"bad"'},p:[58,20,1679]}]},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[58,59,1718]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[57,5,1618]},{t:4,n:51,f:[{p:[60,7,1782],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[60,24,1799]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[60,77,1852]}],action:"breaker"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[61,26,1920]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}," ",{p:[64,3,2001],t:7,e:"ui-section",a:{label:"External Power"},f:[{p:[65,5,2042],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.externalPower"],s:"_0(_1)"},p:[65,18,2055]}]},f:[{t:2,x:{r:["data.externalPower"],s:'_0==2?"Good":_0==1?"Low":"None"'},p:[65,54,2091]}]}]}," ",{p:[67,3,2198],t:7,e:"ui-section",a:{label:"Power Cell"},f:[{t:4,f:[{p:[69,7,2279],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerCellStatus",p:[69,40,2312]}],state:[{t:2,r:"powerCellStatusState",p:[69,73,2345]}]},f:[{t:2,x:{r:["adata.powerCellStatus"],s:"Math.fixed(_0)"},p:[69,99,2371]},"%"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[68,5,2235]},{t:4,n:51,f:[{p:[71,7,2440],t:7,e:"span",a:{"class":"bad"},f:["Removed"]}],x:{r:["data.powerCellStatus"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[75,5,2548],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{t:4,f:[{p:[77,9,2638],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.chargeMode"],s:'_0?"good":"bad"'},p:[77,22,2651]}]},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[77,60,2689]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[76,7,2588]},{t:4,n:51,f:[{p:[79,9,2758],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.chargeMode"],s:'_0?"refresh":"close"'},p:[79,26,2775]}],style:[{t:2,x:{r:["data.chargeMode"],s:'_0?"selected":null'},p:[79,76,2825]}],action:"charge"},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[80,27,2893]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}," [",{p:[83,8,2979],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.chargingStatus"],s:"_0(_1)"},p:[83,21,2992]}]},f:[{t:2,x:{r:["data.chargingStatus"],s:'_0==2?"Fully Charged":_0==1?"Charging":"Not Charging"'},p:[83,58,3029]}]},"]"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[74,3,2506]}]}," ",{p:[87,1,3187],t:7,e:"ui-display",a:{title:"Power Channels"},f:[{t:4,f:[{p:[89,5,3260],t:7,e:"ui-section",a:{label:[{t:2,r:"title",p:[89,24,3279]}],nowrap:0},f:[{p:[90,7,3305],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.powerChannels"],s:"Math.round(_1[_0].powerLoad)"},p:[90,28,3326]}," W"]}," ",{p:[91,7,3395],t:7,e:"div",a:{"class":"content"},f:[{p:[91,28,3416],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0>=2?"good":"bad"'},p:[91,41,3429]}]},f:[{t:2,x:{r:["status"],s:'_0>=2?"On":"Off"'},p:[91,75,3463]}]}]}," ",{p:[92,7,3514],t:7,e:"div",a:{"class":"content"},f:["[",{p:[92,29,3536],t:7,e:"span",f:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"Auto":"Manual"'},p:[92,35,3542]}]},"]"]}," ",{p:[93,7,3614],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{t:4,f:[{p:[95,11,3717],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"selected":null'},p:[95,44,3750]}],action:"channel",params:[{t:2,r:"topicParams.auto",p:[96,38,3840]}]},f:["Auto"]}," ",{p:[97,11,3890],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["status"],s:'_0==2?"selected":null'},p:[97,46,3925]}],action:"channel",params:[{t:2,r:"topicParams.on",p:[98,21,4e3]}]},f:["On"]}," ",{p:[99,11,4046],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["status"],s:'_0==0?"selected":null'},p:[99,42,4077]}],action:"channel",params:[{t:2,r:"topicParams.off",p:[100,21,4152]}]},f:["Off"]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[94,9,3665]}]}]}],n:52,r:"data.powerChannels",p:[88,3,3226]}," ",{p:[105,3,4255],t:7,e:"ui-section",a:{label:"Total Load"},f:[{p:[106,5,4292],t:7,e:"span",a:{"class":"bold"},f:[{t:2,x:{r:["adata.totalLoad"],s:"Math.round(_0)"},p:[106,24,4311]}," W"]}]}]}," ",{t:4,f:[{p:[110,3,4413],t:7,e:"ui-display",a:{title:"System Overrides"},f:[{p:[111,5,4456],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"overload"},f:["Overload"]}," ",{t:4,f:[{p:[113,7,4561],t:7,e:"ui-button",a:{icon:[{t:2,r:"malfIcon",p:[113,24,4578]}],state:[{t:2,x:{r:["data.malfStatus"],s:'_0==4?"disabled":null'},p:[113,45,4599]}],action:[{t:2,r:"malfAction",p:[113,99,4653]}]},f:[{t:2,r:"malfButton",p:[113,115,4669]}]}],n:50,r:"data.malfStatus",p:[112,5,4530]}]}],n:50,r:"data.siliconUser",p:[109,1,4385]},{p:[117,1,4736],t:7,e:"ui-notice",f:[{p:[118,3,4751],t:7,e:"ui-section",a:{label:"Cover Lock"},f:[{t:4,f:[{p:[120,7,4836],t:7,e:"span",f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[120,13,4842]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[119,5,4788]},{t:4,n:51,f:[{p:[122,7,4918],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.coverLocked"],s:'_0?"lock":"unlock"'},p:[122,24,4935]}],action:"cover"},f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[122,81,4992]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}]},e.exports=r.extend(i.exports)},{205:205}],228:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Alarms"},f:[{p:[2,3,31],t:7,e:"ul",f:[{t:4,f:[{p:[4,7,72],t:7,e:"li",f:[{p:[4,11,76],t:7,e:"ui-button",a:{icon:"close",style:"danger",action:"clear",params:['{"zone": "',{t:2,r:".",p:[4,83,148]},'"}']},f:[{t:2,r:".",p:[4,92,157]}]}]}],n:52,r:"data.priority",p:[3,5,41]},{t:4,n:51,f:[{p:[6,7,201],t:7,e:"li",f:[{p:[6,11,205],t:7,e:"span",a:{"class":"good"},f:["No Priority Alerts"]}]}],r:"data.priority"}," ",{t:4,f:[{p:[9,7,303],t:7,e:"li",f:[{p:[9,11,307],t:7,e:"ui-button",a:{icon:"close",style:"caution",action:"clear",params:['{"zone": "',{t:2,r:".",p:[9,84,380]},'"}']},f:[{t:2,r:".",p:[9,93,389]}]}]}],n:52,r:"data.minor",p:[8,5,275]},{t:4,n:51,f:[{p:[11,7,433],t:7,e:"li",f:[{p:[11,11,437],t:7,e:"span",a:{"class":"good"},f:["No Minor Alerts"]}]}],r:"data.minor"}]}]}]},e.exports=r.extend(i.exports)},{205:205}],229:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.tank","data.sensors.0.long_name"],s:"_0?_1:null"},p:[1,20,19]}]},f:[{t:4,f:[{p:[3,5,102],t:7,e:"ui-subdisplay",a:{title:[{t:2,x:{r:["data.tank","long_name"],s:"!_0?_1:null"},p:[3,27,124]}]},f:[{p:[4,7,167],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[5,3,200],t:7,e:"span",f:[{t:2,x:{r:["pressure"],s:"Math.fixed(_0,2)"},p:[5,9,206]}," kPa"]}]}," ",{t:4,f:[{p:[8,9,302],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[9,11,346],t:7,e:"span",f:[{t:2,x:{r:["temperature"],s:"Math.fixed(_0,2)"},p:[9,17,352]}," K"]}]}],n:50,r:"temperature",p:[7,7,273]}," ",{t:4,f:[{p:[13,9,462],t:7,e:"ui-section",a:{label:[{t:2,r:"id",p:[13,28,481]}]},f:[{p:[14,5,495],t:7,e:"span",f:[{t:2,x:{r:["."],s:"Math.fixed(_0,2)"},p:[14,11,501]},"%"]}]}],n:52,i:"id",r:"gases",p:[12,4,434]}]}],n:52,r:"adata.sensors",p:[2,3,73]}]}," ",{t:4,f:[{p:{button:[{p:[23,5,704],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[25,5,792],t:7,e:"ui-section",a:{label:"Input Injector"},f:[{p:[26,7,835],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputting"],s:'_0?"power-off":"close"'},p:[26,24,852]}],style:[{t:2,x:{r:["data.inputting"],s:'_0?"selected":null'},p:[26,75,903]}],action:"input"},f:[{t:2,x:{r:["data.inputting"],s:'_0?"Injecting":"Off"'},p:[27,9,968]}]}]}," ",{p:[29,5,1044],t:7,e:"ui-section",a:{label:"Input Rate"},f:[{p:[30,7,1083],t:7,e:"span",f:[{t:2,x:{r:["adata.inputRate"],s:"Math.fixed(_0)"},p:[30,13,1089]}," L/s"]}]}," ",{p:[32,5,1156],t:7,e:"ui-section",a:{label:"Output Regulator"},f:[{p:[33,7,1201],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputting"],s:'_0?"power-off":"close"'},p:[33,24,1218]}],style:[{t:2,x:{r:["data.outputting"],s:'_0?"selected":null'},p:[33,76,1270]}],action:"output"},f:[{t:2,x:{r:["data.outputting"],s:'_0?"Open":"Closed"'},p:[34,9,1337]}]}]}," ",{p:[36,5,1412],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[37,7,1456],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure"},f:[{t:2,x:{r:["adata.outputPressure"],s:"Math.round(_0)"},p:[37,50,1499]}," kPa"]}]}]}],n:50,r:"data.tank",p:[20,1,618]}]},e.exports=r.extend(i.exports)},{205:205}],230:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,360],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,390]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,518],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[9,11,524]}," kPa"]}]}," ",{p:[11,3,586],t:7,e:"ui-section",a:{label:"Filter"},f:[{p:[12,5,619],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0==""?"selected":null'},p:[12,23,637]}],action:"filter",params:'{"mode": ""}'},f:["Nothing"]}," ",{p:[14,5,755],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="plasma"?"selected":null'},p:[14,23,773]}],action:"filter",params:'{"mode": "plasma"}'},f:["Plasma"]}," ",{p:[16,5,902],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="o2"?"selected":null'},p:[16,23,920]}],action:"filter",params:'{"mode": "o2"}'},f:["O2"]}," ",{p:[18,5,1037],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="n2"?"selected":null'},p:[18,23,1055]}],action:"filter",params:'{"mode": "n2"}'},f:["N2"]}," ",{p:[20,5,1172],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="co2"?"selected":null'},p:[20,23,1190]}],action:"filter",params:'{"mode": "co2"}'},f:["CO2"]}," ",{p:[22,5,1310],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="n2o"?"selected":null'},p:[22,23,1328]}],action:"filter",params:'{"mode": "n2o"}'},f:["N2O"]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],231:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{p:[6,3,223],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[7,5,265],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[8,5,360],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.set_pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[8,35,390]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[9,5,522],t:7,e:"span",f:[{t:2,x:{r:["adata.set_pressure"],s:"Math.round(_0)"},p:[9,11,528]}," kPa"]}]}," ",{p:[11,3,594],t:7,e:"ui-section",a:{label:"Node 1"},f:[{p:[12,5,627],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[12,44,666]}],action:"node1",params:'{"concentration": -0.1}'}}," ",{p:[14,5,783],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==0?"disabled":null'},p:[14,39,817]}],action:"node1",params:'{"concentration": -0.01}'}}," ",{p:[16,5,935],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[16,38,968]}],action:"node1",params:'{"concentration": 0.01}'}}," ",{p:[18,5,1087],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node1_concentration"],s:'_0==100?"disabled":null'},p:[18,43,1125]}],action:"node1",params:'{"concentration": 0.1}'}}," ",{p:[20,5,1243],t:7,e:"span",f:[{t:2,x:{r:["adata.node1_concentration"],s:"Math.round(_0)"},p:[20,11,1249]},"%"]}]}," ",{p:[22,3,1319],t:7,e:"ui-section",a:{label:"Node 2"},f:[{p:[23,5,1352],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[23,44,1391]}],action:"node2",params:'{"concentration": -0.1}'}}," ",{p:[25,5,1508],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==0?"disabled":null'},p:[25,39,1542]}],action:"node2",params:'{"concentration": -0.01}'}}," ",{p:[27,5,1660],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[27,38,1693]}],action:"node2",params:'{"concentration": 0.01}'}}," ",{p:[29,5,1812],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.node2_concentration"],s:'_0==100?"disabled":null'},p:[29,43,1850]}],action:"node2",params:'{"concentration": 0.1}'}}," ",{p:[31,5,1968],t:7,e:"span",f:[{t:2,x:{r:["adata.node2_concentration"],s:"Math.round(_0)"},p:[31,11,1974]},"%"]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],232:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,48],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[3,22,65]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[3,66,109]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[4,22,164]}]}]}," ",{t:4,f:[{p:[7,5,250],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{p:[8,7,292],t:7,e:"ui-button",a:{icon:"pencil",action:"rate",params:'{"rate": "input"}'},f:["Set"]}," ",{p:[9,7,381],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.rate","data.max_rate"],s:'_0==_1?"disabled":null'},p:[9,37,411]}],action:"transfer",params:'{"rate": "max"}'},f:["Max"]}," ",{p:[10,7,529],t:7,e:"span",f:[{t:2,x:{r:["adata.rate"],s:"Math.round(_0)"},p:[10,13,535]}," L/s"]}]}],n:50,r:"data.max_rate",p:[6,3,223]},{t:4,n:51,f:[{p:[13,5,609],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[14,7,653],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[15,7,750],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.pressure","data.max_pressure"],s:'_0==_1?"disabled":null'},p:[15,37,780]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[16,7,910],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[16,13,916]}," kPa"]}]}],r:"data.max_rate"}]}]},e.exports=r.extend(i.exports)},{205:205}],233:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:{button:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"selected":null'},p:[3,38,100]}],action:[{t:2,x:{r:["data.timing"],s:'_0?"stop":"start"'},p:[3,83,145]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"Stop":"Start"'},p:[3,119,181]}]}," ",{p:[4,5,233],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"flash",style:[{t:2,x:{r:["data.flash_charging"],s:'_0?"disabled":null'},p:[4,57,285]}]},f:[{t:2,x:{r:["data.flash_charging"],s:'_0?"Recharging":"Flash"'},p:[4,102,330]}]}]},t:7,e:"ui-display",a:{title:"Cell Timer",button:0},f:[" ",{p:[6,3,410],t:7,e:"ui-section",f:[{p:[7,5,428],t:7,e:"ui-button",a:{icon:"fast-backward",action:"time",params:'{"adjust": -600}'}}," ",{p:[8,5,518],t:7,e:"ui-button",a:{icon:"backward",action:"time",params:'{"adjust": -100}'}}," ",{p:[9,5,603],t:7,e:"span",f:[{t:2,x:{r:["text","data.minutes"],s:"_0.zeroPad(_1,2)"},p:[9,11,609]},":",{t:2,x:{r:["text","data.seconds"],s:"_0.zeroPad(_1,2)"},p:[9,45,643]}]}," ",{p:[10,5,689],t:7,e:"ui-button",a:{icon:"forward",action:"time",params:'{"adjust": 100}'}}," ",{p:[11,5,772],t:7,e:"ui-button",a:{icon:"fast-forward",action:"time",params:'{"adjust": 600}'}}]}," ",{p:[13,3,875],t:7,e:"ui-section",f:[{p:[14,7,895],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "short"}'},f:["Short"]}," ",{p:[15,7,999],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "medium"}'},f:["Medium"]}," ",{p:[16,7,1105],t:7,e:"ui-button",a:{icon:"hourglass-start",action:"preset",params:'{"preset": "long"}'},f:["Long"]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],234:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.hasHoldingTank"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:{button:[{p:[6,5,185],t:7,e:"ui-button",a:{icon:"pencil",action:"relabel"},f:["Relabel"]}]},t:7,e:"ui-display",a:{title:"Canister",button:0},f:[" ",{p:[8,3,266],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[9,5,301],t:7,e:"span",f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[9,11,307]}," kPa"]}]}," ",{p:[11,3,373],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[12,5,404],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.portConnected"],s:'_0?"good":"average"'},p:[12,18,417]}]},f:[{t:2,x:{r:["data.portConnected"],s:'_0?"Connected":"Not Connected"'},p:[12,63,462]}]}]}]}," ",{p:[15,1,557],t:7,e:"ui-display",a:{title:"Valve"},f:[{p:[16,3,587],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[17,5,630],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[17,18,643]}],max:[{t:2,r:"data.maxReleasePressure",p:[17,52,677]}],value:[{t:2,r:"data.releasePressure",p:[18,14,720]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[18,40,746]}," kPa"]}]}," ",{p:[20,3,817],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[21,5,862],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[21,38,895]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[23,5,1051],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'
-},p:[23,36,1082]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[25,5,1229],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[26,5,1324],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[26,35,1354]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[29,3,1516],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[30,5,1548],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[30,22,1565]}],style:[{t:2,x:{r:["data.valveOpen","data.hasHoldingTank"],s:'_0?_1?"caution":"danger":null'},p:[31,14,1619]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[32,22,1713]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[38,7,1901],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.valveOpen"],s:'_0?"danger":null'},p:[38,38,1932]}],action:"eject"},f:["Eject"]}],n:50,r:"data.hasHoldingTank",p:[37,5,1866]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[42,3,2066],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holdingTank.name",p:[43,4,2097]}]}," ",{p:[45,3,2143],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holdingTank.tankPressure"],s:"Math.round(_0)"},p:[46,4,2177]}," kPa"]}],n:50,r:"data.hasHoldingTank",p:[41,3,2035]},{t:4,n:51,f:[{p:[49,3,2259],t:7,e:"ui-section",f:[{p:[50,4,2276],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.hasHoldingTank"}]}]},e.exports=r.extend(i.exports)},{205:205}],235:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(i),i.exports.template={v:3,t:[" ",{p:[11,1,158],t:7,e:"ui-display",a:{title:"Cargo"},f:[{p:[12,3,188],t:7,e:"ui-section",a:{label:"Shuttle"},f:[{t:4,f:[{p:[14,7,270],t:7,e:"ui-button",a:{action:"send"},f:[{t:2,r:"data.location",p:[14,32,295]}]}],n:50,x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"},p:[13,5,222]},{t:4,n:51,f:[{p:[16,7,346],t:7,e:"span",f:[{t:2,r:"data.location",p:[16,13,352]}]}],x:{r:["data.docked","data.requestonly"],s:"_0&&!_1"}}]}," ",{p:[19,3,410],t:7,e:"ui-section",a:{label:"Credits"},f:[{p:[20,5,444],t:7,e:"span",f:[{t:2,x:{r:["adata.points"],s:"Math.floor(_0)"},p:[20,11,450]}]}]}," ",{p:[22,3,506],t:7,e:"ui-section",a:{label:"Centcom Message"},f:[{p:[23,7,550],t:7,e:"span",f:[{t:2,r:"data.message",p:[23,13,556]}]}]}," ",{t:4,f:[{p:[26,5,644],t:7,e:"ui-section",a:{label:"Loan"},f:[{t:4,f:[{p:[28,9,716],t:7,e:"ui-button",a:{action:"loan"},f:["Loan Shuttle"]}],n:50,x:{r:["data.loan_dispatched"],s:"!_0"},p:[27,7,677]},{t:4,n:51,f:[{p:[30,9,791],t:7,e:"span",a:{"class":"bad"},f:["Loaned to Centcom"]}],x:{r:["data.loan_dispatched"],s:"!_0"}}]}],n:50,x:{r:["data.loan","data.requestonly"],s:"_0&&!_1"},p:[25,3,600]}]}," ",{t:4,f:[{p:{button:[{p:[38,7,989],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.cart.length"],s:'_0?null:"disabled"'},p:[38,38,1020]}],action:"clear"},f:["Clear"]}]},t:7,e:"ui-display",a:{title:"Cart",button:0},f:[" ",{t:4,f:[{p:[41,7,1145],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[42,9,1186],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[42,31,1208]}]}," ",{p:[43,9,1230],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[43,30,1251]}]}," ",{p:[44,9,1277],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[44,30,1298]}," Credits"]}," ",{p:[45,9,1330],t:7,e:"div",a:{"class":"content"},f:[{p:[46,11,1363],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"id": "',{t:2,r:"id",p:[46,67,1419]},'"}']}}]}]}],n:52,r:"data.cart",p:[40,5,1118]},{t:4,n:51,f:[{p:[50,7,1489],t:7,e:"span",f:["Nothing in Cart"]}],r:"data.cart"}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[35,1,895]},{p:{button:[{t:4,f:[{p:[57,7,1658],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.requests.length"],s:'_0?null:"disabled"'},p:[57,38,1689]}],action:"denyall"},f:["Clear"]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[56,5,1625]}]},t:7,e:"ui-display",a:{title:"Requests",button:0},f:[" ",{t:4,f:[{p:[61,5,1831],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[62,7,1870],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[62,29,1892]}]}," ",{p:[63,7,1912],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[63,28,1933]}]}," ",{p:[64,7,1957],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[64,28,1978]}," Credits"]}," ",{p:[65,7,2008],t:7,e:"div",a:{"class":"content"},f:["By ",{t:2,r:"orderer",p:[65,31,2032]}]}," ",{p:[66,7,2057],t:7,e:"div",a:{"class":"content"},f:["Comment: ",{t:2,r:"reason",p:[66,37,2087]}]}," ",{t:4,f:[{p:[68,9,2146],t:7,e:"div",a:{"class":"content"},f:[{p:[69,11,2179],t:7,e:"ui-button",a:{icon:"check",action:"approve",params:['{"id": "',{t:2,r:"id",p:[69,68,2236]},'"}']}}," ",{p:[70,11,2259],t:7,e:"ui-button",a:{icon:"close",action:"deny",params:['{"id": "',{t:2,r:"id",p:[70,65,2313]},'"}']}}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[67,7,2111]}]}],n:52,r:"data.requests",p:[60,3,1802]},{t:4,n:51,f:[{p:[75,7,2396],t:7,e:"span",f:["No Requests"]}],r:"data.requests"}]}," ",{p:[78,1,2452],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[78,16,2467]}]},f:[{t:4,f:[{p:[80,5,2510],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[80,16,2521]}]},f:[{t:4,f:[{p:[82,9,2564],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[82,28,2583]}],candystripe:0,right:0},f:[{p:[83,11,2623],t:7,e:"ui-button",a:{action:"add",params:['{"id": "',{t:2,r:"id",p:[83,51,2663]},'"}']},f:[{t:2,r:"cost",p:[83,61,2673]}," Credits"]}]}],n:52,r:"packs",p:[81,7,2539]}]}],n:52,r:"data.supplies",p:[79,3,2481]}]}]},e.exports=r.extend(i.exports)},{205:205}],236:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Energy"},f:[{p:[3,5,64],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.maxEnergy",p:[3,26,85]}],value:[{t:2,r:"data.energy",p:[3,53,112]}]},f:[{t:2,x:{r:["adata.energy"],s:"Math.fixed(_0)"},p:[3,70,129]}," Units"]}]}]}," ",{p:{button:[{t:4,f:[{p:[9,7,315],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.amount","."],s:'_0==_1?"selected":null'},p:[9,37,345]}],action:"amount",params:['{"target": ',{t:2,r:".",p:[9,114,422]},"}"]},f:[{t:2,r:".",p:[9,122,430]}]}],n:52,r:"data.beakerTransferAmounts",p:[8,5,271]}]},t:7,e:"ui-display",a:{title:"Dispense",button:0},f:[" ",{p:[12,3,482],t:7,e:"ui-section",f:[{t:4,f:[{p:[14,7,532],t:7,e:"ui-button",a:{grid:0,icon:"tint",action:"dispense",params:['{"reagent": "',{t:2,r:"id",p:[14,74,599]},'"}']},f:[{t:2,r:"title",p:[14,84,609]}]}],n:52,r:"data.chemicals",p:[13,5,500]}]}]}," ",{p:{button:[{t:4,f:[{p:[21,7,786],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"amount": ',{t:2,r:".",p:[21,66,845]},"}"]},f:[{t:2,r:".",p:[21,74,853]}]}],n:52,r:"data.beakerTransferAmounts",p:[20,5,742]}," ",{p:[23,5,891],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[23,36,922]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[25,3,1019],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[27,7,1089],t:7,e:"span",f:[{t:2,x:{r:["adata.beakerCurrentVolume"],s:"Math.round(_0)"},p:[27,13,1095]},"/",{t:2,r:"data.beakerMaxVolume",p:[27,55,1137]}," Units"]}," ",{p:[28,7,1182],t:7,e:"br"}," ",{t:4,f:[{p:[30,9,1235],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[30,52,1278]}," units of ",{t:2,r:"name",p:[30,87,1313]}]},{p:[30,102,1328],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[29,7,1195]},{t:4,n:51,f:[{p:[32,9,1359],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[26,5,1054]},{t:4,n:51,f:[{p:[35,7,1435],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=r.extend(i.exports)},{205:205}],237:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[2,3,35],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,5,67],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isActive"],s:'_0?"power-off":"close"'},p:[3,22,84]}],style:[{t:2,x:{r:["data.isActive"],s:'_0?"selected":null'},p:[4,10,137]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,10,186]}],action:"power"},f:[{t:2,x:{r:["data.isActive"],s:'_0?"On":"Off"'},p:[6,18,249]}]}]}," ",{p:[8,3,314],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,4,346],t:7,e:"ui-button",a:{icon:"pencil",action:"temperature",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[9,79,421]}," K"]}]}]}," ",{p:{button:[{p:[14,5,564],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[14,36,595]}],action:"eject"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[16,3,692],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{p:[18,7,762],t:7,e:"span",f:["Temperature: ",{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[18,26,781]}," K"]}," ",{p:[19,7,831],t:7,e:"br"}," ",{t:4,f:[{p:[21,9,885],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[21,52,928]}," units of ",{t:2,r:"name",p:[21,87,963]}]},{p:[21,102,978],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[20,7,845]},{t:4,n:51,f:[{p:[23,9,1009],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[17,5,727]},{t:4,n:51,f:[{p:[26,7,1085],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=r.extend(i.exports)},{205:205}],238:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{t:4,f:[{p:[2,2,32],t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject":"close"'},p:[3,20,87]}],style:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"selected":null'},p:[4,11,143]}],state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[5,11,199]}],action:"eject"},f:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?"Eject and Clear Buffer":"No beaker"'},p:[7,5,268]}]}," ",{p:[10,3,357],t:7,e:"ui-section",f:[{t:4,f:[{t:4,f:[{p:[13,6,443],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[13,25,462]}," units of ",{t:2,r:"name",p:[13,60,497]}],nowrap:0},f:[{p:[14,7,522],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[15,8,572],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[15,61,625]},'", "amount": 1}']},f:["1"]}," ",{p:[16,8,670],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[16,61,723]},'", "amount": 5}']},f:["5"]}," ",{p:[17,8,768],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[17,61,821]},'", "amount": 10}']},f:["10"]}," ",{p:[18,8,868],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[18,61,921]},'", "amount": 1000}']},f:["All"]}," ",{p:[19,8,971],t:7,e:"ui-button",a:{action:"transferToBuffer",params:['{"id": "',{t:2,r:"id",p:[19,61,1024]},'", "amount": -1}']},f:["Custom"]}," ",{p:[20,8,1075],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[20,52,1119]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.beakerContents",p:[12,5,407]},{t:4,n:51,f:[{p:[24,5,1201],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"data.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[11,4,374]},{t:4,n:51,f:[{p:[27,5,1272],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}," ",{p:[32,2,1360],t:7,e:"ui-display",a:{title:"Buffer"},f:[{p:[33,3,1391],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?null:"selected"'},p:[33,41,1429]}]},f:["Destroy"]}," ",{p:[34,3,1487],t:7,e:"ui-button",a:{action:"toggleMode",state:[{t:2,x:{r:["data.mode"],s:'_0?"selected":null'},p:[34,41,1525]}]},f:["Transfer to Beaker"]}," ",{p:[35,3,1594],t:7,e:"ui-section",f:[{t:4,f:[{p:[37,5,1646],t:7,e:"ui-section",a:{label:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[37,24,1665]}," units of ",{t:2,r:"name",p:[37,59,1700]}],nowrap:0},f:[{p:[38,6,1724],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{p:[39,7,1773],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[39,62,1828]},'", "amount": 1}']},f:["1"]}," ",{p:[40,7,1872],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[40,62,1927]},'", "amount": 5}']},f:["5"]}," ",{p:[41,7,1971],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[41,62,2026]},'", "amount": 10}']},f:["10"]}," ",{p:[42,7,2072],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[42,62,2127]},'", "amount": 1000}']},f:["All"]}," ",{p:[43,7,2176],t:7,e:"ui-button",a:{action:"transferFromBuffer",params:['{"id": "',{t:2,r:"id",p:[43,62,2231]},'", "amount": -1}']},f:["Custom"]}," ",{p:[44,7,2281],t:7,e:"ui-button",a:{action:"analyze",params:['{"id": "',{t:2,r:"id",p:[44,51,2325]},'"}']},f:["Analyze"]}]}]}],n:52,r:"data.bufferContents",p:[36,4,1611]}]}]}," ",{t:4,f:[{p:[52,3,2461],t:7,e:"ui-display",a:{title:"Pills, Bottles and Patches"},f:[{t:4,f:[{p:[54,5,2551],t:7,e:"ui-button",a:{action:"ejectp",state:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?null:"disabled"'},p:[54,39,2585]}]},f:[{t:2,x:{r:["data.isPillBottleLoaded"],s:'_0?"Eject":"No Pill bottle loaded"'},p:[54,88,2634]}]}," ",{p:[55,5,2715],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.pillBotContent",p:[55,27,2737]},"/",{t:2,r:"data.pillBotMaxContent",p:[55,51,2761]}]}],n:50,r:"data.isPillBottleLoaded",p:[53,4,2514]},{t:4,n:51,f:[{p:[57,5,2813],t:7,e:"span",a:{"class":"average"},f:["No Pillbottle"]}],r:"data.isPillBottleLoaded"}," ",{p:[60,4,2877],t:7,e:"br"}," ",{p:[61,4,2887],t:7,e:"br"}," ",{p:[62,4,2897],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[62,63,2956]}]},f:["Create Pill (max 50µ)"]}," ",{p:[63,4,3040],t:7,e:"br"}," ",{p:[64,4,3050],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[64,63,3109]}]},f:["Create Multiple Pills"]}," ",{p:[65,4,3193],t:7,e:"br"}," ",{p:[66,4,3203],t:7,e:"br"}," ",{p:[67,4,3213],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[67,64,3273]}]},f:["Create Patch (max 50µ)"]}," ",{p:[68,4,3358],t:7,e:"br"}," ",{p:[69,4,3368],t:7,e:"ui-button",a:{action:"createPatch",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[69,64,3428]}]},f:["Create Multiple Patches"]}," ",{p:[70,4,3514],t:7,e:"br"}," ",{p:[71,4,3524],t:7,e:"br"}," ",{p:[72,4,3534],t:7,e:"ui-button",a:{action:"createBottle",state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[72,44,3574]}]},f:["Create Bottle (max 30µ)"]}]}],n:50,x:{r:["data.condi"],s:"!_0"},p:[51,2,2438]},{t:4,n:51,f:[{p:[76,3,3688],t:7,e:"ui-display",a:{title:"Condiments bottles and packs"},f:[{p:[77,4,3743],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[77,63,3802]}]},f:["Create Pack (max 10µ)"]}," ",{p:[78,4,3886],t:7,e:"br"}," ",{p:[79,4,3896],t:7,e:"br"}," ",{p:[80,4,3906],t:7,e:"ui-button",a:{action:"createBottle",state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[80,44,3946]}]},f:["Create Bottle (max 50µ)"]}]}],x:{r:["data.condi"],s:"!_0"}}],n:50,x:{r:["data.screen"],s:'_0=="home"'},p:[1,1,0]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.screen"],s:'_0=="analyze"'},f:[{p:[84,2,4094],t:7,e:"ui-display",a:{title:[{t:2,r:"data.analyzeVars.name",p:[84,20,4112]}]},f:[{p:[85,3,4143],t:7,e:"span",a:{"class":"highlight"},f:["Description:"]}," ",{p:[86,3,4191],t:7,e:"span",a:{"class":"content",style:"float:center"},f:[{t:2,r:"data.analyzeVars.description",p:[86,46,4234]}]}," ",{p:[87,3,4277],t:7,e:"br"}," ",{p:[88,3,4286],t:7,e:"span",a:{"class":"highlight"},f:["Color:"]}," ",{p:[89,3,4328],t:7,e:"span",a:{style:["color: ",{t:2,r:"data.analyzeVars.color",p:[89,23,4348]},"; background-color: ",{t:2,r:"data.analyzeVars.color",p:[89,69,4394]}]},f:[{t:2,r:"data.analyzeVars.color",p:[89,97,4422]}]}," ",{p:[90,3,4459],t:7,e:"br"}," ",{p:[91,3,4468],t:7,e:"span",a:{"class":"highlight"},f:["State:"]}," ",{p:[92,3,4510],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.state",p:[92,25,4532]}]}," ",{p:[93,3,4569],t:7,e:"br"}," ",{p:[94,3,4578],t:7,e:"span",a:{"class":"highlight"},f:["Metabolization Rate:"]}," ",{p:[95,3,4634],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.metaRate",p:[95,25,4656]},"µ/minute"]}," ",{p:[96,3,4704],t:7,e:"br"}," ",{p:[97,3,4713],t:7,e:"span",a:{"class":"highlight"},f:["Overdose Threshold:"]}," ",{p:[98,3,4768],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.overD",p:[98,25,4790]}]}," ",{p:[99,3,4827],t:7,e:"br"}," ",{p:[100,3,4836],t:7,e:"span",a:{"class":"highlight"},f:["Addiction Threshold:"]}," ",{p:[101,3,4892],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.addicD",p:[101,25,4914]}]}," ",{p:[102,3,4952],t:7,e:"br"}," ",{p:[103,3,4961],t:7,e:"br"}," ",{p:[104,3,4970],t:7,e:"ui-button",a:{action:"goScreen",params:'{"screen": "home"}'},f:["Back"]}]}]}],x:{r:["data.screen"],s:'_0=="home"'}}]},e.exports=r.extend(i.exports)},{205:205}],239:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{t:4,f:[{p:[2,1,22],t:7,e:"ui-display",f:[{p:[3,2,37],t:7,e:"ui-section",a:{label:"Cap"},f:[{p:[4,3,65],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.is_capped"],s:'_0?"power-off":"close"'},p:[4,20,82]}],style:[{t:2,x:{r:["data.is_capped"],s:'_0?null:"selected"'},p:[4,71,133]}],action:"toggle_cap"},f:[{t:2,x:{r:["data.is_capped"],s:'_0?"On":"Off"'},p:[6,4,202]}]}]}]}],n:50,r:"data.has_cap",p:[1,1,0]},{p:[10,1,288],t:7,e:"ui-display",f:[{t:4,f:[{p:[14,2,419],t:7,e:"ui-section",f:[{p:[15,3,435],t:7,e:"ui-button",a:{action:"select_colour"},f:["Select New Colour"]}]}],n:50,r:"data.can_change_colour",p:[13,1,386]}]}," ",{p:[19,1,540],t:7,e:"ui-display",a:{title:"Stencil"},f:[{t:4,f:[{p:[21,2,599],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[21,21,618]}]},f:[{t:4,f:[{p:[23,7,655],t:7,e:"ui-button",a:{action:"select_stencil",params:['{"item":"',{t:2,r:"item",p:[23,59,707]},'"}'],style:[{t:2,x:{r:["item","data.selected_stencil"],s:'_0==_1?"selected":null'},p:[24,12,731]}]},f:[{t:2,r:"item",p:[25,4,791]}]}],n:52,r:"items",p:[22,3,632]}]}],n:52,r:"data.drawables",p:[20,3,572]}]}," ",{p:[31,1,874],t:7,e:"ui-display",a:{title:"Text Mode"},f:[{p:[32,2,907],t:7,e:"ui-section",a:{label:"Current Buffer"},f:[{t:2,r:"text_buffer",p:[32,37,942]}]}," ",{p:[34,2,976],t:7,e:"ui-section",f:[{p:[34,14,988],t:7,e:"ui-button",a:{action:"enter_text"},f:["New Text"]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],240:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={data:{temperatureStatus:function(t){return 225>t?"good":273.15>t?"average":"bad"}},computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(i),i.exports.template={v:3,t:[" ",{p:[22,1,466],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[23,3,499],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[24,3,532],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[24,9,538]}]}]}," ",{t:4,f:[{p:[27,5,655],t:7,e:"ui-section",a:{label:"State"},f:[{p:[28,7,689],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[28,20,702]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[28,43,725]}]}]}," ",{p:[30,4,846],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[31,6,885],t:7,e:"span",a:{"class":[{t:2,x:{r:["temperatureStatus","adata.occupant.bodyTemperature"],s:"_0(_1)"},p:[31,19,898]}]},f:[{t:2,x:{r:["adata.occupant.bodyTemperature"],s:"Math.round(_0)"},p:[31,74,953]}," K"]}]}," ",{p:[33,5,1032],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[34,7,1067],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[34,20,1080]}],max:[{t:2,r:"data.occupant.maxHealth",p:[34,54,1114]}],value:[{t:2,r:"data.occupant.health",p:[34,90,1150]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[35,16,1192]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[35,68,1244]}]}]}," ",{t:4,f:[{p:[38,7,1481],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[38,26,1500]}]},f:[{p:[39,9,1521],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[39,30,1542]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[39,66,1578]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[39,103,1615]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[37,5,1315]}],n:50,r:"data.hasOccupant",p:[26,3,625]}]}," ",{p:[44,1,1724],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[45,3,1753],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[46,5,1785],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[46,22,1802]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[47,14,1862]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[48,14,1918]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[49,22,1977]}]}]}," ",{p:[51,3,2045],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[52,3,2081],t:7,e:"span",a:{"class":[{t:2,x:{r:["temperatureStatus","adata.cellTemperature"],s:"_0(_1)"},p:[52,16,2094]}]},f:[{t:2,x:{r:["adata.cellTemperature"],s:"Math.round(_0)"},p:[52,62,2140]}," K"]}]}," ",{p:[54,2,2205],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[55,5,2236],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[55,22,2253]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[55,73,2304]}]}," ",{p:[56,5,2357],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[56,22,2374]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[56,86,2438]}]}]}]}," ",{p:{button:[{p:[61,5,2584],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[61,36,2615]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[63,3,2718],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[66,9,2828],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[66,52,2871]}," units of ",{t:2,r:"name",p:[66,87,2906]}]},{p:[66,102,2921],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[65,7,2788]},{t:4,n:51,f:[{p:[68,9,2952],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[64,5,2753]},{t:4,n:51,f:[{p:[71,7,3028],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=r.extend(i.exports)},{205:205}],241:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,46]},") was not found. Does it exist?"]}]}]},e.exports=r.extend(i.exports)},{205:205}],242:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={computed:{seclevelState:function(){switch(this.get("data.seclevel")){case"blue":return"average";case"red":return"bad";case"delta":return"bad bold";default:return"good"}}}}}(i),i.exports.template={v:3,t:[" ",{p:[16,1,323],t:7,e:"ui-display",f:[{p:[17,5,341],t:7,e:"ui-section",a:{label:"Alert Level"},f:[{p:[18,9,383],t:7,e:"span",a:{"class":[{t:2,r:"seclevelState",p:[18,22,396]}]},f:[{t:2,x:{r:["text","data.seclevel"],s:"_0.titleCase(_1)"},p:[18,41,415]}]}]}," ",{p:[20,5,480],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[21,9,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.alarm"],s:'_0?"close":"bell-o"'},p:[21,26,536]}],action:[{t:2,x:{r:["data.alarm"],s:'_0?"reset":"alarm"'},p:[21,71,581]}]},f:[{t:2,x:{r:["data.alarm"],s:'_0?"Reset":"Activate"'},p:[22,13,631]}]}]}," ",{t:4,f:[{p:[25,7,733],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[26,9,771],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[24,5,705]}]}]},e.exports=r.extend(i.exports)},{205:205}],243:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(i),i.exports.template={v:3,t:[" ",{t:4,f:[{p:[15,3,296],t:7,e:"ui-notice",f:[{p:[16,5,313],t:7,e:"span",f:["Wipe in progress!"]}]}],n:50,r:"data.wiping",p:[14,1,273]},{p:{button:[{t:4,f:[{p:[22,7,479],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.wiping","data.isDead"],s:'_0||_1?"disabled":null'},p:[22,38,510]}],action:"wipe"},f:["Wipe AI"]}],n:50,r:"data.name",p:[21,5,454]}]},t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.name"],s:'_0||"Empty Card"'},p:[19,19,388]}],button:0},f:[" ",{t:4,f:[{p:[26,5,651],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[27,9,688],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"bad":"good"'},p:[27,22,701]}]},f:[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"Offline":"Operational"'},p:[27,76,755]}]}]}," ",{p:[29,5,850],t:7,e:"ui-section",a:{label:"Software Integrity"},f:[{p:[30,7,897],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[30,40,930]}],state:[{t:2,r:"healthState",p:[30,64,954]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[30,81,971]},"%"]}]}," ",{p:[32,5,1034],t:7,e:"ui-section",a:{label:"Laws"},f:[{t:4,f:[{p:[34,9,1096],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[34,33,1120]}]},{p:[34,45,1132],t:7,e:"br"}],n:52,r:"data.laws",p:[33,7,1067]}]}," ",{p:[37,5,1179],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[38,7,1216],t:7,e:"ui-button",a:{icon:"signal",style:[{t:2,x:{r:["data.wireless"],s:'_0?"selected":null'},p:[38,39,1248]}],action:"wireless"},f:["Wireless Activity"]}," ",{p:[39,7,1342],t:7,e:"ui-button",a:{icon:"microphone",style:[{t:2,x:{r:["data.radio"],s:'_0?"selected":null'},p:[39,43,1378]}],action:"radio"},f:["Subspace Radio"]}]}],n:50,r:"data.name",p:[25,3,628]}]}]},e.exports=r.extend(i.exports)},{205:205}],244:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{t:4,f:[{p:[2,2,23],t:7,e:"ui-notice",f:[{p:[3,3,38],t:7,e:"span",f:["Waiting for another device to confirm your request..."]}]}],n:50,r:"data.waiting",p:[1,1,0]},{t:4,n:51,f:[{p:[6,2,132],t:7,e:"ui-display",f:[{p:[7,3,148],t:7,e:"ui-section",f:[{t:4,f:[{p:[9,5,197],t:7,e:"ui-button",a:{icon:"check",action:"auth_swipe"},f:["Authorize ",{t:2,r:"data.auth_required",p:[9,59,251]}]}],n:50,r:"data.auth_required",p:[8,4,165]},{t:4,n:51,f:[{p:[11,5,304],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.red_alert"],s:'_0?"disabled":null'},p:[11,38,337]}],action:"red_alert"},f:["Red Alert"]}," ",{p:[12,5,423],t:7,e:"ui-button",a:{icon:"wrench",state:[{t:2,x:{r:["data.emergency_maint"],s:'_0?"disabled":null'},p:[12,37,455]}],action:"emergency_maint"},f:["Emergency Maintenance Access"]}],r:"data.auth_required"}]}]}],r:"data.waiting"}]},e.exports=r.extend(i.exports)},{205:205}],245:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={data:{mechChargeState:function(t){var e=this.get("data.recharge_port.mech.cell.maxcharge");return t>=e/1.5?"good":t>=e/3?"average":"bad"},mechHealthState:function(t){var e=this.get("data.recharge_port.mech.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(i),i.exports.template={v:3,t:[" ",{p:[20,1,545],t:7,e:"ui-display",a:{title:"Mech Status"},f:[{t:4,f:[{t:4,f:[{p:[23,4,646],t:7,e:"ui-section",a:{label:"Integrity"},f:[{p:[24,6,683],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,27,704]}],value:[{t:2,r:"adata.recharge_port.mech.health",p:[24,74,751]}],state:[{t:2,x:{r:["mechHealthState","adata.recharge_port.mech.health"],s:"_0(_1)"},p:[24,117,794]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.health"],s:"Math.round(_0)"},p:[24,171,848]},"/",{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,219,896]}]}]}," ",{t:4,f:[{t:4,f:[{p:[28,5,1061],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[28,31,1087],t:7,e:"span",a:{"class":"bad"},f:["Cell Critical Failure"]}]}],n:50,r:"data.recharge_port.mech.cell.critfail",p:[27,3,1010]},{t:4,n:51,f:[{p:[30,11,1170],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,13,1210],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.cell.maxcharge",p:[31,34,1231]}],value:[{t:2,r:"adata.recharge_port.mech.cell.charge",p:[31,86,1283]}],state:[{t:2,x:{r:["mechChargeState","adata.recharge_port.mech.cell.charge"],s:"_0(_1)"},p:[31,134,1331]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.cell.charge"],s:"Math.round(_0)"},p:[31,193,1390]},"/",{t:2,x:{r:["adata.recharge_port.mech.cell.maxcharge"],s:"Math.round(_0)"},p:[31,246,1443]}]}]}],r:"data.recharge_port.mech.cell.critfail"}],n:50,r:"data.recharge_port.mech.cell",p:[26,4,970]},{t:4,n:51,f:[{p:[35,3,1558],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[35,29,1584],t:7,e:"span",a:{"class":"bad"},f:["Cell Missing"]}]}],r:"data.recharge_port.mech.cell"}],n:50,r:"data.recharge_port.mech",p:[22,2,610]},{t:4,n:51,f:[{p:[38,4,1662],t:7,e:"ui-section",f:["Mech Not Found"]}],r:"data.recharge_port.mech"}],n:50,r:"data.recharge_port",p:[21,3,581]},{t:4,n:51,f:[{p:[41,5,1729],t:7,e:"ui-section",f:["Recharging Port Not Found"]}," ",{p:[42,2,1782],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}],r:"data.recharge_port"}]}]},e.exports=r.extend(i.exports)},{205:205}],246:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{t:4,f:[{p:[3,5,45],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[4,7,88],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[4,24,105]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[4,75,156]}]}]}],n:50,r:"data.siliconUser",p:[2,3,15]},{t:4,n:51,f:[{p:[7,5,247],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[7,31,273]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[10,1,358],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[11,3,389],t:7,e:"ui-section",a:{label:"Power"},f:[{t:4,f:[{p:[13,7,470],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[13,24,487]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[13,68,531]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[13,116,579]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[12,5,421]},{t:4,n:51,f:[{p:[15,7,639],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.on"],s:'_0?"good":"bad"'},p:[15,20,652]}],state:[{t:2,x:{r:["data.cell"],s:'_0?null:"disabled"'},p:[15,57,689]}]},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[15,92,724]}]}],x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"}}]}," ",{p:[18,3,791],t:7,e:"ui-section",a:{label:"Cell"},f:[{p:[19,5,822],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.cell"],s:'_0?null:"bad"'},p:[19,18,835]}]},f:[{t:2,x:{r:["data.cell","data.cellPercent"],s:'_0?_1+"%":"No Cell"'},p:[19,48,865]}]}]}," ",{p:[21,3,943],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[22,5,974],t:7,e:"span",a:{"class":[{t:2,r:"data.modeStatus",p:[22,18,987]}]},f:[{t:2,r:"data.mode",p:[22,39,1008]}]}]}," ",{p:[24,3,1049],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[25,5,1080],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.load"],s:'_0?"good":"average"'},p:[25,18,1093]}]},f:[{t:2,x:{r:["data.load"],s:'_0?_0:"None"'},p:[25,54,1129]
-}]}]}," ",{p:[27,3,1191],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[28,5,1229],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.destination"],s:'_0?"good":"average"'},p:[28,18,1242]}]},f:[{t:2,x:{r:["data.destination"],s:'_0?_0:"None"'},p:[28,60,1284]}]}]}]}," ",{t:4,f:[{p:{button:[{t:4,f:[{p:[35,9,1513],t:7,e:"ui-button",a:{icon:"eject",action:"unload"},f:["Unload"]}],n:50,r:"data.load",p:[34,7,1486]}," ",{t:4,f:[{p:[38,9,1623],t:7,e:"ui-button",a:{icon:"eject",action:"ejectpai"},f:["Eject PAI"]}],n:50,r:"data.haspai",p:[37,7,1594]}," ",{p:[40,7,1709],t:7,e:"ui-button",a:{icon:"pencil",action:"setid"},f:["Set ID"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[42,5,1791],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[43,7,1831],t:7,e:"ui-button",a:{icon:"pencil",action:"destination"},f:["Set Destination"]}," ",{p:[44,7,1912],t:7,e:"ui-button",a:{icon:"stop",action:"stop"},f:["Stop"]}," ",{p:[45,7,1973],t:7,e:"ui-button",a:{icon:"play",action:"go"},f:["Go"]}]}," ",{p:[47,5,2047],t:7,e:"ui-section",a:{label:"Home"},f:[{p:[48,7,2080],t:7,e:"ui-button",a:{icon:"home",action:"home"},f:["Go Home"]}," ",{p:[49,7,2144],t:7,e:"ui-button",a:{icon:"pencil",action:"sethome"},f:["Set Home"]}]}," ",{p:[51,5,2231],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[52,7,2268],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoReturn"],s:'_0?"check-square-o":"square-o"'},p:[52,24,2285]}],style:[{t:2,x:{r:["data.autoReturn"],s:'_0?"selected":null'},p:[52,84,2345]}],action:"autoret"},f:["Auto-Return Home"]}," ",{p:[54,7,2449],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoPickup"],s:'_0?"check-square-o":"square-o"'},p:[54,24,2466]}],style:[{t:2,x:{r:["data.autoPickup"],s:'_0?"selected":null'},p:[54,84,2526]}],action:"autopick"},f:["Auto-Pickup Crate"]}," ",{p:[56,7,2632],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"check-square-o":"square-o"'},p:[56,24,2649]}],style:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"selected":null'},p:[56,88,2713]}],action:"report"},f:["Report Deliveries"]}]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[31,1,1373]}]},e.exports=r.extend(i.exports)},{205:205}],247:[function(t,e,n){var r=t(205),i={exports:{}};!function(e){"use strict";var n=t(268);e.exports={data:{filter:""},oninit:function(){var t=this;this.observe("filter",function(e,r,i){var a=t.findAll(".display:not(:first-child)");(0,n.filterMulti)(a,t.get("filter").toLowerCase())},{init:!1})}}}(i),i.exports.template={v:3,t:[" ",{p:[16,1,387],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[16,20,406]}]},f:[{t:4,f:[{p:[18,5,452],t:7,e:"ui-section",f:["Crafting... ",{p:[19,16,481],t:7,e:"i",a:{"class":"fa-spin fa fa-spinner"}}]}],n:50,r:"data.busy",p:[17,3,429]},{t:4,n:51,f:[{p:[22,5,552],t:7,e:"ui-section",f:[{p:[23,7,572],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardCat"},f:[{t:2,r:"data.prev_cat",p:[24,6,630]}]}," ",{p:[26,4,669],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardCat"},f:[{t:2,r:"data.next_cat",p:[27,6,726]}]}," ",{t:4,f:[{p:[30,6,810],t:7,e:"ui-button",a:{icon:"lock",action:"toggle_recipes"},f:["Showing Craftable Recipes"]}],n:50,r:"data.display_craftable_only",p:[29,4,768]},{t:4,n:51,f:[{p:[34,6,924],t:7,e:"ui-button",a:{icon:"unlock",action:"toggle_recipes"},f:["Showing All Recipes"]}],r:"data.display_craftable_only"}," ",{t:4,f:[{p:[39,6,1061],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[39,23,1078]}],placeholder:"Filter.."}}],n:50,r:"config.fancy",p:[38,7,1034]}]}," ",{t:4,f:[{p:[43,7,1180],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[43,26,1199]}]},f:[{t:4,f:[{p:[45,8,1241],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[46,10,1285]}]}],n:50,r:"req_text",p:[44,6,1216]}," ",{t:4,f:[{p:[50,5,1364],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[51,10,1405]}]}],n:50,r:"catalyst_text",p:[49,6,1337]}," ",{t:4,f:[{p:[55,5,1485],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[56,10,1522]}]}],n:50,r:"tool_text",p:[54,3,1462]}," ",{p:[59,6,1575],t:7,e:"ui-section",f:[{p:[60,8,1596],t:7,e:"ui-button",a:{icon:"gears",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[60,66,1654]},'"}']},f:["Craft"]}]}]}],n:52,r:"data.can_craft",p:[42,5,1148]}," ",{t:4,f:[{t:4,f:[{p:[68,9,1827],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[68,28,1846]}]},f:[{t:4,f:[{p:[70,10,1892],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[71,12,1938]}]}],n:50,r:"req_text",p:[69,8,1865]}," ",{t:4,f:[{p:[75,7,2025],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[76,12,2068]}]}],n:50,r:"catalyst_text",p:[74,5,1996]}," ",{t:4,f:[{p:[80,7,2156],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[81,12,2195]}]}],n:50,r:"tool_text",p:[79,5,2131]}]}],n:52,r:"data.cant_craft",p:[67,7,1792]}],n:51,r:"data.display_craftable_only",p:[66,2,1752]}],r:"data.busy"}]}]},e.exports=r.extend(i.exports)},{205:205,268:268}],248:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Pump"},f:[{p:[13,3,459],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,491],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,508]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,559]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,616]}]}]}," ",{p:[18,3,675],t:7,e:"ui-section",a:{label:"Direction"},f:[{p:[19,5,711],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"sign-out":"sign-in"'},p:[19,22,728]}],action:"direction"},f:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"Out":"In"'},p:[20,26,808]}]}]}," ",{p:[22,3,883],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,5,925],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.min_pressure",p:[23,18,938]}],max:[{t:2,r:"data.max_pressure",p:[23,46,966]}],value:[{t:2,r:"data.target_pressure",p:[24,14,1003]}]},f:[{t:2,x:{r:["adata.target_pressure"],s:"Math.round(_0)"},p:[24,40,1029]}," kPa"]}]}," ",{p:[26,3,1100],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,1145],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.target_pressure","data.default_pressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,1178]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1328],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.target_pressure","data.min_pressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1359]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1500],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1595],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.target_pressure","data.max_pressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1625]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}," ",{p:{button:[{t:4,f:[{p:[39,7,1891],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[39,38,1922]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[38,5,1863]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[43,3,2042],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[44,4,2073]}]}," ",{p:[46,3,2115],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[47,4,2149]}," kPa"]}],n:50,r:"data.holding",p:[42,3,2018]},{t:4,n:51,f:[{p:[50,3,2223],t:7,e:"ui-section",f:[{p:[51,4,2240],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=r.extend(i.exports)},{205:205}],249:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Filter"},f:[{p:[13,3,461],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,493],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,510]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,561]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,618]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[22,7,787],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[22,38,818]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[21,5,759]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[26,3,938],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[27,4,969]}]}," ",{p:[29,3,1011],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[30,4,1045]}," kPa"]}],n:50,r:"data.holding",p:[25,3,914]},{t:4,n:51,f:[{p:[33,3,1119],t:7,e:"ui-section",f:[{p:[34,4,1136],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=r.extend(i.exports)},{205:205}],250:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(i),i.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[44,5,1093],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[44,27,1115]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[46,38,1267]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[47,15,1323]}],yinc:"9"}}],n:50,r:"config.fancy",p:[43,3,1067]},{t:4,n:51,f:[{p:[49,5,1373],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[50,7,1411],t:7,e:"span",f:[{t:2,r:"data.supply",p:[50,13,1417]}," W"]}]}," ",{p:[52,5,1466],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[53,9,1501],t:7,e:"span",f:[{t:2,r:"data.demand",p:[53,15,1507]}," W"]}]}],r:"config.fancy"}]}," ",{p:[57,1,1578],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[58,3,1608],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[59,5,1633],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[60,5,1670],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[61,5,1709],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[62,5,1746],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[63,5,1785],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[64,5,1827],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[65,5,1868],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[68,5,1953],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[68,24,1972]}],nowrap:0},f:[{p:[69,7,1997],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[69,28,2018]}," %"]}," ",{p:[70,7,2076],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].load)"},p:[70,28,2097]}," W"]}," ",{p:[71,7,2153],t:7,e:"div",a:{"class":"content"},f:[{p:[71,28,2174],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[71,41,2187]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[71,70,2216]}]}]}," ",{p:[72,7,2263],t:7,e:"div",a:{"class":"content"},f:[{p:[72,28,2284],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[72,41,2297]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[72,64,2320]}," [",{p:[72,87,2343],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[72,93,2349]}]},"]"]}]}," ",{p:[73,7,2398],t:7,e:"div",a:{"class":"content"},f:[{p:[73,28,2419],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[73,41,2432]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[73,64,2455]}," [",{p:[73,87,2478],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[73,93,2484]}]},"]"]}]}," ",{p:[74,7,2533],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2554],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[74,41,2567]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[74,64,2590]}," [",{p:[74,87,2613],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[74,93,2619]}]},"]"]}]}]}],n:52,r:"data.areas",p:[67,3,1927]}]}]},e.exports=r.extend(i.exports)},{205:205}],251:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={computed:{readableFrequency:function(){return Math.round(this.get("adata.frequency"))/10}}}}(i),i.exports.template={v:3,t:[" ",{p:[11,1,177],t:7,e:"ui-display",a:{title:"Settings"},f:[{t:4,f:[{p:[13,5,236],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,7,270],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[14,24,287]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[14,75,338]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"On":"Off"'},p:[16,9,413]}]}]}],n:50,r:"data.headset",p:[12,3,210]},{t:4,n:51,f:[{p:[19,5,494],t:7,e:"ui-section",a:{label:"Microphone"},f:[{p:[20,7,533],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.broadcasting"],s:'_0?"power-off":"close"'},p:[20,24,550]}],style:[{t:2,x:{r:["data.broadcasting"],s:'_0?"selected":null'},p:[20,78,604]}],action:"broadcast"},f:[{t:2,x:{r:["data.broadcasting"],s:'_0?"Engaged":"Disengaged"'},p:[22,9,685]}]}]}," ",{p:[24,5,769],t:7,e:"ui-section",a:{label:"Speaker"},f:[{p:[25,7,805],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[25,24,822]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[25,75,873]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"Engaged":"Disengaged"'},p:[27,9,948]}]}]}],r:"data.headset"}," ",{t:4,f:[{p:[31,5,1064],t:7,e:"ui-section",a:{label:"High Volume"},f:[{p:[32,7,1104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.useCommand"],s:'_0?"power-off":"close"'},p:[32,24,1121]}],style:[{t:2,x:{r:["data.useCommand"],s:'_0?"selected":null'},p:[32,76,1173]}],action:"command"},f:[{t:2,x:{r:["data.useCommand"],s:'_0?"On":"Off"'},p:[34,9,1250]}]}]}],n:50,r:"data.command",p:[30,3,1038]}]}," ",{p:[38,1,1342],t:7,e:"ui-display",a:{title:"Channel"},f:[{p:[39,3,1374],t:7,e:"ui-section",a:{label:"Frequency"},f:[{t:4,f:[{p:[41,7,1439],t:7,e:"span",f:[{t:2,r:"readableFrequency",p:[41,13,1445]}]}],n:50,r:"data.freqlock",p:[40,5,1410]},{t:4,n:51,f:[{p:[43,7,1495],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[43,46,1534]}],action:"frequency",params:'{"adjust": -1}'}}," ",{p:[44,7,1646],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[44,41,1680]}],action:"frequency",params:'{"adjust": -.2}'}}," ",{p:[45,7,1793],t:7,e:"ui-button",a:{icon:"pencil",action:"frequency",params:'{"tune": "input"}'},f:[{t:2,r:"readableFrequency",p:[45,78,1864]}]}," ",{p:[46,7,1905],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[46,40,1938]}],action:"frequency",params:'{"adjust": .2}'}}," ",{p:[47,7,2050],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[47,45,2088]}],action:"frequency",params:'{"adjust": 1}'}}],r:"data.freqlock"}]}," ",{t:4,f:[{p:[51,5,2262],t:7,e:"ui-section",a:{label:"Subspace Transmission"},f:[{p:[52,7,2312],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.subspace"],s:'_0?"power-off":"close"'},p:[52,24,2329]}],style:[{t:2,x:{r:["data.subspace"],s:'_0?"selected":null'},p:[52,74,2379]}],action:"subspace"},f:[{t:2,x:{r:["data.subspace"],s:'_0?"Active":"Inactive"'},p:[53,29,2447]}]}]}],n:50,r:"data.subspaceSwitchable",p:[50,3,2225]}," ",{t:4,f:[{p:[57,5,2578],t:7,e:"ui-section",a:{label:"Channels"},f:[{t:4,f:[{p:[59,9,2656],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["."],s:'_0?"check-square-o":"square-o"'},p:[59,26,2673]}],style:[{t:2,x:{r:["."],s:'_0?"selected":null'},p:[60,18,2730]}],action:"channel",params:['{"channel": "',{t:2,r:"channel",p:[61,49,2806]},'"}']},f:[{t:2,r:"channel",p:[62,11,2833]}]},{p:[62,34,2856],t:7,e:"br"}],n:52,i:"channel",r:"data.channels",p:[58,7,2615]}]}],n:50,x:{r:["data.subspace","data.channels"],s:"_0&&_1"},p:[56,3,2534]}]}]},e.exports=r.extend(i.exports)},{205:205}],252:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(i),i.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}," ",{p:[23,5,658],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[24,7,693],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[24,20,706]}],max:[{t:2,r:"data.occupant.maxHealth",p:[24,54,740]}],value:[{t:2,r:"data.occupant.health",p:[24,90,776]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[25,16,818]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[25,68,870]}]}]}," ",{t:4,f:[{p:[28,7,1107],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[28,26,1126]}]},f:[{p:[29,9,1147],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[29,30,1168]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[29,66,1204]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[29,103,1241]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[27,5,941]}," ",{p:[32,5,1328],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[33,9,1364],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[33,22,1377]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[33,68,1423]}]}]}," ",{p:[35,5,1506],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[36,9,1542],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[36,22,1555]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[36,68,1601]}]}]}," ",{p:[38,5,1685],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[40,11,1772],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[40,54,1815]}," units of ",{t:2,r:"name",p:[40,89,1850]}]},{p:[40,104,1865],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[39,9,1727]},{t:4,n:51,f:[{p:[42,11,1900],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[47,1,1996],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[48,2,2028],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[49,5,2059],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[49,22,2076]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[49,71,2125]}]}]}," ",{p:[51,3,2190],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[53,7,2251],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied","allowed"],s:'_0&&_1?null:"disabled"'},p:[53,38,2282]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[53,122,2366]},'"}']},f:[{t:2,r:"name",p:[53,132,2376]}]},{p:[53,152,2396],t:7,e:"br"}],n:52,r:"data.chems",p:[52,5,2223]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],253:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(i),i.exports.template={v:3,t:[" ",{p:[24,1,663],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,695],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,735],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,768]}],state:[{t:2,r:"capacityPercentState",p:[26,71,801]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,827]},"%"]}]}]}," ",{p:[29,1,908],t:7,e:"ui-display",a:{title:"Input"},f:[{p:[30,3,938],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{p:[31,5,976],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"refresh":"close"'},p:[31,22,993]}],style:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"selected":null'},p:[31,74,1045]}],action:"tryinput"},f:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"Auto":"Off"'},p:[32,25,1113]}]},"  [",{p:[34,6,1182],t:7,e:"span",a:{"class":[{t:2,r:"inputState",p:[34,19,1195]}]},f:[{t:2,x:{r:["data.capacityPercent","data.inputting"],s:'_0>=100?"Fully Charged":_1?"Charging":"Not Charging"'},p:[34,35,1211]}]},"]"]}," ",{p:[36,3,1335],t:7,e:"ui-section",a:{label:"Target Input"},f:[{p:[37,5,1374],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.inputLevelMax",p:[37,26,1395]}],value:[{t:2,r:"data.inputLevel",p:[37,57,1426]}]},f:[{t:2,x:{r:["adata.inputLevel"],s:"Math.round(_0)"},p:[37,78,1447]},"W"]}]}," ",{p:[39,3,1509],t:7,e:"ui-section",a:{label:"Adjust Input"},f:[{p:[40,5,1548],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[40,44,1587]}],action:"input",params:'{"target": "min"}'}}," ",{p:[41,5,1682],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[41,39,1716]}],action:"input",params:'{"adjust": -10000}'}}," ",{p:[42,5,1812],t:7,e:"ui-button",a:{icon:"pencil",action:"input",params:'{"target": "input"}'},f:["Set"]}," ",{p:[43,5,1902],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[43,38,1935]}],action:"input",params:'{"adjust": 10000}'}}," ",{p:[44,5,2047],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[44,43,2085]}],action:"input",params:'{"target": "max"}'}}]}," ",{p:[46,3,2212],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[47,3,2246],t:7,e:"span",f:[{t:2,x:{r:["adata.inputAvailable"],s:"Math.round(_0)"},p:[47,9,2252]},"W"]}]}]}," ",{p:[50,1,2329],t:7,e:"ui-display",a:{title:"Output"},f:[{p:[51,3,2360],t:7,e:"ui-section",a:{label:"Output Mode"},f:[{p:[52,5,2398],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"power-off":"close"'},p:[52,22,2415]}],style:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"selected":null'},p:[52,77,2470]}],action:"tryoutput"},f:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"On":"Off"'},p:[53,26,2540]}]},"  [",{p:[55,6,2608],t:7,e:"span",a:{"class":[{t:2,r:"outputState",p:[55,19,2621]}]},f:[{t:2,x:{r:["data.outputting","data.charge"],s:'_0?"Sending":_1>0?"Not Sending":"No Charge"'},p:[55,36,2638]}]},"]"]}," ",{p:[57,3,2745],t:7,e:"ui-section",a:{label:"Target Output"},f:[{p:[58,5,2785],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.outputLevelMax",p:[58,26,2806]}],value:[{t:2,r:"data.outputLevel",p:[58,58,2838]}]},f:[{t:2,x:{r:["adata.outputLevel"],s:"Math.round(_0)"},p:[58,80,2860]},"W"]}]}," ",{p:[60,3,2923],t:7,e:"ui-section",a:{label:"Adjust Output"},f:[{p:[61,5,2963],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[61,44,3002]}],action:"output",params:'{"target": "min"}'}}," ",{p:[62,5,3099],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[62,39,3133]}],action:"output",params:'{"adjust": -10000}'}}," ",{p:[63,5,3231],t:7,e:"ui-button",a:{icon:"pencil",action:"output",params:'{"target": "input"}'},f:["Set"]}," ",{p:[64,5,3322],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[64,38,3355]}],action:"output",params:'{"adjust": 10000}'}}," ",{p:[65,5,3470],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[65,43,3508]}],action:"output",params:'{"target": "max"}'}}]}," ",{p:[67,3,3638],t:7,e:"ui-section",a:{label:"Outputting"},f:[{p:[68,3,3673],t:7,e:"span",f:[{t:2,x:{r:["adata.outputUsed"],s:"Math.round(_0)"},p:[68,9,3679]},"W"]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],254:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{t:2,x:{r:["adata.generated"],s:"Math.round(_0)"},p:[3,5,73]},"W"]}," ",{p:[5,3,126],t:7,e:"ui-section",a:{label:"Orientation"},f:[{p:[6,5,164],t:7,e:"span",f:[{t:2,x:{r:["adata.angle"],s:"Math.round(_0)"},p:[6,11,170]},"° (",{t:2,r:"data.direction",p:[6,45,204]},")"]}]}," ",{p:[8,3,251],t:7,e:"ui-section",a:{label:"Adjust Angle"},f:[{p:[9,5,290],t:7,e:"ui-button",a:{icon:"step-backward",action:"angle",params:'{"adjust": -15}'},f:["15°"]}," ",{p:[10,5,387],t:7,e:"ui-button",a:{icon:"backward",action:"angle",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[11,5,477],t:7,e:"ui-button",a:{icon:"forward",action:"angle",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[12,5,565],t:7,e:"ui-button",a:{icon:"step-forward",action:"angle",params:'{"adjust": 15}'},f:["15°"]}]}]}," ",{p:[15,1,687],t:7,e:"ui-display",a:{title:"Tracking"},f:[{p:[16,3,720],t:7,e:"ui-section",a:{label:"Tracker Mode"},f:[{p:[17,5,759],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==0?"selected":null'},p:[17,36,790]}],action:"tracking",params:'{"mode": 0}'},f:["Off"]}," ",{p:[19,5,907],t:7,e:"ui-button",a:{icon:"clock-o",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==1?"selected":null'},p:[19,38,940]}],action:"tracking",params:'{"mode": 1}'},f:["Timed"]}," ",{p:[21,5,1059],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.connected_tracker","data.tracking_state"],s:'_0?_1==2?"selected":null:"disabled"'},p:[21,38,1092]}],action:"tracking",params:'{"mode": 2}'},f:["Auto"]}]}," ",{p:[24,3,1262],t:7,e:"ui-section",a:{label:"Tracking Rate"},f:[{p:[25,3,1300],t:7,e:"span",f:[{t:2,x:{r:["adata.tracking_rate"],s:"Math.round(_0)"},p:[25,9,1306]},"°/h (",{t:2,r:"data.rotating_way",p:[25,53,1350]},")"]}]}," ",{p:[27,3,1399],t:7,e:"ui-section",a:{label:"Adjust Rate"},f:[{p:[28,5,1437],t:7,e:"ui-button",a:{icon:"fast-backward",action:"rate",params:'{"adjust": -180}'},f:["180°"]}," ",{p:[29,5,1535],t:7,e:"ui-button",a:{icon:"step-backward",action:"rate",params:'{"adjust": -30}'},f:["30°"]}," ",{p:[30,5,1631],t:7,e:"ui-button",a:{icon:"backward",action:"rate",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[31,5,1720],t:7,e:"ui-button",a:{icon:"forward",action:"rate",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[32,5,1807],t:7,e:"ui-button",a:{icon:"step-forward",action:"rate",params:'{"adjust": 30}'},f:["30°"]}," ",{p:[33,5,1901],t:7,e:"ui-button",a:{icon:"fast-forward",action:"rate",params:'{"adjust": 180}'},f:["180°"]}]}]}," ",{p:{button:[{p:[38,5,2088],t:7,e:"ui-button",a:{icon:"refresh",action:"refresh"},f:["Refresh"]}]},t:7,e:"ui-display",a:{title:"Devices",button:0},f:[" ",{p:[40,2,2169],t:7,e:"ui-section",a:{label:"Solar Tracker"},f:[{p:[41,5,2209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_tracker"],s:'_0?"good":"bad"'},p:[41,18,2222]}]},f:[{t:2,x:{r:["data.connected_tracker"],s:'_0?"":"Not "'},p:[41,63,2267]},"Found"]}]}," ",{p:[43,2,2338],t:7,e:"ui-section",a:{label:"Solar Panels"},f:[{p:[44,3,2375],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_panels"],s:'_0?"good":"bad"'},p:[44,16,2388]}]},f:[{t:2,x:{r:["adata.connected_panels"],s:"Math.round(_0)"},p:[44,60,2432]}," Panels Connected"]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],255:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,7,87],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[4,38,118]}],action:"eject"},f:["Eject"]}],n:50,r:"data.open",p:[3,5,62]}]},t:7,e:"ui-display",a:{title:"Power",button:0},f:[" ",{p:[7,3,226],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[8,5,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[8,22,275]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[9,14,326]}],state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[9,54,366]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[10,22,431]}]}]}," ",{p:[12,3,490],t:7,e:"ui-section",a:{label:"Cell"},f:[{t:4,f:[{p:[14,7,554],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerLevel",p:[14,40,587]}]},f:[{t:2,x:{r:["adata.powerLevel"],s:"Math.fixed(_0)"},p:[14,61,608]},"%"]}],n:50,r:"data.hasPowercell",p:[13,5,521]},{t:4,n:51,f:[{p:[16,4,667],t:7,e:"span",a:{"class":"bad"},f:["No Cell"]}],r:"data.hasPowercell"}]}]}," ",{p:[20,1,744],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[21,3,779],t:7,e:"ui-section",a:{label:"Current Temperature"},f:[{p:[22,3,823],t:7,e:"span",f:[{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[22,9,829]},"°C"]}]}," ",{p:[24,2,894],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[25,3,937],t:7,e:"span",f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[25,9,943]},"°C"]}]}," ",{t:4,f:[{p:[28,5,1031],t:7,e:"ui-section",a:{label:"Adjust Target"},f:[{p:[29,7,1073],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[29,46,1112]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[30,7,1218],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[30,41,1252]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[31,7,1357],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:["Set"]}," ",{p:[32,7,1450],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[32,40,1483]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[33,7,1587],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[33,45,1625]}],action:"target",params:'{"adjust": 20}'}}]}],n:50,r:"data.open",p:[27,3,1008]}," ",{p:[36,3,1754],t:7,
-e:"ui-section",a:{label:"Mode"},f:[{t:4,f:[{p:[38,7,1808],t:7,e:"ui-button",a:{icon:"long-arrow-up",state:[{t:2,x:{r:["data.mode"],s:'_0=="heat"?"selected":null'},p:[38,46,1847]}],action:"mode",params:'{"mode": "heat"}'},f:["Heat"]}," ",{p:[39,7,1956],t:7,e:"ui-button",a:{icon:"long-arrow-down",state:[{t:2,x:{r:["data.mode"],s:'_0=="cool"?"selected":null'},p:[39,48,1997]}],action:"mode",params:'{"mode": "cool"}'},f:["Cool"]}," ",{p:[40,7,2106],t:7,e:"ui-button",a:{icon:"arrows-v",state:[{t:2,x:{r:["data.mode"],s:'_0=="auto"?"selected":null'},p:[40,41,2140]}],action:"mode",params:'{"mode": "auto"}'},f:["Auto"]}],n:50,r:"data.open",p:[37,3,1783]},{t:4,n:51,f:[{p:[42,4,2258],t:7,e:"span",f:[{t:2,x:{r:["text","data.mode"],s:"_0.titleCase(_1)"},p:[42,10,2264]}]}],r:"data.open"}]}]}]},e.exports=r.extend(i.exports)},{205:205}],256:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{t:4,f:[{p:[2,3,31],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[2,22,50]}," Alarms"]},f:[{p:[3,5,74],t:7,e:"ul",f:[{t:4,f:[{p:[5,9,107],t:7,e:"li",f:[{t:2,r:".",p:[5,13,111]}]}],n:52,r:".",p:[4,7,86]},{t:4,n:51,f:[{p:[7,9,147],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[1,1,0]}]},e.exports=r.extend(i.exports)},{205:205}],257:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{t:4,f:[{p:[2,3,42],t:7,e:"ui-notice",f:[{p:[3,5,59],t:7,e:"span",f:["Biological entity detected in contents. Please remove."]}]}],n:50,x:{r:["data.occupied","data.safeties"],s:"_0&&_1"},p:[1,1,0]},{t:4,f:[{p:[7,3,179],t:7,e:"ui-notice",f:[{p:[8,5,196],t:7,e:"span",f:["Contents are being disinfected. Please wait."]}]}],n:50,r:"data.uv_active",p:[6,1,153]},{t:4,n:51,f:[{p:{button:[{t:4,f:[{p:[13,25,369],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,42,386]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[13,93,437]}]}],n:50,x:{r:["data.open"],s:"!_0"},p:[13,7,351]}," ",{t:4,f:[{p:[14,27,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"sign-out":"sign-in"'},p:[14,44,536]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Close":"Open"'},p:[14,98,590]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[14,7,499]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[17,7,692],t:7,e:"ui-notice",f:[{p:[18,9,713],t:7,e:"span",f:["Unit Locked"]}]}],n:50,r:"data.locked",p:[16,5,665]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.open"],s:"_0"},f:[{p:[21,9,793],t:7,e:"ui-section",a:{label:"Helmet"},f:[{p:[22,11,832],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.helmet"],s:'_0?"square":"square-o"'},p:[22,28,849]}],state:[{t:2,x:{r:["data.helmet"],s:'_0?null:"disabled"'},p:[22,75,896]}],action:"dispense",params:'{"item": "helmet"}'},f:[{t:2,x:{r:["data.helmet"],s:'_0||"Empty"'},p:[23,59,992]}]}]}," ",{p:[25,9,1063],t:7,e:"ui-section",a:{label:"Suit"},f:[{p:[26,11,1100],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.suit"],s:'_0?"square":"square-o"'},p:[26,28,1117]}],state:[{t:2,x:{r:["data.suit"],s:'_0?null:"disabled"'},p:[26,74,1163]}],action:"dispense",params:'{"item": "suit"}'},f:[{t:2,x:{r:["data.suit"],s:'_0||"Empty"'},p:[27,57,1255]}]}]}," ",{p:[29,9,1324],t:7,e:"ui-section",a:{label:"Mask"},f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mask"],s:'_0?"square":"square-o"'},p:[30,28,1378]}],state:[{t:2,x:{r:["data.mask"],s:'_0?null:"disabled"'},p:[30,74,1424]}],action:"dispense",params:'{"item": "mask"}'},f:[{t:2,x:{r:["data.mask"],s:'_0||"Empty"'},p:[31,57,1516]}]}]}," ",{p:[33,9,1585],t:7,e:"ui-section",a:{label:"Storage"},f:[{p:[34,11,1625],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.storage"],s:'_0?"square":"square-o"'},p:[34,28,1642]}],state:[{t:2,x:{r:["data.storage"],s:'_0?null:"disabled"'},p:[34,77,1691]}],action:"dispense",params:'{"item": "storage"}'},f:[{t:2,x:{r:["data.storage"],s:'_0||"Empty"'},p:[35,60,1789]}]}]}]},{t:4,n:50,x:{r:["data.open"],s:"!(_0)"},f:[" ",{p:[38,7,1873],t:7,e:"ui-button",a:{icon:"recycle",state:[{t:2,x:{r:["data.occupied","data.safeties"],s:'_0&&_1?"disabled":null'},p:[38,40,1906]}],action:"uv"},f:["Disinfect"]}]}],r:"data.locked"}]}],r:"data.uv_active"}]},e.exports=r.extend(i.exports)},{205:205}],258:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,5,18],t:7,e:"ui-section",a:{label:"Dispense"},f:[{p:[3,9,57],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.plasma"],s:'_0?"square":"square-o"'},p:[3,26,74]}],state:[{t:2,x:{r:["data.plasma"],s:'_0?null:"disabled"'},p:[3,74,122]}],action:"plasma"},f:["Plasma (",{t:2,x:{r:["adata.plasma"],s:"Math.round(_0)"},p:[4,37,196]},")"]}," ",{p:[5,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oxygen"],s:'_0?"square":"square-o"'},p:[5,26,264]}],state:[{t:2,x:{r:["data.oxygen"],s:'_0?null:"disabled"'},p:[5,74,312]}],action:"oxygen"},f:["Oxygen (",{t:2,x:{r:["adata.oxygen"],s:"Math.round(_0)"},p:[6,37,386]},")"]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],259:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={computed:{tankPressureState:function(){var t=this.get("data.tankPressure");return t>=200?"good":t>=100?"average":"bad"}}}}(i),i.exports.template={v:3,t:[" ",{p:[14,1,295],t:7,e:"ui-notice",f:[{p:[15,3,310],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.connected"],s:'_0?"is":"is not"'},p:[15,23,330]}," connected to a mask."]}]}," ",{p:[17,1,409],t:7,e:"ui-display",f:[{p:[18,3,425],t:7,e:"ui-section",a:{label:"Tank Pressure"},f:[{p:[19,7,467],t:7,e:"ui-bar",a:{min:"0",max:"1013",value:[{t:2,r:"data.tankPressure",p:[19,41,501]}],state:[{t:2,r:"tankPressureState",p:[20,16,540]}]},f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[20,39,563]}," kPa"]}]}," ",{p:[22,3,631],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[23,5,674],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[23,18,687]}],max:[{t:2,r:"data.maxReleasePressure",p:[23,52,721]}],value:[{t:2,r:"data.releasePressure",p:[24,14,764]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[24,40,790]}," kPa"]}]}," ",{p:[26,3,861],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,906],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,939]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1095],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1126]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1273],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1368],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1398]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],260:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,5,33],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[3,9,75],t:7,e:"span",f:[{t:2,x:{r:["adata.temperature"],s:"Math.fixed(_0,2)"},p:[3,15,81]}," K"]}]}," ",{p:[5,5,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,9,190],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.fixed(_0,2)"},p:[6,15,196]}," kPa"]}]}]}," ",{p:[9,1,276],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[10,5,311],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,347],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[11,26,364]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[11,70,408]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[12,28,469]}]}]}," ",{p:[14,5,531],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[15,9,580],t:7,e:"ui-button",a:{icon:"fast-backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[15,48,619]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[17,9,733],t:7,e:"ui-button",a:{icon:"backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[17,43,767]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[19,9,880],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.target"],s:"Math.fixed(_0,2)"},p:[19,79,950]}]}," ",{p:[20,9,1003],t:7,e:"ui-button",a:{icon:"forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[20,42,1036]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[22,9,1148],t:7,e:"ui-button",a:{icon:"fast-forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[22,47,1186]}],action:"target",params:'{"adjust": 20}'}}]}]}]},e.exports=r.extend(i.exports)},{205:205}],261:[function(t,e,n){var r=t(205),i={exports:{}};!function(e){"use strict";var n=t(268);e.exports={data:{filter:""},oninit:function(){var t=this;this.on({hover:function(t){var e=this.get("data.telecrystals");e>=t.context.params.cost&&this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,r,i){var a=t.findAll(".display:not(:first-child)");(0,n.filterMulti)(a,t.get("filter").toLowerCase())},{init:!1})}}}(i),i.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[29,7,770],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[29,24,787]}],placeholder:"Filter..."}}],n:50,r:"config.fancy",p:[28,5,742]}," ",{t:4,f:[{p:[32,7,872],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock"]}],n:50,r:"data.lockable",p:[31,5,843]}]},t:7,e:"ui-display",a:{title:"Uplink",button:0},f:[" ",{p:[35,3,958],t:7,e:"ui-section",a:{label:"Telecrystals",right:0},f:[{p:[36,5,1003],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.telecrystals"],s:'_0>0?"good":"bad"'},p:[36,18,1016]}]},f:[{t:2,r:"data.telecrystals",p:[36,62,1060]}," TC"]}]}]}," ",{t:4,f:[{p:[40,3,1154],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[40,22,1173]}]},f:[{t:4,f:[{p:[42,7,1212],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[42,26,1231]}],candystripe:0,right:0},f:[{p:[43,9,1269],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"name",p:[43,29,1289]},": ",{t:2,r:"desc",p:[43,39,1299]}],"tooltip-side":"left",state:[{t:2,x:{r:["data.telecrystals","hovered.cost","cost","hovered.item","name"],s:'_0<_2||(_0-_1<_2&&_3!=_4)?"disabled":null'},p:[44,18,1347]}],action:"buy",params:['{"category": "',{t:2,r:"category",p:[45,46,1512]},'", "item": ',{t:2,r:"name",p:[45,69,1535]},', "cost": ',{t:2,r:"cost",p:[45,87,1553]},"}"]},v:{hover:"hover",unhover:"unhover"},f:[{t:2,r:"cost",p:[46,49,1613]}," TC"]}]}],n:52,r:"items",p:[41,5,1189]}]}],n:52,r:"data.categories",p:[39,1,1125]}]},e.exports=r.extend(i.exports)},{205:205,268:268}],262:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{t:4,f:[{p:[3,5,42],t:7,e:"ui-section",a:{label:[{t:2,r:"color",p:[3,24,61]},{t:2,x:{r:["wire"],s:'_0?" ("+_0+")":""'},p:[3,33,70]}],labelcolor:[{t:2,r:"color",p:[3,80,117]}],candystripe:0,right:0},f:[{p:[4,7,154],t:7,e:"ui-button",a:{action:"cut",params:['{"wire":"',{t:2,r:"color",p:[4,48,195]},'"}']},f:[{t:2,x:{r:["cut"],s:'_0?"Mend":"Cut"'},p:[4,61,208]}]}," ",{p:[5,7,252],t:7,e:"ui-button",a:{action:"pulse",params:['{"wire":"',{t:2,r:"color",p:[5,50,295]},'"}']},f:["Pulse"]}," ",{p:[6,7,333],t:7,e:"ui-button",a:{action:"attach",params:['{"wire":"',{t:2,r:"color",p:[6,51,377]},'"}']},f:[{t:2,x:{r:["attached"],s:'_0?"Detach":"Attach"'},p:[6,64,390]}]}]}],n:52,r:"data.wires",p:[2,3,16]}]}," ",{t:4,f:[{p:[11,3,508],t:7,e:"ui-display",f:[{t:4,f:[{p:[13,7,555],t:7,e:"ui-section",f:[{t:2,r:".",p:[13,19,567]}]}],n:52,r:"data.status",p:[12,5,526]}]}],n:50,r:"data.status",p:[10,1,485]}]},e.exports=r.extend(i.exports)},{205:205}],263:[function(t,e,n){(function(e){"use strict";var n=t(205),r=e.interopRequireDefault(n);t(194),t(1),t(190),t(193);var i=t(264),a=e.interopRequireDefault(i),o=t(265),s=t(191),u=t(192),c=e.interopRequireDefault(u);r["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(269)),window.initialize=function(e){window.tgui||(window.tgui=new a["default"]({el:"#container",data:function(){var n=JSON.parse(e);return{constants:t(266),text:t(270),config:n.config,data:n.data,adata:n.data}}}))};var l=document.getElementById("data"),p=l.textContent,f=l.getAttribute("data-ref");"{}"!==p&&(window.initialize(p),l.remove()),(0,o.act)(f,"tgui:initialize"),(0,s.loadCSS)("https://cdn.jsdelivr.net/fontawesome/4.5.0/css/font-awesome.min.css");var d=new c["default"]("FontAwesome");d.check("").then(function(){return document.body.classList.add("icons")})["catch"](function(){return document.body.classList.add("no-icons")})}).call(this,t("babel/external-helpers"))},{1:1,190:190,191:191,192:192,193:193,194:194,205:205,264:264,265:265,266:266,269:269,270:270,"babel/external-helpers":"babel/external-helpers"}],264:[function(t,e,n){var r=t(205),i={exports:{}};!function(e){"use strict";var n=t(265),r=t(267);e.exports={components:{"ui-bar":t(206),"ui-button":t(207),"ui-display":t(208),"ui-input":t(209),"ui-linegraph":t(210),"ui-notice":t(211),"ui-section":t(213),"ui-subdisplay":t(214),"ui-tabs":t(215)},events:{enter:t(203).enter,space:t(203).space},transitions:{fade:t(204)},onconfig:function(){var e=this.get("config.interface"),n={airalarm:t(219),"airalarm/back":t(220),"airalarm/modes":t(221),"airalarm/scrubbers":t(222),"airalarm/status":t(223),"airalarm/thresholds":t(224),"airalarm/vents":t(225),airlock_electronics:t(226),apc:t(227),atmos_alert:t(228),atmos_control:t(229),atmos_filter:t(230),atmos_mixer:t(231),atmos_pump:t(232),brig_timer:t(233),canister:t(234),cargo:t(235),chem_dispenser:t(236),chem_heater:t(237),chem_master:t(238),crayon:t(239),cryo:t(240),error:t(241),firealarm:t(242),intellicard:t(243),keycard_auth:t(244),mech_bay_power_console:t(245),mulebot:t(246),personal_crafting:t(247),portable_pump:t(248),portable_scrubber:t(249),power_monitor:t(250),radio:t(251),sleeper:t(252),smes:t(253),solar_control:t(254),space_heater:t(255),station_alert:t(256),suit_storage_unit:t(257),tank_dispenser:t(258),tanks:t(259),thermomachine:t(260),uplink:t(261),wires:t(262)};e in n?this.components["interface"]=n[e]:this.components["interface"]=n.error},oninit:function(){this.observe("config.style",function(t,e,n){t&&document.body.classList.add(t),e&&document.body.classList.remove(e)})},oncomplete:function(){if(this.get("config.locked")){var t=(0,r.lock)(window.screenLeft,window.screenTop),e=t.x,i=t.y;(0,n.winset)(this.get("config.window"),"pos",e+","+i)}(0,n.winset)("mapwindow.map","focus",!0)}}}(i),i.exports.template={v:3,t:[" "," "," "," ",{p:[56,1,1874],t:7,e:"titlebar",f:[{t:3,r:"config.title",p:[56,11,1884]}]}," ",{p:[57,1,1915],t:7,e:"main",f:[{p:[58,3,1925],t:7,e:"warnings"}," ",{p:[59,3,1940],t:7,e:"interface"}]}," ",{p:[61,1,1963],t:7,e:"resize"}]},i.exports.components=i.exports.components||{};var a={warnings:t(218),titlebar:t(217),resize:t(212)};for(var o in a)a.hasOwnProperty(o)&&(i.exports.components[o]=a[o]);e.exports=r.extend(i.exports)},{203:203,204:204,205:205,206:206,207:207,208:208,209:209,210:210,211:211,212:212,213:213,214:214,215:215,217:217,218:218,219:219,220:220,221:221,222:222,223:223,224:224,225:225,226:226,227:227,228:228,229:229,230:230,231:231,232:232,233:233,234:234,235:235,236:236,237:237,238:238,239:239,240:240,241:241,242:242,243:243,244:244,245:245,246:246,247:247,248:248,249:249,250:250,251:251,252:252,253:253,254:254,255:255,256:256,257:257,258:258,259:259,260:260,261:261,262:262,265:265,267:267}],265:[function(t,e,n){"use strict";function r(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=arguments.length<=1||void 0===arguments[1]?"":arguments[1];return"byond://"+e+"?"+Object.keys(t).map(function(e){return o(e)+"="+o(t[e])}).join("&")}function i(t,e){var n=arguments.length<=2||void 0===arguments[2]?{}:arguments[2];window.location.href=r(Object.assign({src:t,action:e},n))}function a(t,e,n){var i;window.location.href=r((i={},i[t+"."+e]=n,i),"winset")}n.__esModule=!0,n.href=r,n.act=i,n.winset=a;var o=encodeURIComponent},{}],266:[function(t,e,n){"use strict";n.__esModule=!0;n.UI_INTERACTIVE=2,n.UI_UPDATE=1,n.UI_DISABLED=0,n.UI_CLOSE=-1},{}],267:[function(t,e,n){"use strict";function r(t,e){return 0>t?t=0:t+window.innerWidth>window.screen.availWidth&&(t=window.screen.availWidth-window.innerWidth),0>e?e=0:e+window.innerHeight>window.screen.availHeight&&(e=window.screen.availHeight-window.innerHeight),{x:t,y:e}}function i(t){if(t.preventDefault(),this.get("drag")){if(this.get("x")){var e=t.screenX-this.get("x")+window.screenLeft,n=t.screenY-this.get("y")+window.screenTop;if(this.get("config.locked")){var i=r(e,n);e=i.x,n=i.y}(0,s.winset)(this.get("config.window"),"pos",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}function a(t,e){return t=Math.clamp(100,window.screen.width,t),e=Math.clamp(100,window.screen.height,e),{x:t,y:e}}function o(t){if(t.preventDefault(),this.get("resize")){if(this.get("x")){var e=t.screenX-this.get("x")+window.innerWidth,n=t.screenY-this.get("y")+window.innerHeight,r=a(e,n);e=r.x,n=r.y,(0,s.winset)(this.get("config.window"),"size",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}n.__esModule=!0,n.lock=r,n.drag=i,n.sane=a,n.resize=o;var s=t(265)},{265:265}],268:[function(t,e,n){"use strict";function r(t,e){for(var n=t,r=Array.isArray(n),a=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(a>=n.length)break;o=n[a++]}else{if(a=n.next(),a.done)break;o=a.value}var s=o;s.textContent.toLowerCase().includes(e)?(s.style.display="",i(s,e)):s.style.display="none"}}function i(t,e){for(var n=t.queryAll("section"),r=t.query("header").textContent.toLowerCase().includes(e),i=n,a=Array.isArray(i),o=0,i=a?i:i[Symbol.iterator]();;){var s;if(a){if(o>=i.length)break;s=i[o++]}else{if(o=i.next(),o.done)break;s=o.value}var u=s;r||u.textContent.toLowerCase().includes(e)?u.style.display="":u.style.display="none"}}n.__esModule=!0,n.filterMulti=r,n.filter=i},{}],269:[function(t,e,n){"use strict";function r(t,e,n){return Math.max(t,Math.min(n,e))}function i(t){var e=arguments.length<=1||void 0===arguments[1]?1:arguments[1];return+(Math.round(t+"e"+e)+"e-"+e)}n.__esModule=!0,n.clamp=r,n.fixed=i},{}],270:[function(t,e,n){"use strict";function r(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function i(t){return t.replace(/\w\S*/g,r)}function a(t,e){for(t=""+t;t.length1){for(var u=Array(o),c=0;o>c;c++)u[c]=arguments[c+3];n.children=u}return{$$typeof:t,type:e,key:void 0===r?null:""+r,ref:null,props:n,_owner:null}}}(),e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function r(i,a){try{var o=e[i](a),s=o.value}catch(u){return void n(u)}return o.done?void t(s):Promise.resolve(s).then(function(t){return r("next",t)},function(t){return r("throw",t)})}return r("next")})}},e.classCallCheck=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},e.createClass=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n},e.possibleConstructorReturn=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},e.selfGlobal=void 0===t?self:t,e.set=function r(t,e,n,i){var a=Object.getOwnPropertyDescriptor(t,e);if(void 0===a){var o=Object.getPrototypeOf(t);null!==o&&r(o,e,n,i)}else if("value"in a&&a.writable)a.value=n;else{var s=a.set;void 0!==s&&s.call(i,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){i=!0,a=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),e.slicedToArrayLoose=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){for(var n,r=[],i=t[Symbol.iterator]();!(n=i.next()).done&&(r.push(n.value),!e||r.length!==e););return r}throw new TypeError("Invalid attempt to destructure non-iterable instance")},e.taggedTemplateLiteral=function(t,e){return Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))},e.taggedTemplateLiteralLoose=function(t,e){return t.raw=e,t},e.temporalRef=function(t,e,n){if(t===n)throw new ReferenceError(e+" is not defined - temporal dead zone");return t},e.temporalUndefined={},e.toArray=function(t){return Array.isArray(t)?t:Array.from(t)},e.toConsumableArray=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);et?"good":273.15>t?"average":"bad"}},computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(i),i.exports.template={v:3,t:[" ",{p:[22,1,466],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[23,3,499],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[24,3,532],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[24,9,538]}]}]}," ",{t:4,f:[{p:[27,5,655],t:7,e:"ui-section",a:{label:"State"},f:[{p:[28,7,689],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[28,20,702]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[28,43,725]}]}]}," ",{p:[30,4,846],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[31,6,885],t:7,e:"span",a:{"class":[{t:2,x:{r:["temperatureStatus","adata.occupant.bodyTemperature"],s:"_0(_1)"},p:[31,19,898]}]},f:[{t:2,x:{r:["adata.occupant.bodyTemperature"],s:"Math.round(_0)"},p:[31,74,953]}," K"]}]}," ",{p:[33,5,1032],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[34,7,1067],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[34,20,1080]}],max:[{t:2,r:"data.occupant.maxHealth",p:[34,54,1114]}],value:[{t:2,r:"data.occupant.health",p:[34,90,1150]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[35,16,1192]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[35,68,1244]}]}]}," ",{t:4,f:[{p:[38,7,1481],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[38,26,1500]}]},f:[{p:[39,9,1521],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[39,30,1542]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[39,66,1578]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[39,103,1615]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[37,5,1315]}],n:50,r:"data.hasOccupant",p:[26,3,625]}]}," ",{p:[44,1,1724],t:7,e:"ui-display",a:{title:"Cell"},f:[{p:[45,3,1753],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[46,5,1785],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[46,22,1802]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[47,14,1862]}],state:[{t:2,x:{r:["data.isOpen"],s:'_0?"disabled":null'},p:[48,14,1918]}],action:"power"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[49,22,1977]}]}]}," ",{p:[51,3,2045],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[52,3,2081],t:7,e:"span",a:{"class":[{t:2,x:{r:["temperatureStatus","adata.cellTemperature"],s:"_0(_1)"},p:[52,16,2094]}]},f:[{t:2,x:{r:["adata.cellTemperature"],s:"Math.round(_0)"},p:[52,62,2140]}," K"]}]}," ",{p:[54,2,2205],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[55,5,2236],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOpen"],s:'_0?"unlock":"lock"'},p:[55,22,2253]}],action:"door"},f:[{t:2,x:{r:["data.isOpen"],s:'_0?"Open":"Closed"'},p:[55,73,2304]}]}," ",{p:[56,5,2357],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoEject"],s:'_0?"sign-out":"sign-in"'},p:[56,22,2374]}],action:"autoeject"},f:[{t:2,x:{r:["data.autoEject"],s:'_0?"Auto":"Manual"'},p:[56,86,2438]}]}]}]}," ",{p:{button:[{p:[61,5,2584],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.isBeakerLoaded"],s:'_0?null:"disabled"'},p:[61,36,2615]}],action:"ejectbeaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{p:[63,3,2718],t:7,e:"ui-section",a:{label:"Contents"},f:[{t:4,f:[{t:4,f:[{p:[66,9,2828],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,2)"},p:[66,52,2871]}," units of ",{t:2,r:"name",p:[66,87,2906]}]},{p:[66,102,2921],t:7,e:"br"}],n:52,r:"adata.beakerContents",p:[65,7,2788]},{t:4,n:51,f:[{p:[68,9,2952],t:7,e:"span",a:{"class":"bad"},f:["Beaker Empty"]}],r:"adata.beakerContents"}],n:50,r:"data.isBeakerLoaded",p:[64,5,2753]},{t:4,n:51,f:[{p:[71,7,3028],t:7,e:"span",a:{"class":"average"},f:["No Beaker"]}],r:"data.isBeakerLoaded"}]}]}]},e.exports=r.extend(i.exports)},{205:205}],241:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,5,17],t:7,e:"span",f:["Time Until Launch: ",{t:2,r:"data.timer_str",p:[2,30,42]}]}]}," ",{p:[4,1,83],t:7,e:"ui-notice",f:[{p:[5,3,98],t:7,e:"span",f:["Engines: ",{t:2,x:{r:["data.engines_started"],s:'_0?"Online":"Idle"'},p:[5,18,113]}]}]}," ",{p:[7,1,180],t:7,e:"ui-display",a:{title:"Early Launch"},f:[{p:[8,2,216],t:7,e:"span",f:["Authorizations Remaining: ",{t:2,x:{r:["data.emagged","data.authorizations_remaining"],s:'_0?"ERROR":_1'},p:[9,2,250]}]}," ",{p:[10,2,318],t:7,e:"ui-button",a:{icon:"exclamation-triangle",action:"authorize",style:"danger",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[12,10,404]}]},f:["AUTHORIZE"]}," ",{p:[15,2,473],t:7,e:"ui-button",a:{icon:"minus",action:"repeal",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[16,10,523]}]},f:["Repeal"]}," ",{p:[19,2,589],t:7,e:"ui-button",a:{icon:"close",action:"abort",state:[{t:2,x:{r:["data.enabled"],s:'_0?null:"disabled"'},p:[20,10,638]}]},f:["Repeal All"]}]}," ",{p:[24,1,722],t:7,e:"ui-display",a:{title:"Authorizations"},f:[{t:4,f:[{p:[26,3,793],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{t:2,r:"name",p:[26,34,824]}," (",{t:2,r:"job",p:[26,44,834]},")"]}],n:52,r:"data.authorizations",p:[25,2,760]},{t:4,n:51,f:[{p:[28,3,870],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:["No authorizations."]}],r:"data.authorizations"}]}]},e.exports=r.extend(i.exports)},{205:205}],242:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The requested interface (",{t:2,r:"config.interface",p:[2,34,46]},") was not found. Does it exist?"]}]}]},e.exports=r.extend(i.exports)},{205:205}],243:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={computed:{seclevelState:function(){switch(this.get("data.seclevel")){case"blue":return"average";case"red":return"bad";case"delta":return"bad bold";default:return"good"}}}}}(i),i.exports.template={v:3,t:[" ",{p:[16,1,323],t:7,e:"ui-display",f:[{p:[17,5,341],t:7,e:"ui-section",a:{label:"Alert Level"},f:[{p:[18,9,383],t:7,e:"span",a:{"class":[{t:2,r:"seclevelState",p:[18,22,396]}]},f:[{t:2,x:{r:["text","data.seclevel"],s:"_0.titleCase(_1)"},p:[18,41,415]}]}]}," ",{p:[20,5,480],t:7,e:"ui-section",a:{label:"Controls"},f:[{p:[21,9,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.alarm"],s:'_0?"close":"bell-o"'},p:[21,26,536]}],action:[{t:2,x:{r:["data.alarm"],s:'_0?"reset":"alarm"'},p:[21,71,581]}]},f:[{t:2,x:{r:["data.alarm"],s:'_0?"Reset":"Activate"'},p:[22,13,631]}]}]}," ",{t:4,f:[{p:[25,7,733],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[26,9,771],t:7,e:"span",a:{"class":"bad bold"},f:["Safety measures offline. Device may exhibit abnormal behavior."]}]}],n:50,r:"data.emagged",p:[24,5,705]}]}]},e.exports=r.extend(i.exports)},{205:205}],244:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(i),i.exports.template={v:3,t:[" ",{t:4,f:[{p:[15,3,296],t:7,e:"ui-notice",f:[{p:[16,5,313],t:7,e:"span",f:["Wipe in progress!"]}]}],n:50,r:"data.wiping",p:[14,1,273]},{p:{button:[{t:4,f:[{p:[22,7,479],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.wiping","data.isDead"],s:'_0||_1?"disabled":null'},p:[22,38,510]}],action:"wipe"},f:["Wipe AI"]}],n:50,r:"data.name",p:[21,5,454]}]},t:7,e:"ui-display",a:{title:[{t:2,x:{r:["data.name"],s:'_0||"Empty Card"'},p:[19,19,388]}],button:0},f:[" ",{t:4,f:[{p:[26,5,651],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[27,9,688],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"bad":"good"'},p:[27,22,701]}]},f:[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"Offline":"Operational"'},p:[27,76,755]}]}]}," ",{p:[29,5,850],t:7,e:"ui-section",a:{label:"Software Integrity"},f:[{p:[30,7,897],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[30,40,930]}],state:[{t:2,r:"healthState",p:[30,64,954]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[30,81,971]},"%"]}]}," ",{p:[32,5,1034],t:7,e:"ui-section",a:{label:"Laws"},f:[{t:4,f:[{p:[34,9,1096],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[34,33,1120]}]},{p:[34,45,1132],t:7,e:"br"}],n:52,r:"data.laws",p:[33,7,1067]}]}," ",{p:[37,5,1179],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[38,7,1216],t:7,e:"ui-button",a:{icon:"signal",style:[{t:2,x:{r:["data.wireless"],s:'_0?"selected":null'},p:[38,39,1248]}],action:"wireless"},f:["Wireless Activity"]}," ",{p:[39,7,1342],t:7,e:"ui-button",a:{icon:"microphone",style:[{t:2,x:{r:["data.radio"],s:'_0?"selected":null'},p:[39,43,1378]}],action:"radio"},f:["Subspace Radio"]}]}],n:50,r:"data.name",p:[25,3,628]}]}]},e.exports=r.extend(i.exports)},{205:205}],245:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{t:4,f:[{p:[2,2,23],t:7,e:"ui-notice",f:[{p:[3,3,38],t:7,e:"span",f:["Waiting for another device to confirm your request..."]}]}],n:50,r:"data.waiting",p:[1,1,0]},{t:4,n:51,f:[{p:[6,2,132],t:7,e:"ui-display",f:[{p:[7,3,148],t:7,e:"ui-section",f:[{t:4,f:[{p:[9,5,197],t:7,e:"ui-button",a:{icon:"check",action:"auth_swipe"},f:["Authorize ",{t:2,r:"data.auth_required",p:[9,59,251]}]}],n:50,r:"data.auth_required",p:[8,4,165]},{t:4,n:51,f:[{p:[11,5,304],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.red_alert"],s:'_0?"disabled":null'},p:[11,38,337]}],action:"red_alert"},f:["Red Alert"]}," ",{p:[12,5,423],t:7,e:"ui-button",a:{icon:"wrench",state:[{t:2,x:{r:["data.emergency_maint"],s:'_0?"disabled":null'},p:[12,37,455]}],action:"emergency_maint"},f:["Emergency Maintenance Access"]}],r:"data.auth_required"}]}]}],r:"data.waiting"}]},e.exports=r.extend(i.exports)},{205:205}],246:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={data:{mechChargeState:function(t){var e=this.get("data.recharge_port.mech.cell.maxcharge");return t>=e/1.5?"good":t>=e/3?"average":"bad"},mechHealthState:function(t){var e=this.get("data.recharge_port.mech.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(i),i.exports.template={v:3,t:[" ",{p:[20,1,545],t:7,e:"ui-display",a:{title:"Mech Status"},f:[{t:4,f:[{t:4,f:[{p:[23,4,646],t:7,e:"ui-section",a:{label:"Integrity"},f:[{p:[24,6,683],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,27,704]}],value:[{t:2,r:"adata.recharge_port.mech.health",p:[24,74,751]}],state:[{t:2,x:{r:["mechHealthState","adata.recharge_port.mech.health"],s:"_0(_1)"},p:[24,117,794]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.health"],s:"Math.round(_0)"},p:[24,171,848]},"/",{t:2,r:"adata.recharge_port.mech.maxhealth",p:[24,219,896]}]}]}," ",{t:4,f:[{t:4,f:[{p:[28,5,1061],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[28,31,1087],t:7,e:"span",a:{"class":"bad"},f:["Cell Critical Failure"]}]}],n:50,r:"data.recharge_port.mech.cell.critfail",p:[27,3,1010]},{t:4,n:51,f:[{p:[30,11,1170],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,13,1210],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.recharge_port.mech.cell.maxcharge",p:[31,34,1231]}],value:[{t:2,r:"adata.recharge_port.mech.cell.charge",p:[31,86,1283]}],state:[{t:2,x:{r:["mechChargeState","adata.recharge_port.mech.cell.charge"],s:"_0(_1)"},p:[31,134,1331]}]},f:[{t:2,x:{r:["adata.recharge_port.mech.cell.charge"],s:"Math.round(_0)"},p:[31,193,1390]},"/",{t:2,x:{r:["adata.recharge_port.mech.cell.maxcharge"],s:"Math.round(_0)"},p:[31,246,1443]}]}]}],r:"data.recharge_port.mech.cell.critfail"}],n:50,r:"data.recharge_port.mech.cell",p:[26,4,970]},{t:4,n:51,f:[{p:[35,3,1558],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[35,29,1584],t:7,e:"span",a:{"class":"bad"},f:["Cell Missing"]}]}],r:"data.recharge_port.mech.cell"}],n:50,r:"data.recharge_port.mech",p:[22,2,610]},{t:4,n:51,f:[{p:[38,4,1662],t:7,e:"ui-section",f:["Mech Not Found"]}],r:"data.recharge_port.mech"}],n:50,r:"data.recharge_port",p:[21,3,581]},{t:4,n:51,f:[{p:[41,5,1729],t:7,e:"ui-section",f:["Recharging Port Not Found"]}," ",{p:[42,2,1782],t:7,e:"ui-button",a:{icon:"refresh",action:"reconnect"},f:["Reconnect"]}],r:"data.recharge_port"}]}]},e.exports=r.extend(i.exports)},{205:205}],247:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{t:4,f:[{p:[3,5,45],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[4,7,88],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[4,24,105]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[4,75,156]}]}]}],n:50,r:"data.siliconUser",p:[2,3,15]},{t:4,n:51,f:[{p:[7,5,247],t:7,e:"span",f:["Swipe an ID card to ",{t:2,
+x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[7,31,273]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[10,1,358],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[11,3,389],t:7,e:"ui-section",a:{label:"Power"},f:[{t:4,f:[{p:[13,7,470],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[13,24,487]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[13,68,531]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[13,116,579]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[12,5,421]},{t:4,n:51,f:[{p:[15,7,639],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.on"],s:'_0?"good":"bad"'},p:[15,20,652]}],state:[{t:2,x:{r:["data.cell"],s:'_0?null:"disabled"'},p:[15,57,689]}]},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[15,92,724]}]}],x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"}}]}," ",{p:[18,3,791],t:7,e:"ui-section",a:{label:"Cell"},f:[{p:[19,5,822],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.cell"],s:'_0?null:"bad"'},p:[19,18,835]}]},f:[{t:2,x:{r:["data.cell","data.cellPercent"],s:'_0?_1+"%":"No Cell"'},p:[19,48,865]}]}]}," ",{p:[21,3,943],t:7,e:"ui-section",a:{label:"Mode"},f:[{p:[22,5,974],t:7,e:"span",a:{"class":[{t:2,r:"data.modeStatus",p:[22,18,987]}]},f:[{t:2,r:"data.mode",p:[22,39,1008]}]}]}," ",{p:[24,3,1049],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[25,5,1080],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.load"],s:'_0?"good":"average"'},p:[25,18,1093]}]},f:[{t:2,x:{r:["data.load"],s:'_0?_0:"None"'},p:[25,54,1129]}]}]}," ",{p:[27,3,1191],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[28,5,1229],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.destination"],s:'_0?"good":"average"'},p:[28,18,1242]}]},f:[{t:2,x:{r:["data.destination"],s:'_0?_0:"None"'},p:[28,60,1284]}]}]}]}," ",{t:4,f:[{p:{button:[{t:4,f:[{p:[35,9,1513],t:7,e:"ui-button",a:{icon:"eject",action:"unload"},f:["Unload"]}],n:50,r:"data.load",p:[34,7,1486]}," ",{t:4,f:[{p:[38,9,1623],t:7,e:"ui-button",a:{icon:"eject",action:"ejectpai"},f:["Eject PAI"]}],n:50,r:"data.haspai",p:[37,7,1594]}," ",{p:[40,7,1709],t:7,e:"ui-button",a:{icon:"pencil",action:"setid"},f:["Set ID"]}]},t:7,e:"ui-display",a:{title:"Controls",button:0},f:[" ",{p:[42,5,1791],t:7,e:"ui-section",a:{label:"Destination"},f:[{p:[43,7,1831],t:7,e:"ui-button",a:{icon:"pencil",action:"destination"},f:["Set Destination"]}," ",{p:[44,7,1912],t:7,e:"ui-button",a:{icon:"stop",action:"stop"},f:["Stop"]}," ",{p:[45,7,1973],t:7,e:"ui-button",a:{icon:"play",action:"go"},f:["Go"]}]}," ",{p:[47,5,2047],t:7,e:"ui-section",a:{label:"Home"},f:[{p:[48,7,2080],t:7,e:"ui-button",a:{icon:"home",action:"home"},f:["Go Home"]}," ",{p:[49,7,2144],t:7,e:"ui-button",a:{icon:"pencil",action:"sethome"},f:["Set Home"]}]}," ",{p:[51,5,2231],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[52,7,2268],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoReturn"],s:'_0?"check-square-o":"square-o"'},p:[52,24,2285]}],style:[{t:2,x:{r:["data.autoReturn"],s:'_0?"selected":null'},p:[52,84,2345]}],action:"autoret"},f:["Auto-Return Home"]}," ",{p:[54,7,2449],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.autoPickup"],s:'_0?"check-square-o":"square-o"'},p:[54,24,2466]}],style:[{t:2,x:{r:["data.autoPickup"],s:'_0?"selected":null'},p:[54,84,2526]}],action:"autopick"},f:["Auto-Pickup Crate"]}," ",{p:[56,7,2632],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"check-square-o":"square-o"'},p:[56,24,2649]}],style:[{t:2,x:{r:["data.reportDelivery"],s:'_0?"selected":null'},p:[56,88,2713]}],action:"report"},f:["Report Deliveries"]}]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[31,1,1373]}]},e.exports=r.extend(i.exports)},{205:205}],248:[function(t,e,n){var r=t(205),i={exports:{}};!function(e){"use strict";var n=t(273);e.exports={data:{filter:""},oninit:function(){var t=this;this.observe("filter",function(e,r,i){var a=t.findAll(".display:not(:first-child)");(0,n.filterMulti)(a,t.get("filter").toLowerCase())},{init:!1})}}}(i),i.exports.template={v:3,t:[" ",{p:[16,1,387],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[16,20,406]}]},f:[{t:4,f:[{p:[18,5,452],t:7,e:"ui-section",f:["Crafting... ",{p:[19,16,481],t:7,e:"i",a:{"class":"fa-spin fa fa-spinner"}}]}],n:50,r:"data.busy",p:[17,3,429]},{t:4,n:51,f:[{p:[22,5,552],t:7,e:"ui-section",f:[{p:[23,7,572],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardCat"},f:[{t:2,r:"data.prev_cat",p:[24,6,630]}]}," ",{p:[26,4,669],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardCat"},f:[{t:2,r:"data.next_cat",p:[27,6,726]}]}," ",{t:4,f:[{p:[30,6,810],t:7,e:"ui-button",a:{icon:"lock",action:"toggle_recipes"},f:["Showing Craftable Recipes"]}],n:50,r:"data.display_craftable_only",p:[29,4,768]},{t:4,n:51,f:[{p:[34,6,924],t:7,e:"ui-button",a:{icon:"unlock",action:"toggle_recipes"},f:["Showing All Recipes"]}],r:"data.display_craftable_only"}," ",{t:4,f:[{p:[39,6,1061],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[39,23,1078]}],placeholder:"Filter.."}}],n:50,r:"config.fancy",p:[38,7,1034]}]}," ",{t:4,f:[{p:[43,7,1180],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[43,26,1199]}]},f:[{t:4,f:[{p:[45,8,1241],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[46,10,1285]}]}],n:50,r:"req_text",p:[44,6,1216]}," ",{t:4,f:[{p:[50,5,1364],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[51,10,1405]}]}],n:50,r:"catalyst_text",p:[49,6,1337]}," ",{t:4,f:[{p:[55,5,1485],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[56,10,1522]}]}],n:50,r:"tool_text",p:[54,3,1462]}," ",{p:[59,6,1575],t:7,e:"ui-section",f:[{p:[60,8,1596],t:7,e:"ui-button",a:{icon:"gears",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[60,66,1654]},'"}']},f:["Craft"]}]}]}],n:52,r:"data.can_craft",p:[42,5,1148]}," ",{t:4,f:[{t:4,f:[{p:[68,9,1827],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[68,28,1846]}]},f:[{t:4,f:[{p:[70,10,1892],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[71,12,1938]}]}],n:50,r:"req_text",p:[69,8,1865]}," ",{t:4,f:[{p:[75,7,2025],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[76,12,2068]}]}],n:50,r:"catalyst_text",p:[74,5,1996]}," ",{t:4,f:[{p:[80,7,2156],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[81,12,2195]}]}],n:50,r:"tool_text",p:[79,5,2131]}]}],n:52,r:"data.cant_craft",p:[67,7,1792]}],n:51,r:"data.display_craftable_only",p:[66,2,1752]}],r:"data.busy"}]}]},e.exports=r.extend(i.exports)},{205:205,273:273}],249:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Pump"},f:[{p:[13,3,459],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,491],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,508]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,559]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,616]}]}]}," ",{p:[18,3,675],t:7,e:"ui-section",a:{label:"Direction"},f:[{p:[19,5,711],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"sign-out":"sign-in"'},p:[19,22,728]}],action:"direction"},f:[{t:2,x:{r:["data.direction"],s:'_0=="out"?"Out":"In"'},p:[20,26,808]}]}]}," ",{p:[22,3,883],t:7,e:"ui-section",a:{label:"Target Pressure"},f:[{p:[23,5,925],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.min_pressure",p:[23,18,938]}],max:[{t:2,r:"data.max_pressure",p:[23,46,966]}],value:[{t:2,r:"data.target_pressure",p:[24,14,1003]}]},f:[{t:2,x:{r:["adata.target_pressure"],s:"Math.round(_0)"},p:[24,40,1029]}," kPa"]}]}," ",{p:[26,3,1100],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,1145],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.target_pressure","data.default_pressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,1178]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1328],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.target_pressure","data.min_pressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1359]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1500],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1595],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.target_pressure","data.max_pressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1625]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}," ",{p:{button:[{t:4,f:[{p:[39,7,1891],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[39,38,1922]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[38,5,1863]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[43,3,2042],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[44,4,2073]}]}," ",{p:[46,3,2115],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[47,4,2149]}," kPa"]}],n:50,r:"data.holding",p:[42,3,2018]},{t:4,n:51,f:[{p:[50,3,2223],t:7,e:"ui-section",f:[{p:[51,4,2240],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=r.extend(i.exports)},{205:205}],250:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-notice",f:[{p:[2,3,15],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.holding"],s:'_0?"is":"is not"'},p:[2,23,35]}," connected to a tank."]}]}," ",{p:[4,1,113],t:7,e:"ui-display",a:{title:"Status",button:0},f:[{p:[5,3,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,5,186],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[6,11,192]}," kPa"]}]}," ",{p:[8,3,254],t:7,e:"ui-section",a:{label:"Port"},f:[{p:[9,5,285],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected"],s:'_0?"good":"average"'},p:[9,18,298]}]},f:[{t:2,x:{r:["data.connected"],s:'_0?"Connected":"Not Connected"'},p:[9,59,339]}]}]}]}," ",{p:[12,1,430],t:7,e:"ui-display",a:{title:"Filter"},f:[{p:[13,3,461],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,5,493],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[14,22,510]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":"null"'},p:[15,14,561]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[16,22,618]}]}]}]}," ",{p:{button:[{t:4,f:[{p:[22,7,787],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.on"],s:'_0?"danger":null'},p:[22,38,818]}],action:"eject"},f:["Eject"]}],n:50,r:"data.holding",p:[21,5,759]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[26,3,938],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holding.name",p:[27,4,969]}]}," ",{p:[29,3,1011],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holding.pressure"],s:"Math.round(_0)"},p:[30,4,1045]}," kPa"]}],n:50,r:"data.holding",p:[25,3,914]},{t:4,n:51,f:[{p:[33,3,1119],t:7,e:"ui-section",f:[{p:[34,4,1136],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.holding"}]}]},e.exports=r.extend(i.exports)},{205:205}],251:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={data:{chargingState:function(t){switch(t){case 2:return"good";case 1:return"average";default:return"bad"}},chargingMode:function(t){return 2==t?"Full":1==t?"Charging":"Draining"},channelState:function(t){return t>=2?"good":"bad"},channelPower:function(t){return t>=2?"On":"Off"},channelMode:function(t){return 1==t||3==t?"Auto":"Manual"}},computed:{graphData:function(){var t=this.get("data.history");return Object.keys(t).map(function(e){return t[e].map(function(t,e){return{x:e,y:t}})})}}}}(i),i.exports.template={v:3,t:[" ",{p:[42,1,1035],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[44,5,1093],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData",p:[44,27,1115]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[46,38,1267]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[47,15,1323]}],yinc:"9"}}],n:50,r:"config.fancy",p:[43,3,1067]},{t:4,n:51,f:[{p:[49,5,1373],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[50,7,1411],t:7,e:"span",f:[{t:2,r:"data.supply",p:[50,13,1417]}," W"]}]}," ",{p:[52,5,1466],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[53,9,1501],t:7,e:"span",f:[{t:2,r:"data.demand",p:[53,15,1507]}," W"]}]}],r:"config.fancy"}]}," ",{p:[57,1,1578],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[58,3,1608],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[59,5,1633],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[60,5,1670],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[61,5,1709],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[62,5,1746],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[63,5,1785],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[64,5,1827],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[65,5,1868],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[68,5,1953],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[68,24,1972]}],nowrap:0},f:[{p:[69,7,1997],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[69,28,2018]}," %"]}," ",{p:[70,7,2076],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].load)"},p:[70,28,2097]}," W"]}," ",{p:[71,7,2153],t:7,e:"div",a:{"class":"content"},f:[{p:[71,28,2174],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[71,41,2187]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[71,70,2216]}]}]}," ",{p:[72,7,2263],t:7,e:"div",a:{"class":"content"},f:[{p:[72,28,2284],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[72,41,2297]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[72,64,2320]}," [",{p:[72,87,2343],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[72,93,2349]}]},"]"]}]}," ",{p:[73,7,2398],t:7,e:"div",a:{"class":"content"},f:[{p:[73,28,2419],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[73,41,2432]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[73,64,2455]}," [",{p:[73,87,2478],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[73,93,2484]}]},"]"]}]}," ",{p:[74,7,2533],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2554],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[74,41,2567]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[74,64,2590]}," [",{p:[74,87,2613],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[74,93,2619]}]},"]"]}]}]}],n:52,r:"data.areas",p:[67,3,1927]}]}]},e.exports=r.extend(i.exports)},{205:205}],252:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={computed:{readableFrequency:function(){return Math.round(this.get("adata.frequency"))/10}}}}(i),i.exports.template={v:3,t:[" ",{p:[11,1,177],t:7,e:"ui-display",a:{title:"Settings"},f:[{t:4,f:[{p:[13,5,236],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[14,7,270],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[14,24,287]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[14,75,338]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"On":"Off"'},p:[16,9,413]}]}]}],n:50,r:"data.headset",p:[12,3,210]},{t:4,n:51,f:[{p:[19,5,494],t:7,e:"ui-section",a:{label:"Microphone"},f:[{p:[20,7,533],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.broadcasting"],s:'_0?"power-off":"close"'},p:[20,24,550]}],style:[{t:2,x:{r:["data.broadcasting"],s:'_0?"selected":null'},p:[20,78,604]}],action:"broadcast"},f:[{t:2,x:{r:["data.broadcasting"],s:'_0?"Engaged":"Disengaged"'},p:[22,9,685]}]}]}," ",{p:[24,5,769],t:7,e:"ui-section",a:{label:"Speaker"},f:[{p:[25,7,805],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.listening"],s:'_0?"power-off":"close"'},p:[25,24,822]}],style:[{t:2,x:{r:["data.listening"],s:'_0?"selected":null'},p:[25,75,873]}],action:"listen"},f:[{t:2,x:{r:["data.listening"],s:'_0?"Engaged":"Disengaged"'},p:[27,9,948]}]}]}],r:"data.headset"}," ",{t:4,f:[{p:[31,5,1064],t:7,e:"ui-section",a:{label:"High Volume"},f:[{p:[32,7,1104],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.useCommand"],s:'_0?"power-off":"close"'},p:[32,24,1121]}],style:[{t:2,x:{r:["data.useCommand"],s:'_0?"selected":null'},p:[32,76,1173]}],action:"command"},f:[{t:2,x:{r:["data.useCommand"],s:'_0?"On":"Off"'},p:[34,9,1250]}]}]}],n:50,r:"data.command",p:[30,3,1038]}]}," ",{p:[38,1,1342],t:7,e:"ui-display",a:{title:"Channel"},f:[{p:[39,3,1374],t:7,e:"ui-section",a:{label:"Frequency"},f:[{t:4,f:[{p:[41,7,1439],t:7,e:"span",f:[{t:2,r:"readableFrequency",p:[41,13,1445]}]}],n:50,r:"data.freqlock",p:[40,5,1410]},{t:4,n:51,f:[{p:[43,7,1495],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[43,46,1534]}],action:"frequency",params:'{"adjust": -1}'}}," ",{p:[44,7,1646],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.frequency","data.minFrequency"],s:'_0==_1?"disabled":null'},p:[44,41,1680]}],action:"frequency",params:'{"adjust": -.2}'}}," ",{p:[45,7,1793],t:7,e:"ui-button",a:{icon:"pencil",action:"frequency",params:'{"tune": "input"}'},f:[{t:2,r:"readableFrequency",p:[45,78,1864]}]}," ",{p:[46,7,1905],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[46,40,1938]}],action:"frequency",params:'{"adjust": .2}'}}," ",{p:[47,7,2050],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.frequency","data.maxFrequency"],s:'_0==_1?"disabled":null'},p:[47,45,2088]}],action:"frequency",params:'{"adjust": 1}'}}],r:"data.freqlock"}]}," ",{t:4,f:[{p:[51,5,2262],t:7,e:"ui-section",a:{label:"Subspace Transmission"},f:[{p:[52,7,2312],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.subspace"],s:'_0?"power-off":"close"'},p:[52,24,2329]}],style:[{t:2,x:{r:["data.subspace"],s:'_0?"selected":null'},p:[52,74,2379]}],action:"subspace"},f:[{t:2,x:{r:["data.subspace"],s:'_0?"Active":"Inactive"'},p:[53,29,2447]}]}]}],n:50,r:"data.subspaceSwitchable",p:[50,3,2225]}," ",{t:4,f:[{p:[57,5,2578],t:7,e:"ui-section",a:{label:"Channels"},f:[{t:4,f:[{p:[59,9,2656],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["."],s:'_0?"check-square-o":"square-o"'},p:[59,26,2673]}],style:[{t:2,x:{r:["."],s:'_0?"selected":null'},p:[60,18,2730]}],action:"channel",params:['{"channel": "',{t:2,r:"channel",p:[61,49,2806]},'"}']},f:[{t:2,r:"channel",p:[62,11,2833]}]},{p:[62,34,2856],t:7,e:"br"}],n:52,i:"channel",r:"data.channels",p:[58,7,2615]}]}],n:50,x:{r:["data.subspace","data.channels"],s:"_0&&_1"},p:[56,3,2534]}]}]},e.exports=r.extend(i.exports)},{205:205}],253:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[" "," "," ",{p:[5,1,200],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.tabs",p:[5,16,215]}]},f:[{p:[6,2,233],t:7,e:"tab",a:{name:"Status"},f:[{p:[7,3,256],t:7,e:"status"}]}," ",{p:[9,2,277],t:7,e:"tab",a:{name:"Templates"},f:[{p:[10,3,303],t:7,e:"templates"}]}," ",{p:[12,2,327],t:7,e:"tab",a:{name:"Modification"},f:[{t:4,f:[{p:[14,3,381],t:7,e:"modification"}],n:50,r:"data.selected",p:[13,3,356]}," ",{t:4,f:[{p:[17,3,437],t:7,e:"span",a:{"class":"bad"},f:["No shuttle selected."]}],n:50,x:{r:["data.selected"],s:"!_0"},p:[16,3,411]}]}]}]},i.exports.components=i.exports.components||{};var a={modification:t(254),templates:t(256),status:t(255)};for(var o in a)a.hasOwnProperty(o)&&(i.exports.components[o]=a[o]);e.exports=r.extend(i.exports)},{205:205,254:254,255:255,256:256}],254:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:["Selected: ",{t:2,r:"data.selected.name",p:[1,30,29]}]},f:[{t:4,f:[{p:[3,5,96],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"data.selected.description",p:[3,37,128]}]}],n:50,r:"data.selected.description",p:[2,3,57]}," ",{t:4,f:[{p:[6,5,224],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"data.selected.admin_notes",p:[6,37,256]}]}],n:50,r:"data.selected.admin_notes",p:[5,3,185]}]}," ",{t:4,f:[{p:[11,3,361],t:7,e:"ui-display",a:{title:["Existing Shuttle: ",{t:2,r:"data.existing_shuttle.name",p:[11,40,398]}]},f:["Status: ",{t:2,r:"data.existing_shuttle.status",p:[12,13,444]}," ",{t:4,f:["(",{t:2,r:"data.existing_shuttle.timeleft",p:[14,8,526]},")"],n:50,r:"data.existing_shuttle.timer",p:[13,5,482]}," ",{p:[16,5,580],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"data.existing_shuttle.id",p:[17,41,649]},'"}']},f:["Jump To"]}]}],n:50,r:"data.existing_shuttle",p:[10,1,328]},{t:4,f:[{p:[24,3,778],t:7,e:"ui-display",a:{title:"Existing Shuttle: None"}}],n:50,x:{r:["data.existing_shuttle"],s:"!_0"},p:[23,1,744]},{p:[27,1,847],t:7,e:"ui-button",a:{action:"preview",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[28,27,902]},'"}']},f:["Preview"]}," ",{p:[31,1,961],t:7,e:"ui-button",a:{action:"load",params:['{"shuttle_id": "',{t:2,r:"data.selected.shuttle_id",p:[32,27,1013]},'"}'],style:"danger"},f:["Load"]}," ",{p:[37,1,1089],t:7,e:"ui-display",a:{title:"Status"},f:[]}]},e.exports=r.extend(i.exports)},{205:205}],255:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{t:4,f:[{p:[2,3,27],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,46]}," (",{t:2,r:"id",p:[2,32,56]},")"]},f:[{t:2,r:"status",p:[3,5,71]}," ",{t:4,f:["(",{t:2,r:"timeleft",p:[5,8,109]},")"],n:50,r:"timer",p:[4,5,87]}," ",{p:[7,5,141],t:7,e:"ui-button",a:{action:"jump_to",params:['{"type": "mobile", "id": "',{t:2,r:"id",p:[7,67,203]},'"}']},f:["Jump To"]}]}],n:52,r:"data.shuttles",p:[1,1,0]}]},e.exports=r.extend(i.exports)},{205:205}],256:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"data.templates_tabs",p:[1,16,15]}]},f:[{t:4,f:[{p:[3,5,74],t:7,e:"tab",a:{name:[{t:2,r:"port_id",p:[3,16,85]}]},f:[{t:4,f:[{p:[5,9,135],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[5,28,154]}]},f:[{t:4,f:[{p:[7,13,209],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[7,45,241]}]}],n:50,r:"description",p:[6,11,176]}," ",{t:4,f:[{p:[10,13,333],t:7,e:"ui-section",a:{label:"Admin Notes"},f:[{t:2,r:"admin_notes",p:[10,45,365]}]}],n:50,r:"admin_notes",p:[9,11,300]}," ",{p:[13,11,426],t:7,e:"ui-button",a:{action:"select_template",params:['{"shuttle_id": "',{t:2,r:"shuttle_id",p:[14,37,499]},'"}'],state:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"selected":null'},p:[15,20,537]}]},f:[{t:2,x:{r:["data.selected.shuttle_id","shuttle_id"],s:'_0==_1?"Selected":"Select"'},p:[17,13,630]}]}]}],n:52,r:"templates",p:[4,7,106]}]}],n:52,r:"data.templates",p:[2,3,44]}]}]},e.exports=r.extend(i.exports)},{205:205}],257:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={computed:{occupantStatState:function(){switch(this.get("data.occupant.stat")){case 0:return"good";case 1:return"average";default:return"bad"}}}}}(i),i.exports.template={v:3,t:[" ",{p:[15,1,280],t:7,e:"ui-display",a:{title:"Occupant"},f:[{p:[16,3,313],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[17,3,346],t:7,e:"span",f:[{t:2,x:{r:["data.occupant.name"],s:'_0?_0:"No Occupant"'},p:[17,9,352]}]}]}," ",{t:4,f:[{p:[20,5,466],t:7,e:"ui-section",a:{label:"State"},f:[{p:[21,7,500],t:7,e:"span",a:{"class":[{t:2,r:"occupantStatState",p:[21,20,513]}]},f:[{t:2,x:{r:["data.occupant.stat"],s:'_0==0?"Conscious":_0==1?"Unconcious":"Dead"'},p:[21,43,536]}]}]}," ",{p:[23,5,658],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[24,7,693],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.occupant.minHealth",p:[24,20,706]}],max:[{t:2,r:"data.occupant.maxHealth",p:[24,54,740]}],value:[{t:2,r:"data.occupant.health",p:[24,90,776]}],state:[{t:2,x:{r:["data.occupant.health"],s:'_0>=0?"good":"average"'},p:[25,16,818]}]},f:[{t:2,x:{r:["adata.occupant.health"],s:"Math.round(_0)"},p:[25,68,870]}]}]}," ",{t:4,f:[{p:[28,7,1107],t:7,e:"ui-section",a:{label:[{t:2,r:"label",p:[28,26,1126]}]},f:[{p:[29,9,1147],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.occupant.maxHealth",p:[29,30,1168]}],value:[{t:2,rx:{r:"data.occupant",m:[{t:30,n:"type"}]},p:[29,66,1204]}],state:"bad"},f:[{t:2,x:{r:["type","adata.occupant"],s:"Math.round(_1[_0])"},p:[29,103,1241]}]}]}],n:52,x:{r:[],s:'[{label:"Brute",type:"bruteLoss"},{label:"Respiratory",type:"oxyLoss"},{label:"Toxin",type:"toxLoss"},{label:"Burn",type:"fireLoss"}]'},p:[27,5,941]}," ",{p:[32,5,1328],t:7,e:"ui-section",a:{label:"Cells"},f:[{p:[33,9,1364],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"bad":"good"'},p:[33,22,1377]}]},f:[{t:2,x:{r:["data.occupant.cloneLoss"],s:'_0?"Damaged":"Healthy"'},p:[33,68,1423]}]}]}," ",{p:[35,5,1506],t:7,e:"ui-section",a:{label:"Brain"},f:[{p:[36,9,1542],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"bad":"good"'},p:[36,22,1555]}]},f:[{t:2,x:{r:["data.occupant.brainLoss"],s:'_0?"Abnormal":"Healthy"'},p:[36,68,1601]}]}]}," ",{p:[38,5,1685],t:7,e:"ui-section",a:{label:"Bloodstream"},f:[{t:4,f:[{p:[40,11,1772],t:7,e:"span",a:{"class":"highlight"},t0:"fade",f:[{t:2,x:{r:["volume"],s:"Math.fixed(_0,1)"},p:[40,54,1815]}," units of ",{t:2,r:"name",p:[40,89,1850]}]},{p:[40,104,1865],t:7,e:"br"}],n:52,r:"adata.occupant.reagents",p:[39,9,1727]},{t:4,n:51,f:[{p:[42,11,1900],t:7,e:"span",a:{"class":"good"},f:["Pure"]}],r:"adata.occupant.reagents"}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[47,1,1996],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[48,2,2028],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[49,5,2059],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[49,22,2076]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[49,71,2125]}]}]}," ",{p:[51,3,2190],t:7,e:"ui-section",a:{label:"Inject"},f:[{t:4,f:[{p:[53,7,2251],t:7,e:"ui-button",a:{icon:"flask",state:[{t:2,x:{r:["data.occupied","allowed"],s:'_0&&_1?null:"disabled"'},p:[53,38,2282]}],action:"inject",params:['{"chem": "',{t:2,r:"id",p:[53,122,2366]},'"}']},f:[{t:2,r:"name",p:[53,132,2376]}]},{p:[53,152,2396],t:7,e:"br"}],n:52,r:"data.chems",p:[52,5,2223]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],258:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={computed:{capacityPercentState:function(){var t=this.get("data.capacityPercent");return t>50?"good":t>15?"average":"bad"},inputState:function(){return this.get("data.capacityPercent")>=100?"good":this.get("data.inputting")?"average":"bad"},outputState:function(){return this.get("data.outputting")?"good":this.get("data.charge")>0?"average":"bad"}}}}(i),i.exports.template={v:3,t:[" ",{p:[24,1,663],t:7,e:"ui-display",a:{title:"Storage"},f:[{p:[25,3,695],t:7,e:"ui-section",a:{label:"Stored Energy"},f:[{p:[26,5,735],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.capacityPercent",p:[26,38,768]}],state:[{t:2,r:"capacityPercentState",p:[26,71,801]}]},f:[{t:2,x:{r:["adata.capacityPercent"],s:"Math.fixed(_0)"},p:[26,97,827]},"%"]}]}]}," ",{p:[29,1,908],t:7,e:"ui-display",a:{title:"Input"},f:[{p:[30,3,938],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{p:[31,5,976],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"refresh":"close"'},p:[31,22,993]}],style:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"selected":null'},p:[31,74,1045]}],action:"tryinput"},f:[{t:2,x:{r:["data.inputAttempt"],s:'_0?"Auto":"Off"'},p:[32,25,1113]}]}," Â [",{p:[34,6,1182],t:7,e:"span",a:{"class":[{t:2,r:"inputState",p:[34,19,1195]}]},f:[{t:2,x:{r:["data.capacityPercent","data.inputting"],s:'_0>=100?"Fully Charged":_1?"Charging":"Not Charging"'},p:[34,35,1211]}]},"]"]}," ",{p:[36,3,1335],t:7,e:"ui-section",a:{label:"Target Input"},f:[{p:[37,5,1374],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.inputLevelMax",p:[37,26,1395]}],value:[{t:2,r:"data.inputLevel",p:[37,57,1426]}]},f:[{t:2,x:{r:["adata.inputLevel"],s:"Math.round(_0)"},p:[37,78,1447]},"W"]}]}," ",{p:[39,3,1509],t:7,e:"ui-section",a:{label:"Adjust Input"},f:[{p:[40,5,1548],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[40,44,1587]}],action:"input",params:'{"target": "min"}'}}," ",{p:[41,5,1682],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.inputLevel"],s:'_0==0?"disabled":null'},p:[41,39,1716]}],action:"input",params:'{"adjust": -10000}'}}," ",{p:[42,5,1812],t:7,e:"ui-button",a:{icon:"pencil",action:"input",params:'{"target": "input"}'},f:["Set"]}," ",{p:[43,5,1902],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[43,38,1935]}],action:"input",params:'{"adjust": 10000}'}}," ",{p:[44,5,2047],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.inputLevel","data.inputLevelMax"],s:'_0==_1?"disabled":null'},p:[44,43,2085]}],action:"input",params:'{"target": "max"}'}}]}," ",{p:[46,3,2212],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[47,3,2246],t:7,e:"span",f:[{t:2,x:{r:["adata.inputAvailable"],s:"Math.round(_0)"},p:[47,9,2252]},"W"]}]}]}," ",{p:[50,1,2329],t:7,e:"ui-display",a:{title:"Output"},f:[{p:[51,3,2360],t:7,e:"ui-section",a:{label:"Output Mode"},f:[{p:[52,5,2398],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"power-off":"close"'},p:[52,22,2415]}],style:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"selected":null'},p:[52,77,2470]}],action:"tryoutput"},f:[{t:2,x:{r:["data.outputAttempt"],s:'_0?"On":"Off"'},p:[53,26,2540]}]}," Â [",{p:[55,6,2608],t:7,e:"span",a:{"class":[{t:2,r:"outputState",p:[55,19,2621]}]},f:[{t:2,x:{r:["data.outputting","data.charge"],s:'_0?"Sending":_1>0?"Not Sending":"No Charge"'},p:[55,36,2638]}]},"]"]}," ",{p:[57,3,2745],t:7,e:"ui-section",a:{label:"Target Output"},f:[{p:[58,5,2785],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.outputLevelMax",p:[58,26,2806]}],value:[{t:2,r:"data.outputLevel",p:[58,58,2838]}]},f:[{t:2,x:{r:["adata.outputLevel"],s:"Math.round(_0)"},p:[58,80,2860]},"W"]}]}," ",{p:[60,3,2923],t:7,e:"ui-section",a:{label:"Adjust Output"},f:[{p:[61,5,2963],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[61,44,3002]}],action:"output",params:'{"target": "min"}'}}," ",{p:[62,5,3099],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.outputLevel"],s:'_0==0?"disabled":null'},p:[62,39,3133]}],action:"output",params:'{"adjust": -10000}'}}," ",{p:[63,5,3231],t:7,e:"ui-button",a:{icon:"pencil",action:"output",params:'{"target": "input"}'},f:["Set"]}," ",{p:[64,5,3322],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[64,38,3355]}],action:"output",params:'{"adjust": 10000}'}}," ",{p:[65,5,3470],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.outputLevel","data.outputLevelMax"],s:'_0==_1?"disabled":null'},p:[65,43,3508]}],action:"output",params:'{"target": "max"}'}}]}," ",{p:[67,3,3638],t:7,e:"ui-section",a:{label:"Outputting"},f:[{p:[68,3,3673],t:7,e:"span",f:[{t:2,x:{r:["adata.outputUsed"],s:"Math.round(_0)"},p:[68,9,3679]},"W"]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],259:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,3,31],t:7,e:"ui-section",a:{label:"Generated Power"},f:[{t:2,x:{r:["adata.generated"],s:"Math.round(_0)"},p:[3,5,73]},"W"]}," ",{p:[5,3,126],t:7,e:"ui-section",a:{label:"Orientation"},f:[{p:[6,5,164],t:7,e:"span",f:[{t:2,x:{r:["adata.angle"],
+s:"Math.round(_0)"},p:[6,11,170]},"° (",{t:2,r:"data.direction",p:[6,45,204]},")"]}]}," ",{p:[8,3,251],t:7,e:"ui-section",a:{label:"Adjust Angle"},f:[{p:[9,5,290],t:7,e:"ui-button",a:{icon:"step-backward",action:"angle",params:'{"adjust": -15}'},f:["15°"]}," ",{p:[10,5,387],t:7,e:"ui-button",a:{icon:"backward",action:"angle",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[11,5,477],t:7,e:"ui-button",a:{icon:"forward",action:"angle",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[12,5,565],t:7,e:"ui-button",a:{icon:"step-forward",action:"angle",params:'{"adjust": 15}'},f:["15°"]}]}]}," ",{p:[15,1,687],t:7,e:"ui-display",a:{title:"Tracking"},f:[{p:[16,3,720],t:7,e:"ui-section",a:{label:"Tracker Mode"},f:[{p:[17,5,759],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==0?"selected":null'},p:[17,36,790]}],action:"tracking",params:'{"mode": 0}'},f:["Off"]}," ",{p:[19,5,907],t:7,e:"ui-button",a:{icon:"clock-o",state:[{t:2,x:{r:["data.tracking_state"],s:'_0==1?"selected":null'},p:[19,38,940]}],action:"tracking",params:'{"mode": 1}'},f:["Timed"]}," ",{p:[21,5,1059],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.connected_tracker","data.tracking_state"],s:'_0?_1==2?"selected":null:"disabled"'},p:[21,38,1092]}],action:"tracking",params:'{"mode": 2}'},f:["Auto"]}]}," ",{p:[24,3,1262],t:7,e:"ui-section",a:{label:"Tracking Rate"},f:[{p:[25,3,1300],t:7,e:"span",f:[{t:2,x:{r:["adata.tracking_rate"],s:"Math.round(_0)"},p:[25,9,1306]},"°/h (",{t:2,r:"data.rotating_way",p:[25,53,1350]},")"]}]}," ",{p:[27,3,1399],t:7,e:"ui-section",a:{label:"Adjust Rate"},f:[{p:[28,5,1437],t:7,e:"ui-button",a:{icon:"fast-backward",action:"rate",params:'{"adjust": -180}'},f:["180°"]}," ",{p:[29,5,1535],t:7,e:"ui-button",a:{icon:"step-backward",action:"rate",params:'{"adjust": -30}'},f:["30°"]}," ",{p:[30,5,1631],t:7,e:"ui-button",a:{icon:"backward",action:"rate",params:'{"adjust": -5}'},f:["5°"]}," ",{p:[31,5,1720],t:7,e:"ui-button",a:{icon:"forward",action:"rate",params:'{"adjust": 5}'},f:["5°"]}," ",{p:[32,5,1807],t:7,e:"ui-button",a:{icon:"step-forward",action:"rate",params:'{"adjust": 30}'},f:["30°"]}," ",{p:[33,5,1901],t:7,e:"ui-button",a:{icon:"fast-forward",action:"rate",params:'{"adjust": 180}'},f:["180°"]}]}]}," ",{p:{button:[{p:[38,5,2088],t:7,e:"ui-button",a:{icon:"refresh",action:"refresh"},f:["Refresh"]}]},t:7,e:"ui-display",a:{title:"Devices",button:0},f:[" ",{p:[40,2,2169],t:7,e:"ui-section",a:{label:"Solar Tracker"},f:[{p:[41,5,2209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_tracker"],s:'_0?"good":"bad"'},p:[41,18,2222]}]},f:[{t:2,x:{r:["data.connected_tracker"],s:'_0?"":"Not "'},p:[41,63,2267]},"Found"]}]}," ",{p:[43,2,2338],t:7,e:"ui-section",a:{label:"Solar Panels"},f:[{p:[44,3,2375],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.connected_panels"],s:'_0?"good":"bad"'},p:[44,16,2388]}]},f:[{t:2,x:{r:["adata.connected_panels"],s:"Math.round(_0)"},p:[44,60,2432]}," Panels Connected"]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],260:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:{button:[{t:4,f:[{p:[4,7,87],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[4,38,118]}],action:"eject"},f:["Eject"]}],n:50,r:"data.open",p:[3,5,62]}]},t:7,e:"ui-display",a:{title:"Power",button:0},f:[" ",{p:[7,3,226],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[8,5,258],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[8,22,275]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[9,14,326]}],state:[{t:2,x:{r:["data.hasPowercell"],s:'_0?null:"disabled"'},p:[9,54,366]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[10,22,431]}]}]}," ",{p:[12,3,490],t:7,e:"ui-section",a:{label:"Cell"},f:[{t:4,f:[{p:[14,7,554],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerLevel",p:[14,40,587]}]},f:[{t:2,x:{r:["adata.powerLevel"],s:"Math.fixed(_0)"},p:[14,61,608]},"%"]}],n:50,r:"data.hasPowercell",p:[13,5,521]},{t:4,n:51,f:[{p:[16,4,667],t:7,e:"span",a:{"class":"bad"},f:["No Cell"]}],r:"data.hasPowercell"}]}]}," ",{p:[20,1,744],t:7,e:"ui-display",a:{title:"Thermostat"},f:[{p:[21,3,779],t:7,e:"ui-section",a:{label:"Current Temperature"},f:[{p:[22,3,823],t:7,e:"span",f:[{t:2,x:{r:["adata.currentTemp"],s:"Math.round(_0)"},p:[22,9,829]},"°C"]}]}," ",{p:[24,2,894],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[25,3,937],t:7,e:"span",f:[{t:2,x:{r:["adata.targetTemp"],s:"Math.round(_0)"},p:[25,9,943]},"°C"]}]}," ",{t:4,f:[{p:[28,5,1031],t:7,e:"ui-section",a:{label:"Adjust Target"},f:[{p:[29,7,1073],t:7,e:"ui-button",a:{icon:"fast-backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[29,46,1112]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[30,7,1218],t:7,e:"ui-button",a:{icon:"backward",state:[{t:2,x:{r:["data.targetTemp","data.minTemp"],s:'_0>_1?null:"disabled"'},p:[30,41,1252]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[31,7,1357],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:["Set"]}," ",{p:[32,7,1450],t:7,e:"ui-button",a:{icon:"forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[32,40,1483]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[33,7,1587],t:7,e:"ui-button",a:{icon:"fast-forward",state:[{t:2,x:{r:["data.targetTemp","data.maxTemp"],s:'_0<_1?null:"disabled"'},p:[33,45,1625]}],action:"target",params:'{"adjust": 20}'}}]}],n:50,r:"data.open",p:[27,3,1008]}," ",{p:[36,3,1754],t:7,e:"ui-section",a:{label:"Mode"},f:[{t:4,f:[{p:[38,7,1808],t:7,e:"ui-button",a:{icon:"long-arrow-up",state:[{t:2,x:{r:["data.mode"],s:'_0=="heat"?"selected":null'},p:[38,46,1847]}],action:"mode",params:'{"mode": "heat"}'},f:["Heat"]}," ",{p:[39,7,1956],t:7,e:"ui-button",a:{icon:"long-arrow-down",state:[{t:2,x:{r:["data.mode"],s:'_0=="cool"?"selected":null'},p:[39,48,1997]}],action:"mode",params:'{"mode": "cool"}'},f:["Cool"]}," ",{p:[40,7,2106],t:7,e:"ui-button",a:{icon:"arrows-v",state:[{t:2,x:{r:["data.mode"],s:'_0=="auto"?"selected":null'},p:[40,41,2140]}],action:"mode",params:'{"mode": "auto"}'},f:["Auto"]}],n:50,r:"data.open",p:[37,3,1783]},{t:4,n:51,f:[{p:[42,4,2258],t:7,e:"span",f:[{t:2,x:{r:["text","data.mode"],s:"_0.titleCase(_1)"},p:[42,10,2264]}]}],r:"data.open"}]}]}]},e.exports=r.extend(i.exports)},{205:205}],261:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{t:4,f:[{p:[2,3,31],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[2,22,50]}," Alarms"]},f:[{p:[3,5,74],t:7,e:"ul",f:[{t:4,f:[{p:[5,9,107],t:7,e:"li",f:[{t:2,r:".",p:[5,13,111]}]}],n:52,r:".",p:[4,7,86]},{t:4,n:51,f:[{p:[7,9,147],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[1,1,0]}]},e.exports=r.extend(i.exports)},{205:205}],262:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{t:4,f:[{p:[2,3,42],t:7,e:"ui-notice",f:[{p:[3,5,59],t:7,e:"span",f:["Biological entity detected in contents. Please remove."]}]}],n:50,x:{r:["data.occupied","data.safeties"],s:"_0&&_1"},p:[1,1,0]},{t:4,f:[{p:[7,3,179],t:7,e:"ui-notice",f:[{p:[8,5,196],t:7,e:"span",f:["Contents are being disinfected. Please wait."]}]}],n:50,r:"data.uv_active",p:[6,1,153]},{t:4,n:51,f:[{p:{button:[{t:4,f:[{p:[13,25,369],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[13,42,386]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Unlock":"Lock"'},p:[13,93,437]}]}],n:50,x:{r:["data.open"],s:"!_0"},p:[13,7,351]}," ",{t:4,f:[{p:[14,27,519],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"sign-out":"sign-in"'},p:[14,44,536]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Close":"Open"'},p:[14,98,590]}]}],n:50,x:{r:["data.locked"],s:"!_0"},p:[14,7,499]}]},t:7,e:"ui-display",a:{title:"Storage",button:0},f:[" ",{t:4,f:[{p:[17,7,692],t:7,e:"ui-notice",f:[{p:[18,9,713],t:7,e:"span",f:["Unit Locked"]}]}],n:50,r:"data.locked",p:[16,5,665]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.open"],s:"_0"},f:[{p:[21,9,793],t:7,e:"ui-section",a:{label:"Helmet"},f:[{p:[22,11,832],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.helmet"],s:'_0?"square":"square-o"'},p:[22,28,849]}],state:[{t:2,x:{r:["data.helmet"],s:'_0?null:"disabled"'},p:[22,75,896]}],action:"dispense",params:'{"item": "helmet"}'},f:[{t:2,x:{r:["data.helmet"],s:'_0||"Empty"'},p:[23,59,992]}]}]}," ",{p:[25,9,1063],t:7,e:"ui-section",a:{label:"Suit"},f:[{p:[26,11,1100],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.suit"],s:'_0?"square":"square-o"'},p:[26,28,1117]}],state:[{t:2,x:{r:["data.suit"],s:'_0?null:"disabled"'},p:[26,74,1163]}],action:"dispense",params:'{"item": "suit"}'},f:[{t:2,x:{r:["data.suit"],s:'_0||"Empty"'},p:[27,57,1255]}]}]}," ",{p:[29,9,1324],t:7,e:"ui-section",a:{label:"Mask"},f:[{p:[30,11,1361],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.mask"],s:'_0?"square":"square-o"'},p:[30,28,1378]}],state:[{t:2,x:{r:["data.mask"],s:'_0?null:"disabled"'},p:[30,74,1424]}],action:"dispense",params:'{"item": "mask"}'},f:[{t:2,x:{r:["data.mask"],s:'_0||"Empty"'},p:[31,57,1516]}]}]}," ",{p:[33,9,1585],t:7,e:"ui-section",a:{label:"Storage"},f:[{p:[34,11,1625],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.storage"],s:'_0?"square":"square-o"'},p:[34,28,1642]}],state:[{t:2,x:{r:["data.storage"],s:'_0?null:"disabled"'},p:[34,77,1691]}],action:"dispense",params:'{"item": "storage"}'},f:[{t:2,x:{r:["data.storage"],s:'_0||"Empty"'},p:[35,60,1789]}]}]}]},{t:4,n:50,x:{r:["data.open"],s:"!(_0)"},f:[" ",{p:[38,7,1873],t:7,e:"ui-button",a:{icon:"recycle",state:[{t:2,x:{r:["data.occupied","data.safeties"],s:'_0&&_1?"disabled":null'},p:[38,40,1906]}],action:"uv"},f:["Disinfect"]}]}],r:"data.locked"}]}],r:"data.uv_active"}]},e.exports=r.extend(i.exports)},{205:205}],263:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,5,18],t:7,e:"ui-section",a:{label:"Dispense"},f:[{p:[3,9,57],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.plasma"],s:'_0?"square":"square-o"'},p:[3,26,74]}],state:[{t:2,x:{r:["data.plasma"],s:'_0?null:"disabled"'},p:[3,74,122]}],action:"plasma"},f:["Plasma (",{t:2,x:{r:["adata.plasma"],s:"Math.round(_0)"},p:[4,37,196]},")"]}," ",{p:[5,9,247],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.oxygen"],s:'_0?"square":"square-o"'},p:[5,26,264]}],state:[{t:2,x:{r:["data.oxygen"],s:'_0?null:"disabled"'},p:[5,74,312]}],action:"oxygen"},f:["Oxygen (",{t:2,x:{r:["adata.oxygen"],s:"Math.round(_0)"},p:[6,37,386]},")"]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],264:[function(t,e,n){var r=t(205),i={exports:{}};!function(t){"use strict";t.exports={computed:{tankPressureState:function(){var t=this.get("data.tankPressure");return t>=200?"good":t>=100?"average":"bad"}}}}(i),i.exports.template={v:3,t:[" ",{p:[14,1,295],t:7,e:"ui-notice",f:[{p:[15,3,310],t:7,e:"span",f:["The regulator ",{t:2,x:{r:["data.connected"],s:'_0?"is":"is not"'},p:[15,23,330]}," connected to a mask."]}]}," ",{p:[17,1,409],t:7,e:"ui-display",f:[{p:[18,3,425],t:7,e:"ui-section",a:{label:"Tank Pressure"},f:[{p:[19,7,467],t:7,e:"ui-bar",a:{min:"0",max:"1013",value:[{t:2,r:"data.tankPressure",p:[19,41,501]}],state:[{t:2,r:"tankPressureState",p:[20,16,540]}]},f:[{t:2,x:{r:["adata.tankPressure"],s:"Math.round(_0)"},p:[20,39,563]}," kPa"]}]}," ",{p:[22,3,631],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[23,5,674],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[23,18,687]}],max:[{t:2,r:"data.maxReleasePressure",p:[23,52,721]}],value:[{t:2,r:"data.releasePressure",p:[24,14,764]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[24,40,790]}," kPa"]}]}," ",{p:[26,3,861],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[27,5,906],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[27,38,939]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[29,5,1095],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[29,36,1126]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[31,5,1273],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[32,5,1368],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[32,35,1398]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}]}]},e.exports=r.extend(i.exports)},{205:205}],265:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[2,5,33],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[3,9,75],t:7,e:"span",f:[{t:2,x:{r:["adata.temperature"],s:"Math.fixed(_0,2)"},p:[3,15,81]}," K"]}]}," ",{p:[5,5,151],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[6,9,190],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.fixed(_0,2)"},p:[6,15,196]}," kPa"]}]}]}," ",{p:[9,1,276],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[10,5,311],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[11,9,347],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.on"],s:'_0?"power-off":"close"'},p:[11,26,364]}],style:[{t:2,x:{r:["data.on"],s:'_0?"selected":null'},p:[11,70,408]}],action:"power"},f:[{t:2,x:{r:["data.on"],s:'_0?"On":"Off"'},p:[12,28,469]}]}]}," ",{p:[14,5,531],t:7,e:"ui-section",a:{label:"Target Temperature"},f:[{p:[15,9,580],t:7,e:"ui-button",a:{icon:"fast-backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[15,48,619]}],action:"target",params:'{"adjust": -20}'}}," ",{p:[17,9,733],t:7,e:"ui-button",a:{icon:"backward",style:[{t:2,x:{r:["data.target","data.min"],s:'_0==_1?"disabled":null'},p:[17,43,767]}],action:"target",params:'{"adjust": -5}'}}," ",{p:[19,9,880],t:7,e:"ui-button",a:{icon:"pencil",action:"target",params:'{"target": "input"}'},f:[{t:2,x:{r:["adata.target"],s:"Math.fixed(_0,2)"},p:[19,79,950]}]}," ",{p:[20,9,1003],t:7,e:"ui-button",a:{icon:"forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[20,42,1036]}],action:"target",params:'{"adjust": 5}'}}," ",{p:[22,9,1148],t:7,e:"ui-button",a:{icon:"fast-forward",style:[{t:2,x:{r:["data.target","data.max"],s:'_0==_1?"disabled":null'},p:[22,47,1186]}],action:"target",params:'{"adjust": 20}'}}]}]}]},e.exports=r.extend(i.exports)},{205:205}],266:[function(t,e,n){var r=t(205),i={exports:{}};!function(e){"use strict";var n=t(273);e.exports={data:{filter:""},oninit:function(){var t=this;this.on({hover:function(t){var e=this.get("data.telecrystals");e>=t.context.params.cost&&this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,r,i){var a=t.findAll(".display:not(:first-child)");(0,n.filterMulti)(a,t.get("filter").toLowerCase())},{init:!1})}}}(i),i.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[29,7,770],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[29,24,787]}],placeholder:"Filter..."}}],n:50,r:"config.fancy",p:[28,5,742]}," ",{t:4,f:[{p:[32,7,872],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock"]}],n:50,r:"data.lockable",p:[31,5,843]}]},t:7,e:"ui-display",a:{title:"Uplink",button:0},f:[" ",{p:[35,3,958],t:7,e:"ui-section",a:{label:"Telecrystals",right:0},f:[{p:[36,5,1003],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.telecrystals"],s:'_0>0?"good":"bad"'},p:[36,18,1016]}]},f:[{t:2,r:"data.telecrystals",p:[36,62,1060]}," TC"]}]}]}," ",{t:4,f:[{p:[40,3,1154],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[40,22,1173]}]},f:[{t:4,f:[{p:[42,7,1212],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[42,26,1231]}],candystripe:0,right:0},f:[{p:[43,9,1269],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"name",p:[43,29,1289]},": ",{t:2,r:"desc",p:[43,39,1299]}],"tooltip-side":"left",state:[{t:2,x:{r:["data.telecrystals","hovered.cost","cost","hovered.item","name"],s:'_0<_2||(_0-_1<_2&&_3!=_4)?"disabled":null'},p:[44,18,1347]}],action:"buy",params:['{"category": "',{t:2,r:"category",p:[45,46,1512]},'", "item": ',{t:2,r:"name",p:[45,69,1535]},', "cost": ',{t:2,r:"cost",p:[45,87,1553]},"}"]},v:{hover:"hover",unhover:"unhover"},f:[{t:2,r:"cost",p:[46,49,1613]}," TC"]}]}],n:52,r:"items",p:[41,5,1189]}]}],n:52,r:"data.categories",p:[39,1,1125]}]},e.exports=r.extend(i.exports)},{205:205,273:273}],267:[function(t,e,n){var r=t(205),i={exports:{}};i.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{t:4,f:[{p:[3,5,42],t:7,e:"ui-section",a:{label:[{t:2,r:"color",p:[3,24,61]},{t:2,x:{r:["wire"],s:'_0?" ("+_0+")":""'},p:[3,33,70]}],labelcolor:[{t:2,r:"color",p:[3,80,117]}],candystripe:0,right:0},f:[{p:[4,7,154],t:7,e:"ui-button",a:{action:"cut",params:['{"wire":"',{t:2,r:"color",p:[4,48,195]},'"}']},f:[{t:2,x:{r:["cut"],s:'_0?"Mend":"Cut"'},p:[4,61,208]}]}," ",{p:[5,7,252],t:7,e:"ui-button",a:{action:"pulse",params:['{"wire":"',{t:2,r:"color",p:[5,50,295]},'"}']},f:["Pulse"]}," ",{p:[6,7,333],t:7,e:"ui-button",a:{action:"attach",params:['{"wire":"',{t:2,r:"color",p:[6,51,377]},'"}']},f:[{t:2,x:{r:["attached"],s:'_0?"Detach":"Attach"'},p:[6,64,390]}]}]}],n:52,r:"data.wires",p:[2,3,16]}]}," ",{t:4,f:[{p:[11,3,508],t:7,e:"ui-display",f:[{t:4,f:[{p:[13,7,555],t:7,e:"ui-section",f:[{t:2,r:".",p:[13,19,567]}]}],n:52,r:"data.status",p:[12,5,526]}]}],n:50,r:"data.status",p:[10,1,485]}]},e.exports=r.extend(i.exports)},{205:205}],268:[function(t,e,n){(function(e){"use strict";var n=t(205),r=e.interopRequireDefault(n);t(194),t(1),t(190),t(193);var i=t(269),a=e.interopRequireDefault(i),o=t(270),s=t(191),u=t(192),c=e.interopRequireDefault(u);r["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(274)),window.initialize=function(e){window.tgui||(window.tgui=new a["default"]({el:"#container",data:function(){var n=JSON.parse(e);return{constants:t(271),text:t(275),config:n.config,data:n.data,adata:n.data}}}))};var l=document.getElementById("data"),p=l.textContent,f=l.getAttribute("data-ref");"{}"!==p&&(window.initialize(p),l.remove()),(0,o.act)(f,"tgui:initialize"),(0,s.loadCSS)("https://cdn.jsdelivr.net/fontawesome/4.5.0/css/font-awesome.min.css");var d=new c["default"]("FontAwesome");d.check("").then(function(){return document.body.classList.add("icons")})["catch"](function(){return document.body.classList.add("no-icons")})}).call(this,t("babel/external-helpers"))},{1:1,190:190,191:191,192:192,193:193,194:194,205:205,269:269,270:270,271:271,274:274,275:275,"babel/external-helpers":"babel/external-helpers"}],269:[function(t,e,n){var r=t(205),i={exports:{}};!function(e){"use strict";var n=t(270),r=t(272);e.exports={components:{"ui-bar":t(206),"ui-button":t(207),"ui-display":t(208),"ui-input":t(209),"ui-linegraph":t(210),"ui-notice":t(211),"ui-section":t(213),"ui-subdisplay":t(214),"ui-tabs":t(215)},events:{enter:t(203).enter,space:t(203).space},transitions:{fade:t(204)},onconfig:function(){var e=this.get("config.interface"),n={airalarm:t(219),"airalarm/back":t(220),"airalarm/modes":t(221),"airalarm/scrubbers":t(222),"airalarm/status":t(223),"airalarm/thresholds":t(224),"airalarm/vents":t(225),airlock_electronics:t(226),apc:t(227),atmos_alert:t(228),atmos_control:t(229),atmos_filter:t(230),atmos_mixer:t(231),atmos_pump:t(232),brig_timer:t(233),canister:t(234),cargo:t(235),chem_dispenser:t(236),chem_heater:t(237),chem_master:t(238),crayon:t(239),cryo:t(240),emergency_shuttle_console:t(241),error:t(242),firealarm:t(243),intellicard:t(244),keycard_auth:t(245),mech_bay_power_console:t(246),mulebot:t(247),personal_crafting:t(248),portable_pump:t(249),portable_scrubber:t(250),power_monitor:t(251),radio:t(252),shuttle_manipulator:t(253),"shuttle_manipulator/modification":t(254),"shuttle_manipulator/status":t(255),"shuttle_manipulator/templates":t(256),sleeper:t(257),smes:t(258),solar_control:t(259),space_heater:t(260),station_alert:t(261),suit_storage_unit:t(262),tank_dispenser:t(263),tanks:t(264),thermomachine:t(265),uplink:t(266),wires:t(267)};e in n?this.components["interface"]=n[e]:this.components["interface"]=n.error},oninit:function(){this.observe("config.style",function(t,e,n){t&&document.body.classList.add(t),e&&document.body.classList.remove(e)})},oncomplete:function(){if(this.get("config.locked")){var t=(0,r.lock)(window.screenLeft,window.screenTop),e=t.x,i=t.y;(0,n.winset)(this.get("config.window"),"pos",e+","+i)}(0,n.winset)("mapwindow.map","focus",!0)}}}(i),i.exports.template={v:3,t:[" "," "," "," ",{p:[56,1,1874],t:7,e:"titlebar",f:[{t:3,r:"config.title",p:[56,11,1884]}]}," ",{p:[57,1,1915],t:7,e:"main",f:[{p:[58,3,1925],t:7,e:"warnings"}," ",{p:[59,3,1940],t:7,e:"interface"}]}," ",{p:[61,1,1963],t:7,e:"resize"}]},i.exports.components=i.exports.components||{};var a={warnings:t(218),titlebar:t(217),resize:t(212)};for(var o in a)a.hasOwnProperty(o)&&(i.exports.components[o]=a[o]);e.exports=r.extend(i.exports)},{203:203,204:204,205:205,206:206,207:207,208:208,209:209,210:210,211:211,212:212,213:213,214:214,215:215,217:217,218:218,219:219,220:220,221:221,222:222,223:223,224:224,225:225,226:226,227:227,228:228,229:229,230:230,231:231,232:232,233:233,234:234,235:235,236:236,237:237,238:238,239:239,240:240,241:241,242:242,243:243,244:244,245:245,246:246,247:247,248:248,249:249,250:250,251:251,252:252,253:253,254:254,255:255,256:256,257:257,258:258,259:259,260:260,261:261,262:262,263:263,264:264,265:265,266:266,267:267,270:270,272:272}],270:[function(t,e,n){"use strict";function r(){var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],e=arguments.length<=1||void 0===arguments[1]?"":arguments[1];return"byond://"+e+"?"+Object.keys(t).map(function(e){return o(e)+"="+o(t[e])}).join("&")}function i(t,e){var n=arguments.length<=2||void 0===arguments[2]?{}:arguments[2];window.location.href=r(Object.assign({src:t,action:e},n))}function a(t,e,n){var i;window.location.href=r((i={},i[t+"."+e]=n,i),"winset")}n.__esModule=!0,n.href=r,n.act=i,n.winset=a;var o=encodeURIComponent},{}],271:[function(t,e,n){"use strict";n.__esModule=!0;n.UI_INTERACTIVE=2,n.UI_UPDATE=1,n.UI_DISABLED=0,n.UI_CLOSE=-1},{}],272:[function(t,e,n){"use strict";function r(t,e){return 0>t?t=0:t+window.innerWidth>window.screen.availWidth&&(t=window.screen.availWidth-window.innerWidth),0>e?e=0:e+window.innerHeight>window.screen.availHeight&&(e=window.screen.availHeight-window.innerHeight),{x:t,y:e}}function i(t){if(t.preventDefault(),this.get("drag")){if(this.get("x")){var e=t.screenX-this.get("x")+window.screenLeft,n=t.screenY-this.get("y")+window.screenTop;if(this.get("config.locked")){var i=r(e,n);e=i.x,n=i.y}(0,s.winset)(this.get("config.window"),"pos",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}function a(t,e){return t=Math.clamp(100,window.screen.width,t),e=Math.clamp(100,window.screen.height,e),{x:t,y:e}}function o(t){if(t.preventDefault(),this.get("resize")){if(this.get("x")){var e=t.screenX-this.get("x")+window.innerWidth,n=t.screenY-this.get("y")+window.innerHeight,r=a(e,n);e=r.x,n=r.y,(0,s.winset)(this.get("config.window"),"size",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}n.__esModule=!0,n.lock=r,n.drag=i,n.sane=a,n.resize=o;var s=t(270)},{270:270}],273:[function(t,e,n){"use strict";function r(t,e){for(var n=t,r=Array.isArray(n),a=0,n=r?n:n[Symbol.iterator]();;){var o;if(r){if(a>=n.length)break;o=n[a++]}else{if(a=n.next(),a.done)break;o=a.value}var s=o;s.textContent.toLowerCase().includes(e)?(s.style.display="",i(s,e)):s.style.display="none"}}function i(t,e){for(var n=t.queryAll("section"),r=t.query("header").textContent.toLowerCase().includes(e),i=n,a=Array.isArray(i),o=0,i=a?i:i[Symbol.iterator]();;){var s;if(a){if(o>=i.length)break;s=i[o++]}else{if(o=i.next(),o.done)break;s=o.value}var u=s;r||u.textContent.toLowerCase().includes(e)?u.style.display="":u.style.display="none"}}n.__esModule=!0,n.filterMulti=r,n.filter=i},{}],274:[function(t,e,n){"use strict";function r(t,e,n){return Math.max(t,Math.min(n,e))}function i(t){var e=arguments.length<=1||void 0===arguments[1]?1:arguments[1];return+(Math.round(t+"e"+e)+"e-"+e)}n.__esModule=!0,n.clamp=r,n.fixed=i},{}],275:[function(t,e,n){"use strict";function r(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function i(t){return t.replace(/\w\S*/g,r)}function a(t,e){for(t=""+t;t.length1){for(var u=Array(o),c=0;o>c;c++)u[c]=arguments[c+3];n.children=u}return{$$typeof:t,type:e,key:void 0===r?null:""+r,ref:null,props:n,_owner:null}}}(),e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function r(i,a){try{var o=e[i](a),s=o.value}catch(u){return void n(u)}return o.done?void t(s):Promise.resolve(s).then(function(t){return r("next",t)},function(t){return r("throw",t)})}return r("next")})}},e.classCallCheck=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},e.createClass=function(){function t(t,e){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n},e.possibleConstructorReturn=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e},e.selfGlobal=void 0===t?self:t,e.set=function r(t,e,n,i){var a=Object.getOwnPropertyDescriptor(t,e);if(void 0===a){var o=Object.getPrototypeOf(t);null!==o&&r(o,e,n,i)}else if("value"in a&&a.writable)a.value=n;else{var s=a.set;void 0!==s&&s.call(i,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],r=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(r=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);r=!0);}catch(u){i=!0,a=u}finally{try{!r&&s["return"]&&s["return"]()}finally{if(i)throw a}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),e.slicedToArrayLoose=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){for(var n,r=[],i=t[Symbol.iterator]();!(n=i.next()).done&&(r.push(n.value),!e||r.length!==e););return r}throw new TypeError("Invalid attempt to destructure non-iterable instance")},e.taggedTemplateLiteral=function(t,e){return Object.freeze(Object.defineProperties(t,{raw:{value:Object.freeze(e)}}))},e.taggedTemplateLiteralLoose=function(t,e){return t.raw=e,t},e.temporalRef=function(t,e,n){if(t===n)throw new ReferenceError(e+" is not defined - temporal dead zone");return t},e.temporalUndefined={},e.toArray=function(t){return Array.isArray(t)?t:Array.from(t)},e.toConsumableArray=function(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e
+ Time Until Launch: {{data.timer_str}}
+
+
+ Engines: {{data.engines_started ? 'Online' : 'Idle'}}
+
+
+ Authorizations Remaining:
+ {{data.emagged ? "ERROR" : data.authorizations_remaining}}
+
+ AUTHORIZE
+
+
+ Repeal
+
+
+ Repeal All
+
+
+
+ {{#each data.authorizations}}
+ {{name}} ({{job}})
+ {{else}}
+ No authorizations.
+ {{/each}}
+
diff --git a/tgui/src/interfaces/shuttle_manipulator.ract b/tgui/src/interfaces/shuttle_manipulator.ract
new file mode 100644
index 00000000000..7fae2223cf9
--- /dev/null
+++ b/tgui/src/interfaces/shuttle_manipulator.ract
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{#if data.selected}}
+
+ {{/if}}
+ {{#if !data.selected}}
+ No shuttle selected.
+ {{/if}}
+
+
diff --git a/tgui/src/interfaces/shuttle_manipulator/modification.ract b/tgui/src/interfaces/shuttle_manipulator/modification.ract
new file mode 100644
index 00000000000..967628ef420
--- /dev/null
+++ b/tgui/src/interfaces/shuttle_manipulator/modification.ract
@@ -0,0 +1,38 @@
+
+ {{#if data.selected.description}}
+ {{data.selected.description}}
+ {{/if}}
+ {{#if data.selected.admin_notes}}
+ {{data.selected.admin_notes}}
+ {{/if}}
+
+
+{{#if data.existing_shuttle}}
+
+ Status: {{data.existing_shuttle.status}}
+ {{#if data.existing_shuttle.timer}}
+ ({{data.existing_shuttle.timeleft}})
+ {{/if}}
+
+ Jump To
+
+
+{{/if}}
+
+{{#if !data.existing_shuttle}}
+
+{{/if}}
+
+
+ Preview
+
+
+ Load
+
+
+
+
diff --git a/tgui/src/interfaces/shuttle_manipulator/status.ract b/tgui/src/interfaces/shuttle_manipulator/status.ract
new file mode 100644
index 00000000000..3b254c2c80d
--- /dev/null
+++ b/tgui/src/interfaces/shuttle_manipulator/status.ract
@@ -0,0 +1,11 @@
+{{#each data.shuttles}}
+
+ {{status}}
+ {{#if timer}}
+ ({{timeleft}})
+ {{/if}}
+
+ Jump To
+
+
+{{/each}}
diff --git a/tgui/src/interfaces/shuttle_manipulator/templates.ract b/tgui/src/interfaces/shuttle_manipulator/templates.ract
new file mode 100644
index 00000000000..f84696511e8
--- /dev/null
+++ b/tgui/src/interfaces/shuttle_manipulator/templates.ract
@@ -0,0 +1,24 @@
+
+ {{#each data.templates}}
+
+ {{#each templates}}
+
+ {{#if description}}
+ {{description}}
+ {{/if}}
+ {{#if admin_notes}}
+ {{admin_notes}}
+ {{/if}}
+
+
+ {{data.selected.shuttle_id == shuttle_id ? "Selected" : "Select"}}
+
+
+
+ {{/each}}
+
+ {{/each}}
+
diff --git a/tools/Runtime Condenser/Main.cpp b/tools/Runtime Condenser/Main.cpp
index f5410bd7981..c8127867645 100644
--- a/tools/Runtime Condenser/Main.cpp
+++ b/tools/Runtime Condenser/Main.cpp
@@ -1,7 +1,7 @@
/* Runtime Condenser by Nodrak
* Cleaned up and refactored by MrStonedOne
* This will sum up identical runtimes into one, giving a total of how many times it occured. The first occurance
- * of the runtime will log the proc, source, usr and src, the rest will just add to the total. Infinite loops will
+ * of the runtime will log the source, usr and src, the rest will just add to the total. Infinite loops will
* also be caught and displayed (if any) above the list of runtimes.
*
* How to use:
@@ -22,11 +22,19 @@
#include
#include
+#include
+#include
#include
#include
#include
#include
#include
+#include
+
+
+#define PROGRESS_FPS 10
+#define PROGRESS_BAR_INNER_WIDTH 50
+#define LINEBUFFER (512*1024) //512KiB
using namespace std;
@@ -44,182 +52,248 @@ struct harddel {
unsigned int count;
};
//What we use to read input
-string lastLine = "";
-string currentLine = "";
-string nextLine = "";
+string * lastLine = new string();
+string * currentLine = new string();
+string * nextLine = new string();
//Stores lines we want to keep to print out
-unordered_map storedRuntime;
-unordered_map storedInfiniteLoop;
-unordered_map storedHardDel;
+unordered_map storedRuntime;
+unordered_map storedInfiniteLoop;
+unordered_map storedHardDel;
//Stat tracking stuff for output
unsigned int totalRuntimes = 0;
-unsigned int totalUniqueRuntimes = 0;
unsigned int totalInfiniteLoops = 0;
-unsigned int totalUniqueInfiniteLoops = 0;
unsigned int totalHardDels = 0;
-unsigned int totalUniqueHardDels = 0;
-//Misc
-runtime* currentRuntime = NULL; //for storing the current runtime when we want to read the extra info on the next lines.
+bool endofbuffer = false;
//like substr, but returns an empty string if the string is smaller then start, rather then an exception.
-inline string safe_substr(string S, size_t start = 0, size_t end = string::npos) {
- if (start > S.length())
- start = S.length();
- return S.substr(start, end);
+inline string safe_substr(string * S, size_t start = 0, size_t end = string::npos) {
+ if (start > S->length())
+ start = S->length();
+ return S->substr(start, end);
}
-inline void forward_progress(ifstream &inputFile) {
+//getline() is slow as fucking balls. this is quicker because we prefill a buffer rather then read 1 byte at a time searching for newlines, lowering on i/o calls and overhead. (110MB/s vs 40MB/s on a 1.8GB file pre-filled into the disk cache)
+//if i wanted to make it even faster, I'd use a reading thread, a new line searching thread, another thread or four for searching for runtimes in the list to see if they are unique, and finally the main thread for displaying the progress bar. but fuck that noise.
+inline string * readline(FILE * f) {
+ static char buf[LINEBUFFER];
+ static size_t pos = 0;
+ static size_t size = 0;
+
+ for (size_t i = pos; i < LINEBUFFER; i++) {
+ char c = buf[i];
+ if (i >= size && (pos || i < LINEBUFFER-1)) {
+ if (feof(f) || ferror(f))
+ break;
+ if (size && pos) { //move current stuff to start of buffer
+ size -= pos;
+ i -= pos;
+ memmove(buf, &buf[pos], size);
+ }
+ //fill remaining buffer
+ size += fread(&buf[i], 1, LINEBUFFER-size-1, f);
+ pos = 0;
+ c = buf[i];
+ }
+ if (c == '\n') {
+ //trim off any newlines from the start
+ while (i > pos && (buf[pos] == '\r' || buf[pos] == '\n'))
+ pos++;
+ string * s = new string(&buf[pos], i-pos);
+ pos = i+1;
+ return s;
+ }
+
+ }
+ string * s = new string(&buf[pos], size-pos);
+ pos = 0;
+ size = 0;
+ endofbuffer = true;
+ return s;
+}
+
+inline void forward_progress(FILE * inputFile) {
+ delete(lastLine);
lastLine = currentLine;
currentLine = nextLine;
- getline(inputFile, nextLine);
+ nextLine = readline(inputFile);
//strip out any timestamps.
- if (nextLine.length() >= 10)
- if (nextLine[0] == '[' && nextLine[3] == ':' && nextLine[6] == ':' && nextLine[9] == ']')
- nextLine = nextLine.substr(10);
-}
+ if (nextLine->length() >= 10) {
+ if ((*nextLine)[0] == '[' && (*nextLine)[3] == ':' && (*nextLine)[6] == ':' && (*nextLine)[9] == ']')
+ nextLine->erase(0, 10);
+ }
+}
+//deallocates to, copys from to to.
+inline void string_send(string * &from, string * &to) {
+ delete(to);
+ to = new string(*from);
+}
+inline void printprogressbar(unsigned short progress /*as percent*/) {
+ double const modifer = 100.0L/(double)PROGRESS_BAR_INNER_WIDTH;
+ size_t bars = (double)progress/modifer;
+ cout << "\r[" << string(bars, '=') << ((progress < 100) ? ">" : "") << string(PROGRESS_BAR_INNER_WIDTH-(bars+((progress < 100) ? 1 : 0)), ' ') << "] " << progress << "%";
+ cout.flush();
+}
+
bool readFromFile() {
//Open file to read
- ifstream inputFile("Input.txt");
+ FILE * inputFile = fopen("Input.txt", "r");
- if (inputFile.is_open()) {
- while (!inputFile.eof()) { //Until end of file
- //Update our lines
- forward_progress(inputFile);
+ if (ferror(inputFile))
+ return false;
- //After finding a new runtime, check to see if there are extra values to store
- if (currentRuntime) {
- //Skip ahead
+ fseek(inputFile, 0, SEEK_END);
+ long long fileLength = ftell(inputFile);
+ fseek(inputFile, 0, SEEK_SET);
+ clock_t nextupdate = clock();
+ if (feof(inputFile))
+ return false; //empty file
+ do {
+ //Update our lines
+ forward_progress(inputFile);
+ //progress bar
+ if (clock() >= nextupdate) {
+ int dProgress = (int)(((long double)ftell(inputFile) / (long double)fileLength) * 100.0L);
+ printprogressbar(dProgress);
+ nextupdate = clock() + (CLOCKS_PER_SEC/PROGRESS_FPS);
+ }
+ //Found a runtime!
+ if (safe_substr(currentLine, 0, 14) == "runtime error:") {
+ if (currentLine->length() <= 17) { //empty runtime, check next line.
+ //runtime is on the line before this one. (byond bug)
+ if (nextLine->length() < 2) {
+ string_send(lastLine, nextLine);
+ }
forward_progress(inputFile);
-
- //If we find this, we have new stuff to store
- if (safe_substr(nextLine, 2, 4) == "usr:") {
- //Skip ahead
- forward_progress(inputFile);
-
- //Store more info
- currentRuntime->source = lastLine;
- currentRuntime->usr = currentLine;
- currentRuntime->src = nextLine;
-
- //Skip ahead again
- forward_progress(inputFile);
-
- if (safe_substr(nextLine, 2, 8) == "src.loc:")
- currentRuntime->loc = nextLine;
-
- }
- currentRuntime = NULL;
+ string * tmp = new string("runtime error: " + *currentLine);
+ string_send(tmp, currentLine);
+ delete(tmp);
}
-
- //Found an infinite loop!
- if (safe_substr(currentLine, 0, 23) == "Infinite loop suspected" || safe_substr(currentLine, 0, 31) == "Maximum recursion level reached") {
+ //we assign this to the right container in a moment.
+ unordered_map * storage_container;
+
+ //runtime is actually an infinite loop
+ if (safe_substr(currentLine, 15, 23) == "Infinite loop suspected" || safe_substr(currentLine, 15, 31) == "Maximum recursion level reached") {
+ //use our infinite loop container.
+ storage_container = &storedInfiniteLoop;
totalInfiniteLoops++;
- runtime* R = storedInfiniteLoop[currentLine];
- if (!R || R->text != currentLine) {
- R = new runtime;
- storedInfiniteLoop[currentLine] = R;
- R->text = currentLine;
- forward_progress(inputFile);
- R->proc = nextLine;
- R->count = 1;
- currentRuntime = R;
- totalUniqueInfiniteLoops++;
- } else { //existed already
- R->count++;
- }
-
- }
- //Found a runtime!
- else if (safe_substr(currentLine, 0, 14) == "runtime error:") {
- if (currentLine.length() <= 17) { //empty runtime, check next line.
- if (nextLine.length() < 2) //runtime is on the line before this one. (byond bug)
- nextLine = lastLine;
- forward_progress(inputFile);
- currentLine = "runtime error: " + currentLine;
- }
+ // skip the line about world.loop_checks
+ forward_progress(inputFile);
+ string_send(lastLine, currentLine);
+ } else {
+ //use the runtime container
+ storage_container = &storedRuntime;
totalRuntimes++;
- runtime* R = storedRuntime[currentLine];
- if (!R || R->text != currentLine) {
- R = new runtime;
- storedRuntime[currentLine] = R;
- R->text = currentLine;
- R->proc = nextLine;
- R->count = 1;
- currentRuntime = R;
- totalUniqueRuntimes++;
- } else { //existed already
- R->count++;
- }
}
- //Found a hard del!
- else if (safe_substr(currentLine, 0, 7) == "Path : ") {
- string deltype = safe_substr(currentLine, 7);
- if (deltype.substr(deltype.size()-1,1) == " ") //some times they have a single trailing space.
- deltype = deltype.substr(0, deltype.size()-1);
-
- unsigned int failures = strtoul(safe_substr(nextLine, 11).c_str(), NULL, 10);
- if (failures <= 0)
- continue;
-
- totalHardDels += failures;
- harddel * D = storedHardDel[deltype];
- if (!D || D->type != deltype) {
- D = new harddel;
- storedHardDel[deltype] = D;
- D->type = deltype;
- D->count = failures;
- totalUniqueHardDels++;
- } else {
- D->count += failures;
+ string key = *currentLine;
+ bool procfound = false; //so other things don't have to bother checking for this again.
+ if (safe_substr(nextLine, 0, 10) == "proc name:") {
+ key += *nextLine;
+ procfound = true;
+ }
+
+ //(get the address of a runtime from (a pointer to a container of runtimes)) to then store in a pointer to a runtime.
+ //(and who said pointers were hard.)
+ runtime* R = &((*storage_container)[key]);
+
+ //new
+ if (R->text != *currentLine) {
+ R->text = *currentLine;
+ if (procfound) {
+ R->proc = *nextLine;
+ forward_progress(inputFile);
}
+ R->count = 1;
+
+ //search for source file info
+ if (safe_substr(nextLine, 2, 12) == "source file:") {
+ R->source = *nextLine;
+ //skip again
+ forward_progress(inputFile);
+ }
+ //If we find this, we have new stuff to store
+ if (safe_substr(nextLine, 2, 4) == "usr:") {
+ forward_progress(inputFile);
+ forward_progress(inputFile);
+ //Store more info
+ R->usr = *lastLine;
+ R->src = *currentLine;
+ if (safe_substr(nextLine, 2, 8) == "src.loc:") {
+ R->loc = *nextLine;
+ forward_progress(inputFile);
+ }
+ }
+
+ } else { //existed already
+ R->count++;
+ if (procfound)
+ forward_progress(inputFile);
+ }
+
+ } else if (safe_substr(currentLine, 0, 7) == "Path : ") {
+ string deltype = safe_substr(currentLine, 7);
+ if (deltype.substr(deltype.size()-1,1) == " ") //some times they have a single trailing space.
+ deltype = deltype.substr(0, deltype.size()-1);
+
+ unsigned int failures = strtoul(safe_substr(nextLine, 11).c_str(), NULL, 10);
+ if (failures <= 0)
+ continue;
+
+ totalHardDels += failures;
+ harddel* D = &storedHardDel[deltype];
+ if (D->type != deltype) {
+ D->type = deltype;
+ D->count = failures;
+ } else {
+ D->count += failures;
}
}
- } else {
- return false;
- }
+ } while (!feof(inputFile) || !endofbuffer); //Until end of file
+ printprogressbar(100);
+ cout << endl;
return true;
}
-bool runtimeComp(const runtime* a, const runtime* b) {
- return a->count > b->count;
+bool runtimeComp(const runtime &a, const runtime &b) {
+ return a.count > b.count;
}
-bool hardDelComp(const harddel* a, const harddel* b) {
- return a->count > b->count;
+bool hardDelComp(const harddel &a, const harddel &b) {
+ return a.count > b.count;
}
bool writeToFile() {
//Open and clear the file
ofstream outputFile("Output.txt", ios::trunc);
-
+
if(outputFile.is_open()) {
- outputFile << "Note: The proc name, source file, src and usr are all from the FIRST of the identical runtimes. Everything else is cropped.\n\n";
- if(totalUniqueInfiniteLoops > 0)
- outputFile << "Total unique infinite loops: " << totalUniqueInfiniteLoops << endl;
+ outputFile << "Note: The source file, src and usr are all from the FIRST of the identical runtimes. Everything else is cropped.\n\n";
+ if(storedInfiniteLoop.size() > 0)
+ outputFile << "Total unique infinite loops: " << storedInfiniteLoop.size() << endl;
if(totalInfiniteLoops > 0)
outputFile << "Total infinite loops: " << totalInfiniteLoops << endl << endl;
- outputFile << "Total unique runtimes: " << totalUniqueRuntimes << endl;
+ outputFile << "Total unique runtimes: " << storedRuntime.size() << endl;
outputFile << "Total runtimes: " << totalRuntimes << endl << endl;
- if(totalUniqueHardDels > 0)
- outputFile << "Total unique hard deletions: " << totalUniqueHardDels << endl;
+ if(storedHardDel.size() > 0)
+ outputFile << "Total unique hard deletions: " << storedHardDel.size() << endl;
if(totalHardDels > 0)
outputFile << "Total hard deletions: " << totalHardDels << endl << endl;
//If we have infinite loops, display them first.
- if(totalInfiniteLoops > 0) {
- vector infiniteLoops;
+ if(storedInfiniteLoop.size() > 0) {
+ vector infiniteLoops;
infiniteLoops.reserve(storedInfiniteLoop.size());
- for (unordered_map::iterator it=storedInfiniteLoop.begin(); it != storedInfiniteLoop.end(); it++)
+ for (unordered_map::iterator it=storedInfiniteLoop.begin(); it != storedInfiniteLoop.end(); it++)
infiniteLoops.push_back(it->second);
+ storedInfiniteLoop.clear();
sort(infiniteLoops.begin(), infiniteLoops.end(), runtimeComp);
outputFile << "** Infinite loops **";
for (int i=0; i < infiniteLoops.size(); i++) {
- runtime* R = infiniteLoops[i];
+ runtime* R = &infiniteLoops[i];
outputFile << endl << endl << "The following infinite loop has occurred " << R->count << " time(s).\n";
outputFile << R->text << endl;
if(R->proc.length())
@@ -239,13 +313,14 @@ bool writeToFile() {
//Do runtimes next
outputFile << "** Runtimes **";
- vector runtimes;
+ vector runtimes;
runtimes.reserve(storedRuntime.size());
- for (unordered_map::iterator it=storedRuntime.begin(); it != storedRuntime.end(); it++)
+ for (unordered_map::iterator it=storedRuntime.begin(); it != storedRuntime.end(); it++)
runtimes.push_back(it->second);
+ storedRuntime.clear();
sort(runtimes.begin(), runtimes.end(), runtimeComp);
for (int i=0; i < runtimes.size(); i++) {
- runtime* R = runtimes[i];
+ runtime* R = &runtimes[i];
outputFile << endl << endl << "The following runtime has occurred " << R->count << " time(s).\n";
outputFile << R->text << endl;
if(R->proc.length())
@@ -264,13 +339,14 @@ bool writeToFile() {
//and finally, hard deletes
if(totalHardDels > 0) {
outputFile << endl << "** Hard deletions **";
- vector hardDels;
+ vector hardDels;
hardDels.reserve(storedHardDel.size());
- for (unordered_map::iterator it=storedHardDel.begin(); it != storedHardDel.end(); it++)
+ for (unordered_map::iterator it=storedHardDel.begin(); it != storedHardDel.end(); it++)
hardDels.push_back(it->second);
+ storedHardDel.clear();
sort(hardDels.begin(), hardDels.end(), hardDelComp);
for(int i=0; i < hardDels.size(); i++) {
- harddel* D = hardDels[i];
+ harddel* D = &hardDels[i];
outputFile << endl << D->type << " - " << D->count << " time(s).\n";
}
}
@@ -282,28 +358,30 @@ bool writeToFile() {
}
int main() {
+ ios_base::sync_with_stdio(false);
+ ios::sync_with_stdio(false);
char exit; //Used to stop the program from immediately exiting
-
+ cout << "Reading input.\n";
if(readFromFile()) {
cout << "Input read successfully!\n";
} else {
cout << "Input failed to open, shutting down.\n";
cout << "\nEnter any letter to quit.\n";
- cin >> exit;
+ exit = cin.get();
return 1;
}
-
+ cout << "Writing output.\n";
if(writeToFile()) {
cout << "Output was successful!\n";
cout << "\nEnter any letter to quit.\n";
- cin >> exit;
+ exit = cin.get();
return 0;
} else {
cout << "The output file could not be opened, shutting down.\n";
cout << "\nEnter any letter to quit.\n";
- cin >> exit;
+ exit = cin.get();
return 0;
}
diff --git a/tools/Runtime Condenser/Output.txt b/tools/Runtime Condenser/Output.txt
index 1bb4a90c78f..914571fea55 100644
--- a/tools/Runtime Condenser/Output.txt
+++ b/tools/Runtime Condenser/Output.txt
@@ -1,190 +1,438 @@
-Note: The proc name, source file, src and usr are all from the FIRST of the identical runtimes. Everything else is cropped.
+Note: The source file, src and usr are all from the FIRST of the identical runtimes. Everything else is cropped.
-Total unique runtimes: 25
-Total runtimes: 767
+Total unique runtimes: 28
+Total runtimes: 124723
+
+Total unique hard deletions: 108
+Total hard deletions: 1080
** Runtimes **
-The following runtime has occured 269 time(s).
-runtime error: Cannot read null.viruses
-proc name: cure (/datum/disease/proc/cure)
- source file: disease.dm,156
+The following runtime has occurred 123121 time(s).
+runtime error: Component is missing a pipenet! Rebuilding...
+
+
+The following runtime has occurred 709 time(s).
+runtime error: wrong type of value for list
+proc name: updateghostimages (/mob/dead/observer/proc/updateghostimages)
+ source file: observer.dm,488
+ usr: (src)
+ src: Argon IXV (/mob/dead/observer)
+ src.loc: the asteroid sand (217,137,8) (/turf/open/floor/plating/asteroid)
+
+
+The following runtime has occurred 696 time(s).
+runtime error: Cannot read null.air
+proc name: return air (/obj/machinery/atmospherics/pipe/return_air)
+ source file: pipes.dm,58
usr: null
- src: Space Retrovirus (/datum/disease/dnaspread)
+ src: the air supply pipe (/obj/machinery/atmospherics/pipe/manifold4w/supply/visible)
+ src.loc: the floor (169,130,1) (/turf/open/floor/plasteel)
-The following runtime has occured 199 time(s).
-runtime error: Cannot read null.has_gravity
-proc name: throw at (/atom/movable/proc/throw_at)
- source file: throwing.dm,194
- usr: Reese Marcotte (/mob/living/carbon/human)
- src: Reese Marcotte (/mob/living/carbon/human)
-
-
-The following runtime has occured 165 time(s).
-runtime error: Cannot read null.slot_flags
-proc name: db click (/mob/living/carbon/human/db_click)
- source file: inventory.dm,1083
- usr: Puke Chunks (/mob/living/carbon/human)
- src: Puke Chunks (/mob/living/carbon/human)
-
-
-The following runtime has occured 25 time(s).
-runtime error: Cannot read null.flags
-proc name: relaymove (/obj/effect/dummy/spell_jaunt/relaymove)
-
-
-The following runtime has occured 24 time(s).
-runtime error: Cannot read null.len
-proc name: mergeRecordLists (/proc/mergeRecordLists)
- source file: helpers.dm,260
- usr: Wintermute (/mob/living/silicon/ai)
+The following runtime has occurred 48 time(s).
+runtime error: bad resource file
+proc name: send asset (/proc/send_asset)
+ source file: asset_cache.dm,44
+ usr: Mariabella Pycroft-Crane (/mob/living/carbon/human)
src: null
-The following runtime has occured 20 time(s).
-runtime error: Cannot read null.total_volume
-proc name: attackby (/obj/machinery/reagentgrinder/attackby)
- source file: Chemistry-Machinery.dm,751
- usr: Reese Marcotte (/mob/living/carbon/human)
- src: All-In-One Grinder (/obj/machinery/reagentgrinder)
-
-
-The following runtime has occured 16 time(s).
-runtime error: Cannot read null.broadcasting
-proc name: radio menu (/mob/living/silicon/robot/proc/radio_menu)
- source file: robot.dm,857
- usr: Engineering Cyborg -432 (/mob/living/silicon/robot)
- src: Engineering Cyborg -432 (/mob/living/silicon/robot)
-
-
-The following runtime has occured 7 time(s).
-runtime error: unexpected stat
-proc name: Stat (/mob/living/silicon/robot/Stat)
- source file: robot.dm,227
- usr: Michigan Slim (/mob/living/carbon/human)
- src: Engineering Cyborg -133 (/mob/living/silicon/robot)
-
-
-The following runtime has occured 7 time(s).
-runtime error: Cannot read null.current
-proc name: check completion (/datum/objective/download/check_completion)
- source file: objective.dm,411
- usr: null
- src: /datum/objective/download (/datum/objective/download)
-
-
-The following runtime has occured 6 time(s).
-runtime error: Cannot create objects of type null.
-proc name: Topic (/obj/machinery/computer/rdconsole/Topic)
- source file: rdconsole.dm,381
- usr: Matthew Hoff (/mob/living/carbon/human)
- src: Core R&D Console (/obj/machinery/computer/rdconsole/core)
-
-
-The following runtime has occured 6 time(s).
-runtime error: Cannot read null.fields
-proc name: mergeRecordLists (/proc/mergeRecordLists)
- source file: helpers.dm,263
- usr: Wintermute (/mob/living/silicon/ai)
- src: null
-
-
-The following runtime has occured 3 time(s).
-runtime error: undefined variable /client/var/loc
-proc name: get turf (/proc/get_turf)
- source file: helper_procs.dm,38
- usr: the ghost (/mob/dead/observer)
- src: null
-
-
-The following runtime has occured 3 time(s).
-runtime error: Cannot read null.nodes
-proc name: merge powernets (/datum/powernet/proc/merge_powernets)
- source file: power.dm,401
- usr: Darin Keppel (/mob/living/carbon/human)
- src: /datum/powernet (/datum/powernet)
-
-
-The following runtime has occured 3 time(s).
-runtime error: Cannot read null.reagents
-proc name: fire syringe (/obj/item/weapon/gun/syringe/proc/fire_syringe)
-
-
-The following runtime has occured 2 time(s).
-runtime error: undefined proc or verb /obj/machinery/space_heater/attack().
-
-
-
-The following runtime has occured 2 time(s).
+The following runtime has occurred 30 time(s).
runtime error: list index out of bounds
-proc name: mergeConnectedNetworksOnTurf (/obj/structure/cable/proc/mergeConnectedNetworksOnTurf)
- source file: cable.dm,520
- usr: Josue Sandford (/mob/living/carbon/human)
- src: the power cable (/obj/structure/cable)
-
-
-The following runtime has occured 2 time(s).
-runtime error: Cannot read null.loc
-proc name: Life (/mob/living/simple_animal/corgi/Ian/Life)
- source file: corgi.dm,304
+proc name: GetGreaterChild (/Heap/proc/GetGreaterChild)
+ source file: heap.dm,62
usr: null
- src: Captain Ian (/mob/living/simple_animal/corgi/Ian)
+ src: /Heap (/Heap)
-The following runtime has occured 1 time(s).
-runtime error: undefined proc or verb /obj/machinery/portable_atmospherics/canister/toxins/attack().
+The following runtime has occurred 21 time(s).
+runtime error: undefined proc or verb /turf/closed/wall/shuttle/high pressure movements().
-
-The following runtime has occured 1 time(s).
-runtime error: undefined variable /datum/preferences/var/fields
-proc name: Topic (/obj/machinery/computer/cloning/Topic)
- source file: cloning.dm,370
- usr: Logan Graves (/mob/living/carbon/human)
- src: Cloning console (/obj/machinery/computer/cloning)
+The following runtime has occurred 15 time(s).
+runtime error: Simple animal being instantiated in nullspace
+proc name: stack trace (/proc/stack_trace)
+ source file: unsorted.dm,1358
+ usr: the Securitron (/mob/living/simple_animal/bot/secbot)
+ src: null
-The following runtime has occured 1 time(s).
-runtime error: undefined variable /turf/simulated/floor/plating/var/mineral
-proc name: attackby (/turf/simulated/wall/attackby)
- source file: turf.dm,600
- usr: Monte Smail (/mob/living/carbon/human)
- src: the plating (176,172,5) (/turf/simulated/floor/plating)
-
-
-The following runtime has occured 1 time(s).
-runtime error: Cannot read null.blood_DNA
-proc name: update inv w uniform (/mob/living/carbon/human/update_inv_w_uniform)
- source file: update_icons.dm,372
+The following runtime has occurred 12 time(s).
+runtime error: Cannot read null.viewavail
+proc name: record (/obj/machinery/computer/monitor/proc/record)
+ source file: monitor.dm,41
usr: null
- src: Chip Harshman (/mob/living/carbon/human)
+ src: Engineering Power Monitoring C... (/obj/machinery/computer/monitor)
+ src.loc: space (154,151,1) (/turf/open/space)
-The following runtime has occured 1 time(s).
-runtime error: Cannot execute null.dropped().
-proc name: drop l hand (/mob/proc/drop_l_hand)
- source file: inventory.dm,104
- usr: Jeb Stone (/mob/living/carbon/human)
- src: Jeb Stone (/mob/living/carbon/human)
+The following runtime has occurred 11 time(s).
+runtime error: Cannot read null.selection_color
+proc name: SetChoices (/datum/preferences/proc/SetChoices)
+ source file: preferences.dm,543
+ usr: Sweetestbro (/mob/new_player)
+ src: /datum/preferences (/datum/preferences)
-The following runtime has occured 1 time(s).
-runtime error: Cannot read null.w_class
-proc name: attackby (/obj/item/weapon/storage/attackby)
- source file: storage.dm,187
- usr: Samuel York (/mob/living/carbon/human)
- src: the backpack (/obj/item/weapon/storage/backpack)
+The following runtime has occurred 10 time(s).
+runtime error: Cannot execute null.add turf().
+proc name: process cell (/turf/open/process_cell)
+ source file: LINDA_turf_tile.dm,172
+ usr: null
+ src: the plating (102,135,1) (/turf/open/floor/plating)
-The following runtime has occured 1 time(s).
-runtime error: Cannot read null.amount
-proc name: attackby (/obj/machinery/constructable_frame/machine_frame/attackby)
- source file: constructable_frame.dm,27
- usr: Quinton Bould (/mob/living/carbon/human)
- src: the machine frame (/obj/machinery/constructable_frame/machine_frame)
+The following runtime has occurred 9 time(s).
+runtime error: Cannot read null.thrownby
+proc name: hitby (/mob/living/carbon/human/hitby)
+ source file: human_defense.dm,353
+ usr: the monkey (662) (/mob/living/carbon/monkey)
+ src: Sydney Hujsak (/mob/living/carbon/human)
-The following runtime has occured 1 time(s).
-runtime error: Cannot modify null.status.
-proc name: death (/mob/living/silicon/robot/death)
+The following runtime has occurred 8 time(s).
+runtime error: Cannot execute null.HasProximity().
+proc name: Entered (/turf/Entered)
+ source file: turf.dm,95
+ usr: 0
+ src: the floor (99,147,1) (/turf/open/floor/plasteel)
+
+
+The following runtime has occurred 5 time(s).
+runtime error: bad client
+proc name: open (/datum/browser/proc/open)
+ source file: browser.dm,106
+ usr: Timothy Catleay (/mob/living/carbon/human)
+ src: /datum/browser (/datum/browser)
+
+
+The following runtime has occurred 4 time(s).
+runtime error: return_file_text(): File not found
+
+
+The following runtime has occurred 4 time(s).
+runtime error: Cannot execute null.merge().
+proc name: assume air (/turf/open/assume_air)
+ source file: LINDA_turf_tile.dm,56
+ usr: null
+ src: the engraved floor (95,49,5) (/turf/open/floor/engine/cult)
+
+
+The following runtime has occurred 3 time(s).
+runtime error: Cannot read null.gases
+proc name: tile graphic (/turf/open/proc/tile_graphic)
+ source file: LINDA_turf_tile.dm,110
+ usr: null
+ src: the floor (81,52,5) (/turf/open/floor/plasteel/freezer)
+
+
+The following runtime has occurred 3 time(s).
+runtime error: undefined proc or verb /turf/closed/wall/high pressure movements().
+
+
+The following runtime has occurred 2 time(s).
+runtime error: Cannot modify null.loc.
+proc name: ui act (/obj/machinery/suit_storage_unit/ui_act)
+ source file: suit_storage_unit.dm,359
+ usr: Cy Carter (/mob/living/carbon/human)
+ src: the suit storage unit (/obj/machinery/suit_storage_unit/standard_unit)
+
+
+The following runtime has occurred 2 time(s).
+runtime error: Cannot execute null.remove().
+proc name: remove air (/turf/open/remove_air)
+ source file: LINDA_turf_tile.dm,62
+ usr: null
+ src: the engraved floor (171,210,5) (/turf/open/floor/engine/cult)
+
+
+The following runtime has occurred 2 time(s).
+runtime error: Cannot execute null.return pressure().
+proc name: update pressure (/obj/mecha/working/ripley/proc/update_pressure)
+ source file: ripley.dm,150
+ usr: 0
+ src: the APLU \"Ripley\" (/obj/mecha/working/ripley)
+ src.loc: the floor (88,45,5) (/turf/open/floor/plasteel/freezer)
+
+
+The following runtime has occurred 1 time(s).
+runtime error: list index out of bounds
+proc name: Topic (/datum/song/Topic)
+ source file: musician.dm,208
+ usr: Francisco Luque (/mob/living/carbon/human)
+ src: Untitled (/datum/song/handheld)
+
+
+The following runtime has occurred 1 time(s).
+runtime error: undefined proc or verb /turf/closed/wall/r_wall/high pressure movements().
+
+
+The following runtime has occurred 1 time(s).
+runtime error: bad client
+proc name: show (/datum/html_interface/proc/show)
+ source file: html_interface.dm,227
+ usr: Mariabella Pycroft-Crane (/mob/living/carbon/human)
+ src: /datum/html_interface/nanotras... (/datum/html_interface/nanotrasen)
+
+
+The following runtime has occurred 1 time(s).
+runtime error: Cannot execute null.GetAtmosAdjacentTurfs().
+proc name: spread smoke (/obj/effect/particle_effect/smoke/proc/spread_smoke)
+ source file: effects_smoke.dm,74
+ usr: null
+ src: the smoke (/obj/effect/particle_effect/smoke)
+ src.loc: null
+
+
+The following runtime has occurred 1 time(s).
+runtime error: Cannot read null.pipe_vision_img
+proc name: add ventcrawl (/mob/living/proc/add_ventcrawl)
+ source file: ventcrawling.dm,94
+ usr: (src)
+ src: the monkey (809) (/mob/living/carbon/monkey)
+ src.loc: the Cloning Lab vent pump #1 (/obj/machinery/atmospherics/components/unary/vent_pump)
+
+
+The following runtime has occurred 1 time(s).
+runtime error: Cannot execute null.s click().
+proc name: Click (/obj/screen/grab/Click)
+ source file: screen_objects.dm,167
+ usr: Hisstian Weston Chandler (/mob/living/carbon/human)
+ src: the disarm/kill (/obj/screen/grab)
+
+
+The following runtime has occurred 1 time(s).
+runtime error: list index out of bounds
+proc name: mod list add (/client/proc/mod_list_add)
+ source file: modifyvariables.dm,161
+ usr: the potted plant (/mob/dead/observer)
+ src: MimicFaux (/client)
+
+
+The following runtime has occurred 1 time(s).
+runtime error: Cannot execute null.get reagent amount().
+proc name: get fuel (/obj/item/weapon/weldingtool/proc/get_fuel)
+ source file: tools.dm,334
+ usr: null
+ src: the welding tool (/obj/item/weapon/weldingtool)
+ src.loc: null
+
+
+
+** Hard deletions **
+/obj/structure/lattice - 499 time(s).
+
+/mob/new_player - 91 time(s).
+
+/image - 87 time(s).
+
+/mob/dead/observer - 42 time(s).
+
+/datum/mind - 36 time(s).
+
+/obj/item/radio/integrated/signal - 31 time(s).
+
+/obj/effect/ebeam - 24 time(s).
+
+/obj/machinery/camera - 15 time(s).
+
+/obj/machinery/atmospherics/components/binary/pump - 14 time(s).
+
+/obj/effect/decal/cleanable/trail_holder - 10 time(s).
+
+/obj/screen/buildmode/bdir - 10 time(s).
+
+/obj/screen/buildmode/help - 10 time(s).
+
+/obj/screen/buildmode/mode - 10 time(s).
+
+/obj/screen/buildmode/quit - 10 time(s).
+
+/obj/effect/landmark/start - 8 time(s).
+
+/obj/machinery/status_display - 7 time(s).
+
+/obj/item/stack/sheet/cardboard - 7 time(s).
+
+/datum/gas_mixture - 6 time(s).
+
+/obj/machinery/requests_console - 6 time(s).
+
+/obj/machinery/airalarm - 5 time(s).
+
+/obj/machinery/atmospherics/components/unary/vent_pump - 5 time(s).
+
+/obj/item/organ/hivelord_core/legion - 5 time(s).
+
+/obj/item/weapon/electronics/airlock - 5 time(s).
+
+/obj/effect/mist - 5 time(s).
+
+/obj/machinery/camera/portable - 5 time(s).
+
+/obj/machinery/porta_turret - 4 time(s).
+
+/obj/machinery/atmospherics/components/unary/portables_connector/visible - 4 time(s).
+
+/obj/effect/decal/cleanable/blood/gibs - 4 time(s).
+
+/obj/machinery/atmospherics/components/unary/vent_scrubber - 4 time(s).
+
+/obj/item/weapon/tank/internals/oxygen - 3 time(s).
+
+/obj/item/device/assembly/signaler - 3 time(s).
+
+/datum/event - 3 time(s).
+
+/obj/effect/decal/cleanable/blood/footprints - 3 time(s).
+
+/obj/machinery/camera/emp_proof - 3 time(s).
+
+/obj/item/weapon/tank/internals/plasma - 3 time(s).
+
+/obj/machinery/camera_assembly - 3 time(s).
+
+/obj/machinery/camera/motion - 3 time(s).
+
+/obj/machinery/atmospherics/pipe/simple/supply/hidden - 2 time(s).
+
+/obj/item/mecha_parts/chassis/ripley - 2 time(s).
+
+/obj/item/stack/sheet/metal - 2 time(s).
+
+/obj/machinery/door/airlock/external - 2 time(s).
+
+/obj/machinery/suit_storage_unit/engine - 2 time(s).
+
+/obj/item/weapon/stock_parts/cell - 2 time(s).
+
+/obj/machinery/computer/communications - 2 time(s).
+
+/obj/item/clothing/tie/petcollar - 2 time(s).
+
+/obj/machinery/atmospherics/components/binary/passive_gate - 2 time(s).
+
+/obj/machinery/power/apc - 2 time(s).
+
+/obj/structure/table/glass - 2 time(s).
+
+/obj/item/stack/cable_coil - 2 time(s).
+
+/obj/effect/decal/cleanable/blood/gibs/core - 2 time(s).
+
+/obj/machinery/atmospherics/components/unary/heat_exchanger - 2 time(s).
+
+/obj/item/mecha_parts/chassis/firefighter - 2 time(s).
+
+/obj/machinery/porta_turret/ai - 2 time(s).
+
+/obj/structure/closet/secure_closet/brig - 1 time(s).
+
+/obj/effect/landmark/river_waypoint - 1 time(s).
+
+/obj/item/clothing/head/chaplain_hood - 1 time(s).
+
+/obj/machinery/door/window/eastleft - 1 time(s).
+
+/obj/item/weapon/staff/broom - 1 time(s).
+
+/obj/machinery/door/window - 1 time(s).
+
+/obj/machinery/computer/pandemic - 1 time(s).
+
+/obj/machinery/door/airlock/research - 1 time(s).
+
+/obj/machinery/portable_atmospherics/pump - 1 time(s).
+
+/obj/machinery/suit_storage_unit/ce - 1 time(s).
+
+/obj/machinery/power/grounding_rod - 1 time(s).
+
+/mob/camera/aiEye - 1 time(s).
+
+/datum/data/record - 1 time(s).
+
+/obj/machinery/firealarm - 1 time(s).
+
+/obj/machinery/porta_turret_cover - 1 time(s).
+
+/obj/mecha/working/ripley - 1 time(s).
+
+/obj/machinery/portable_atmospherics/scrubber - 1 time(s).
+
+/obj/effect/decal/cleanable/robot_debris/old - 1 time(s).
+
+/obj/machinery/biogenerator - 1 time(s).
+
+/obj/machinery/plantgenes - 1 time(s).
+
+/datum/reagents - 1 time(s).
+
+/obj/machinery/vending/hydronutrients - 1 time(s).
+
+/obj/machinery/recycler - 1 time(s).
+
+/obj/item/weapon/tank/jetpack/suit - 1 time(s).
+
+/obj/machinery/vending/hydroseeds - 1 time(s).
+
+/obj/structure/table/optable - 1 time(s).
+
+/obj/item/device/pda/ai/pai - 1 time(s).
+
+/obj/item/stack/sheet/mineral/plasma - 1 time(s).
+
+/obj/machinery/chem_dispenser/drinks/beer - 1 time(s).
+
+/obj/structure/closet/crate - 1 time(s).
+
+/obj/item/stack/sheet/animalhide/monkey - 1 time(s).
+
+/obj/effect/hallucination/simple/singularity - 1 time(s).
+
+/obj - 1 time(s).
+
+/obj/item/clothing/head/explorer - 1 time(s).
+
+/obj/screen/grab - 1 time(s).
+
+/obj/item/weapon/grab - 1 time(s).
+
+/obj/machinery/atmospherics/components/unary/thermomachine/heater - 1 time(s).
+
+/obj/machinery/atmospherics/components/unary/thermomachine/freezer - 1 time(s).
+
+/obj/machinery/door/poddoor - 1 time(s).
+
+/obj/item/weapon/cartridge/hos - 1 time(s).
+
+/obj/item/device/pda/heads/hos - 1 time(s).
+
+/obj/item/ammo_casing/energy/electrode - 1 time(s).
+
+/obj/effect/mob_spawn/human/alive/space_bar_patron - 1 time(s).
+
+/obj/effect/blob/core - 1 time(s).
+
+/obj/machinery/clonepod - 1 time(s).
+
+/obj/item/weapon/reagent_containers/spray/mister/janitor - 1 time(s).
+
+/obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf - 1 time(s).
+
+/obj/item/weapon/card/id/syndicate - 1 time(s).
+
+/obj/item/device/radio - 1 time(s).
+
+/obj/machinery/r_n_d/circuit_imprinter - 1 time(s).
+
+/obj/machinery/door/window/brigdoor - 1 time(s).
+
+/obj/machinery/computer/rdconsole/core - 1 time(s).
+
+/obj/structure/cable/yellow - 1 time(s).
+
+/obj/machinery/disposal/bin - 1 time(s).
+
+/obj/effect/mob_spawn/human/prisoner_transport - 1 time(s).
diff --git a/tools/Runtime Condenser/RuntimeCondenser.exe b/tools/Runtime Condenser/RuntimeCondenser.exe
index f32fe9d6ece..e53102f219a 100644
Binary files a/tools/Runtime Condenser/RuntimeCondenser.exe and b/tools/Runtime Condenser/RuntimeCondenser.exe differ
diff --git a/tools/github_webhook_processor.php b/tools/github_webhook_processor.php
index 766f0310302..39189c88428 100644
--- a/tools/github_webhook_processor.php
+++ b/tools/github_webhook_processor.php
@@ -20,7 +20,7 @@
//Github lets you have it sign the message with a secret that you can validate. This prevents people from faking events.
//This var should match the secret you configured for this webhook on github.
-//set to NULL (no quotes) to disable validation.
+//This is required as otherwise somebody could trick the script into leaking the api key.
$hookSecret = '08ajh0qj93209qj90jfq932j32r';
//Api key for pushing changelogs.
@@ -49,21 +49,22 @@ set_exception_handler(function($e) {
die();
});
$rawPost = NULL;
-if ($hookSecret !== NULL) {
- if (!isset($_SERVER['HTTP_X_HUB_SIGNATURE'])) {
- throw new \Exception("HTTP header 'X-Hub-Signature' is missing.");
- } elseif (!extension_loaded('hash')) {
- throw new \Exception("Missing 'hash' extension to check the secret code validity.");
- }
- list($algo, $hash) = explode('=', $_SERVER['HTTP_X_HUB_SIGNATURE'], 2) + array('', '');
- if (!in_array($algo, hash_algos(), TRUE)) {
- throw new \Exception("Hash algorithm '$algo' is not supported.");
- }
- $rawPost = file_get_contents('php://input');
- if ($hash !== hash_hmac($algo, $rawPost, $hookSecret)) {
- throw new \Exception('Hook secret does not match.');
- }
+if (!$hookSecret || $hookSecret == '08ajh0qj93209qj90jfq932j32r')
+ throw new \Exception("Hook secret is required and can not be default");
+if (!isset($_SERVER['HTTP_X_HUB_SIGNATURE'])) {
+ throw new \Exception("HTTP header 'X-Hub-Signature' is missing.");
+} elseif (!extension_loaded('hash')) {
+ throw new \Exception("Missing 'hash' extension to check the secret code validity.");
}
+list($algo, $hash) = explode('=', $_SERVER['HTTP_X_HUB_SIGNATURE'], 2) + array('', '');
+if (!in_array($algo, hash_algos(), TRUE)) {
+ throw new \Exception("Hash algorithm '$algo' is not supported.");
+}
+$rawPost = file_get_contents('php://input');
+if ($hash !== hash_hmac($algo, $rawPost, $hookSecret)) {
+ throw new \Exception('Hook secret does not match.');
+}
+
$contenttype = null;
//apache and nginx/fastcgi/phpfpm call this two different things.
if (!isset($_SERVER['HTTP_CONTENT_TYPE'])) {
diff --git a/tools/linux_build.py b/tools/linux_build.py
new file mode 100755
index 00000000000..00ab4698c69
--- /dev/null
+++ b/tools/linux_build.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python
+
+import subprocess
+import os
+import sys
+import argparse
+from subprocess import PIPE, STDOUT
+
+null = open("/dev/null", "wb")
+
+def wait(p):
+ rc = p.wait()
+ if rc != 0:
+ p = play("sound/misc/compiler-failure.ogg")
+ p.wait()
+ assert p.returncode == 0
+ sys.exit(rc)
+
+def play(soundfile):
+ p = subprocess.Popen(["play", soundfile], stdout=null, stderr=null)
+ assert p.wait() == 0
+ return p
+
+def stage1():
+ p = subprocess.Popen("(cd tgui; /bin/bash ./build.sh)", shell=True)
+ wait(p)
+ play("sound/misc/compiler-stage1.ogg")
+
+def stage2():
+ p = subprocess.Popen("DreamMaker tgstation.dme", shell=True)
+ wait(p)
+
+def stage3():
+ play("sound/misc/compiler-stage2.ogg")
+ logfile = open('server.log~','w')
+ p = subprocess.Popen(
+ "DreamDaemon tgstation.dmb 25001 -trusted",
+ shell=True, stdout=PIPE, stderr=STDOUT)
+ try:
+ while p.returncode is None:
+ stdout = p.stdout.readline()
+ t = "Initializations complete."
+ if t in stdout:
+ play("sound/misc/server-ready.ogg")
+ sys.stdout.write(stdout)
+ sys.stdout.flush()
+ logfile.write(stdout)
+ finally:
+ logfile.flush()
+ os.fsync(logfile.fileno())
+ logfile.close()
+ p.kill()
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument('-s','---stage',default=1,type=int)
+ parser.add_argument('--only',action='store_true')
+ args = parser.parse_args()
+ stage = args.stage
+ assert stage in (1,2,3)
+ if stage == 1:
+ stage1()
+ if not args.only:
+ stage = 2
+ if stage == 2:
+ stage2()
+ if not args.only:
+ stage = 3
+ if stage == 3:
+ stage3()
+
+if __name__=='__main__':
+ try:
+ main()
+ except KeyboardInterrupt:
+ pass