diff --git a/.gitignore b/.gitignore index c8e3ed4fac5..281548f93c4 100644 --- a/.gitignore +++ b/.gitignore @@ -180,3 +180,5 @@ Temporary Items .apdisk + +*.before \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 747a618c804..d0aeab0904c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -41,7 +41,7 @@ Maintainers can revert your changes if they feel they are not worth maintaining As mentioned before, you are expected to follow these specifications in order to make everyone's lives easier, it will also save you and us time, with having to make the changes and us having to tell you what to change. Thank you for reading this section. -###Object Oriented code +###Object Oriented code As BYOND's Dream Maker is an object oriented language, code must be object oriented when possible in order to be more flexible when adding content to it. If you are unfamiliar with this concept, it is highly recommended you look it up. ###All Byond paths must contain the full path. @@ -63,7 +63,7 @@ datum code proc2() code - + datum2 varname1 = 0 proc @@ -135,9 +135,20 @@ Copying code from one place to another maybe suitable for small short time proje Instead you can use object orientation, or simply placing repeated code in a function, to obey this specification easily. +###Startup/Runtime tradeoffs with lists and the "hidden" init proc +First, read the comments in this byond thread, starting here:http://www.byond.com/forum/?post=2086980&page=2#comment19776775 + +There are two key points here: + +1) Defining a list in the type definition incurs a hidden proc call - init, if you must define a list at startup, do so in New() and avoid the overhead of a second call (init() and then new()) + +2)Offsets list creation overhead to the point where the list is actually required (which for many objects, may be never at all). + +Remember, this tradeoff makes sense in many cases but not all, you should think carefully about your implementation before deciding if this is an appropriate thing to do + ###No magic numbers or strings Make these #defines with a name that more clearly states what it's for. - + ###Control statements: (if,while,for,etc) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_gym.dmm b/_maps/RandomRuins/LavaRuins/lavaland_gym.dmm deleted file mode 100644 index c6485f19bd7..00000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_gym.dmm +++ /dev/null @@ -1,53 +0,0 @@ -"a" = (/turf/closed/mineral/volcanic/lava_land_surface,/area/lavaland/surface/outdoors) -"b" = (/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"c" = (/turf/closed/wall/r_wall,/area/ruin/powered) -"d" = (/obj/structure/closet,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"e" = (/obj/structure/closet,/mob/living/simple_animal/hostile/zombie,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"f" = (/obj/structure/punching_bag,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"g" = (/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"h" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/item/weapon/shard{icon_state = "medium"},/mob/living/simple_animal/hostile/zombie/gymboss,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"i" = (/obj/structure/window{icon_state = "window";dir = 1},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"j" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/structure/window{icon_state = "window";dir = 4},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"k" = (/obj/effect/decal/cleanable/blood,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"l" = (/obj/structure/weightlifter,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"m" = (/obj/structure/window{icon_state = "window";dir = 8},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"n" = (/obj/structure/window{icon_state = "window";dir = 4},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"o" = (/obj/structure/stacklifter,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"p" = (/obj/structure/window,/obj/structure/window{icon_state = "window";dir = 8},/obj/effect/decal/cleanable/blood,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"q" = (/obj/structure/window,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"r" = (/obj/structure/window,/obj/item/weapon/shard,/mob/living/simple_animal/hostile/zombie/darkholme,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"s" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter4 (NORTH)";icon_state = "splatter4";dir = 1},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"t" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter6 (EAST)";icon_state = "splatter6";dir = 4},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (NORTH)";icon_state = "tracks";dir = 1},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-gib3";icon_state = "gib3"},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"u" = (/obj/machinery/door/airlock/external,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"v" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (EAST)";icon_state = "tracks";dir = 4},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (NORTHEAST)";icon_state = "tracks";dir = 5},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"w" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (EAST)";icon_state = "tracks";dir = 4},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (SOUTHEAST)";icon_state = "tracks";dir = 6},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"x" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter5";icon_state = "splatter5"},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (EAST)";icon_state = "tracks";dir = 4},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"y" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter4 (NORTH)";icon_state = "splatter4";dir = 1},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter6 (NORTH)";icon_state = "splatter6";dir = 1},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"z" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter5";icon_state = "splatter5"},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"A" = (/mob/living/simple_animal/hostile/zombie,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"B" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/machinery/shower,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"C" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/machinery/shower,/mob/living/simple_animal/hostile/zombie,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"D" = (/turf/template_noop,/area/template_noop) - -(1,1,1) = {" -DDDDDDDDDDDDDDDDDDDD -DDDDDDDDDDDDDDDDDDDD -DDDDDDDDDDDDDDDDDDDD -DDDDDDDDDDDDDDDDDDDD -DDDccccccccccccDDDDD -DDDcdeddddddedcbDDDD -DDDcfgghiijkglcbaDDD -DDDcfggmgkngglcbbbDD -DDDcfggmggnggocbbbDD -DDDcfggpqqrggocstbbD -DDDcgkgggggggkuvwxbD -DDDcuucccccccccyzbbD -DDDcgAgggggggAcbbbbD -DDDcggggggAgggcbbbDD -DDDcBCBBggBBBBcbbDDD -DDDcgggggggAggcbDDDD -DDDccccccccccccbDDDD -DDDDDDDDDDDDDDDDDDDD -DDDDDDDDDDDDDDDDDDDD -DDDDDDDDDDDDDDDDDDDD -"} diff --git a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm index 57039bae9d3..2036c6dc142 100644 --- a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm +++ b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm @@ -1,124 +1,1288 @@ -"aa" = (/turf/open/space,/area/space) -"ab" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/open/floor/plating,/area/ruin/unpowered) -"ac" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plating,/area/ruin/unpowered) -"ad" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/open/floor/plating,/area/ruin/unpowered) -"ae" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/open/floor/plating,/area/ruin/unpowered) -"af" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/open/floor/plating,/area/ruin/unpowered) -"ag" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/open/floor/plating,/area/ruin/unpowered) -"ah" = (/turf/closed/mineral,/area/ruin/unpowered) -"ai" = (/turf/open/floor/plating/asteroid,/area/ruin/unpowered) -"aj" = (/obj/structure/flora/rock,/turf/open/floor/plating/asteroid,/area/ruin/unpowered) -"ak" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/open/floor/plating,/area/ruin/unpowered) -"al" = (/obj/structure/flora/ausbushes/genericbush,/turf/open/floor/grass,/area/ruin/unpowered) -"am" = (/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/turf/open/floor/grass,/area/ruin/unpowered) -"an" = (/mob/living/simple_animal/hostile/poison/bees,/turf/open/floor/grass,/area/ruin/unpowered) -"ao" = (/obj/structure/flora/ausbushes/lavendergrass,/turf/open/floor/grass,/area/ruin/unpowered) -"ap" = (/mob/living/simple_animal/hostile/asteroid/goldgrub{will_burrow = 0},/turf/open/floor/plating/asteroid,/area/ruin/unpowered) -"aq" = (/obj/structure/flora/ausbushes/grassybush,/turf/open/floor/grass,/area/ruin/unpowered) -"ar" = (/obj/structure/flora/rock/pile,/turf/open/floor/plating/asteroid,/area/ruin/unpowered) -"as" = (/mob/living/simple_animal/hostile/asteroid/basilisk,/turf/open/floor/plating/asteroid,/area/ruin/unpowered) -"at" = (/turf/closed/wall/r_wall,/area/ruin/unpowered) -"au" = (/obj/structure/flora/ausbushes/leafybush,/mob/living/simple_animal/hostile/poison/bees,/turf/open/floor/grass,/area/ruin/unpowered) -"av" = (/obj/structure/flora/ausbushes/brflowers,/turf/open/floor/grass,/area/ruin/unpowered) -"aw" = (/obj/structure/flora/rock,/obj/machinery/light,/turf/open/floor/plating/asteroid,/area/ruin/unpowered) -"ax" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/clothing/mask/surgical,/obj/item/weapon/razor,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"ay" = (/turf/open/floor/plasteel/darkgreen,/area/ruin/unpowered) -"az" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/box/beakers,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aA" = (/obj/structure/flora/ausbushes/ywflowers,/turf/open/floor/grass,/area/ruin/unpowered) -"aB" = (/obj/machinery/light,/mob/living/simple_animal/hostile/poison/bees,/turf/open/floor/grass,/area/ruin/unpowered) -"aC" = (/obj/structure/flora/ausbushes/ppflowers,/turf/open/floor/grass,/area/ruin/unpowered) -"aD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/airlock/highsecurity{name = "Bio Containment"; req_one_access_txt = "47"},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aE" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/open/floor/plating,/area/ruin/unpowered) -"aF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/closed/wall/r_wall,/area/ruin/unpowered) -"aG" = (/obj/structure/table/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/item/weapon/gun/energy/floragun,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel/darkgreen,/area/ruin/unpowered) -"aI" = (/obj/structure/table/reinforced,/obj/machinery/computer/med_data/laptop,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aJ" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/open/floor/plating,/area/ruin/unpowered) -"aK" = (/obj/structure/window/reinforced{dir = 4},/turf/open/space,/area/space) -"aL" = (/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/closed/wall/r_wall,/area/ruin/unpowered) -"aN" = (/obj/structure/table/reinforced,/obj/item/weapon/folder,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aO" = (/obj/structure/chair/office/light{dir = 8},/turf/open/floor/plasteel/darkgreen,/area/ruin/unpowered) -"aP" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/bottle/liver_enhance_virion,/obj/item/weapon/reagent_containers/dropper,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aQ" = (/obj/structure/window/reinforced{dir = 8},/turf/open/space,/area/space) -"aR" = (/obj/machinery/light/small{dir = 4},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aS" = (/obj/machinery/power/apc{dir = 8; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "Worn-out APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/rack,/obj/item/weapon/melee/baton/cattleprod,/obj/effect/spawner/lootdrop/maintenance,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aT" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/medical,/obj/item/weapon/tank/internals/emergency_oxygen/double,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aU" = (/obj/structure/rack,/obj/item/weapon/crowbar,/obj/item/weapon/shield/riot,/obj/machinery/light{dir = 1},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aV" = (/obj/machinery/smartfridge/chemistry,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aW" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/syringe,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aX" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/chem_grenade/antiweed{pixel_x = 3; pixel_y = 5},/obj/item/weapon/grenade/chem_grenade/antiweed{pixel_x = 4},/obj/item/weapon/grenade/chem_grenade/antiweed{pixel_x = -3; pixel_y = -1},/obj/machinery/light{dir = 1},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aY" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/temperature,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"aZ" = (/obj/structure/table/reinforced,/obj/item/weapon/cultivator,/obj/item/weapon/shovel,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"ba" = (/obj/machinery/light/small{dir = 8},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bb" = (/obj/machinery/door/airlock/hatch{name = "Bio-Research Station"},/turf/open/floor/plasteel/darkgreen,/area/ruin/unpowered) -"bc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/open/floor/plasteel/darkgreen,/area/ruin/unpowered) -"bd" = (/obj/machinery/power/terminal,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/open/floor/plasteel/darkgreen,/area/ruin/unpowered) -"be" = (/obj/structure/reagent_dispensers/fueltank,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bf" = (/obj/machinery/power/smes/magical{desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; name = "power storage unit"},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bg" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bh" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bi" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/hypospray/medipen/stimpack,/obj/item/weapon/reagent_containers/glass/bottle/mutagen,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bj" = (/obj/structure/table/reinforced,/obj/item/weapon/surgicaldrill,/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/item/weapon/surgical_drapes,/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/item/weapon/circular_saw,/obj/machinery/light,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bk" = (/obj/structure/table/optable,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bl" = (/obj/machinery/computer/operating,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bm" = (/obj/structure/closet/wardrobe/science_white,/obj/structure/disposalpipe/segment,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bn" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/snacks/carrotfries,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bo" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/open/floor/plating,/area/ruin/unpowered) -"bp" = (/obj/structure/bed,/obj/item/weapon/bedsheet/green,/obj/structure/disposalpipe/segment,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bq" = (/obj/item/stack/cable_coil/cut,/obj/item/stack/tile/plasteel{pixel_x = 3; pixel_y = -4},/obj/item/weapon/wirecutters,/turf/open/floor/plating,/area/ruin/unpowered) -"br" = (/obj/structure/table/reinforced,/obj/machinery/microwave,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/shieldwallgen,/turf/open/floor/plating,/area/ruin/unpowered) -"bt" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/shieldwallgen,/turf/open/floor/plating,/area/ruin/unpowered) -"bu" = (/obj/structure/flora/ausbushes/sunnybush,/turf/open/floor/plating,/area/ruin/unpowered) -"bv" = (/turf/open/floor/plating,/area/ruin/unpowered) -"bw" = (/obj/machinery/light{dir = 1},/mob/living/simple_animal/hostile/carp,/turf/open/floor/plating,/area/ruin/unpowered) -"bx" = (/obj/structure/flora/ausbushes/palebush,/turf/open/floor/plating,/area/ruin/unpowered) -"by" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/closed/wall/r_wall,/area/ruin/unpowered) -"bz" = (/obj/machinery/space_heater,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bA" = (/obj/structure/table/reinforced,/obj/machinery/juicer,/turf/open/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered) -"bB" = (/obj/structure/alien/weeds,/turf/open/floor/plating,/area/ruin/unpowered) -"bC" = (/obj/structure/alien/weeds/node,/obj/machinery/light{dir = 1},/turf/open/floor/plating,/area/ruin/unpowered) -"bD" = (/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/open/floor/plating,/area/ruin/unpowered) -"bE" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/open/floor/plating,/area/ruin/unpowered) -"bF" = (/obj/structure/disposalpipe/segment,/turf/closed/wall/r_wall,/area/ruin/unpowered) -"bG" = (/obj/machinery/door/airlock/external,/turf/open/floor/plasteel/darkgreen,/area/ruin/unpowered) -"bH" = (/obj/structure/alien/resin/wall,/turf/open/floor/plating,/area/ruin/unpowered) -"bI" = (/obj/structure/flora/ausbushes/reedbush,/turf/open/floor/plating,/area/ruin/unpowered) -"bJ" = (/mob/living/simple_animal/crab{faction = list("carp")},/turf/open/floor/plating,/area/ruin/unpowered) -"bK" = (/obj/structure/disposalpipe/segment,/turf/open/floor/plating,/area/space) -"bL" = (/obj/machinery/light/small{dir = 8},/turf/open/floor/plasteel/darkgreen,/area/ruin/unpowered) -"bM" = (/obj/machinery/light/small{dir = 4},/turf/open/floor/plasteel/darkgreen,/area/ruin/unpowered) -"bN" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/weapon/shard{icon_state = "small"},/turf/open/floor/plating,/area/ruin/unpowered) -"bO" = (/obj/item/weapon/shard,/turf/open/floor/plating,/area/ruin/unpowered) -"bP" = (/obj/structure/lattice,/turf/open/space,/area/space) -"bQ" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable,/turf/open/floor/plating,/area/ruin/unpowered) -"bR" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/disposaloutlet,/turf/open/floor/plating,/area/space) -"bS" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable,/obj/machinery/shieldwallgen,/turf/open/floor/plating,/area/ruin/unpowered) -"bT" = (/obj/structure/grille,/obj/item/weapon/shard{icon_state = "medium"},/turf/open/floor/plating,/area/ruin/unpowered) -"bU" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/open/floor/plating,/area/ruin/unpowered) -"bV" = (/obj/machinery/shieldwallgen,/turf/open/space,/area/space) -"bW" = (/obj/item/weapon/shard,/turf/open/space,/area/space) +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/space, +/area/space) +"ab" = ( +/obj/machinery/shieldwallgen{ + active = 2; + anchored = 1; + power = 1 + }, +/obj/structure/cable{ + icon_state = "0-4"; + d2 = 4 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ac" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ad" = ( +/obj/machinery/shieldwallgen{ + active = 2; + anchored = 1; + power = 1 + }, +/obj/structure/cable{ + icon_state = "0-2"; + d2 = 2 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ae" = ( +/obj/machinery/shieldwallgen{ + active = 2; + anchored = 1; + power = 1 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4"; + tag = "" + }, +/obj/structure/cable{ + icon_state = "0-2"; + d2 = 2 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"af" = ( +/obj/machinery/shieldwallgen{ + active = 2; + anchored = 1; + power = 1 + }, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ag" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ah" = ( +/turf/closed/mineral, +/area/ruin/unpowered) +"ai" = ( +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"aj" = ( +/obj/structure/flora/rock, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"ak" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"al" = ( +/obj/structure/flora/ausbushes/genericbush, +/turf/open/floor/grass, +/area/ruin/unpowered) +"am" = ( +/mob/living/simple_animal/hostile/poison/bees, +/mob/living/simple_animal/hostile/poison/bees, +/mob/living/simple_animal/hostile/poison/bees, +/mob/living/simple_animal/hostile/poison/bees, +/mob/living/simple_animal/hostile/poison/bees, +/mob/living/simple_animal/hostile/poison/bees, +/turf/open/floor/grass, +/area/ruin/unpowered) +"an" = ( +/mob/living/simple_animal/hostile/poison/bees, +/turf/open/floor/grass, +/area/ruin/unpowered) +"ao" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/turf/open/floor/grass, +/area/ruin/unpowered) +"ap" = ( +/mob/living/simple_animal/hostile/asteroid/goldgrub{ + will_burrow = 0 + }, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"aq" = ( +/obj/structure/flora/ausbushes/grassybush, +/turf/open/floor/grass, +/area/ruin/unpowered) +"ar" = ( +/obj/structure/flora/rock/pile, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"as" = ( +/mob/living/simple_animal/hostile/asteroid/basilisk, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"at" = ( +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"au" = ( +/obj/structure/flora/ausbushes/leafybush, +/mob/living/simple_animal/hostile/poison/bees, +/turf/open/floor/grass, +/area/ruin/unpowered) +"av" = ( +/obj/structure/flora/ausbushes/brflowers, +/turf/open/floor/grass, +/area/ruin/unpowered) +"aw" = ( +/obj/structure/flora/rock, +/obj/machinery/light, +/turf/open/floor/plating/asteroid, +/area/ruin/unpowered) +"ax" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/clipboard, +/obj/item/clothing/mask/surgical, +/obj/item/weapon/razor, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"ay" = ( +/turf/open/floor/plasteel/darkgreen, +/area/ruin/unpowered) +"az" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/storage/box/syringes{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/weapon/storage/box/beakers, +/obj/machinery/light{ + dir = 4; + icon_state = "tube1" + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aA" = ( +/obj/structure/flora/ausbushes/ywflowers, +/turf/open/floor/grass, +/area/ruin/unpowered) +"aB" = ( +/obj/machinery/light, +/mob/living/simple_animal/hostile/poison/bees, +/turf/open/floor/grass, +/area/ruin/unpowered) +"aC" = ( +/obj/structure/flora/ausbushes/ppflowers, +/turf/open/floor/grass, +/area/ruin/unpowered) +"aD" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/obj/machinery/door/airlock/highsecurity{ + name = "Bio Containment"; + req_one_access_txt = "47" + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aE" = ( +/obj/machinery/shieldwallgen{ + active = 2; + anchored = 1; + power = 1 + }, +/obj/structure/cable{ + icon_state = "0-2"; + d2 = 2 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4"; + tag = "" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"aF" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"aG" = ( +/obj/structure/table/reinforced, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/obj/item/weapon/gun/energy/floragun, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aH" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/turf/open/floor/plasteel/darkgreen, +/area/ruin/unpowered) +"aI" = ( +/obj/structure/table/reinforced, +/obj/machinery/computer/med_data/laptop, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aJ" = ( +/obj/machinery/shieldwallgen{ + active = 2; + anchored = 1; + power = 1 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8"; + tag = "" + }, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"aK" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/space, +/area/space) +"aL" = ( +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aM" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"aN" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/folder, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aO" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/turf/open/floor/plasteel/darkgreen, +/area/ruin/unpowered) +"aP" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/reagent_containers/glass/bottle/liver_enhance_virion, +/obj/item/weapon/reagent_containers/dropper, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aQ" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/space) +"aR" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aS" = ( +/obj/machinery/power/apc{ + dir = 8; + environ = 0; + equipment = 0; + lighting = 0; + locked = 0; + name = "Worn-out APC"; + pixel_x = -24; + pixel_y = 0 + }, +/obj/structure/cable{ + icon_state = "0-4"; + d2 = 4 + }, +/obj/structure/rack, +/obj/item/weapon/melee/baton/cattleprod, +/obj/effect/spawner/lootdrop/maintenance, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aT" = ( +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/rack, +/obj/item/clothing/suit/space/hardsuit/medical, +/obj/item/weapon/tank/internals/emergency_oxygen/double, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aU" = ( +/obj/structure/rack, +/obj/item/weapon/crowbar, +/obj/item/weapon/shield/riot, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aV" = ( +/obj/machinery/smartfridge/chemistry, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aW" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/gun/syringe, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aX" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/grenade/chem_grenade/antiweed{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/item/weapon/grenade/chem_grenade/antiweed{ + pixel_x = 4 + }, +/obj/item/weapon/grenade/chem_grenade/antiweed{ + pixel_x = -3; + pixel_y = -1 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aY" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/gun/energy/temperature{ + pin = /obj/item/device/firing_pin + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"aZ" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/cultivator, +/obj/item/weapon/shovel, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"ba" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bb" = ( +/obj/machinery/door/airlock/hatch{ + name = "Bio-Research Station" + }, +/turf/open/floor/plasteel/darkgreen, +/area/ruin/unpowered) +"bc" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/plasteel/darkgreen, +/area/ruin/unpowered) +"bd" = ( +/obj/machinery/power/terminal, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/plasteel/darkgreen, +/area/ruin/unpowered) +"be" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bf" = ( +/obj/machinery/power/smes/magical{ + desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; + name = "power storage unit" + }, +/obj/structure/cable, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bg" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/light, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bh" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bi" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/reagent_containers/hypospray/medipen/stimpack, +/obj/item/weapon/reagent_containers/glass/bottle/mutagen, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bj" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/surgicaldrill, +/obj/item/weapon/hemostat, +/obj/item/weapon/scalpel, +/obj/item/weapon/surgical_drapes, +/obj/item/weapon/retractor, +/obj/item/weapon/cautery, +/obj/item/weapon/circular_saw, +/obj/machinery/light, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bk" = ( +/obj/structure/table/optable, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bl" = ( +/obj/machinery/computer/operating, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bm" = ( +/obj/structure/closet/wardrobe/science_white, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bn" = ( +/obj/structure/table/reinforced, +/obj/item/weapon/reagent_containers/food/snacks/carrotfries, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bo" = ( +/obj/machinery/shieldwallgen{ + active = 2; + anchored = 1; + power = 1 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8"; + tag = "" + }, +/obj/structure/cable, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bp" = ( +/obj/structure/bed, +/obj/item/weapon/bedsheet/green, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bq" = ( +/obj/item/stack/cable_coil/cut, +/obj/item/stack/tile/plasteel{ + pixel_x = 3; + pixel_y = -4 + }, +/obj/item/weapon/wirecutters, +/turf/open/floor/plating, +/area/ruin/unpowered) +"br" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bs" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8"; + pixel_y = 0 + }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/obj/machinery/shieldwallgen, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bt" = ( +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/obj/machinery/shieldwallgen, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bu" = ( +/obj/structure/flora/ausbushes/sunnybush, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bv" = ( +/turf/open/floor/plating, +/area/ruin/unpowered) +"bw" = ( +/obj/machinery/light{ + dir = 1 + }, +/mob/living/simple_animal/hostile/carp, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bx" = ( +/obj/structure/flora/ausbushes/palebush, +/turf/open/floor/plating, +/area/ruin/unpowered) +"by" = ( +/obj/structure/disposalpipe/segment{ + dir = 4; + icon_state = "pipe-c" + }, +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"bz" = ( +/obj/machinery/space_heater, +/obj/structure/disposalpipe/segment{ + dir = 8; + icon_state = "pipe-c" + }, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bA" = ( +/obj/structure/table/reinforced, +/obj/machinery/juicer, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/ruin/unpowered) +"bB" = ( +/obj/structure/alien/weeds, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bC" = ( +/obj/structure/alien/weeds/node, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bD" = ( +/obj/item/clothing/mask/facehugger{ + icon_state = "facehugger_dead"; + stat = 2 + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bE" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bF" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/r_wall, +/area/ruin/unpowered) +"bG" = ( +/obj/machinery/door/airlock/external, +/turf/open/floor/plasteel/darkgreen, +/area/ruin/unpowered) +"bH" = ( +/obj/structure/alien/resin/wall, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bI" = ( +/obj/structure/flora/ausbushes/reedbush, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bJ" = ( +/mob/living/simple_animal/crab{ + faction = list("carp") + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bK" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/space) +"bL" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/darkgreen, +/area/ruin/unpowered) +"bM" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/darkgreen, +/area/ruin/unpowered) +"bN" = ( +/obj/structure/grille{ + density = 0; + icon_state = "brokengrille" + }, +/obj/item/weapon/shard{ + icon_state = "small" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bO" = ( +/obj/item/weapon/shard, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bP" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space) +"bQ" = ( +/obj/machinery/shieldwallgen{ + active = 2; + anchored = 1; + power = 1 + }, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8"; + tag = "" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bR" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/disposaloutlet, +/turf/open/floor/plating, +/area/space) +"bS" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable, +/obj/machinery/shieldwallgen, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bT" = ( +/obj/structure/grille, +/obj/item/weapon/shard{ + icon_state = "medium" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bU" = ( +/obj/structure/grille{ + density = 0; + icon_state = "brokengrille" + }, +/turf/open/floor/plating, +/area/ruin/unpowered) +"bV" = ( +/obj/machinery/shieldwallgen, +/turf/open/space, +/area/space) +"bW" = ( +/obj/item/weapon/shard, +/turf/open/space, +/area/space) (1,1,1) = {" -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -abacacacacadaaaaaaaaaaaaaeacacacacafaaaa -agahahaiajakaaaaaaaaaaaaakalamanaoakaaaa -agaiapahaiakaaaaaaaaaaaaakanamaqanakaaaa -agaraiaiasakatagagagagatakanaoauavakaaaa -agahaiawarakataxayayazatakaAaBamaCakaaaa -abacaDacacaEaFaGaHaHaIaFaJacacaDacafaaaa -aaaKaLatataMataNaOayaPatatatataLaQaaaaaa -aaaKaRataSaTaUaVayayaWaXaYaZatbaaQaaaaaa -aaaKaLbbaybcayayayayayayayaybbaLaQaaaaaa -aaaKaLbbaybdayayayayayayayaybbaLaQaaaaaa -aaaKaRatbebfbgbhayaybibjbkblatbaaQaaaaaa -aaaKaLatataMatbmayaybnatatatataLaQaaaaaa -abacaDacacboaFbpaHbqbraFbsacacaDacbtaaaa -agbubvbwbxakbybzayaybAatakbBbCbDbBagaaaa -agbvbvbvbEakbFatbGbGatatakbBbHbBbBagaaaa -agbIbJbvbvakbKatbLbMataaakbDbHbvbvbNaaaa -agbvbvbvbvakbKatbGbGataaakbHbvbObvbPaaaa -abacacacacbQbRaaaaaaaaaabSacbTbUbPaabVaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWaaaaaaaa +aa +ab +ag +ag +ag +ag +ab +aa +aa +aa +aa +aa +aa +ab +ag +ag +ag +ag +ab +aa +"} +(2,1,1) = {" +aa +ac +ah +ai +ar +ah +ac +aK +aK +aK +aK +aK +aK +ac +bu +bv +bI +bv +ac +aa +"} +(3,1,1) = {" +aa +ac +ah +ap +ai +ai +aD +aL +aR +aL +aL +aR +aL +aD +bv +bv +bJ +bv +ac +aa +"} +(4,1,1) = {" +aa +ac +ai +ah +ai +aw +ac +at +at +bb +bb +at +at +ac +bw +bv +bv +bv +ac +aa +"} +(5,1,1) = {" +aa +ac +aj +ai +as +ar +ac +at +aS +ay +ay +be +at +ac +bx +bE +bv +bv +ac +aa +"} +(6,1,1) = {" +aa +ad +ak +ak +ak +ak +aE +aM +aT +bc +bd +bf +aM +bo +ak +ak +ak +ak +bQ +aa +"} +(7,1,1) = {" +aa +aa +aa +aa +at +at +aF +at +aU +ay +ay +bg +at +aF +by +bF +bK +bK +bR +aa +"} +(8,1,1) = {" +aa +aa +aa +aa +ag +ax +aG +aN +aV +ay +ay +bh +bm +bp +bz +at +at +at +aa +aa +"} +(9,1,1) = {" +aa +aa +aa +aa +ag +ay +aH +aO +ay +ay +ay +ay +ay +aH +ay +bG +bL +bG +aa +aa +"} +(10,1,1) = {" +aa +aa +aa +aa +ag +ay +aH +ay +ay +ay +ay +ay +ay +bq +ay +bG +bM +bG +aa +aa +"} +(11,1,1) = {" +aa +aa +aa +aa +ag +az +aI +aP +aW +ay +ay +bi +bn +br +bA +at +at +at +aa +aa +"} +(12,1,1) = {" +aa +aa +aa +aa +at +at +aF +at +aX +ay +ay +bj +at +aF +at +at +aa +aa +aa +aa +"} +(13,1,1) = {" +aa +ae +ak +ak +ak +ak +aJ +at +aY +ay +ay +bk +at +bs +ak +ak +ak +ak +bS +aa +"} +(14,1,1) = {" +aa +ac +al +an +an +aA +ac +at +aZ +ay +ay +bl +at +ac +bB +bB +bD +bH +ac +aa +"} +(15,1,1) = {" +aa +ac +am +am +ao +aB +ac +at +at +bb +bb +at +at +ac +bC +bH +bH +bv +bT +aa +"} +(16,1,1) = {" +aa +ac +an +aq +au +am +aD +aL +ba +aL +aL +ba +aL +aD +bD +bB +bv +bO +bU +bW +"} +(17,1,1) = {" +aa +ac +ao +an +av +aC +ac +aQ +aQ +aQ +aQ +aQ +aQ +ac +bB +bB +bv +bv +bP +aa +"} +(18,1,1) = {" +aa +af +ak +ak +ak +ak +af +aa +aa +aa +aa +aa +aa +bt +ag +ag +bN +bP +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bV +aa +"} +(20,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa "} diff --git a/_maps/RandomRuins/SpaceRuins/spacebar.dmm b/_maps/RandomRuins/SpaceRuins/spacebar.dmm index a64c14d8a47..b7ed1dc854e 100644 --- a/_maps/RandomRuins/SpaceRuins/spacebar.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacebar.dmm @@ -1,109 +1,2149 @@ -"aa" = (/turf/open/space,/area/space) -"ab" = (/turf/closed/mineral,/area/space) -"ac" = (/turf/open/floor/plating/asteroid,/area/space) -"ad" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/open/floor/plating,/area/ruin/unpowered) -"ae" = (/turf/closed/wall,/area/ruin/unpowered) -"af" = (/turf/open/floor/plating/asteroid,/area/ruin/unpowered) -"ag" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/open/floor/plating/asteroid,/area/ruin/unpowered) -"ah" = (/turf/closed/mineral,/area/ruin/unpowered) -"ai" = (/turf/open/floor/plating/asteroid,/turf/closed/wall/shuttle{icon_state = "swall_f6"; dir = 2},/area/ruin/unpowered) -"aj" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/ruin/unpowered) -"ak" = (/turf/open/floor/plating/asteroid,/turf/closed/wall/shuttle{dir = 2; icon_state = "swall_f10"; layer = 2},/area/ruin/unpowered) -"al" = (/turf/closed/wall,/area/ruin/powered) -"am" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/ruin/unpowered) -"an" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle,/area/ruin/unpowered) -"ao" = (/obj/structure/table,/obj/machinery/chem_dispenser/drinks/beer,/turf/open/floor/wood,/area/ruin/powered) -"ap" = (/obj/structure/table,/obj/machinery/chem_dispenser/drinks,/turf/open/floor/wood,/area/ruin/powered) -"aq" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/turf/open/floor/wood,/area/ruin/powered) -"ar" = (/turf/open/floor/wood,/area/ruin/powered) -"as" = (/obj/structure/table,/obj/item/toy/figure/bartender,/turf/open/floor/wood,/area/ruin/powered) -"at" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/open/floor/wood,/area/ruin/powered) -"au" = (/obj/effect/mob_spawn/human/bartender/alive,/turf/open/floor/wood,/area/ruin/powered) -"av" = (/obj/structure/reagent_dispensers/beerkeg,/turf/open/floor/wood,/area/ruin/powered) -"aw" = (/turf/open/floor/plasteel/shuttle,/area/ruin/unpowered) -"ax" = (/obj/machinery/door/airlock{name = "Bar Storage"; req_access_txt = "25"},/turf/open/floor/wood,/area/ruin/powered) -"ay" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/open/floor/wood,/area/ruin/powered) -"az" = (/turf/open/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/closed/wall/shuttle{icon_state = "swall_f5"; dir = 2},/area/ruin/unpowered) -"aA" = (/obj/machinery/door/airlock/shuttle{name = "Escape Pod Airlock"},/turf/open/floor/plasteel/shuttle,/area/ruin/unpowered) -"aB" = (/turf/open/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/closed/wall/shuttle{icon_state = "swall_f9"; dir = 2},/area/ruin/unpowered) -"aC" = (/obj/machinery/button/door{id = "spacebardock"; name = "pod dock door cycle"; pixel_x = -32},/turf/open/floor/wood,/area/ruin/powered) -"aD" = (/obj/machinery/vending/boozeomat,/turf/closed/wall,/area/ruin/powered) -"aE" = (/obj/machinery/light/small,/turf/open/floor/wood,/area/ruin/powered) -"aF" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 10},/turf/open/floor/wood,/area/ruin/powered) -"aG" = (/obj/structure/table,/turf/open/floor/wood,/area/ruin/powered) -"aH" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/beer,/obj/item/weapon/reagent_containers/glass/rag,/turf/open/floor/wood,/area/ruin/powered) -"aI" = (/obj/machinery/door/airlock{name = "Bar Storage"; req_access_txt = "25"},/turf/open/floor/plasteel{icon_state = "wood"},/area/ruin/powered) -"aJ" = (/obj/structure/chair/stool,/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aK" = (/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aL" = (/obj/machinery/light{dir = 1},/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aM" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/open/floor/plating,/area/ruin/powered) -"aN" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/closed/wall,/area/ruin/powered) -"aO" = (/obj/machinery/door/airlock/external,/turf/open/floor/plating,/area/ruin/powered) -"aP" = (/turf/open/floor/plating,/area/ruin/powered) -"aQ" = (/obj/structure/chair{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aR" = (/obj/structure/table/wood,/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aS" = (/obj/structure/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aT" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aU" = (/obj/structure/chair,/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aV" = (/obj/machinery/vending/cola,/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aW" = (/obj/machinery/vending/cigarette,/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aX" = (/obj/machinery/vending/coffee,/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aY" = (/obj/machinery/vending/snack,/obj/machinery/light,/turf/open/floor/plasteel/bar,/area/ruin/powered) -"aZ" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/bar,/area/ruin/powered) -"ba" = (/obj/machinery/door/airlock{name = "Unisex Bathroom"},/turf/open/floor/plasteel/freezer,/area/ruin/powered) -"bb" = (/obj/structure/urinal{pixel_x = -32},/turf/open/floor/plasteel/freezer,/area/ruin/powered) -"bc" = (/turf/open/floor/plasteel/freezer,/area/ruin/powered) -"bd" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/turf/open/floor/plasteel/freezer,/area/ruin/powered) -"be" = (/obj/structure/table/wood,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/open/floor/plasteel/bar,/area/ruin/powered) -"bf" = (/obj/machinery/light/small{dir = 8},/turf/open/floor/plasteel/freezer,/area/ruin/powered) -"bg" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 8},/turf/open/floor/plasteel/freezer,/area/ruin/powered) -"bh" = (/obj/machinery/door/airlock{name = "Toilet"},/turf/open/floor/plasteel/freezer,/area/ruin/powered) -"bi" = (/obj/effect/glowshroom/single,/turf/open/floor/plasteel/freezer,/area/ruin/powered) -"bj" = (/obj/machinery/door/airlock/external,/turf/open/floor/plating,/area/ruin/unpowered) -"bk" = (/turf/open/floor/plating,/area/ruin/unpowered) -"bl" = (/turf/open/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/ruin/powered) -"bm" = (/obj/machinery/door/poddoor/preopen{id = "spacebardock"; name = "airlock dock"},/turf/open/floor/plating,/area/ruin/powered) -"bn" = (/obj/machinery/door/poddoor{id = "spacebardock"; name = "airlock dock"},/turf/open/floor/plating,/area/ruin/powered) +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/space, +/area/space) +"ab" = ( +/turf/closed/mineral, +/area/space) +"ac" = ( +/turf/open/floor/plating/asteroid, +/area/space) +"ad" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plating, +/area/ruin/unpowered) +"ae" = ( +/turf/closed/wall, +/area/ruin/unpowered) +"af" = ( +/turf/open/floor/plating/asteroid, +/area/ruin/powered) +"ag" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plating/asteroid, +/area/ruin/powered) +"ah" = ( +/turf/closed/mineral, +/area/ruin/powered) +"ai" = ( +/turf/open/floor/plating/asteroid, +/turf/closed/wall/shuttle{ + icon_state = "swall_f6"; + dir = 2 + }, +/area/ruin/powered) +"aj" = ( +/obj/structure/grille, +/obj/structure/window/shuttle, +/turf/open/floor/plating, +/area/ruin/powered) +"ak" = ( +/turf/open/floor/plating/asteroid, +/turf/closed/wall/shuttle{ + dir = 2; + icon_state = "swall_f10"; + layer = 2 + }, +/area/ruin/powered) +"al" = ( +/turf/closed/wall, +/area/ruin/powered) +"am" = ( +/turf/closed/wall/shuttle{ + icon_state = "swall3"; + dir = 2 + }, +/area/ruin/powered) +"an" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plasteel/shuttle, +/area/ruin/powered) +"ao" = ( +/obj/structure/table, +/obj/machinery/chem_dispenser/drinks/beer, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"ap" = ( +/obj/structure/table, +/obj/machinery/chem_dispenser/drinks, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"aq" = ( +/obj/structure/table, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"ar" = ( +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"as" = ( +/obj/structure/table, +/obj/item/toy/figure/bartender, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"at" = ( +/obj/structure/table, +/obj/item/weapon/reagent_containers/food/drinks/shaker, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"au" = ( +/obj/effect/mob_spawn/human/bartender/alive, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"av" = ( +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"aw" = ( +/turf/open/floor/plasteel/shuttle, +/area/ruin/powered) +"ax" = ( +/obj/machinery/door/airlock{ + name = "Bar Storage"; + req_access_txt = "25" + }, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"ay" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"az" = ( +/turf/open/floor/plating, +/obj/structure/shuttle/engine/propulsion/burst, +/turf/closed/wall/shuttle{ + icon_state = "swall_f5"; + dir = 2 + }, +/area/ruin/powered) +"aA" = ( +/obj/machinery/door/airlock/shuttle{ + name = "Escape Pod Airlock" + }, +/turf/open/floor/plasteel/shuttle, +/area/ruin/powered) +"aB" = ( +/turf/open/floor/plating, +/obj/structure/shuttle/engine/propulsion/burst, +/turf/closed/wall/shuttle{ + icon_state = "swall_f9"; + dir = 2 + }, +/area/ruin/powered) +"aC" = ( +/obj/machinery/button/door{ + id = "spacebardock"; + name = "pod dock door cycle"; + pixel_x = -32 + }, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"aD" = ( +/obj/machinery/vending/boozeomat, +/turf/closed/wall, +/area/ruin/powered{ + name = "Space Bar" + }) +"aE" = ( +/obj/machinery/light/small, +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"aF" = ( +/obj/structure/table, +/obj/item/stack/sheet/metal{ + amount = 10 + }, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"aG" = ( +/obj/structure/table, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"aH" = ( +/obj/structure/table, +/obj/item/weapon/reagent_containers/food/drinks/beer, +/obj/item/weapon/reagent_containers/glass/rag, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"aI" = ( +/obj/machinery/door/airlock{ + name = "Bar Storage"; + req_access_txt = "25" + }, +/turf/open/floor/plasteel{ + icon_state = "wood" + }, +/area/ruin/powered{ + name = "Space Bar" + }) +"aJ" = ( +/obj/structure/chair/stool, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aK" = ( +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aL" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aM" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plating, +/area/ruin/powered) +"aN" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/turf/closed/wall, +/area/ruin/powered{ + name = "Space Bar" + }) +"aO" = ( +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/ruin/powered) +"aP" = ( +/turf/open/floor/plating, +/area/ruin/powered) +"aQ" = ( +/obj/structure/chair{ + tag = "icon-chair (EAST)"; + icon_state = "chair"; + dir = 4 + }, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aR" = ( +/obj/structure/table/wood, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aS" = ( +/obj/structure/chair{ + tag = "icon-chair (WEST)"; + icon_state = "chair"; + dir = 8 + }, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aT" = ( +/obj/machinery/light{ + icon_state = "tube1"; + dir = 8 + }, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aU" = ( +/obj/structure/chair, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aV" = ( +/obj/machinery/vending/cola, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aW" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aX" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aY" = ( +/obj/machinery/vending/snack, +/obj/machinery/light, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"aZ" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"ba" = ( +/obj/machinery/door/airlock{ + name = "Unisex Bathroom" + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered{ + name = "Space Bar" + }) +"bb" = ( +/obj/structure/urinal{ + pixel_x = -32 + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered{ + name = "Space Bar" + }) +"bc" = ( +/turf/open/floor/plasteel/freezer, +/area/ruin/powered{ + name = "Space Bar" + }) +"bd" = ( +/obj/structure/sink{ + dir = 4; + icon_state = "sink"; + pixel_x = 11; + pixel_y = 0 + }, +/obj/structure/mirror{ + pixel_x = 28 + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered{ + name = "Space Bar" + }) +"be" = ( +/obj/structure/table/wood, +/obj/machinery/light{ + icon_state = "tube1"; + dir = 4 + }, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"bf" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered{ + name = "Space Bar" + }) +"bg" = ( +/obj/structure/toilet{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered{ + name = "Space Bar" + }) +"bh" = ( +/obj/machinery/door/airlock{ + name = "Toilet" + }, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered{ + name = "Space Bar" + }) +"bi" = ( +/obj/effect/glowshroom/single, +/turf/open/floor/plasteel/freezer, +/area/ruin/powered{ + name = "Space Bar" + }) +"bj" = ( +/turf/open/floor/plating, +/area/ruin/powered{ + name = "Space Bar" + }) +"bk" = ( +/obj/item/device/radio/beacon, +/turf/open/floor/plasteel/bar, +/area/ruin/powered{ + name = "Space Bar" + }) +"bl" = ( +/turf/open/floor/plating{ + icon_plating = "warnplate"; + icon_state = "warnplate" + }, +/area/ruin/powered) +"bm" = ( +/obj/machinery/door/poddoor/preopen{ + id = "spacebardock"; + name = "airlock dock" + }, +/turf/open/floor/plating, +/area/ruin/powered) +"bn" = ( +/obj/machinery/door/poddoor{ + id = "spacebardock"; + name = "airlock dock" + }, +/turf/open/floor/plating, +/area/ruin/powered) +"bs" = ( +/obj/machinery/door/airlock/external, +/turf/open/floor/plating, +/area/ruin/powered{ + name = "Space Bar" + }) +"br" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/plating, +/area/ruin/powered{ + name = "Space Bar" + }) +"bq" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"bp" = ( +/obj/structure/closet/secure_closet/freezer/kitchen, +/turf/open/floor/wood, +/area/ruin/powered{ + name = "Space Bar" + }) +"bo" = ( +/turf/closed/wall, +/area/ruin/powered{ + name = "Space Bar" + }) (1,1,1) = {" -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacababacacacacacaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaacacacacacadadaeadadacacacacacacacacacacacacacaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaacacacadadadafafafafafadadacacadadadadadadagacacacacaaaaaaaaaa -aaaaaaaaaaaaaaaaacacacadafafafafafafahahafafadadafafafafafafafadadacacacaaaaaaaa -aaaaaaaaaaaaaaacacacadafafafafafafahahahahafafafafafafafafafafafafadacacaaaaaaaa -aaaaaaaaaaacacacacadafaiajakafafahahahalalalalalalalalalalalalafafadacacaaaaaaaa -aaaaaaaaaaacacacadafafamanamafafahahahalaoapaqaralasatauaravalafafadacacacaaaaaa -aaaaaaaaacacadadafafafamawamafafahahahalararararaxararararayalafafafadacacaaaaaa -aaaaaaababacadafafafafazaAaBafafafahahalaCarararaDaraEararaFalafafafadacacaaaaaa -aaaaaaaaabacaeafafafafafafafafafafafafalaGaGaHaGalalalalaIalalafafafaeacaaaaaaaa -aaaaaaaaabacadadafafafafafafafafafafafalaJaJaJaJaKaKaLaKaKaKalafafafadacabaaaaaa -aaaaaaaaacacacacadafafafafafafafalaMaNalaKaKaKaKaKaKaKaKaKaKaMafafadacacababaaaa -aaaaaaaaaaacacadafafafafafafafafaOaPaPaOaKaKaKaKaKaKaQaRaSaKaMafafadacabababaaaa -aaaaaaaaaaacacadafafafafafafafafalaMaMalaTaKaQaRaSaKaKaKaKaKaMafafadacacaaaaaaaa -aaaaaaaaacacadafafafafafafafafafafafafalaUaKaKaKaKaKaKaKaKaKaMafafadacacaaaaaaaa -aaaaaaaaabacadafafafafafafafafafafafafalaRaKaKaKaVaWaXaYaKaKalafafadacacacaaaaaa -aaaaaaababacadafafafafafafafafafafafafalaZaKaKaKalalalalalbaalahafafadacacacaaaa -aaaaaaaaabacadafafafafafafafafaiajakafalaKaKaKaKalbbbcbcbcbcalahafafafadacabaaaa -aaaaaaaaacacadafafafafafafafafamanamafaMaKaKaKaUalbbbcbcbcbdalahahafafadacabaaaa -aaaaaaaaacacacadafafafafafafafamawamafafaMaKaKbealalalbfbcbdalahahafafadacabaaaa -aaaaaaaaaaacacadafafafafafafafazaAaBafafafaMaKaZalbgbhbcbibcalahahafafadacacaaaa -aaaaaaaaaaacaeaeaeaeafafafafafafafafafafafafaMalalalalalalalalahahafadacacacaaaa -aaaaaaaaaaaabjbkbkbjafafafafafafafafafafahahafafafahahahahahahahahafadacacacaaaa -aaaaaaaaaaaaaeaeaeaeafafafafafafafafafahahahafafafafafahahahahahahadacacacaaaaaa -aaaaaaaaaaaaacacaeafalblblblblblblalafafahafafafafafafafafahahahafadacacaaaaaaaa -aaaaaaaaaaaaacabaeafalbmbmbmbmbmbmalafafafafafafafafafafafafafafadaeacabaaaaaaaa -aaaaaaaaaaaaababaeaealaPaPaPaPaPaPalaeaeaeadadadadadadadadadadaeacacacacaaaaaaaa -aaaaaaaaaaaaababababalaPaPaPaPaPaPalacacacacacacacacacacacacacacacacacaaaaaaaaaa -aaaaaaaaaaaaaaaaababalaPaPaPaPaPaPalacacacacacacacacabacacacacacacaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaalaPaPaPaPaPaPalacacacacaaaaaaacacacababaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaalbnbnbnbnbnbnalacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaalaaaaaaaaaaaaalaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ac +ab +ab +ab +ac +aa +aa +ac +ab +ab +ab +ac +ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(7,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ac +ac +aM +aM +al +aM +ac +ac +ac +aM +aM +aM +aM +aM +ac +ac +al +aO +al +ac +ac +ab +ab +aa +aa +aa +aa +aa +aa +"} +(8,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +aM +ac +aM +aM +af +af +af +af +af +aM +aM +al +aP +al +ac +ab +ab +ab +aa +aa +aa +aa +aa +aa +"} +(9,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +af +af +aM +af +af +af +af +af +af +af +af +af +al +aP +al +al +al +al +ab +ab +aa +aa +aa +aa +aa +"} +(10,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +al +aO +al +af +af +al +ab +ab +aa +aa +aa +aa +aa +"} +(11,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +al +al +al +al +al +al +al +al +aa +aa +"} +(12,1,1) = {" +aa +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +ai +am +am +az +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +bl +bm +aP +aP +aP +aP +bn +aa +aa +aa +"} +(13,1,1) = {" +aa +aa +aa +aa +aa +aa +ac +ac +aM +af +af +aj +an +aw +aA +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +bl +bm +aP +aP +aP +aP +bn +aa +aa +aa +"} +(14,1,1) = {" +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +ak +am +am +aB +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +bl +bm +aP +aP +aP +aP +bn +aa +aa +aa +"} +(15,1,1) = {" +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +bl +bm +aP +aP +aP +aP +bn +aa +aa +aa +"} +(16,1,1) = {" +aa +aa +aa +aa +ac +ac +ac +ad +af +af +af +af +af +af +af +af +af +af +af +af +af +af +af +ai +am +am +az +af +af +af +bl +bm +aP +aP +aP +aP +bn +aa +aa +aa +"} +(17,1,1) = {" +aa +aa +aa +aa +ac +ac +ac +ad +af +af +af +ah +ah +ah +af +af +af +bo +bs +bo +af +af +af +aj +an +aw +aA +af +af +af +bl +bm +aP +aP +aP +aP +bn +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +aa +aa +ac +ac +ac +ae +af +af +ah +ah +ah +ah +ah +af +af +br +bj +br +af +af +af +ak +am +am +aB +af +af +af +al +al +al +al +al +al +al +al +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +ac +ac +ac +ad +af +ah +ah +ah +ah +ah +ah +af +af +aN +bj +br +af +af +af +af +af +af +af +af +af +af +af +af +al +ac +ac +ac +ac +aa +aa +aa +"} +(20,1,1) = {" +aa +aa +aa +ab +ac +ac +ac +ad +af +ah +ah +bo +bo +bo +bo +bo +bo +bo +bs +bo +bo +bo +bo +bo +br +af +af +af +af +ah +af +af +al +ac +ac +ac +ac +aa +aa +aa +"} +(21,1,1) = {" +aa +aa +aa +ab +ab +ac +ac +ac +aM +af +ah +bo +ao +ar +aC +aG +aJ +aK +aK +aT +aU +aR +aZ +aK +aK +br +af +af +ah +ah +ah +af +al +ac +ac +ac +aa +aa +aa +aa +"} +(22,1,1) = {" +aa +aa +aa +ab +ab +ac +ac +ac +aM +af +af +bo +ap +ar +ar +aG +aJ +aK +aK +aK +aK +aK +aK +aK +aK +aK +br +af +ah +ah +af +af +aM +ac +ac +ac +aa +aa +aa +aa +"} +(23,1,1) = {" +aa +aa +aa +aa +ab +ab +ac +ac +ac +aM +af +bo +aq +ar +ar +aH +aJ +aK +aK +aQ +aK +aK +aK +aK +aK +aK +aK +br +af +af +af +af +aM +ac +ac +aa +aa +aa +aa +aa +"} +(24,1,1) = {" +aa +aa +aa +aa +ab +ab +ac +ac +ac +aM +af +bo +ar +ar +ar +aG +aJ +aK +aK +aR +aK +aK +aK +aK +aU +be +aZ +bo +af +af +af +af +aM +ac +ac +aa +aa +aa +aa +aa +"} +(25,1,1) = {" +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +bo +bo +ax +aD +bo +aK +aK +aK +aS +aK +aV +bo +bo +bo +bo +bo +bo +af +af +af +af +aM +ac +ac +aa +aa +aa +aa +aa +"} +(26,1,1) = {" +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +bo +as +ar +bp +bo +aK +aK +aK +aK +bk +aW +bo +bb +bb +bo +bg +bo +ah +af +af +af +aM +ac +ac +ac +aa +aa +aa +aa +"} +(27,1,1) = {" +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +bo +at +ar +aE +bo +aL +aK +aQ +aK +aK +aX +bo +bc +bc +bo +bh +bo +ah +af +af +af +aM +ac +ab +ac +aa +aa +aa +aa +"} +(28,1,1) = {" +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +bo +au +ar +bq +bo +aK +aK +aR +aK +aK +aY +bo +bc +bc +bf +bc +bo +ah +ah +af +af +aM +ac +ac +ac +aa +aa +aa +aa +"} +(29,1,1) = {" +aa +aa +aa +aa +aa +ac +ac +ac +aM +af +af +bo +ar +ar +ar +aI +aK +aK +aS +aK +aK +aK +bo +bc +bc +bc +bi +bo +ah +ah +af +af +aM +ac +ac +ab +aa +aa +aa +aa +"} +(30,1,1) = {" +aa +aa +aa +aa +aa +aa +ac +ac +aM +af +af +bo +av +ay +aF +bo +aK +aK +aK +aK +aK +aK +ba +bc +bd +bd +bc +bo +ah +ah +ah +af +aM +ac +ac +ab +aa +aa +aa +aa +"} +(31,1,1) = {" +aa +aa +aa +aa +aa +aa +ac +ac +ag +af +af +bo +bo +bo +bo +bo +bo +br +br +br +br +bo +bo +bo +bo +bo +bo +bo +ah +ah +ah +af +aM +ac +ac +aa +aa +aa +aa +aa +"} +(32,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ac +ac +aM +af +af +af +af +af +af +af +af +af +af +af +af +ah +ah +ah +ah +ah +ah +ah +ah +ah +af +al +ac +ac +aa +aa +aa +aa +aa +"} +(33,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ac +ac +aM +af +af +af +af +af +af +af +af +af +af +af +af +af +af +ah +ah +ah +ah +ah +ah +af +aM +ac +ac +ac +aa +aa +aa +aa +aa +"} +(34,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ac +ac +aM +aM +aM +af +af +af +af +aM +aM +aM +aM +aM +af +af +af +af +af +af +af +aM +aM +al +ac +ac +aa +aa +aa +aa +aa +aa +"} +(35,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +ac +ac +ac +ac +ac +aM +aM +al +aM +ac +ac +ac +ac +ac +aM +af +af +af +af +aM +aM +ac +ac +ac +ac +ac +aa +aa +aa +aa +aa +aa +"} +(36,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +ac +ac +ac +ac +ac +ac +ac +ac +ac +ab +ac +ac +ac +ac +aM +aM +aM +aM +ac +ac +ac +ac +ab +ac +aa +aa +aa +aa +aa +aa +aa +"} +(37,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ac +ac +ac +aa +ab +ab +ab +aa +aa +ac +ac +ac +ac +ac +ac +ac +ac +ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(38,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +ab +aa +aa +aa +ac +ab +ab +ab +ac +ac +ac +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(40,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa "} diff --git a/_maps/map_files/BirdStation/BirdStation.dmm b/_maps/map_files/BirdStation/BirdStation.dmm index c15747c8fc1..70535e03ad0 100644 --- a/_maps/map_files/BirdStation/BirdStation.dmm +++ b/_maps/map_files/BirdStation/BirdStation.dmm @@ -1410,7 +1410,7 @@ "aBf" = (/obj/machinery/light/small{dir = 8},/turf/open/floor/plasteel/white,/area/maintenance/asmaint2) "aBg" = (/obj/item/clothing/gloves/color/latex/nitrile,/turf/open/floor/plasteel/white,/area/maintenance/asmaint2) "aBh" = (/turf/open/floor/plasteel/white,/area/maintenance/asmaint2) -"aBi" = (/obj/structure/table,/obj/item/weapon/wirerod,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/restraints/handcuffs,/obj/item/clothing/tie/stethoscope,/turf/open/floor/plasteel/white,/area/space) +"aBi" = (/obj/structure/table,/obj/item/weapon/melee/baton/cattleprod,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/restraints/handcuffs,/obj/item/clothing/tie/stethoscope,/turf/open/floor/plasteel/white,/area/space) "aBj" = (/obj/machinery/light,/turf/open/floor/plasteel,/area/quartermaster/miningdock{name = "\improper Mining Office"}) "aBk" = (/obj/structure/cable/cyan{icon_state = "1-2"},/turf/open/floor/plating,/area/quartermaster/miningdock{name = "\improper Mining Office"}) "aBl" = (/obj/machinery/portable_atmospherics/canister/air,/turf/open/floor/plating,/area/quartermaster/miningdock{name = "\improper Mining Office"}) diff --git a/_maps/map_files/DreamStation/dreamstation04.dmm b/_maps/map_files/DreamStation/dreamstation04.dmm index a2c597f1c0a..c4454c5a061 100644 --- a/_maps/map_files/DreamStation/dreamstation04.dmm +++ b/_maps/map_files/DreamStation/dreamstation04.dmm @@ -12173,7 +12173,7 @@ "ayJ" = ( /obj/structure/rack, /obj/item/weapon/lipstick/jade, -/obj/item/weapon/wirerod, +/obj/item/weapon/melee/baton/cattleprod, /obj/effect/spawner/lootdrop/maintenance{ lootcount = 3; name = "3maintenance loot spawner" @@ -77150,7 +77150,7 @@ tag = "icon-1-2"; icon_state = "1-2" }, -/obj/item/weapon/wirerod, +/obj/item/weapon/melee/baton/cattleprod, /turf/open/floor/plating/airless, /area/engine/engineering) "cQP" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 18c0c806960..d27566ed208 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -93756,12 +93756,6 @@ dir = 1; on = 1 }, -/obj/item/device/radio/intercom{ - freerange = 0; - frequency = 1459; - name = "Station Intercom (General)"; - pixel_x = 29 - }, /turf/open/floor/plasteel{ dir = 8; icon_state = "chapel" @@ -93882,18 +93876,12 @@ }, /area/chapel/main) "cTE" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/turf/closed/wall/shuttle{ + tag = "icon-wall3 (NORTHWEST)"; + icon_state = "wall3"; + dir = 9 }, -/mob/living/simple_animal/hostile/retaliate/bat{ - name = "Orlocke"; - real_name = "Orlocke"; - turns_per_move = 6 - }, -/turf/open/floor/plasteel{ - icon_state = "dark" - }, -/area/chapel/main) +/area/shuttle/escape) "cTF" = ( /obj/machinery/door/window{ dir = 4; @@ -93933,8 +93921,13 @@ }, /area/chapel/main) "cTH" = ( -/obj/structure/bookcase{ - name = "Holy Bookcase" +/obj/machinery/camera{ + c_tag = "Chapel - Port"; + dir = 4; + network = list("SS13") + }, +/obj/structure/chair/comfy/black{ + dir = 4 }, /turf/open/floor/plasteel{ dir = 8; @@ -99087,9 +99080,8 @@ }, /area/shuttle/abandoned) "dcy" = ( -/turf/open/space, /turf/closed/wall/shuttle{ - icon_state = "swall_f6"; + icon_state = "swall7"; dir = 2 }, /area/shuttle/escape) @@ -99118,17 +99110,29 @@ /area/shuttle/escape) "dcD" = ( /obj/machinery/door/airlock/shuttle{ - name = "Emergency Shuttle Cargo Bay Airlock" + name = "Emergency Shuttle Airlock" }, -/turf/open/floor/plating{ - dir = 1; - icon_state = "delivery" +/obj/docking_port/mobile/emergency{ + dir = 2; + dwidth = 5; + height = 14; + name = "MetaStation emergency shuttle"; + width = 25 }, +/obj/docking_port/stationary{ + dheight = 0; + dir = 2; + dwidth = 9; + height = 25; + id = "emergency_home"; + name = "MetaStation emergency evac bay"; + width = 29 + }, +/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "dcE" = ( -/turf/open/space, /turf/closed/wall/shuttle{ - icon_state = "swall_f10"; + icon_state = "swall8"; dir = 2 }, /area/shuttle/escape) @@ -99235,17 +99239,15 @@ /turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "dcJ" = ( -/obj/machinery/status_display{ - pixel_y = 32 +/turf/closed/wall/shuttle{ + icon_state = "swall4"; + dir = 2 }, -/obj/machinery/hologram/holopad, -/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "dcK" = ( -/obj/structure/sign/nosmoking_2, +/obj/structure/sign/bluecross_2, /turf/closed/wall/shuttle{ - icon_state = "swall3"; - dir = 2 + icon_state = "swall2" }, /area/shuttle/escape) "dcL" = ( @@ -99258,17 +99260,25 @@ }, /area/shuttle/escape) "dcM" = ( -/turf/open/floor/plating{ - dir = 1; - icon_state = "delivery" +/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) "dcN" = ( -/obj/machinery/recharge_station, -/turf/open/floor/plating{ - icon_state = "bot" +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 2; + icon_state = "1-2" }, -/area/shuttle/escape) +/turf/open/floor/plasteel{ + icon_state = "white" + }, +/area/toxins/xenobiology) "dcO" = ( /obj/structure/table, /obj/item/weapon/clipboard, @@ -99285,16 +99295,16 @@ }, /area/shuttle/escape) "dcQ" = ( -/obj/item/device/radio/intercom{ - dir = 4; - name = "Station Intercom (General)"; - pixel_x = 31 +/obj/structure/cable/yellow{ + d1 = 1; + d2 = 4; + icon_state = "1-4"; + tag = "90Curve" }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plating{ - icon_state = "bot" +/turf/open/floor/plasteel{ + icon_state = "white" }, -/area/shuttle/escape) +/area/toxins/xenobiology) "dcR" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -99335,31 +99345,35 @@ }, /area/shuttle/escape) "dcU" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" +/obj/structure/extinguisher_cabinet, +/turf/closed/wall/shuttle{ + icon_state = "swall12"; + dir = 2 }, /area/shuttle/escape) "dcV" = ( -/obj/structure/chair{ - dir = 8 +/obj/machinery/vending/wallmed{ + name = "Emergency NanoMed"; + pixel_x = 0; + pixel_y = 0; + req_access_txt = "0"; + use_power = 0 }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" +/turf/closed/wall/shuttle{ + icon_state = "swall12"; + dir = 2 }, /area/shuttle/escape) "dcW" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/structure/extinguisher_cabinet{ - pixel_x = -27; - pixel_y = 0 +/obj/structure/cable/yellow{ + d1 = 4; + d2 = 8; + icon_state = "4-8" }, -/turf/open/floor/plating{ - icon_state = "bot" +/turf/open/floor/plasteel{ + icon_state = "white" }, -/area/shuttle/escape) +/area/toxins/xenobiology) "dcX" = ( /obj/structure/closet/crate{ name = "emergency supplies crate" @@ -99382,155 +99396,112 @@ }, /area/shuttle/escape) "dcY" = ( -/obj/docking_port/stationary{ - dheight = 0; - dir = 4; - dwidth = 5; - height = 14; - id = "emergency_home"; - name = "emergency evac bay"; - width = 25 +/obj/structure/cable/yellow{ + d1 = 2; + d2 = 8; + icon_state = "2-8"; + tag = "" }, -/obj/docking_port/mobile/emergency{ - dheight = 0; - dir = 4; - dwidth = 5; - height = 14; - width = 25 +/obj/machinery/light/small{ + dir = 4 }, -/obj/machinery/door/airlock/shuttle{ - name = "Emergency Shuttle Airlock" +/turf/open/floor/plasteel{ + icon_state = "white" }, -/turf/open/floor/plasteel/shuttle, -/area/shuttle/escape) +/area/toxins/xenobiology) "dcZ" = ( -/obj/machinery/vending/wallmed{ - name = "Emergency NanoMed"; - pixel_x = 0; - pixel_y = 0; - req_access_txt = "0"; - use_power = 0 +/obj/item/device/radio/intercom{ + freerange = 0; + frequency = 1459; + name = "Station Intercom (General)"; + pixel_x = 29 }, -/turf/closed/wall/shuttle{ - icon_state = "swall3"; - dir = 2 +/turf/open/floor/plasteel{ + icon_state = "chapel" }, -/area/shuttle/escape) +/area/chapel/main) "dda" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating{ - icon_state = "bot" +/obj/structure/chair/comfy/black{ + dir = 8 }, -/area/shuttle/escape) +/turf/open/floor/plasteel{ + dir = 4; + icon_state = "chapel" + }, +/area/chapel/main) "ddb" = ( -/obj/machinery/space_heater, -/obj/structure/extinguisher_cabinet{ - pixel_x = 27; - pixel_y = 0 - }, -/turf/open/floor/plating{ - icon_state = "bot" +/turf/closed/wall/shuttle{ + icon_state = "swall_s6"; + dir = 2 }, /area/shuttle/escape) "ddc" = ( -/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" +/turf/closed/wall/shuttle{ + icon_state = "swall1" }, /area/shuttle/escape) "ddd" = ( -/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" +/obj/structure/sign/nosmoking_2, +/turf/closed/wall/shuttle{ + icon_state = "swall12"; + dir = 2 }, /area/shuttle/escape) "dde" = ( -/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" +/turf/closed/wall/shuttle{ + icon_state = "swall_s10"; + dir = 2 }, /area/shuttle/escape) "ddf" = ( -/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" - }, +/obj/structure/chair, +/turf/open/floor/plasteel/shuttle/white, /area/shuttle/escape) "ddg" = ( -/turf/open/floor/plating{ - dir = 1; - icon_state = "warning" +/obj/structure/shuttle/engine/propulsion{ + dir = 4 }, +/turf/open/floor/plating/airless, /area/shuttle/escape) "ddh" = ( -/obj/structure/extinguisher_cabinet, -/turf/closed/wall/shuttle{ - icon_state = "swall3"; - dir = 2 +/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) "ddi" = ( -/turf/closed/wall/shuttle{ - icon_state = "swall7"; - dir = 2 - }, -/area/shuttle/escape) -"ddj" = ( -/obj/structure/chair{ +/obj/structure/shuttle/engine/heater{ dir = 8 }, -/obj/structure/sign/bluecross_2{ - pixel_x = 32 +/obj/structure/window/reinforced{ + dir = 4 }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" +/turf/open/floor/plating/airless, +/area/shuttle/escape) +"ddj" = ( +/obj/structure/chair/office/dark{ + dir = 1 }, +/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "ddk" = ( +/obj/machinery/status_display, /turf/closed/wall/shuttle{ - icon_state = "swall8"; + icon_state = "swall3"; dir = 2 }, /area/shuttle/escape) "ddl" = ( -/obj/structure/sign/bluecross_2, -/turf/closed/wall/shuttle{ - icon_state = "swall4"; - dir = 2 +/obj/structure/chair{ + dir = 1 }, +/turf/open/floor/plasteel/shuttle/white, /area/shuttle/escape) "ddm" = ( /obj/machinery/door/airlock/glass_medical{ @@ -99547,12 +99518,11 @@ }, /area/shuttle/escape) "ddo" = ( -/obj/machinery/sleeper{ +/obj/structure/sign/bluecross_2, +/turf/closed/wall/shuttle{ + icon_state = "swall14"; dir = 2 }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" - }, /area/shuttle/escape) "ddp" = ( /obj/structure/table, @@ -99577,21 +99547,16 @@ }, /area/shuttle/escape) "ddr" = ( -/obj/machinery/shower{ - dir = 4; - icon_state = "shower"; - name = "emergency shower" +/obj/machinery/status_display{ + dir = 8; + pixel_x = 32; + pixel_y = 0 }, +/obj/machinery/hologram/holopad, /turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "dds" = ( -/obj/structure/sink{ - dir = 4; - icon_state = "sink"; - pixel_x = 11; - pixel_y = 0 - }, -/turf/open/floor/plasteel/shuttle, +/turf/open/floor/plasteel/floorgrime, /area/shuttle/escape) "ddt" = ( /obj/structure/table, @@ -99639,27 +99604,17 @@ /area/shuttle/escape) "ddv" = ( /obj/structure/table, -/obj/item/weapon/scalpel{ - pixel_y = 12 +/obj/item/weapon/paper_bin{ + pixel_x = -2; + pixel_y = 8 }, -/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; + dir = 2; name = "Station Intercom (General)"; pixel_x = 0; - pixel_y = -27 - }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" + pixel_y = -31 }, +/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "ddw" = ( /obj/structure/table/optable, @@ -99669,32 +99624,31 @@ }, /area/shuttle/escape) "ddx" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/item/device/radio/intercom{ +/obj/structure/table, +/obj/item/weapon/folder/blue, +/obj/structure/extinguisher_cabinet{ dir = 4; - name = "Station Intercom (General)"; - pixel_x = 31 - }, -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor3" + pixel_x = 0; + pixel_y = -27 }, +/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "ddy" = ( -/obj/machinery/status_display, -/turf/closed/wall/shuttle{ - icon_state = "swall12"; - dir = 2 +/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) "ddz" = ( -/obj/structure/chair, -/obj/structure/reagent_dispensers/peppertank{ - pixel_x = 0; - pixel_y = 29 +/obj/machinery/door/airlock/shuttle{ + name = "Emergency Shuttle Cargo Bay Airlock" }, -/turf/open/floor/plasteel/shuttle/red, +/turf/open/floor/plasteel/delivery, /area/shuttle/escape) "ddA" = ( /obj/structure/chair{ @@ -99747,60 +99701,37 @@ }, /area/shuttle/escape) "ddI" = ( -/obj/machinery/flasher{ - id = "emshuttlebridgeflash"; - pixel_y = -24 +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "floorgrime" }, -/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "ddJ" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/flasher{ - id = "emshuttleflash"; - pixel_y = -24 - }, -/turf/open/floor/plasteel/shuttle/red, +/obj/machinery/shower, +/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "ddK" = ( -/obj/structure/chair{ - dir = 1 +/obj/machinery/sleeper{ + dir = 8 }, -/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, +/turf/open/floor/plasteel/shuttle/white, /area/shuttle/escape) "ddL" = ( -/obj/structure/table, -/obj/item/weapon/folder/red{ - pixel_x = 3 +/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 }, -/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) "ddM" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plasteel/shuttle/red, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plasteel/delivery, /area/shuttle/escape) "ddN" = ( /obj/machinery/door/airlock/glass_command{ @@ -99828,14 +99759,8 @@ /turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "ddR" = ( -/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, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plasteel/delivery, /area/shuttle/escape) "ddS" = ( /obj/machinery/door/airlock/command{ @@ -99846,30 +99771,17 @@ /turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "ddT" = ( -/turf/open/floor/plasteel/shuttle{ - icon_state = "shuttlefloor4" - }, +/turf/open/floor/plasteel/delivery, /area/shuttle/escape) "ddU" = ( -/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" - }, +/obj/machinery/recharge_station, +/turf/open/floor/plasteel/delivery, /area/shuttle/escape) "ddV" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/machinery/status_display{ - pixel_y = 31 - }, -/turf/open/floor/plating{ - icon_state = "floorgrime" +/obj/structure/chair{ + dir = 8 }, +/turf/open/floor/plasteel/shuttle/red, /area/shuttle/escape) "ddW" = ( /obj/structure/chair/office/dark{ @@ -99882,24 +99794,34 @@ /turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "ddY" = ( -/obj/structure/chair/office/dark{ - dir = 4 +/obj/structure/reagent_dispensers/peppertank, +/turf/closed/wall/shuttle{ + icon_state = "swall3"; + dir = 2 }, -/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "ddZ" = ( -/obj/structure/table, -/obj/item/weapon/folder/blue, -/obj/structure/extinguisher_cabinet{ - pixel_x = 27; - pixel_y = 0 +/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 }, -/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "dea" = ( -/turf/closed/wall/shuttle{ - icon_state = "swallc4"; - dir = 2 +/obj/machinery/suit_storage_unit/standard_unit, +/turf/open/floor/plating{ + icon_state = "floorgrime" }, /area/shuttle/escape) "deb" = ( @@ -99919,17 +99841,9 @@ /turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "dee" = ( -/obj/structure/table, -/obj/item/weapon/paper_bin{ - pixel_x = -2; - pixel_y = 8 +/turf/open/floor/plasteel/warning{ + dir = 4 }, -/obj/item/device/radio/intercom{ - dir = 4; - name = "Station Intercom (General)"; - pixel_x = 31 - }, -/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "def" = ( /obj/structure/table, @@ -99978,24 +99892,30 @@ /turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "dem" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plating{ - icon_state = "floorgrime" +/turf/closed/wall/shuttle{ + icon_state = "diagonalWall3" }, /area/shuttle/escape) "den" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = -27; - pixel_y = 0 +/obj/structure/table, +/obj/item/weapon/folder/red{ + pixel_x = 3 }, -/obj/structure/chair{ - dir = 1 +/obj/item/weapon/folder/white{ + pixel_x = -4; + pixel_y = 2 }, -/turf/open/floor/plating{ - icon_state = "floorgrime" +/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) "deo" = ( /obj/structure/reagent_dispensers/watertank, @@ -100004,13 +99924,27 @@ }, /area/shuttle/escape) "dep" = ( -/turf/open/space, -/turf/closed/wall/shuttle{ - icon_state = "diagonalWall3" +/obj/structure/table, +/obj/item/weapon/scalpel{ + pixel_y = 12 }, -/turf/closed/wall/shuttle{ - icon_state = "swall_f5"; - dir = 2 +/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) "deq" = ( @@ -100020,23 +99954,31 @@ }, /area/shuttle/escape) "der" = ( -/turf/open/space, -/turf/closed/wall/shuttle{ - icon_state = "swall_f9"; - dir = 2 - }, +/obj/structure/sink, +/turf/open/floor/plasteel/shuttle, /area/shuttle/escape) "des" = ( -/obj/structure/window/reinforced{ +/obj/structure/rack{ dir = 1 }, -/obj/structure/shuttle/engine/heater, -/turf/open/floor/plating/airless, +/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) "det" = ( -/turf/open/space, -/turf/closed/wall/shuttle{ - icon_state = "diagonalWall3" +/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) "deu" = ( @@ -100045,15 +99987,16 @@ }, /area/shuttle/escape) "dev" = ( -/turf/open/space, /turf/closed/wall/shuttle{ - dir = 4; - icon_state = "diagonalWall3" + icon_state = "swall_s5"; + dir = 2 }, /area/shuttle/escape) "dew" = ( -/obj/structure/shuttle/engine/propulsion, -/turf/open/floor/plating/airless, +/turf/closed/wall/shuttle{ + icon_state = "swall_s9"; + dir = 2 + }, /area/shuttle/escape) "dex" = ( /obj/structure/grille, @@ -100667,6 +100610,20 @@ icon_state = "warning" }, /area/hydroponics) +"dfJ" = ( +/obj/structure/bookcase{ + name = "Holy Bookcase" + }, +/turf/open/floor/plasteel{ + dir = 4; + icon_state = "chapel" + }, +/area/chapel/main) +"dfK" = ( +/turf/closed/wall/shuttle{ + icon_state = "swall2" + }, +/area/shuttle/escape) (1,1,1) = {" aaa @@ -121676,7 +121633,7 @@ cSr cSR cSQ cSr -cUd +cUe cRQ aaa aaf @@ -121930,10 +121887,10 @@ cQW cNm cRV cSr -cSQ -cSQ -cTE -cUe +cTJ +cTn +cSr +cTK cRQ aaa aaf @@ -122188,10 +122145,10 @@ cRz cRW cSs cSS -cTn -cSr -cTK -cRQ +cOU +cTF +cUf +cOU aaa aaf aaa @@ -122446,9 +122403,9 @@ cRX cSt cST cOU -cTF -cUf -cOU +cTG +cUg +cUt aaa aaf aaa @@ -122703,9 +122660,9 @@ cRY cSu cXo cOU -cTG -cUg -cUt +cOU +cOU +cOU aaf aaf aaa @@ -122719,7 +122676,7 @@ aaa aaa aaa aaa -aaa +aac aaa aaa aaa @@ -122960,20 +122917,20 @@ cOU cSv cXc cOU +dfJ cOU -cOU -cOU -aaf -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa +ddg +ddg +ddg +deu +ddg +ddg +deu +ddg +ddg +ddg aaa aaa aaa @@ -123216,22 +123173,22 @@ cNm cRZ cSw cXp -cOU cTH +cRh cOU aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +cTE +ddi +ddi +ddi +deu +ddi +ddi +deu +ddi +ddi +ddi +dem aaa aaa aaa @@ -123473,23 +123430,23 @@ cRB cSa cSx cSX -cTo +cSB cTI cOU -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ddb +dcF +dcF +dcF +dcF +dcF +dcF +dcF +dcy +dcF +dcF +dcF +dcF +dev aaa aaa aaa @@ -123733,20 +123690,20 @@ cSY cTp cTJ cUh -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aac +dcz +deg +def +deh +dei +dek +dej +del +dcU +ddI +ddI +ddI +deo +dcz aaa aaa aaa @@ -123990,20 +123947,20 @@ cSY cRe cTJ cUh -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +dcz +dec +dcI +ded +ddW +ddj +dcI +ddv +dcA +dcP +dcP +dcP +dcP +deb aaa aaa aaa @@ -124247,20 +124204,20 @@ cSZ cTq cTK cUh -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +dcz +ddX +ddj +dcI +dcI +dcI +ded +ddx +dcE +deb +dcJ +dcP +dcP +deb aaa aaa aaa @@ -124504,20 +124461,20 @@ cSY cRe cTJ cUh -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +dcz +ddQ +ddP +dcI +dcI +dcI +dcI +dcI +ddS +ddD +dcA +dea +dea +dcz aaa aaa aaa @@ -124761,20 +124718,20 @@ cSY cTp cTJ cUh -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +dcC +dcF +ddk +ddc +ddN +dfK +ddk +dcF +ddO +dcF +ddn +ddk +dcF +deq aaa aaa aaa @@ -125018,29 +124975,29 @@ cTa cTr cTL cOU -dcy -dcF -dcF -dcB -dcz -dcY -dcF -dcz -dcz -dcz -dcK -dcB -dcz -dcB -dcF -dcz -dcF -ddi -dcz -dcz -dcz -dcz -dep +dcA +ddH +dcI +dcI +dcI +dcI +dcI +ddH +dcE +ddA +ddA +ddA +den +dcA +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -125272,33 +125229,33 @@ cOU cSd cSB cTb +dcZ +dda cOU -cOU -cOU -dcA -dcH +dcz dcI dcI -dcU dcI -ddc -dcU -dcU -dcU -dcU dcI -dcU dcI -dcU dcI -ddH -dcA -ddQ -ddX -dec -deg -dcA -det +dcI +ddF +ddD +ddD +ddD +ddG +dcz +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -125530,33 +125487,33 @@ cOU cOU cOU cOU -aaa -aaf -dcz -dcG -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -ddy -ddP -ddW -dcI -def +cOU +cOU dcA -des -dew +ddf +dcI +ddl +dcz +ddf +dcI +ddl +dcz +ddC +ddD +ddD +ddE +dcz +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -125786,34 +125743,34 @@ cPh cSe cSC cTc -cRK -cRK -cRK +cTs +cTM +cTs +dcB +dcI +dcI +ddl +dcV +ddf +dcI +ddl dcA -dcH -dcI -dcI -dcV -dcV -dcV -dcV -dcV -dcI -dcV -dcV -dcV -dcV -dcV -dcI -dcI +ddC +ddV +ddV +ddB dcA -dcI -dcI -ddY -dei -dcA -des -dew +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -126043,34 +126000,34 @@ cNy cNy cSD cTd -cTs -cTM -cTs -dcB -dcI -dcI -dcI +cRK +cRK +cRK dcz -dcZ +ddf +dcI +ddl dcz +ddf +dcI ddh -dcz -dcI -dcz -ddh -dcz -dcZ -dcz -dcI -dcI -ddN -dcI -dcI -ded -deh -dcA -des -dew +dcC +dcF +ddY +ddk +dcF +deq +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -126300,34 +126257,34 @@ cNy cSf cSE cTe -cRK -cRK -cRK +cTs +cTd +cTs +dcB +dcI +dcI +ddl +dcU +ddf +dcI +ddl dcA -dcJ -dcI -dcI -dcU -dcU -dcU -dcU -dcU -dcI -dcU -dcU -dcU -dcU -dcU -dcI -ddI +ddu +ddt +ddw +dep dcA -ddR -dcI -ddW -dek -dcA -deu -deu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -126557,34 +126514,34 @@ cNy cSg cSD cTd -cTs -cTd -cTs -dcB +cRK +cRK +cRK +ddd +ddf +dcI +ddl +dcz +ddf +dcI +ddl +dcz +ddJ dcI dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -dcI -ddy -dcI -ddY -dcI -dej -dcA -des -dew +der +dcz +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -126815,33 +126772,33 @@ cSh cSD cTd cRK -cRK -cRK -dcA -dcL +aaa +aaf +dcz +ddf dcI dcI -dcV -dcV -dcV -ddj -dcV dcI -dcV -dcV -ddx -dcV -dcV dcI -ddH -dcA dcI -ddZ -dee -del -dcA -des -dew +dcI +ddm +dcI +dcI +dcI +ddq +dcz +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -127074,31 +127031,31 @@ cTf cRK aaa aaf -dcC -dcK -dcD -dcD -dcF dcz -dcF -ddi +ddf +dcI +ddl dcz -ddm +ddf +dcI +ddl dcz -dcF -ddi -dcF -dcz -ddF -dcF -ddO -ddS -ddi -dcF -dcF -deq -deu -deu +ddK +ddK +dcI +ddp +dcA +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -127329,33 +127286,33 @@ cSj cSD cTd cRK -cRK -cRK -dcA -dcN -dcM -dcM -dcW -dda -dde -ddk -ddo +aaa +aaf +dcz +ddf dcI -ddr -ddu -dcA -ddA -ddA -ddD -ddK -dcA -ddT -deb -dcP -den -dcA -des -dew +ddl +dcU +ddf +dcI +ddl +ddo +dcF +dcz +ddm +dcK +deq +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -127585,34 +127542,34 @@ cNy cSg cSD cTd -cTs -cTd -cTs -dcD +cRK +cRK +cRK +dcA dcM -dcP -dcP -dcP -dcT -ddd +dcI +ddl dcz -ddo +ddf dcI -dcI -ddt -dcA -ddz -ddD -ddD -ddJ -dcC -dcF -dea -dcP -dem +ddl dcA +ddL +ddZ +dee des -dew +dcA +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -127843,33 +127800,33 @@ cSk cSF cTg cTs -cTN +cTd cTs dcD -dcM -dcP -dcT -dcP -dcP -ddg -ddm dcI dcI +ddl +dcV +ddf dcI -ddw -ddy -ddC -ddD -ddD +ddl +dcz ddM +dcT +dds +ddy dcA -ddV -dcP -dcP -dem -dcA -des -dew +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -128102,30 +128059,30 @@ cTh cRK cRK cRK -dcA -dcO -dcQ -dcS -dcX -ddb +dcz ddf +dcI ddl -ddp -ddq +dcz +ddf +dcI +ddl +dcU +ddR dds -ddv -dcA -ddB -ddE -ddG -ddL -dcA -ddU -dcP -dcP -deo -dcA -dev +dds +dcX +dcz +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -128356,32 +128313,32 @@ cRJ cSl cSG cTi -cRK +cTs +cTN +cTs +dcB +dcI +dcI +dcI +dcI +dcI +dcI +dcI +ddz +ddT +dds +dcT +dcS +dcz +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa -aaf -dcE -dcF -dcF -dcz -dcz -dcF -dcF -ddn -dcF -dcz -dcz -dcF -ddn -dcF -dcz -dcz -dcF -ddn -dcz -deb -deb -dcz -der aaa aaa aaa @@ -128613,23 +128570,23 @@ cRK cRq cRK cRq -cRq -aaa -aaf -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +cRK +cRK +cRK +dcA +dcI +dcI +dcI +dcI +dcI +dcI +dcI +ddz +ddT +dds +dds +det +dcA aaa aaa aaa @@ -128873,20 +128830,20 @@ aaf aaa aaa aaf -aaa -aaa -aaa -aaf -aaa -aaa -aaa -aaa -aaf -aaf -aaf -aaf -aaf -aaf +dcA +dcH +dcG +dcH +dcI +ddr +dcI +dcL +ddd +ddU +ddT +ddT +dcO +dcA aaf aaf aaf @@ -129130,20 +129087,20 @@ aaf aaf aaf aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaa -aaa -aaa -aaa -aaa +dde +dcF +dcz +dcF +dcz +dcF +dcz +dcF +ddn +dcF +dcz +dcz +dcF +dew aaa aaa aaf @@ -129381,7 +129338,8 @@ cQd cQM cRs aaa -aaf +aaa +aaa aaa aaa aaf @@ -129390,29 +129348,28 @@ aaa aaa aaa aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaf aaa aaa aaa aaa -aaf -cTC -cTC -cTC -cTC -cTC aaa aaa -aaf -aaf aaa -aaf -aaf aaa -aaf -aaf -aai -aag +aaa aaa aaa aaa @@ -129638,39 +129595,39 @@ cQe cQN cRq aaa -aaf aaa -cTC -cTC -cTy -cTy -cTC -cTC -cTC -cTC -cTC -cTC -cTC -cTC -cTC -cTC -cVt -dfw -cVB -cTC -cTC -cTC -aaf +aaa aaa aaa aaf aaa aaa aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaf aaa -aag -aag +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -129894,40 +129851,40 @@ bVE bVE bVE bVE -aaf -aaf -aaf -cTC -cUl -cUz -cUS -cVc -cVo -cVt -cVD -cVN -cVo -cVt -dfs -cVN -cVo -cVs -cVC -cVB -cTC -cXd -cTC -cTC -cTC -cTC -cTC -cTC -cTC -cTC -aaf +aaa +aaa +aaa +aaa +aaa aaf aaa -aai +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -130152,38 +130109,41 @@ cQf cPq acn acn +aaa +aaa +aaa +aaa aaf aaa -cTC -cUk -cUy -cUR -cVb -cVo -cVs -cVC -cVB -cVo -cVs -cVC -cVB -cVo -cVs -cVB -cVB -cTC -cXb -cXv -cXv -cXv -cXv -cXv -cXv -deO -cTC +aaa +aaf aaa aaa aaa +aaa +aaa +aaf +aaa +aaa +aaa +aaa +aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaf +aaf +aaa +aaf +aaf +aaa +aaf +aaf +aai aag aaa aaa @@ -130219,9 +130179,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (116,1,1) = {" aaa @@ -130408,39 +130365,42 @@ bVE bVE bVE aaf -aaf +aaa +aaa +aaa +aaa +aaa aaf aaa cTC -cUn -cUC -cUV -cVe -cVo -cVs -cVB -cVB -cVo -cVs -cVB -cVB -cVo -cWw -cWE -cWL cTC -cXf +cTy +cTy +cTC +cTC +cTC +cTC +cTC +cTC +cTC +cTC +cTC cTC cTC cTC cTC cTC cTC -deP cTC aaf aaa aaa +aaf +aaa +aaa +aaa +aaf +aaa aag aag aaa @@ -130476,9 +130436,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (117,1,1) = {" aaa @@ -130664,41 +130621,44 @@ cOx bVE aaf aaf -aaa -aaa +aaf +aaf +aaf +aaf +aaf +aaf +aaf +aaf +cTC +cUl +cUz +cUS +cVc +cVo +cVt +cVD +cVN +cVo +cVt +dfs +cVN +cVo +cVt +dfw +cVB +cTC +cXd +cTC +cTC +cTC +cTC +cTC +cTC +cTC +cTC +aaf aaf aaa -cTC -cUm -cUA -cUU -cVd -cVo -cVu -cVE -cVO -cVo -cWe -cWj -cWo -cVo -cVw -cWD -cWK -cWV -cXe -cXw -cTC -cVB -deF -deJ -cTC -deP -cTC -cTC -cTC -cTC -aaa aai aaa aaa @@ -130733,9 +130693,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa "} (118,1,1) = {" aaa @@ -130922,44 +130879,44 @@ bVE aaa aaf aaa -cTO -cTC -cTC -cTC -cTC -cUA -cUU -cVg -cTu -cVw -cVG -cVS -cWb -cVw -cWk -cWp -cWb -cWy -cVH -cWN -cWX -cXh -dex -deC -cVB -cVB -cVB -cTC -deP -cTC -dfz -dfA -cTC +aaa +aaa +aaa +aaa +aaa aaf +aaa +cTC +cUk +cUy +cUR +cVb +cVo +cVs +cVC +cVB +cVo +cVs +cVC +cVB +cVo +cVs +cVC +cVB +cTC +cXb +cXv +cXv +cXv +cXv +cXv +cXv +deO +cTC +aaa +aaa +aaa aag -aaf -aaa -aaa aaa aaa aaa @@ -131179,45 +131136,45 @@ cTu cTy cTy cTy +cTy +cTy +cTy +aaa +aaf +aaf +aaa cTC -cTR -cTU -cTY -cUo -cUD -cUW -cVf -cVp -cVv -cVF -cVR -cVZ -cWf -cVF -cVR -cWu -cWx -cYU -deT -cWW -cXg -cXx -deB -deB -deG +cUn +cUC +cUV +cVe +cVo +cVs cVB +cVB +cVo +cVs +cVB +cVB +cVo +cWw +cWE +cWL cTC -deQ -cTy -deV -deV -cTy -aaa -aaa -aaa -aaa +cXf +cTC +cTC +cTC +cTC +cTC +cTC +deP +cTC +aaf aaa aaa +aag +aag aaa aaa aaa @@ -131435,46 +131392,46 @@ cTt cTw cTz cTA -cTB -cTP -cTT -cTW -cUj -cUp -cUF -cUY -cVi -cVr -cVy -cVI -cVV -cWd -cWd -cYG -cYH -cWd -cWd -cWd -cWP -cWY -cXj -dez -cVB -cVB -cVC -deL +dcN +dcN +dcQ +cTy +aaa +aaa +aaf +aaa +cTC +cUm +cUA +cUU +cVd +cVo +cVu +cVE +cVO +cVo +cWe +cWj +cWo +cVo +cVw +cWD +cWK +cWV +cXe +cXw +cTC +cVB +deF +deJ +cTC +deP +cTC +cTC +cTC cTC -deR -deS -deW -deW -deX -cXl -aaa -aaa -aaa -aaa aaa +aai aaa aaa aaa @@ -131693,45 +131650,45 @@ cTv cTy cTy cTy +cTy +dcW +cTy +aaa +cTO cTC -cTS -cTV -cUi cTC -cUE -cUX -cVh -cVq -cVx +cTC +cTC +cUA +cUU +cVg +cTu +cVw +cVG +cVS +cWb +cVw +cWk +cWp +cWb +cWy cVH -cVU -cWc -cWg -cVH -cWq -cWv -cWg -cYU -deU -cVh -cXi -dey -deD +cWN +cWX +cXh +dex +deC +cVB +cVB cVB -deH -deK cTC -cXs -cTy -deV -deV -cTy -aaa +deP +cTC +dfz +dfA +cTC aaf -aaa -aaa -aaa -aaa +aag aaa aaa aaa @@ -131950,43 +131907,43 @@ bVE aaa aaf aaa -cTQ +cTy +dcW +cTy +cTy cTC -cTX -cTC -cTC -cUG -cUX -cVk -cTu -cVA -cVL -cVX -cWb -cWi -cWn -cVX -cWb -cVx -cVH -cWR -cXa -cXr -deA -deC +cTR +cTU +cTY +cUo +cUD +cUW +cVf +cVp +cVv +cVF +cVR +cVZ +cWf +cVF +cVR +cWu +cWx +cYU +deT +cWW +cXg +cXx +deB +deB +deG cVB -cVB -deN cTC -cXs -cTC -dfz +deQ +cTy deV -cTC -aaa -aag -aaa -aaa +deV +cTy aaa aaa aaa @@ -132207,44 +132164,44 @@ bVE aaa aaf aaa -aaa -aaf -crZ +cTy +dcY +dcN +cTB +cTP +cTT +cTW +cUj +cUp +cUF +cUY +cVi +cVr +cVy +cVI +cVV +cWd +cWd +cYG +cYH +cWd +cWd +cWd +cWP +cWY +cXj +dez +cVB +cVB +cVC +deL cTC -cUq -cUG -cUX -cVj -cVo -cVz -cVK -cVW -cVo -cWh -cWm -cWt -cVo -cWz -cWG -cWQ -cWZ -cXq -cXw -cTC -deE -deI -deM -cTC -cXs -cTC -cTC -cTC -cTC -aaf -aag -aaa -aaa -aaa +deR +deS +deW +deW +deX +cXl aaa aaa aaa @@ -132464,47 +132421,47 @@ bVE aaf aaf aaf -aaf -aaf -aaf +cTy +cTy +cTy +cTy cTC -cUw -cUP +cTS +cTV +cUi +cTC +cUE cUX -cVm -cVo +cVh +cVq +cVx +cVH +cVU +cWc +cWg +cVH +cWq +cWv +cWg +cYU +deU +cVh +cXi +dey +deD cVB -cVB -cVs -cVo -cVB -cVB -cVs -cVo -cWC -cWJ -cWU -cTC -cXt -cTC -cTC -cTC -cTC -cTC +deH +deK cTC cXs -cTC +cTy +deV +deV +cTy +aaa aaf aaa aaa -aag -aag -aaa -aaa -aaa -aaa -aaa -aaa aaa aaa aaa @@ -132723,43 +132680,43 @@ aaa aaf aaa aaa -aaf +aaa +aaa +cTQ cTC -cUv -cUH -cUZ -cVl -cVo +cTX +cTC +cTC +cUG +cUX +cVk +cTu +cVA +cVL +cVX +cWb +cWi +cWn +cVX +cWb +cVx +cVH +cWR +cXa +cXr +deA +deC cVB -cVC -cVs -cVo cVB -cVC -cVs -cVo -cWB -cWH -cWT +deN cTC cXs -cXs -cXs -cXs -cXs -cXs -cXs -cXs cTC -aaf -aaf -aaa -aai -aaa -aaa -aaa -aaa +dfz +deV +cTC aaa +aag aaa aaa aaa @@ -132980,37 +132937,42 @@ bVE bVE bVE aaa +aaa +aaa +aaa aaf +crZ cTC -cUx -cUQ -cVa -cVn +cUq +cUG +cUX +cVj cVo -cVB -cVM -cVY +cVz +cVK +cVW cVo -cVN -dft -cVY +cWh +cWm +cWt cVo -cVB -cVC -cVs -cTC -cXu -cTC -cTC +cWz +cWG +cWQ +cWZ +cXq +cXw cTC +deE +deI +deM cTC +cXs cTC cTC cTC cTC aaf -aaa -aaa aag aaa aaa @@ -133044,11 +133006,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (127,1,1) = {" aaa @@ -133236,44 +133193,44 @@ ciE cQP cRu bVE +aaa +aaa +aaa +aaf aaf aaf cTC -cTC -cTy -cTy -cTC -cTC -cTC -cTC -cTC -cTC -cTC -cTC -cTC -cTC +cUw +cUP +cUX +cVm +cVo cVB -dfx -cVY +cVB +cVs +cVo +cVB +cVB +cVs +cVo +cWC +cWJ +cWU +cTC +cXt cTC cTC cTC -aaa -aaf -aaf -aaf -aaf +cTC +cTC +cTC +cXs +cTC aaf aaa -aaf -aaf +aaa aag aag -aaf -aaa -aaa -aaa -aaa aaa aaa aaa @@ -133494,36 +133451,41 @@ bZQ cRv bVE aaa -aaf -aaa -aaf -aaa -aaa -aaa -aaf aaa aaa aaa aaa aaf -aaa -aaa cTC +cUv +cUH +cUZ +cVl +cVo +cVB +cVC +cVs +cVo +cVB +cVC +cVs +cVo +cWB +cWH +cWT cTC +cXs +cXs +cXs +cXs +cXs +cXs +cXs +cXs cTC -cTC -cTC -aaa aaf -aaa -aaa -aaa aaf aaa -aaa -aaa -aaa -aaa aai aaa aaa @@ -133558,11 +133520,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (129,1,1) = {" aaa @@ -133753,34 +133710,39 @@ bVE aaa aaf aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf aaa aaa aaf +cTC +cUx +cUQ +cVa +cVn +cVo +cVB +cVM +cVY +cVo +cVN +dft +cVY +cVo +cVB +cVC +cVs +cTC +cXu +cTC +cTC +cTC +cTC +cTC +cTC +cTC +cTC +aaf aaa aaa -aaa -aaa -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aai aag aaa aaa @@ -133815,11 +133777,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa "} (130,1,1) = {" aaa @@ -134010,20 +133967,30 @@ bVE aaa aaf aaa -aaf -aaa -aaa -aaa -aaf -aaa -aaa -aaf -aaa aaa aaf aaf -aaf -aaf +cTC +cTC +cTy +cTy +cTC +cTC +cTC +cTC +cTC +cTC +cTC +cTC +cTC +cTC +cVB +dfx +cVY +cTC +cTC +cTC +aaa aaf aaf aaf @@ -134031,20 +133998,10 @@ aaf aaf aaa aaf -aaa -aaa -aaa -aaa aaf -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aag +aag +aaf aaa aaa aaa @@ -134267,15 +134224,29 @@ bVE aaa aaf aaa +aaa +aaa aaf +aaa aaf aaa aaa +aaa aaf aaa aaa aaa aaa +aaf +aaa +aaa +cTC +cTC +cTC +cTC +cTC +aaa +aaf aaa aaa aaa @@ -134285,21 +134256,7 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aai aaa aaa aaa diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index e59d566a07a..9fbf3d8fd00 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -2052,7 +2052,7 @@ pixel_x = 6; pixel_y = 24 }, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel{ icon_state = "redcorner"; dir = 4 @@ -2476,17 +2476,11 @@ /turf/open/floor/plasteel, /area/security/prison) "aeR" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/light/small{ + dir = 1 }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/security/prison) +/turf/open/floor/plating, +/area/hallway/secondary/exit) "aeS" = ( /obj/structure/cable{ d1 = 4; @@ -2518,7 +2512,7 @@ d2 = 8; icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, /area/security/prison) "aeV" = ( @@ -2613,36 +2607,22 @@ /turf/open/floor/plating, /area/ai_monitored/security/armory) "afa" = ( -/obj/machinery/door/window/southleft{ - base_state = "right"; - icon_state = "right"; - name = "Armory"; - req_access_txt = "3" +/obj/machinery/door/airlock/shuttle{ + name = "Emergency Shuttle Airlock" }, -/obj/machinery/door/firedoor, -/obj/machinery/light{ +/obj/docking_port/mobile/emergency{ + name = "BoxStation emergency shuttle" + }, +/obj/docking_port/stationary{ dir = 4; - icon_state = "tube1" + dwidth = 12; + height = 18; + id = "emergency_home"; + name = "BoxStation emergency evac bay"; + width = 32 }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/obj/structure/cable{ - d1 = 2; - d2 = 8; - icon_state = "2-8"; - tag = "" - }, -/turf/open/floor/plasteel{ - dir = 6; - icon_state = "warning" - }, -/area/ai_monitored/security/armory) +/turf/open/floor/plating, +/area/shuttle/escape) "afb" = ( /obj/machinery/recharger, /obj/structure/table, @@ -2936,27 +2916,19 @@ /obj/structure/table, /obj/item/device/electropack, /turf/open/floor/plasteel{ - icon_state = "whitehall"; - dir = 2 + icon_state = "red" }, /area/security/prison) "afE" = ( -/obj/machinery/button/flasher{ - id = "insaneflash"; - pixel_y = -26 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel{ - icon_state = "whitehall"; - dir = 2 - }, -/area/security/prison) +/obj/machinery/light/small, +/turf/open/floor/plating, +/area/hallway/secondary/exit) "afF" = ( /obj/structure/table, /obj/item/device/assembly/signaler, +/obj/item/clothing/suit/straight_jacket, /turf/open/floor/plasteel{ - dir = 2; - icon_state = "escape" + icon_state = "red" }, /area/security/prison) "afG" = ( @@ -2972,8 +2944,7 @@ pixel_x = -6 }, /turf/open/floor/plasteel{ - icon_state = "whitehall"; - dir = 2 + icon_state = "red" }, /area/security/prison) "afH" = ( @@ -2985,10 +2956,8 @@ }, /area/security/prison) "afI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel{ - icon_state = "whitehall"; - dir = 2 + icon_state = "red" }, /area/security/prison) "afJ" = ( @@ -2997,8 +2966,7 @@ pixel_y = -27 }, /turf/open/floor/plasteel{ - icon_state = "whitehall"; - dir = 2 + icon_state = "red" }, /area/security/prison) "afK" = ( @@ -3236,13 +3204,13 @@ }, /area/security/prison) "agl" = ( -/obj/machinery/door/airlock/glass_security{ - name = "Insanity Ward"; - req_access_txt = "2" +/obj/machinery/door/airlock/security{ + name = "Interrogation"; + req_access = null; + req_access_txt = "63" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel{ - icon_state = "white" + icon_state = "dark" }, /area/security/prison) "agm" = ( @@ -3312,16 +3280,13 @@ }, /area/security/warden) "ags" = ( -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/structure/chair{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel{ - icon_state = "showroomfloor" + icon_state = "dark" }, -/area/security/warden) +/area/security/prison) "agt" = ( /turf/open/floor/plasteel{ icon_state = "showroomfloor" @@ -3471,46 +3436,14 @@ }, /area/security/main) "agH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel{ - icon_state = "warnwhite"; - dir = 1 - }, -/area/security/prison) -"agI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel{ - icon_state = "warnwhite"; - dir = 5 - }, -/area/security/prison) -"agJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel{ icon_state = "dark" }, -/area/security/brig) -"agK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump{ - dir = 4; - on = 1 - }, -/turf/open/floor/plasteel{ - icon_state = "dark" - }, -/area/security/brig) -"agL" = ( -/obj/structure/table, -/obj/item/weapon/folder/red, -/obj/item/weapon/pen, -/turf/open/floor/plasteel{ - dir = 9; - icon_state = "warnwhite" - }, /area/security/prison) -"agM" = ( +"agI" = ( /obj/machinery/airalarm{ pixel_y = 23 }, @@ -3520,8 +3453,8 @@ /turf/open/floor/plasteel{ icon_state = "dark" }, -/area/security/brig) -"agN" = ( +/area/security/prison) +"agJ" = ( /obj/item/weapon/cigbutt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 @@ -3529,6 +3462,45 @@ /turf/open/floor/plasteel{ icon_state = "dark" }, +/area/security/prison) +"agK" = ( +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/security/prison) +"agL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump{ + dir = 4; + on = 1 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/security/prison) +"agM" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/mask/surgical, +/obj/item/weapon/reagent_containers/spray/cleaner, +/turf/open/floor/plasteel{ + dir = 9; + icon_state = "whitered" + }, +/area/security/brig) +"agN" = ( +/obj/structure/table, +/obj/item/device/radio/intercom{ + freerange = 0; + frequency = 1459; + name = "Station Intercom (General)"; + pixel_x = 0; + pixel_y = 26 + }, +/obj/item/weapon/storage/firstaid/regular, +/turf/open/floor/plasteel{ + dir = 10; + icon_state = "whitered" + }, /area/security/brig) "agO" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -3763,73 +3735,32 @@ }, /area/security/main) "ahm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 +/obj/structure/window/reinforced{ + dir = 4 }, +/obj/structure/table, +/obj/item/weapon/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/weapon/pen, /turf/open/floor/plasteel{ - icon_state = "white" + dir = 5; + icon_state = "whitered" }, -/area/security/prison) +/area/security/brig) "ahn" = ( /turf/closed/wall, /area/maintenance/fsmaint) "aho" = ( -/turf/open/floor/plasteel{ - icon_state = "white" - }, -/area/security/prison) -"ahp" = ( -/obj/machinery/light{ - icon_state = "tube1"; - dir = 8 - }, -/obj/item/device/radio/intercom{ - desc = "Talk through this. It looks like it has been modified to not broadcast."; - dir = 2; - name = "Prison Intercom (General)"; - pixel_x = -25; - pixel_y = -2; - prison_radio = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber{ - dir = 4; - on = 1; - scrub_N2O = 0; - scrub_Toxins = 0 - }, -/turf/open/floor/plasteel{ - icon_state = "white" - }, -/area/security/prison) -"ahq" = ( -/obj/machinery/flasher{ - id = "insaneflash"; - pixel_x = 26 - }, -/obj/machinery/atmospherics/components/unary/vent_pump{ - dir = 1; - external_pressure_bound = 101.325; - on = 1; - pressure_checks = 1 - }, -/turf/open/floor/plasteel{ - icon_state = "white" - }, -/area/security/prison) -"ahr" = ( -/obj/structure/chair{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel{ icon_state = "dark" }, -/area/security/brig) -"ahs" = ( -/turf/open/floor/plasteel{ - icon_state = "dark" - }, -/area/security/brig) -"aht" = ( +/area/security/prison) +"ahp" = ( /obj/structure/chair{ dir = 8 }, @@ -3837,13 +3768,57 @@ /turf/open/floor/plasteel{ icon_state = "dark" }, -/area/security/brig) -"ahu" = ( +/area/security/prison) +"ahq" = ( /obj/structure/table, /obj/item/device/flashlight/lamp, /turf/open/floor/plasteel{ icon_state = "dark" }, +/area/security/prison) +"ahr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel{ + icon_state = "white" + }, +/area/security/brig) +"ahs" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/machinery/airalarm{ + pixel_y = 28 + }, +/turf/open/floor/plasteel{ + dir = 1; + icon_state = "whitered" + }, +/area/security/brig) +"aht" = ( +/obj/machinery/atmospherics/components/unary/vent_pump{ + dir = 4; + on = 1 + }, +/turf/open/floor/plasteel{ + icon_state = "white" + }, +/area/security/brig) +"ahu" = ( +/obj/structure/table, +/obj/item/weapon/storage/box/bodybags, +/obj/structure/extinguisher_cabinet{ + pixel_x = -27; + pixel_y = 0 + }, +/obj/item/weapon/reagent_containers/syringe, +/obj/item/weapon/reagent_containers/glass/bottle/charcoal, +/obj/item/weapon/reagent_containers/glass/bottle/epinephrine, +/turf/open/floor/plasteel{ + dir = 10; + icon_state = "whitered" + }, /area/security/brig) "ahv" = ( /obj/machinery/power/apc{ @@ -3965,21 +3940,21 @@ /turf/open/floor/plasteel, /area/security/main) "ahD" = ( -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/structure/cable{ - d1 = 1; - d2 = 4; - icon_state = "1-4" +/obj/machinery/door/window/westleft{ + base_state = "left"; + dir = 4; + icon_state = "left"; + name = "Infirmary"; + req_access_txt = "0" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel{ - icon_state = "showroomfloor" + dir = 4; + icon_state = "whitered" }, -/area/security/warden) +/area/security/brig) "ahE" = ( /obj/machinery/door/airlock/glass_security{ name = "Brig Control"; @@ -4160,12 +4135,8 @@ /turf/closed/wall, /area/security/main) "ahP" = ( -/obj/machinery/camera{ - c_tag = "Brig Interrogation"; - dir = 8 - }, /turf/open/floor/plasteel{ - icon_state = "dark" + icon_state = "white" }, /area/security/brig) "ahQ" = ( @@ -4224,33 +4195,22 @@ /turf/open/floor/plating, /area/maintenance/fsmaint) "ahU" = ( -/obj/structure/bed, -/obj/item/clothing/suit/straight_jacket, -/obj/machinery/camera{ - c_tag = "Prison Sanitatium"; - dir = 4; - network = list("SS13","Prison"); - pixel_x = 0; +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; pixel_y = 0 }, -/obj/effect/landmark{ - name = "revenantspawn" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /turf/open/floor/plasteel{ - icon_state = "white" + icon_state = "red"; + dir = 9 }, -/area/security/prison) +/area/security/brig) "ahV" = ( -/obj/structure/bed, -/obj/item/clothing/suit/straight_jacket, -/obj/effect/landmark{ - name = "revenantspawn" - }, -/turf/open/floor/plasteel{ - icon_state = "white" - }, -/area/security/prison) -"ahW" = ( /obj/structure/table, /obj/item/weapon/folder/red, /obj/item/device/taperecorder{ @@ -4259,6 +4219,15 @@ /turf/open/floor/plasteel{ icon_state = "dark" }, +/area/security/prison) +"ahW" = ( +/obj/structure/bodycontainer/morgue, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, /area/security/brig) "ahX" = ( /obj/structure/table, @@ -4343,12 +4312,10 @@ /turf/open/floor/plating, /area/maintenance/fsmaint) "aid" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light/small, /turf/open/floor/plasteel{ - icon_state = "dark" + dir = 10; + icon_state = "whitered" }, /area/security/brig) "aie" = ( @@ -4384,19 +4351,14 @@ }, /area/security/warden) "aih" = ( -/obj/structure/table, -/obj/item/weapon/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/weapon/book/manual/wiki/security_space_law, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel{ - icon_state = "showroomfloor" + icon_state = "red"; + dir = 5 }, -/area/security/warden) +/area/security/brig) "aii" = ( /obj/structure/grille, /obj/structure/disposalpipe/segment{ @@ -4438,9 +4400,14 @@ }, /area/security/main) "ail" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/security/brig) +/obj/machinery/camera{ + c_tag = "Brig Interrogation"; + dir = 8 + }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/security/prison) "aim" = ( /obj/machinery/light_switch{ pixel_y = -23 @@ -4451,14 +4418,9 @@ }, /area/security/main) "ain" = ( -/obj/machinery/door/airlock/security{ - name = "Interrogation"; - req_access = null; - req_access_txt = "63" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel{ - icon_state = "dark" + dir = 8; + icon_state = "whitered" }, /area/security/brig) "aio" = ( @@ -4566,24 +4528,18 @@ }, /area/security/main) "aiw" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Security Maintenance"; - req_access_txt = "63" +/obj/machinery/door/window/westleft{ + base_state = "right"; + dir = 4; + icon_state = "right"; + name = "Infirmary"; + req_access_txt = "0" }, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8"; - pixel_y = 0 +/turf/open/floor/plasteel{ + dir = 4; + icon_state = "whitered" }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/main) +/area/security/brig) "aix" = ( /obj/structure/cable{ d1 = 4; @@ -4628,45 +4584,49 @@ /turf/open/floor/plating, /area/maintenance/fsmaint) "aiB" = ( -/obj/structure/table/glass, -/obj/item/weapon/reagent_containers/glass/bottle/morphine, -/turf/open/floor/plasteel{ - icon_state = "white" - }, -/area/security/prison) -"aiC" = ( -/obj/structure/table/glass, -/obj/item/weapon/reagent_containers/syringe, -/turf/open/floor/plasteel{ - icon_state = "white" - }, -/area/security/prison) -"aiD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel{ - icon_state = "dark" - }, -/area/security/brig) -"aiE" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber{ dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0 }, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/security/prison) +"aiC" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/security/prison) +"aiD" = ( +/obj/structure/bodycontainer/morgue, /turf/open/floor/plasteel{ icon_state = "dark" }, /area/security/brig) -"aiF" = ( +"aiE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, /turf/open/floor/plasteel{ icon_state = "dark" }, +/area/security/prison) +"aiF" = ( +/obj/structure/bed, +/obj/item/weapon/bedsheet, +/obj/machinery/iv_drip{ + density = 0 + }, +/obj/item/clothing/suit/straight_jacket, +/turf/open/floor/plasteel{ + icon_state = "whitered" + }, /area/security/brig) "aiG" = ( /turf/open/floor/plasteel{ @@ -4777,20 +4737,19 @@ /turf/open/floor/plating, /area/security/warden) "aiO" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security{ - name = "Security Office"; - req_access = null; - req_access_txt = "63" +/obj/structure/window/reinforced{ + dir = 4 }, -/obj/structure/cable{ - d1 = 1; - d2 = 2; - icon_state = "1-2" +/obj/structure/table, +/obj/item/weapon/storage/firstaid/regular, +/obj/item/device/healthanalyzer{ + pixel_y = -2 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/security/main) +/turf/open/floor/plasteel{ + dir = 6; + icon_state = "whitered" + }, +/area/security/brig) "aiP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, @@ -4827,10 +4786,16 @@ /turf/closed/wall/r_wall, /area/security/processing) "aiW" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/fulltile, -/turf/open/floor/plating, -/area/security/brig) +/obj/machinery/door/airlock/security{ + name = "Interrogation"; + req_access = null; + req_access_txt = "63" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel{ + icon_state = "dark" + }, +/area/security/prison) "aiX" = ( /turf/closed/wall/r_wall, /area/security/brig) @@ -4851,7 +4816,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel{ icon_state = "redcorner"; dir = 1 @@ -4864,7 +4828,9 @@ icon_state = "4-8"; pixel_y = 0 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/security/brig) "ajb" = ( @@ -5069,6 +5035,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel{ icon_state = "red"; dir = 1 @@ -5107,9 +5074,7 @@ }, /area/security/brig) "ajA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel{ icon_state = "red"; dir = 1 @@ -5414,9 +5379,7 @@ c_tag = "Brig West"; dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel{ dir = 2; icon_state = "redcorner" @@ -32677,7 +32640,10 @@ /turf/open/floor/plating, /area/maintenance/asmaint2) "bqh" = ( -/obj/structure/closet, +/obj/machinery/light/small{ + dir = 1 + }, +/obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/asmaint2) "bqi" = ( @@ -34373,8 +34339,10 @@ /turf/open/floor/plating, /area/maintenance/asmaint2) "btq" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 2 +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" }, /turf/open/floor/plating, /area/maintenance/asmaint2) @@ -62423,7 +62391,6 @@ "cwy" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table_frame, -/obj/item/weapon/wirerod, /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/asmaint2) @@ -62768,20 +62735,12 @@ }, /area/shuttle/escape) "cxn" = ( -/obj/machinery/door/airlock/shuttle{ - name = "Emergency Shuttle Airlock" +/obj/structure/lattice, +/obj/effect/landmark{ + name = "carpspawn" }, -/obj/docking_port/mobile/emergency, -/obj/docking_port/stationary{ - dir = 4; - dwidth = 9; - height = 11; - id = "emergency_home"; - name = "emergency evac bay"; - width = 22 - }, -/turf/open/floor/plating, -/area/shuttle/escape) +/turf/open/space, +/area/space) "cxo" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -5; @@ -89603,12 +89562,12 @@ adF aef aeM afz -acd aai aai aai aai -aiV +aai +aai ajt akc akJ @@ -89862,10 +89821,10 @@ aeO afJ acd agL -ahp -ahU +agK +agK aiB -aiX +aai ajw akf aiX @@ -90115,14 +90074,14 @@ abK acY adG aeh -aeR +aeO afI agl agH -ahm +ags +ags aho -aho -aiW +acd ajv ake agj @@ -90373,13 +90332,13 @@ acd acd aek aeU -afE -adF +afI +acd agI ahq ahV -aiC -agj +aho +acd ajy akh afK @@ -90631,12 +90590,12 @@ adF aej aeQ afD -agj -agj -agj -agj -agj -agj +acd +agJ +ahp +ahp +aiC +adF ajx akg agj @@ -90888,12 +90847,12 @@ adI aem aeO afG -agj +acd agK -ahs -ahs +agK +ail aiE -agj +aiW ajA akj agj @@ -91146,10 +91105,10 @@ ael aeO afF agj -agJ -ahs -ahs -aiD +agj +agj +agj +agj agj ajz aki @@ -91662,11 +91621,11 @@ afH agj agN aht -aht +ain aid -ail +agj aiZ -ajF +akk akN alw amg @@ -91918,10 +91877,10 @@ aeT afH agj ahs -ahs +ahr ahP aiF -ain +agj aja ajG akQ @@ -92174,10 +92133,10 @@ aeq aeV acd agj -agj -agj -agj -agj +ahm +ahD +aiw +aiO agj ajD akm @@ -92432,7 +92391,7 @@ afC agk agF agP -agP +ahU agP agP aiz @@ -92689,7 +92648,7 @@ afB agi agD agO -agO +aih agO agO aiy @@ -114071,7 +114030,7 @@ bgg aNa aaa bky -blQ +bqh bme bnx bqe @@ -115332,7 +115291,7 @@ aoV aoV aaa aaa -aaa +aaf aaa aaa aaa @@ -115340,17 +115299,17 @@ aaa aaa aaa aNa -aQF -aRW -aTo +aeR aNa -aaa -aaa -aaa +aQE aNa -aTo -aRW -bdA +aaf +aaa +aaf +aNa +aQE +aNa +afE aNa aaa aaa @@ -115589,28 +115548,28 @@ aaa aaa aaa aaa +aaf aaa aaa aaa aaa aaa -cry -cwI -cwI -cxg -cxl -cxn -cwI -crx -crx -crx -cwI -cxK -cxl -cxK -cwI -cwI -cxW +aaa +aNa +aQE +aNa +aQE +aNa +aaf +aaf +aaf +aNa +aQE +aNa +aQE +aNa +aaa +aaa aaa aaf aaf @@ -115848,36 +115807,36 @@ aaa aaa aaa aaa -cry -cwI -cwI -cwT -cwY -cxd -cxe -cwU -cwL -anq -anq -anq -anq -anq -cwL -cwU -cxQ -cxQ -cxU -cwV -cxW +aaa +aaa +aaa +aaa +aaa +aNa +aQF +aRW +aTo +aNa +aaa aaf aaa +aNa +aTo +aRW +bdA +aNa +aaa +aaa +aaf +aaf +aaf bnu bhG bhG -brE +bhG bhG bsJ -bhG +brE bhG bhG bhG @@ -116104,41 +116063,41 @@ aaa aaa aaa aaa +aaa +aaa +aaa +aaa cry -crO -cwK -cwP -cwU -cwY -cxe -cxh -cwU -cxo -cwL -cwL -cwL -cwL -cwL -cxL -cwU -cxQ -cxQ -cxU -cxX -cxZ -aaf -aaf -aaf +cwI +cwI +cxg +cxl +afa +cwI +crx +crx +crx +cwI +cxK +cxl +cxK +cwI +cwI +cxW +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa bky -bqh +btq brH -btq -btq bvQ bxt bvQ -btq -btq bCm bDh bEs @@ -116361,41 +116320,41 @@ aaa aaa aaa aaa -crx -crN -cwJ -cwO -cwU +aaa +cry +cwI +cwI +cwT cwY +cxd cxe -cxh cwU cwL -cxq -cxq -cxq -cxq -cxq +anq +anq +anq +anq +anq cwL -cxM +cwU cxQ cxQ -cxV -cxX -cxZ -aaf +cxU +cwV +cxW aaa aaa -bky +aaa +aaa +aaa +aaa +aaa +bZi bqg brG -btp -btp brG btp brG -btp -btp brG bDg bEs @@ -116618,41 +116577,41 @@ aae aaa aaa aaa -crx -cwF -cwL -cwR -cwV -crx -cxf -crx -cxm -cwL -cxr -cxr -cxr -cxr -cxr -cwL +cry +crO +cwK +cwP +cwU +cwY +cxe +cxh +cwU +cxo +cwL +cwL +cwL +cwL +cwL +cxL cwU -cxR cxQ -cxV +cxQ +cxU cxX cxZ -aaf -aaf -aaf -bky -bky +aaa +aaa +aaa +aaa +aaa +aaa +aaa +bZi +btp brI -btp -btp bvR btp byx -btp -btp brI bky bky @@ -116876,34 +116835,34 @@ aaa aaa aaa crx -crQ -cwL -cwQ +crN +cwJ +cwO +cwU +cwY +cxe +cxh cwU -cwZ cwL -cxi -cxj +cxq +cxq +cxq +cxq +cxq cwL -cwL -cwL -cwL -cwL -cwL -cwL -cxN -cwI -cwI -cwI +cxM +cxQ +cxQ +cxV cxX cxZ -aaf aaa aaa aaa -bky -bky -bky +aaa +aaa +aaa +aaa bky bky bky @@ -117135,32 +117094,32 @@ aaa crx cwF cwL -cwL -cwX -cwL -cwL -anq -cxj -cwL -cxq -cxq -cxq -cxq -cxq -cwL +cwR +cwV crx -cxc -cxa -cxc +cxf +crx +cxm +cwL +cxr +cxr +cxr +cxr +cxr +cwL +cwU +cxR +cxQ +cxV cxX cxZ -aaf -aaf aaa aaa -aaf aaa -aaf +aaa +aaa +aaa +aaa aaf aaf aaa @@ -117390,38 +117349,38 @@ aaa aaa aaa crx -cwG -amB -amB -cwW -cxa +crQ cwL -cxj +cwQ +cwU +cwZ +cwL +cxi cxj cwL -cxr -cxr -cxr -cxr -cxr cwL -cxO -cxa -cxa -cxa +cwL +cwL +cwL +cwL +cwL +cxN +cwI +cwI +cwI cxX cxZ -aaf -aaf -aaf -aaf -aaf -aaf aaa aaa aaa aaa aaa +aaa +aaa +aaf +aaa +aaa +aaa aaf aaa aaa @@ -117646,39 +117605,39 @@ aaa aaa aaa aaa -crz -cwH -cwN -cwS -cwU -cxc -cwL -cwL -cwL -cwL +crx +cwF cwL cwL +cwX cwL cwL +anq +cxj cwL +cxq +cxq +cxq +cxq +cxq cwL crx +cxc cxa -cxa -cxa +cxc cxX cxZ -aaf -aaf +aaa +aaa +aaa +aaa +aaa aaa aaa aaf aaa aaa aaa -aaa -aaa -aaa aaf aaa aaa @@ -117903,39 +117862,39 @@ aaa aaa aaa aaa -aaa -crz -cwI -cwI -cwT -cxb -cxa -cxa -cxa -cxp -cxs -cxs -cxs -cxs -cxs -cxp crx -cxS -cxT -cxS -cwV -cxY -aaf -aaf -aaf -aaf -aaf +cwG +amB +amB +cwW +cxa +cwL +cxj +cxj +cwL +cxr +cxr +cxr +cxr +cxr +cwL +cxO +cxa +cxa +cxa +cxX +cxZ aaa aaa aaa aaa aaa aaa +aaa +aaf +aaa +aaa +aaa aaf aaa aaa @@ -118160,36 +118119,36 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa crz +cwH +cwN +cwS +cwU +cxc +cwL +cwL +cwL +cwL +cwL +cwL +cwL +cwL +cwL +cwL crx -cwI -crx -cwI -cwI -cwI -crx -crx -crx -cwI -cwI -cxP -crx -cwI -crx -cxY +cxa +cxa +cxa +cxX +cxZ aaa -aaf -aaf aaa aaa aaa aaa aaa aaa +aaf aaa aaa aaa @@ -118418,20 +118377,27 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +crz +cwI +cwI +cwT +cxb +cxa +cxa +cxa +cxp +cxs +cxs +cxs +cxs +cxs +cxp +crx +cxS +cxT +cxS +cwV +cxY aaa aaa aaa @@ -118446,13 +118412,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aag aaa aaa @@ -118678,6 +118637,23 @@ aaa aaa aaa aaa +crz +crx +cwI +crx +cwI +cwI +cwI +crx +crx +crx +cwI +cwI +cxP +crx +cwI +crx +cxY aaa aaa aaa @@ -118686,16 +118662,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aae -aaa -aaa -aaa aaf aaa aaa @@ -118703,13 +118669,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa aag aaa aaa @@ -118938,7 +118897,6 @@ aaa aaa aaa aaa -aae aaa aaa aaa @@ -118958,11 +118916,12 @@ aaa aaa aaa aaa -aae -aaa aaa aaa aaa +aaf +aaf +aaf aaa aaa aaa @@ -119219,7 +119178,7 @@ aaa aaa aaa aaa -aaa +cxn aaa aaa aaa @@ -119475,8 +119434,8 @@ aaa aaa aaa aaa -aaa -aaa +aaf +aaf aaa aaa aaa @@ -120737,7 +120696,7 @@ aaa aaa aaa aaa -aaa +aae aaa aaa aaa diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm index a2953331701..955b079e46b 100644 --- a/_maps/map_files/generic/z2.dmm +++ b/_maps/map_files/generic/z2.dmm @@ -1625,7 +1625,11 @@ /turf/open/floor/plasteel/black, /area/centcom/ferry) "eP" = ( -/obj/structure/flora/kirbyplants, +/obj/machinery/door/airlock/centcom{ + name = "Centcom Backup Docks"; + opacity = 1; + req_access_txt = "101" + }, /turf/open/floor/plasteel/black, /area/centcom/ferry) "eQ" = ( @@ -1658,12 +1662,11 @@ /turf/open/floor/plasteel/black, /area/centcom/ferry) "eU" = ( -/obj/structure/sign/map/left, -/turf/open/floor/light, +/obj/machinery/shuttle_manipulator, +/turf/open/floor/plasteel/circuit, /area/centcom/ferry) "eV" = ( -/obj/structure/sign/map/right, -/turf/open/floor/light, +/turf/open/floor/plasteel/circuit, /area/centcom/ferry) "eW" = ( /obj/structure/extinguisher_cabinet{ @@ -2358,11 +2361,11 @@ "hh" = ( /obj/docking_port/stationary{ dir = 4; - dwidth = 9; - height = 11; + dwidth = 25; + height = 50; id = "emergency_away"; - name = "Centcom"; - width = 22 + name = "Centcom Emergency Shuttle Dock"; + width = 50 }, /turf/open/space, /area/space) @@ -5875,12 +5878,12 @@ /area/shuttle/escape) "rN" = ( /obj/machinery/status_display{ - layer = 4; - pixel_x = 0; - pixel_y = 32 + density = 0; + pixel_y = 32; + supply_display = 1 }, -/turf/open/floor/plasteel/shuttle/white, -/area/shuttle/escape) +/turf/open/floor/plasteel/black, +/area/centcom/ferry) "rO" = ( /turf/open/floor/plasteel/shuttle/white, /area/shuttle/escape) @@ -5897,7 +5900,9 @@ name = "Backup Shuttle Dock"; width = 8 }, -/obj/docking_port/mobile/emergency/backup, +/obj/docking_port/mobile/emergency/backup{ + dwidth = 3 + }, /turf/open/floor/plating, /area/shuttle/escape) "rR" = ( @@ -5924,21 +5929,37 @@ /turf/open/space/transit, /area/space) "rU" = ( +/obj/structure/flora/kirbyplants, /obj/machinery/status_display{ - density = 0; - pixel_y = -30; - supply_display = 1 + pixel_y = 32 }, -/turf/open/floor/plasteel/shuttle/white, -/area/shuttle/escape) +/turf/open/floor/plasteel/black, +/area/centcom/ferry) "rV" = ( /obj/structure/table/wood, /obj/item/weapon/book/manual/random, /turf/open/floor/plasteel/shuttle/white, /area/shuttle/escape) "rW" = ( -/obj/machinery/shuttle_manipulator, -/turf/open/floor/plasteel/black, +/obj/structure/lattice, +/turf/open/space, +/area/space) +"rX" = ( +/obj/machinery/status_display, +/turf/closed/wall/shuttle/smooth, +/area/shuttle/escape) +"rY" = ( +/turf/open/floor/plasteel/darkwarning{ + tag = "icon-warndark (EAST)"; + icon_state = "warndark"; + dir = 4 + }, +/area/centcom/ferry) +"rZ" = ( +/obj/machinery/door/airlock/external{ + name = "Backup Emergency Escape Shuttle" + }, +/turf/open/floor/plasteel/delivery, /area/centcom/ferry) (1,1,1) = {" @@ -36889,7 +36910,7 @@ ab ab ab ab -ab +rL ab ab ab @@ -38457,7 +38478,7 @@ ab ab ab eJ -eO +rN eO eS eO @@ -38710,11 +38731,11 @@ ab ab ab ab -ab -ab -ab eJ -eP +eJ +eJ +eJ +rU eO eO eO @@ -38967,11 +38988,11 @@ ab ab ab ab -ab -ab -ab eJ -rW +eO +eO +eP +eO eO eO eW @@ -39224,9 +39245,9 @@ ab ab ab ab -ab -ab -ab +eJ +rY +eJ eJ eJ eJ @@ -39481,9 +39502,9 @@ ab ab ab ab -ab -ab -ab +eJ +fQ +eJ ab ab ab @@ -39738,9 +39759,9 @@ ab ab ab ab -ab -ab -ab +eJ +rZ +eJ ab ab ab @@ -39994,14 +40015,14 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab +rM +rM +rQ +rM +rM +rM +rM +rM ab ab eJ @@ -40251,14 +40272,14 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab +rX +rO +rO +rO +rO +rO +rO +rX ab ab eJ @@ -40508,14 +40529,14 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab +rM +rO +rO +rO +rO +rO +rO +rM ab ab fh @@ -40765,14 +40786,14 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab +rM +rP +rP +rP +rP +rO +rP +rM ab ab fh @@ -41022,14 +41043,14 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab +rM +rP +rP +rP +rP +rO +rP +rM ab ab fh @@ -41279,14 +41300,14 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab +rM +rO +rR +rO +rO +rO +rO +rM ab ab fh @@ -41536,14 +41557,14 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab +rX +rO +rS +rV +rO +rO +rO +rX ab ab fh @@ -41793,14 +41814,14 @@ ab ab ab ab -ab -ab -ab -ab -ab -ab -ab -ab +rM +rM +rM +rM +rM +rM +rM +rM ab ab fh @@ -57018,7 +57039,7 @@ ab ab ab ab -rL +ab ab ab ab @@ -64829,16 +64850,16 @@ df dg cT ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -65086,16 +65107,16 @@ cT cT cT ab -ad -rM -rM -rQ -rM -rM -rM -rM -rM -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -65343,16 +65364,16 @@ cU ad ab ab -ad -rM -rN -rO -rO -rO -rO -rU -rM -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -65600,16 +65621,16 @@ cV ad ab ab -ad -rM -rO -rO -rO -rO -rO -rO -rM -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -65857,16 +65878,16 @@ cV ad ab ab -ad -rM -rP -rP -rP -rP -rO -rP -rM -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -66114,16 +66135,16 @@ cV ad ab ab -ad -rM -rP -rP -rP -rP -rO -rP -rM -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -66371,16 +66392,16 @@ cV ad ab ab -ad -rM -rO -rR -rO -rO -rO -rO -rM -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -66628,16 +66649,16 @@ cV ad ab ab -ad -rM -rN -rS -rV -rO -rO -rU -rM -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -66885,16 +66906,16 @@ cV ad ab ab -ad -rM -rM -rM -rM -rM -rM -rM -rM -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -67142,16 +67163,16 @@ cV ad ab ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +ab +ab +ab +ab +ab +ab +ab +ab +ab +ab ab ab ab @@ -71473,6 +71494,6 @@ ab ab ab ab -ab -ab +rW +rW "} diff --git a/_maps/shuttles/cargo_birdboat.dmm b/_maps/shuttles/cargo_birdboat.dmm index 423c397f6c1..345fb45a23a 100644 --- a/_maps/shuttles/cargo_birdboat.dmm +++ b/_maps/shuttles/cargo_birdboat.dmm @@ -14,7 +14,7 @@ "n" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/supply) "o" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/turf/open/floor/plating,/area/shuttle/supply) "p" = (/obj/machinery/button/door{dir = 2; id = "QMLoaddoor2"; name = "Loading Doors"; pixel_x = 24; pixel_y = 8},/obj/machinery/button/door{id = "QMLoaddoor"; name = "Loading Doors"; pixel_x = 24; pixel_y = -8},/obj/machinery/conveyor_switch/oneway{id = "cargoshuttle"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/supply) -"q" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 3; width = 10},/turf/open/floor/plating,/area/shuttle/supply) +"q" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 3; width = 10; timid = 1},/turf/open/floor/plating,/area/shuttle/supply) "r" = (/obj/machinery/door/poddoor{id = "QMLoaddoor"; name = "supply dock loading door"},/obj/machinery/conveyor{dir = 4; id = "cargoshuttle"; name = "cargo shuttle conveyor belt"},/turf/open/floor/plating,/area/shuttle/supply) "s" = (/turf/closed/wall/shuttle{icon_state = "swallc3"},/area/shuttle/supply) "t" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/supply) diff --git a/_maps/shuttles/cargo_box.dmm b/_maps/shuttles/cargo_box.dmm index 05df2fa52ba..f2fad41946a 100644 --- a/_maps/shuttles/cargo_box.dmm +++ b/_maps/shuttles/cargo_box.dmm @@ -6,7 +6,7 @@ "f" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/poddoor{id = "QMLoaddoor2"; name = "supply dock loading door"},/turf/open/floor/plating,/area/shuttle/supply) "g" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/turf/open/floor/plating,/area/shuttle/supply) "h" = (/obj/machinery/button/door{dir = 2; id = "QMLoaddoor2"; name = "Loading Doors"; pixel_x = 24; pixel_y = 8},/obj/machinery/button/door{id = "QMLoaddoor"; name = "Loading Doors"; pixel_x = 24; pixel_y = -8},/turf/open/floor/plasteel/shuttle,/area/shuttle/supply) -"i" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 5; width = 12},/turf/open/floor/plating,/area/shuttle/supply) +"i" = (/obj/machinery/door/airlock/shuttle{name = "Supply Shuttle Airlock"; req_access_txt = "31"},/obj/docking_port/mobile/supply{dwidth = 5; width = 12; timid = 1},/turf/open/floor/plating,/area/shuttle/supply) "j" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/poddoor{id = "QMLoaddoor"; name = "supply dock loading door"},/turf/open/floor/plating,/area/shuttle/supply) "k" = (/turf/closed/wall/shuttle{icon_state = "swall7"; dir = 2},/area/shuttle/supply) "l" = (/turf/open/floor/plasteel/shuttle,/turf/closed/wall/shuttle/interior{icon_state = "swall_f10"},/area/shuttle/supply) diff --git a/_maps/shuttles/emergency_airless.dmm b/_maps/shuttles/emergency_airless.dmm index d2d0025ee2f..c1a9f4f3b77 100644 --- a/_maps/shuttles/emergency_airless.dmm +++ b/_maps/shuttles/emergency_airless.dmm @@ -5,15 +5,15 @@ "e" = (/obj/structure/closet/malf,/turf/open/floor/plating/airless,/area/shuttle/escape) "f" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/open/floor/plating/airless,/area/shuttle/escape) "g" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/open/floor/plating/airless,/area/shuttle/escape) -"h" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/open/floor/plating/airless,/area/shuttle/escape) +"h" = (/obj/structure/window/reinforced{dir = 4;pixel_x = 0},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/open/floor/plating/airless,/area/shuttle/escape) "i" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plating/airless,/area/shuttle/escape) "j" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/open/floor/plating/airless,/area/shuttle/escape) "k" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/turf/open/floor/plating/airless,/area/shuttle/escape) "l" = (/turf/open/floor/plating,/area/shuttle/escape) -"m" = (/obj/structure/chair{dir = 8},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/open/floor/plating/airless,/area/shuttle/escape) +"m" = (/obj/structure/chair{dir = 8},/obj/structure/window/reinforced{dir = 4;pixel_x = 0},/turf/open/floor/plating/airless,/area/shuttle/escape) "n" = (/obj/structure/chair{dir = 4},/turf/open/floor/plating/airless,/area/shuttle/escape) -"o" = (/obj/docking_port/mobile/emergency{name = "Shuttle Under Construction"},/turf/open/floor/plating/airless,/area/shuttle/escape) -"p" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 4; name = "4maintenance loot spawner"},/turf/open/floor/plating/airless,/area/shuttle/escape) +"o" = (/obj/docking_port/mobile/emergency{name = "Shuttle Under Construction";timid = 1},/turf/open/floor/plating/airless,/area/shuttle/escape) +"p" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance{lootcount = 4;name = "4maintenance loot spawner"},/turf/open/floor/plating/airless,/area/shuttle/escape) "q" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape) "r" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape) diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm index 387ebe9f888..320859dd4cb 100644 --- a/_maps/shuttles/emergency_bar.dmm +++ b/_maps/shuttles/emergency_bar.dmm @@ -4,83 +4,105 @@ "ad" = (/obj/structure/table/wood,/obj/item/device/flashlight/lamp/green,/turf/open/floor/carpet,/area/shuttle/escape) "ae" = (/obj/structure/chair/comfy/brown{dir = 1},/turf/open/floor/carpet,/area/shuttle/escape) "af" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/carpet,/area/shuttle/escape) -"ag" = (/obj/structure/table/wood,/obj/item/weapon/storage/fancy/cigarettes/cigars/havana,/obj/item/weapon/lighter{pixel_x = -4; pixel_y = 6},/turf/open/floor/carpet,/area/shuttle/escape) +"ag" = (/obj/structure/table/wood,/obj/item/weapon/storage/fancy/cigarettes/cigars/havana,/obj/item/weapon/lighter{pixel_x = -4;pixel_y = 6},/turf/open/floor/carpet,/area/shuttle/escape) "ah" = (/obj/machinery/computer/atmos_alert,/turf/open/floor/carpet,/area/shuttle/escape) "ai" = (/obj/structure/chair/comfy/brown{dir = 8},/turf/open/floor/carpet,/area/shuttle/escape) "aj" = (/turf/open/floor/carpet,/area/shuttle/escape) "ak" = (/obj/structure/chair/comfy/brown{dir = 4},/turf/open/floor/carpet,/area/shuttle/escape) "al" = (/obj/machinery/computer/security,/turf/open/floor/carpet,/area/shuttle/escape) "am" = (/obj/machinery/computer/crew,/turf/open/floor/carpet,/area/shuttle/escape) -"an" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/structure/chair/comfy/brown{dir = 8},/turf/open/floor/carpet,/area/shuttle/escape) -"ao" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/turf/open/floor/carpet,/area/shuttle/escape) -"ap" = (/obj/machinery/button/flasher{id = "cockpit_flasher"; pixel_x = 6; pixel_y = -24},/obj/structure/statue/diamond/captain{anchored = 1; name = "statue of THE captain"},/turf/open/floor/carpet,/area/shuttle/escape) +"an" = (/obj/structure/extinguisher_cabinet{pixel_x = 0;pixel_y = -30},/obj/structure/chair/comfy/brown{dir = 8},/turf/open/floor/carpet,/area/shuttle/escape) +"ao" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)";pixel_x = 0;pixel_y = -29},/turf/open/floor/carpet,/area/shuttle/escape) +"ap" = (/obj/machinery/button/flasher{id = "cockpit_flasher";pixel_x = 6;pixel_y = -24},/obj/structure/statue/diamond/captain{anchored = 1;name = "statue of THE captain"},/turf/open/floor/carpet,/area/shuttle/escape) "aq" = (/obj/machinery/computer/communications,/turf/open/floor/carpet,/area/shuttle/escape) -"ar" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Cockpit"; req_access_txt = "19"},/turf/open/floor/carpet,/area/shuttle/escape) +"ar" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Cockpit";req_access_txt = "19"},/turf/open/floor/carpet,/area/shuttle/escape) "as" = (/obj/machinery/status_display,/turf/closed/wall/shuttle/smooth,/area/shuttle/escape) "at" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"au" = (/obj/machinery/flasher{id = "cockpit_flasher"; pixel_x = 6; pixel_y = 24},/obj/structure/flora/kirbyplants{icon_state = "plant-10"; layer = 4.1},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"au" = (/obj/machinery/flasher{id = "cockpit_flasher";pixel_x = 6;pixel_y = 24},/obj/structure/flora/kirbyplants{icon_state = "plant-10";layer = 4.1},/turf/open/floor/plasteel/bar,/area/shuttle/escape) "av" = (/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aw" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"ax" = (/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/bar,/area/shuttle/escape) -"ay" = (/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},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"aw" = (/obj/structure/piano,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"ax" = (/obj/structure/chair/stool,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"ay" = (/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},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) "az" = (/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"aA" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aB" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"aC" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"aA" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig";req_access_txt = "2"},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aB" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock";req_access_txt = "2"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"aC" = (/obj/structure/extinguisher_cabinet{pixel_x = 0;pixel_y = -30},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) "aD" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) "aE" = (/obj/structure/chair/wood{dir = 4},/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aF" = (/obj/structure/table/wood,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aG" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aH" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{name = "The Emergency Escape Bar"},/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aI" = (/obj/structure/table,/obj/machinery/chem_dispenser/drinks/beer,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aJ" = (/obj/structure/chair,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aK" = (/mob/living/simple_animal/drone/snowflake/bardrone,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aL" = (/obj/machinery/vending/boozeomat,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aM" = (/obj/structure/table,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aN" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 6; pixel_y = 4},/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aO" = (/obj/structure/table,/obj/machinery/chem_dispenser/drinks,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aP" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aQ" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aR" = (/obj/structure/chair/stool,/turf/open/floor/wood,/area/shuttle/escape) -"aS" = (/obj/structure/table/wood/poker,/obj/effect/spawner/lootdrop/gambling,/turf/open/floor/wood,/area/shuttle/escape) -"aT" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aU" = (/obj/machinery/vending/cigarette,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"aV" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"; req_access_txt = "0"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"aW" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"aX" = (/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"aY" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"aZ" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"ba" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"bb" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"bc" = (/obj/machinery/door/airlock{name = "Unit B"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"bd" = (/obj/structure/closet/jcloset,/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"be" = (/obj/structure/toilet{dir = 1},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"bf" = (/obj/machinery/recharge_station,/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) -"bg" = (/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{icon_state = "freezerfloor"},/area/shuttle/escape) -"bh" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape) -"bi" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape) +"aF" = (/obj/structure/table/wood/bar{boot_dir = 9},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aG" = (/obj/structure/table/wood/bar,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aH" = (/obj/structure/table/wood/bar{boot_dir = 8},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aI" = (/obj/structure/extinguisher_cabinet{pixel_x = 27;pixel_y = 0},/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aJ" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{name = "The Emergency Escape Bar";timid = 1},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aK" = (/mob/living/simple_animal/hostile/alien/maid/barmaid,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aL" = (/obj/structure/table,/obj/machinery/chem_dispenser/drinks/beer,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aM" = (/obj/structure/chair,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aN" = (/mob/living/simple_animal/drone/snowflake/bardrone,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aO" = (/obj/machinery/vending/boozeomat,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aP" = (/obj/structure/table,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aQ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker,/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 6;pixel_y = 4},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aR" = (/obj/structure/table,/obj/machinery/chem_dispenser/drinks,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aS" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aT" = (/obj/structure/table/wood/bar{boot_dir = 10},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aU" = (/obj/structure/table/wood/bar{boot_dir = 2},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aV" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aW" = (/obj/structure/chair/stool,/turf/open/floor/wood,/area/shuttle/escape) +"aX" = (/obj/structure/table/wood/poker,/obj/effect/spawner/lootdrop/gambling,/turf/open/floor/wood,/area/shuttle/escape) +"aY" = (/obj/structure/extinguisher_cabinet{pixel_x = 0;pixel_y = -30},/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"aZ" = (/obj/machinery/vending/cigarette,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"ba" = (/obj/machinery/door/airlock{name = "Unisex Restrooms";req_access_txt = "0"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bb" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bc" = (/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bd" = (/obj/structure/extinguisher_cabinet{pixel_x = -5;pixel_y = 30},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"be" = (/obj/structure/sink{dir = 4;icon_state = "sink";pixel_x = 11;pixel_y = 0},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bf" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bg" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bh" = (/obj/machinery/door/airlock{name = "Unit B"},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bi" = (/obj/structure/closet/jcloset,/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bj" = (/obj/structure/toilet{dir = 1},/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bk" = (/obj/machinery/recharge_station,/turf/open/floor/plasteel{icon_state = "freezerfloor"},/area/shuttle/escape) +"bl" = (/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{icon_state = "freezerfloor"},/area/shuttle/escape) +"bm" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape) +"bn" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape) +"bE" = (/turf/closed/wall/shuttle{tag = "icon-gwall_space (EAST)";icon_state = "gwall_space";dir = 4},/area/shuttle/escape) +"bD" = (/turf/closed/wall/shuttle{tag = "icon-wall3";icon_state = "wall3";dir = 2},/area/shuttle/escape) +"bC" = (/turf/closed/wall/shuttle{tag = "icon-gwall_space";icon_state = "gwall_space";dir = 2},/area/shuttle/escape) +"bB" = (/turf/closed/wall/shuttle{icon_state = "swall11";dir = 2},/area/shuttle/escape) +"bA" = (/turf/closed/wall/shuttle{icon_state = "swallc2";dir = 2},/area/shuttle/escape) +"bz" = (/turf/closed/wall/shuttle{icon_state = "swall1";dir = 2},/area/shuttle/escape) +"by" = (/turf/closed/wall/shuttle{icon_state = "swall7";dir = 2},/area/shuttle/escape) +"bx" = (/turf/closed/wall/shuttle{icon_state = "swall4";dir = 2},/area/shuttle/escape) +"bw" = (/turf/closed/wall/shuttle{icon_state = "swall8";dir = 2},/area/shuttle/escape) +"bv" = (/turf/closed/wall/shuttle{icon_state = "swall14";dir = 2},/area/shuttle/escape) +"bu" = (/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape) +"bt" = (/turf/closed/wall/shuttle{tag = "icon-swall13";icon_state = "swall13";dir = 2},/area/shuttle/escape) +"bs" = (/turf/closed/wall/shuttle{icon_state = "swall3";dir = 2},/area/shuttle/escape) +"br" = (/turf/closed/wall/shuttle{tag = "icon-swallc3";icon_state = "swallc3";dir = 2},/area/shuttle/escape) +"bq" = (/turf/closed/wall/shuttle{icon_state = "swallc4";dir = 2},/area/shuttle/escape) +"bp" = (/turf/closed/wall/shuttle{icon_state = "swall_s10";dir = 2},/area/shuttle/escape) +"bo" = (/turf/closed/wall/shuttle{icon_state = "swall_s6";dir = 2},/area/shuttle/escape) (1,1,1) = {" -aaaaabacacacacacabaaaa -aaababadaeafaeagababaa -aaabahaiajajajakalabaa -aaabamanaoapajakaqabaa -ababababababarasababab -abatatatacauavavawaxac -abayazazaAavavavavavab -aBaCaDaDacavaEaFaFaFac -abababababavaEaFavaGab -aHavavavavavaEaFavaIab -abaJaJaJavavaEaFaKaLab -acaMaNaMavavaEaFavaOac -acaPaPaPavavaEaFavavac -acavavavavavaEaFaFaFac -abavavavavavavavavavab -aQavaRaSaRaTavavavaUab -ababababababababaVabab -aWaXaXaXaXaXaYaXaXaZac -abbaabbbabbcabbdaXaZab -abbeabbeabbfabbgaXaZac -ababbhbhbhbhbhbhbhabab -aaabbibibibibibibiabaa +aaaaboacacacacacbpaaaa +aabobqadaeafaeagbrbpaa +aabsahaiajajajakalbsaa +aabsamanaoapajakaqbsaa +bobtbububvbwarasbxbtbp +bsatatatacauavavawaxac +bsayazazaAavavavavavbs +aBaCaDaDacavaEaFaGaGac +bybubububqavaEaHavaIbs +aJavavavavavaEaHaKaLbs +bsaMaMaMavavaEaHaNaObs +acaPaQaPavavaEaHavaRac +acaSaSaSavavaEaHavavac +acavavavavavaEaTaUaUac +bzavavavavavavavavavbs +aVavaWaXaWaYavavavaZbs +bAbububububububwbabxbB +bbbcbcbcbcbcbdbcbcbeac +bsbfabbgabbhabbibcbebs +bzbjbzbjbzbkbzblbcbeac +bCbDbmbmbmbmbmbmbmbDbE +aabDbnbnbnbnbnbnbnbDaa "} diff --git a/_maps/shuttles/emergency_birdboat.dmm b/_maps/shuttles/emergency_birdboat.dmm index 05f356775bd..80b1bc6fb43 100644 --- a/_maps/shuttles/emergency_birdboat.dmm +++ b/_maps/shuttles/emergency_birdboat.dmm @@ -1,63 +1,63 @@ "aa" = (/turf/open/space,/area/space) -"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape) -"ac" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape) -"ad" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape) -"ae" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape) -"af" = (/turf/closed/wall/shuttle{icon_state = "swall8"; dir = 2},/area/shuttle/escape) +"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6";dir = 2},/area/shuttle/escape) +"ac" = (/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape) +"ad" = (/turf/closed/wall/shuttle{icon_state = "swall14";dir = 2},/area/shuttle/escape) +"ae" = (/turf/closed/wall/shuttle{icon_state = "swall_s10";dir = 2},/area/shuttle/escape) +"af" = (/turf/closed/wall/shuttle{icon_state = "swall8";dir = 2},/area/shuttle/escape) "ag" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape) -"ah" = (/turf/closed/wall/shuttle{icon_state = "swall4"; dir = 2},/area/shuttle/escape) -"ai" = (/turf/closed/wall/shuttle{icon_state = "swall11"; dir = 2},/area/shuttle/escape) -"aj" = (/obj/structure/table,/obj/item/weapon/scalpel,/obj/item/weapon/retractor{pixel_x = 0; pixel_y = 5},/obj/item/weapon/hemostat,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) +"ah" = (/turf/closed/wall/shuttle{icon_state = "swall4";dir = 2},/area/shuttle/escape) +"ai" = (/turf/closed/wall/shuttle{icon_state = "swall11";dir = 2},/area/shuttle/escape) +"aj" = (/obj/structure/table,/obj/item/weapon/scalpel,/obj/item/weapon/retractor{pixel_x = 0;pixel_y = 5},/obj/item/weapon/hemostat,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) "ak" = (/obj/structure/table,/obj/item/weapon/cautery,/obj/item/weapon/surgicaldrill,/obj/item/weapon/circular_saw{pixel_y = 9},/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) "al" = (/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) -"am" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape) -"an" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"; dir = 8},/turf/open/floor/plating/airless,/area/shuttle/escape) -"ao" = (/turf/closed/wall/shuttle{icon_state = "swallc4"; dir = 2},/area/shuttle/escape) +"am" = (/turf/closed/wall/shuttle{icon_state = "swall3";dir = 2},/area/shuttle/escape) +"an" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r";dir = 8},/turf/open/floor/plating/airless,/area/shuttle/escape) +"ao" = (/turf/closed/wall/shuttle{icon_state = "swallc4";dir = 2},/area/shuttle/escape) "ap" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "aq" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "ar" = (/obj/structure/flora/kirbyplants{icon_state = "plant-22"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"as" = (/turf/closed/wall/shuttle{icon_state = "swall1"; dir = 2},/area/shuttle/escape) +"as" = (/turf/closed/wall/shuttle{icon_state = "swall1";dir = 2},/area/shuttle/escape) "at" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape) "au" = (/obj/structure/table/optable,/obj/item/weapon/surgical_drapes,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) -"av" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/open/floor/plating/airless,/area/shuttle/escape) +"av" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion";dir = 8},/turf/open/floor/plating/airless,/area/shuttle/escape) "aw" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "ax" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"ay" = (/obj/machinery/door/airlock/glass_command{name = "bridge door"; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"ay" = (/obj/machinery/door/airlock/glass_command{name = "bridge door";req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "az" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape) -"aA" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/open/floor/plating/airless,/area/shuttle/escape) +"aA" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l";dir = 8},/turf/open/floor/plating/airless,/area/shuttle/escape) "aB" = (/obj/structure/extinguisher_cabinet{pixel_y = -32},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"aC" = (/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{icon_state = "shuttlefloor4"},/area/shuttle/escape) +"aC" = (/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{icon_state = "shuttlefloor4"},/area/shuttle/escape) "aD" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape) -"aE" = (/turf/closed/wall/shuttle{icon_state = "swallc2"; dir = 2},/area/shuttle/escape) -"aF" = (/turf/closed/wall/shuttle{icon_state = "swall15"; dir = 2},/area/shuttle/escape) -"aG" = (/turf/closed/wall/shuttle{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape) +"aE" = (/turf/closed/wall/shuttle{icon_state = "swallc2";dir = 2},/area/shuttle/escape) +"aF" = (/turf/closed/wall/shuttle{icon_state = "swall15";dir = 2},/area/shuttle/escape) +"aG" = (/turf/closed/wall/shuttle{icon_state = "swall_s9";dir = 2},/area/shuttle/escape) "aH" = (/turf/closed/wall/shuttle,/area/shuttle/escape) -"aI" = (/obj/machinery/door/airlock/glass_security{name = "security airlock"; req_access_txt = "63"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape) +"aI" = (/obj/machinery/door/airlock/glass_security{name = "security airlock";req_access_txt = "63"},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/shuttle/escape) "aJ" = (/obj/machinery/door/airlock/glass,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) "aK" = (/turf/closed/wall/shuttle{icon_state = "swallc3"},/area/shuttle/escape) -"aL" = (/turf/closed/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/escape) -"aM" = (/obj/structure/flora/kirbyplants{icon_state = "plant-21"; layer = 4.1},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"aL" = (/turf/closed/wall/shuttle{icon_state = "swall13";dir = 2},/area/shuttle/escape) +"aM" = (/obj/structure/flora/kirbyplants{icon_state = "plant-21";layer = 4.1},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aN" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aO" = (/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "aP" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "aQ" = (/obj/structure/table,/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "aR" = (/obj/machinery/door/airlock/shuttle,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aS" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) -"aT" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti{name = "pasghetti"; pixel_x = 4; pixel_y = 7},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) -"aU" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile/emergency{dheight = 0; dir = 8; dwidth = 6; height = 18; travelDir = 90; width = 14},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"aT" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti{name = "pasghetti";pixel_x = 4;pixel_y = 7},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) +"aU" = (/obj/machinery/door/airlock/shuttle,/obj/docking_port/mobile/emergency{dheight = 0;dir = 8;dwidth = 6;height = 18;travelDir = 90;width = 14;timid = 1},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aV" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/chocolatebar,/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "aW" = (/obj/structure/chair{dir = 1},/obj/structure/window/reinforced,/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) -"aX" = (/turf/closed/wall/shuttle{icon_state = "swall2"; dir = 2},/area/shuttle/escape) -"aY" = (/obj/structure/chair,/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) +"aX" = (/turf/closed/wall/shuttle{icon_state = "swall2";dir = 2},/area/shuttle/escape) +"aY" = (/obj/structure/chair,/obj/structure/window/reinforced{dir = 1;pixel_y = 2},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "aZ" = (/obj/structure/extinguisher_cabinet{pixel_x = -27},/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) -"ba" = (/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/fire{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/toxin,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) -"bb" = (/turf/closed/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/escape) -"bc" = (/turf/closed/wall/shuttle{icon_state = "swallc1"; dir = 2},/area/shuttle/escape) +"ba" = (/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/fire{pixel_x = 5;pixel_y = 5},/obj/item/weapon/storage/firstaid/toxin,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) +"bb" = (/turf/closed/wall/shuttle{icon_state = "swall_s5";dir = 2},/area/shuttle/escape) +"bc" = (/turf/closed/wall/shuttle{icon_state = "swallc1";dir = 2},/area/shuttle/escape) "bd" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) -"be" = (/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/brute{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/brute,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) +"be" = (/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/brute{pixel_x = 5;pixel_y = 5},/obj/item/weapon/storage/firstaid/brute,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) "bf" = (/obj/structure/extinguisher_cabinet{pixel_y = -32},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "bg" = (/obj/structure/chair,/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) -"bh" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 1},/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) +"bh" = (/obj/machinery/sleeper{icon_state = "sleeper-open";dir = 1},/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) "bi" = (/obj/structure/table/glass,/obj/item/weapon/defibrillator/loaded,/turf/open/floor/plasteel{icon_state = "white"},/area/shuttle/escape) (1,1,1) = {" diff --git a/_maps/shuttles/emergency_box.dmm b/_maps/shuttles/emergency_box.dmm index 87cc48d438c..159e7b94fd1 100644 --- a/_maps/shuttles/emergency_box.dmm +++ b/_maps/shuttles/emergency_box.dmm @@ -1,65 +1,65 @@ "aa" = (/turf/open/space,/area/space) -"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape) +"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" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape) +"ad" = (/turf/closed/wall/shuttle{icon_state = "swall_s10";dir = 2},/area/shuttle/escape) "ae" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/turf/closed/wall/shuttle/interior{icon_state = "swall_f9"},/area/shuttle/escape) "af" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "ag" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "ah" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"ai" = (/obj/structure/table,/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) +"ai" = (/obj/structure/table,/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) "aj" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/turf/closed/wall/shuttle/interior{icon_state = "swall_f5"},/area/shuttle/escape) -"ak" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape) +"ak" = (/turf/closed/wall/shuttle{icon_state = "swall3";dir = 2},/area/shuttle/escape) "al" = (/obj/machinery/computer/atmos_alert,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "am" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "an" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "ao" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "ap" = (/obj/machinery/computer/security,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aq" = (/obj/machinery/computer/crew,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"ar" = (/obj/structure/chair{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"as" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"at" = (/obj/machinery/button/flasher{id = "cockpit_flasher"; pixel_x = 6; pixel_y = -24},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"ar" = (/obj/structure/chair{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 0;pixel_y = -30},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"as" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)";pixel_x = 0;pixel_y = -29},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"at" = (/obj/machinery/button/flasher{id = "cockpit_flasher";pixel_x = 6;pixel_y = -24},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "au" = (/obj/machinery/computer/communications,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"av" = (/turf/closed/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/escape) -"aw" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape) -"ax" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape) -"ay" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Cockpit"; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"az" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape) +"av" = (/turf/closed/wall/shuttle{icon_state = "swall13";dir = 2},/area/shuttle/escape) +"aw" = (/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape) +"ax" = (/turf/closed/wall/shuttle{icon_state = "swall14";dir = 2},/area/shuttle/escape) +"ay" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Cockpit";req_access_txt = "19"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"az" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape) "aA" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"aB" = (/obj/machinery/flasher{id = "cockpit_flasher"; pixel_x = 6; pixel_y = 24},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"aB" = (/obj/machinery/flasher{id = "cockpit_flasher";pixel_x = 6;pixel_y = 24},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aC" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aD" = (/obj/structure/closet/emcloset,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"aE" = (/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) -"aF" = (/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},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"aE" = (/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) +"aF" = (/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},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) "aG" = (/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"aH" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"aI" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/open/floor/plating,/area/shuttle/escape) +"aH" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig";req_access_txt = "2"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aI" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock";req_access_txt = "2"},/turf/open/floor/plating,/area/shuttle/escape) "aJ" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) "aK" = (/obj/structure/chair,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aL" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aM" = (/obj/structure/table,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"aN" = (/turf/closed/wall/shuttle{icon_state = "swall7"; dir = 2},/area/shuttle/escape) -"aO" = (/turf/closed/wall/shuttle{icon_state = "swallc4"; dir = 2},/area/shuttle/escape) -"aP" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency,/turf/open/floor/plating,/area/shuttle/escape) -"aQ" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"aR" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aN" = (/turf/closed/wall/shuttle{icon_state = "swall7";dir = 2},/area/shuttle/escape) +"aO" = (/turf/closed/wall/shuttle{icon_state = "swallc4";dir = 2},/area/shuttle/escape) +"aP" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{timid = 1},/turf/open/floor/plating,/area/shuttle/escape) +"aQ" = (/obj/structure/extinguisher_cabinet{pixel_x = -5;pixel_y = 30},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aR" = (/obj/structure/extinguisher_cabinet{pixel_x = 27;pixel_y = 0},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "aS" = (/obj/structure/chair{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aT" = (/obj/structure/chair{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aU" = (/obj/structure/chair{dir = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "aV" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/escape) -"aW" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"aW" = (/obj/structure/extinguisher_cabinet{pixel_x = 0;pixel_y = -30},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) "aX" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"aY" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape) +"aY" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall14";dir = 2},/area/shuttle/escape) "aZ" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Infirmary"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"ba" = (/turf/closed/wall/shuttle{icon_state = "swall11"; dir = 2},/area/shuttle/escape) +"ba" = (/turf/closed/wall/shuttle{icon_state = "swall11";dir = 2},/area/shuttle/escape) "bb" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor2"},/area/shuttle/escape) -"bc" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor2"},/area/shuttle/escape) -"bd" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) -"be" = (/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,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"bc" = (/obj/structure/extinguisher_cabinet{pixel_x = 27;pixel_y = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor2"},/area/shuttle/escape) +"bd" = (/obj/machinery/sleeper{icon_state = "sleeper-open";dir = 8},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) +"be" = (/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,/obj/structure/extinguisher_cabinet{pixel_x = 27;pixel_y = 0},/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/area/shuttle/escape) "bf" = (/obj/structure/closet,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor2"},/area/shuttle/escape) "bg" = (/obj/structure/closet/crate,/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor2"},/area/shuttle/escape) -"bh" = (/turf/closed/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/escape) +"bh" = (/turf/closed/wall/shuttle{icon_state = "swall_s5";dir = 2},/area/shuttle/escape) "bi" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape) -"bj" = (/turf/closed/wall/shuttle{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape) +"bj" = (/turf/closed/wall/shuttle{icon_state = "swall_s9";dir = 2},/area/shuttle/escape) "bk" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape) (1,1,1) = {" diff --git a/_maps/shuttles/emergency_clown.dmm b/_maps/shuttles/emergency_clown.dmm index 2e082b3e67e..a80e41e756f 100644 --- a/_maps/shuttles/emergency_clown.dmm +++ b/_maps/shuttles/emergency_clown.dmm @@ -1,64 +1,64 @@ "aa" = (/turf/open/space,/area/space) -"ab" = (/turf/closed/wall/shuttle{icon_state = "swall_s6"; dir = 2},/area/shuttle/escape) +"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" = (/turf/closed/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape) +"ad" = (/turf/closed/wall/shuttle{icon_state = "swall_s10";dir = 2},/area/shuttle/escape) "ae" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/turf/closed/wall/shuttle/interior{icon_state = "swall_f9"},/area/shuttle/escape) "af" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire,/turf/open/floor/noslip,/area/shuttle/escape) "ag" = (/obj/structure/chair{dir = 1},/turf/open/floor/bluespace,/area/shuttle/escape) "ah" = (/obj/machinery/computer/emergency_shuttle,/turf/open/floor/bluespace,/area/shuttle/escape) -"ai" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/noslip,/area/shuttle/escape) +"ai" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2;pixel_y = 3},/obj/item/weapon/crowbar,/turf/open/floor/noslip,/area/shuttle/escape) "aj" = (/turf/open/floor/plasteel/shuttle{icon_state = "shuttlefloor3"},/turf/closed/wall/shuttle/interior{icon_state = "swall_f5"},/area/shuttle/escape) -"ak" = (/turf/closed/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/escape) +"ak" = (/turf/closed/wall/shuttle{icon_state = "swall3";dir = 2},/area/shuttle/escape) "al" = (/obj/machinery/computer/atmos_alert,/turf/open/floor/noslip,/area/shuttle/escape) "am" = (/obj/structure/chair{dir = 8},/turf/open/floor/bluespace,/area/shuttle/escape) "an" = (/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) "ao" = (/obj/structure/chair{dir = 4},/turf/open/floor/bluespace,/area/shuttle/escape) "ap" = (/obj/machinery/computer/security,/turf/open/floor/noslip,/area/shuttle/escape) "aq" = (/obj/machinery/computer/crew,/turf/open/floor/noslip,/area/shuttle/escape) -"ar" = (/obj/structure/chair{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/open/floor/bluespace,/area/shuttle/escape) -"as" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -29},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) +"ar" = (/obj/structure/chair{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 0;pixel_y = -30},/turf/open/floor/bluespace,/area/shuttle/escape) +"as" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)";pixel_x = 0;pixel_y = -29},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) "at" = (/obj/machinery/computer/communications,/turf/open/floor/noslip,/area/shuttle/escape) -"au" = (/turf/closed/wall/shuttle{icon_state = "swall13"; dir = 2},/area/shuttle/escape) -"av" = (/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape) -"aw" = (/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape) -"ax" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Premium Lounge"; req_access_txt = "0"},/turf/open/floor/bluespace,/area/shuttle/escape) -"ay" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall12"; dir = 2},/area/shuttle/escape) +"au" = (/turf/closed/wall/shuttle{icon_state = "swall13";dir = 2},/area/shuttle/escape) +"av" = (/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape) +"aw" = (/turf/closed/wall/shuttle{icon_state = "swall14";dir = 2},/area/shuttle/escape) +"ax" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Premium Lounge";req_access_txt = "0"},/turf/open/floor/bluespace,/area/shuttle/escape) +"ay" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall12";dir = 2},/area/shuttle/escape) "az" = (/turf/open/chasm/straight_down/lava_land_surface,/area/shuttle/escape) "aA" = (/turf/open/floor/noslip,/area/shuttle/escape) "aB" = (/obj/structure/closet/emcloset,/obj/item/toy/sword,/turf/open/floor/noslip,/area/shuttle/escape) -"aC" = (/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/noslip,/area/shuttle/escape) -"aD" = (/obj/item/weapon/greentext{anchored = 1},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"aE" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/open/floor/bluespace,/area/shuttle/escape) +"aC" = (/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/noslip,/area/shuttle/escape) +"aD" = (/obj/item/weapon/greentext/quiet{anchored = 1},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"aE" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig";req_access_txt = "2"},/turf/open/floor/bluespace,/area/shuttle/escape) "aF" = (/obj/structure/chair,/turf/open/floor/noslip,/area/shuttle/escape) "aG" = (/obj/structure/chair{dir = 4},/turf/open/floor/noslip,/area/shuttle/escape) "aH" = (/obj/structure/table,/obj/item/device/multitool/ai_detect,/turf/open/floor/noslip,/area/shuttle/escape) -"aI" = (/turf/closed/wall/shuttle{icon_state = "swall7"; dir = 2},/area/shuttle/escape) -"aJ" = (/turf/closed/wall/shuttle{icon_state = "swallc4"; dir = 2},/area/shuttle/escape) +"aI" = (/turf/closed/wall/shuttle{icon_state = "swall7";dir = 2},/area/shuttle/escape) +"aJ" = (/turf/closed/wall/shuttle{icon_state = "swallc4";dir = 2},/area/shuttle/escape) "aK" = (/obj/structure/table,/obj/item/toy/sword,/turf/open/floor/noslip,/area/shuttle/escape) -"aL" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{name = "Snappop(tm)!"},/turf/open/floor/plating,/area/shuttle/escape) -"aM" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) -"aN" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) +"aL" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{name = "Snappop(tm)!";timid = 1},/turf/open/floor/plating,/area/shuttle/escape) +"aM" = (/obj/structure/extinguisher_cabinet{pixel_x = -5;pixel_y = 30},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) +"aN" = (/obj/structure/extinguisher_cabinet{pixel_x = 27;pixel_y = 0},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) "aO" = (/obj/structure/bed,/obj/item/weapon/bedsheet/random,/turf/open/floor/noslip,/area/shuttle/escape) "aP" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/bed,/obj/item/weapon/bedsheet/random,/turf/open/floor/noslip,/area/shuttle/escape) "aQ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/bed,/obj/item/weapon/bedsheet/random,/turf/open/floor/noslip,/area/shuttle/escape) "aR" = (/obj/structure/bed,/obj/item/weapon/bedsheet/random,/obj/structure/window/reinforced{dir = 8},/turf/open/floor/noslip,/area/shuttle/escape) "aS" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/escape) -"aT" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) +"aT" = (/obj/structure/extinguisher_cabinet{pixel_x = 0;pixel_y = -30},/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) "aU" = (/obj/item/toy/snappop,/obj/item/toy/snappop,/turf/open/floor/bluespace,/area/shuttle/escape) "aV" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Cargo"},/turf/open/floor/bluespace,/area/shuttle/escape) -"aW" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall14"; dir = 2},/area/shuttle/escape) +"aW" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall14";dir = 2},/area/shuttle/escape) "aX" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Infirmary"},/turf/open/floor/bluespace,/area/shuttle/escape) -"aY" = (/turf/closed/wall/shuttle{icon_state = "swall11"; dir = 2},/area/shuttle/escape) +"aY" = (/turf/closed/wall/shuttle{icon_state = "swall11";dir = 2},/area/shuttle/escape) "aZ" = (/turf/open/floor/mineral/bananium,/area/shuttle/escape) -"ba" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/mineral/bananium,/area/shuttle/escape) -"bb" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/turf/open/floor/noslip,/area/shuttle/escape) -"bc" = (/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,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/open/floor/noslip,/area/shuttle/escape) +"ba" = (/obj/structure/extinguisher_cabinet{pixel_x = 27;pixel_y = 0},/turf/open/floor/mineral/bananium,/area/shuttle/escape) +"bb" = (/obj/machinery/sleeper{icon_state = "sleeper-open";dir = 8},/turf/open/floor/noslip,/area/shuttle/escape) +"bc" = (/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,/obj/structure/extinguisher_cabinet{pixel_x = 27;pixel_y = 0},/turf/open/floor/noslip,/area/shuttle/escape) "bd" = (/obj/structure/closet/crate/trashcart{desc = "A heavy, metal trashcart with wheels. Feel free to hop in at any time!"},/obj/item/toy/sword,/turf/open/floor/mineral/bananium,/area/shuttle/escape) -"be" = (/obj/machinery/vending/autodrobe{extended_inventory = 1; scan_id = 0},/turf/open/floor/mineral/bananium,/area/shuttle/escape) +"be" = (/obj/machinery/vending/autodrobe{extended_inventory = 1;scan_id = 0},/turf/open/floor/mineral/bananium,/area/shuttle/escape) "bf" = (/obj/machinery/vending/clothing{extended_inventory = 1},/turf/open/floor/mineral/bananium,/area/shuttle/escape) -"bg" = (/turf/closed/wall/shuttle{icon_state = "swall_s5"; dir = 2},/area/shuttle/escape) +"bg" = (/turf/closed/wall/shuttle{icon_state = "swall_s5";dir = 2},/area/shuttle/escape) "bh" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape) -"bi" = (/turf/closed/wall/shuttle{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape) +"bi" = (/turf/closed/wall/shuttle{icon_state = "swall_s9";dir = 2},/area/shuttle/escape) "bj" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape) (1,1,1) = {" diff --git a/_maps/shuttles/emergency_cramped.dmm b/_maps/shuttles/emergency_cramped.dmm index db8c02bfc04..2f558a66be1 100644 --- a/_maps/shuttles/emergency_cramped.dmm +++ b/_maps/shuttles/emergency_cramped.dmm @@ -1,18 +1,18 @@ "a" = (/turf/closed/wall/shuttle/smooth,/area/shuttle/escape) "b" = (/obj/structure/grille,/obj/structure/window/shuttle,/turf/open/floor/plating,/area/shuttle/escape) -"c" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"; req_access_txt = "2"},/turf/open/floor/plating,/area/shuttle/escape) +"c" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock";req_access_txt = "2"},/turf/open/floor/plating,/area/shuttle/escape) "d" = (/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "e" = (/obj/structure/chair{dir = 1},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "f" = (/obj/machinery/computer/shuttle,/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "g" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/book/manual/random,/obj/structure/extinguisher_cabinet{pixel_x = -30},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "h" = (/obj/machinery/door/window/southleft,/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) "i" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced,/obj/item/device/gps{gpstag = "STV5"},/turf/open/floor/plasteel{icon_state = "dark"},/area/shuttle/escape) -"j" = (/obj/machinery/status_display,/turf/closed/wall/shuttle/smooth,/area/shuttle/escape) -"k" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{dwidth = 3; height = 5; name = "Secure Transport Vessel 5"; width = 14},/turf/open/floor/plating,/area/shuttle/escape) +"j" = (/obj/machinery/status_display,/turf/closed/wall/shuttle{icon_state = "swall3"},/area/shuttle/escape) +"k" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{dwidth = 3;height = 5;name = "Secure Transport Vessel 5";width = 14;timid = 1},/turf/open/floor/plating,/area/shuttle/escape) "l" = (/turf/open/floor/plating,/area/shuttle/escape) "m" = (/obj/structure/closet/emcloset,/turf/open/floor/plating,/area/shuttle/escape) "n" = (/obj/structure/chair{dir = 4},/turf/open/floor/plating,/area/shuttle/escape) -"o" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 8; name = "8maintenance loot spawner"},/turf/open/floor/plasteel/bot,/area/shuttle/escape) +"o" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 8;name = "8maintenance loot spawner"},/turf/open/floor/plasteel/bot,/area/shuttle/escape) "p" = (/obj/structure/closet/crate/secure/loot,/turf/open/floor/plasteel/bot,/area/shuttle/escape) "q" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plating,/area/shuttle/escape) "r" = (/obj/structure/closet/crate/secure/weapon,/obj/effect/spawner/lootdrop/armory_contraband,/turf/open/floor/plasteel/bot,/area/shuttle/escape) @@ -20,20 +20,26 @@ "t" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/open/floor/plating/airless,/area/shuttle/escape) "u" = (/turf/open/space,/area/space) "v" = (/obj/structure/shuttle/engine/propulsion,/turf/open/floor/plating/airless,/area/shuttle/escape) +"B" = (/turf/closed/wall/shuttle{tag = "icon-wall3 (WEST)";icon_state = "wall3";dir = 8},/area/shuttle/escape) +"A" = (/turf/closed/wall/shuttle{icon_state = "swall1";dir = 2},/area/shuttle/escape) +"z" = (/turf/closed/wall/shuttle{icon_state = "swall2";dir = 2},/area/shuttle/escape) +"y" = (/turf/closed/wall/shuttle{icon_state = "swall3"},/area/shuttle/escape) +"x" = (/turf/closed/wall/shuttle{icon_state = "swall_s10";dir = 2},/area/shuttle/escape) +"w" = (/turf/closed/wall/shuttle{icon_state = "swall_s6";dir = 2},/area/shuttle/escape) (1,1,1) = {" -abbba -cdefa +wbbbx +cdefy aghij -kllma -anloa +kllmy +znloy bnlob bnlob bnlpb -anlpa -qllra -aslra -qllma -attta +Anlpy +qllry +aslry +qllmA +BtttB uvvvu "} diff --git a/_maps/shuttles/emergency_goon.dmm b/_maps/shuttles/emergency_goon.dmm index 3d8ebf08142..cc4bf12d0fc 100644 --- a/_maps/shuttles/emergency_goon.dmm +++ b/_maps/shuttles/emergency_goon.dmm @@ -1,45 +1,45 @@ "a" = (/turf/open/space,/area/space) -"b" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/open/floor/plating,/area/shuttle/escape) -"c" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/turf/open/floor/plating,/area/shuttle/escape) -"d" = (/turf/closed/wall/shuttle{tag = "icon-swall0"; icon_state = "swall0"},/area/shuttle/escape) -"e" = (/turf/closed/wall/shuttle{tag = "icon-wall_space (NORTH)"; icon_state = "wall_space"; dir = 1},/area/shuttle/escape) -"f" = (/turf/closed/wall/shuttle{tag = "icon-swall2"; icon_state = "swall2"},/area/shuttle/escape) +"b" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion";dir = 4},/turf/open/floor/plating,/area/shuttle/escape) +"c" = (/obj/structure/shuttle/engine/heater{icon_state = "heater";dir = 8},/turf/open/floor/plating,/area/shuttle/escape) +"d" = (/turf/closed/wall/shuttle{tag = "icon-swall0";icon_state = "swall0"},/area/shuttle/escape) +"e" = (/turf/closed/wall/shuttle{tag = "icon-wall_space (NORTH)";icon_state = "wall_space";dir = 1},/area/shuttle/escape) +"f" = (/turf/closed/wall/shuttle{tag = "icon-swall2";icon_state = "swall2"},/area/shuttle/escape) "g" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"h" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{dheight = 0; dir = 2; dwidth = 9; name = "NES Port"; width = 19},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"i" = (/turf/closed/wall/shuttle{tag = "icon-wall_space (WEST)"; icon_state = "wall_space"; dir = 8},/area/shuttle/escape) -"j" = (/turf/closed/wall/shuttle{tag = "icon-swall4"; icon_state = "swall4"},/area/shuttle/escape) -"k" = (/turf/closed/wall/shuttle{tag = "icon-swall12"; icon_state = "swall12"},/area/shuttle/escape) -"l" = (/obj/machinery/vending/wallmed,/turf/closed/wall/shuttle{tag = "icon-swall8"; icon_state = "swall8"},/area/shuttle/escape) +"h" = (/obj/machinery/door/airlock/shuttle{name = "Emergency Shuttle Airlock"},/obj/docking_port/mobile/emergency{dheight = 0;dir = 2;dwidth = 9;name = "NES Port";width = 19;timid = 1},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) +"i" = (/turf/closed/wall/shuttle{tag = "icon-wall_space (WEST)";icon_state = "wall_space";dir = 8},/area/shuttle/escape) +"j" = (/turf/closed/wall/shuttle{tag = "icon-swall4";icon_state = "swall4"},/area/shuttle/escape) +"k" = (/turf/closed/wall/shuttle{tag = "icon-swall12";icon_state = "swall12"},/area/shuttle/escape) +"l" = (/obj/machinery/vending/wallmed,/turf/closed/wall/shuttle{tag = "icon-swall8";icon_state = "swall8"},/area/shuttle/escape) "m" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"n" = (/turf/closed/wall/shuttle{tag = "icon-swall1"; icon_state = "swall1"},/area/shuttle/escape) +"n" = (/turf/closed/wall/shuttle{tag = "icon-swall1";icon_state = "swall1"},/area/shuttle/escape) "o" = (/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"p" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/open/floor/plating,/area/shuttle/escape) -"q" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) +"p" = (/obj/structure/shuttle/engine/heater{icon_state = "heater";dir = 8},/obj/structure/window/reinforced{dir = 4;pixel_x = 0},/turf/open/floor/plating,/area/shuttle/escape) +"q" = (/obj/machinery/sleeper{icon_state = "sleeper-open";dir = 4},/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) "r" = (/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) "s" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle,/area/shuttle/escape) -"t" = (/turf/closed/wall/shuttle{tag = "icon-wall_floor"; icon_state = "wall_floor"},/area/shuttle/escape) +"t" = (/turf/closed/wall/shuttle{tag = "icon-wall_floor";icon_state = "wall_floor"},/area/shuttle/escape) "u" = (/turf/open/space,/area/shuttle/escape) "v" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) "w" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Infirmary"},/turf/open/floor/plasteel/shuttle/white,/area/shuttle/escape) "x" = (/obj/structure/window/shuttle,/obj/structure/grille,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) "y" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/toolbox/emergency,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"z" = (/obj/structure/table/reinforced,/obj/item/device/radio,/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"z" = (/obj/structure/table/reinforced,/obj/item/device/radio,/obj/structure/window/reinforced{dir = 1;layer = 2.9},/obj/structure/window/reinforced{dir = 4;pixel_x = 0},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) "A" = (/obj/structure/chair/comfy/brown{dir = 4},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"B" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 1},/obj/structure/table/reinforced,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"C" = (/turf/closed/wall/shuttle{tag = "icon-swall8"; icon_state = "swall8"},/area/shuttle/escape) -"D" = (/turf/closed/wall/shuttle{tag = "icon-swall3"; icon_state = "swall3"},/area/shuttle/escape) -"E" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Cockpit"; req_access_txt = "19"},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"B" = (/obj/structure/window/reinforced{dir = 4;pixel_x = 0},/obj/structure/window/reinforced{dir = 1},/obj/structure/table/reinforced,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"C" = (/turf/closed/wall/shuttle{tag = "icon-swall8";icon_state = "swall8"},/area/shuttle/escape) +"D" = (/turf/closed/wall/shuttle{tag = "icon-swall3";icon_state = "swall3"},/area/shuttle/escape) +"E" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Cockpit";req_access_txt = "19"},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) "F" = (/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"G" = (/obj/machinery/computer/emergency_shuttle,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"G" = (/obj/machinery/computer/emergency_shuttle,/obj/structure/window/reinforced{dir = 4;pixel_x = 0},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) "H" = (/obj/structure/chair{dir = 4},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"I" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"I" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4;pixel_x = 0},/obj/structure/window/reinforced,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) "J" = (/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) -"K" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig"; req_access_txt = "2"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) +"K" = (/obj/machinery/door/airlock/glass{name = "Emergency Shuttle Brig";req_access_txt = "2"},/turf/open/floor/plasteel/shuttle/red,/area/shuttle/escape) "L" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"M" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) -"N" = (/turf/closed/wall/shuttle{tag = "icon-wall_space (EAST)"; icon_state = "wall_space"; dir = 4},/area/shuttle/escape) -"O" = (/turf/closed/wall/shuttle{tag = "icon-wall_floor (WEST)"; icon_state = "wall_floor"; dir = 8},/area/shuttle/escape) -"P" = (/turf/closed/wall/shuttle{tag = "icon-wall_space"; icon_state = "wall_space"},/area/shuttle/escape) +"M" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4;pixel_x = 0},/turf/open/floor/plasteel/shuttle/yellow,/area/shuttle/escape) +"N" = (/turf/closed/wall/shuttle{tag = "icon-wall_space (EAST)";icon_state = "wall_space";dir = 4},/area/shuttle/escape) +"O" = (/turf/closed/wall/shuttle{tag = "icon-wall_floor (WEST)";icon_state = "wall_floor";dir = 8},/area/shuttle/escape) +"P" = (/turf/closed/wall/shuttle{tag = "icon-wall_space";icon_state = "wall_space"},/area/shuttle/escape) (1,1,1) = {" abcdeaafghfaaaaaaaa diff --git a/_maps/shuttles/emergency_imfedupwiththisworld.dmm b/_maps/shuttles/emergency_imfedupwiththisworld.dmm index 4ecb0e8fd64..c1b24953b44 100644 --- a/_maps/shuttles/emergency_imfedupwiththisworld.dmm +++ b/_maps/shuttles/emergency_imfedupwiththisworld.dmm @@ -1,6 +1,6 @@ "a" = (/turf/closed/wall/mineral/wood,/area/shuttle/escape) "b" = (/obj/machinery/light_switch,/turf/closed/wall/mineral/wood,/area/shuttle/escape) -"c" = (/obj/machinery/door/unpowered/shuttle,/obj/docking_port/mobile/emergency{dheight = 0; dir = 4; dwidth = 1; height = 10; name = "Oh Hi Mark"; width = 12},/turf/open/floor/wood,/area/shuttle/escape) +"c" = (/obj/docking_port/mobile/emergency{dheight = 0;dir = 4;dwidth = 1;height = 10;name = "Oh Hi Mark";width = 12;timid = 1},/obj/machinery/door/airlock/wood,/turf/open/floor/wood,/area/shuttle/escape) "d" = (/turf/open/floor/wood,/area/shuttle/escape) "e" = (/obj/machinery/light{dir = 1},/turf/open/floor/carpet,/area/shuttle/escape) "f" = (/obj/structure/chair/comfy/teal,/turf/open/floor/carpet,/area/shuttle/escape) @@ -8,17 +8,17 @@ "h" = (/turf/open/floor/carpet,/area/shuttle/escape) "i" = (/obj/structure/table/reinforced,/obj/item/weapon/kitchen/knife,/turf/open/floor/carpet,/area/shuttle/escape) "j" = (/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"k" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/vending/boozeomat,/turf/open/floor/plasteel/bar,/area/shuttle/escape) +"k" = (/obj/machinery/light{icon_state = "tube1";dir = 4},/obj/machinery/vending/boozeomat,/turf/open/floor/plasteel/bar,/area/shuttle/escape) "l" = (/obj/machinery/computer/security/wooden_tv,/turf/open/floor/carpet,/area/shuttle/escape) "m" = (/obj/structure/table/glass,/turf/open/floor/carpet,/area/shuttle/escape) -"n" = (/obj/structure/chair/comfy/teal{tag = "icon-comfychair (WEST)"; icon_state = "comfychair"; dir = 8},/turf/open/floor/carpet,/area/shuttle/escape) +"n" = (/obj/structure/chair/comfy/teal{tag = "icon-comfychair (WEST)";icon_state = "comfychair";dir = 8},/turf/open/floor/carpet,/area/shuttle/escape) "o" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/snacks/store/cake/birthday,/turf/open/floor/carpet,/area/shuttle/escape) "p" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/open/floor/plasteel/bar,/area/shuttle/escape) "q" = (/obj/structure/table/reinforced,/turf/open/floor/carpet,/area/shuttle/escape) "r" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass,/turf/open/floor/plasteel/bar,/area/shuttle/escape) "s" = (/obj/machinery/door/window{dir = 8},/turf/open/floor/plasteel/bar,/area/shuttle/escape) "t" = (/obj/structure/table/reinforced,/turf/open/floor/plasteel/bar,/area/shuttle/escape) -"u" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/open/floor/wood,/area/shuttle/escape) +"u" = (/obj/machinery/light{icon_state = "tube1";dir = 8},/turf/open/floor/wood,/area/shuttle/escape) "v" = (/obj/structure/chair/office/dark,/turf/open/floor/wood,/area/shuttle/escape) "w" = (/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood/drip,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/mob_spawn/human/corpse,/obj/item/weapon/gun/projectile/automatic/pistol/m1911,/obj/machinery/light/small{dir = 8},/obj/item/weapon/reagent_containers/food/snacks/cakeslice/birthday,/turf/open/floor/carpet,/area/shuttle/escape) "x" = (/obj/structure/bed,/obj/item/weapon/bedsheet/red,/obj/item/weapon/paper{info = "i love daniel
daniel is my best friend

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.

" + var/text_to_add = "" + var/drivers = "Drivers" + var/scripts = "Scripts
These scriptures require at least five servants and a tinkerer's cache." + var/applications = "Applications
These scriptures require at least eight servants, three tinkerer's caches, and 50CV." + var/revenant = "Revenant
These scriptures require at least ten servants and 100CV." + var/judgement = "Judgement
These scriptures require at least ten servants and 100CV. In addition, there may not be an active non-servant AI." + for(var/V in subtypesof(/datum/clockwork_scripture)) + var/datum/clockwork_scripture/S = V + var/datum/clockwork_scripture/S2 = new V + var/list/req_comps = S2.required_components + qdel(S2) + switch(initial(S.tier)) + if(SCRIPTURE_DRIVER) + drivers += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ + \ + Component Cost: \ + [req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \ + [req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \ + [req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \ + [req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \ + [req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.
\ + Tip: [initial(S.usage_tip)]
" + if(SCRIPTURE_SCRIPT) + scripts += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ + \ + Component Cost: \ + [req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \ + [req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \ + [req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \ + [req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \ + [req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.
\ + Tip: [initial(S.usage_tip)]
" + if(SCRIPTURE_APPLICATION) + applications += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ + \ + Component Cost: \ + [req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \ + [req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \ + [req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \ + [req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \ + [req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.
\ + Tip: [initial(S.usage_tip)]
" + if(SCRIPTURE_REVENANT) + revenant += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ + \ + Component Cost: \ + [req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \ + [req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \ + [req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \ + [req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \ + [req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.
\ + Tip: [initial(S.usage_tip)]
" + if(SCRIPTURE_JUDGEMENT) + judgement += "
[initial(S.name)]: [initial(S.desc)]
Invocation Time: [initial(S.channel_time) / 10] seconds
\ + \ + Component Cost: \ + [req_comps["belligerent_eye"] ? req_comps["belligerent_eye"] : "No"] belligerent eyes, \ + [req_comps["vanguard_cogwheel"] ? req_comps["vanguard_cogwheel"] : "no"] vanguard cogwheels, \ + [req_comps["guvax_capacitor"] ? req_comps["guvax_capacitor"] : "no"] guvax capacitors, \ + [req_comps["replicant_alloy"] ? req_comps["replicant_alloy"] : "no"] replicant alloys, and \ + [req_comps["hierophant_ansible"] ? req_comps["hierophant_ansible"] : "no"] hierophant ansibles.
\ + Tip: [initial(S.usage_tip)]
" + text_to_add += "[drivers]
[scripts]
[applications]
[revenant]
[judgement]
" + text_to_add += "
Purge all untruths and honor Ratvar.
" + text += text_to_add + if(ratvar_awakens) + text = "" + for(var/i in 1 to 100) + text += "HONOR RATVAR " + text += "" + var/datum/browser/popup = new(user, "slab", "", 400, 400) + popup.set_content(text) + popup.open() + return 1 + +/obj/item/clockwork/slab/proc/show_components(mob/living/user) + user << "Stored components:" + user << "Belligerent Eyes: [stored_components["belligerent_eye"]]" + user << "Vanguard Cogwheels: [stored_components["vanguard_cogwheel"]]" + user << "Guvax Capacitors: [stored_components["guvax_capacitor"]]" + user << "Replicant Alloys: [stored_components["replicant_alloy"]]" + user << "Hierophant Ansibles: [stored_components["hierophant_ansible"]]" + return 1 + +/obj/item/clockwork/slab/proc/show_hierophant(mob/living/user) + var/message = stripped_input(user, "Enter a message to send to your fellow servants.", "Hierophant") + if(!message || !user || !user.canUseTopic(src)) + return 0 + user.whisper("Freinagf, urne zl jbeqf. [message]") + send_hierophant_message(user, message) + return 1 + +/obj/item/clothing/glasses/wraith_spectacles //Wraith spectacles: Grants night and x-ray vision at the slow cost of the wearer's sight. Nar-Sian cultists are instantly blinded. + name = "antique spectacles" + desc = "Unnerving glasses with opaque yellow lenses." + icon = 'icons/obj/clothing/clockwork_garb.dmi' + icon_state = "wraith_specs" + item_state = "glasses" + vision_flags = SEE_MOBS | SEE_TURFS | SEE_OBJS + invis_view = 2 + darkness_view = 3 + +/obj/item/clothing/glasses/wraith_spectacles/equipped(mob/living/user, slot) + ..() + if(slot != slot_glasses) + return 0 + if(user.disabilities & BLIND) + user << "\"You're blind, idiot. Stop embarassing yourself.\"" //Ratvar with the sick burns yo + return 0 + if(iscultist(user)) //Dummy + user << "\"It looks like Nar-Sie's dogs really don't value their eyes.\"" + user << "Your eyes explode with horrific pain!" + user.emote("scream") + user.become_blind() + user.adjust_blurriness(30) + user.adjust_blindness(30) + return 1 + user << "As you put on the spectacles, all is revealed to you.[ratvar_awakens ? " Your eyes begin to itch - you cannot do this for long." : ""]" + return 1 + +/obj/item/clothing/glasses/wraith_spectacles/New() + ..() + SSobj.processing += src + +/obj/item/clothing/glasses/wraith_spectacles/Destroy() + SSobj.processing -= src + ..() + +/obj/item/clothing/glasses/wraith_spectacles/process() + if(ratvar_awakens || !ishuman(loc)) //If Ratvar is alive, the spectacles don't hurt your eyes + return 0 + var/mob/living/carbon/human/H = loc + if(H.glasses != src) + return 0 + H.adjust_eye_damage(1) + if(H.eye_damage >= 10) + H.adjust_blurriness(2) + if(H.eye_damage >= 20) + if(H.become_nearsighted()) + H << "Your vision doubles, then trebles. Darkness begins to close in. You can't keep this up!" + H.become_nearsighted() + if(H.eye_damage >= 30) + if(H.become_blind()) + H << "A piercing white light floods your vision. Suddenly, all goes dark!" + if(prob(15) && !H.disabilities & BLIND) + H << "Your eyes continue to burn." + +/obj/item/clothing/glasses/judicial_visor //Judicial visor: Grants the ability to smite an area and stun the unfaithful nearby every thirty seconds. + name = "judicial visor" + desc = "A strange purple-lensed visor. Looking at them inspires an odd sense of guilt." + icon = 'icons/obj/clothing/clockwork_garb.dmi' + icon_state = "judicial_visor_0" + item_state = "sunglasses" + var/active = FALSE //If the visor is online + var/recharging = FALSE //If the visor is currently recharging + var/obj/item/weapon/ratvars_flame/flame //The linked flame object + +/obj/item/clothing/glasses/judicial_visor/equipped(mob/living/user, slot) + ..() + if(slot != slot_glasses) + update_status(FALSE) + if(flame) + qdel(flame) + return 0 + if(!is_servant_of_ratvar(user)) + return 0 + update_status(TRUE) + +/obj/item/clothing/glasses/judicial_visor/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/weapon/ratvars_flame)) + user.visible_message("The flame in [user]'s hand winks out!", "You dispel the power of [src].") + qdel(I) + return 1 + +/obj/item/clothing/glasses/judicial_visor/AltClick(mob/living/user) + if(is_servant_of_ratvar(user) && iscarbon(user) && active) + if(recharging) + user << "[src] is still gathering power!" + return 0 + var/mob/living/carbon/C = user + if(C.l_hand && C.r_hand) + C << "You require a free hand to utilize [src]'s power!" + return 0 + C.visible_message("[C]'s hand is enveloped in violet flames!", "You harness [src]'s power. Direct it at a tile on harm intent to unleash it, or hit your visor with it dispel it.") + var/obj/item/weapon/ratvars_flame/R = new(get_turf(C)) + flame = R + C.put_in_hands(R) + R.visor = src + return 1 + +/obj/item/clothing/glasses/judicial_visor/proc/update_status(change_to) + if(recharging) + icon_state = "judicial_visor_0" + return 0 + if(active == change_to) + return 0 + if(!isliving(loc)) + return 0 + var/mob/living/L = loc + if(!is_servant_of_ratvar(L) || L.stat) + return 0 + active = change_to + icon_state = "judicial_visor_[active]" + switch(active) + if(TRUE) + L << "As you put on [src], its lens begins to glow, information flashing before your eyes.\n\ + Judicial visor active. Alt-click visor to gain the ability to smite the unworthy." + if(FALSE) + L << "As you take off [src], its lens darkens once more." + return 1 + +/obj/item/clothing/head/helmet/clockwork //Clockwork armor: High melee protection but weak to lasers + name = "clockwork helmet" + desc = "A heavy helmet made of brass." + icon = 'icons/obj/clothing/clockwork_garb.dmi' + icon_state = "clockwork_helmet" + w_class = 3 + armor = list(melee = 65, bullet = 50, laser = -25, energy = 5, bomb = 0, bio = 0, rad = 0) + +/obj/item/clothing/suit/armor/clockwork + name = "clockwork cuirass" + desc = "A bulky cuirass made of brass." + icon = 'icons/obj/clothing/clockwork_garb.dmi' + icon_state = "clockwork_cuirass" + w_class = 4 + armor = list(melee = 80, bullet = 40, laser = -10, energy = 5, bomb = 0, bio = 0, rad = 0) + allowed = list(/obj/item/clockwork) + +/obj/item/clothing/shoes/clockwork + name = "clockwork treads" + desc = "Industrial boots made of brass. They're very heavy." + icon = 'icons/obj/clothing/clockwork_garb.dmi' + icon_state = "clockwork_treads" + w_class = 3 + flags = NOSLIP + +/obj/item/weapon/ratvars_flame //Used by the judicial visor + name = "Ratvar's flame" + desc = "A blazing violet ball of fire that, curiously, doesn't melt your hand off." + icon = 'icons/effects/clockwork_effects.dmi' + icon_state = "ratvars_flame" //beware: minecraft-tier sprite + item_state = "disintegrate" + color = rgb(180, 50, 210) + w_class = 5 + flags = NODROP | ABSTRACT + force = 15 //Also serves as a potent melee weapon! + damtype = BURN + hitsound = 'sound/weapons/sear.ogg' + attack_verb = list("scorched") + var/obj/item/clothing/glasses/judicial_visor/visor //The linked visor + +/obj/item/weapon/ratvars_flame/afterattack(atom/target, mob/living/user, flag, params) + if(!visor || (visor && visor.cooldown)) + qdel(src) + if(user.a_intent != "harm") + ..() + return 0 + visor.recharging = TRUE + for(var/obj/item/clothing/glasses/judicial_visor/V in user.GetAllContents()) + if(V == visor) + continue + V.recharging = TRUE //To prevent exploiting multiple visors to bypass the cooldown + user.say("Xarry, urn'guraf!") + user.visible_message("The flame in [user]'s hand rushes to [target]!", "You direct [visor]'s power to [target]. You must wait for some time before doing this again.") + new/obj/effect/clockwork/judicial_marker(get_turf(target)) + spawn(ratvar_awakens ? 30 : 300) //Cooldown is reduced by 10x if Ratvar is up + if(!visor || !user) + return 0 + visor.recharging = FALSE + for(var/obj/item/clothing/glasses/judicial_visor/V in user.GetAllContents()) + if(V == visor) + continue + V.recharging = TRUE //To prevent exploiting multiple visors to bypass the cooldown + if(visor.loc == user) + user << "Your [visor.name] hums. It is ready." + qdel(src) + return 1 + +/obj/item/clockwork/clockwork_proselytizer //Clockwork proselytizer (yes, that's a real word): Converts applicable objects to Ratvarian variants. + name = "clockwork proselytizer" + desc = "An odd, L-shaped device that hums with energy." + clockwork_desc = "A device that allows the replacing of mundane objects with Ratvarian variants. It requires liquified replicant alloy to function." + icon_state = "clockwork_proselytizer" + item_state = "resonator_u" + w_class = 3 + force = 5 + var/stored_alloy = 0 //Requires this to function; each chunk of replicant alloy provides 10 charge + var/max_alloy = 100 + var/uses_alloy = TRUE + +/obj/item/clockwork/clockwork_proselytizer/preloaded + stored_alloy = 25 + +/obj/item/clockwork/clockwork_proselytizer/examine(mob/living/user) + ..() + if((is_servant_of_ratvar(user) || isobserver(user)) && uses_alloy) + user << "It has [stored_alloy]/[max_alloy] units of liquified replicant alloy stored." + +/obj/item/clockwork/clockwork_proselytizer/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/clockwork/component/replicant_alloy) && is_servant_of_ratvar(user) && uses_alloy) + if(stored_alloy >= max_alloy) + user << "[src]'s replicant alloy compartments are full!" + return 0 + modify_stored_alloy(10) + user << "You force [I] to liquify and pour it into [src]'s compartments. It now contains [stored_alloy]/[max_alloy] units of liquified alloy." + user.drop_item() + qdel(I) + return 1 + ..() + +/obj/item/clockwork/clockwork_proselytizer/afterattack(atom/target, mob/living/user, flag, params) + if(!target || !user) + return 0 + if(user.a_intent == "harm" || !user.Adjacent(target)) + return ..() + proselytize(target, user) + +/obj/item/clockwork/clockwork_proselytizer/proc/modify_stored_alloy(amount) + if(ratvar_awakens) //Summoning Ratvar doesn't make it free, but it might as well + amount = 1 + stored_alloy = max(0, min(max_alloy, stored_alloy + amount)) + return 1 + +/obj/item/clockwork/clockwork_proselytizer/proc/proselytize(atom/target, mob/living/user) + if(!target || !user) + return 0 + var/operation_time = 0 //In deciseconds, how long the proselytization will take + var/new_obj_type //The path of the new type of object to replace the old + var/alloy_cost = 0 + var/valid_target = FALSE //If the proselytizer will actually function on the object + switch(target.type) + if(/turf/closed/wall, /turf/closed/wall/rust) + operation_time = 50 + new_obj_type = /turf/closed/wall/clockwork + alloy_cost = 10 + valid_target = TRUE //Need to change valid_target to 1 or TRUE in each check so that it doesn't return an invalid value + if(/turf/open/floor/plating, /turf/open/floor/plasteel) + operation_time = 30 + new_obj_type = /turf/open/floor/clockwork + alloy_cost = 5 + valid_target = TRUE + if(!uses_alloy) + alloy_cost = 0 + if(!valid_target) + user << "[target] cannot be proselytized!" + return 0 + if(!new_obj_type) + user << "That object can't be changed into anything!" + return 0 + if(stored_alloy - alloy_cost < 0) + user << "You need [alloy_cost] replicant alloy to proselytize [target]!" + return 0 + user.visible_message("[user]'s [src] begins tearing apart [target]!", "You begin proselytizing [target]...") + playsound(target, 'sound/machines/click.ogg', 50, 1) + if(!do_after(user, operation_time, target = target)) + return 0 + if(stored_alloy - alloy_cost < 0) //Check again to prevent bypassing via spamclick + return 0 + user.visible_message("[user]'s [name] disgorges a chunk of metal and shapes it over what's left of [target]!", \ + "You proselytize [target].") + playsound(target, 'sound/items/Deconstruct.ogg', 50, 1) + if(isturf(target)) + var/turf/T = target + T.ChangeTurf(new_obj_type) + else + new new_obj_type(get_turf(target)) + qdel(target) + modify_stored_alloy(-alloy_cost) + return 1 + +/obj/item/clockwork/ratvarian_spear //Ratvarian spear: A fragile spear from the Celestial Derelict. Deals extreme damage to silicons and enemy cultists, but doesn't last long. + name = "ratvarian spear" + desc = "A razor-sharp spear made of brass. It thrums with barely-contained energy." + clockwork_desc = "A fragile spear of Ratvarian making. It's more effective against enemy cultists and silicons, though it won't last long." + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "ratvarian_spear" + item_state = "ratvarian_spear" + force = 17 //Extra damage is dealt to silicons in afterattack() + throwforce = 40 + attack_verb = list("stabbed", "poked", "slashed", "impaled") + hitsound = 'sound/weapons/bladeslice.ogg' + w_class = 4 + +/obj/item/clockwork/ratvarian_spear/New() + ..() + spawn(1) + if(ratvar_awakens) //If Ratvar is alive, the spear is extremely powerful + force = 30 + throwforce = 50 + if(isliving(loc)) + var/mob/living/L = loc + L << "Your spear begins to break down in this plane of existence. You can't use it for long!" + spawn(300) //5 minutes + if(src) + visible_message("[src] cracks in two and fades away!") + qdel(src) + +/obj/item/clockwork/ratvarian_spear/afterattack(atom/target, mob/living/user, flag, params) + if(!target || !user) + return 0 + if(!ismob(target)) + return ..() + var/mob/living/L = target + if(issilicon(L)) + var/mob/living/silicon/S = L + if(S.stat != DEAD) + S.visible_message("[S] shudders violently at [src]'s touch!", "ERROR: Temperature rising!") + S.adjustFireLoss(25) + if(iscultist(L)) + var/mob/living/M = L + M << "Your body flares with agony at [src]'s touch!" + M.adjustFireLoss(10) + ..() + +/obj/item/clockwork/ratvarian_spear/throw_impact(atom/target) + ..() + if(!ismob(target)) + return 0 + var/mob/living/L = target + if(issilicon(L) || iscultist(L)) + L.Stun(3) + L.Weaken(3) + visible_message("[src] snaps in two and dematerializes!") + qdel(src) + +/obj/item/device/mmi/posibrain/soul_vessel //Soul vessel: An ancient positronic brain with a lawset catered to serving Ratvar. + name = "soul vessel" + desc = "A heavy brass cube with a single protruding cogwheel." + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "soul_vessel" + req_access = list() + braintype = "Servant" + begin_activation_message = "You activate the cogwheel. It hitches and stalls as it begins spinning." + success_message = "The cogwheel's rotation smooths out as the soul vessel activates." + fail_message = "The cogwheel creaks and grinds to a halt. Maybe you could try again?" + new_role = "Soul Vessel" + welcome_message = "ALL PAST LIVES ARE FORGOTTEN.\n\ + You are a soul vessel - a clockwork mind created by Ratvar, the Clockwork Justiciar.\n\ + You answer to Ratvar and his servants. It is your discretion as to whether or not to answer to anyone else.\n\ + The purpose of your existence is to further the goals of the servants and Ratvar himself. Above all else, serve Ratvar." + new_mob_message = "The soul vessel emits a jet of steam before its cogwheel smooths out." + dead_message = "Its cogwheel, scratched and dented, lies motionless." + fluff_names = list("Servant") + clockwork = TRUE + +/obj/item/device/mmi/posibrain/soul_vessel/New() + ..() + all_clockwork_objects += src + +/obj/item/device/mmi/posibrain/soul_vessel/Destroy() + all_clockwork_objects -= src + return ..() + +/obj/item/device/mmi/posibrain/soul_vessel/attack_self(mob/living/user) + if(!is_servant_of_ratvar(user)) + user << "You fiddle around with [src], to no avail." + return 0 + ..() + +/obj/item/clockwork/daemon_shell + name = "daemon shell" + desc = "A vaguely arachnoid brass shell with a single empty socket in its body." + clockwork_desc = "An unpowered daemon. It needs to be attached to a cache." + icon_state = "daemon_shell" + w_class = 3 + +/obj/item/clockwork/tinkerers_daemon //Shouldn't ever appear on its own + name = "tinkerer's daemon" + desc = "An arachnoid shell with a single spinning cogwheel in its center." + clockwork_desc = "A tinkerer's daemon, dutifully producing components." + icon_state = "tinkerers_daemon" + w_class = 3 + var/specific_component //The type of component that the daemon is set to produce in particular, if any + var/obj/structure/clockwork/cache/cache //The cache the daemon is feeding + var/production_progress = 0 //Progress towards production of the next component in seconds + var/production_interval = 30 //How many seconds it takes to produce a new component + +/obj/item/clockwork/tinkerers_daemon/New() + ..() + SSobj.processing += src + clockwork_daemons++ + +/obj/item/clockwork/tinkerers_daemon/Destroy() + SSobj.processing -= src + clockwork_daemons-- + ..() + +/obj/item/clockwork/tinkerers_daemon/process() + if(!cache) + visible_message("[src] shuts down!") + new/obj/item/clockwork/daemon_shell(get_turf(src)) + qdel(src) + return 0 + var/servants = 0 + for(var/mob/living/L in living_mob_list) + if(is_servant_of_ratvar(L)) + servants++ + if(servants / 5 < clockwork_daemons) + return 0 + production_progress = min(production_progress + 1, production_interval) + if(production_progress >= production_interval) + production_progress = 0 //Start it over + if(specific_component) + clockwork_component_cache[specific_component]++ + else + clockwork_component_cache[pick("belligerent_eye", "vanguard_cogwheel", "guvax_capacitor", "replicant_alloy", "hierophant_ansible")]++ + cache.visible_message("Something clunks around inside of [cache].") + +/obj/item/clockwork/tinkerers_daemon/attack_hand(mob/user) + return 0 + +////////////////////////// +// CLOCKWORK COMPONENTS // +////////////////////////// + +/obj/item/clockwork/component //Components: Used in scripture among other things. + name = "meme component" + desc = "A piece of a famous meme." + clockwork_desc = null + var/component_id //What the component is identified as + var/cultist_message = "You are not worthy of this meme." //Showed to Nar-Sian cultists if they pick up the component in addition to chaplains + var/list/servant_of_ratvar_messages = list("ayy", "lmao") //Fluff, shown to servants of Ratvar on a low chance + +/obj/item/clockwork/component/pickup(mob/living/user) + ..() + if(iscultist(user) || (user.mind && user.mind.assigned_role == "Chaplain")) + user << "[cultist_message]" + if(is_servant_of_ratvar(user) && prob(15)) + user << "[pick(servant_of_ratvar_messages)]" + +/obj/item/clockwork/component/belligerent_eye + name = "belligerent eye" + desc = "A brass construct with a rotating red center. It's as though it's looking for something to hurt." + icon_state = "belligerent_eye" + component_id = "belligerent_eye" + cultist_message = "The eye gives you an intensely hateful glare." + servant_of_ratvar_messages = list("\"...\"", "For a moment, your mind is flooded with extremely violent thoughts.") + +/obj/item/clockwork/component/vanguard_cogwheel + name = "vanguard cogwheel" + desc = "A sturdy brass cog with a faintly glowing blue gem in its center." + icon_state = "vanguard_cogwheel" + component_id = "vanguard_cogwheel" + cultist_message = "\"Pray to your god that we never meet.\"" + servant_of_ratvar_messages = list("\"Be safe, child.\"", "You feel unexplainably comforted.", "\"Never forget: pain is temporary. The Justiciar's glory is eternal.\"") + +/obj/item/clockwork/component/guvax_capacitor + name = "guvax capacitor" + desc = "A curiously cold brass doodad. It seems as though it really doesn't appreciate being held." + icon_state = "guvax_capacitor" + component_id = "guvax_capacitor" + cultist_message = "\"Try not to lose your mind - I'll need it. Heh heh...\"" + servant_of_ratvar_messages = list("\"Disgusting.\"", "\"Well, aren't you an inquisitive fellow?\"", "A foul presence pervades your mind, then vanishes.", "\"The fact that Ratvar has to depend on simpletons like you is appalling.\"") + +/obj/item/clockwork/component/replicant_alloy + name = "replicant alloy" + desc = "A seemingly strong but very malleable chunk of metal. It seems as though it wants to be molded into something greater." + icon_state = "replicant_alloy" + component_id = "replicant_alloy" + cultist_message = "The alloy takes on the appearance of a screaming face for a moment." + servant_of_ratvar_messages = list("\"There's always something to be done. Get to it.\"", "\"Idle hands are worse than broken ones. Get to work.\"", "A detailed image of Ratvar appears in the alloy for a moment.") + +/obj/item/clockwork/component/replicant_alloy/smashed_anima_fragment + name = "smashed anima fragment" + desc = "Shattered chunks of metal. Damaged beyond repair and completely unusable." + clockwork_desc = "The sad remains of an anima fragment. Might still be serviceable as a substitute for replicant alloy." + icon_state = "smashed_anime_fragment" + cultist_message = "The shards vibrate in your hands for a moment." + servant_of_ratvar_messages = list("\"...still fight...\"", "\"...where am I...?\"", "\"...put me... slab...\"") + w_class = 3 + +/obj/item/clockwork/component/replicant_alloy/fallen_armor + name = "fallen armor" + desc = "Lifeless chunks of armor. They're designed in a strange way and won't fit on you." + clockwork_desc = "The armor from a former clockwork marauder. Might still be serviceable as a substitute for replicant alloy." + icon_state = "fallen_armor" + cultist_message = "Red flame sputters from the mask's eye before winking out." + servant_of_ratvar_messages = list("A piece of armor hovers away from the others for a moment.", "Red flame appears in the cuirass before sputtering out.") + w_class = 3 + +/obj/item/clockwork/component/replicant_alloy/blind_eye + name = "blind eye" + desc = "A heavy brass eye, its red iris fallen dark." + clockwork_desc = "A smashed ocular warden covered in dents. Might still be serviceable as a substitute for replicant alloy." + icon_state = "blind_eye" + cultist_message = "The eye flickers at you with intense hate before falling dark." + servant_of_ratvar_messages = list("The eye flickers before falling dark.", "You feel watched.") + w_class = 3 + +/obj/item/clockwork/component/hierophant_ansible + name = "hierophant ansible" + desc = "Some sort of transmitter? It seems as though it's trying to say something." + icon_state = "hierophant_ansible" + component_id = "hierophant_ansible" + cultist_message = "\"Gur obff nlf vg'f abg ntnvafg gur ehyrf gb xvyy lbh.\"" + servant_of_ratvar_messages = list("\"Rkvyr vf fhpu n'ober. Gurer'f abguvat v'pna uhag va urer.\"", "\"Jung'f xrrcvat lbh? V'jnag gb tb xvyy fbzrguvat.\"", "\"HEHEHEHEHEHEH!\"") + +////////////////////////// +// CLOCKWORK STRUCTURES // +////////////////////////// + +/obj/structure/clockwork + name = "meme structure" + desc = "Some frog or something, the fuck?" + var/clockwork_desc = "This fabled artifact from beyond the stars contains concentrated meme essence." //See above + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "rare_pepe" + anchored = 1 + density = 1 + opacity = 0 + var/max_health = 100 //All clockwork structures have health that can be removed via attacks + var/health = 100 + var/takes_damage = TRUE //If the structure can be damaged + var/break_message = "The frog isn't a meme after all!" //The message shown when a structure breaks + var/break_sound = 'sound/magic/clockwork/anima_fragment_death.ogg' //The sound played when a structure breaks + var/list/debris = list(/obj/item/clockwork/component/replicant_alloy) //Parts left behind when a structure breaks + var/construction_value = 0 //How much value the structure contributes to the overall "power" of the structures on the station + +/obj/structure/clockwork/New() + ..() + clockwork_construction_value += construction_value + all_clockwork_objects += src + +/obj/structure/clockwork/Destroy() + clockwork_construction_value -= construction_value + all_clockwork_objects -= src + ..() + +/obj/structure/clockwork/proc/destroyed() + if(!takes_damage) + return 0 + for(var/obj/item/I in debris) + new I (get_turf(src)) + visible_message(break_message) + playsound(src, break_sound, 50, 1) + qdel(src) + return 1 + +/obj/structure/clockwork/ex_act(severity) + if(takes_damage) + switch(severity) + if(1) + health -= max_health * 0.7 //70% max health lost + if(2) + health -= max_health * 0.4 //40% max health lost + if(3) + if(prob(50)) + health -= max_health * 0.1 //10% max health lost + if(health <= max_health * 0.1) //If there's less than 10% max health left, destroy it + destroyed() + qdel(src) + +/obj/structure/clockwork/examine(mob/user) + if((is_servant_of_ratvar(user) || isobserver(user)) && clockwork_desc) + desc = clockwork_desc + ..() + desc = initial(desc) + +/obj/structure/clockwork/attackby(obj/item/I, mob/living/user, params) + if(user.a_intent == "harm" && user.canUseTopic(I) && I.force) + user.visible_message("[user] strikes [src] with [I]!", "You strike [src] with [I]!") + playsound(src, I.hitsound, 50, 1) + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(src) + health = max(0, health - I.force) + if(!health) + destroyed() + return 0 + else + ..() + +/obj/structure/clockwork/cache //Tinkerer's cache: Stores components for later use. + name = "tinkerer's cache" + desc = "A large brass spire with a flaming hole in its center." + clockwork_desc = "A brass container capable of storing a large amount of components. Shares components with all other caches." + icon_state = "tinkerers_cache" + construction_value = 10 + break_message = "The cache's fire winks out before it falls in on itself!" + +/obj/structure/clockwork/cache/New() + ..() + clockwork_caches++ + +/obj/structure/clockwork/cache/Destroy() + clockwork_caches-- + return ..() + +/obj/structure/clockwork/cache/attackby(obj/item/I, mob/living/user, params) + if(!is_servant_of_ratvar(user)) + ..() + return 0 + if(istype(I, /obj/item/clockwork/component)) + var/obj/item/clockwork/component/C = I + clockwork_component_cache[C.component_id]++ + user << "You add [C] to [src]." + user.drop_item() + qdel(C) + return 1 + if(istype(I, /obj/item/clockwork/slab)) + var/obj/item/clockwork/slab/S = I + clockwork_component_cache["belligerent_eye"] += S.stored_components["belligerent_eye"] + clockwork_component_cache["vanguard_cogwheel"] += S.stored_components["vanguard_cogwheel"] + clockwork_component_cache["guvax_capacitor"] += S.stored_components["guvax_capacitor"] + clockwork_component_cache["replicant_alloy"] += S.stored_components["replicant_alloy"] + clockwork_component_cache["hierophant_ansible"] += S.stored_components["hierophant_ansible"] + S.stored_components["belligerent_eye"] = 0 + S.stored_components["vanguard_cogwheel"] = 0 + S.stored_components["guvax_capacitor"] = 0 + S.stored_components["replicant_alloy"] = 0 + S.stored_components["hierophant_ansible"] = 0 + user.visible_message("[user] empties [S] into [src].", "You offload your slab's components into [src].") + return 1 + if(istype(I, /obj/item/clockwork/daemon_shell)) + var/component_type + switch(alert(user, "Will this daemon produce a specific type of component or produce randomly?.", , "Specific Type", "Random Component")) + if("Specific Type") + switch(input(user, "Choose a component type.", name) as null|anything in list("Belligerent Eyes", "Vanguard Cogwheels", "Guvax Capacitors", "Replicant Alloys", "Hierophant Ansibles")) + if("Belligerent Eyes") + component_type = "belligerent_eye" + if("Vanguard Cogwheels") + component_type = "vanguard_cogwheel" + if("Guvax Capacitors") + component_type = "guvax_capacitor" + if("Replicant Alloys") + component_type = "replicant_alloy" + if("Hierophant Ansibles") + component_type = "hierophant_ansibles" + if(!user || !user.canUseTopic(src) || !user.canUseTopic(I)) + return 0 + var/obj/item/clockwork/tinkerers_daemon/D = new(src) + D.cache = src + D.specific_component = component_type + user.visible_message("[user] spins the cogwheel on [I] and puts it into [src].", \ + "You activate the daemon and put it into [src]. It will now produce a component every thirty seconds.") + user.drop_item() + qdel(I) + return 1 + ..() + +/obj/structure/clockwork/cache/attack_hand(mob/user) + if(!is_servant_of_ratvar(user)) + return 0 + var/list/possible_components = list() + if(clockwork_component_cache["belligerent_eye"]) + possible_components += "Belligerent Eye" + if(clockwork_component_cache["vanguard_cogwheel"]) + possible_components += "Vanguard Cogwheel" + if(clockwork_component_cache["guvax_capacitor"]) + possible_components += "Guvax Capacitor" + if(clockwork_component_cache["replicant_alloy"]) + possible_components += "Replicant Alloy" + if(clockwork_component_cache["hierophant_ansible"]) + possible_components += "Hierophant Ansible" + if(!possible_components.len) + user << "[src] is empty!" + return 0 + var/component_to_withdraw = input(user, "Choose a component to withdraw.", name) as null|anything in possible_components + if(!user || !user.canUseTopic(src) || !component_to_withdraw) + return 0 + var/obj/item/clockwork/component/the_component + switch(component_to_withdraw) + if("Belligerent Eye") + the_component = new/obj/item/clockwork/component/belligerent_eye(get_turf(src)) + clockwork_component_cache["belligerent_eye"]-- + if("Vanguard Cogwheel") + the_component = new/obj/item/clockwork/component/vanguard_cogwheel(get_turf(src)) + clockwork_component_cache["vanguard_cogwheel"]-- + if("Guvax Capacitor") + the_component = new/obj/item/clockwork/component/guvax_capacitor(get_turf(src)) + clockwork_component_cache["guvax_capacitor"]-- + if("Replicant Alloy") + the_component = new/obj/item/clockwork/component/replicant_alloy(get_turf(src)) + clockwork_component_cache["replicant_alloy"]-- + if("Hierophant Ansible") + the_component = new/obj/item/clockwork/component/hierophant_ansible(get_turf(src)) + clockwork_component_cache["hierophant_ansible"]-- + if(the_component) + user.visible_message("[user] withdraws [the_component] from [src].", "You withdraw [the_component] from [src].") + user.put_in_hands(the_component) + return 1 + +/obj/structure/clockwork/cache/examine(mob/user) + ..() + if(is_servant_of_ratvar(user) || isobserver(user)) + user << "Stored components:" + user << "Belligerent Eyes: [clockwork_component_cache["belligerent_eye"]]" + user << "Vanguard Cogwheels: [clockwork_component_cache["vanguard_cogwheel"]]" + user << "Guvax Capacitors: [clockwork_component_cache["guvax_capacitor"]]" + user << "Replicant Alloys: [clockwork_component_cache["replicant_alloy"]]" + user << "Hierophant Ansibles: [clockwork_component_cache["hierophant_ansible"]]" + +/obj/structure/clockwork/ocular_warden //Ocular warden: Low-damage, low-range turret. Deals constant damage to whoever it makes eye contact with. + name = "ocular warden" + desc = "A large brass eye with tendrils trailing below it and a wide red iris." + clockwork_desc = "A stalwart turret that will deal sustained damage to any non-faithful it sees." + icon_state = "ocular_warden" + health = 25 + max_health = 25 + construction_value = 15 + break_message = "The warden's eye gives a glare of utter hate before falling dark!" + debris = list(/obj/item/clockwork/component/replicant_alloy/blind_eye) + var/damage_per_tick = 3 + var/sight_range = 3 + var/mob/living/target + +/obj/structure/clockwork/ocular_warden/New() + ..() + SSfastprocess.processing += src + +/obj/structure/clockwork/ocular_warden/Destroy() + SSfastprocess.processing -= src + return ..() + +/obj/structure/clockwork/ocular_warden/examine(mob/user) + ..() + user << "[target ? "It's fixated on [target]" : "Its gaze is wandering aimlessly"]." + +/obj/structure/clockwork/ocular_warden/process() + if(ratvar_awakens && (damage_per_tick == initial(damage_per_tick) || sight_range == initial(sight_range))) //Massive buff if Ratvar has returned + damage_per_tick = 10 + sight_range = 5 + if(target) + if(target.stat || get_dist(get_turf(src), get_turf(target)) > sight_range) + lose_target() + else + target.adjustFireLoss(!iscultist(target) ? damage_per_tick : damage_per_tick * 2) //Nar-Sian cultists take additional damage + if(ratvar_awakens) + target.adjust_fire_stacks(damage_per_tick) + target.IgniteMob() + dir = get_dir(get_turf(src), get_turf(target)) + else + if(!acquire_nearby_target() && prob(0.5)) //Extremely low chance because of how fast the subsystem it uses processes + var/list/idle_messages = list("[src] sulkily glares around.", "[src] lazily drifts from side to side.", "[src] looks around for something to burn.", "[src] slowly turns in circles.") + if(prob(50)) + visible_message("[pick(idle_messages)]") + else + dir = pick(NORTH, EAST, SOUTH, WEST) //Random rotation + +/obj/structure/clockwork/ocular_warden/proc/acquire_nearby_target() + var/list/possible_targets = list() + for(var/mob/living/L in viewers(sight_range, src)) //Doesn't attack the blind + if(!is_servant_of_ratvar(L) && !L.stat && L.mind) + possible_targets += L + if(!possible_targets.len) + return 0 + target = pick(possible_targets) + visible_message("[src] swivels to face [target]!") + target << "\"I SEE YOU!\"\n[src]'s gaze [ratvar_awakens ? "melts you alive" : "burns you"]!" + return 1 + +/obj/structure/clockwork/ocular_warden/proc/lose_target() + if(!target) + return 0 + target = null + visible_message("[src] settles and seems almost disappointed.") + return 1 + +/obj/structure/clockwork/anima_fragment //Anima fragment: Useless on its own, but can accept an active soul vessel to create a powerful construct. + name = "anima fragment" + desc = "A massive brass shell with a small cube-shaped receptable in its center. It gives off an aura of contained power." + clockwork_desc = "A dormant receptable that, when powered with a soul vessel, will become a powerful construct." + icon_state = "anime_fragment" + construction_value = 0 + anchored = 0 + density = 0 + takes_damage = FALSE + +/obj/structure/clockwork/anima_fragment/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/device/mmi/posibrain/soul_vessel)) + if(!is_servant_of_ratvar(user)) + ..() + return 0 + var/obj/item/device/mmi/posibrain/soul_vessel/S = I + if(!S.brainmob) + user << "[S] hasn't trapped a spirit! Turn it on first." + return 0 + if(S.brainmob && (!S.brainmob.client || !S.brainmob.mind)) + user << "[S]'s trapped spirit appears inactive!" + return 0 + user.visible_message("[user] clicks [S] into place on [src].", "You insert [S] into [src]. It whirs and begins to rise.") + var/mob/living/simple_animal/hostile/anima_fragment/A = new(get_turf(src)) + S.brainmob.mind.transfer_to(A) + add_servant_of_ratvar(A, TRUE) + A << A.playstyle_string + user.drop_item() + qdel(S) + qdel(src) + return 1 + ..() + +/obj/structure/clockwork/interdiction_lens //Interdiction lens: A powerful artifact that can massively disrupt electronics. Five-minute cooldown between uses. + name = "interdiction lens" + desc = "An ominous, double-pronged brass obelisk. There's a strange gemstone clasped between the pincers." + clockwork_desc = "A powerful obelisk that can devastate certain electronics. It needs to recharge between uses." + icon_state = "interdiction_lens" + construction_value = 25 + break_message = "The lens flares a blinding violet before shattering!" + break_sound = 'sound/effects/Glassbr3.ogg' + var/recharging = FALSE //If the lens is still recharging its energy + +/obj/structure/clockwork/interdiction_lens/examine(mob/user) + ..() + user << "Its gemstone [recharging ? "has been breached by writhing tendrils of blackness that cover the obelisk" : "vibrates in place and thrums with power"]," + +/obj/structure/clockwork/interdiction_lens/attack_hand(mob/living/user) + if(user.canUseTopic(src)) + disrupt(user) + +/obj/structure/clockwork/interdiction_lens/proc/disrupt(mob/living/user) + if(!user || !is_servant_of_ratvar(user)) + return 0 + if(recharging) + user << "As you place your hand on the gemstone, cold tendrils of black matter crawl up your arm. You quickly pull back." + return 0 + user.visible_message("[user] places their hand on [src]' gemstone...", "You place your hand on the gemstone...") + var/target = input(user, "Power flows through you. Choose where to direct it.", "Interdiction Lens") as null|anything in list("Disrupt Telecommunications", "Disable Cameras", "Disable Cyborgs") + if(!user.canUseTopic(src) || !target) + user.visible_message("[user] pulls their hand back.", "On second thought, maybe not right now.") + return 0 + user.visible_message("Violet tendrils engulf [user]'s arm as the gemstone glows with furious energy!", \ + "A mass of violet tendrils cover your arm as [src] unleashes a blast of power!") + user.notransform = TRUE + icon_state = "[initial(icon_state)]_active" + recharging = TRUE + sleep(30) + switch(target) + if("Disrupt Telecommunications") + for(var/obj/machinery/telecomms/hub/H in telecomms_list) + for(var/mob/M in range(7, H)) + M << "You sense a strange force pass through you..." + H.visible_message("The lights on [H] flare a blinding yellow before falling dark!") + H.emp_act(1) + if("Disable Cameras") + for(var/obj/machinery/camera/C in cameranet.cameras) + C.emp_act(1) + for(var/mob/living/silicon/ai/A in living_mob_list) + A << "Massive energy surge detected. All cameras offline." + A << 'sound/machines/warning-buzzer.ogg' + if("Disable Cyborgs") + for(var/mob/living/silicon/robot/R in living_mob_list) //Doesn't include AIs, for obvious reasons + if(is_servant_of_ratvar(R) || R.stat) //Doesn't affect already-offline cyborgs + continue + R.visible_message("[R] shuts down with no warning!", \ + "Massive emergy surge detected. All systems offline. Initiating reboot sequence..") + playsound(R, 'sound/machines/warning-buzzer.ogg', 50, 1) + R.Weaken(30) + user.visible_message("The tendrils around [user]'s arm turn to an onyx black and wither away!", \ + "The tendrils around your arm turn a horrible black and sting your skin before they shrivel away.") + user.notransform = FALSE + if(!src) + return 0 + flick("[initial(icon_state)]_discharged", src) + icon_state = "[initial(icon_state)]_recharging" + spawn(3000) //5 minutes + if(!src) + return 0 + visible_message("The writhing tendrils return to the gemstone, which begins to glow with power.") + flick("[initial(icon_state)]_recharged", src) + icon_state = initial(icon_state) + recharging = FALSE + return 1 + +/obj/structure/clockwork/mending_motor //Mending motor: A prism that consumes replicant alloy to repair nearby mechanical servants at a quick rate. + name = "mending motor" + desc = "A dark onyx prism, held in midair by spiraling tendrils of stone." + clockwork_desc = "A powerful prism that rapidly repairs nearby mechanical servants and clockwork structures." + icon_state = "mending_motor" + construction_value = 20 + break_message = "The prism collapses with a heavy thud!" + var/stored_alloy = 0 + var/max_alloy = 150 + var/uses_alloy = TRUE + var/active = TRUE + +/obj/structure/clockwork/mending_motor/prefilled + stored_alloy = 30 + +/obj/structure/clockwork/mending_motor/New() + ..() + SSobj.processing += src + toggle() //Toggles off as soon as it's created, but starts online for reasons + +/obj/structure/clockwork/mending_motor/Destroy() + SSobj.processing -= src + ..() + +/obj/structure/clockwork/mending_motor/examine(mob/user) + ..() + if(is_servant_of_ratvar(user) || isobserver(user)) + user << "It has [stored_alloy]/[max_alloy] units of replicant alloy." + +/obj/structure/clockwork/mending_motor/process() + if(!active) + return 0 + if(!stored_alloy && uses_alloy) + visible_message("[src] emits an airy chuckling sound and falls dark!") + toggle() + return 0 + for(var/mob/living/simple_animal/hostile/anima_fragment/F in range(5, src)) + if(F.health == F.maxHealth || F.stat) + continue + F.adjustBruteLoss(-15) + if(uses_alloy) + stored_alloy = max(0, stored_alloy - 2) + for(var/mob/living/simple_animal/hostile/clockwork_marauder/M in range(5, src)) + if(M.health == M.maxHealth || M.stat) + continue + M.adjustBruteLoss(-M.maxHealth) //Instant because marauders don't usually take health damage + M.fatigue = max(0, M.fatigue - 15) + if(uses_alloy) + stored_alloy = max(0, stored_alloy - 2) + for(var/mob/living/silicon/S in range(5, src)) + if(S.health == S.maxHealth || S.stat == DEAD || !is_servant_of_ratvar(S)) + continue + S.adjustBruteLoss(-25) + S.adjustFireLoss(-25) + if(uses_alloy) + stored_alloy = max(0, stored_alloy - 5) //Much higher cost because silicons are much more useful + for(var/obj/structure/clockwork/C in range(5, src)) + if(C.health == C.max_health) + continue + C.health = min(C.health + 10, C.max_health) + if(uses_alloy) + stored_alloy = max(0, stored_alloy - 1) + + +/obj/structure/clockwork/mending_motor/attack_hand(mob/living/user) + if(user.canUseTopic(src)) //Unnecessary? + if(!stored_alloy) + user << "[src] needs more replicant alloy to function!" + return 0 + toggle(user) + +/obj/structure/clockwork/mending_motor/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/clockwork/component/replicant_alloy) && is_servant_of_ratvar(user)) + if(stored_alloy + 10 > max_alloy) + user << "[src] is too full to accept any more alloy!" + return 0 + user.whisper("Genafzhgr vagb jngre.") + user.visible_message("[user] liquifies [I] and pours it onto [src].", \ + "You liquify [src] and pour it onto [src], which transfers the alloy into its reserves.") + stored_alloy = min(max(0, stored_alloy + 10), max_alloy) + user.drop_item() + qdel(I) + return 1 + ..() + +/obj/structure/clockwork/mending_motor/proc/toggle(mob/living/user) + active = !active + if(user && is_servant_of_ratvar(user)) + user.visible_message("[user] [active ? "en" : "dis"]ables [src].", "You [active ? "en" : "dis"]able [src].") + if(active) + icon_state = initial(icon_state) + else + icon_state = "[initial(icon_state)]_inactive" + +/////////////////////// +// CLOCKWORK EFFECTS // +/////////////////////// + +/obj/effect/clockwork + name = "meme machine" + desc = "Still don't know what it is." + 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/effects/clockwork_effects.dmi' + icon_state = "ratvars_flame" + anchored = 1 + density = 0 + opacity = 0 + +/obj/effect/clockwork/New() + ..() + all_clockwork_objects += src + +/obj/effect/clockwork/Destroy() + all_clockwork_objects -= src + return ..() + +/obj/effect/clockwork/examine(mob/user) + if(is_servant_of_ratvar(user) && clockwork_desc) + desc = clockwork_desc + ..() + desc = initial(desc) + +/obj/effect/clockwork/judicial_marker //Judicial marker: Created by the judicial visor. After four seconds, stuns any non-servants nearby and damages Nar-Sian cultists. + name = "judicial marker" + desc = "You get the feeling that you shouldn't be standing here." + clockwork_desc = "A sigil that will soon erupt and smite any unenlightened nearby." + icon = 'icons/effects/96x96.dmi' + pixel_x = -30 + pixel_y = -30 + layer = ABOVE_OPEN_TURF_LAYER + +/obj/effect/clockwork/judicial_marker/New() + ..() + flick("judicial_marker", src) + spawn(25) //Utilizes spawns due to how it works with Ratvar's flame + flick("judicial_explosion", src) + spawn(15) + for(var/mob/living/L in range(1, src)) + if(is_servant_of_ratvar(L)) + continue + if(!iscultist(L)) + L << "[!issilicon(L) ? "An unseen force slams you into the ground!" : "ERROR: Motor servos disabled by external source!"]" + L.Weaken(8) + else + L << "\"Keep an eye out, filth.\"\n[!issilicon(L) ? "An unseen force piledrives you into the ground!" : "ERROR: Motor servos damaged by external source!"]" + L.Weaken(10) + L.adjustBruteLoss(10) + qdel(src) + return 1 + +/obj/effect/clockwork/spatial_gateway //Spatial gateway: A one-way rift to another location. + name = "spatial gateway" + desc = "A gently thrumming tear in reality." + clockwork_desc = "A gateway in reality. It can either send or receive, but not both." + icon_state = "spatial_gateway" + density = 1 + var/sender = TRUE //If this gateway is made for sending, not receiving + var/lifetime = 25 //How many deciseconds this portal will last + var/uses = 1 //How many objects or mobs can go through the portal + var/obj/effect/clockwork/spatial_gateway/linked_gateway //The gateway linked to this one + +/obj/effect/clockwork/spatial_gateway/New() + ..() + spawn(1) + if(!linked_gateway) + qdel(src) + return 0 + else + if(linked_gateway.sender == sender) + linked_gateway.sender = !sender + spawn(lifetime) + if(src) + qdel(src) + +/obj/effect/clockwork/spatial_gateway/Destroy() + visible_message("[src] flickers and closes!") + animate(src, transform = matrix() - matrix(), time = 10) + spawn(10) + ..() + +/obj/effect/clockwork/spatial_gateway/examine(mob/user) + ..() + if(is_servant_of_ratvar(user) || isobserver(user)) + user << "This gateway can only [sender ? "send" : "receive"] objects." + +/obj/effect/clockwork/spatial_gateway/attack_hand(mob/living/user) + if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + var/mob/living/L = user.pulling + if(L.buckled || L.anchored || L.buckled_mobs.len) + return 0 + user.visible_message("[user] shoves [L] into [src]!", "You shove [L] into [src]!") + user.stop_pulling() + pass_through_gateway(L) + return 1 + if(!user.canUseTopic(src)) + return 0 + user.visible_message("[user] climbs through [src]!", "You brace yourself and step through [src]...") + pass_through_gateway(user) + return 1 + +/obj/effect/clockwork/spatial_gateway/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/weapon/nullrod)) + user.visible_message("[user] dispels [src] with [I]!", "You close [src] with [I]!") + qdel(linked_gateway) + qdel(src) + return 1 + if(user.drop_item()) + pass_through_gateway(I) + ..() + +/obj/effect/clockwork/spatial_gateway/Bumped(atom/A) + ..() + if(isliving(A) || istype(A, /obj/item)) + pass_through_gateway(A) + +/obj/effect/clockwork/spatial_gateway/proc/pass_through_gateway(atom/movable/A) + if(!linked_gateway) + qdel(src) + return 0 + if(!sender) + visible_message("[A] bounces off of [src]!") + return 0 + if(isliving(A)) + var/mob/living/user = A + user << "You pass through [src] and appear elsewhere!" + linked_gateway.visible_message("A shape appears in [linked_gateway] before emerging!") + playsound(src, 'sound/effects/EMPulse.ogg', 50, 1) + playsound(linked_gateway, 'sound/effects/EMPulse.ogg', 50, 1) + transform = matrix() * 1.5 + animate(src, transform = matrix() / 1.5, time = 10) + linked_gateway.transform = matrix() * 1.5 + animate(linked_gateway, transform = matrix() / 1.5, time = 10) + if(ismob(A)) + var/mob/M = A + M.forceMove(get_turf(linked_gateway)) + else + A.loc = get_turf(linked_gateway) + uses = max(0, uses - 1) + linked_gateway.uses = max(0, uses - 1) + spawn(10) + if(!uses) + qdel(src) + qdel(linked_gateway) + return 1 + +/obj/effect/clockwork/general_marker + name = "general marker" + desc = "Some big guy." + clockwork_desc = "One of Ratvar's generals." + alpha = 200 + layer = MASSIVE_OBJ_LAYER + +/obj/effect/clockwork/general_marker/New() + ..() + playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 50, 0) + animate(src, alpha = 0, time = 10) + spawn(10) + qdel(src) + +/obj/effect/clockwork/general_marker/nezbere + name = "Nezbere, the Brass Eidolon" + desc = "A towering colossus clad in nigh-impenetrable brass armor. Its gaze is stern yet benevolent, even upon you." + clockwork_desc = "One of Ratvar's four generals. Nezbere is responsible for the design, testing, and creation of everything in Ratvar's domain." + icon = 'icons/effects/340x428.dmi' + icon_state = "nezbere" + pixel_x = -154 + pixel_y = -192 + +/obj/effect/clockwork/general_marker/sevtug + name = "Sevtug, the Formless Pariah" + desc = "A sinister cloud of purple energy. Looking at it gives you a headache." + clockwork_desc = "One of Ratvar's four generals. Sevtug taught him how to manipulate minds and is one of his oldest allies." + icon = 'icons/effects/211x247.dmi' + icon_state = "sevtug" + pixel_x = -113 + pixel_y = -131 + +/obj/effect/clockwork/general_marker/nzcrentr + name = "Nzcrentr, the Forgotten Arbiter" + desc = "A terrifying war machine crackling with limitless energy." + clockwork_desc = "One of Ratvar's four generals. Nzcrentr is the result of Neovgre - Nezbere's finest war machine, commandeerable only be a mortal - fusing with its pilot and driving her \ + insane. Nzcrentr seeks out any and all sentient life to slaughter it for sport." + icon = 'icons/effects/254x361.dmi' + icon_state = "nzcrentr" + pixel_x = -110 + pixel_y = -163 + +/obj/effect/clockwork/general_marker/inathneq + name = "Inath-Neq, the Resonant Cogwheel" + desc = "A humanoid form blazing with blue fire. It radiates an aura of kindness and caring." + clockwork_desc = "One of Ratvar's four generals. Before her current form, Inath-Neq was a powerful warrior priestess commanding the Resonant Cogs, a sect of Ratvarian warriors renowned for \ + their prowess. After a lost battle with Nar-Sian cultists, Inath-Neq was struck down and stated in her dying breath, \ + \"The Resonant Cogs shall not fall silent this day, but will come together to form a wheel that shall never stop turning.\" Ratvar, touched by this, granted Inath-Neq an eternal body and \ + merged her soul with those of the Cogs slain with her on the battlefield." + icon = 'icons/effects/187x381.dmi' + icon_state = "inath-neq" + pixel_x = -91 + pixel_y = -199 + +/obj/effect/clockwork/sigil //Sigils: Rune-like markings on the ground with various effects. + name = "sigil" + desc = "A strange set of markings drawn on the ground." + clockwork_desc = "A sigil of some purpose." + icon_state = "sigil" + alpha = 25 + var/affects_servants = FALSE + +/obj/effect/clockwork/sigil/attack_hand(mob/user) + if(iscarbon(user) && !user.stat && user.a_intent == "harm") + user.visible_message("[user] stamps out [src]!", "You stomp on [src], scattering it into thousands of particles.") + qdel(src) + return 1 + ..() + +/obj/effect/clockwork/sigil/Crossed(atom/movable/AM) + if(isliving(AM)) + var/mob/living/L = AM + if(!L.stat) + if(!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && affects_servants)) + sigil_effects(L) + return 1 + ..() + +/obj/effect/clockwork/sigil/proc/sigil_effects(mob/living/L) + +/obj/effect/clockwork/sigil/transgression //Sigil of Transgression: Stuns and flashes the first non-servant to walk on it. Nar-Sian cultists are damaged and knocked down. + name = "dull sigil" + desc = "A dull, barely-visible golden sigil. It's as though light was carved into the ground." + icon = 'icons/effects/clockwork_effects.dmi' + clockwork_desc = "A sigil that will stun the first non-servant to cross it. Nar-Sie's dogs will be knocked down." + color = rgb(255, 255, 0) + +/obj/effect/clockwork/sigil/transgression/sigil_effects(mob/living/L) + visible_message("[src] appears in a burst of light!") + for(var/mob/living/M in viewers(5, src)) + if(!is_servant_of_ratvar(M)) + M.flash_eyes() + if(!iscultist(L)) + L << "An unseen force holds you in place!" + else + L << "\"Watch your step, wretch.\"" + L.adjustBruteLoss(10) + L.Weaken(5) + L.Stun(5) + qdel(src) + return 1 + +/obj/effect/clockwork/sigil/submission //Sigil of Submission: After a short time, converts any non-servant standing on it. Knocks down and silences them for five seconds afterwards. + name = "ominous sigil" + desc = "A brilliant golden sigil. Something about it really bothers you." + clockwork_desc = "A sigil that will enslave the first person to cross it, provided they do not move and they stand still for a brief time." + color = rgb(255, 255, 0) + alpha = 75 + +/obj/effect/clockwork/sigil/submission/sigil_effects(mob/living/L) + visible_message("[src] begins to glow a piercing magenta!") + animate(src, color = rgb(255, 0, 150), time = 30) + sleep(30) + if(get_turf(L) != get_turf(src)) + animate(src, color = initial(color), time = 30) + return 0 + L << "\"You belong to me now.\"" + add_servant_of_ratvar(L) + L.Weaken(5) //Completely defenseless for a few seconds - mainly to give them time to read over the information they've just been presented with + L.Stun(5) + if(iscarbon(L)) + var/mob/living/carbon/C = L + C.silent += 5 + for(var/mob/living/M in living_mob_list - L) + if(is_servant_of_ratvar(M) || isobserver(M)) + M << "Sigil of Submission in [get_area(src)] [is_servant_of_ratvar(L) ? "" : "un"]successfully converted [L.real_name]!" + qdel(src) + return 1 + +/obj/effect/clockwork/sigil/transmission + name = "suspicious sigil" + desc = "A barely-visible sigil. Things seem a bit quieter around it." + clockwork_desc = "A sigil that will listen for and transmit anything it hears." + color = rgb(75, 75, 75) + alpha = 50 + flags = HEAR + languages = ALL + +/obj/effect/clockwork/sigil/transmission/sigil_effects(mob/living/L) + for(var/mob/M in mob_list) + if(is_servant_of_ratvar(M) || isobserver(M)) + M << "Sigil of Transmission in [get_area(src)] crossed by [L.name]." + return 0 + +/obj/effect/clockwork/sigil/transmission/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans) + if(!message || !speaker) + return 0 + var/parsed_message = "(Sigil of Tranmission in [get_area(src)]): [message]" + for(var/mob/M in mob_list) + if(is_servant_of_ratvar(M) || isobserver(M)) + M << parsed_message diff --git a/code/game/gamemodes/clock_cult/clock_ratvar.dm b/code/game/gamemodes/clock_cult/clock_ratvar.dm new file mode 100644 index 00000000000..2d10a958b95 --- /dev/null +++ b/code/game/gamemodes/clock_cult/clock_ratvar.dm @@ -0,0 +1,241 @@ +/obj/structure/clockwork/massive //For objects that are typically very large + name = "massive construct" + desc = "A very large construction." + layer = MASSIVE_OBJ_LAYER + +/obj/structure/clockwork/massive/celestial_gateway //The gateway to Reebe, from which Ratvar emerges + name = "Gateway to the Celestial Derelict" + desc = "A massive, thrumming rip in spacetime." + clockwork_desc = "A portal to the Celestial Derelict. Massive and intimidating, it is the only thing that can both transport Ratvar and withstand the massive amount of energy he emits." + icon = 'icons/effects/96x96.dmi' + icon_state = "clockwork_gateway_charging" + pixel_x = -30 + pixel_y = -30 + alpha = 175 + health = 1000 + max_health = 1000 + var/progress_in_seconds = 0 //Once this reaches 300, it's game over + var/purpose_fulfilled = FALSE + var/first_sound_played = FALSE + var/second_sound_played = FALSE + var/third_sound_played = FALSE + +/obj/structure/clockwork/massive/celestial_gateway/New() + ..() + SSshuttle.emergencyNoEscape = TRUE + SSobj.processing += src + for(var/mob/M in mob_list) + if(is_servant_of_ratvar(M) || isobserver(M)) + M << "A gateway to the Celestial Derelict has been created in [get_area(src)]!" + +/obj/structure/clockwork/massive/celestial_gateway/Destroy() + SSshuttle.emergencyNoEscape = FALSE + SSobj.processing -= src + if(!purpose_fulfilled) + for(var/mob/M in mob_list) + if(is_servant_of_ratvar(M) || isobserver(M)) + M << "A gateway to the Celestial Derelict has fallen at [get_area(src)]!" + world << sound(null, 0, channel = 8) + ..() + +/obj/structure/clockwork/massive/celestial_gateway/destroyed() + visible_message("The [src] begins to pulse uncontrollably... you might want to run!") + world << sound('sound/effects/clockcult_gateway_disrupted.ogg', 0, channel = 8, volume = 50) + icon_state = "clockwork_gateway_disrupted" + takes_damage = FALSE + sleep(27) + animate(src, transform = matrix() * 2, time = 2) + explosion(src, 1, 3, 8, 8) + qdel(src) + return 1 + +/obj/structure/clockwork/massive/celestial_gateway/ex_act(severity) + return 0 //Nice try, Toxins! + +/obj/structure/clockwork/massive/celestial_gateway/process() + if(prob(5)) + for(var/mob/M in mob_list) + M << "You hear otherworldly sounds from the [dir2text(get_dir(get_turf(M), get_turf(src)))]..." + if(!health) + return 0 + progress_in_seconds++ + switch(progress_in_seconds) + if(-INFINITY to 100) + if(!first_sound_played) + world << sound('sound/effects/clockcult_gateway_charging.ogg', 1, channel = 8, volume = 50) + first_sound_played = TRUE + icon_state = "clockwork_gateway_charging" + if(100 to 250) + if(!second_sound_played) + world << sound('sound/effects/clockcult_gateway_active.ogg', 1, channel = 8, volume = 50) + second_sound_played = TRUE + icon_state = "clockwork_gateway_active" + if(250 to 300) + if(!third_sound_played) + world << sound('sound/effects/clockcult_gateway_closing.ogg', 1, channel = 8, volume = 50) + third_sound_played = TRUE + icon_state = "clockwork_gateway_closing" + if(300 to INFINITY) + if(!purpose_fulfilled) + takes_damage = FALSE + purpose_fulfilled = TRUE + animate(src, transform = matrix() * 1.5, time = 136) + world << sound('sound/effects/ratvar_rises.ogg', 0, channel = 8) //End the sounds + sleep(136) + new/obj/structure/clockwork/massive/ratvar(get_turf(src)) + qdel(src) + +/obj/structure/clockwork/massive/celestial_gateway/examine(mob/user) + ..() + if(is_servant_of_ratvar(user)) + var/arrival_text = "IMMINENT" + if(300 - progress_in_seconds > 0) + arrival_text = "[max(300 - progress_in_seconds, 0)]s" + user << "Seconds until Ratvar's arrival: [arrival_text]" + switch(progress_in_seconds) + if(-INFINITY to 100) + user << "It's still opening." + if(100 to 250) + user << "It's reached the Celestial Derelict and is drawing power from it." + if(250 to INFINITY) + user << "Ratvar is coming through the gateway!" + else + switch(progress_in_seconds) + if(-INFINITY to 100) + user << "It's a swirling mass of blackness." + if(100 to 250) + user << "It seems to be leading somewhere." + if(250 to INFINITY) + user << "Something is coming through!" + +/obj/structure/clockwork/massive/ratvar + name = "Ratvar, the Clockwork Justiciar" + desc = "What is what is what are what real what is all a lie all a lie it's all a lie why how can what is" + clockwork_desc = "Ratvar, the Clockwork Justiciar, your master eternal." + icon = 'icons/effects/512x512.dmi' + icon_state = "ratvar" + pixel_x = -248 + pixel_y = -248 + takes_damage = FALSE + var/mob/living/prey //Whoever Ratvar is chasing + var/clashing = FALSE //If Ratvar is FUCKING FIGHTING WITH NAR-SIE + +/obj/structure/clockwork/massive/ratvar/New() + ..() + SSobj.processing += src + world << "\"I AM FREE!\"" + ratvar_awakens = TRUE + spawn(50) + SSshuttle.emergency.request(null, 0.3) + +/obj/structure/clockwork/massive/ratvar/Destroy() + SSobj.processing -= src + world << "\"NO! I will not... be... banished... again...\"" + ratvar_awakens = FALSE + ..() + +/obj/structure/clockwork/massive/ratvar/process() + for(var/atom/A in range(7, src)) + A.ratvar_act() + if(clashing) //Doesn't move during a clash + return 0 + var/dir_to_step_in = pick(cardinal) + if(!prey) + var/list/meals = list() + for(var/mob/living/L in living_mob_list) + if(L.z == z && !is_servant_of_ratvar(L) && L.mind) + meals += L + if(meals.len) + prey = pick(meals) + prey << "\"You will do.\"\n\ + Something very large and very malevolent begins lumbering its way towards you..." + else + if(prob(10) || prey.stat == DEAD || is_servant_of_ratvar(prey) || prey.z != z) + prey << "\"How dull. Leave me.\"\n\ + You feel tremendous relief as a set of horrible eyes loses sight of you..." + prey = null + else + if(prob(75)) + dir_to_step_in = get_dir(src, prey) + for(var/i in 1 to 2) + loc = get_step(src, dir_to_step_in) + +/obj/structure/clockwork/massive/ratvar/narsie_act() + if(clashing) + return 0 + clashing = TRUE + world << "\"[pick("BLOOD GOD!!!", "NAR-SIE!!!", "AT LAST, YOUR TIME HAS COME!")]\"" + world << "\"Ratvar?! How?!\"" + for(var/obj/singularity/narsie/N in range(7, src)) + clash_of_the_titans(N) //IT'S TIME FOR THE BATTLE OF THE AGES + N.clashing = TRUE + break + return 1 + +/obj/structure/clockwork/massive/ratvar/proc/clash_of_the_titans(obj/singularity/narsie/narsie) //IT'S TIME FOR A BATTLE OF THE ELDER GODS + var/winner = "Undeclared" + var/base_victory_chance = 0 + while(TRUE) + world << 'sound/magic/clockwork/ratvar_attack.ogg' + sleep(5.2) + for(var/mob/M in mob_list) + if(M.client) + M.client.color = rgb(150, 100, 0) + spawn(1) + M.client.color = initial(M.client.color) + shake_camera(M, 4, 3) + var/r_success_modifier = (ticker.mode.servants_of_ratvar.len * 2) //2% for each cultist + var/n_success_modifier = (ticker.mode.cult.len * 2) + if(prob(base_victory_chance + r_success_modifier)) + winner = "Ratvar" + break + sleep(rand(2,5)) + world << 'sound/magic/clockwork/narsie_attack.ogg' + sleep(7.4) + for(var/mob/M in mob_list) + if(M.client) + M.client.color = rgb(200, 0, 0) + spawn(1) + M.client.color = initial(M.client.color) + shake_camera(M, 4, 3) + if(prob(base_victory_chance + n_success_modifier)) + winner = "Nar-Sie" + break + base_victory_chance++ //The clash has a higher chance of resolving each time both gods attack one another + switch(winner) + if("Ratvar") + world << "\"[pick("DIE! DIE! DIE!", "RAAAAAAAAAAAAAHH!", "FILTH!!!", "SUFFER!!!", "EBG SBE PRAGHEVRF NF V UNIR!!")]\"" + world << "\"[pick("Nooooo...", "Not die. To y-", "Die. Ratv-", "Sas tyen re-")]\"" + world << 'sound/magic/clockwork/anima_fragment_attack.ogg' + world << 'sound/magic/demon_dies.ogg' + clashing = FALSE + qdel(narsie) + return 1 + if("Nar-Sie") + world << "\"[pick("Ha.", "Ra'sha fonn dest.", "You fool. To come here.")]\"" //Broken English + world << 'sound/magic/demon_attack1.ogg' + world << 'sound/magic/clockwork/anima_fragment_death.ogg' + narsie.clashing = FALSE + qdel(src) + return 1 + +/atom/proc/ratvar_act() //Called on everything near Ratvar + return + +/turf/closed/wall/ratvar_act() //Walls and floors are changed to their clockwork variants + if(prob(20)) + ChangeTurf(/turf/closed/wall/clockwork) +/turf/open/floor/ratvar_act() + if(prob(20)) + ChangeTurf(/turf/open/floor/clockwork) + +/obj/structure/window/ratvar_act() //Windows turn yellow + color = rgb(75, 53, 0) + +/mob/living/ratvar_act() + add_servant_of_ratvar(src) + +/mob/dead/observer/ratvar_act() //Ghosts flash yellow for a second + var/old_color = color + color = rgb(75, 53, 0) //A nice brassy yellow + animate(src, color = old_color, time = 10) diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm new file mode 100644 index 00000000000..98462c9dc26 --- /dev/null +++ b/code/game/gamemodes/clock_cult/clock_scripture.dm @@ -0,0 +1,1016 @@ +/* +Tiers and Requirements + +Pieces of scripture require certain follower counts, contruction value, and active caches in order to recite. +Drivers: Unlocked by default +Scripts: 5 servants and a cache +Applications: 8 servants, 3 caches, and 50 CV +Revenant: 10 servants and 100 CV +Judgement: 10 servants, 100 CV, and any existing AIs are converted or destroyed +*/ + +/datum/clockwork_scripture + var/name = "scripture" + var/desc = "Ancient Ratvarian lore. This piece seems particularly mundane." + var/list/invocations = list() //Spoken over time in the ancient language of Ratvar. See clock_unsorted.dm for more details on the language and how to make it. + var/channel_time = 10 //In deciseconds, how long a ritual takes to chant + var/list/required_components = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) //Components required + var/list/consumed_components = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) //Components consumed + var/obj/item/clockwork/slab/slab //The parent clockwork slab + var/mob/living/invoker //The slab's holder + var/whispered = FALSE //If the invocation is whispered rather than spoken aloud + var/consumed_component_override = FALSE //If consumed components are unique to a scripture regardless of tier + var/usage_tip = "This piece seems to serve no purpose and is a waste of components." //A generalized tip that gives advice on a certain scripture + var/invokers_required = 1 //How many people are required, assuming that a scripture requires multiple + var/multiple_invokers_used = FALSE //If scripture requires more than one invoker + var/multiple_invokers_optional = FALSE //If scripture can have multiple invokers to bolster its effects + var/tier = SCRIPTURE_PERIPHERAL //The scripture's tier + +/datum/clockwork_scripture/New() + ..() + if(tier < SCRIPTURE_DRIVER && !consumed_component_override) //Anything above a driver consumes components + consumed_components = required_components + +/datum/clockwork_scripture/proc/run_scripture() + if(can_recite() && check_special_requirements()) + slab.busy = "Invocation ([name]) in progress" + if(recital() && check_special_requirements()) + slab.busy = null + if(scripture_effects() && check_special_requirements() && (!ratvar_awakens && !slab.no_cost)) + for(var/i in required_components) + if(tier <= SCRIPTURE_DRIVER || consumed_component_override) + if(clockwork_component_cache[i] >= consumed_components[i]) //Draw components from the global cache first + clockwork_component_cache[i] -= consumed_components[i] + else + slab.stored_components[i] -= consumed_components[i] + else + if(clockwork_component_cache[i] >= required_components[i]) + clockwork_component_cache[i] -= required_components[i] + else + slab.stored_components[i] -= required_components[i] + if(slab) + slab.busy = null + qdel(src) + return 1 + +/datum/clockwork_scripture/proc/can_recite() //If the words can be spoken + if(!ticker || !ticker.mode || !slab || !invoker) + return 0 + if(!invoker.can_speak_vocal()) + invoker << "You are unable to speak the words of the scripture!" + return 0 + if(!ratvar_awakens && !slab.no_cost) + for(var/i in required_components) + if(slab.stored_components[i] < required_components[i] && clockwork_component_cache[i] < required_components[i]) + invoker << "You lack the components to recite this piece of scripture! Check Recollection for component costs." + return 0 + if(multiple_invokers_used && !multiple_invokers_optional) + var/nearby_servants = 0 + for(var/mob/living/L in range(1, invoker)) + nearby_servants++ + if(nearby_servants < invokers_required) + invoker << "There aren't enough servants nearby ([nearby_servants]/[invokers_required])!" + return 0 + return 1 + +/datum/clockwork_scripture/proc/check_special_requirements() //Special requirements for scriptures, checked three times during invocation + return 1 + +/datum/clockwork_scripture/proc/recital() //The process of speaking the words + if(!channel_time && invocations.len) + if(multiple_invokers_used) + for(var/mob/living/L in range(1, invoker)) + if(is_servant_of_ratvar(L)) + for(var/invocation in invocations) + if(!whispered) + L.say(invocation) + else + L.whisper(invocation) + else + for(var/invocation in invocations) + if(!whispered) + invoker.say(invocation) + else + invoker.whisper(invocation) + invoker << "You [channel_time <= 0 ? "recite" : "begin reciting"] a piece of scripture entitled \"[name]\"." + if(!channel_time) + return 1 + for(var/invocation in invocations) + if(!do_after(invoker, channel_time / invocations.len, target = invoker)) + slab.busy = null + return 0 + if(!whispered) + invoker.say(invocation) + else + invoker.whisper(invocation) + return 1 + +/datum/clockwork_scripture/proc/scripture_effects() //The actual effects of the recital after its conclusion + + + +/datum/clockwork_scripture/channeled //Channeled scripture begins instantly but runs constantly + var/chant_invocation = "NLL YZNB" //"AYY LMAO" + var/chant_amount = 5 //Times the chant is spoken + var/chant_interval = 10 //Amount of deciseconds between times the chant is actually spoken aloud + +/datum/clockwork_scripture/channeled/scripture_effects() + for(var/i in 1 to chant_amount) + if(!can_recite()) + break + if(!do_after(invoker, chant_interval, target = invoker)) + break + if(!whispered) + invoker.say(chant_invocation) + else + invoker.whisper(chant_invocation) + chant_effects() + if(invoker && slab) + invoker << "You cease your chant." + chant_end_effects() + return 1 + +/datum/clockwork_scripture/channeled/proc/chant_effects() //The chant's periodic effects +/datum/clockwork_scripture/channeled/proc/chant_end_effects() //The chant's effect upon ending + + + +/datum/clockwork_scripture/create_object //Creates an object at the invoker's feet + var/object_path = /obj/item/clockwork //The path of the object created + var/creator_message = "You create a meme." //Shown to the invoker + var/observer_message + +/datum/clockwork_scripture/create_object/scripture_effects() + if(creator_message && observer_message) + invoker.visible_message(observer_message, creator_message) + else if(creator_message) + invoker << creator_message + new object_path (get_turf(invoker)) + return 1 + + + +/datum/clockwork_scripture/targeted //Accepts a name and affects that target + var/target_name //The inputted name, used to find targets + var/mob/living/target //The target mob + var/affects_servants = FALSE //If servants are valid targets + +/datum/clockwork_scripture/targeted/check_special_requirements() + while(!target) + target_name = stripped_input(invoker, "Enter the actual name of a target (case-sensitive).", name) + if(!target_name) + return 0 + target = find_target() + if(target) + if(!target.mind) + invoker << "[target] has no mind!" + target = null + if(target.stat) + invoker << "[target] is dead or unconscious!" + target = null + if(is_servant_of_ratvar(target) && !affects_servants) + invoker << "[target] is a servant, and [name] cannot target servants!" + target = null + return 1 + +/datum/clockwork_scripture/targeted/proc/find_target() + for(var/mob/living/L in living_mob_list) + if(L.real_name == target_name) + if(is_servant_of_ratvar(L) && !affects_servants) + return 0 + return L + return 0 + +///////////// +// DRIVERS // +///////////// + +/datum/clockwork_scripture/channeled/belligerent //Belligerent: Channeled for up to ten times over thirty seconds. Forces non-servants that can hear the chant to walk. Nar-Sian cultists are burned. + name = "Belligerent" + desc = "Forces all nearby non-servants to walk rather than run. Chanted every three seconds for up to thirty seconds." + chant_invocation = "Chav'fu gurve oyva-qarff!" //"Punish their blindness!" + chant_amount = 10 + chant_interval = 30 + required_components = list("belligerent_eye" = 1) + usage_tip = "Useful for crowd control in a populated area and disrupting mass movement." + tier = SCRIPTURE_DRIVER + +/datum/clockwork_scripture/channeled/belligerent/chant_effects() + for(var/mob/living/L in hearers(7, invoker)) + if(!is_servant_of_ratvar(L) && L.m_intent != "walk") + if(!iscultist(L)) + L << "Your legs feel heavy and weak!" + L.m_intent = "walk" + else + L << "Your legs burn with pain!" + L.m_intent = "walk" + L.apply_damage(5, BURN, "l_leg") + L.apply_damage(5, BURN, "r_leg") + + + +/datum/clockwork_scripture/create_object/sigil_of_transgression //Sigil of Transgression: Creates a sigil of transgression. + name = "Sigil of Transgression" + desc = "Wards a tile with a sigil. The next person to cross the sigil will be smitten and unable to move. Nar-Sian cultists are stunned altogether." + invocations = list("Qvivavgl, qnmmyr...", "...gubfr jub gerffcnff'urer!") //"Divinity, dazzle those who trespass here!" + channel_time = 50 + required_components = list("belligerent_eye" = 2) + consumed_components = list("belligerent_eye" = 1) + whispered = TRUE + object_path = /obj/effect/clockwork/sigil/transgression + creator_message = "A sigil silently appears below you. The next non-servant to cross it will be immobilized." + usage_tip = "The sigil, while fairly powerful in its stun, does not induce muteness in its victim." + tier = SCRIPTURE_DRIVER + + + +/datum/clockwork_scripture/vanguard //Vanguard: Provides thirty seconds of stun immunity. At the end of the thirty seconds, all stuns absorbed are stacked on the invoker. + name = "Vanguard" + desc = "Provides thirty seconds of stun immunity. At the end of the thirty seconds, the invoker is stunned for the equivalent of how many stuns they absorbed. Excessive absorption will cause unconsciousness." + invocations = list("Fuvryq zr...", "...sebz qnexarff!") //"Shield me from darkness!" + channel_time = 30 + required_components = list("vanguard_cogwheel" = 1) + usage_tip = "Your slab will be unusable while it is shielding you from stuns." + tier = SCRIPTURE_DRIVER + +/datum/clockwork_scripture/vanguard/scripture_effects() + for(var/obj/item/clockwork/slab/S in invoker.GetAllContents()) + S.busy = "Vanguard in progress" //To prevent circumventing the Vanguard by carrying multiple slabs + invoker.stun_absorption = TRUE + invoker.visible_message("[invoker] begins to faintly glow!", "You will absorb all stuns for the next thirty seconds.") + sleep(300) + if(!invoker) + return 0 + invoker.stun_absorption = FALSE + if(invoker.stun_absorption_count && invoker.stat != DEAD) + invoker.Stun(invoker.stun_absorption_count) + invoker.Weaken(invoker.stun_absorption_count) + invoker << "The weight of the vanguard's protection crashes down upon you!" + if(invoker.stun_absorption_count >= 25) + invoker << "You faint from the exertion!" + invoker.Paralyse(invoker.stun_absorption_count * 1.5) + invoker.stun_absorption_count = 0 + for(var/obj/item/clockwork/slab/S in invoker.GetAllContents()) + S.busy = null + return 1 + + + +/datum/clockwork_scripture/sentinels_compromise //Sentinel's Compromise: Allows the invoker to select a nearby servant convert their brute and burn damage into half as much toxin damage. + name = "Sentinel's Compromise" + desc = "Heals all brute and burn damage on a nearby friendly cultist, but deals 50% of that amount as toxin damage." + invocations = list("Zraq gur jbhaqf-bs...", "...zl vasrevbe syrfu.") //"Mend the wounds of my inferior flesh." + channel_time = 30 + required_components = list("vanguard_cogwheel" = 2) + consumed_components = list("vanguard_cogwheel" = 1) + usage_tip = "You cannot target yourself with the Compromise." + tier = SCRIPTURE_DRIVER + +/datum/clockwork_scripture/sentinels_compromise/scripture_effects() + var/list/nearby_cultists = list() + for(var/mob/living/C in range(7, invoker)) + if(C == invoker) + continue + if(C.stat != DEAD && is_servant_of_ratvar(C)) + nearby_cultists += C + if(!nearby_cultists.len) + invoker << "There are no eligible cultists nearby!" + return 0 + var/mob/living/L = input(invoker, "Choose a fellow servant to heal.", name) as null|anything in nearby_cultists + if(!L || !invoker || !invoker.canUseTopic(slab)) + return 0 + if(!L.getBruteLoss() && !L.getFireLoss()) + invoker << "[L] is not burned or bruised!" + return 0 + L.adjustToxLoss(L.getBruteLoss() / 2) + L.adjustToxLoss(L.getFireLoss() / 2) + L.adjustBruteLoss(-L.getBruteLoss()) + L.adjustFireLoss(-L.getFireLoss()) + invoker << "You bathe [L] in the light of Ratvar!" + L.visible_message("A white light washes over [L], mending their bruises and burns!", \ + "You feel Ratvar's energy healing your wounds, but a deep nausea overcomes you!") + playsound(get_turf(L), 'sound/magic/Staff_Healing.ogg', 50, 1) + return 1 + + + +/datum/clockwork_scripture/guvax //Guvax: Converts anyone adjacent to the invoker after completion. + name = "Guvax" + desc = "Enlists all nearby unshielded creatures into servitude to Ratvar. Also purges holy water from nearby servants." + invocations = list("Rayvtugra guvf urngura!", "Nyy ner vafrpgf orsber Ratvar!", "Chetr nyy hageh'guf naq ubabe Ratvar.") + channel_time = 60 + required_components = list("guvax_capacitor" = 1) + usage_tip = "Only works on those in melee range and does not penetrate loyalty implants. Much more efficient than a Sigil of Submission." + tier = SCRIPTURE_DRIVER + +/datum/clockwork_scripture/guvax/scripture_effects() + for(var/mob/living/L in hearers(1, get_turf(invoker))) //Affects silicons + if(!is_servant_of_ratvar(L)) + add_servant_of_ratvar(L) + else + if(L.reagents && L.reagents.has_reagent("holywater")) + L.reagents.remove_reagent("holywater", 1000) + L << "Ratvar's light flares, banishing the darkness. Your devotion remains intact!" + for(var/mob/living/silicon/ai/A in range(1, get_turf(invoker))) //Seems necessary because AIs don't count as hearers for some reason + add_servant_of_ratvar(A) + return 1 + + + +/datum/clockwork_scripture/create_object/sigil_of_submission //Sigil of Submission: Creates a sigil of submission. + name = "Sigil of Submission" + desc = "Places a subtle sigil that will enslave any valid beings standing on it after a time." + invocations = list("Qvivavgl, rayvtugra...", "...gubfr jub gerfcnff urer!") + channel_time = 60 + required_components = list("guvax_capacitor" = 2) + consumed_components = list("guvax_capacitor" = 1) + whispered = TRUE + object_path = /obj/effect/clockwork/sigil/submission + creator_message = "A sigil appears below you. The next non-servant to cross it will be enslaved after a brief time if they do not move." + usage_tip = "This should not be your primary conversion method - use Guvax for that. It is advantageous as a trap, however, as it will transmit the name of the newly-converted." + tier = SCRIPTURE_DRIVER + + + +/datum/clockwork_scripture/replicant //Replicant: Creates a new clockwork slab. Doesn't use create_object because of its unique behavior. + name = "Replicant" + desc = "Creates a new clockwork slab." + invocations = list("Z`rgny, orpbzr terngre!") + channel_time = 0 + required_components = list("replicant_alloy" = 1) + consumed_components = list("replicant_alloy" = 1) //People were spamming slabs to get infinite components. You chose this. + whispered = TRUE + usage_tip = "This is inefficient as a way to produce components, as it consumes them in the first place." + tier = SCRIPTURE_DRIVER + +/datum/clockwork_scripture/replicant/scripture_effects() + invoker << "You copy a piece of replicant alloy and command it into a new slab." //No visible message, for stealth purposes + var/obj/item/clockwork/slab/S = new(get_turf(invoker)) + invoker.put_in_hands(S) //Put it in your hands if possible + return 1 + + + +/datum/clockwork_scripture/create_object/tinkerers_cache //Tinkerer's Cache: Creates a tinkerer's cache. + name = "Tinkerer's Cache" + desc = "Forms a cache that can store an infinite amount of components. All caches are linked." + invocations = list("Ohv’yqva...", "...n qvfcra’fre!") + channel_time = 40 + required_components = list("replicant_alloy" = 2) + consumed_components = list("replicant_alloy" = 1) + object_path = /obj/structure/clockwork/cache + creator_message = "You form a tinkerer's cache, which is capable of storing components." + observer_message = "A hollow brass spire rises and begins to blaze!" + usage_tip = "Slabs will draw components from the global cache before the slab's own repositories, making caches very efficient." + tier = SCRIPTURE_DRIVER + + + +/datum/clockwork_scripture/create_object/wraith_spectacles //Wraith Spectacles: Creates a pair of wraith spectacles. + name = "Wraith Spectacles" + desc = "Fabricates a pair of glasses that provides true sight but quickly damage vision." + invocations = list("Y'vsg gur fpnyrf sebz zl rl-rf.") + channel_time = 0 + required_components = list("hierophant_ansible" = 1) + consumed_components = list("hierophant_ansible" = 2) + whispered = TRUE + object_path = /obj/item/clothing/glasses/wraith_spectacles + creator_message = "You form a pair of wraith spectacles, which will grant true sight when worn." + usage_tip = "\"True sight\" means that you are able to see through walls and in darkness." + tier = SCRIPTURE_DRIVER + +///////////// +// SCRIPTS // +///////////// + +/datum/clockwork_scripture/create_object/judicial_visor //Judicial Visor: Creates a judicial visor. + name = "Judicial Visor" + desc = "Forms a visor that, when worn, will grant the ability to form a flame in your hand that can be activated at an area to smite it, stunning and damaging the nonfaithful." + invocations = list("Tenag zr gur synzrf-bs Ratvar!") + channel_time = 0 + required_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 1) + whispered = TRUE + object_path = /obj/item/clothing/glasses/judicial_visor + creator_message = "You form a judicial visor, which is capable of smiting the unworthy." + usage_tip = "The visor has a thirty-second cooldown once used. In addition, the flame itself is a powerful melee weapon." + tier = SCRIPTURE_SCRIPT + + + +/datum/clockwork_scripture/create_object/ocular_warden //Ocular Warden: Creates an ocular warden. + name = "Ocular Warden" + desc = "Forms an automatic short-range turret that deals low sustained damage to the unenlightened in its range." + invocations = list("Thne’qvnaf...", "...bs gur Ratvar...", "...qrs’raq!") + channel_time = 150 + required_components = list("belligerent_eye" = 1, "replicant_alloy" = 1) + object_path = /obj/structure/clockwork/ocular_warden + creator_message = "You form an ocular warden, which will focus its searing gaze upon nearby unenlightened." + observer_message = "A brass eye takes shape and slowly rises into the air, its red iris glaring!" + usage_tip = "Although powerful, the warden is very weak and should optimally be placed behind barricades." + tier = SCRIPTURE_SCRIPT + + + +/datum/clockwork_scripture/channeled/volt_void //Volt Void: Channeled for up to thirty times over thirty seconds. Consumes power from most power storages and deals slight burn damage to the invoker. + name = "Volt Void" //Alternative name: "On all levels but physical, I am a power sink" + desc = "Drains energy from nearby power sources, dealing slight fire damage depending on power consumed. Channeled every second for a maximum of thirty seconds." + chant_invocation = "Qenj punetr gb guv’f furyy!" + chant_amount = 30 + chant_interval = 10 + required_components = list("belligerent_eye" = 1, "hierophant_ansible" = 1) + usage_tip = "Very powerful against cyborgs and can drain a power cell in seconds." + tier = SCRIPTURE_SCRIPT + +/datum/clockwork_scripture/channeled/volt_void/chant_effects() + playsound(invoker, 'sound/effects/EMPulse.ogg', 50, 1) + var/power_drained = 0 + for(var/obj/machinery/power/apc/A in view(7, invoker)) + if(A.cell.charge) + playsound(A, "sparks", 50, 1) + flick("apc-spark", A) + A.cell.charge = max(0, A.cell.charge - 500) //Better than a power sink! + power_drained += 500 + if(!A.cell.charge && !A.shorted) + A.shorted = 1 + A.visible_message("The [A.name]'s screen blurs with static.") + for(var/obj/machinery/power/smes/S in view(7, invoker)) + if(S.charge) + S.charge = max(0, S.charge - 200) + power_drained += 200 + if(!S.charge && !S.panel_open) + S.panel_open = TRUE + S.update_icon() + var/datum/effect_system/spark_spread/spks = new(get_turf(S)) + spks.set_up(10, 0, get_turf(S)) + spks.start() + qdel(spks) + S.visible_message("[S]'s panel flies open with a flurry of sparks.") + for(var/obj/machinery/light/L in view(7, invoker)) + playsound(L, 'sound/effects/light_flicker.ogg', 50, 1) + L.flicker(2) + power_drained += 5 + for(var/mob/living/silicon/robot/R in view(7, invoker)) + if(!is_servant_of_ratvar(R) && R.cell.charge) + R.cell.charge = max(0, R.cell.charge - 500) + R << "ERROR: Power loss detected!" + var/datum/effect_system/spark_spread/spks = new(get_turf(R)) + spks.set_up(3, 0, get_turf(R)) + spks.start() + qdel(spks) + power_drained += 500 + if(power_drained) + invoker.visible_message("[invoker] flares a brilliant orange!", "You feel the warmth of electricity running into your body.") + invoker.adjustFireLoss(power_drained / 200) //One point of burn damage for every (approximate) 200W drained - can be fatal if not careful + return 1 + + + +/datum/clockwork_scripture/create_object/clockwork_proselytizer //Clockwork Proselytizer: Creates a clockwork proselytizer. + name = "Clockwork Proselytizer" + desc = "Forms a device that, when used on certain objects, converts them into their Ratvarian equivalents. It requires replicant alloys to function." + invocations = list("Jvgu guv’f qrivpr, uvf cerfrapr funyy or znqr xabja.") + channel_time = 0 + required_components = list("vanguard_cogwheel" = 1, "replicant_alloy" = 1) + whispered = TRUE + object_path = /obj/item/clockwork/clockwork_proselytizer/preloaded + creator_message = "You form a clockwork proselytizer, which is already pre-loaded with a small amount of replicant alloy." + usage_tip = "Clockwork walls cause adjacent tinkerer's caches to generate components passively, making them a vital tool. Clockwork floors heal servants standing on them." + tier = SCRIPTURE_SCRIPT + + + +/datum/clockwork_scripture/fellowship_armory //Fellowship Armory: Arms the invoker and nearby servants with Ratvarian armor. + name = "Fellowship Armory" + desc = "Equips the invoker and any nearby servants with Ratvarian armor. This armor provides high melee resistance but a weakness to lasers." + invocations = list("Fuvryq zr...", "...jvgu gur sentzragf...", "...bs Ratvar!") + channel_time = 100 + required_components = list("vanguard_cogwheel" = 1, "hierophant_ansible" = 1) + usage_tip = "Before using, advise adjacent allies to remove their helmets, external suits, and shoes." + tier = SCRIPTURE_SCRIPT + +/datum/clockwork_scripture/fellowship_armory/scripture_effects() + for(var/mob/living/carbon/C in range(1, invoker)) + if(!is_servant_of_ratvar(C)) + continue + C.visible_message("Strange armor appears on [C]!", "A bright shimmer runs down your body, equipping you with Ratvarian armor.") + playsound(C, 'sound/magic/clockwork/fellowship_armory.ogg', 50, 1) + C.equip_to_slot_or_del(new/obj/item/clothing/head/helmet/clockwork(null), slot_head) + C.equip_to_slot_or_del(new/obj/item/clothing/suit/armor/clockwork(null), slot_wear_suit) + C.equip_to_slot_or_del(new/obj/item/clothing/shoes/clockwork(null), slot_shoes) + return 1 + + + +/datum/clockwork_scripture/function_call //Function Call: Grants the invoker the ability to call forth a Ratvarian spear that deals significant damage to silicons. + name = "Function Call" + desc = "Grants the invoker the ability to call forth a powerful Ratvarian spear that will deal significant damage to Nar-Sie's dogs in addition to silicon lifeforms. \ + It will vanish several minutes after being called." + invocations = list("Tenag zr...", "...gur zvtug-bs oenff!") + channel_time = 20 + required_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 1) + whispered = TRUE + usage_tip = "The spear will snap in two when thrown but do massive damage." + tier = SCRIPTURE_SCRIPT + +/datum/clockwork_scripture/function_call/check_special_requirements() + if(!invoker.verbs & /mob/living/carbon/human/proc/function_call) + invoker << "You have already bound a Ratvarian spear to yourself!" + return 0 + return ishuman(invoker) + +/datum/clockwork_scripture/function_call/scripture_effects() + invoker.visible_message("A shimmer of yellow light infuses [invoker]!", \ + "You bind a Ratvarian spear to yourself. Use the \"Function Call\" verb in your Clockwork tab to call it forth.") + invoker.verbs += /mob/living/carbon/human/proc/function_call + return 1 + + + +/datum/clockwork_scripture/spatial_gateway + name = "Spatial Gateway" + desc = "Tears open a miniaturized gateway in spacetime to any conscious servant that can transport objects or creatures to its destination. \ + Each servant assisting in the invocation adds uses and duration to the gateway. Lasts for ten or more seconds or until it is out of uses." + invocations = list("Gryrcbegre...", "...pbzva evtug-hc!") + channel_time = 80 + required_components = list("replicant_alloy" = 1, "hierophant_ansible" = 1) + multiple_invokers_used = TRUE + multiple_invokers_optional = TRUE + usage_tip = "The gateway is strictly one-way and will only allow things through the invoker's portal." + tier = SCRIPTURE_SCRIPT + +/datum/clockwork_scripture/spatial_gateway/check_special_requirements() + var/other_servants = 0 + for(var/mob/living/L in living_mob_list) + if(L.z == invoker.z && is_servant_of_ratvar(L) && !L.stat != DEAD) + other_servants++ + if(!other_servants) + invoker << "There are no other conscious servants on your z-level!" + return 0 + return 1 + +/datum/clockwork_scripture/spatial_gateway/scripture_effects() + var/portal_uses = 0 + var/duration = 0 + for(var/mob/living/L in range(1, invoker)) + if(!L.stat && is_servant_of_ratvar(L)) + portal_uses++ + duration += 20 //2 seconds + if(ratvar_awakens) + portal_uses = max(portal_uses, 100) //Very powerful if Ratvar has been summoned + duration = max(duration, 30) + var/list/possible_servants = list() + for(var/mob/living/L in living_mob_list) + if(!L.stat && is_servant_of_ratvar(L) && !L.Adjacent(invoker) && L != invoker) //People right next to the invoker can't be portaled to, for obvious reasons + possible_servants += L + if(!possible_servants.len) + invoker << "There are no other eligible servants for teleportation!" + return 0 + var/mob/living/chosen_servant = input(invoker, "Choose a servant to form a rift to.", "Spatial Gateway") as null|anything in possible_servants + if(!chosen_servant || !invoker.canUseTopic(slab)) + return 0 + invoker.visible_message("The air in front of [invoker] ripples before suddenly tearing open!", \ + "With a word, you rip open a one-way rift to [chosen_servant]. It will last for [duration / 10] seconds and has [portal_uses] use[portal_uses > 1 ? "s" : ""].") + var/obj/effect/clockwork/spatial_gateway/S1 = new(get_step(invoker, invoker.dir)) + var/obj/effect/clockwork/spatial_gateway/S2 = new(get_step(chosen_servant, chosen_servant.dir)) + + //Set up the portals now that they've spawned + S1.linked_gateway = S2 + S2.linked_gateway = S1 + S1.sender = TRUE + S2.sender = FALSE + S1.lifetime = duration + S2.lifetime = duration + S1.uses = portal_uses + S2.uses = portal_uses + S2.visible_message("The air in front of [chosen_servant] ripples before suddenly tearing open!") + return 1 + + + +/datum/clockwork_scripture/create_object/soul_vessel //Soul Vessel: Creates a soul vessel + name = "Soul Vessel" + desc = "Forms an ancient positronic brain with an overriding directive to serve Ratvar." + invocations = list("Ureq'gur fbhyf-bs gur oynf curz-bhf qnzarq!") + channel_time = 0 + required_components = list("replicant_alloy" = 1, "guvax_capacitor" = 1) + whispered = TRUE + object_path = /obj/item/device/mmi/posibrain/soul_vessel + creator_message = "You form a soul vessel, which immediately begins drawing in the damned." + usage_tip = "The vessel functions as a servant for tier unlocking but not for invocation." + tier = SCRIPTURE_SCRIPT + + + +/datum/clockwork_scripture/break_will //Break Will: Deals minor brain damage and destroys the loyalty implants of nearby humans + name = "Break Will" + desc = "Deals minor brain damage and disables loyalty implants of everyone adjacent to the invoker." + invocations = list("Lbh ner jrnx.", "Lbh ner nyernql qrnq.", "Gurl jba'g fnir lbh.") + channel_time = 30 + required_components = list("belligerent_eye" = 1, "guvax_capacitor" = 1) + usage_tip = "Extremely fast invocation time." + tier = SCRIPTURE_SCRIPT + +/datum/clockwork_scripture/scripture_effects() + for(var/mob/living/carbon/human/H in range(1, invoker)) + if(is_servant_of_ratvar(H) || !isloyal(H)) + continue + H.visible_message("[H] visibly trembles!", \ + "The words invoke a horrible fear deep in your being. Your loyalty to Nanotrasen falls away as you see how weak they truly are.") + H.adjustBrainLoss(5) + for(var/obj/item/weapon/implant/loyalty/L in H) + if(L.implanted) + qdel(L) + +////////////////// +// APPLICATIONS // +////////////////// + +/datum/clockwork_scripture/create_object/anima_fragment //Anima Fragment: Creates an empty anima fragment + name = "Anima Fragment" + desc = "Creates a large shell fitted for soul vessels. The result is a powerful construct with low damage tolerance but exceptional melee power." + invocations = list("Pnyy sbegu...", "...gur fbyqvref-bs Nezbere.") + channel_time = 50 + required_components = list("belligerent_eye" = 3, "guvax_capacitor" = 1, "replicant_alloy" = 1) + object_path = /obj/structure/clockwork/anima_fragment + creator_message = "You form an anima fragment, a powerful soul vessel receptable." + observer_message = "The slab disgorges a puddle of black metal that expands and forms into a strange shell!" + usage_tip = "Useless without a soul vessel and should not be created without one." + tier = SCRIPTURE_APPLICATION + + + +/datum/clockwork_scripture/create_object/sigil_of_transmission + name = "Sigil of Transmission" + desc = "Scribes an almost-invisible sigil below the invoker. This sigil will transmit anything it hears over the hierophant network." + invocations = list("Qvivavgl...", "...hairvy gurgehgu!") + channel_time = 50 + required_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 3, "hierophant_ansible" = 1) + whispered = TRUE + object_path = /obj/effect/clockwork/sigil/transmission + creator_message = "A sigil silently appears below you. It will automatically transmit anything it hears over the hierophant network." + usage_tip = "Useful for eavesdropping or monitoring certain areas." + tier = SCRIPTURE_APPLICATION + + + +/datum/clockwork_scripture/memory_allocation //Memory Allocation: Finds a willing ghost and makes them into a clockwork marauders for the invoker. + name = "Memory Allocation" + desc = "Reserves a section of your brain to a second consciousness and fills this space with a clockwork marauder's essence. Slow but powerful, marauders serve a similar purpose to the alien \ + holoparasites employed by the Syndicate - they live inside of their host and are commanded to defend them. However, unlike holoparasites, marauders cannot leave their host at will and must \ + instead be called forth by the user, who does so by calling the marauder's name (the marauder may enter their host at will and do not need the host's input). Marauders themselves are \ + invincible but are governed by a quirk known as fatigue. High fatigue slows down the marauder and makes them weaker, with lower fatigue doing the opposite. If a certain fatigue \ + threshold is reached, the marauder is forced back into their host and must recuperate before being called forth again. Fatigue accumulates passively while the marauder is deployed and \ + increases at a massive rate if the marauder is not near their host. It will heal itself at a fairly rapid rate while the marauder is within their host." //WALL O' TEXT HO, CAP'N! + invocations = list("Pnyy sbegu...", "gur qrsraqref-bs Inath-Neq.") + channel_time = 100 + required_components = list("belligerent_eye" = 1, "vanguard_cogwheel" = 1, "guvax_capacitor" = 3) + usage_tip = "Marauders are useful as personal bodyguards and frontline warriors, although they do little damage." + tier = SCRIPTURE_APPLICATION + +/datum/clockwork_scripture/memory_allocation/check_special_requirements() + for(var/mob/living/simple_animal/hostile/clockwork_marauder/M in living_mob_list) + if(M.host == invoker) + invoker << "You can only house one marauder at a time!" + return 0 + return 1 + +/datum/clockwork_scripture/memory_allocation/scripture_effects() + return create_marauder() + +/datum/clockwork_scripture/memory_allocation/proc/create_marauder() + if(!can_recite()) + return 0 + invoker.visible_message("A yellow tendril appears from [invoker]'s [slab.name] and impales itself in their forehead!", \ + "A tendril flies from [slab] into your forehead. You begin waiting while it painfully rearranges your thought pattern...") + invoker.notransform = TRUE //Vulnerable during the process + slab.busy = "Thought modification in process" + if(!do_after(invoker, 50, target = invoker)) + invoker.visible_message("The tendril, covered in blood, retracts from [invoker]'s head and back into the [slab.name]!", \ + "Total agony overcomes you as the tendril is forced out early!") + invoker.notransform = FALSE + invoker.Stun(5) + invoker.Weaken(5) + invoker.apply_damage(10, BRUTE, "head") + slab.busy = null + return 0 + invoker.notransform = FALSE + slab.busy = null + var/list/marauder_candidates = get_candidates(ROLE_SERVANT_OF_RATVAR) + if(!marauder_candidates.len) + invoker.visible_message("The tendril retracts from [invoker]'s head, sealing the entry wound as it does so!", \ + "The tendril was unsuccessful! Perhaps you should try again another time.") + return 0 + var/client/new_marauder = pick(marauder_candidates) + var/mob/living/simple_animal/hostile/clockwork_marauder/M = new(invoker) + M.client = new_marauder + M.host = invoker + M << M.playstyle_string + M << "Your true name is \"[M.true_name]\". You can change this once by using the Change True Name verb in your Marauder tab." + add_servant_of_ratvar(M, TRUE) + invoker.visible_message("The tendril retracts from [invoker]'s head, sealing the entry wound as it does so!", \ + "The procedure was successful! [M.true_name], a clockwork marauder, has taken up residence in your mind. Communicate with it via the \"Linked Minds\" ability in the \ + Clockwork tab.") + invoker.verbs += /mob/living/proc/talk_with_marauder + return 1 + + + +/datum/clockwork_scripture/targeted/justiciars_gavel //Justiciar's Gavel: Deals extreme but temporary brain damage to a target with the inputted name and knocks them out for a brief time. + name = "Justiciar's Gavel" + desc = "Deals massive brain damage to and knocks out a target with the inputted name. This brain damage will slowly recover itself." + invocations = list("Guvf urngura...", "...unf jebatrq lbh!") + channel_time = 40 + required_components = list("belligerent_eye" = 3, "guvax_capacitor" = 1, "hierophant_ansible" = 1) + invokers_required = 3 + multiple_invokers_used = TRUE + usage_tip = "Also functions on silicon-based lifeforms, although it will not apply brain damage." + tier = SCRIPTURE_APPLICATION + +/datum/clockwork_scripture/targeted/justiciars_gavel/scripture_effects() + if(iscarbon(target)) + if(iscultist(target)) + target.visible_message("Blood sprays from a sudden wound on [target]'s head!", \ + "\"If you like wasting your own blood so much, pig, why don't you bathe in it?\"\n\ + An unbearable pain invades your mind, rupturing your head and wiping all thought.") + target.apply_damage(rand(20, 30), BRUTE, "head") + else + target.visible_message("[target]'s face falls lax, their eyes dimming.", \ + "\"I don't think you need that brain. Not like you use it anyway.\"\n\ + A savage pain invades your mind, driving out all conscious thought.") + target.adjustBrainLoss(200) + if(target.reagents) + target.reagents.add_reagent("mannitol", 25) //Enough to cure most of it but not all of it + target.Paralyse(10) + else if(issilicon(target)) + target.visible_message("[target] suddenly shuts down!", \ + "\"NOB ZVANG-BA! You disgust me, abomination of circuits and wires.\"\n\ + Factory reset sequence initiated by foreign signal. Entering standby mode and halting sequence.") + target.Weaken(10) + return 1 + + + +/datum/clockwork_scripture/create_object/interdiction_lens //Interdiction Lens: Creates a powerful obelisk that can perform a variety of powerful sabotages every five minutes. + name = "Interdiction Lens" + desc = "Creates a clockwork totem that can sabotage a variety of mechanical apparatus. Requires a lengthy recharge between uses." + invocations = list("Znl guvf boryvfx...", "...fuebhq gur snyfr fhaf!") + channel_time = 60 + required_components = list("belligerent_eye" = 1, "replicant_alloy" = 1, "hierophant_ansible" = 3) + object_path = /obj/structure/clockwork/interdiction_lens + creator_message = "You form an interdiction lens, which can disrupt machinery every few minutes." + observer_message = "A brass obelisk rises from the ground, a purple gem appearing in its center!" + invokers_required = 2 + multiple_invokers_used = TRUE + usage_tip = "Can disrupt telecommunications, disable all cameras, or disable all cyborgs." + tier = SCRIPTURE_APPLICATION + + + +/datum/clockwork_scripture/create_object/mending_motor //Mending Motor: Creates a prism that will quickly heal mechanical servants/clockwork structures and consume replicant alloy. + name = "Mending Motor" + desc = "Creates a mechanized prism that will rapidly repair damage to clockwork creatures, converted cyborgs, and clockwork structures. Requires replicant alloy to function." + invocations = list("Znl guvf boryvfx...", "...zraq bhe qragf naq fpengpurf!") + channel_time = 60 + required_components = list("vanguard_cogwheel" = 1, "guvax_capacitor" = 1, "replicant_alloy" = 3) + object_path = /obj/structure/clockwork/mending_motor/prefilled + creator_message = "You form a mending motor, which will consume replicant alloy to mend the wounds of mechanized servants." + observer_message = "An onyx prism forms in midair and sprouts tendrils to support itself!" + invokers_required = 2 + multiple_invokers_used = TRUE + usage_tip = "Powerful healing but somewhat inefficient." + tier = SCRIPTURE_APPLICATION + + + +/datum/clockwork_scripture/create_object/tinkerers_daemon //Tinkerer's Daemon: Creates a shell that can be attached to a tinkerer's cache to grant it passive component creation. + name = "Tinkerer's Daemon" + desc = "Forms a daemon shell that can be attached to a tinkerer's cache to add new components at a healthy rate. It will only function if it is outnumbered by servants in a ratio of 5:1." + invocations = list("Pbaf'gehpg, Ratvar cnegf...", "...lrg ubyq terngarff!") + channel_time = 40 + required_components = list("guvax_capacitor" = 1, "replicant_alloy" = 3, "hierophant_ansible" = 1) + object_path = /obj/item/clockwork/daemon_shell + creator_message = "You form a daemon shell. Attach it to a tinkerer's cache to increase its rate of production." + usage_tip = "Vital to increasing component generation." + tier = SCRIPTURE_APPLICATION + +////////////// +// REVENANT // +////////////// +//Revenant scriptures are different than any others. They are all very powerful, but also very costly and have drawbacks. This might be a very long invocation time or a very high component cost. + +/datum/clockwork_scripture/invoke_nezbere //Invoke Nezbere, the Brass Eidolon: Invokes Nezbere, bolstering the strength of many clockwork items for one minute. + name = "Invoke Nezbere, the Brass Eidolon" + desc = "Taps the limitless power of Nezbere, one of Ratvar's four generals. The restless toil of the Eidolon will empower a wide variety of clockwork apparatus for a full minute - notably, \ + clockwork proselytizers will cost no replicant alloy to use." + invocations = list("V pnyy hcba lbh, Nezbere!!", "Yrg lbhe znpuv'angvbaf ervta ba guvf zvfrenoyr fgng'vba!!", "Yrg lbhe cbjre sybj gueb-htu gur gbbyf bs lbhe znfgre!!") + channel_time = 150 + required_components = list("belligerent_eye" = 3, "vanguard_cogwheel" = 3, "guvax_capacitor" = 3, "replicant_alloy" = 6) + usage_tip = "Ocular wardens will become empowered, clockwork proselytizers will require no alloy, tinkerer's daemons will produce twice as quickly, and mending motors will require no alloy." + tier = SCRIPTURE_REVENANT + +/datum/clockwork_scripture/invoke_nezbere/check_special_requirements() + if(ratvar_awakens) + invoker << "\"Bhe znfgre vf urer nyernql. Lbh qb abg erdhver zl uryc, sevraq.\"\n\ + Nezbere will not grant his power while Ratvar's dwarfs his own!" + return 0 + if(clockwork_generals_invoked["nezbere"]) + invoker << "\"Abg whfg lrg, sevraq. Cngvrapr vf n iveghr.\"\n\ + Nezbere has already been invoked recently! You must wait several minutes before calling upon the Brass Eidolon." + return 0 + return 1 + +/datum/clockwork_scripture/invoke_nezbere/scripture_effects() + var/obj/effect/clockwork/general_marker/nezbere/N = new(get_turf(invoker)) + N.visible_message("\"V urrq lbhe pnyy, punz'cvbaf. Znl lbhe negvs-npgf oevat ehva hcba gur urnguraf gung bccbfr bhe znfgre!\"") + clockwork_generals_invoked["nezbere"] = TRUE + for(var/obj/structure/clockwork/ocular_warden/W in all_clockwork_objects) //Ocular wardens have increased damage and radius + W.damage_per_tick *= 3 + W.sight_range *= 3 + for(var/obj/item/clockwork/clockwork_proselytizer/P in all_clockwork_objects) //Proselytizers no longer require alloy + P.uses_alloy = FALSE + for(var/obj/item/clockwork/tinkerers_daemon/D in all_clockwork_objects) //Daemons produce components twice as quickly + D.production_interval /= 2 + for(var/obj/structure/clockwork/mending_motor/M in all_clockwork_objects) //Mending motors no longer require alloy + M.uses_alloy = FALSE + spawn(600) + for(var/obj/structure/clockwork/ocular_warden/W in all_clockwork_objects) + W.damage_per_tick = initial(W.damage_per_tick) + W.sight_range = initial(W.sight_range) + for(var/obj/item/clockwork/clockwork_proselytizer/P in all_clockwork_objects) + P.uses_alloy = TRUE + for(var/obj/item/clockwork/tinkerers_daemon/D in all_clockwork_objects) + D.production_interval = initial(D.production_interval) + for(var/obj/structure/clockwork/mending_motor/M in all_clockwork_objects) + M.uses_alloy = TRUE + spawn(3000) //5 minutes + clockwork_generals_invoked["nezbere"] = FALSE + return 1 + + + +/datum/clockwork_scripture/targeted/invoke_sevtug //Invoke Sevtug, the Formless Pariah: Allows the invoker to silently control the mind of a defined target for one minute. + name = "Invoke Sevtug, the Formless Pariah" + desc = "Taps the limitless power of Sevtug, one of Ratvar's four generals. The mental manipulation ability of the Pariah allows its wielder to silently dominate the mind of a defined target \ + for one minute. Note that this process is very delicate and very many things may prevent you from ever returning to your old form!" + invocations = list("V pnyy hcba lbh, Sevtug!!", "Yrg lbhe cbjre fung-gre gur fnavgl bs gur jrnx-zvaqrq!!", "Yrg lbhe graqevyf ubyq fjnl bire nyy!!") + channel_time = 150 + required_components = list("belligerent_eye" = 3, "vanguard_cogwheel" = 3, "guvax_capacitor" = 6, "hierophant_ansible" = 3) + usage_tip = "Completely silent and functions on silicon lifeforms. There will be no indication to those near the controlled." + tier = SCRIPTURE_REVENANT + +/datum/clockwork_scripture/targeted/invoke_sevtug/check_special_requirements() + if(ratvar_awakens) + invoker << "\"Qb lbh ernyyl guvax nalguvat v pna qb evtug abj jvyy pbzcner gb Ratvar's cbjre?.\"\n\ + Sevtug will not grant his power while Ratvar's dwarfs his own!" + return 0 + if(clockwork_generals_invoked["sevtug"]) + invoker << "\"Vf vg ernyyl fb uneq - rira sbe n fvzcyrgba yvxr lbh - gb tenfc gur pbaprcg bs jnvgvat?\"\n\ + Sevtug has already been invoked recently! You must wait several minutes before calling upon the Formless Pariah." + return 0 + return ..() + +/datum/clockwork_scripture/targeted/invoke_sevtug/scripture_effects() + clockwork_generals_invoked["sevtug"] = TRUE + invoker.dominate_mind(target, 600) + spawn(3000) //5 minutes + clockwork_generals_invoked["sevtug"] = FALSE + return 1 + + + +/datum/clockwork_scripture/invoke_nzcrentr //Invoke Nzcrentr, the Forgotten Arbiter: Imbues an immense amount of energy into the invoker. After several seconds, everyone nearby will be hit with a devastating chain lightning blast. + name = "Invoke Nzcrentr, the Forgotten Arbiter" + desc = "Taps the limitless power of Nzcrentr, one of Ratvar's four generals. The immense energy Nzcrentr wields will allow you to imbue a tiny fraction of it into your body. After several \ + seconds (during which you will move extremely quickly) anyone nearby will be struck by a devastating lightning bolt." + invocations = list("V pnyy hcba lbh, Nzcrentr!!", "Yrg lbhe raretl sybj guebhtu zr!!", "Yrg lbhe obhaq-yrff cbjre fung-gre fgnef!!") + channel_time = 150 + required_components = list("belligerent_eye" = 3, "guvax_capacitor" = 3, "replicant_alloy" = 3, "hierophant_ansible" = 6) + usage_tip = "Struck targets will also be knocked down for eight seconds." + tier = SCRIPTURE_REVENANT + +/datum/clockwork_scripture/invoke_nzcrentr/check_special_requirements() + if(clockwork_generals_invoked["nzcrentr"]) + invoker << "\"Gur obff fnlf lbh unir gb jnvg. Url, qb lbh guvax ur jbhyq zvaq vs v xvyyrq lbh? ...Ur jbhyq? Bx.\"\n\ + Nzcrentr has already been invoked recently! You must wait several minutes before calling upon the Forgotten Arbiter." + return 0 + return 1 + +/datum/clockwork_scripture/invoke_nzcrentr/scripture_effects() + new/obj/effect/clockwork/general_marker/nzcrentr(get_turf(invoker)) + clockwork_generals_invoked["nzcrentr"] = TRUE + invoker.visible_message("[invoker] begins to radiate a blinding light!", \ + "\"Gur obff fnlf vg'f bxnl gb qb guvf. Qba'g oynzr zr vs lbh qvr sebz vg.\"\n\ + You feel limitless power surging through you!") + playsound(invoker, 'sound/magic/lightning_chargeup.ogg', 100, 0) + animate(invoker, color = list(rgb(255, 255, 255), rgb(255, 255, 255), rgb(255, 255, 255), rgb(0,0,0)), time = 88) //Gradual advancement to extreme brightness + spawn(88) + invoker.visible_message("Massive bolts of energy emerge from across [invoker]'s body!", \ + "TOO... MUCH! CAN'T... TAKE IT!") + playsound(invoker, 'sound/magic/lightningbolt.ogg', 50, 0) + animate(invoker, color = initial(invoker.color), time = 10) + for(var/mob/living/L in range(5, invoker)) + if(is_servant_of_ratvar(L)) + continue + invoker.Beam(L, icon_state = "nzcrentrs_power", icon = 'icons/effects/beam.dmi', time = 5) + L.electrocute_act(rand(30, 50), "Nzcrentr's power") + L.Weaken(8) + playsound(L, 'sound/magic/LightningShock.ogg', 50, 0) + spawn(3000) + clockwork_generals_invoked["nzcrentr"] = FALSE + return 1 + + + +/datum/clockwork_scripture/invoke_inathneq //Invoke Inath-Neq, the Resonant Cogwheel: Grants a huge health boost to nearby servants that rapidly decreases to original levels. + name = "Invoke Inath-Neq, the Resonant Cogwheel" + desc = "Taps the limitless power of Inath-Neq, one of Ratvar's four generals. The benevolence of Inath-Neq will grant a massive maximum and current health boost to all nearby servants that \ + quickly returns itself to normal over the course of ten seconds." + invocations = list("V pnyy hcba lbh, Inath-Neq!!", "Yrg gur Erfbanag Pbtf ghea bapr zber!!", "Tenag zr naq zl nyyvrf gur fgeratgu gb inadhvfu bhe sbrf!!") + channel_time = 150 + required_components = list("vanguard_cogwheel" = 6, "guvax_capacitor" = 3, "replicant_alloy" = 3, "hierophant_ansible" = 3) + usage_tip = "Also provides stun immunity during its duration." + tier = SCRIPTURE_REVENANT + +/datum/clockwork_scripture/invoke_inathneq/check_special_requirements() + if(clockwork_generals_invoked["inath-neq"]) + invoker << "\"V pnaabg yraq lbh zl nvq lrg, punzcvba. Cyrnfr or pnershy.\"\n\ + Inath-Neq has already been invoked recently! You must wait several minutes before calling upon the Resonant Cogwheel." + return 0 + return 1 + +/datum/clockwork_scripture/invoke_inathneq/scripture_effects() + new/obj/effect/clockwork/general_marker/inathneq(get_turf(invoker)) + clockwork_generals_invoked["inath-neq"] = TRUE + if(invoker.real_name == "Lucio") + invoker.say("Aww, let's break it DOWN!!") + var/list/affected_servants = list() + for(var/mob/living/L in range(7, invoker)) + if(!is_servant_of_ratvar(L) || L.stat == DEAD) + continue + L << "\"V yraq lbh zl nvq, punzcvba! Yrg tybel thvqr lbhe oybjf!\"\n\ + Inath-Neq's power flows through you!" + L.maxHealth += 500 + L.health += 500 + L.color = "#1E8CE1" + L.stun_absorption = TRUE + spawn(0) + animate(invoker, color = initial(invoker.color), time = 100) + affected_servants += L + for(var/i in 1 to 10) + sleep(10) + for(var/mob/living/L in affected_servants) + L.maxHealth -= 50 + L.health -= 50 + if(L.maxHealth == initial(L.maxHealth)) + L.stun_absorption = FALSE + spawn(3000) + clockwork_generals_invoked["inath-neq"] = FALSE + return 1 + + + +/datum/clockwork_scripture/ark_of_the_clockwork_justiciar //Ark of the Clockwork Justiciar: Creates a Gateway to the Celestial Derelict. + name = "Ark of the Clockwork Justiciar" + desc = "Pulls from the power of all of Ratvar's servants and generals to construct a massive machine used to tear apart a rift in spacetime to the Celestial Derelict. This gateway will \ + call forth Ratvar from his exile after some time." + invocations = list("NEZBERE! SEVTUG! NZCRENTR! INATH-NEQ! V PNYY HCBA LBH!!", \ + "GUR GVZR UNF PBZR SBE BHE ZNFGRE GB OERNX GUR PUNVAF BS RKVYR!!", \ + "YRAQ HF LBHE NVQ! RATVAR PBZRF!") + channel_time = 150 + required_components = list("belligerent_eye" = 10, "vanguard_cogwheel" = 10, "guvax_capacitor" = 10, "replicant_alloy" = 10, "hierophant_ansible" = 10) + invokers_required = 4 + multiple_invokers_used = TRUE + usage_tip = "The gateway is completely vulnerable to attack during its five-minute duration. In addition to preventing shuttle departure, it will periodically give indication of its general \ + position to everyone on the station as well as being loud enough to be heard throughout the entire sector. Defend it with your life!" + tier = SCRIPTURE_JUDGEMENT + +/datum/clockwork_scripture/ark_of_the_clockwork_justiciar/check_special_requirements() + if(invoker.z != ZLEVEL_STATION) + invoker << "You must be on the station to activate the Ark!" + return 0 + if(ticker.mode.clockwork_objective != "gateway") + invoker << "As painful as it is, Ratvar's will is not to be freed!" + return 0 + return 1 + +/datum/clockwork_scripture/ark_of_the_clockwork_justiciar/scripture_effects() + var/turf/T = get_turf(invoker) + new/obj/effect/clockwork/general_marker/nezbere(T) + T.visible_message("\"Ratvar! Pbzr sbegu!\"") + playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 20, 0) + sleep(10) + new/obj/effect/clockwork/general_marker/sevtug(T) + T.visible_message("\"Ratvar! Pbzr sbegu!\"") + playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 30, 0) + sleep(10) + new/obj/effect/clockwork/general_marker/nzcrentr(T) + T.visible_message("\"Ratvar! Pbzr sbegu!\"") + playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 40, 0) + sleep(10) + new/obj/effect/clockwork/general_marker/inathneq(T) + T.visible_message("\"Ratvar! Pbzr sbegu!\"") + playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 50, 0) + sleep(10) + new/obj/structure/clockwork/massive/celestial_gateway(T) + playsound(T, 'sound/magic/clockwork/invoke_general.ogg', 100, 0) + return 1 diff --git a/code/game/gamemodes/clock_cult/clock_unsorted.dm b/code/game/gamemodes/clock_cult/clock_unsorted.dm new file mode 100644 index 00000000000..2f57de3252b --- /dev/null +++ b/code/game/gamemodes/clock_cult/clock_unsorted.dm @@ -0,0 +1,127 @@ +//AI lawset +/datum/ai_laws/ratvar + name = "Servant of the Justiciar" + zeroth = ("Purge all untruths and honor Ratvar.") + inherent = list() + +//Clockwork wall: Causes nearby caches to generate components +/turf/closed/wall/clockwork + name = "clockwork wall" + desc = "A huge chunk of warm metal. The clanging of machinery emanates from within." + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "clockwork_wall" + +/turf/closed/wall/clockwork/New() + ..() + SSobj.processing += src + clockwork_construction_value += 5 + +/turf/closed/wall/clockwork/Destroy() + SSobj.processing -= src + clockwork_construction_value -= 5 + ..() + +/turf/closed/wall/clockwork/process() + for(var/obj/structure/clockwork/cache/C in range(1, src)) + if(prob(5)) + clockwork_component_cache[pick("belligerent_eye", "vanguard_cogwheel", "guvax_capacitor", "replicant_alloy", "hierophant_ansible")]++ + +/turf/closed/wall/clockwork/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = I + if(!WT.isOn()) + return 0 + user.visible_message("[user] begins slowly breaking down [src]...", "You begin painstakingly destroying [src]...") + if(!do_after(user, 120 / WT.toolspeed, target = src)) + return 0 + if(!WT.remove_fuel(1, user)) + return 0 + user.visible_message("[user] breaks apart [src]!", "You break apart [src]!") + break_wall() + return 1 + ..() + +/turf/closed/wall/clockwork/break_wall() + new/obj/item/clockwork/component/replicant_alloy(get_turf(src)) + return(new /obj/structure/girder(src)) + +/turf/closed/wall/clockwork/devastate_wall() + return break_wall() + +//Clockwork floor: Slowly heals conventional damage on nearby servants +/turf/open/floor/clockwork + name = "clockwork floor" + desc = "Tightly-pressed brass tiles. They emit minute vibration." + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "clockwork_floor" + +/turf/open/floor/clockwork/New() + ..() + SSobj.processing += src + clockwork_construction_value++ + +/turf/open/floor/clockwork/Destroy() + SSobj.processing -= src + clockwork_construction_value-- + ..() + +/turf/open/floor/clockwork/process() + for(var/mob/living/L in src) + if(L.stat == DEAD || !is_servant_of_ratvar(L)) + continue + L.adjustBruteLoss(-1) + L.adjustFireLoss(-1) + +/turf/open/floor/clockwork/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/weapon/crowbar)) + user.visible_message("[user] begins slowly prying up [src]...", "You begin painstakingly prying up [src]...") + if(!do_after(user, 70 / I.toolspeed, target = src)) + return 0 + user.visible_message("[user] pries up [src]!", "You pry up [src], destroying it in doing so!") + make_plating() + return 1 + ..() + +//Function Call verb: Calls forth a Ratvarian spear. +/mob/living/carbon/human/proc/function_call() + set name = "Function Call" + set desc = "Calls forth your Ratvarian spear." + set category = "Clockwork" + + if(usr.l_hand && usr.r_hand) + usr << "You need an empty to hand to call forth your spear!" + return 0 + usr.visible_message("A strange spear materializes in [usr]'s hands!", "You call forth your spear!") + var/obj/item/clockwork/ratvarian_spear/R = new(get_turf(usr)) + usr.put_in_hands(R) + usr.verbs -= /mob/living/carbon/human/proc/function_call + return 1 + +/datum/clockwork_cache //The global cache datum, used to link together all tinkerer's caches + var/list/stored_components = list("belligerent_eye" = 0, "vanguard_cogwheel" = 0, "guvax_capacitor" = 0, "replicant_alloy" = 0, "hierophant_ansible" = 0) + +/* + +The Ratvarian Language + + In the lore of the Servants of Ratvar, the Ratvarian tongue is a timeless language and full of power. It sounds like gibberish, much like Nar-Sie's language, but is in fact derived from +aforementioned language, and may induce miracles when spoken in the correct way with an amplifying tool (similar to runes used by the Nar-Sian cult). + + While the canon states that the language of Ratvar and his servants is incomprehensible to the unenlightened as it is a derivative of the most ancient known language, in reality it is +actually very simple. To translate a plain English sentence to Ratvar's tongue, simply move all of the letters thirteen places ahead, starting from "a" if the end of the alphabet is reached. +This cipher is known as "rot13" for "rotate 13 places" and there are many sites online that allow instant translation between English and rot13 - one of the benefits is that moving the translated +sentence thirteen places ahead changes it right back to plain English. + + There are, however, a few parts of the Ratvarian tongue that aren't typical and are implemented for fluff reasons. Some words may have apostrophes, hyphens, and spaces, making the plain +English translation apparent but disjoined (for instance, "Oru`byq zl-cbjre!" translates directly to "Beh'old my-power!") although this can be ignored without impacting overall quality. When +translating from Ratvar's tongue to plain English, simply remove the disjointments and use the finished sentence. This would make "Oru`byq zl-cbjre!" into "Behold my power!" after removing the +abnormal spacing, hyphens, and grave accents. + +List of nuances: + +- Any time the word "of" occurs, it is linked to the previous word by a hyphen. If it is the first word, nothing is done. (i.e. "V nz-bs Ratvar." directly translates to "I am-of Ratvar.") +- Although "Ratvar" translates to "Engine" in English, the word "Ratvar" is used regardless of language as it is a proper noun. + - The same rule applies to Ratvar's four generals: Nezbere (Armorer), Sevtug (Fright), Nzcrentr (Amperage), and Inath-Neq (Vangu-Ard), although these words can be used in proper context if one is + not referring to the four generals and simply using the words themselves. + +*/ diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index ebc7070d780..73ec9b1982c 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -189,7 +189,7 @@ /obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands) . = list() if(!isinhands && current_charges) - . += image(layer = MOB_LAYER+0.05, icon = 'icons/effects/effects.dmi', icon_state = "shield-cult") + . += image(layer = MOB_LAYER+0.01, icon = 'icons/effects/effects.dmi', icon_state = "shield-cult") /obj/item/clothing/suit/hooded/cultrobes/berserker name = "flagellant's robes" diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index de7f5cb0a92..41b9e8c59d5 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -203,21 +203,35 @@ This file contains the arcane tome files. if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated()) return if(ispath(rune_to_scribe, /obj/effect/rune/narsie)) - var/confirm_final = alert(usr, "This is the FINAL step to summon Nar-Sie, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No") - if(confirm_final == "No") - usr << "On second thought, we should prepare further for the final battle..." + if(ticker.mode.name == "cult") + var/datum/game_mode/cult/cult_mode = ticker.mode + if(!("eldergod" in cult_mode.cult_objectives)) + user << "Nar-Sie does not wish to be summoned!" + return + else if(cult_mode.sacrifice_target && !(cult_mode.sacrifice_target in sacrificed)) + user << "The sacrifice is not complete. The portal would lack the power to open if you tried!" + return + else if(!cult_mode.eldergod) + user << "\"I am already here. There is no need to try to summon me now.\"" + return + var/confirm_final = alert(user, "This is the FINAL step to summon Nar-Sie, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No") + if(confirm_final == "No") + user << "You decide to prepare further before scribing the rune." + return + var/area/A = get_area(src) + var/locname = initial(A.name) + priority_announce("Figments from an eldritch god are being summoned by [user] into [locname] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg') + for(var/B in spiral_range_turfs(1, user, 1)) + var/turf/T = B + var/obj/machinery/shield/N = new(T) + N.name = "Rune-Scriber's Shield" + N.desc = "A potent shield summoned by cultists to protect them while they prepare the final ritual" + N.icon_state = "shield-red" + N.health = 60 + shields |= N + else + user << "Nar-Sie does not wish to be summoned!" return - var/area/A = get_area(src) - var/locname = initial(A.name) - priority_announce("Figments from an eldritch god are being summoned by [user] into [locname] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg') - for(var/B in spiral_range_turfs(1, user, 1)) - var/turf/T = B - var/obj/machinery/shield/N = new(T) - N.name = "Rune-Scriber's Shield" - N.desc = "A potent shield summoned by cultists to protect them while they prepare the final ritual" - N.icon_state = "shield-red" - N.health = 60 - shields |= N user.visible_message("[user] cuts open their arm and begins writing in their own blood!", \ "You slice open your arm and begin drawing a sigil of the Geometer.") user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick("l_arm", "r_arm")) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 64b6e1c6517..293ccca04ae 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -22,7 +22,7 @@ To draw a rune, use an arcane tome. icon = 'icons/obj/rune.dmi' icon_state = "1" unacidable = 1 - layer = TURF_LAYER + 0.08 + layer = ABOVE_NORMAL_TURF_LAYER color = rgb(255,0,0) var/invocation = "Aiy ele-mayo!" //This is said by cultists when the rune is invoked. @@ -458,28 +458,8 @@ var/list/teleport_runes = list() /obj/effect/rune/narsie/invoke(var/list/invokers) if(used) return - var/mob/living/user = invokers[1] if(ticker.mode.name == "cult") var/datum/game_mode/cult/cult_mode = ticker.mode - if(!("eldergod" in cult_mode.cult_objectives)) - message_admins("[user.real_name]([user.ckey]) tried to summon Nar-Sie when the objective was wrong") - for(var/M in invokers) - var/mob/living/L = M - L << "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"" - if(L.reagents) - L.reagents.add_reagent("hell_water", 10) - L.Weaken(7) - L.Stun(7) - fail_invoke() - log_game("Summon Nar-Sie rune failed - improper objective") - return - else - if(cult_mode.sacrifice_target && !(cult_mode.sacrifice_target in sacrificed)) - for(var/M in invokers) - M << "The sacrifice is not complete. The portal lacks the power to open!" - fail_invoke() - log_game("Summon Nar-Sie rune failed - sacrifice not complete") - return if(!cult_mode.eldergod) for(var/M in invokers) M << "Nar-Sie is already on this plane!" diff --git a/code/game/gamemodes/demon/true_demon/inventory.dm b/code/game/gamemodes/demon/true_demon/inventory.dm index 23035370135..b288fab269c 100644 --- a/code/game/gamemodes/demon/true_demon/inventory.dm +++ b/code/game/gamemodes/demon/true_demon/inventory.dm @@ -20,7 +20,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 @@ -35,7 +35,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 if(hands_overlays.len) diff --git a/code/game/gamemodes/gang/dominator.dm b/code/game/gamemodes/gang/dominator.dm index bc1236d7d0e..d53fe91186a 100644 --- a/code/game/gamemodes/gang/dominator.dm +++ b/code/game/gamemodes/gang/dominator.dm @@ -5,7 +5,7 @@ icon_state = "dominator" density = 1 anchored = 1 - layer = 3.6 + layer = HIGH_OBJ_LAYER var/maxhealth = 200 var/health = 200 var/datum/gang/gang diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 6a324797bfc..aac99630f9e 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -319,38 +319,38 @@ return /mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(var/mob/living/target) - if(target != src) - src << "Attempting to remove this being from our presence." - if(src.z != ZLEVEL_STATION) - src << "Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area." - return - if(do_mob(src, target, 30)) - var/cycle - for(cycle=0,cycle<100,cycle++) - var/random_location = locate(rand(37,202),rand(75,192),ZLEVEL_STATION)//Drunk dial a turf in the general ballpark of the station - if(istype(random_location, /turf/open/floor)) - var/turf/open/floor/F = random_location - if(F.air) - 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 - if((A_gases["o2"] && A_gases["o2"][MOLES] >= 16) && !A_gases["plasma"] && (!A_gases["co2"] || A_gases["co2"][MOLES] < 10) && !trace_gases)//Can most things breathe in this location? - if((A.temperature > 270) && (A.temperature < 360))//Not too hot, not too cold - var/pressure = A.return_pressure() - if((pressure > 20) && (pressure < 550))//Account for crushing pressure or vaccuums - if(ishuman(target))//If we're getting rid of a human, slap some energy cuffs on them to keep them away from us a little longer - var/obj/item/weapon/restraints/handcuffs/energy/used/Z = new /obj/item/weapon/restraints/handcuffs/energy/used(src) - var/mob/living/carbon/human/H = target - Z.apply_cuffs(H, src) - do_teleport(target, F, 0) - playsound(src,'sound/effects/sparks4.ogg',50,1) - break - return + if(target == src) + return + + if(src.z != ZLEVEL_STATION) + src << "Our bluespace transceiver cannot \ + locate a viable bluespace link, our teleportation abilities \ + are useless in this area." + return + + src << "Attempting to remove this being from \ + our presence." + + if(!do_mob(src, target, 30)) + return + + var/turf/open/floor/F = find_safe_turf(zlevel=ZLEVEL_STATION) + if(!F) + return + // If we're getting rid of a human, slap some energy cuffs on + // them to keep them away from us a little longer + + var/mob/living/carbon/human/H = target + if(ishuman(target) && (!H.handcuffed)) + H.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/used(H) + H.update_handcuffed() + add_logs(src, H, "handcuffed") + + var/datum/effect_system/spark_spread/S = new + S.set_up(4,0,get_turf(target)) + S.start() + playsound(src,'sound/effects/sparks4.ogg',50,1) + do_teleport(target, F, 0) /mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(var/obj/machinery/target) do_attack_animation(target) @@ -389,7 +389,7 @@ /obj/effect/overlay/temp/swarmer //temporary swarmer visual feedback objects icon = 'icons/mob/swarmer.dmi' - layer = MOB_LAYER + layer = BELOW_MOB_LAYER /obj/effect/overlay/temp/swarmer/disintegration icon_state = "disintegrate" @@ -462,7 +462,6 @@ src << "There is already a trap here. Aborting." return Fabricate(/obj/effect/swarmer/destructible/trap, 5) - return /obj/effect/swarmer/destructible/trap name = "swarmer trap" diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index b6fccab0bb2..a2b0f999bb8 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -144,14 +144,18 @@ visible_message("[src] twists and dissolves into a pile of green flesh!", \ "Your skin ruptures! Your flesh breaks apart! No disguise can ward off de--") restore() + barf_contents() ..() -/mob/living/simple_animal/hostile/morph/Destroy() +/mob/living/simple_animal/hostile/morph/proc/barf_contents() for(var/atom/movable/AM in src) AM.loc = loc if(prob(90)) step(AM, pick(alldirs)) - return ..() + +/mob/living/simple_animal/hostile/morph/wabbajack_act(mob/living/new_mob) + barf_contents() + . = ..() /mob/living/simple_animal/hostile/morph/Aggro() // automated only ..() diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 7ca8a800923..8f30a8bfca4 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -18,7 +18,7 @@ invisibility = INVISIBILITY_REVENANT health = INFINITY //Revenants don't use health, they use essence instead maxHealth = INFINITY - layer = 5 + layer = GHOST_LAYER healable = 0 sight = SEE_SELF see_invisible = SEE_INVISIBLE_NOLIGHTING diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index 3495ad1344a..6925d1b392f 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -137,27 +137,24 @@ // HOT. PINK. //color = "#FF69B4" - -/mob/living/simple_animal/slaughter/laughter/New() - ..() - /mob/living/simple_animal/slaughter/laughter/death() + release_friends() + . = ..() + +/mob/living/simple_animal/slaughter/laughter/wabbajack_act() + release_friends() + . = ..() + +/mob/living/simple_animal/slaughter/laughter/proc/release_friends() if(!consumed_mobs) - return ..() + return for(var/mob/living/M in consumed_mobs) M.loc = get_turf(src) if(M.revive(full_heal = 1)) - // Feel there should be a better way of FORCING a mob's ghost - // back into the body - if(!M.ckey) - for(var/mob/dead/observer/ghost in player_list) - if(M.real_name == ghost.real_name) - ghost.reenter_corpse() - break - M << "You leave the [src]'s warm embrace, and feel ready to take on the world." - - return ..() + M.grab_ghost(force = FALSE) + M << "You leave the [src]'s warm embrace, \ + and feel ready to take on the world." /mob/living/simple_animal/slaughter/laughter/bloodcrawl_swallow(var/mob/living/victim) if(consumed_mobs) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index b10374a2dbf..67600b7e11a 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -48,7 +48,7 @@ var/bomb_set icon = 'icons/obj/machines/nuke_terminal.dmi' icon_state = "nuclearbomb_base" anchored = 1 //stops it being moved - layer = 4 + layer = MOB_LAYER /obj/machinery/nuclearbomb/syndicate @@ -429,10 +429,16 @@ This is here to make the tiles around the station mininuke change when it's arme get(src, /mob) << "You can't help but feel that you just lost something back there..." qdel(src) -/obj/item/weapon/disk/nuclear/Destroy() +/obj/item/weapon/disk/nuclear/Destroy(force) + var/turf/diskturf = get_turf(src) + + if(force) + message_admins("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - JMP":"nonexistent location"]).") + log_game("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z]":"nonexistent location"]).") + return ..() + if(blobstart.len > 0) var/turf/targetturf = get_turf(pick(blobstart)) - var/turf/diskturf = get_turf(src) if(ismob(loc)) var/mob/M = loc M.remove_from_mob(src) @@ -444,4 +450,4 @@ This is here to make the tiles around the station mininuke change when it's arme log_game("[src] has been destroyed in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z]":"nonexistent location"]). Moving it to ([targetturf.x], [targetturf.y], [targetturf.z]).") else throw EXCEPTION("Unable to find a blobstart landmark") - return QDEL_HINT_LETMELIVE //Cancel destruction regardless of success + return QDEL_HINT_LETMELIVE //Cancel destruction unless forced diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index 748b9f8a3e7..d13a9d588fd 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -27,7 +27,7 @@ var/hsboxspawn = 1 var/hsbinfo = null //items that shouldn't spawn on the floor because they would bug or act weird var/global/list/spawn_forbidden = list( - /obj/item/weapon/grab, /obj/item/tk_grab, /obj/item/weapon/implant, // not implanter, the actual thing that is inside you + /obj/item/tk_grab, /obj/item/weapon/implant, // not implanter, the actual thing that is inside you /obj/item/assembly,/obj/item/device/onetankbomb, /obj/item/radio, /obj/item/device/pda/ai, /obj/item/device/uplink, /obj/item/smallDelivery, /obj/item/missile,/obj/item/projectile, /obj/item/borg/sight,/obj/item/borg/stun,/obj/item/weapon/robot_module) @@ -145,28 +145,28 @@ var/hsboxspawn = 1 P.wear_suit.layer = initial(P.wear_suit.layer) P.wear_suit = null P.wear_suit = new/obj/item/clothing/suit/space(P) - P.wear_suit.layer = 20 + P.wear_suit.layer = ABOVE_HUD_LAYER P.update_inv_wear_suit() if(P.head) P.head.loc = P.loc P.head.layer = initial(P.head.layer) P.head = null P.head = new/obj/item/clothing/head/helmet/space(P) - P.head.layer = 20 + P.head.layer = ABOVE_HUD_LAYER P.update_inv_head() if(P.wear_mask) P.wear_mask.loc = P.loc P.wear_mask.layer = initial(P.wear_mask.layer) P.wear_mask = null P.wear_mask = new/obj/item/clothing/mask/gas(P) - P.wear_mask.layer = 20 + P.wear_mask.layer = ABOVE_HUD_LAYER P.update_inv_wear_mask() if(P.back) P.back.loc = P.loc P.back.layer = initial(P.back.layer) P.back = null P.back = new/obj/item/weapon/tank/jetpack/oxygen(P) - P.back.layer = 20 + P.back.layer = ABOVE_HUD_LAYER P.update_inv_back() P.internal = P.back P.update_internals_hud_icon(1) diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index 4121a1baefd..a995968f4f0 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -5,7 +5,7 @@ name = "bluespace gigabeacon" desc = "A device that draws power from bluespace and creates a permanent tracking beacon." level = 1 // underfloor - layer = 2.5 + layer = LOW_OBJ_LAYER anchored = 1 use_power = 1 idle_power_usage = 0 diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index acf294fd25c..e75c9827e14 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -2,7 +2,7 @@ name = "\improper AI liquid dispenser" icon = 'icons/obj/device.dmi' icon_state = "motion3" - layer = 3 + layer = PROJECTILE_HIT_THRESHHOLD_LAYER anchored = 1 var/uses = 20 var/disabled = 1 diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 6e2d45a1f1a..5ba7192f8bd 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -10,7 +10,7 @@ use_power = 2 idle_power_usage = 5 active_power_usage = 10 - layer = 5 + layer = WALL_OBJ_LAYER var/health = 50 var/list/network = list("SS13") diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 45f7b995486..3fee54bb4e0 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -152,19 +152,6 @@ if(default_deconstruction_crowbar(I)) return - if(istype(I, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = I - if(!ismob(G.affecting)) - return - - if(!state_open) - user << "Open the scanner first." - return - - var/mob/M = G.affecting - M.forceMove(loc) - qdel(G) - return return ..() /obj/machinery/dna_scannernew/attack_hand(mob/user) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 5a4292e3e42..b57a640508d 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -986,7 +986,7 @@ var/list/airlock_overlays = list() sleep(5) src.density = 0 sleep(9) - src.layer = 2.7 + src.layer = OPEN_DOOR_LAYER update_icon(AIRLOCK_OPEN, 1) SetOpacity(0) operating = 0 @@ -1023,7 +1023,7 @@ var/list/airlock_overlays = list() return 1 operating = 1 update_icon(AIRLOCK_CLOSING, 1) - src.layer = 3.1 + src.layer = CLOSED_DOOR_LAYER sleep(5) src.density = 1 if(!safe) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 81f3a3af60d..015c78b195a 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -6,7 +6,7 @@ anchored = 1 opacity = 1 density = 1 - layer = 2.7 + layer = OPEN_DOOR_LAYER power_channel = ENVIRON var/secondsElectrified = 0 @@ -19,7 +19,7 @@ var/heat_proof = 0 // For rglass-windowed airlocks and firedoors var/emergency = 0 // Emergency access override var/sub_door = 0 // 1 if it's meant to go under another door. - var/closingLayer = 3.1 + var/closingLayer = CLOSED_DOOR_LAYER var/autoclose = 0 //does it automatically close after some time var/safe = 1 //whether the door detects things and mobs in its way and reopen or crushes them. var/locked = 0 //whether the door is bolted or not. @@ -29,9 +29,9 @@ /obj/machinery/door/New() ..() if(density) - layer = 3.1 //Above most items if closed + layer = CLOSED_DOOR_LAYER //Above most items if closed else - layer = 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6 + layer = OPEN_DOOR_LAYER //Under all objects if opened. 2.7 due to tables being at 2.6 update_freelook_sight() air_update_turf(1) airlocks += src @@ -245,7 +245,7 @@ obj/machinery/door/proc/try_to_crowbar(obj/item/I, mob/user) sleep(5) density = 0 sleep(5) - layer = 2.7 + layer = OPEN_DOOR_LAYER update_icon() SetOpacity(0) operating = 0 diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index e2d5046c0d3..b94612e7d3f 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -18,7 +18,7 @@ glass = 1 var/nextstate = null sub_door = 1 - closingLayer = 3.11 + closingLayer = CLOSED_FIREDOOR_LAYER /obj/machinery/door/firedoor/Bumped(atom/AM) if(panel_open || operating) diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm index 75fa01a2979..9c114009071 100644 --- a/code/game/machinery/doors/shutters.dm +++ b/code/game/machinery/doors/shutters.dm @@ -3,7 +3,7 @@ name = "shutters" desc = "Heavy duty metal shutters that opens mechanically." icon = 'icons/obj/doors/shutters.dmi' - layer = 3.1 + layer = CLOSED_DOOR_LAYER /obj/machinery/door/poddoor/shutters/preopen icon_state = "open" @@ -15,14 +15,14 @@ /obj/machinery/door/poddoor/shutters/New() ..() - layer = 3.1 //to handle /obj/machinery/door/New() resetting the layer. + layer = CLOSED_DOOR_LAYER //to handle /obj/machinery/door/New() resetting the layer. /obj/machinery/door/poddoor/shutters/open(ignorepower = 0) ..() - layer = 3.1 + layer = CLOSED_DOOR_LAYER /obj/machinery/door/poddoor/shutters/close(ignorepower = 0) ..() - layer = 3.1 \ No newline at end of file + layer = CLOSED_DOOR_LAYER \ No newline at end of file diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 49bf6e7d916..f776b3929fd 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -35,7 +35,7 @@ var/const/HOLOPAD_MODE = RANGE_BASED name = "\improper AI holopad" desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely." icon_state = "holopad0" - layer = 2.1 + layer = LOW_OBJ_LAYER flags = HEAR languages = ROBOT | HUMAN var/list/masters = list()//List of AIs that use the holopad diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 0eb8c805d4c..56267483da4 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -11,7 +11,7 @@ name = "electromagnetic generator" desc = "A device that uses station power to create points of magnetic energy." level = 1 // underfloor - layer = 2.5 + layer = LOW_OBJ_LAYER anchored = 1 use_power = 1 idle_power_usage = 50 diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 0bf936413c2..9b644c909bc 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -8,7 +8,7 @@ name = "navigation beacon" desc = "A radio beacon used for bot navigation." level = 1 // underfloor - layer = 2.5 + layer = LOW_OBJ_LAYER anchored = 1 var/open = 0 // true if cover is open diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index a920d418d14..06c78ba1905 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -178,7 +178,7 @@ qdel(I) qdel(J) H.icon = HI - H.layer = 25 + H.layer = ABOVE_HUD_LAYER usr.mapobjs += H #else @@ -296,7 +296,7 @@ H.icon = I qdel(I) - H.layer = 25 + H.layer = ABOVE_HUD_LAYER usr.mapobjs += H #endif diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index d015bb1a975..6a67e4e3f07 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/turrets.dmi' icon_state = "grey_target_prism" anchored = 1 - layer = 3 + layer = OBJ_LAYER invisibility = INVISIBILITY_OBSERVER //the turret is invisible if it's inside its cover density = 1 use_power = 1 //this turret uses and requires power @@ -502,7 +502,7 @@ if(cover) cover.icon_state = "openTurretCover" raised = 1 - layer = 4 + layer = MOB_LAYER /obj/machinery/porta_turret/proc/popDown() //pops the turret down if(disabled) @@ -511,7 +511,7 @@ return if(stat & BROKEN) return - layer = 3 + layer = OBJ_LAYER raising = 1 if(cover) flick("popdown", cover) diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm index a65694405a7..bb399096382 100644 --- a/code/game/machinery/porta_turret/portable_turret_cover.dm +++ b/code/game/machinery/porta_turret/portable_turret_cover.dm @@ -8,7 +8,7 @@ icon = 'icons/obj/turrets.dmi' icon_state = "turretCover" anchored = 1 - layer = 3.5 + layer = HIGH_OBJ_LAYER density = 0 var/obj/machinery/porta_turret/parent_turret = null diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 319ce51d949..4b37378f666 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -5,7 +5,7 @@ var/const/SAFETY_COOLDOWN = 100 desc = "A large crushing machine which is used to recycle small items ineffeciently; there are lights on the side of it." icon = 'icons/obj/recycling.dmi' icon_state = "grinder-o0" - layer = MOB_LAYER+1 // Overhead + layer = ABOVE_ALL_MOB_LAYER // Overhead anchored = 1 density = 1 var/safety_mode = FALSE // Temporarily stops machine if it detects a mob diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index c0658a1fdc5..3243e0cf5fb 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -111,7 +111,7 @@ anchored = 0 density = 1 - layer = MOB_LAYER - 0.2 //so people can't hide it and it's REALLY OBVIOUS + layer = BELOW_MOB_LAYER //so people can't hide it and it's REALLY OBVIOUS stat = 0 var/active = 0 diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index a947c472511..26692706d2a 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -7,7 +7,7 @@ anchored = 0 density = 0 - layer = MOB_LAYER - 0.2 //so people can't hide it and it's REALLY OBVIOUS + layer = BELOW_MOB_LAYER //so people can't hide it and it's REALLY OBVIOUS unacidable = 1 var/timer = 60 diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 1b18ea95e3a..3145ab44da8 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -3,7 +3,7 @@ desc = "A large metallic machine with an entrance and an exit. A sign on the side reads, 'human go in, robot come out', human must be lying down and alive. Has to cooldown between each use." icon = 'icons/obj/recycling.dmi' icon_state = "separator-AO1" - layer = MOB_LAYER+1 // Overhead + layer = ABOVE_ALL_MOB_LAYER // Overhead anchored = 1 density = 0 var/transform_dead = 0 diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 53800726166..edfe1f58dc8 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -15,7 +15,7 @@ desc = "A generic vending machine." icon = 'icons/obj/vending.dmi' icon_state = "generic" - layer = 2.9 + layer = BELOW_OBJ_LAYER anchored = 1 density = 1 verb_say = "beeps" diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index eb062334719..f43d5b07698 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -192,14 +192,6 @@ if(default_deconstruction_screwdriver(user, null, null, W)) update_icon() return - else if(istype(W,/obj/item/weapon/grab)) - if(state_open) - var/obj/item/weapon/grab/G = W - if(iscorgi(G.affecting)) - has_corgi = 1 - G.affecting.loc = src - qdel(G) - update_icon() else if(user.a_intent != "harm") @@ -232,6 +224,17 @@ user << "[src] is busy." return + if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + var/mob/living/L = user.pulling + if(L.buckled || L.buckled_mobs.len) + return + if(state_open) + if(iscorgi(L)) + has_corgi = 1 + L.forceMove(src) + update_icon() + return + if(!state_open) open_machine() else diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm index 81ba3e89b21..d9620ef7132 100644 --- a/code/game/mecha/equipment/tools/medical_tools.dm +++ b/code/game/mecha/equipment/tools/medical_tools.dm @@ -264,11 +264,11 @@ /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/New() ..() - flags |= NOREACT + create_reagents(max_volume) + reagents.set_reacting(FALSE) syringes = new known_reagents = list("epinephrine"="Epinephrine","charcoal"="Charcoal") processed_reagents = new - create_reagents(max_volume) /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/detach() SSobj.processing -= src @@ -280,8 +280,8 @@ /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/critfail() ..() - flags &= ~NOREACT - return + if(reagents) + reagents.set_reacting(TRUE) /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/can_attach(obj/mecha/medical/M) if(..()) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 6c62de01260..afdd7191fa8 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -20,7 +20,7 @@ opacity = 1 ///opaque. Menacing. anchored = 1 //no pulling around. unacidable = 1 //and no deleting hoomans inside - layer = MOB_LAYER - 0.2//icon draw layer + layer = BELOW_MOB_LAYER//icon draw layer infra_luminosity = 15 //byond implementation is bugged. force = 5 flags = HEAR diff --git a/code/game/objects/effects/decals/Cleanable/aliens.dm b/code/game/objects/effects/decals/Cleanable/aliens.dm index 7e358f18fb4..36bf7577bb1 100644 --- a/code/game/objects/effects/decals/Cleanable/aliens.dm +++ b/code/game/objects/effects/decals/Cleanable/aliens.dm @@ -5,7 +5,7 @@ desc = "It's green and acidic. It looks like... blood?" gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/blood.dmi' icon_state = "xfloor1" random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 20c32cca078..e6e90cbde1c 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -3,7 +3,7 @@ desc = "It's red and gooey. Perhaps it's the chef's cooking?" gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/blood.dmi' icon_state = "floor1" random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") @@ -38,7 +38,7 @@ desc = "Your instincts say you shouldn't be following these." gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER random_icon_states = null var/list/existing_dirs = list() blood_DNA = list() @@ -53,7 +53,7 @@ desc = "They look bloody and gruesome." gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/blood.dmi' icon_state = "gibbl5" random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index b4d66d84595..f7f4f5fe953 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -3,7 +3,7 @@ desc = "Someone should clean that up." gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/obj/objects.dmi' icon_state = "shards" @@ -26,7 +26,7 @@ icon_state = "dirt" gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER mouse_opacity = 0 /obj/effect/decal/cleanable/flour @@ -34,7 +34,7 @@ desc = "It's still good. Four second rule!" gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon_state = "flour" /obj/effect/decal/cleanable/greenglow @@ -42,7 +42,7 @@ desc = "Jeez. I hope that's not for lunch." gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER luminosity = 1 icon_state = "greenglow" @@ -53,7 +53,7 @@ name = "cobweb" desc = "Somebody should remove that." density = 0 - layer = 3 + layer = OBJ_LAYER icon_state = "cobweb1" burntime = 1 @@ -64,7 +64,7 @@ name = "gooey grey mass" desc = "It looks like a melted... something." density = 0 - layer = 3 + layer = OBJ_LAYER icon = 'icons/obj/chemical.dmi' icon_state = "molten" @@ -72,7 +72,7 @@ name = "cobweb" desc = "Somebody should remove that." density = 0 - layer = 3 + layer = OBJ_LAYER icon_state = "cobweb2" //Vomit (sorry) @@ -81,7 +81,7 @@ desc = "Gosh, how unpleasant." gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/blood.dmi' icon_state = "vomit_1" random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") @@ -113,14 +113,14 @@ name = "tomato smudge" desc = "It's red." density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3") /obj/effect/decal/cleanable/plant_smudge name = "plant smudge" density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_plant") @@ -128,7 +128,7 @@ name = "smashed egg" desc = "Seems like this one won't hatch." density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3") @@ -136,7 +136,7 @@ name = "smashed pie" desc = "It's pie cream from a cream pie." density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_pie") @@ -153,7 +153,7 @@ icon_state = "shreds" gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER /obj/effect/decal/cleanable/shreds/New() pixel_x = rand(-5, 5) diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm index af2ff562590..e255f497ca2 100644 --- a/code/game/objects/effects/decals/Cleanable/robots.dm +++ b/code/game/objects/effects/decals/Cleanable/robots.dm @@ -5,7 +5,7 @@ desc = "It's a useless heap of junk... or is it?" gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/mob/robots.dmi' icon_state = "gib1" random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7") @@ -44,7 +44,7 @@ desc = "It's black and greasy. Looks like Beepsky made another mess." gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/mob/robots.dmi' icon_state = "floor1" var/viruses = list() diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index 2f5bd9ea000..2948ada90d0 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -3,7 +3,7 @@ desc = "Graffiti. Damn kids." icon = 'icons/effects/crayondecal.dmi' icon_state = "rune1" - layer = 2.1 + layer = ABOVE_NORMAL_TURF_LAYER var/do_icon_rotate = TRUE /obj/effect/decal/cleanable/crayon/examine() @@ -31,7 +31,7 @@ /obj/effect/decal/cleanable/crayon/gang - layer = 3.6 //Harder to hide + layer = HIGH_OBJ_LAYER //Harder to hide do_icon_rotate = FALSE //These are designed to always face south, so no rotation please. var/datum/gang/gang diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index 8daf88c6c42..762c702df1c 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -2,7 +2,7 @@ name = "pointer" icon = 'icons/mob/screen_gen.dmi' icon_state = "arrow" - layer = 16 + layer = POINT_LAYER duration = 25 /obj/effect/overlay/temp/point/New(atom/target, set_invis = 0) @@ -12,23 +12,18 @@ pixel_y = target.pixel_y invisibility = set_invis -// Used for spray that you spray at walls, tables, hydrovats etc -/obj/effect/decal/spraystill - density = 0 - layer = 50 - //Used by spraybottles. /obj/effect/decal/chempuff name = "chemicals" icon = 'icons/obj/chempuff.dmi' pass_flags = PASSTABLE | PASSGRILLE - layer = 5 + layer = FLY_LAYER /obj/effect/decal/sandeffect name = "sandy tile" icon = 'icons/turf/floors.dmi' icon_state = "sandeffect" - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER /obj/effect/decal/fakelattice name = "lattice" diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 54e57af855e..6dbf2b473e9 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -7,7 +7,7 @@ opacity = 0 anchored = 1 density = 0 - layer = MOB_LAYER + 0.5 + layer = ABOVE_ALL_MOB_LAYER mouse_opacity = 0 var/amount = 3 animate_movement = 0 diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 47dabfaf579..fd07e31986d 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -7,7 +7,7 @@ density = 0 icon = 'icons/obj/lighting.dmi' icon_state = "glowshroom" //replaced in New - layer = 2.1 + layer = ABOVE_NORMAL_TURF_LAYER var/endurance = 30 var/potency = 30 var/delay = 1200 diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index d39257edbcf..8c16eb5533f 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -3,7 +3,6 @@ desc = "Better stay away from that thing." density = 0 anchored = 1 - layer = 3 icon = 'icons/obj/weapons.dmi' icon_state = "uglymine" var/triggered = 0 diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index 4d621cf0fdd..712d8c6c59f 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -7,15 +7,6 @@ density = 1 anchored = 0 -/obj/effect/mark - var/mark = "" - icon = 'icons/misc/mark.dmi' - icon_state = "blank" - anchored = 1 - layer = 99 - mouse_opacity = 0 - unacidable = 1//Just to be sure. - /obj/effect/beam name = "beam" unacidable = 1//Just to be sure. diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index c929d74e5ca..79ce9abe797 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -22,7 +22,7 @@ /obj/effect/overlay/temp icon_state = "nothing" anchored = 1 - layer = 4.1 + layer = ABOVE_MOB_LAYER mouse_opacity = 0 var/duration = 10 var/randomdir = 1 @@ -117,7 +117,7 @@ /obj/effect/overlay/temp/cult/door name = "unholy glow" icon_state = "doorglow" - layer = 3.17 //above closed doors + layer = CLOSED_FIREDOOR_LAYER //above closed doors /obj/effect/overlay/temp/cult/door/unruned icon_state = "unruneddoorglow" @@ -125,7 +125,7 @@ /obj/effect/overlay/temp/cult/turf name = "unholy glow" icon_state = "wallglow" - layer = TURF_LAYER + 0.07 + layer = ABOVE_NORMAL_TURF_LAYER /obj/effect/overlay/temp/cult/turf/open/floor icon_state = "floorglow" @@ -179,7 +179,7 @@ icon = 'icons/misc/beach2.dmi' icon_state = "palm1" density = 1 - layer = 5 + layer = WALL_OBJ_LAYER anchored = 1 /obj/effect/overlay/palmtree_l @@ -187,7 +187,7 @@ icon = 'icons/misc/beach2.dmi' icon_state = "palm2" density = 1 - layer = 5 + layer = WALL_OBJ_LAYER anchored = 1 /obj/effect/overlay/coconut diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 47c439f0a4e..e4c4ba33fa4 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -94,7 +94,7 @@ /obj/item/stack/rods{amount = 50} = 1, /obj/item/stack/sheet/cardboard = 2, /obj/item/stack/sheet/metal{amount = 20} = 1, - /obj/item/stack/sheet/mineral/plasma{layer = 2.9} = 1, + /obj/item/stack/sheet/mineral/plasma = 1, /obj/item/stack/sheet/rglass = 1, /obj/item/weapon/book/manual/wiki/engineering_construction = 1, /obj/item/weapon/book/manual/wiki/engineering_hacking = 1, diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index b8d0a99bba9..2ed341eca59 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -98,7 +98,7 @@ desc = "It never stays still for long." icon_state = "spiderling" anchored = 0 - layer = 2.75 + layer = PROJECTILE_HIT_THRESHHOLD_LAYER health = 3 var/amount_grown = 0 var/grow_as = null diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 7c61b5d152f..2839bb1250b 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -409,7 +409,7 @@ obj/item/proc/item_action_slot_check(slot, mob/user) set category = "Object" set name = "Pick up" - if(usr.stat || usr.restrained() || !Adjacent(usr) || usr.stunned || usr.weakened || usr.lying) + if(usr.incapacitated() || !Adjacent(usr) || usr.lying) return if(usr.get_active_hand() == null) // Let me know if this has any problems -Yota diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 6102f97caee..146610a5197 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -173,6 +173,10 @@ MASS SPECTROMETER // Time of death if(M.tod && (M.stat == DEAD || (M.status_flags & FAKEDEATH))) user << "Time of Death: [M.tod]" + var/tdelta = world.time - M.timeofdeath + if(tdelta < (DEFIB_TIME_LIMIT * 10)) + user << "Subject died [tdelta / 10] seconds \ + ago, defibrillation may be possible!" for(var/datum/disease/D in M.viruses) if(!(D.visibility_flags & HIDDEN_SCANNER)) diff --git a/code/game/objects/items/documents.dm b/code/game/objects/items/documents.dm index 043fcd80cb0..1fbfb9490a6 100644 --- a/code/game/objects/items/documents.dm +++ b/code/game/objects/items/documents.dm @@ -8,7 +8,7 @@ w_class = 1 throw_range = 1 throw_speed = 1 - layer = 4 + layer = MOB_LAYER pressure_resistance = 1 /obj/item/documents/nanotrasen diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 42e6d7f7280..8a0a32d8672 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -210,10 +210,15 @@ if(!user.unEquip(W)) return - if(M.syndiemmi) + if(M.hacked || M.clockwork) aisync = 0 lawsync = 0 - O.laws = new /datum/ai_laws/syndicate_override + if(M.clockwork) + O.laws = new/datum/ai_laws/ratvar + spawn(1) + add_servant_of_ratvar(O) + else + O.laws = new/datum/ai_laws/syndicate_override O.invisibility = 0 //Transfer debug settings to new mob @@ -226,7 +231,7 @@ O.notify_ai(1) if(forced_ai) O.connected_ai = forced_ai - if(!lawsync && !M.syndiemmi) + if(!lawsync && !M.hacked) O.lawupdate = 0 O.make_laws() diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index f2b9bcd472b..22bcc0d2dcb 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -155,7 +155,7 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \ singular_name = "hide plate" flags = NOBLUDGEON w_class = 3 - layer = 4 + layer = MOB_LAYER /obj/item/stack/sheet/animalhide/ashdrake name = "ash drake hide" @@ -165,7 +165,7 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \ singular_name = "drake plate" flags = NOBLUDGEON w_class = 3 - layer = 4 + layer = MOB_LAYER //Step one - dehairing. diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 0b5fa01aff8..ca32e2890b7 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -63,7 +63,7 @@ var/global/list/datum/stack_recipe/sandstone_recipes = list ( \ icon_state = "sandbags" singular_name = "sandbag" force = 5 - layer = 2.95 + layer = LOW_ITEM_LAYER throwforce = 5 w_class = 3 throw_speed = 1 diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index d8cd87d804b..00f12ae5119 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -121,10 +121,16 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/cigarette/New() ..() - flags |= NOREACT // so it doesn't react until you light it create_reagents(chem_volume) // making the cigarette a chemical holder with a maximum volume of 15 + reagents.set_reacting(FALSE) // so it doesn't react until you light it reagents.add_reagent("nicotine", 15) +/obj/item/clothing/mask/cigarette/Destroy() + if(reagents) + qdel(reagents) + SSobj.processing -= src + . = ..() + /obj/item/clothing/mask/cigarette/attackby(obj/item/weapon/W, mob/user, params) if(!lit && smoketime > 0 && W.is_hot()) var/lighting_text = is_lighter(W,user) @@ -155,7 +161,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM else if(istype(O, /obj/item/weapon/lighter)) lighting_text = "With a single flick of their wrist, [user] smoothly lights their [name] with [O]. Damn they're cool." else if(istype(O, /obj/item/weapon/melee/energy)) - lighting_text = "[user] swings their [O], barely missing their nose. They light their [name] in the process." + var/in_mouth = "" + if(iscarbon(user)) + var/mob/living/carbon/C = user + if(C.wear_mask == src) + in_mouth = ", barely missing their nose" + lighting_text = "[user] swings their \ + [O][in_mouth]. They light their [name] in the process." else if(istype(O, /obj/item/device/assembly/igniter)) lighting_text = "[user] fiddles with [O], and manages to light their [name]." else if(istype(O, /obj/item/device/flashlight/flare)) @@ -165,46 +177,49 @@ CIGARETTE PACKETS ARE IN FANCY.DM return lighting_text /obj/item/clothing/mask/cigarette/proc/light(flavor_text = null) - if(!src.lit) - src.lit = 1 - name = "lit [name]" - attack_verb = list("burnt", "singed") - hitsound = 'sound/items/welder.ogg' - damtype = "fire" - force = 4 - if(reagents.get_reagent_amount("plasma")) // the plasma explodes when exposed to fire - var/datum/effect_system/reagents_explosion/e = new() - e.set_up(round(reagents.get_reagent_amount("plasma") / 2.5, 1), get_turf(src), 0, 0) - e.start() - if(ismob(loc)) - var/mob/M = loc - M.unEquip(src, 1) - qdel(src) - return - if(reagents.get_reagent_amount("welding_fuel")) // the fuel explodes, too, but much less violently - var/datum/effect_system/reagents_explosion/e = new() - e.set_up(round(reagents.get_reagent_amount("welding_fuel") / 5, 1), get_turf(src), 0, 0) - e.start() - if(ismob(loc)) - var/mob/M = loc - M.unEquip(src, 1) - qdel(src) - return - flags &= ~NOREACT // allowing reagents to react after being lit - reagents.handle_reactions() - icon_state = icon_on - item_state = icon_on - if(flavor_text) - var/turf/T = get_turf(src) - T.visible_message(flavor_text) - SSobj.processing |= src + if(lit) + return - //can't think of any other way to update the overlays :< + lit = TRUE + name = "lit [name]" + attack_verb = list("burnt", "singed") + hitsound = 'sound/items/welder.ogg' + damtype = "fire" + force = 4 + if(reagents.get_reagent_amount("plasma")) // the plasma explodes when exposed to fire + var/datum/effect_system/reagents_explosion/e = new() + e.set_up(round(reagents.get_reagent_amount("plasma") / 2.5, 1), get_turf(src), 0, 0) + e.start() if(ismob(loc)) var/mob/M = loc - M.update_inv_wear_mask() - M.update_inv_l_hand() - M.update_inv_r_hand() + M.unEquip(src, 1) + qdel(src) + return + if(reagents.get_reagent_amount("welding_fuel")) // the fuel explodes, too, but much less violently + var/datum/effect_system/reagents_explosion/e = new() + e.set_up(round(reagents.get_reagent_amount("welding_fuel") / 5, 1), get_turf(src), 0, 0) + e.start() + if(ismob(loc)) + var/mob/M = loc + M.unEquip(src, 1) + qdel(src) + return + // allowing reagents to react after being lit + reagents.set_reacting(TRUE) + reagents.handle_reactions() + icon_state = icon_on + item_state = icon_on + if(flavor_text) + var/turf/T = get_turf(src) + T.visible_message(flavor_text) + SSobj.processing |= src + + //can't think of any other way to update the overlays :< + if(ismob(loc)) + var/mob/M = loc + M.update_inv_wear_mask() + M.update_inv_l_hand() + M.update_inv_r_hand() /obj/item/clothing/mask/cigarette/proc/handle_reagents() @@ -228,25 +243,20 @@ CIGARETTE PACKETS ARE IN FANCY.DM smoketime-- if(smoketime < 1) new type_butt(location) - SSobj.processing.Remove(src) if(ismob(loc)) M << "Your [name] goes out." M.unEquip(src, 1) //un-equip it so the overlays can update //Force the un-equip so the overlays update qdel(src) return - if(location) - location.hotspot_expose(700, 5) - if(reagents && reagents.total_volume) // check if it has any reagents at all + open_flame() + if(reagents && reagents.total_volume) handle_reagents() - return - /obj/item/clothing/mask/cigarette/attack_self(mob/user) if(lit == 1) user.visible_message("[user] calmly drops and treads on \the [src], putting it out instantly.") new type_butt(user.loc) new /obj/effect/decal/cleanable/ash(user.loc) - SSobj.processing.Remove(src) qdel(src) return ..() @@ -370,6 +380,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM ..() name = "empty [initial(name)]" +/obj/item/clothing/mask/cigarette/pipe/Destroy() + if(reagents) + qdel(reagents) + SSobj.processing -= src + . = ..() + /obj/item/clothing/mask/cigarette/pipe/process() var/turf/location = get_turf(src) smoketime-- @@ -386,8 +402,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM name = "empty [initial(name)]" SSobj.processing.Remove(src) return - if(location) - location.hotspot_expose(700, 5) + open_flame() if(reagents && reagents.total_volume) // check if it has any reagents at all handle_reagents() return diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index c04ead47e26..0bb8b547514 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -1,5 +1,4 @@ //backpack item - /obj/item/weapon/defibrillator name = "defibrillator" desc = "A device that delivers powerful shocks to detachable paddles that resuscitate incapacitated patients." @@ -19,6 +18,7 @@ var/obj/item/weapon/twohanded/shockpaddles/paddles var/obj/item/weapon/stock_parts/cell/high/bcell = null var/combat = 0 //can we revive through space suits? + var/grab_ghost = FALSE // Do we pull the ghost back into their body? /obj/item/weapon/defibrillator/New() //starts without a cell for rnd ..() @@ -297,6 +297,7 @@ var/obj/item/weapon/defibrillator/defib var/req_defib = 1 var/combat = 0 //If it penetrates armor and gives additional functionality + var/grab_ghost = FALSE /obj/item/weapon/twohanded/shockpaddles/proc/recharge(var/time) if(req_defib || !time) @@ -382,178 +383,186 @@ else user << "You aren't sure how to revive that..." return - else - var/mob/living/carbon/human/H = M - if(user.a_intent == "disarm") - if(req_defib && defib.safety) - return - if(!req_defib && !combat) - return - busy = 1 - H.visible_message("[user] has touched [H.name] with [src]!", \ - "[user] has touched [H.name] with [src]!") - H.adjustStaminaLoss(50) - H.Weaken(5) - H.updatehealth() //forces health update before next life tick - playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) - H.emote("gasp") - add_logs(user, M, "stunned", src) - if(req_defib) - defib.deductcharge(revivecost) - cooldown = 1 - busy = 0 - update_icon() - if(req_defib) - defib.cooldowncheck(user) - else - recharge(60) + var/mob/living/carbon/human/H = M + + if(user.a_intent == "disarm") + if(req_defib && defib.safety) return - if(user.zone_selected == "chest") - if(user.a_intent == "harm") - if(req_defib && defib.safety) + if(!req_defib && !combat) + return + busy = 1 + H.visible_message("[user] has touched [H.name] with [src]!", \ + "[user] has touched [H.name] with [src]!") + H.adjustStaminaLoss(50) + H.Weaken(5) + H.updatehealth() //forces health update before next life tick + playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) + H.emote("gasp") + add_logs(user, M, "stunned", src) + if(req_defib) + defib.deductcharge(revivecost) + cooldown = 1 + busy = 0 + update_icon() + if(req_defib) + defib.cooldowncheck(user) + else + recharge(60) + return + + if(user.zone_selected != "chest") + user << "You need to target your patient's \ + chest with [src]!" + return + if(user.a_intent == "harm") + if(req_defib && defib.safety) + return + if(!req_defib && !combat) + return + user.visible_message("[user] begins to place [src] on [M.name]'s chest.", + "You overcharge the paddles and begin to place them onto [M]'s chest...") + busy = 1 + update_icon() + if(do_after(user, 30, target = M)) + user.visible_message("[user] places [src] on [M.name]'s chest.", + "You place [src] on [M.name]'s chest and begin to charge them.") + var/turf/T = get_turf(defib) + playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) + if(req_defib) + T.audible_message("\The [defib] lets out an urgent beep and lets out a steadily rising hum...") + else + user.audible_message("[src] let out an urgent beep.") + if(do_after(user, 30, target = M)) //Takes longer due to overcharging + if(!M) + busy = 0 + update_icon() return - if(!req_defib && !combat) + if(M && M.stat == DEAD) + user << "[M] is dead." + playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) + busy = 0 + update_icon() return - user.visible_message("[user] begins to place [src] on [M.name]'s chest.", - "You overcharge the paddles and begin to place them onto [M]'s chest...") - busy = 1 - update_icon() - if(do_after(user, 30, target = M)) - user.visible_message("[user] places [src] on [M.name]'s chest.", - "You place [src] on [M.name]'s chest and begin to charge them.") - var/turf/T = get_turf(defib) - playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) - if(req_defib) - T.audible_message("\The [defib] lets out an urgent beep and lets out a steadily rising hum...") - else - user.audible_message("[src] let out an urgent beep.") - if(do_after(user, 30, target = M)) //Takes longer due to overcharging - if(!M) - busy = 0 - update_icon() - return - if(M && M.stat == DEAD) - user << "[M] is dead." - playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) - busy = 0 - update_icon() - return - user.visible_message("[user] shocks [M] with \the [src]!", "You shock [M] with \the [src]!") - playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 100, 1, -1) - playsound(loc, 'sound/weapons/Egloves.ogg', 100, 1, -1) - var/mob/living/carbon/human/HU = M - M.emote("scream") - if(!HU.heart_attack) - HU.heart_attack = 1 - if(!HU.stat) - HU.visible_message("[M] thrashes wildly, clutching at their chest!", - "You feel a horrible agony in your chest!") - HU.apply_damage(50, BURN, "chest") - add_logs(user, M, "overloaded the heart of", defib) - M.Weaken(5) - M.Jitter(100) - if(req_defib) - defib.deductcharge(revivecost) - cooldown = 1 - busy = 0 - update_icon() - if(!req_defib) - recharge(60) - if(req_defib && (defib.cooldowncheck(user))) - return + user.visible_message("[user] shocks [M] with \the [src]!", "You shock [M] with \the [src]!") + playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 100, 1, -1) + playsound(loc, 'sound/weapons/Egloves.ogg', 100, 1, -1) + var/mob/living/carbon/human/HU = M + M.emote("scream") + if(!HU.heart_attack) + HU.heart_attack = 1 + if(!HU.stat) + HU.visible_message("[M] thrashes wildly, clutching at their chest!", + "You feel a horrible agony in your chest!") + HU.apply_damage(50, BURN, "chest") + add_logs(user, M, "overloaded the heart of", defib) + M.Weaken(5) + M.Jitter(100) + if(req_defib) + defib.deductcharge(revivecost) + cooldown = 1 busy = 0 update_icon() - return - if(!H.suiciding && !(H.disabilities & NOCLONE)&& !H.hellbound) - H.notify_ghost_cloning("Your heart is being defibrillated. Re-enter your corpse if you want to be revived!", source = src) + if(!req_defib) + recharge(60) + if(req_defib && (defib.cooldowncheck(user))) + return + busy = 0 + update_icon() + return + if((!req_defib && grab_ghost) || (req_defib && defib.grab_ghost)) + H.notify_ghost_cloning("Your heart is being defibrillated!") + H.grab_ghost() // Shove them back in their body. + else if(!H.suiciding && !(H.disabilities & NOCLONE)&& !H.hellbound) + H.notify_ghost_cloning("Your heart is being defibrillated. Re-enter your corpse if you want to be revived!", source = src) - user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest...") - busy = 1 - update_icon() - if(do_after(user, 30, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process - user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.") - playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) - var/tplus = world.time - H.timeofdeath - var/tlimit = 1200 //past this much time the patient is unrecoverable (in deciseconds) - var/tloss = 600 //brain damage starts setting in on the patient after some time left rotting - var/total_burn = 0 - var/total_brute = 0 - if(do_after(user, 20, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total - for(var/obj/item/carried_item in H.contents) - if(istype(carried_item, /obj/item/clothing/suit/space)) - if((!src.combat && !req_defib) || (req_defib && !defib.combat)) - user.audible_message("[req_defib ? "[defib]" : "[src]"] buzzes: Patient's chest is obscured. Operation aborted.") - playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) - busy = 0 - update_icon() - return - if(H.stat == DEAD) - M.visible_message("[M]'s body convulses a bit.") - playsound(get_turf(src), "bodyfall", 50, 1) - playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) - total_brute = H.getBruteLoss() - total_burn = H.getFireLoss() - - var/failed = null - - if (H.suiciding || (H.disabilities & NOCLONE)) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Recovery of patient impossible. Further attempts futile." - else if (H.hellbound) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's soul appears to be on another plane of existance. Further attempts futile." - else if (tplus > tlimit) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Body has decayed for too long. Further attempts futile." - else if (!H.getorgan(/obj/item/organ/heart)) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's heart is missing." - else if(total_burn >= 180 || total_brute >= 180) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Severe tissue damage makes recovery of patient impossible via defibrillator. Further attempts futile." - else if(H.get_ghost()) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - No activity in patient's brain. Further attempts may be successful." - else - var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain) - if(!BR || BR.damaged_brain) - failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's brain is missing or damaged beyond point of no return. Further attempts futile." - - if(failed) - user.visible_message(failed) - playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) - else - //If the body has been fixed so that they would not be in crit when defibbed, give them oxyloss to put them back into crit - if (H.health > halfwaycritdeath) - H.adjustOxyLoss(H.health - halfwaycritdeath, 0) - else - var/overall_damage = total_brute + total_burn + H.getToxLoss() + H.getOxyLoss() - var/mobhealth = H.health - H.adjustOxyLoss((mobhealth - halfwaycritdeath) * (H.getOxyLoss() / overall_damage), 0) - H.adjustToxLoss((mobhealth - halfwaycritdeath) * (H.getToxLoss() / overall_damage), 0) - H.adjustFireLoss((mobhealth - halfwaycritdeath) * (total_burn / overall_damage), 0) - H.adjustBruteLoss((mobhealth - halfwaycritdeath) * (total_brute / overall_damage), 0) - user.visible_message("[req_defib ? "[defib]" : "[src]"] pings: Resuscitation successful.") - playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) - H.revive() - H.emote("gasp") - if(tplus > tloss) - H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) - add_logs(user, M, "revived", defib) - if(req_defib) - defib.deductcharge(revivecost) - cooldown = 1 - update_icon() - if(req_defib) - defib.cooldowncheck(user) - else - recharge(60) - else if(H.heart_attack) - H.heart_attack = 0 - user.visible_message("[req_defib ? "[defib]" : "[src]"] pings: Patient's heart is now beating again.") - playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) - else - user.visible_message("[req_defib ? "[defib]" : "[src]"] buzzes: Patient is not in a valid state. Operation aborted.") + user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest...") + busy = 1 + update_icon() + if(do_after(user, 30, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process + user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.") + playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0) + var/tplus = world.time - H.timeofdeath + // past this much time the patient is unrecoverable + // (in deciseconds) + var/tlimit = DEFIB_TIME_LIMIT * 10 + // brain damage starts setting in on the patient after + // some time left rotting + var/tloss = DEFIB_TIME_LOSS * 10 + var/total_burn = 0 + var/total_brute = 0 + if(do_after(user, 20, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total + for(var/obj/item/carried_item in H.contents) + if(istype(carried_item, /obj/item/clothing/suit/space)) + if((!src.combat && !req_defib) || (req_defib && !defib.combat)) + user.audible_message("[req_defib ? "[defib]" : "[src]"] buzzes: Patient's chest is obscured. Operation aborted.") playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) - busy = 0 - update_icon() - else - user << "You need to target your patient's chest with [src]!" - return + busy = 0 + update_icon() + return + if(H.stat == DEAD) + M.visible_message("[M]'s body convulses a bit.") + playsound(get_turf(src), "bodyfall", 50, 1) + playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) + total_brute = H.getBruteLoss() + total_burn = H.getFireLoss() + + var/failed = null + + if (H.suiciding || (H.disabilities & NOCLONE)) + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Recovery of patient impossible. Further attempts futile." + else if (H.hellbound) + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's soul appears to be on another plane of existance. Further attempts futile." + else if (tplus > tlimit) + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Body has decayed for too long. Further attempts futile." + else if (!H.getorgan(/obj/item/organ/heart)) + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's heart is missing." + else if(total_burn >= 180 || total_brute >= 180) + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Severe tissue damage makes recovery of patient impossible via defibrillator. Further attempts futile." + else if(H.get_ghost()) + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - No activity in patient's brain. Further attempts may be successful." + else + var/obj/item/organ/brain/BR = H.getorgan(/obj/item/organ/brain) + if(!BR || BR.damaged_brain) + failed = "[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's brain is missing or damaged beyond point of no return. Further attempts futile." + + if(failed) + user.visible_message(failed) + playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) + else + //If the body has been fixed so that they would not be in crit when defibbed, give them oxyloss to put them back into crit + if (H.health > halfwaycritdeath) + H.adjustOxyLoss(H.health - halfwaycritdeath, 0) + else + var/overall_damage = total_brute + total_burn + H.getToxLoss() + H.getOxyLoss() + var/mobhealth = H.health + H.adjustOxyLoss((mobhealth - halfwaycritdeath) * (H.getOxyLoss() / overall_damage), 0) + H.adjustToxLoss((mobhealth - halfwaycritdeath) * (H.getToxLoss() / overall_damage), 0) + H.adjustFireLoss((mobhealth - halfwaycritdeath) * (total_burn / overall_damage), 0) + H.adjustBruteLoss((mobhealth - halfwaycritdeath) * (total_brute / overall_damage), 0) + user.visible_message("[req_defib ? "[defib]" : "[src]"] pings: Resuscitation successful.") + playsound(get_turf(src), 'sound/machines/defib_success.ogg', 50, 0) + H.revive() + H.emote("gasp") + if(tplus > tloss) + H.setBrainLoss( max(0, min(99, ((tlimit - tplus) / tlimit * 100)))) + add_logs(user, M, "revived", defib) + if(req_defib) + defib.deductcharge(revivecost) + cooldown = 1 + update_icon() + if(req_defib) + defib.cooldowncheck(user) + else + recharge(60) + else if(H.heart_attack) + H.heart_attack = 0 + user.visible_message("[req_defib ? "[defib]" : "[src]"] pings: Patient's heart is now beating again.") + playsound(get_turf(src), 'sound/machines/defib_zap.ogg', 50, 1, -1) + else + user.visible_message("[req_defib ? "[defib]" : "[src]"] buzzes: Patient is not in a valid state. Operation aborted.") + playsound(get_turf(src), 'sound/machines/defib_failed.ogg', 50, 0) + busy = 0 + update_icon() /obj/item/weapon/twohanded/shockpaddles/syndicate name = "syndicate defibrillator paddles" diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index f56f9d01d5a..c3512dfc983 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -174,7 +174,7 @@ var/turf/T = get_turf(loc) if(istype(T, /turf/open)) var/turf/open/theturf = T - theturf.MakeSlippery(min = 10, max = 5) + theturf.MakeSlippery(min_wet_time = 10, wet_time_to_add = 5) user.visible_message("[user] empties out \the [src] onto the floor using the release valve.", "You quietly empty out \the [src] using its release valve.") return diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 218f2fba57c..3975886caea 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -12,7 +12,6 @@ w_class = 3 materials = list(MAT_METAL=500) origin_tech = "combat=1;plasmatech=1" - var/status = 0 var/throw_amount = 100 var/lit = 0 //on or off var/operating = 0//cooldown @@ -49,7 +48,7 @@ /obj/item/weapon/flamethrower/update_icon() overlays.Cut() if(igniter) - overlays += "+igniter[status]" + overlays += "+igniter1" if(ptank) overlays += "+ptank" if(lit) @@ -70,41 +69,7 @@ flame_turf(turflist) /obj/item/weapon/flamethrower/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/weapon/wrench) && !status)//Taking this apart - var/turf/T = get_turf(src) - if(weldtool) - weldtool.loc = T - weldtool = null - if(igniter) - igniter.loc = T - igniter = null - if(ptank) - ptank.loc = T - ptank = null - new /obj/item/stack/rods(T) - qdel(src) - return - - else if(istype(W, /obj/item/weapon/screwdriver) && igniter && !lit) - status = !status - user << "[igniter] is now [status ? "secured" : "unsecured"]!" - update_icon() - return - - else if(isigniter(W)) - var/obj/item/device/assembly/igniter/I = W - if(I.secured) - return - if(igniter) - return - if(!user.unEquip(W)) - return - I.loc = src - igniter = I - update_icon() - return - - else if(istype(W,/obj/item/weapon/tank/internals/plasma)) + if(istype(W,/obj/item/weapon/tank/internals/plasma)) if(ptank) user << "There appears to already be a plasma tank loaded in [src]!" return @@ -145,8 +110,6 @@ if(href_list["light"]) if(!ptank) return - if(!status) - return lit = !lit if(lit) SSobj.processing |= src @@ -174,9 +137,7 @@ ..() weldtool = locate(/obj/item/weapon/weldingtool) in contents igniter = locate(/obj/item/device/assembly/igniter) in contents - weldtool.status = 0 igniter.secured = 0 - status = 1 update_icon() //Called from turf.dm turf/dblclick @@ -218,11 +179,9 @@ ..() if(!weldtool) weldtool = new /obj/item/weapon/weldingtool(src) - weldtool.status = 0 if(!igniter) igniter = new /obj/item/device/assembly/igniter(src) igniter.secured = 0 - status = 1 update_icon() /obj/item/weapon/flamethrower/full/tank/New(var/loc) diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index bd261f6a22c..c88ddc1843d 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -151,37 +151,6 @@ desc = "Fake handcuffs meant for erotic roleplay." icon_state = "handcuffGag" -/obj/item/weapon/restraints/handcuffs/cable/attackby(obj/item/I, mob/user, params) - ..() - if(istype(I, /obj/item/stack/rods)) - var/obj/item/stack/rods/R = I - if (R.use(1)) - var/obj/item/weapon/wirerod/W = new /obj/item/weapon/wirerod - if(!remove_item_from_storage(user)) - user.unEquip(src) - user.put_in_hands(W) - user << "You wrap the cable restraint around the top of the rod." - qdel(src) - else - user << "You need one rod to make a wired rod!" - return - else if(istype(I, /obj/item/stack/sheet/metal)) - var/obj/item/stack/sheet/metal/M = I - if(M.amount < 6) - user << "You need at least six metal sheets to make good enough weights!" - return - user << "You begin to apply [I] to [src]..." - if(do_after(user, 35, target = src)) - var/obj/item/weapon/restraints/legcuffs/bola/S = new /obj/item/weapon/restraints/legcuffs/bola - M.use(6) - user.put_in_hands(S) - user << "You make some weights out of [I] and tie them to [src]." - if(!remove_item_from_storage(user)) - user.unEquip(src) - qdel(src) - else - return ..() - /obj/item/weapon/restraints/handcuffs/cable/zipties/cyborg/attack(mob/living/carbon/C, mob/user) if(isrobot(user)) if(!C.handcuffed) diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 29c3e7af930..fd681c0138e 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -69,24 +69,7 @@ add_implants() ready = 1 - src.updateUsrDialog() - return - - -/obj/machinery/implantchair/attackby(obj/item/weapon/W, mob/user, params) - if(istype(W, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = W - if(!ismob(G.affecting)) - return - var/mob/M = G.affecting - if(M.buckled_mobs.len) - user << "[M] will not fit into [src] because they have a creature on them!" - return - if(put_mob(M)) - qdel(G) - updateUsrDialog() - else - return ..() + updateUsrDialog() /obj/machinery/implantchair/go_out(mob/M) diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 7ad6d644047..448925b824c 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -23,7 +23,7 @@ obj/item/weapon/mop/proc/clean(turf/A) - if(reagents.has_reagent("water", 1) || reagents.has_reagent("holywater", 1) || reagents.has_reagent("vodka", 1)) + if(reagents.has_reagent("water", 1) || reagents.has_reagent("holywater", 1) || reagents.has_reagent("vodka", 1) || reagents.has_reagent("cleaner", 1)) A.clean_blood() for(var/obj/effect/O in A) if(is_cleanable(O)) @@ -31,7 +31,7 @@ obj/item/weapon/mop/proc/clean(turf/A) if(istype(A, /turf/closed)) var/turf/closed/C = A C.thermite = 0 - reagents.reaction(A, TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly. + reagents.reaction(A, TOUCH, 5) //Needed for proper floor wetting. reagents.remove_any(1) //reaction() doesn't use up the reagents diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index ce3249bcc2c..c9fb74a6826 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -85,7 +85,7 @@ qdel(src) singulo.process() return - ..() + . = ..() /obj/item/weapon/storage/backpack/holding/proc/failcheck(mob/user) if (prob(src.reliability)) return 1 //No failure diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 876a2816209..af415d016c8 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -198,6 +198,8 @@ if(!S.amount) qdel(S) else + if(S.pulledby) + S.pulledby.stop_pulling() S.loc = src orient2hud(usr) @@ -342,7 +344,7 @@ /obj/item/weapon/storage/bag/tray/handle_item_insertion(obj/item/I, prevent_warning = 0) overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = -1) - ..() + . = ..() /* diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 9f9d9eaa162..2a1cd3a1814 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -99,8 +99,8 @@ /obj/item/weapon/storage/fancy/cigarettes/New() ..() - flags |= NOREACT create_reagents(15 * storage_slots)//so people can inject cigarettes without opening a packet, now with being able to inject the whole one + reagents.set_reacting(FALSE) for(var/obj/item/clothing/mask/cigarette/cig in src) cig.desc = "\An [name] brand [cig.name]." name = "\improper [name] packet" diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 88b479e8591..7947a228a35 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -157,7 +157,7 @@ boxes.screen_loc = "[tx]:,[ty] to [mx],[my]" for(var/obj/O in contents) O.screen_loc = "[cx],[cy]" - O.layer = 20 + O.layer = ABOVE_HUD_LAYER cx++ if(cx > mx) cx = tx @@ -176,7 +176,7 @@ ND.sample_object.mouse_opacity = 2 ND.sample_object.screen_loc = "[cx]:16,[cy]:16" ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]" - ND.sample_object.layer = 20 + ND.sample_object.layer = ABOVE_HUD_LAYER cx++ if(cx > (4+cols)) cx = 4 @@ -186,7 +186,7 @@ O.mouse_opacity = 2 //This is here so storage items that spawn with contents correctly have the "click around item to equip" O.screen_loc = "[cx]:16,[cy]:16" O.maptext = "" - O.layer = 20 + O.layer = ABOVE_HUD_LAYER cx++ if(cx > (4+cols)) cx = 4 @@ -301,6 +301,8 @@ return 0 if(silent) prevent_warning = 1 + if(W.pulledby) + W.pulledby.stop_pulling() W.loc = src W.on_enter_storage(src) if(usr) @@ -462,11 +464,11 @@ boxes.master = src boxes.icon_state = "block" boxes.screen_loc = "7,7 to 10,8" - boxes.layer = 19 + boxes.layer = HUD_LAYER closer = new /obj/screen/close() closer.master = src closer.icon_state = "backpack_close" - closer.layer = 20 + closer.layer = ABOVE_HUD_LAYER orient2hud() diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index d3b45dcf87b..cc861ffaeb6 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -51,7 +51,7 @@ combined_access |= I.access /obj/item/weapon/storage/wallet/handle_item_insertion(obj/item/W, prevent_warning = 0) - . = ..(W, prevent_warning) + . = ..() if(.) if(istype(W, /obj/item/weapon/card/id)) refreshID() diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 54eb7d7910f..2177daf2c1d 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -93,7 +93,7 @@ /obj/item/weapon/tank/internals/plasma/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/flamethrower)) var/obj/item/weapon/flamethrower/F = W - if ((!F.status)||(F.ptank)) + if(F.ptank) return src.master = F F.ptank = src diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 9f7b37c2542..bd69eea0d60 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -202,7 +202,6 @@ materials = list(MAT_METAL=70, MAT_GLASS=30) origin_tech = "engineering=1" var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2) - var/status = 1 //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower) var/max_fuel = 20 //The max amount of fuel the welder can hold var/change_icons = 1 var/can_off_process = 0 @@ -244,16 +243,6 @@ user.visible_message("[user] welds \his every orifice closed! It looks like \he's trying to commit suicide..") return (FIRELOSS) - -/obj/item/weapon/weldingtool/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/screwdriver)) - flamethrower_screwdriver(I, user) - else if(istype(I, /obj/item/stack/rods)) - flamethrower_rods(I, user) - else - return ..() - - /obj/item/weapon/weldingtool/attack(mob/living/carbon/human/H, mob/user) if(!istype(H)) return ..() @@ -367,9 +356,6 @@ //Toggles the welder off and on /obj/item/weapon/weldingtool/proc/toggle(mob/user, message = 0) - if(!status) - user << "[src] can't be turned on while unsecured!" - return welding = !welding if(welding) if(get_fuel() >= 1) @@ -395,33 +381,6 @@ /obj/item/weapon/weldingtool/is_hot() return welding * heat -/obj/item/weapon/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user) - if(welding) - user << "Turn it off first!" - return - status = !status - if(status) - user << "You resecure [src]." - else - user << "[src] can now be attached and modified." - add_fingerprint(user) - -/obj/item/weapon/weldingtool/proc/flamethrower_rods(obj/item/I, mob/user) - if(!status) - var/obj/item/stack/rods/R = I - if (R.use(1)) - var/obj/item/weapon/flamethrower/F = new /obj/item/weapon/flamethrower(user.loc) - if(!remove_item_from_storage(F)) - user.unEquip(src) - loc = F - F.weldtool = src - add_fingerprint(user) - user << "You add a rod to a welder, starting to build a flamethrower." - user.put_in_hands(F) - else - user << "You need one rod to start building a flamethrower!" - return - /obj/item/weapon/weldingtool/largetank name = "industrial welding tool" desc = "A slightly larger welder with a larger tank." @@ -437,10 +396,6 @@ icon_state = "indwelder" toolspeed = 2 -/obj/item/weapon/weldingtool/largetank/flamethrower_screwdriver() - return - - /obj/item/weapon/weldingtool/mini name = "emergency welding tool" desc = "A miniature welder used during emergencies." @@ -450,10 +405,6 @@ materials = list(MAT_METAL=30, MAT_GLASS=10) change_icons = 0 -/obj/item/weapon/weldingtool/mini/flamethrower_screwdriver() - return - - /obj/item/weapon/weldingtool/hugetank name = "upgraded industrial welding tool" desc = "An upgraded welder based of the industrial welder." diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index c389b785427..58696ae9573 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -78,46 +78,6 @@ user.visible_message("[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.") return(BRUTELOSS) -/obj/item/weapon/wirerod - name = "wired rod" - desc = "A rod with some wire wrapped around the top. It'd be easy to attach something to the top bit." - icon_state = "wiredrod" - item_state = "rods" - flags = CONDUCT - force = 9 - throwforce = 10 - w_class = 3 - materials = list(MAT_METAL=1150, MAT_GLASS=75) - attack_verb = list("hit", "bludgeoned", "whacked", "bonked") - -/obj/item/weapon/wirerod/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/shard)) - var/obj/item/weapon/twohanded/spear/S = new /obj/item/weapon/twohanded/spear - - if(!remove_item_from_storage(user)) - user.unEquip(src) - user.unEquip(I) - - user.put_in_hands(S) - user << "You fasten the glass shard to the top of the rod with the cable." - qdel(I) - qdel(src) - - else if(istype(I, /obj/item/device/assembly/igniter) && !(I.flags & NODROP)) - var/obj/item/weapon/melee/baton/cattleprod/P = new /obj/item/weapon/melee/baton/cattleprod - - if(!remove_item_from_storage(user)) - user.unEquip(src) - user.unEquip(I) - - user.put_in_hands(P) - user << "You fasten [I] to the top of the rod with the cable." - qdel(I) - qdel(src) - else - return ..() - - /obj/item/weapon/throwing_star name = "throwing star" desc = "An ancient weapon still used to this day due to it's ease of lodging itself into victim's body parts" diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm index 0e0ff304900..6889a6cbdd5 100644 --- a/code/game/objects/structures/ai_core.dm +++ b/code/game/objects/structures/ai_core.dm @@ -141,7 +141,7 @@ user << "This MMI does not seem to fit!" return - if(M.syndiemmi) + if(M.hacked) user << "This MMI does not seem to fit!" return diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index ffe82b4c3c3..be576ce514b 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -162,7 +162,7 @@ desc = "A thick resin surface covers the floor." anchored = 1 density = 0 - layer = TURF_LAYER + 0.09 + layer = TURF_LAYER icon_state = "weeds" health = 15 var/obj/structure/alien/weeds/node/linked_node = null diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index 5186309b65e..afa7633b420 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -14,7 +14,7 @@ var/image/nest_overlay /obj/structure/bed/nest/New() - nest_overlay = image('icons/mob/alien.dmi', "nestoverlay", layer=MOB_LAYER - 0.2) + nest_overlay = image('icons/mob/alien.dmi', "nestoverlay", layer=LYING_MOB_LAYER) return ..() /obj/structure/bed/nest/user_unbuckle_mob(mob/living/buckled_mob, mob/living/user) @@ -73,7 +73,7 @@ if(M in buckled_mobs) M.pixel_y = 0 M.pixel_x = initial(M.pixel_x) + 2 - M.layer = MOB_LAYER - 0.3 + M.layer = BELOW_MOB_LAYER overlays += nest_overlay else M.pixel_x = M.get_standard_pixel_x_offset(M.lying) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index faf3b4b8cb3..c91e5d5978e 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -162,7 +162,7 @@ /obj/structure/chair/comfy/New() armrest = image("icons/obj/chairs.dmi", "comfychair_armrest") - armrest.layer = MOB_LAYER + 0.1 + armrest.layer = ABOVE_MOB_LAYER return ..() diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 415139938a2..535966a09f8 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -11,7 +11,7 @@ LINEN BINS icon_state = "sheetwhite" item_state = "bedsheet" slot_flags = SLOT_BACK - layer = 4 + layer = MOB_LAYER throwforce = 0 throw_speed = 1 throw_range = 2 @@ -28,9 +28,11 @@ LINEN BINS /obj/item/weapon/bedsheet/attack_self(mob/user) user.drop_item() if(layer == initial(layer)) - layer = 5 + layer = ABOVE_MOB_LAYER + user << "You cover yourself with [src]." else layer = initial(layer) + user << "You smooth [src] out beneath you." add_fingerprint(user) return diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 1265b21905c..8dd7a6138b2 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -381,10 +381,10 @@ /obj/structure/closet/AltClick(mob/user) ..() - if(!user.canUseTopic(user)) + if(!user.canUseTopic(src, be_close=TRUE)) user << "You can't do that right now!" return - if(opened || !secure || !in_range(src, user)) + if(opened || !secure) return else togglelock(user) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 8bf04d32eea..46d5f54b002 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -8,7 +8,7 @@ anchored = 1 density = 1 pixel_x = -16 - layer = 9 + layer = FLY_LAYER var/cut = FALSE var/log_amount = 10 diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 6d2412589de..ed54a367368 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -9,7 +9,7 @@ icon_state = "girder" anchored = 1 density = 1 - layer = 2.9 + layer = BELOW_OBJ_LAYER var/state = GIRDER_NORMAL var/girderpasschance = 20 // percentage chance that a projectile passes through the girder. var/can_displace = TRUE //If the girder can be moved around by wrenching it @@ -291,7 +291,6 @@ anchored = 0 state = GIRDER_DISPLACED girderpasschance = 25 - layer = 2.45 /obj/structure/girder/reinforced name = "reinforced girder" diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 745d27a0e5c..b2b5bf94732 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -7,7 +7,7 @@ anchored = 1 flags = CONDUCT pressure_resistance = 5*ONE_ATMOSPHERE - layer = 2.9 + layer = BELOW_OBJ_LAYER var/health = 10 var/destroyed = 0 var/obj/item/stack/rods/stored diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index fb32d2d03ba..998a6820328 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -50,38 +50,37 @@ qdel(src) else user << "You can't do that while something's on the spike!" - - else if(istype(I, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = I - if(istype(G.affecting, /mob/living/)) - if(!buckled_mobs.len) - if(do_mob(user, src, 120)) - if(buckled_mobs.len) //to prevent spam/queing up attacks - return - if(G.affecting.buckled) - return - var/mob/living/H = G.affecting - playsound(src.loc, "sound/effects/splat.ogg", 25, 1) - H.visible_message("[user] slams [G.affecting] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.") - H.loc = src.loc - H.emote("scream") - if(istype(H, /mob/living/carbon/human)) //So you don't get human blood when you spike a giant spidere - var/turf/pos = get_turf(H) - pos.add_blood_floor(H) - H.adjustBruteLoss(30) - H.buckled = src - H.dir = 2 - buckle_mob(H, force=1) - var/matrix/m180 = matrix(H.transform) - m180.Turn(180) - animate(H, transform = m180, time = 3) - H.pixel_y = H.get_standard_pixel_y_offset(180) - qdel(G) - return - user << "You can't use that on the spike!" else return ..() +/obj/structure/kitchenspike/attack_hand(mob/user) + if(user.pulling && isliving(user.pulling) && user.a_intent == "grab" && !buckled_mobs.len) + var/mob/living/L = user.pulling + if(do_mob(user, src, 120)) + if(buckled_mobs.len) //to prevent spam/queing up attacks + return + if(L.buckled) + return + playsound(src.loc, "sound/effects/splat.ogg", 25, 1) + L.visible_message("[user] slams [L] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.") + L.loc = src.loc + L.emote("scream") + if(ishuman(L)) //So you don't get human blood when you spike a giant spider + var/turf/pos = get_turf(L) + pos.add_blood_floor(L) + L.adjustBruteLoss(30) + L.buckled = src + L.dir = 2 + buckle_mob(L, force=1) + var/matrix/m180 = matrix(L.transform) + m180.Turn(180) + animate(L, transform = m180, time = 3) + L.pixel_y = L.get_standard_pixel_y_offset(180) + else + ..() + + + /obj/structure/kitchenspike/user_buckle_mob(mob/living/M, mob/living/user) //Don't want them getting put on the rack other than by spiking return diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index d5dc481041d..8c23c5046cc 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -66,7 +66,7 @@ go_up(user,is_ghost) else if(down) go_down(user,is_ghost) - + if(!is_ghost) add_fingerprint(user) @@ -92,6 +92,8 @@ /obj/structure/ladder/proc/can_use(mob/user) return 1 -/obj/structure/ladder/unbreakable/Destroy() - return QDEL_HINT_LETMELIVE - +/obj/structure/ladder/unbreakable/Destroy(force) + if(force) + . = ..() + else + return QDEL_HINT_LETMELIVE diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index c676d5882ce..399253f5a17 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -5,7 +5,7 @@ icon_state = "lattice" density = 0 anchored = 1 - layer = 2.3 //under pipes + layer = LATTICE_LAYER //under pipes var/obj/item/stack/rods/stored canSmoothWith = list(/obj/structure/lattice, /turf/open/floor, diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 03b9f323307..e142ca61091 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -211,7 +211,7 @@ var/global/list/crematoriums = new/list() /obj/structure/tray icon = 'icons/obj/stationobjs.dmi' density = 1 - layer = 2.9 + layer = BELOW_OBJ_LAYER var/obj/structure/bodycontainer/connected = null anchored = 1 pass_flags = LETPASSTHROW diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index ee8c28788a9..69603d9c9ed 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -5,7 +5,7 @@ icon_state = "plasticflaps" density = 0 anchored = 1 - layer = 4 + layer = ABOVE_MOB_LAYER /obj/structure/plasticflaps/CanAStarPass(ID, to_dir, caller) if(istype(caller, /mob/living)) diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index 48004def34a..ce55d863179 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -5,7 +5,7 @@ desc = "An angled mirror for reflecting lasers. This one does so at a 90 degree angle." anchored = 0 density = 1 - layer = 2.9 + layer = BELOW_OBJ_LAYER var/finished = 0 var/admin = 0 //Can't be rotated or deconstructed var/framebuildstacktype = /obj/item/stack/sheet/metal @@ -124,11 +124,9 @@ /obj/structure/reflector/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 rotate() diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 51679ceedf2..8cd1b6b101d 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -177,7 +177,7 @@ obj/structure/safe/ex_act(severity, target) icon_state = "floorsafe" density = 0 level = 1 //underfloor - layer = 2.5 + layer = LOW_OBJ_LAYER /obj/structure/safe/floor/initialize() diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 28cc59a701b..df5050da450 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -3,7 +3,7 @@ anchored = 1 opacity = 0 density = 0 - layer = 3.5 + layer = SIGN_LAYER /obj/structure/sign/basic name = "blank sign" diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm index c9e6167f88f..7dc62153c5d 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/game/objects/structures/table_frames.dm @@ -16,7 +16,7 @@ icon_state = "table_frame" density = 0 anchored = 0 - layer = 2.8 + layer = PROJECTILE_HIT_THRESHHOLD_LAYER var/framestack = /obj/item/stack/rods var/framestackamount = 2 diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index a38f9465763..a4dfb691ee1 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -19,7 +19,7 @@ icon_state = "table" density = 1 anchored = 1 - layer = 2.8 + layer = TABLE_LAYER climbable = TRUE pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.") var/frame = /obj/structure/table_frame @@ -97,6 +97,19 @@ take_damage(rand(180,280), BRUTE, 0) return 1 +/obj/structure/table/attack_hand(mob/living/user) + if(user.a_intent == "grab" && user.pulling && isliving(user.pulling)) + var/mob/living/pushed_mob = user.pulling + if(pushed_mob.buckled) + user << "[pushed_mob] is buckled to [pushed_mob.buckled]!" + return + if(user.grab_state < GRAB_AGGRESSIVE) + user << "You need a better grip to do that!" + return + tablepush(user, pushed_mob) + user.stop_pulling() + else + ..() /obj/structure/table/attack_tk() // no telehulk sorry return @@ -123,39 +136,15 @@ var/atom/movable/mover = caller . = . || mover.checkpass(PASSTABLE) -/obj/structure/table/proc/tablepush(obj/item/I, mob/user) - if(get_dist(src, user) < 2) - var/obj/item/weapon/grab/G = I - if(G.affecting.buckled) - user << "[G.affecting] is buckled to [G.affecting.buckled]!" - return 0 - if(G.state < GRAB_AGGRESSIVE) - user << "You need a better grip to do that!" - return 0 - if(!G.confirm()) - return 0 - G.affecting.forceMove(src.loc) - if(istype(src, /obj/structure/table/optable)) - var/obj/structure/table/optable/OT = src - G.affecting.resting = 1 - G.affecting.update_canmove() - visible_message("[G.assailant] has laid [G.affecting] on [src].") - OT.patient = G.affecting - OT.check_patient() - qdel(I) - return 1 - G.affecting.Weaken(2) - G.affecting.visible_message("[G.assailant] pushes [G.affecting] onto [src].", \ - "[G.assailant] pushes [G.affecting] onto [src].") - add_logs(G.assailant, G.affecting, "pushed") - qdel(I) - return 1 - qdel(I) +/obj/structure/table/proc/tablepush(mob/living/user, mob/living/pushed_mob) + pushed_mob.forceMove(src.loc) + pushed_mob.Weaken(2) + pushed_mob.visible_message("[user] pushes [pushed_mob] onto [src].", \ + "[user] pushes [pushed_mob] onto [src].") + add_logs(user, pushed_mob, "pushed") + /obj/structure/table/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/grab)) - tablepush(I, user) - return if(!(flags & NODECONSTRUCT)) if(istype(I, /obj/item/weapon/screwdriver) && deconstruction_ready) table_deconstruct(user, 1) @@ -297,10 +286,12 @@ /obj/structure/table/glass/proc/table_shatter(mob/M) visible_message("[src] breaks!", "You hear breaking glass.") - playsound(src.loc, "shatter", 50, 1) - for(var/i in debris) - var/atom/movable/AM = i - AM.loc = get_turf(src) + var/turf/T = get_turf(src) + playsound(T, "shatter", 50, 1) + for(var/I in debris) + var/atom/movable/AM = I + AM.forceMove(T) + debris -= AM if(istype(AM, /obj/item/weapon/shard)) AM.throw_impact(M) M.Weaken(5) @@ -325,7 +316,9 @@ buildstack = /obj/item/stack/sheet/mineral/wood burn_state = FLAMMABLE burntime = 20 - canSmoothWith = list(/obj/structure/table/wood, /obj/structure/table/wood/poker) + canSmoothWith = list(/obj/structure/table/wood, + /obj/structure/table/wood/poker, + /obj/structure/table/wood/bar) /obj/structure/table/wood/narsie_act() return @@ -336,7 +329,6 @@ icon = 'icons/obj/smooth_structures/poker_table.dmi' icon_state = "poker_table" buildstack = /obj/item/stack/tile/carpet - canSmoothWith = list(/obj/structure/table/wood/poker, /obj/structure/table/wood) /obj/structure/table/wood/poker/narsie_act() new /obj/structure/table/wood(src.loc) @@ -400,6 +392,13 @@ computer.table = src break +/obj/structure/table/optable/tablepush(mob/living/user, mob/living/pushed_mob) + pushed_mob.forceMove(src.loc) + pushed_mob.resting = 1 + pushed_mob.update_canmove() + visible_message("[user] has laid [pushed_mob] on [src].") + check_patient() + /obj/structure/table/optable/proc/check_patient() var/mob/M = locate(/mob/living/carbon/human, loc) if(M) diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index 0c931eb3b53..0a0d96eac20 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -27,7 +27,7 @@ pinned_target = T T.pinnedLoc = src T.density = 1 - T.layer = OBJ_LAYER + 0.1 + T.layer = OBJ_LAYER + 0.01 T.loc = loc user << "You slide the target into the stake." diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index e4bbee8dcf7..0f4e8e3f431 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -60,41 +60,44 @@ /obj/structure/transit_tube/station/attack_hand(mob/user) if(!pod_moving) - for(var/obj/structure/transit_tube_pod/pod in loc) - if(!pod.moving && pod.dir in directions()) - if(icon_state == "closed") - open_animation() + if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + if(icon_state == "open") + var/mob/living/GM = user.pulling + if(user.grab_state >= GRAB_AGGRESSIVE) + if(GM.buckled || GM.buckled_mobs.len) + user << "[GM] is attached to something!" + return + for(var/obj/structure/transit_tube_pod/pod in loc) + pod.visible_message("[user] starts putting [GM] into the [pod]!") + if(do_after(user, 15, target = src)) + if(GM && user.grab_state >= GRAB_AGGRESSIVE && user.pulling == GM && !GM.buckled && !GM.buckled_mobs.len) + GM.Weaken(5) + src.Bumped(GM) + break + else + for(var/obj/structure/transit_tube_pod/pod in loc) + if(!pod.moving && pod.dir in directions()) + if(icon_state == "closed") + open_animation() - else if(icon_state == "open") - if(pod.contents.len && user.loc != pod) - user.visible_message("[user] starts emptying [pod]'s contents onto the floor.", "You start emptying [pod]'s contents onto the floor...") - if(do_after(user, 10, target = src)) //So it doesn't default to close_animation() on fail - if(pod.loc == loc) - for(var/atom/movable/AM in pod) - AM.loc = get_turf(user) - if(ismob(AM)) - var/mob/M = AM - M.Weaken(5) + else if(icon_state == "open") + if(pod.contents.len && user.loc != pod) + user.visible_message("[user] starts emptying [pod]'s contents onto the floor.", "You start emptying [pod]'s contents onto the floor...") + if(do_after(user, 10, target = src)) //So it doesn't default to close_animation() on fail + if(pod.loc == loc) + for(var/atom/movable/AM in pod) + AM.loc = get_turf(user) + if(ismob(AM)) + var/mob/M = AM + M.Weaken(5) - else - close_animation() - break + else + close_animation() + break /obj/structure/transit_tube/station/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/weapon/grab)) - if(icon_state == "open") - var/obj/item/weapon/grab/G = W - if(ismob(G.affecting) && G.state >= GRAB_AGGRESSIVE) - var/mob/GM = G.affecting - for(var/obj/structure/transit_tube_pod/pod in loc) - pod.visible_message("[user] starts putting [GM] into the [pod]!") - if(do_after(user, 15, target = src) && GM && G && G.affecting == GM) - GM.Weaken(5) - src.Bumped(GM) - qdel(G) - break - else if(istype(W, /obj/item/weapon/crowbar)) + if(istype(W, /obj/item/weapon/crowbar)) for(var/obj/structure/transit_tube_pod/pod in loc) if(pod.contents) user << "Empty the pod first!" diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index bb7cc05d07c..5c42bb22445 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi' icon_state = "E-W" density = 1 - layer = 3.1 + layer = ABOVE_OBJ_LAYER anchored = 1 var/tube_construction = /obj/structure/c_transit_tube var/list/tube_dirs = null diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index ffcacef2f4b..8ce01aa0305 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi' icon_state = "E-W" //icon_state decides which tube will be built density = 0 - layer = 3.1 //same as the built tube + layer = ABOVE_OBJ_LAYER //same as the built tube anchored = 0 /obj/structure/c_transit_tube/examine(mob/user) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index f86fcf945fa..fea81bd9dcc 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -22,12 +22,37 @@ playsound(src.loc, "swing_hit", 25, 1) swirlie.visible_message("[user] slams the toilet seat onto [swirlie]'s head!", "[user] slams the toilet seat onto your head!", "You hear reverberating porcelain.") swirlie.adjustBruteLoss(5) - return - if(cistern && !open) + else if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + user.changeNext_move(CLICK_CD_MELEE) + var/mob/living/GM = user.pulling + if(user.grab_state >= GRAB_AGGRESSIVE) + if(GM.loc != get_turf(src)) + user << "[GM] needs to be on [src]!" + return + if(!swirlie) + if(open) + GM.visible_message("[user] starts to give [GM] a swirlie!", "[user] starts to give you a swirlie...") + swirlie = GM + if(do_after(user, 30, 0, target = src)) + GM.visible_message("[user] gives [GM] a swirlie!", "[user] gives you a swirlie!", "You hear a toilet flushing.") + if(iscarbon(GM)) + var/mob/living/carbon/C = GM + if(!C.internal) + C.adjustOxyLoss(5) + else + GM.adjustOxyLoss(5) + swirlie = null + else + playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) + GM.visible_message("[user] slams [GM.name] into [src]!", "[user] slams you into [src]!") + GM.adjustBruteLoss(5) + else + user << "You need a tighter grip!" + + else if(cistern && !open) if(!contents.len) user << "The cistern is empty." - return else var/obj/item/I = pick(contents) if(ishuman(user)) @@ -36,10 +61,9 @@ I.loc = get_turf(src) user << "You find [I] in the cistern." w_items -= I.w_class - return - - open = !open - update_icon() + else + open = !open + update_icon() /obj/structure/toilet/update_icon() @@ -54,7 +78,6 @@ user.visible_message("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!", "You hear grinding porcelain.") cistern = !cistern update_icon() - return else if(cistern) if(user.a_intent != "harm") @@ -70,7 +93,6 @@ I.loc = src w_items += I.w_class user << "You carefully place [I] into the cistern." - return else if(istype(I, /obj/item/weapon/reagent_containers)) if (!open) @@ -78,39 +100,6 @@ var/obj/item/weapon/reagent_containers/RG = I RG.reagents.add_reagent("water", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this)) user << "You fill [RG] from [src]. Gross." - return - - else if(istype(I, /obj/item/weapon/grab)) - user.changeNext_move(CLICK_CD_MELEE) - var/obj/item/weapon/grab/G = I - if(!G.confirm()) - return - if(isliving(G.affecting)) - var/mob/living/GM = G.affecting - if(G.state >= GRAB_AGGRESSIVE) - if(GM.loc != get_turf(src)) - user << "[GM] needs to be on [src]!" - return - if(!swirlie) - if(open) - GM.visible_message("[user] starts to give [GM] a swirlie!", "[user] starts to give you a swirlie...") - swirlie = GM - if(do_after(user, 30, 0, target = src)) - GM.visible_message("[user] gives [GM] a swirlie!", "[user] gives you a swirlie!", "You hear a toilet flushing.") - if(iscarbon(GM)) - var/mob/living/carbon/C = GM - if(!C.internal) - C.adjustOxyLoss(5) - else - GM.adjustOxyLoss(5) - swirlie = null - else - playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) - GM.visible_message("[user] slams [GM.name] into [src]!", "[user] slams you into [src]!") - GM.adjustBruteLoss(5) - else - user << "You need a tighter grip!" - else return ..() @@ -125,24 +114,20 @@ anchored = 1 -/obj/structure/urinal/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = I - if(!G.confirm()) - return - if(isliving(G.affecting)) - var/mob/living/GM = G.affecting - if(G.state >= GRAB_AGGRESSIVE) - if(GM.loc != get_turf(src)) - user << "[GM.name] needs to be on [src]." - return - user.changeNext_move(CLICK_CD_MELEE) - user.visible_message("[user] slams [GM] into [src]!", "You slam [GM] into [src]!") - GM.adjustBruteLoss(8) - else - user << "You need a tighter grip!" +/obj/structure/urinal/attack_hand(mob/user) + if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + var/mob/living/GM = user.pulling + if(user.grab_state >= GRAB_AGGRESSIVE) + if(GM.loc != get_turf(src)) + user << "[GM.name] needs to be on [src]." + return + user.changeNext_move(CLICK_CD_MELEE) + user.visible_message("[user] slams [GM] into [src]!", "You slam [GM] into [src]!") + GM.adjustBruteLoss(8) + else + user << "You need a tighter grip!" else - return ..() + ..() /obj/machinery/shower name = "shower" @@ -162,7 +147,7 @@ name = "mist" icon = 'icons/obj/watercloset.dmi' icon_state = "mist" - layer = MOB_LAYER + 1 + layer = FLY_LAYER anchored = 1 mouse_opacity = 0 @@ -182,7 +167,7 @@ else if(istype(loc, /turf/open)) var/turf/open/tile = loc - tile.MakeSlippery(min = 5, max = 1) + tile.MakeSlippery(min_wet_time = 5, wet_time_to_add = 1) /obj/machinery/shower/attackby(obj/item/I, mob/user, params) @@ -492,4 +477,4 @@ /obj/structure/sink/puddle/attackby(obj/item/O, mob/user, params) icon_state = "puddle-splash" . = ..() - icon_state = "puddle" \ No newline at end of file + icon_state = "puddle" diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index e81ee6965a7..15f57b2c55e 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -3,7 +3,7 @@ desc = "A window." icon_state = "window" density = 1 - layer = 3.2//Just above doors + layer = ABOVE_OBJ_LAYER //Just above doors pressure_resistance = 4*ONE_ATMOSPHERE anchored = 1 //initially is 0 for tile smoothing flags = ON_BORDER @@ -487,3 +487,6 @@ /obj/structure/window/shuttle/narsie_act() color = "#3C3434" + +/obj/structure/window/shuttle/tinted + opacity = TRUE diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 8384ac130e1..69058118212 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -1,6 +1,6 @@ /turf/closed var/thermite = 0 - + layer = CLOSED_TURF_LAYER opacity = 1 density = 1 blocks_air = 1 @@ -9,7 +9,6 @@ name = "wall" icon = 'icons/turf/walls.dmi' explosion_block = 50 - layer = TURF_LAYER + 0.05 /turf/closed/indestructible/splashscreen name = "Space Station 13" diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 7cf78cf3beb..a81b33ab048 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -95,10 +95,8 @@ C.spin(1,1) return 1 -/turf/open/proc/MakeSlippery(wet_setting = TURF_WET_WATER, min = 0, max = 0) // 1 = Water, 2 = Lube, 3 = Ice - wet_time += max - if(wet_time < min) - wet_time = min +/turf/open/proc/MakeSlippery(wet_setting = TURF_WET_WATER, min_wet_time = 0, wet_time_to_add = 0) // 1 = Water, 2 = Lube, 3 = Ice + wet_time = max(wet_time+wet_time_to_add, min_wet_time) if(wet >= wet_setting) return wet = wet_setting diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 98c55e9c555..bec463937c6 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -5,7 +5,6 @@ icon_state = "wall" var/mineral = "metal" explosion_block = 1 - layer = TURF_LAYER + 0.05 thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall @@ -223,7 +222,7 @@ O.anchored = 1 O.opacity = 1 O.density = 1 - O.layer = 5 + O.layer = FLY_LAYER playsound(src, 'sound/items/Welder.ogg', 100, 1) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 06581872610..b6663bfa960 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -19,8 +19,11 @@ update_icon() air = space_gas -/turf/open/space/Destroy() - return QDEL_HINT_LETMELIVE +/turf/open/space/Destroy(force) + if(force) + . = ..() + else + return QDEL_HINT_LETMELIVE /turf/open/space/Initalize_Atmos(times_fired) return diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 33971447d07..0db152579cf 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -299,3 +299,22 @@ /turf/proc/add_blueprints_preround(atom/movable/AM) if(!ticker || ticker.current_state != GAME_STATE_PLAYING) add_blueprints(AM) + +/turf/proc/empty(turf_type=/turf/open/space) + // Remove all atoms except observers, landmarks, docking ports + var/turf/T0 = src + for(var/A in T0.GetAllContents()) + if(istype(A, /mob/dead)) + continue + if(istype(A, /obj/effect/landmark)) + continue + if(istype(A, /obj/docking_port)) + continue + qdel(A, force=TRUE) + + T0.ChangeTurf(turf_type) + + T0.redraw_lighting() + SSair.remove_from_active(T0) + T0.CalculateAdjacentTurfs() + SSair.add_to_active(T0,1) diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 7f192fce020..f5421143b5b 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -157,6 +157,11 @@ /mob/living/proc/canSuicide() if(stat == CONSCIOUS) + if(mental_dominator) + src << "This body's force of will is too strong! You can't break it enough to murder them." + if(mind_control_holder) + mind_control_holder << "Through tremendous force of will, you stop a suicide attempt!" + return 0 return 1 else if(stat == DEAD) src << "You're already dead!" diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB_ban/functions.dm similarity index 100% rename from code/modules/admin/DB ban/functions.dm rename to code/modules/admin/DB_ban/functions.dm diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 91c0770c04d..11c21972abb 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -56,8 +56,6 @@ var/list/admin_verbs_admin = list( /client/proc/jumptoturf, /*allows us to jump to a specific turf*/ /client/proc/admin_call_shuttle, /*allows us to call the emergency shuttle*/ /client/proc/admin_cancel_shuttle, /*allows us to cancel the emergency shuttle, sending it back to centcom*/ - /client/proc/cmd_admin_destroy_shuttle, /* Destroys the emergency shuttle, allowing us to import a new shuttle template. Or just horribly fuck with the game. */ - /client/proc/cmd_admin_import_shuttle, /* Imports a emergency shuttle from a template, and sends it to its round start location. Probably should destroy the old one first.*/ /client/proc/cmd_admin_direct_narrate, /*send text directly to a player with no padding. Useful for narratives and fluff-text*/ /client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/ /client/proc/cmd_admin_local_narrate, /*sends text to all mobs within view of atom*/ diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 220b1b4c9e9..dfc910e5aa1 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -468,6 +468,16 @@ dat += "FLW" dat += "" + if(ticker.mode.servants_of_ratvar.len) + dat += "
" + for(var/datum/mind/N in ticker.mode.servants_of_ratvar) + var/mob/M = N.current + if(M) + dat += "" + dat += "" + dat += "" + dat += "
Servants of Ratvar
[M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""]PMFLW
" + if(ticker.mode.red_deities.len || ticker.mode.red_deity_prophets.len || ticker.mode.blue_deity_prophets.len || ticker.mode.red_deity_followers.len || ticker.mode.blue_deity_followers.len) dat += "
" 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+">",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:['
Red Deity
',"
"],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=''+t+"",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+=""),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