diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 82633fdc70..f67f095a4f 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,3 @@ -[Feature Freeze!]: # We are currently not considering any balance or antagonist oriented pull requests. Full details, as well as ways to bypass this freeze, are available here https://github.com/tgstation/tgstation/pull/28223 - - [Changelogs]: # (Please make a changelog if you're adding, removing or changing content that'll affect players. This includes, but is not limited to, new features, sprites, sounds; balance changes; map edits and important fixes) []: # (See here for how to easily make a changelog: https://github.com/tgstation/tgstation/wiki/Changelogs. An example changelog has been provided below. Please edit or remove) diff --git a/.travis.yml b/.travis.yml index c0a45df72d..ba11b40c97 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ language: generic sudo: false +dist: precise env: global: diff --git a/SQL/database_changelog.txt.rej b/SQL/database_changelog.txt.rej new file mode 100644 index 0000000000..1b201ec4aa --- /dev/null +++ b/SQL/database_changelog.txt.rej @@ -0,0 +1,15 @@ +diff a/SQL/database_changelog.txt b/SQL/database_changelog.txt (rejected hunks) +@@ -1,10 +1,10 @@ + Any time you make a change to the schema files, remember to increment the database schema version. Generally increment the minor number, major should be reserved for significant changes to the schema. Both values go up to 255. + +-The latest database version is 3.1; The query to update the schema revision table is: ++The latest database version is 3.0; The query to update the schema revision table is: + +-UPDATE `schema_revision` SET major = 3, minor = 1 LIMIT 1; ++INSERT INTO `schema_revision` (`major`, `minor`) VALUES (3, 0); + or +-UPDATE `SS13_schema_revision` SET major = 3, minor = 1 LIMIT 1; ++INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (3, 0); + + ---------------------------------------------------- + diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index f0f2d8a6c5..c47534925f 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -460,7 +460,7 @@ /area/ruin/powered/beach) "cz" = ( /obj/effect/turf_decal/sand, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plating/beach/sand, /area/ruin/powered/beach) "cR" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm index 408fe6ff1d..87137f7d14 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm @@ -896,7 +896,7 @@ /area/ruin/powered/clownplanet) "dR" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/indestructible/sound{ icon_state = "bananium"; name = "bananium floor"; diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm index de78fed108..ec1ce79bd8 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_animal_hospital.dmm @@ -809,7 +809,7 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "cF" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/mineral/titanium/nodiagonal, /area/ruin/powered/animal_hospital) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm index aed9b30686..3cae12bfe1 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm @@ -1071,7 +1071,7 @@ /area/ruin/unpowered/ash_walkers) "cE" = ( /obj/structure/stone_tile/surrounding/cracked, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/unpowered/ash_walkers) "cF" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm index 49ae2cb4f5..722cc92d78 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm @@ -275,7 +275,7 @@ }, /area/ruin/powered/snow_biodome) "bS" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plating/asteroid/snow{ initial_gas_mix = "o2=22;n2=82;TEMP=180" }, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm index ed4aee469d..875cfdc35d 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm @@ -163,7 +163,7 @@ /turf/open/floor/plasteel/cult{ initial_gas_mix = "o2=14;n2=23;TEMP=300" }, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/mineral/cult, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm index 66d7173097..773fc01f51 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm @@ -104,7 +104,7 @@ /turf/open/floor/plating, /area/ruin/unpowered) "r" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/rust, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm index 0c40aa2881..ab1d5764e1 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm @@ -29,7 +29,7 @@ /turf/open/floor/engine/cult, /area/ruin/unpowered) "i" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/engine/cult, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm index 97b44df094..3b1c555805 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm @@ -85,7 +85,7 @@ /turf/open/floor/plasteel/freezer, /area/ruin/powered/gluttony) "D" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plasteel/freezer, /area/ruin/powered/gluttony) "R" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm index fa1e394751..c993ecbb63 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_golem_ship.dmm @@ -285,7 +285,7 @@ /turf/open/floor/plating, /area/ruin/powered/golem_ship) "Y" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/mineral/titanium/purple, /area/ruin/powered/golem_ship) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm index 3d67d7b474..c81c510b9e 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm @@ -123,7 +123,7 @@ /turf/open/floor/engine/cult, /area/ruin/powered/greed) "z" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/engine/cult, /area/ruin/powered/greed) "J" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm index 896f13b1bb..2749e39f1f 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm @@ -180,7 +180,7 @@ }, /area/ruin/powered) "L" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plating/asteroid/basalt, /area/ruin/powered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm index 44c41f5b85..f14495c95c 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm @@ -342,7 +342,7 @@ /area/ruin/unpowered) "S" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/wood{ baseturf = /turf/open/floor/plating/asteroid/basalt/lava_land_surface; initial_gas_mix = "o2=14;n2=23;TEMP=300" diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm index b1dedc0cb3..38b5f5f64d 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm @@ -65,7 +65,7 @@ /turf/open/floor/mineral/silver, /area/ruin/powered/pride) "u" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/mineral/silver, /area/ruin/powered/pride) "G" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm index cb2686fe89..01ac536230 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm @@ -262,7 +262,7 @@ /turf/open/floor/plasteel/freezer, /area/ruin/powered/seedvault) "Z" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/r_wall, /area/ruin/powered/seedvault) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm index 89a8b50c39..5ae4227813 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm @@ -42,7 +42,7 @@ }, /area/ruin/unpowered) "h" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/sepia{ blocks_air = 0; slowdown = 10 diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm index 3392d60307..8d40c16d58 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm @@ -169,7 +169,7 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "B" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/mineral/titanium/survival/pod, /area/ruin/powered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm index a794b58db8..3962947551 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_swarmer_crash.dmm @@ -22,7 +22,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/unpowered) "g" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall/mineral/plastitanium, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm index be96830ca4..2893f3481f 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm @@ -1285,7 +1285,7 @@ }, /area/ruin/powered/syndicate_lava_base) "dd" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plasteel/vault{ dir = 5 }, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm index 22d341c7df..0c4dd60fb8 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm @@ -105,7 +105,7 @@ "s" = ( /obj/structure/table/optable/abductor, /obj/item/weapon/cautery/alien, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plating/abductor{ initial_gas_mix = "o2=16;n2=23;TEMP=300" }, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm index d139ee641b..fed94448d0 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm @@ -269,7 +269,7 @@ "W" = ( /obj/structure/alien/weeds, /obj/structure/alien/resin/wall, -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/ruin/xenonest) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm.rej b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm.rej new file mode 100644 index 0000000000..365cc7fdda --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm.rej @@ -0,0 +1,10 @@ +diff a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm (rejected hunks) +@@ -269,7 +269,7 @@ + "W" = ( + /obj/structure/alien/weeds, + /obj/structure/alien/resin/wall, +-/obj/effect/baseturf_helper, ++/obj/effect/baseturf_helper/lava_land/surface, + /turf/open/floor/plating/asteroid/basalt/lava_land_surface, + /area/ruin/unpowered/xenonest) + diff --git a/_maps/RandomZLevels/centcomAway.dmm b/_maps/RandomZLevels/centcomAway.dmm index 7b182a91c3..ea3d101368 100644 --- a/_maps/RandomZLevels/centcomAway.dmm +++ b/_maps/RandomZLevels/centcomAway.dmm @@ -1817,7 +1817,7 @@ /area/awaymission/centcomAway/courtroom) "fT" = ( /obj/machinery/door/airlock/centcom{ - name = "Centcom Security"; + name = "CentCom Security"; opacity = 1; req_access_txt = "101" }, @@ -1932,7 +1932,7 @@ /area/awaymission/centcomAway/courtroom) "gk" = ( /obj/machinery/door/airlock/centcom{ - name = "Centcom Security"; + name = "CentCom Security"; opacity = 1; req_access_txt = "101" }, @@ -3830,7 +3830,7 @@ /area/awaymission/centcomAway/thunderdome) "lO" = ( /obj/machinery/door/airlock/centcom{ - name = "Centcom Security"; + name = "CentCom Security"; opacity = 1; req_access_txt = "101" }, @@ -4170,7 +4170,7 @@ /area/awaymission/centcomAway/general) "mP" = ( /obj/machinery/door/airlock/centcom{ - name = "Centcom Security"; + name = "CentCom Security"; opacity = 1; req_access_txt = "101" }, diff --git a/_maps/basemap.dm b/_maps/basemap.dm index e5eb12f31b..db5a71afb2 100644 --- a/_maps/basemap.dm +++ b/_maps/basemap.dm @@ -1,4 +1,4 @@ -#include "map_files\generic\Centcomm.dmm" +#include "map_files\generic\CentCom.dmm" #include "map_files\generic\SpaceStation.dmm" #include "map_files\generic\Space.dmm" #include "map_files\generic\SpaceDock.dmm" diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index bf4263ffe6..c89e4e0422 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -60788,9 +60788,6 @@ /turf/open/floor/plasteel, /area/science/robotics/lab) "cHY" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 14e8acd6fd..72f9a75ebd 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -7457,9 +7457,6 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "aqr" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -68726,12 +68723,12 @@ /obj/item/weapon/folder/blue, /obj/item/clothing/under/rank/centcom_commander{ desc = "A replica of a jumpsuit worn by the highest ranking commanders under Nanotrasen's central command."; - name = "Replica Centcom officer's jumpsuit" + name = "Replica CentCom officer's jumpsuit" }, /obj/item/clothing/head/centhat{ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0); desc = "A replica hat of a Central Commander's attire. It has a small tag on it saying, 'It's good to be emperor.'"; - name = "Replica Centcom hat" + name = "Replica CentCom hat" }, /obj/machinery/computer/security/telescreen/entertainment{ pixel_x = -32 @@ -112682,9 +112679,6 @@ /turf/open/floor/plating, /area/engine/atmospherics_engine) "ept" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 9 }, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index c1a7cc70a7..65eb81a50e 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -79832,12 +79832,12 @@ "cVT" = ( /obj/structure/closet/wardrobe/mixed, /obj/item/clothing/under/rank/centcom_officer{ - desc = "A badge on the arm indicates that it's meant to be worn by Centcom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time."; - name = "\improper dusty old Centcom jumpsuit" + desc = "A badge on the arm indicates that it's meant to be worn by CentCom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time."; + name = "\improper dusty old CentCom jumpsuit" }, /obj/item/clothing/under/rank/centcom_commander{ - desc = "A badge on the arm indicates that it's meant to be worn by Centcom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time."; - name = "\improper dusty old Centcom jumpsuit" + desc = "A badge on the arm indicates that it's meant to be worn by CentCom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time."; + name = "\improper dusty old CentCom jumpsuit" }, /obj/effect/decal/cleanable/dirt{ desc = "A thin layer of dust coating the floor."; diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index 4c00524717..9b97eef1d5 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -1,4 +1,4 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( /turf/closed/indestructible/riveted/boss, /area/lavaland/surface/outdoors) @@ -1241,6 +1241,7 @@ d2 = 4; icon_state = "1-4" }, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/circuit, /area/mine/maintenance) "dy" = ( @@ -3399,17 +3400,27 @@ /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) "Wt" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall, /area/mine/laborcamp/security) "Wu" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/closed/wall, /area/mine/laborcamp) "Ww" = ( -/obj/effect/baseturf_helper, +/obj/effect/baseturf_helper/lava_land/surface, /turf/open/floor/plasteel, /area/mine/living_quarters) +"Wx" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/open/floor/plasteel/brown{ + dir = 4 + }, +/area/mine/eva) +"Wy" = ( +/obj/effect/baseturf_helper/lava_land/surface, +/turf/open/floor/plasteel, +/area/mine/production) (1,1,1) = {" aa @@ -19057,7 +19068,7 @@ cI cP cn bP -bP +Wy bP bP eD @@ -19570,7 +19581,7 @@ bf cK bq bq -dt +br bq dV el @@ -20335,7 +20346,7 @@ bf bp bu bI -bW +Wx cr bf ad diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 60495dcf55..020a963662 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -5039,7 +5039,6 @@ name = "Detective Privacy Blast door" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/security/detectives_office) "aix" = ( @@ -32004,7 +32003,6 @@ "bcM" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/vault{ dir = 5 }, diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index b46901c890..b4b78673a1 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -1037,6 +1037,7 @@ icon_state = "1-8" }, /obj/machinery/turretid{ + control_area = "AI Chamber"; name = "AI Chamber turret control"; pixel_x = 5; pixel_y = -24 @@ -1055,7 +1056,8 @@ /area/wreck/ai) "acs" = ( /obj/machinery/turretid{ - name = "AI Chamber turret control"; + control_area = "AI Satellite Antechamber"; + name = "AI Satellite turret control"; pixel_x = -5; pixel_y = -24 }, @@ -1777,10 +1779,12 @@ /turf/open/floor/plating, /area/ai_monitored/turret_protected/AIsatextAP) "aeg" = ( -/obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/space, -/area/ai_monitored/turret_protected/AIsatextAP) +/obj/machinery/porta_turret/ai{ + installation = /obj/item/weapon/gun/energy/e_gun + }, +/turf/open/floor/plating/airless, +/area/ai_monitored/turret_protected/aisat_interior) "aeh" = ( /obj/structure/window/reinforced/fulltile, /turf/open/floor/plating, @@ -1794,10 +1798,12 @@ /turf/open/floor/plasteel/black, /area/ai_monitored/turret_protected/aisat_interior) "aej" = ( -/obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/space, -/area/ai_monitored/turret_protected/AIsatextAS) +/obj/machinery/porta_turret/ai{ + installation = /obj/item/weapon/gun/energy/e_gun + }, +/turf/open/floor/plating/airless, +/area/ai_monitored/turret_protected/aisat_interior) "aek" = ( /obj/structure/window/reinforced/fulltile, /turf/open/floor/plating, @@ -47042,7 +47048,6 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/black, /area/engine/engine_smes) "bYi" = ( @@ -49670,7 +49675,7 @@ /turf/open/floor/plating, /area/maintenance/department/engine) "cdF" = ( -/obj/structure/closet/secure_closet/miner, +/obj/structure/closet/secure_closet/miner/unlocked, /turf/open/floor/plating, /area/shuttle/auxillary_base) "cdG" = ( @@ -53682,6 +53687,39 @@ dir = 4 }, /area/science/research/lobby) +"cnC" = ( +/obj/machinery/turretid{ + control_area = "AI Satellite Antechamber"; + name = "AI Satellite turret control"; + pixel_x = -5; + pixel_y = -24 + }, +/turf/open/floor/plasteel/darkblue/side{ + dir = 8 + }, +/area/ai_monitored/turret_protected/aisat_interior) +"cnD" = ( +/turf/open/space/basic, +/area/ai_monitored/turret_protected/AIsatextAP) +"cnE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/lattice, +/turf/open/space/basic, +/area/ai_monitored/turret_protected/AIsatextAP) +"cnF" = ( +/turf/open/space/basic, +/area/ai_monitored/turret_protected/AIsatextAP) +"cnG" = ( +/turf/open/space/basic, +/area/ai_monitored/turret_protected/AIsatextAS) +"cnH" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/space/basic, +/area/ai_monitored/turret_protected/AIsatextAS) +"cnI" = ( +/turf/open/space/basic, +/area/ai_monitored/turret_protected/AIsatextAS) (1,1,1) = {" aaa @@ -71585,7 +71623,7 @@ bWV bWV bWV bWV -ccI +cbR bWV bWV ceP @@ -84314,7 +84352,7 @@ aaa aaa aaa aaa -aaa +aby aby aby aby @@ -84557,7 +84595,6 @@ aaa aaa aaa aaa -aaa aby aby aby @@ -84581,6 +84618,7 @@ aaa abI aaa aaa +aaa acP acP acP @@ -84816,7 +84854,6 @@ aaa aaa aaa aaa -aaa abI aaa aaa @@ -84838,6 +84875,7 @@ adS adS adS adS +adS aeJ aeY aft @@ -85071,7 +85109,6 @@ aaa aaa aaa aaa -aaa aby aaa abO @@ -85094,6 +85131,7 @@ adH adT aee aee +aee aev adv aeZ @@ -85328,7 +85366,6 @@ aaa aaa aaa aaa -aaa aby abI abO @@ -85351,6 +85388,7 @@ adI adU aef aef +aef aew aeK afa @@ -85585,7 +85623,6 @@ aaa aaa aaa aaa -aaa aby aaa abO @@ -85607,6 +85644,7 @@ adu adJ adV adV +cnD adV adV aeL @@ -85842,7 +85880,6 @@ aaa aaa aaa aaa -aaa aby aaa abO @@ -85864,6 +85901,7 @@ adv adK adW aeg +cnE aeg aex aeM @@ -86099,7 +86137,6 @@ aaa aaa aaa aaa -aaa aby aaa abO @@ -86121,6 +86158,7 @@ adw adL adV adV +cnF adV adV aeN @@ -86356,7 +86394,6 @@ aaa aaa aaa aaa -aaa aby aaa abO @@ -86379,12 +86416,13 @@ adL adX aeh aeh +aeh adX aeN afe afx afx -afx +cnC adX adX adX @@ -86613,7 +86651,6 @@ aaa aaa aaa aaa -aaa aby abJ abO @@ -86636,6 +86673,7 @@ adM adY aei aei +aei aey aeO aff @@ -86870,7 +86908,6 @@ aaa aaa aaa aaa -aaa aby aaa abO @@ -86893,6 +86930,7 @@ adL adX aeh aeh +aeh adX aeN afg @@ -87127,7 +87165,6 @@ aaa aaa aaa aaa -aaa aby aaa abO @@ -87149,6 +87186,7 @@ adA adL adZ adZ +cnG adZ adZ aeP @@ -87384,7 +87422,6 @@ aaa aaa aaa aaa -aaa aby aaa abO @@ -87406,6 +87443,7 @@ adB adN aea aej +cnH aej aez aeQ @@ -87641,7 +87679,6 @@ aaa aaa aaa aaa -aaa aby aaa abO @@ -87663,6 +87700,7 @@ adC adO adZ adZ +cnI adZ adZ aeR @@ -87898,7 +87936,6 @@ aaa aaa aaa aaa -aaa aby abI abO @@ -87921,6 +87958,7 @@ adP aeb aek aek +aek aeA adF afk @@ -88155,7 +88193,6 @@ aaa aaa aaa aaa -aaa aby aaa abO @@ -88178,6 +88215,7 @@ adQ aec ael ael +ael aeB aeS afl @@ -88414,7 +88452,6 @@ aaa aaa aaa aaa -aaa abI aaa aaa @@ -88437,6 +88474,7 @@ acU acU acU acU +acU afm afB afT @@ -88669,7 +88707,6 @@ aaa aaa aaa aaa -aaa aby aby aby @@ -88693,6 +88730,7 @@ aaa abI aaa aaa +aaa acU acU acU @@ -88939,7 +88977,6 @@ aaa aaa aaa aaa -aaa acO aby aby @@ -88949,6 +88986,7 @@ aby aby aby aby +aby aaa abI aaa diff --git a/_maps/map_files/generic/Centcomm.dmm b/_maps/map_files/generic/CentCom.dmm similarity index 99% rename from _maps/map_files/generic/Centcomm.dmm rename to _maps/map_files/generic/CentCom.dmm index d996a0d7e8..6069ddfa01 100644 --- a/_maps/map_files/generic/Centcomm.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -2922,7 +2922,7 @@ /area/centcom/prison) "iG" = ( /turf/closed/indestructible/fakedoor{ - name = "Centcom Cell" + name = "CentCom Cell" }, /area/centcom/prison) "iH" = ( @@ -2957,7 +2957,7 @@ /area/centcom/supply) "iL" = ( /turf/closed/indestructible/fakedoor{ - name = "Centcom Warehouse" + name = "CentCom Warehouse" }, /area/centcom/supply) "iM" = ( @@ -3063,7 +3063,7 @@ "jc" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/centcom{ - name = "Centcom"; + name = "CentCom"; opacity = 1; req_access_txt = "0" }, @@ -3326,7 +3326,7 @@ dwidth = 5; height = 7; id = "supply_away"; - name = "Centcom"; + name = "CentCom"; width = 12 }, /turf/open/space, @@ -3817,7 +3817,7 @@ /area/centcom/supply) "kM" = ( /turf/closed/indestructible/fakedoor{ - name = "Centcom" + name = "CentCom" }, /area/centcom/control) "kN" = ( @@ -3866,7 +3866,7 @@ /area/centcom/control) "kT" = ( /obj/machinery/door/airlock/centcom{ - name = "Centcom Security"; + name = "CentCom Security"; opacity = 1; req_access_txt = "101" }, @@ -3880,7 +3880,7 @@ base_state = "rightsecure"; dir = 2; icon_state = "leftsecure"; - name = "Centcom Stand"; + name = "CentCom Stand"; req_access_txt = "109" }, /obj/machinery/light{ @@ -3917,7 +3917,7 @@ base_state = "rightsecure"; dir = 2; icon_state = "leftsecure"; - name = "Centcom Stand"; + name = "CentCom Stand"; req_access_txt = "109" }, /turf/open/floor/plasteel/grimy, @@ -3936,7 +3936,7 @@ base_state = "rightsecure"; dir = 2; icon_state = "leftsecure"; - name = "Centcom Stand"; + name = "CentCom Stand"; req_access_txt = "109" }, /obj/machinery/light{ @@ -3960,7 +3960,7 @@ /area/centcom/supply) "lc" = ( /obj/machinery/door/airlock/centcom{ - name = "Centcom Supply"; + name = "CentCom Supply"; req_access_txt = "106" }, /obj/effect/turf_decal/stripes/line{ @@ -4157,7 +4157,7 @@ /area/centcom/control) "lB" = ( /obj/machinery/door/airlock/centcom{ - name = "Centcom Security"; + name = "CentCom Security"; opacity = 1; req_access_txt = "101" }, @@ -4752,7 +4752,7 @@ base_state = "rightsecure"; dir = 2; icon_state = "leftsecure"; - name = "Centcom Stand"; + name = "CentCom Stand"; req_access_txt = "109" }, /obj/machinery/firealarm{ @@ -4768,7 +4768,7 @@ base_state = "rightsecure"; dir = 2; icon_state = "leftsecure"; - name = "Centcom Stand"; + name = "CentCom Stand"; req_access_txt = "109" }, /obj/machinery/firealarm{ @@ -5237,7 +5237,7 @@ /obj/structure/table/reinforced, /obj/machinery/door/firedoor, /obj/machinery/door/window/brigdoor{ - name = "Centcom Customs"; + name = "CentCom Customs"; icon_state = "rightsecure"; dir = 4; req_access_txt = "109"; @@ -5767,7 +5767,7 @@ /area/centcom/ferry) "pu" = ( /obj/machinery/door/airlock/centcom{ - name = "Centcom Security"; + name = "CentCom Security"; opacity = 1; req_access_txt = "101" }, @@ -5778,7 +5778,7 @@ /area/centcom/supply) "pv" = ( /obj/machinery/door/airlock/centcom{ - name = "Centcom"; + name = "CentCom"; opacity = 1; req_access_txt = "0" }, @@ -6455,7 +6455,7 @@ /area/centcom/control) "qQ" = ( /obj/machinery/door/airlock/centcom{ - name = "Centcom Security"; + name = "CentCom Security"; opacity = 1; req_access_txt = "101" }, @@ -6652,7 +6652,7 @@ /area/centcom/ferry) "rw" = ( /obj/machinery/door/airlock/centcom{ - name = "Centcom Supply"; + name = "CentCom Supply"; req_access_txt = "106" }, /obj/effect/turf_decal/stripes/line{ @@ -6906,7 +6906,7 @@ "rW" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/centcom{ - name = "Centcom"; + name = "CentCom"; opacity = 1; req_access_txt = "0" }, @@ -7324,7 +7324,7 @@ base_state = "rightsecure"; dir = 1; icon_state = "rightsecure"; - name = "Centcom Customs"; + name = "CentCom Customs"; req_access_txt = "109" }, /obj/machinery/door/window, @@ -7352,7 +7352,7 @@ dwidth = 25; height = 50; id = "emergency_away"; - name = "Centcom Emergency Shuttle Dock"; + name = "CentCom Emergency Shuttle Dock"; width = 50 }, /turf/open/space, @@ -7733,7 +7733,7 @@ "tZ" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/centcom{ - name = "Centcom Security"; + name = "CentCom Security"; opacity = 1; req_access_txt = "101" }, @@ -7787,7 +7787,7 @@ /area/centcom/ferry) "ug" = ( /obj/machinery/door/airlock/centcom{ - name = "Centcom Customs"; + name = "CentCom Customs"; opacity = 1; req_access_txt = "109" }, @@ -7928,7 +7928,7 @@ dwidth = 2; height = 13; id = "ferry_away"; - name = "Centcom Ferry Dock"; + name = "CentCom Ferry Dock"; width = 5 }, /turf/open/space, @@ -9168,7 +9168,7 @@ base_state = "rightsecure"; dir = 1; icon_state = "rightsecure"; - name = "Centcom Customs"; + name = "CentCom Customs"; req_access_txt = "109" }, /obj/effect/turf_decal/bot, @@ -9192,7 +9192,7 @@ base_state = "rightsecure"; dir = 1; icon_state = "rightsecure"; - name = "Centcom Customs"; + name = "CentCom Customs"; req_access_txt = "109" }, /obj/effect/turf_decal/bot, @@ -9759,7 +9759,7 @@ /obj/item/weapon/folder/red, /obj/item/weapon/pen/red, /obj/machinery/door/window/brigdoor{ - name = "Centcom Customs"; + name = "CentCom Customs"; icon_state = "rightsecure"; dir = 4; req_access_txt = "109"; @@ -9774,7 +9774,7 @@ /obj/item/weapon/folder/white, /obj/item/weapon/pen/blue, /obj/machinery/door/window/brigdoor{ - name = "Centcom Customs"; + name = "CentCom Customs"; icon_state = "rightsecure"; dir = 8; req_access_txt = "109"; @@ -10061,7 +10061,7 @@ /area/tdome/tdomeobserve) "zT" = ( /obj/machinery/door/airlock/centcom{ - name = "Centcom Security"; + name = "CentCom Security"; opacity = 1; req_access_txt = "101" }, @@ -13647,7 +13647,7 @@ /area/centcom/evac) "Mb" = ( /obj/machinery/door/airlock/centcom{ - name = "Centcom Security"; + name = "CentCom Security"; opacity = 1; req_access_txt = "101" }, @@ -13658,7 +13658,7 @@ /area/centcom/evac) "Mc" = ( /turf/closed/indestructible/fakedoor{ - name = "Centcom" + name = "CentCom" }, /area/centcom/evac) "Md" = ( diff --git a/_maps/shuttles/emergency_raven.dmm b/_maps/shuttles/emergency_raven.dmm index 7382695c40..856a118521 100644 --- a/_maps/shuttles/emergency_raven.dmm +++ b/_maps/shuttles/emergency_raven.dmm @@ -1,7 +1,7 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( /turf/open/space, -/obj/machinery/porta_turret/centcomm_shuttle{ +/obj/machinery/porta_turret/centcom_shuttle{ dir = 9 }, /turf/closed/wall/mineral/plastitanium{ @@ -623,7 +623,7 @@ /obj/docking_port/mobile/emergency{ dwidth = 14; height = 18; - name = "Centcomm Raven Battlecruiser"; + name = "CentCom Raven Battlecruiser"; timid = 1; width = 32 }, @@ -980,7 +980,7 @@ /area/shuttle/escape) "cr" = ( /turf/open/space, -/obj/machinery/porta_turret/centcomm_shuttle{ +/obj/machinery/porta_turret/centcom_shuttle{ dir = 5 }, /turf/closed/wall/mineral/plastitanium{ @@ -1006,7 +1006,7 @@ /area/shuttle/escape) "cw" = ( /turf/open/space, -/obj/machinery/porta_turret/centcomm_shuttle{ +/obj/machinery/porta_turret/centcom_shuttle{ dir = 5 }, /turf/closed/wall/mineral/plastitanium{ @@ -1108,7 +1108,7 @@ /area/shuttle/escape) "cR" = ( /turf/open/space, -/obj/machinery/porta_turret/centcomm_shuttle{ +/obj/machinery/porta_turret/centcom_shuttle{ dir = 5 }, /turf/closed/wall/mineral/plastitanium{ @@ -1311,7 +1311,7 @@ /area/shuttle/escape) "dQ" = ( /turf/open/space, -/obj/machinery/porta_turret/centcomm_shuttle{ +/obj/machinery/porta_turret/centcom_shuttle{ dir = 5 }, /turf/closed/wall/mineral/plastitanium{ @@ -1333,7 +1333,7 @@ /area/shuttle/escape) "dV" = ( /turf/open/space, -/obj/machinery/porta_turret/centcomm_shuttle{ +/obj/machinery/porta_turret/centcom_shuttle{ dir = 5 }, /turf/closed/wall/mineral/plastitanium{ @@ -1379,7 +1379,7 @@ /area/shuttle/escape) "ei" = ( /turf/open/space, -/obj/machinery/porta_turret/centcomm_shuttle{ +/obj/machinery/porta_turret/centcom_shuttle{ dir = 10 }, /turf/closed/wall/mineral/plastitanium{ @@ -1400,7 +1400,7 @@ /area/shuttle/escape) "en" = ( /turf/open/space, -/obj/machinery/porta_turret/centcomm_shuttle{ +/obj/machinery/porta_turret/centcom_shuttle{ dir = 6 }, /turf/closed/wall/mineral/plastitanium{ @@ -1461,7 +1461,7 @@ /area/shuttle/escape) "eA" = ( /turf/open/space, -/obj/machinery/porta_turret/centcomm_shuttle{ +/obj/machinery/porta_turret/centcom_shuttle{ dir = 5 }, /turf/closed/wall/mineral/plastitanium{ diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm index 2ed07a1004..40ca9e23cf 100644 --- a/_maps/shuttles/whiteship_meta.dmm +++ b/_maps/shuttles/whiteship_meta.dmm @@ -131,12 +131,12 @@ "aq" = ( /obj/structure/closet/wardrobe/mixed, /obj/item/clothing/under/rank/centcom_officer{ - desc = "A badge on the arm indicates that it's meant to be worn by Centcom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time."; - name = "\improper dusty old Centcom jumpsuit" + desc = "A badge on the arm indicates that it's meant to be worn by CentCom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time."; + name = "\improper dusty old CentCom jumpsuit" }, /obj/item/clothing/under/rank/centcom_commander{ - desc = "A badge on the arm indicates that it's meant to be worn by Centcom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time."; - name = "\improper dusty old Centcom jumpsuit" + desc = "A badge on the arm indicates that it's meant to be worn by CentCom recovery teams. This one seems dusty and clearly hasn't been cleaned in some time."; + name = "\improper dusty old CentCom jumpsuit" }, /obj/effect/decal/cleanable/dirt{ desc = "A thin layer of dust coating the floor."; diff --git a/apc_repair.dmi b/apc_repair.dmi new file mode 100644 index 0000000000..6e861eef61 Binary files /dev/null and b/apc_repair.dmi differ diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index e557a55e7c..2e93a2a63c 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -76,7 +76,7 @@ #define ACCESS_CENT_STORAGE 106//Generic storage areas. #define ACCESS_CENT_TELEPORTER 107//Teleporter. #define ACCESS_CENT_CAPTAIN 109//Captain's office/ID comp/AI. -#define ACCESS_CENT_BAR 110 // The non-existent Centcom Bar +#define ACCESS_CENT_BAR 110 // The non-existent CentCom Bar //The Syndicate #define ACCESS_SYNDICATE 150//General Syndicate Access @@ -93,4 +93,9 @@ #define ACCESS_AWAY_GENERIC1 205//Away generic access #define ACCESS_AWAY_GENERIC2 206 #define ACCESS_AWAY_GENERIC3 207 -#define ACCESS_AWAY_GENERIC4 208 \ No newline at end of file +#define ACCESS_AWAY_GENERIC4 208 + + //Special, for anything that's basically internal +#define ACCESS_BLOODCULT 250 +#define ACCESS_CLOCKCULT 251 + diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index d3937d50bb..da945e52e6 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -50,7 +50,7 @@ #define ADMIN_SM(user) "(SM)" #define ADMIN_TP(user) "(TP)" #define ADMIN_KICK(user) "(KICK)" -#define ADMIN_CENTCOM_REPLY(user) "(RPLY)" +#define ADMIN_CENTCOM_REPLY(user) "(RPLY)" #define ADMIN_SYNDICATE_REPLY(user) "(RPLY)" #define ADMIN_SC(user) "(SC)" #define ADMIN_SMITE(user) "(SMITE)" diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index c74bf9c61e..0bedf57620 100644 --- a/code/__DEFINES/clockcult.dm +++ b/code/__DEFINES/clockcult.dm @@ -7,6 +7,7 @@ GLOBAL_VAR_INIT(clockwork_construction_value, 0) //The total value of all structures built by the clockwork cult GLOBAL_VAR_INIT(clockwork_caches, 0) //How many clockwork caches exist in the world (not each individual) +GLOBAL_VAR_INIT(clockwork_vitality, 0) //How much Vitality is stored, total GLOBAL_LIST_EMPTY(active_daemons) //A list of all active tinkerer's daemons GLOBAL_LIST_EMPTY(all_clockwork_objects) //All clockwork items, structures, and effects in existence GLOBAL_LIST_EMPTY(all_clockwork_mobs) //All clockwork SERVANTS (not creatures) in existence diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index 82d030bf08..24e10a24d1 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -1,15 +1,16 @@ //Investigate logging defines -#define INVESTIGATE_ATMOS "atmos" -#define INVESTIGATE_BOTANY "botany" -#define INVESTIGATE_CARGO "cargo" -#define INVESTIGATE_EXPERIMENTOR "experimentor" -#define INVESTIGATE_GRAVITY "gravity" -#define INVESTIGATE_RECORDS "records" -#define INVESTIGATE_SINGULO "singulo" -#define INVESTIGATE_SUPERMATTER "supermatter" -#define INVESTIGATE_TELESCI "telesci" -#define INVESTIGATE_WIRES "wires" +#define INVESTIGATE_ATMOS "atmos" +#define INVESTIGATE_BOTANY "botany" +#define INVESTIGATE_CARGO "cargo" +#define INVESTIGATE_EXPERIMENTOR "experimentor" +#define INVESTIGATE_GRAVITY "gravity" +#define INVESTIGATE_RECORDS "records" +#define INVESTIGATE_SINGULO "singulo" +#define INVESTIGATE_SUPERMATTER "supermatter" +#define INVESTIGATE_TELESCI "telesci" +#define INVESTIGATE_WIRES "wires" #define INVESTIGATE_PORTAL "portals" +#define INVESTIGATE_HALLUCINATIONS "hallucinations" //Individual logging defines #define INDIVIDUAL_ATTACK_LOG "Attack log" diff --git a/code/__DEFINES/logging.dm.rej b/code/__DEFINES/logging.dm.rej new file mode 100644 index 0000000000..6a7a358a9c --- /dev/null +++ b/code/__DEFINES/logging.dm.rej @@ -0,0 +1,9 @@ +diff a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm (rejected hunks) +@@ -9,6 +9,7 @@ + #define INVESTIGATE_SUPERMATTER "supermatter" + #define INVESTIGATE_TELESCI "telesci" + #define INVESTIGATE_WIRES "wires" ++#define INVESTIGATE_HALLUCINATIONS "hallucinations" + + //Individual logging defines + #define INDIVIDUAL_ATTACK_LOG "Attack log" diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index 9d2ad314e5..084cc7d1ab 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -5,7 +5,7 @@ Names of z-level do not matter, but order does greatly, for instances such as ch current as of 2016/6/2 z1 = station -z2 = centcomm +z2 = centcom z5 = mining Everything else = randomized space Last space-z level = empty @@ -16,7 +16,7 @@ Last space-z level = empty #define UNAFFECTED 0 #define MAIN_STATION "Main Station" -#define CENTCOMM "CentComm" +#define CENTCOM "CentCom" #define EMPTY_AREA_1 "Empty Area 1" #define EMPTY_AREA_2 "Empty Area 2" #define MINING "Mining Asteroid" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index e0ab84f832..4342766be7 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -8,7 +8,7 @@ //You can use these defines to get the typepath of the currently running proc/verb (yes procs + verbs are objects) /* eg: /mob/living/carbon/human/death() - world << THIS_PROC_TYPE_STR //You can only output the string versions + to_chat(world, THIS_PROC_TYPE_STR) //You can only output the string versions Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a string with () (eg: the _WITH_ARGS defines) to make it look nicer) */ #define THIS_PROC_TYPE ..... @@ -46,8 +46,8 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s //Human Overlays Indexes///////// //citadel code #define MUTATIONS_LAYER 30 //mutations. Tk headglows, cold resistance glow, etc -#define BODY_BEHIND_LAYER 29 //certain mutantrace features (tail when looking south) that must appear behind the body parts -#define GENITALS_BEHIND_LAYER 28 +#define GENITALS_BEHIND_LAYER 29 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer +#define BODY_BEHIND_LAYER 28 //certain mutantrace features (tail when looking south) that must appear behind the body parts #define BODYPARTS_LAYER 27 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag #define BODY_ADJ_LAYER 26 //certain mutantrace features (snout, body markings) that must appear above the body parts #define GENITALS_ADJ_LAYER 25 @@ -350,6 +350,7 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE //debug printing macros #define debug_world(msg) if (GLOB.Debug2) to_chat(world, "DEBUG: [msg]") +#define debug_usr(msg) if (GLOB.Debug2&&usr) to_chat(usr, "DEBUG: [msg]") #define debug_admins(msg) if (GLOB.Debug2) to_chat(GLOB.admins, "DEBUG: [msg]") #define debug_world_log(msg) if (GLOB.Debug2) log_world("DEBUG: [msg]") diff --git a/code/__DEFINES/server_tools.dm b/code/__DEFINES/server_tools.dm index 4624c5914f..a4afa58a87 100644 --- a/code/__DEFINES/server_tools.dm +++ b/code/__DEFINES/server_tools.dm @@ -4,6 +4,9 @@ #define IRC_STATUS_THROTTLE 5 +#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round + //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored + //keep these in sync with TGS3 #define SERVICE_WORLD_PARAM "server_service" #define SERVICE_PR_TEST_JSON "..\\..\\prtestjob.json" @@ -17,7 +20,7 @@ #define SERVICE_CMD_NAME_CHECK "namecheck" #define SERVICE_CMD_ADMIN_WHO "adminwho" -//#define SERVICE_CMD_PARAM_KEY //defined in __compile_options.dm +#define SERVICE_CMD_PARAM_KEY "serviceCommsKey" #define SERVICE_CMD_PARAM_COMMAND "command" #define SERVICE_CMD_PARAM_MESSAGE "message" #define SERVICE_CMD_PARAM_TARGET "target" diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index c495ee3b4a..196e051b64 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -22,7 +22,7 @@ #define SHUTTLE_ALREADY_DOCKED "we_are_already_docked" #define SHUTTLE_SOMEONE_ELSE_DOCKED "someone_else_docked" -//Launching Shuttles to Centcomm +//Launching Shuttles to CentCom #define NOLAUNCH -1 #define UNLAUNCHED 0 #define ENDGAME_LAUNCHED 1 diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index df3daeeff9..9646f03252 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -91,16 +91,23 @@ //returns a new list with only atoms that are in typecache L /proc/typecache_filter_list(list/atoms, list/typecache) . = list() - for (var/thing in atoms) + for(var/thing in atoms) var/atom/A = thing if (typecache[A.type]) . += A /proc/typecache_filter_list_reverse(list/atoms, list/typecache) . = list() - for (var/thing in atoms) + for(var/thing in atoms) var/atom/A = thing - if (!typecache[A.type]) + if(!typecache[A.type]) + . += A + +/proc/typecache_filter_multi_list_exclusion(list/atoms, list/typecache_include, list/typecache_exclude) + . = list() + for(var/thing in atoms) + var/atom/A = thing + if(typecache_include[A.type] && !typecache_exclude[A.type]) . += A //Like typesof() or subtypesof(), but returns a typecache instead of a list @@ -177,7 +184,11 @@ result = first ^ second return result -//Pretends to pick an element based on its weight but really just seems to pick a random element. +//Picks a random element from a list based on a weighting system: +//1. Adds up the total of weights for each element +//2. Gets a number between 1 and that total +//3. For each element in the list, subtracts its weighting from that number +//4. If that makes the number 0 or less, return that element. /proc/pickweight(list/L) var/total = 0 var/item @@ -309,7 +320,7 @@ return r // Returns the key based on the index -#define KEYBYINDEX(L, index) (((index <= L:len) && (index > 0)) ? L[index] : null) +#define KEYBYINDEX(L, index) (((index <= length(L)) && (index > 0)) ? L[index] : null) /proc/count_by_type(list/L, type) var/i = 0 @@ -457,7 +468,7 @@ . |= key_list[key] //Picks from the list, with some safeties, and returns the "default" arg if it fails -#define DEFAULTPICK(L, default) ((islist(L) && L:len) ? pick(L) : default) +#define DEFAULTPICK(L, default) ((islist(L) && length(L)) ? pick(L) : default) #define LAZYINITLIST(L) if (!L) L = list() #define UNSETEMPTY(L) if (L && !L.len) L = null #define LAZYREMOVE(L, I) if(L) { L -= I; if(!L.len) { L = null; } } diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 2dd2e42129..05b6aa1a15 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -1,3 +1,10 @@ +//wrapper macros for easier grepping +#define DIRECT_OUTPUT(A, B) A << B +#define SEND_IMAGE(target, image) DIRECT_OUTPUT(target, image) +#define SEND_SOUND(target, sound) DIRECT_OUTPUT(target, sound) +#define SEND_TEXT(target, text) DIRECT_OUTPUT(target, text) +#define WRITE_FILE(file, text) DIRECT_OUTPUT(file, text) + //print a warning message to world.log #define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [src] usr: [usr].") /proc/warning(msg) @@ -20,13 +27,13 @@ /proc/log_admin(text) GLOB.admin_log.Add(text) if (config.log_admin) - GLOB.world_game_log << "\[[time_stamp()]]ADMIN: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]ADMIN: [text]") //Items using this proc are stripped from public logs - use with caution /proc/log_admin_private(text) GLOB.admin_log.Add(text) if (config.log_admin) - GLOB.world_game_log << "\[[time_stamp()]]ADMINPRIVATE: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]ADMINPRIVATE: [text]") /proc/log_adminsay(text) if (config.log_adminchat) @@ -38,65 +45,65 @@ /proc/log_game(text) if (config.log_game) - GLOB.world_game_log << "\[[time_stamp()]]GAME: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]GAME: [text]") /proc/log_vote(text) if (config.log_vote) - GLOB.world_game_log << "\[[time_stamp()]]VOTE: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]VOTE: [text]") /proc/log_access(text) if (config.log_access) - GLOB.world_game_log << "\[[time_stamp()]]ACCESS: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]ACCESS: [text]") /proc/log_say(text) if (config.log_say) - GLOB.world_game_log << "\[[time_stamp()]]SAY: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]SAY: [text]") /proc/log_prayer(text) if (config.log_prayer) - GLOB.world_game_log << "\[[time_stamp()]]PRAY: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]PRAY: [text]") /proc/log_law(text) if (config.log_law) - GLOB.world_game_log << "\[[time_stamp()]]LAW: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]LAW: [text]") /proc/log_ooc(text) if (config.log_ooc) - GLOB.world_game_log << "\[[time_stamp()]]OOC: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]OOC: [text]") /proc/log_whisper(text) if (config.log_whisper) - GLOB.world_game_log << "\[[time_stamp()]]WHISPER: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]WHISPER: [text]") /proc/log_emote(text) if (config.log_emote) - GLOB.world_game_log << "\[[time_stamp()]]EMOTE: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]EMOTE: [text]") /proc/log_attack(text) if (config.log_attack) - GLOB.world_attack_log << "\[[time_stamp()]]ATTACK: [text]" + WRITE_FILE(GLOB.world_attack_log, "\[[time_stamp()]]ATTACK: [text]") /proc/log_pda(text) if (config.log_pda) - GLOB.world_game_log << "\[[time_stamp()]]PDA: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]PDA: [text]") /proc/log_comment(text) if (config.log_pda) //reusing the PDA option because I really don't think news comments are worth a config option - GLOB.world_game_log << "\[[time_stamp()]]COMMENT: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]COMMENT: [text]") /proc/log_chat(text) if (config.log_pda) - GLOB.world_game_log << "\[[time_stamp()]]CHAT: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]CHAT: [text]") /proc/log_sql(text) if(config.sql_enabled) - GLOB.world_game_log << "\[[time_stamp()]]SQL: [text]" + WRITE_FILE(GLOB.world_game_log, "\[[time_stamp()]]SQL: [text]") //This replaces world.log so it displays both in DD and the file /proc/log_world(text) - GLOB.world_runtime_log << text - world.log << text + WRITE_FILE(GLOB.world_runtime_log, text) + SEND_TEXT(world.log, text) // Helper procs for building detailed log lines diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index d150e86f45..9b1507771a 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -418,7 +418,7 @@ /proc/showCandidatePollWindow(mob/M, poll_time, Question, list/candidates, ignore_category, time_passed, flashwindow = TRUE) set waitfor = 0 - M << 'sound/misc/notice2.ogg' //Alerting them to their consideration + SEND_SOUND(M, 'sound/misc/notice2.ogg') //Alerting them to their consideration if(flashwindow) window_flash(M.client) switch(ignore_category ? askuser(M,Question,"Please answer in [poll_time/10] seconds!","Yes","No","Never for this round", StealFocus=0, Timeout=poll_time) : askuser(M,Question,"Please answer in [poll_time/10] seconds!","Yes","No", StealFocus=0, Timeout=poll_time)) @@ -426,7 +426,7 @@ to_chat(M, "Choice registered: Yes.") if(time_passed + poll_time <= world.time) to_chat(M, "Sorry, you answered too late to be considered!") - M << 'sound/machines/buzz-sigh.ogg' + SEND_SOUND(M, 'sound/machines/buzz-sigh.ogg') candidates -= M else candidates += M diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 92d5dcbd80..1af231f893 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -48,6 +48,11 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_dorsal, GLOB.xeno_dorsal_list) //genitals init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list) + + for(var/K in GLOB.cock_shapes_list) + var/datum/sprite_accessory/penis/value = GLOB.cock_shapes_list[K] + GLOB.cock_shapes_icons[K] = value.icon_state + init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list) GLOB.breasts_size_list = list("a","b","c","d","e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing. diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index b2a9260ce1..b245b1f146 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -167,7 +167,7 @@ mob Output_Icon() set name = "2. Output Icon" - to_chat(src, "Icon is: [bicon(getFlatIcon(src))]") + to_chat(src, "Icon is: [icon2base64html(getFlatIcon(src))]") Label_Icon() set name = "3. Label Icon" @@ -712,7 +712,8 @@ The _flatIcons list is a cache for generated icon files. if(!current) curIndex++ //Try the next layer continue - currentLayer = current:layer + var/image/I = current + currentLayer = I.layer if(currentLayer<0) // Special case for FLY_LAYER if(currentLayer <= -1000) return flat if(pSet == 0) // Underlay @@ -747,22 +748,22 @@ The _flatIcons list is a cache for generated icon files. // Dimensions of overlay being added var/{addX1;addX2;addY1;addY2} - for(var/I in layers) - - if(I:alpha == 0) + for(var/V in layers) + var/image/I = V + if(I.alpha == 0) continue if(I == copy) // 'I' is an /image based on the object being flattened. curblend = BLEND_OVERLAY - add = icon(I:icon, I:icon_state, I:dir) + add = icon(I.icon, I.icon_state, I.dir) else // 'I' is an appearance object. add = getFlatIcon(new/image(I), curdir, curicon, curstate, curblend) // Find the new dimensions of the flat icon to fit the added overlay - addX1 = min(flatX1, I:pixel_x+1) - addX2 = max(flatX2, I:pixel_x+add.Width()) - addY1 = min(flatY1, I:pixel_y+1) - addY2 = max(flatY2, I:pixel_y+add.Height()) + addX1 = min(flatX1, I.pixel_x+1) + addX2 = max(flatX2, I.pixel_x+add.Width()) + addY1 = min(flatY1, I.pixel_y+1) + addY2 = max(flatY2, I.pixel_y+add.Height()) if(addX1!=flatX1 || addX2!=flatX2 || addY1!=flatY1 || addY2!=flatY2) // Resize the flattened icon so the new icon fits @@ -771,7 +772,7 @@ The _flatIcons list is a cache for generated icon files. flatY1=addY1;flatY2=addY2 // Blend the overlay into the flattened icon - flat.Blend(add, blendMode2iconMode(curblend), I:pixel_x + 2 - flatX1, I:pixel_y + 2 - flatY1) + flat.Blend(add, blendMode2iconMode(curblend), I.pixel_x + 2 - flatX1, I.pixel_y + 2 - flatY1) if(A.color) flat.Blend(A.color, ICON_MULTIPLY) @@ -782,10 +783,11 @@ The _flatIcons list is a cache for generated icon files. /proc/getIconMask(atom/A)//By yours truly. Creates a dynamic mask for a mob/whatever. /N var/icon/alpha_mask = new(A.icon,A.icon_state)//So we want the default icon and icon state of A. - for(var/I in A.overlays)//For every image in overlays. var/image/I will not work, don't try it. - if(I:layer>A.layer) + for(var/V in A.overlays)//For every image in overlays. var/image/I will not work, don't try it. + var/image/I = V + if(I.layer>A.layer) continue//If layer is greater than what we need, skip it. - var/icon/image_overlay = new(I:icon,I:icon_state)//Blend only works with icon objects. + var/icon/image_overlay = new(I.icon,I.icon_state)//Blend only works with icon objects. //Also, icons cannot directly set icon_state. Slower than changing variables but whatever. alpha_mask.Blend(image_overlay,ICON_OR)//OR so they are lumped together in a nice overlay. return alpha_mask//And now return the mask. @@ -968,32 +970,135 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) /image/proc/setDir(newdir) dir = newdir -/atom/proc/freeze_icon_index() - return "\ref[initial(icon)]-[initial(icon_state)]" +#define FROZEN_RED_COLOR "#2E5E69" +#define FROZEN_GREEN_COLOR "#60A2A8" +#define FROZEN_BLUE_COLOR "#A1AFB1" /obj/proc/make_frozen_visual() // Used to make the frozen item visuals for Freon. - var/static/list/freeze_item_icons = list() if(resistance_flags & FREEZE_PROOF) return - if(!HAS_SECONDARY_FLAG(src, FROZEN) && (initial(icon) && initial(icon_state))) - var/index = freeze_icon_index() - var/icon/IC - var/icon/P = freeze_item_icons[index] - if(!P) - P = new /icon - for(var/iconstate in icon_states(icon)) - var/icon/O = new('icons/effects/freeze.dmi', "ice_cube") - IC = new(icon, iconstate) - O.Blend(IC, ICON_ADD) - P.Insert(O, iconstate) - freeze_item_icons[index] = P - icon = P + if(!HAS_SECONDARY_FLAG(src, FROZEN)) name = "frozen [name]" + add_atom_colour(list(FROZEN_RED_COLOR, FROZEN_GREEN_COLOR, FROZEN_BLUE_COLOR, rgb(0,0,0)), TEMPORARY_COLOUR_PRIORITY) + alpha -= 25 SET_SECONDARY_FLAG(src, FROZEN) //Assumes already frozed /obj/proc/make_unfrozen() - icon = initial(icon) - name = replacetext(name, "frozen ", "") - CLEAR_SECONDARY_FLAG(src, FROZEN) + if(HAS_SECONDARY_FLAG(src, FROZEN)) + name = replacetext(name, "frozen ", "") + remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, list(FROZEN_RED_COLOR, FROZEN_GREEN_COLOR, FROZEN_BLUE_COLOR, rgb(0,0,0))) + alpha += 25 + CLEAR_SECONDARY_FLAG(src, FROZEN) + +#undef FROZEN_RED_COLOR +#undef FROZEN_GREEN_COLOR +#undef FROZEN_BLUE_COLOR + + +//Converts an icon to base64. Operates by putting the icon in the iconCache savefile, +// exporting it as text, and then parsing the base64 from that. +// (This relies on byond automatically storing icons in savefiles as base64) +/proc/icon2base64(icon/icon, iconKey = "misc") + if (!isicon(icon)) + return FALSE + WRITE_FILE(GLOB.iconCache[iconKey], icon) + var/iconData = GLOB.iconCache.ExportText(iconKey) + var/list/partial = splittext(iconData, "{") + return replacetext(copytext(partial[2], 3, -5), "\n", "") + +/proc/icon2html(thing, target, icon_state, dir, frame = 1, moving = FALSE) + if (!thing) + return + + var/key + var/icon/I = thing + if (!target) + return + if (target == world) + target = GLOB.clients + + var/list/targets + if (!islist(target)) + targets = list(target) + else + targets = target + if (!targets.len) + return + if (!isicon(I)) + if (isfile(thing)) //special snowflake + var/name = sanitize_filename("[generate_asset_name(thing)].png") + register_asset(name, thing) + for (var/thing2 in targets) + send_asset(thing2, key, FALSE) + return "" + var/atom/A = thing + if (isnull(dir)) + dir = A.dir + if (isnull(icon_state)) + icon_state = A.icon_state + I = A.icon + if (ishuman(thing)) // Shitty workaround for a BYOND issue. + var/icon/temp = I + I = icon() + I.Insert(temp, dir = SOUTH) + dir = SOUTH + else + if (isnull(dir)) + dir = SOUTH + if (isnull(icon_state)) + icon_state = "" + + I = icon(I, icon_state, dir, frame, moving) + + key = "[generate_asset_name(I)].png" + register_asset(key, I) + for (var/thing2 in targets) + send_asset(thing2, key, FALSE) + + return "" + +/proc/icon2base64html(thing) + if (!thing) + return + var/static/list/bicon_cache = list() + if (isicon(thing)) + var/icon/I = thing + var/icon_base64 = icon2base64(I) + + if (I.Height() > world.icon_size || I.Width() > world.icon_size) + var/icon_md5 = md5(icon_base64) + icon_base64 = bicon_cache[icon_md5] + if (!icon_base64) // Doesn't exist yet, make it. + bicon_cache[icon_md5] = icon_base64 = icon2base64(I) + + + return "" + + // Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with. + var/atom/A = thing + var/key = "[istype(A.icon, /icon) ? "\ref[A.icon]" : A.icon]:[A.icon_state]" + + + if (!bicon_cache[key]) // Doesn't exist, make it. + var/icon/I = icon(A.icon, A.icon_state, SOUTH, 1) + if (ishuman(thing)) // Shitty workaround for a BYOND issue. + var/icon/temp = I + I = icon() + I.Insert(temp, dir = SOUTH) + + bicon_cache[key] = icon2base64(I, key) + + return "" + +//Costlier version of icon2html() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs. +/proc/costly_icon2html(thing, target) + if (!thing) + return + + if (isicon(thing)) + return icon2html(thing, target) + + var/icon/I = getFlatIcon(thing) + return icon2html(I, target) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 7c6746f477..cb64f3fb22 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -1,6 +1,3 @@ -//wrapper macro for sending images that makes grepping easy -#define SEND_IMAGE(target, image) target << image - /proc/random_blood_type() return pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") @@ -116,6 +113,7 @@ "xenohead" = "None", "xenotail" = "None", "exhibitionist" = FALSE, + "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = pick(GLOB.cock_shapes_list), "cock_length" = 6, @@ -158,8 +156,9 @@ "womb_cum_rate" = CUM_RATE, "womb_cum_mult" = CUM_RATE_MULT, "womb_efficiency" = CUM_EFFICIENCY, - "womb_fluid" = "femcum")) - + "womb_fluid" = "femcum", + "flavor_text" = "")) + /proc/random_hair_style(gender) switch(gender) if(MALE) diff --git a/code/__HELPERS/priority_announce.dm b/code/__HELPERS/priority_announce.dm index 70bb8b2db6..a617437ac3 100644 --- a/code/__HELPERS/priority_announce.dm +++ b/code/__HELPERS/priority_announce.dm @@ -24,11 +24,12 @@ announcement += "
[html_encode(text)]
" announcement += "
" + var/s = sound(sound) for(var/mob/M in GLOB.player_list) if(!isnewplayer(M) && M.can_hear()) to_chat(M, announcement) if(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS) - M << sound(sound) + SEND_SOUND(M, s) /proc/print_command_report(text = "", title = null, announce=TRUE) if(!title) @@ -55,6 +56,6 @@ to_chat(M, "[title]
[message]

") if(M.client.prefs.toggles & SOUND_ANNOUNCEMENTS) if(alert) - M << sound('sound/misc/notice1.ogg') + SEND_SOUND(M, sound('sound/misc/notice1.ogg')) else - M << sound('sound/misc/notice2.ogg') + SEND_SOUND(M, sound('sound/misc/notice2.ogg')) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index cd5d0c6af5..53691d122e 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -45,6 +45,9 @@ index = findtext(t, char, index+1) return t +/proc/sanitize_filename(t) + return sanitize_simple(t, list("\n"="", "\t"="", "/"="", "\\"="", "?"="", "%"="", "*"="", ":"="", "|"="", "\""="", "<"="", ">"="")) + //Runs byond's sanitization proc along-side sanitize_simple /proc/sanitize(t,list/repl_chars = null) return html_encode(sanitize_simple(t,repl_chars)) @@ -553,14 +556,14 @@ GLOBAL_LIST_INIT(binary, list("0","1")) var/list/tosend = list() tosend["data"] = finalized - log << json_encode(tosend) + WRITE_FILE(log, json_encode(tosend)) //Used for applying byonds text macros to strings that are loaded at runtime /proc/apply_text_macros(string) var/next_backslash = findtext(string, "\\") if(!next_backslash) return string - + var/leng = length(string) var/next_space = findtext(string, " ", next_backslash + 1) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index 36a81e90e2..7df96c3da2 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -537,3 +537,18 @@ if(!istype(the_matrix) || the_matrix.len != 20) return "#ffffffff" return rgb(the_matrix[1]*255, the_matrix[6]*255, the_matrix[11]*255, the_matrix[16]*255) + +/proc/type2parent(child) + var/string_type = "[child]" + var/last_slash = findlasttext(string_type, "/") + if(last_slash == 1) + switch(child) + if(/datum) + return null + if(/obj || /mob) + return /atom/movable + if(/area || /turf) + return /atom + else + return /datum + return text2path(copytext(string_type, 1, last_slash)) \ No newline at end of file diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 48787430a0..8cb34e23b5 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -289,7 +289,7 @@ Turf and target are separate in case you want to teleport some distance from a t var/list/pois = list() for(var/mob/M in mobs) if(skip_mindless && (!M.mind && !M.ckey)) - if(!isbot(M) && !istype(M, /mob/camera/)) + if(!isbot(M) && !istype(M, /mob/camera) && !ismegafauna(M)) continue if(M.client && M.client.holder && M.client.holder.fakekey) //stealthmins continue @@ -491,17 +491,26 @@ Turf and target are separate in case you want to teleport some distance from a t var/y=arcsin(x/sqrt(1+x*x)) return y -/atom/proc/GetAllContents() +/atom/proc/GetAllContents(list/ignore_typecache) var/list/processing_list = list(src) var/list/assembled = list() + if(ignore_typecache) //If there's a typecache, use it. + while(processing_list.len) + var/atom/A = processing_list[1] + processing_list -= A + if(ignore_typecache[A.type]) + continue + processing_list |= (A.contents - assembled) + assembled |= A - while(processing_list.len) - var/atom/A = processing_list[1] - processing_list -= A + else //If there's none, only make this check once for performance. + while(processing_list.len) + var/atom/A = processing_list[1] + processing_list -= A - processing_list |= (A.contents - assembled) + processing_list |= (A.contents - assembled) - assembled |= A + assembled |= A return assembled @@ -836,11 +845,11 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list( /obj/proc/atmosanalyzer_scan(datum/gas_mixture/air_contents, mob/user, obj/target = src) var/obj/icon = target - user.visible_message("[user] has used the analyzer on [bicon(icon)] [target].", "You use the analyzer on [bicon(icon)] [target].") + user.visible_message("[user] has used the analyzer on [icon2html(icon, viewers(src))] [target].", "You use the analyzer on [icon2html(icon, user)] [target].") var/pressure = air_contents.return_pressure() var/total_moles = air_contents.total_moles() - to_chat(user, "Results of analysis of [bicon(icon)] [target].") + to_chat(user, "Results of analysis of [icon2html(icon, user)] [target].") if(total_moles>0) to_chat(user, "Pressure: [round(pressure,0.1)] kPa") diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 964c956eca..a669f1b4f5 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -69,8 +69,6 @@ #error You need version 511 or higher #endif - #define SERVICE_CMD_PARAM_KEY "serviceCommsKey" - //Update this whenever the db schema changes //make sure you add an update to the schema_version stable in the db changelog #define DB_MAJOR_VERSION 3 diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index b944f32754..e1f1410837 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -205,7 +205,7 @@ or something covering your eyes." /obj/screen/alert/embeddedobject name = "Embedded Object" desc = "Something got lodged into your flesh and is causing major bleeding. It might fall out with time, but surgery is the safest way. \ -If you're feeling frisky, click yourself in help intent to pull the object out." +If you're feeling frisky, examine yourself and click the underlined item to pull the object out." icon_state = "embeddedobject" /obj/screen/alert/embeddedobject/Click() diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index d66c8ee359..89803baef6 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -15,6 +15,7 @@ return new /obj/effect/temp_visual/telekinesis(loc) user.UnarmedAttack(src,0) // attack_hand, attack_paw, etc + add_hiddenprint(user) return /obj/attack_tk(mob/user) @@ -34,6 +35,7 @@ O.tk_user = user if(O.focus_object(src)) user.put_in_active_hand(O) + add_hiddenprint(user) /mob/attack_tk(mob/user) return diff --git a/code/citadel/_cit_helpers.dm b/code/citadel/_cit_helpers.dm index db0626fa9c..e6dca1e369 100644 --- a/code/citadel/_cit_helpers.dm +++ b/code/citadel/_cit_helpers.dm @@ -53,6 +53,7 @@ GLOBAL_LIST_EMPTY(xeno_dorsal_list) //Genitals and Arousal Lists GLOBAL_LIST_EMPTY(cock_shapes_list)//global_lists.dm for the list initializations //Now also _DATASTRUCTURES globals.dm +GLOBAL_LIST_EMPTY(cock_shapes_icons) //Associated list for names->icon_states for cockshapes. GLOBAL_LIST_EMPTY(breasts_size_list) GLOBAL_LIST_EMPTY(breasts_shapes_list) GLOBAL_LIST_EMPTY(vagina_shapes_list) diff --git a/code/citadel/cit_arousal.dm b/code/citadel/cit_arousal.dm index 12245c05d5..cf47dab1da 100644 --- a/code/citadel/cit_arousal.dm +++ b/code/citadel/cit_arousal.dm @@ -6,7 +6,7 @@ var/arousal_rate = 1 //The base rate that arousal will increase in this mob. var/arousal_loss_rate = 1 //How easily arousal can be relieved for this mob. var/canbearoused = FALSE //Mob-level disabler for arousal. Starts off and can be enabled as features are added for different mob types. - var/mb_cd_length = 50 //5 second cooldown for masturbating because fuck spam + var/mb_cd_length = 100 //5 second cooldown for masturbating because fuck spam. var/mb_cd_timer = 0 //The timer itself /mob/living/carbon/human @@ -150,14 +150,14 @@ return 0 var/mob/living/M = usr if(M.canbearoused) - M.mob_masturbate() + M.mob_climax() return 1 else - M << "Arousal is disabled. Feature is unavailable." + to_chat(M, "Arousal is disabled. Feature is unavailable.") -/mob/living/proc/mob_masturbate()//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while. +/mob/living/proc/mob_climax()//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while. set name = "Masturbate" set category = "IC" if(canbearoused && !restrained() && !stat) @@ -179,45 +179,93 @@ PoolOrNew(/obj/effect/decal/cleanable/femcum, loc) */ else - src << "You aren't aroused enough for that." + to_chat(src, "You aren't aroused enough for that.") -/mob/living/carbon/human/mob_masturbate() +/mob/living/carbon/human/mob_climax(forced_climax=FALSE) //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints if(mb_cd_timer > world.time) - src << "You need to wait [round((mb_cd_timer - world.time)/(20))] seconds before you can do that again!" + if(!forced_climax) //Don't spam the message to the victim if forced to come too fast + to_chat(src, "You need to wait [round((mb_cd_timer - world.time)/(20))] seconds before you can do that again!") return + mb_cd_timer = (world.time + mb_cd_length) var/list/genitals_list = list() var/obj/item/organ/genital/SG = null//originally selected_genital var/list/containers_list = list() var/obj/item/weapon/reagent_containers/SC = null var/datum/reagents/fluid_source = null var/into_container = 0 - var/arms = get_num_arms() - var/free_hands = arms + var/free_hands = get_num_arms() //arms was only used to know if we had ANY at all var/total_cum = 0 var/finished = 0 var/mb_time = 30 - mb_cd_timer = (world.time + mb_cd_length) if(canbearoused && has_dna()) - if(restrained()) - src << "You can't do that while restrained!" + if(stat==2) + to_chat(src, "You can't do that while dead!") return - if(stat) - src << "You must be conscious to do that!" + if(forced_climax) //Something forced us to cum, this is not a masturbation thing and does not progress to the other checks + for(var/obj/item/organ/genital/G in internal_organs) + if(G.can_masturbate_with) //All capable genitals will orgasm with this + var/unable_to_come = FALSE + switch(G.type) + if(/obj/item/organ/genital/penis) + var/obj/item/organ/genital/penis/P = G + if(!P.linked_balls) + unable_to_come = TRUE + else + fluid_source = P.linked_balls.reagents + + + if(/obj/item/organ/genital/vagina) + var/obj/item/organ/genital/vagina/V = G + if(!V.linked_womb) + unable_to_come = TRUE + else + fluid_source = V.linked_womb.reagents + else //Weird, undefined genitalia behaviour + unable_to_come = TRUE + + if(unable_to_come) + src.visible_message("[src] shudders, their [G.name] unable to cum.", \ + "Your [G.name] cannot cum, giving no relief.", \ + "Your [G.name] cannot cum, giving no relief.") + else + if(fluid_source) + total_cum = fluid_source.total_volume + src.visible_message("[src] looks like they're about to cum.", \ + "You feel yourself about to orgasm.", \ + "You feel yourself about to orgasm.") + if(do_after(src, mb_time, target = src)) + if(total_cum > 5) + fluid_source.reaction(src.loc, TOUCH, 1, 0) + fluid_source.clear_reagents() + fluid_source = null //cleanup so this can be used for the next genitalia + + src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \ + "You're forced to cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""] with your [G].", \ + "Your [G] have been forced to climax.") + finished = 1 + if(finished) + setArousalLoss(min_arousal) + return //Do not proceed to masturbating if all genitals have been forced to orgasm. + if(stat==1) //Sleeping people can be forced chemically or with electrical stimulants, for example. + to_chat(src, "You must be conscious to do that!") + return + if(restrained()) + to_chat(src, "You can't do that while restrained!") return if(getArousalLoss() < 33)//flat number instead of percentage - src << "You aren't aroused enough for that!" + to_chat(src, "You aren't aroused enough for that!") return if(!is_groin_exposed()) - src << "You need to undress, first!" + to_chat(src, "You need to undress, first!") return - if(!arms) - src << "You need at least one arm." + if(!free_hands) + to_chat(src, "You need at least one free arm.") return for(var/helditem in held_items)//how many hands are free if(isobj(helditem)) free_hands-- if(free_hands <= 0) - src << "You need at least one free hand." + to_chat(src, "You need at least one free hand.") return for(var/obj/item/organ/genital/G in internal_organs) if(G.can_masturbate_with)//filter out what you can't masturbate with @@ -240,12 +288,12 @@ if(/obj/item/organ/genital/penis) var/obj/item/organ/genital/penis/P = SG if(!P.linked_balls) - src << "Grow a pair!" + to_chat(src, "You need a pair of testicles to do this.") return fluid_source = P.linked_balls.reagents total_cum = fluid_source.total_volume if(into_container)//into a glass or beaker or whatever - src.visible_message("[src] starts [pick("jerking off","stroking")] their [SG] over [SC].", \ + src.visible_message("[src] starts [pick("jerking off","stroking")] their [SG.name] over [SC].", \ "You start jerking off over [SC.name].", \ "You start masturbating.") if(do_after(src, mb_time, target = src) && in_range(src, SC)) @@ -254,16 +302,71 @@ "You cum into [SC].", \ "You have relieved yourself.") finished = 1 - + else //Not in a container + if(src.pulling) + if(iscarbon(src.pulling)) + var/mob/living/carbon/C = src.pulling + if(!C.is_groin_exposed()) + to_chat(src, "You must undress someone to climax inside them.") + return + if(isliving(src.pulling)) //Gotta be alive to fuck it, don't wanna have to code fucking objects that ain't containers... + var/mob/living/partner = src.pulling + src.visible_message("[src] is about to climax inside [partner]!", \ + "You're about to climax inside [partner]!", \ + "You're preparing to climax inside someone!") + switch(grab_state) + if(GRAB_PASSIVE) + if(do_after(src, mb_time, target = src) && in_range(src, partner)) + var/spillage = 0.5 //Leaks a bit on passive grab + var/did_spill = FALSE + fluid_source.trans_to(partner, total_cum*(1-spillage)) + total_cum = total_cum*spillage + if(total_cum > 5) + fluid_source.reaction(partner.loc, TOUCH, 1, 0) + did_spill = TRUE + fluid_source.clear_reagents() + + src.visible_message("[src] ejaculates inside [partner][did_spill ? ", overflowing and spilling":""]!", \ + "You ejaculate inside [partner][did_spill ? ", spilling out of them":""].", \ + "You have climaxed inside someone[did_spill ? ", spilling out of them":""].") + finished = 1 + else //Aggressive or higher + if(do_after(src, mb_time, target = src) && in_range(src, partner)) + var/spillage = 0.0 //Leakproofing seals + fluid_source.trans_to(partner, total_cum*(1-spillage)) + total_cum = total_cum*spillage + if(total_cum > 5) + fluid_source.reaction(partner.loc, TOUCH, 1, 0) + fluid_source.clear_reagents() + + src.visible_message("[src] ejaculates inside [partner], spilling nothing!", \ + "You ejaculate inside [partner], spilling nothing.", \ + "You have climaxed inside someone, spilling nothing.") + finished = 1 + //Don't care, not coding you fucking a unanchored girder + else //No pulling, or pulling non-living things + src.visible_message("[src] starts [pick("jerking off","stroking")] their [SG].", \ + "You start masturbating.", \ + "You start masturbating.") + if(do_after(src, mb_time, target = src)) + if(total_cum > 5) + fluid_source.reaction(src.loc, TOUCH, 1, 0) + fluid_source.clear_reagents() + + src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \ + "You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].", \ + "You have relieved yourself.") + finished = 1 + if(/obj/item/organ/genital/vagina) var/obj/item/organ/genital/vagina/V = SG if(!V.linked_womb) - src << "No womb!" + to_chat(src, "You need a womb to do this.") return fluid_source = V.linked_womb.reagents total_cum = fluid_source.total_volume if(into_container)//into a glass or beaker or whatever - src.visible_message("[src] starts fingering their vagina over [SC].", \ + src.visible_message("[src] starts fingering their [SG.name] over [SC].", \ "You start fingering over [SC.name].", \ "You start masturbating.") if(do_after(src, mb_time, target = src) && in_range(src, SC)) @@ -272,7 +375,7 @@ "You cum into [SC].", \ "You have relieved yourself.") finished = 1 - + else//not into a container src.visible_message("[src] starts fingering their vagina.", \ "You start fingering your vagina.", \ @@ -297,10 +400,5 @@ setArousalLoss(min_arousal) else - src << "You have no genitals!" + to_chat(src, "You have no genitals!") return - -/mob/living/carbon/proc/force_orgasm(intensity) - if(canbearoused && has_dna() && (has_penis() || has_vagina())) - return 1 - return 0 diff --git a/code/citadel/cit_reagents.dm b/code/citadel/cit_reagents.dm index 2f421542ae..428729d30f 100644 --- a/code/citadel/cit_reagents.dm +++ b/code/citadel/cit_reagents.dm @@ -105,7 +105,7 @@ M.emote(pick("moan","blush")) if(prob(5)) var/aroused_message = pick("You feel frisky.", "You're having trouble suppressing your urges.", "You feel in the mood.") - M << "[aroused_message]" + to_chat(M, "[aroused_message]") ..() /datum/reagent/aphrodisiacplus @@ -128,15 +128,13 @@ else M.emote(pick("moan","blush")) if(prob(5)) + var/aroused_message if(M.getArousalLoss() > 90) - var/aroused_message = pick("You need to fuck someone!", "You're bursting with sexual tension!", "You can't get sex off your mind!") - M << "[aroused_message]" + aroused_message = pick("You need to fuck someone!", "You're bursting with sexual tension!", "You can't get sex off your mind!") else - var/aroused_message = pick("You feel a bit hot.", "You feel strong sexual urges.", "You feel in the mood.", "You're ready to go down on someone.") - M << "[aroused_message]" -// if(iscarbon(M) && has_dna(M)) -// M.force_ejaculation() - ..() + aroused_message = pick("You feel a bit hot.", "You feel strong sexual urges.", "You feel in the mood.", "You're ready to go down on someone.") + to_chat(M, "[aroused_message]") + /datum/reagent/aphrodisiacplus/addiction_act_stage2(mob/living/M) if(prob(30)) M.adjustBrainLoss(2) @@ -152,11 +150,17 @@ ..() /datum/reagent/aphrodisiacplus/overdose_process(mob/living/M) - if(prob(66)) + if(prob(33)) + if(M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna()) + var/mob/living/carbon/human/H = M + to_chat(H, "Your libido is going haywire!") + H.mob_climax(forced_climax=TRUE) if(M.min_arousal < 50) M.min_arousal += 1 - if(M.max_arousal < 200) - M.max_arousal += 1 + to_chat(M, "You're having a hard time thinkin about things other than sex!") + if(M.min_arousal < M.max_arousal) + M.min_arousal += 1 + to_chat(M, "You feel your libido permanently increasing.") M.adjustArousalLoss(2) ..() @@ -193,8 +197,10 @@ if(prob(33)) if(M.min_arousal > 0) M.min_arousal -= 1 - if(M.max_arousal > 75) + to_chat(M, "You feel your libido returning to more normal levels.") + if(M.min_arousal > 50) M.min_arousal -= 1 + to_chat(M, "You feel like your overactive libido is calming down.") M.adjustArousalLoss(-2) ..() diff --git a/code/citadel/icons/taur_penis_onmob.dmi b/code/citadel/icons/taur_penis_onmob.dmi new file mode 100644 index 0000000000..3debbd0047 Binary files /dev/null and b/code/citadel/icons/taur_penis_onmob.dmi differ diff --git a/code/citadel/organs/breasts.dm b/code/citadel/organs/breasts.dm index 5e3f312199..ce45b88cfb 100644 --- a/code/citadel/organs/breasts.dm +++ b/code/citadel/organs/breasts.dm @@ -1,5 +1,5 @@ /obj/item/organ/genital/breasts - name = "breasts" + name = "Breasts" desc = "Female milk producing organs." icon_state = "breasts" icon = 'code/citadel/icons/breasts.dmi' diff --git a/code/citadel/organs/eggsack.dm b/code/citadel/organs/eggsack.dm index 1e53240e1a..718a353b87 100644 --- a/code/citadel/organs/eggsack.dm +++ b/code/citadel/organs/eggsack.dm @@ -1,5 +1,5 @@ /obj/item/organ/genital/eggsack - name = "egg sack" + name = "Egg sack" desc = "An egg producing reproductive organ." icon_state = "egg_sack" icon = 'code/citadel/icons/ovipositor.dmi' diff --git a/code/citadel/organs/genitals.dm b/code/citadel/organs/genitals.dm index c129d8e8fa..6bd86e7146 100644 --- a/code/citadel/organs/genitals.dm +++ b/code/citadel/organs/genitals.dm @@ -243,8 +243,10 @@ G.aroused_state = FALSE icon_string = "[G.slot]_[S.icon_state]_[size]_[G.aroused_state]_[layertext]" I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer) + if(S.center) I = center_image(I,S.dimension_x,S.dimension_y) + if(use_skintones && H.dna.features["genitals_use_skintone"]) I.color = "#[skintone2hex(H.skin_tone)]" else diff --git a/code/citadel/organs/genitals_sprite_accessories.dm b/code/citadel/organs/genitals_sprite_accessories.dm index 586be3a095..710bab787c 100644 --- a/code/citadel/organs/genitals_sprite_accessories.dm +++ b/code/citadel/organs/genitals_sprite_accessories.dm @@ -31,6 +31,33 @@ icon_state = "tapered" name = "Tapered" +//////////////////////// +// Taur cocks go here // +//////////////////////// +/datum/sprite_accessory/penis/taur_flared + icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width + icon_state = "flared" + name = "Taur, Flared" + center = TRUE //Center the image 'cause 2-tile wide. + dimension_x = 64 + +/datum/sprite_accessory/penis/taur_knotted + icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width + icon_state = "knotted" + name = "Taur, Knotted" + center = TRUE //Center the image 'cause 2-tile wide. + dimension_x = 64 + +/datum/sprite_accessory/penis/taur_tapered + icon = 'code/citadel/icons/taur_penis_onmob.dmi' //Needed larger width + icon_state = "tapered" + name = "Taur, Tapered" + center = TRUE //Center the image 'cause 2-tile wide. + dimension_x = 64 + + + + //Vaginas /datum/sprite_accessory/vagina icon = 'code/citadel/icons/vagina_onmob.dmi' diff --git a/code/citadel/organs/ovipositor.dm b/code/citadel/organs/ovipositor.dm index 9e46cff91c..3d684ee387 100644 --- a/code/citadel/organs/ovipositor.dm +++ b/code/citadel/organs/ovipositor.dm @@ -1,5 +1,5 @@ /obj/item/organ/genital/ovipositor - name = "ovipositor" + name = "Ovipositor" desc = "An egg laying reproductive organ." icon_state = "ovi_knotted_2" icon = 'code/citadel/icons/ovipositor.dmi' diff --git a/code/citadel/organs/penis.dm b/code/citadel/organs/penis.dm index 3d99d6c939..9e2ce00666 100644 --- a/code/citadel/organs/penis.dm +++ b/code/citadel/organs/penis.dm @@ -1,5 +1,5 @@ /obj/item/organ/genital/penis - name = "penis" + name = "Penis" desc = "A male reproductive organ." icon_state = "penis" icon = 'code/citadel/icons/penis.dmi' @@ -35,7 +35,7 @@ cached_length = length /obj/item/organ/genital/penis/update_appearance() - var/string = "penis_[lowertext(shape)]_[size]" + var/string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]" icon_state = sanitize_text(string) var/lowershape = lowertext(shape) if(lowershape in knotted_types) diff --git a/code/citadel/organs/testicles.dm b/code/citadel/organs/testicles.dm index 71e591f930..a759aeab52 100644 --- a/code/citadel/organs/testicles.dm +++ b/code/citadel/organs/testicles.dm @@ -1,5 +1,5 @@ /obj/item/organ/genital/testicles - name = "testicles" + name = "Testicles" desc = "A male reproductive organ." icon_state = "testicles" icon = 'code/citadel/icons/penis.dmi' diff --git a/code/citadel/organs/vagina.dm b/code/citadel/organs/vagina.dm index c1924a3067..fa1f00bda2 100644 --- a/code/citadel/organs/vagina.dm +++ b/code/citadel/organs/vagina.dm @@ -1,5 +1,5 @@ /obj/item/organ/genital/vagina - name = "vagina" + name = "Vagina" desc = "A female reproductive organ." icon = 'code/citadel/icons/vagina.dmi' icon_state = "vagina" diff --git a/code/citadel/organs/womb.dm b/code/citadel/organs/womb.dm index e1ea02a230..3ebe5c2f98 100644 --- a/code/citadel/organs/womb.dm +++ b/code/citadel/organs/womb.dm @@ -1,5 +1,5 @@ /obj/item/organ/genital/womb - name = "womb" + name = "Womb" desc = "A female reproductive organ." icon = 'code/citadel/icons/vagina.dmi' icon_state = "womb" @@ -10,7 +10,7 @@ fluid_id = "femcum" producing = TRUE var/obj/item/organ/genital/vagina/linked_vag - + /obj/item/organ/genital/womb/Initialize() . = ..() reagents.add_reagent(fluid_id, fluid_max_volume) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index c32c481291..abf2c1f937 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -275,7 +275,7 @@ if(M.config_tag) if(!(M.config_tag in modes)) // ensure each mode is added only once - GLOB.config_error_log << "Adding game mode [M.name] ([M.config_tag]) to configuration." + WRITE_FILE(GLOB.config_error_log, "Adding game mode [M.name] ([M.config_tag]) to configuration.") modes += M.config_tag mode_names[M.config_tag] = M.name probabilities[M.config_tag] = M.probability @@ -548,7 +548,7 @@ if("irc_announce_new_game") irc_announce_new_game = TRUE else - GLOB.config_error_log << "Unknown setting in configuration: '[name]'" + WRITE_FILE(GLOB.config_error_log, "Unknown setting in configuration: '[name]'") else if(type == "game_options") switch(name) @@ -611,13 +611,13 @@ if(mode_name in modes) continuous[mode_name] = 1 else - GLOB.config_error_log << "Unknown continuous configuration definition: [mode_name]." + WRITE_FILE(GLOB.config_error_log, "Unknown continuous configuration definition: [mode_name].") if("midround_antag") var/mode_name = lowertext(value) if(mode_name in modes) midround_antag[mode_name] = 1 else - GLOB.config_error_log << "Unknown midround antagonist configuration definition: [mode_name]." + WRITE_FILE(GLOB.config_error_log, "Unknown midround antagonist configuration definition: [mode_name].") if("midround_antag_time_check") midround_antag_time_check = text2num(value) if("midround_antag_life_check") @@ -633,9 +633,9 @@ if(mode_name in modes) min_pop[mode_name] = text2num(mode_value) else - GLOB.config_error_log << "Unknown minimum population configuration definition: [mode_name]." + WRITE_FILE(GLOB.config_error_log, "Unknown minimum population configuration definition: [mode_name].") else - GLOB.config_error_log << "Incorrect minimum population configuration definition: [mode_name] [mode_value]." + WRITE_FILE(GLOB.config_error_log, "Incorrect minimum population configuration definition: [mode_name] [mode_value].") if("max_pop") var/pop_pos = findtext(value, " ") var/mode_name = null @@ -647,9 +647,9 @@ if(mode_name in modes) max_pop[mode_name] = text2num(mode_value) else - GLOB.config_error_log << "Unknown maximum population configuration definition: [mode_name]." + WRITE_FILE(GLOB.config_error_log, "Unknown maximum population configuration definition: [mode_name].") else - GLOB.config_error_log << "Incorrect maximum population configuration definition: [mode_name] [mode_value]." + WRITE_FILE(GLOB.config_error_log, "Incorrect maximum population configuration definition: [mode_name] [mode_value].") if("shuttle_refuel_delay") shuttle_refuel_delay = text2num(value) if("show_game_type_odds") @@ -677,9 +677,9 @@ if(prob_name in modes) probabilities[prob_name] = text2num(prob_value) else - GLOB.config_error_log << "Unknown game mode probability configuration definition: [prob_name]." + WRITE_FILE(GLOB.config_error_log, "Unknown game mode probability configuration definition: [prob_name].") else - GLOB.config_error_log << "Incorrect probability configuration definition: [prob_name] [prob_value]." + WRITE_FILE(GLOB.config_error_log, "Incorrect probability configuration definition: [prob_name] [prob_value].") if("protect_roles_from_antagonist") protect_roles_from_antagonist = 1 @@ -726,7 +726,7 @@ // Value is in the form "LAWID,NUMBER" var/list/L = splittext(value, ",") if(L.len != 2) - GLOB.config_error_log << "Invalid LAW_WEIGHT: " + t + WRITE_FILE(GLOB.config_error_log, "Invalid LAW_WEIGHT: " + t) continue var/lawid = L[1] var/weight = text2num(L[2]) @@ -781,7 +781,7 @@ if("mice_roundstart") mice_roundstart = text2num(value) else - GLOB.config_error_log << "Unknown setting in configuration: '[name]'" + WRITE_FILE(GLOB.config_error_log, "Unknown setting in configuration: '[name]'") else if(type == "policies") policies[name] = value @@ -839,7 +839,7 @@ if ("disabled") currentmap = null else - GLOB.config_error_log << "Unknown command in map vote config: '[command]'" + WRITE_FILE(GLOB.config_error_log, "Unknown command in map vote config: '[command]'") /datum/configuration/proc/loadsql(filename) @@ -883,7 +883,7 @@ if("feedback_tableprefix") global.sqlfdbktableprefix = value else - GLOB.config_error_log << "Unknown setting in configuration: '[name]'" + WRITE_FILE(GLOB.config_error_log, "Unknown setting in configuration: '[name]'") /datum/configuration/proc/pick_mode(mode_name) // I wish I didn't have to instance the game modes in order to look up diff --git a/code/controllers/subsystem/assets.dm b/code/controllers/subsystem/assets.dm index 607b142c59..fd27c9424f 100644 --- a/code/controllers/subsystem/assets.dm +++ b/code/controllers/subsystem/assets.dm @@ -3,12 +3,15 @@ SUBSYSTEM_DEF(assets) init_order = INIT_ORDER_ASSETS flags = SS_NO_FIRE var/list/cache = list() + var/list/preload = list() /datum/controller/subsystem/assets/Initialize(timeofday) for(var/type in typesof(/datum/asset) - list(/datum/asset, /datum/asset/simple)) var/datum/asset/A = new type() A.register() + preload = cache.Copy() //don't preload assets generated during the round + for(var/client/C in GLOB.clients) - addtimer(CALLBACK(GLOBAL_PROC, .proc/getFilesSlow, C, cache, FALSE), 10) + addtimer(CALLBACK(GLOBAL_PROC, .proc/getFilesSlow, C, preload, FALSE), 10) ..() diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index afa77b0207..3344afcaaa 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -250,7 +250,7 @@ SUBSYSTEM_DEF(blackbox) return 0 return value -/datum/feedback_variable/proc/get_variable() +/datum/feedback_variable/proc/get_variable() return variable /datum/feedback_variable/proc/set_details(text) @@ -260,12 +260,12 @@ SUBSYSTEM_DEF(blackbox) /datum/feedback_variable/proc/add_details(text) if (istext(text)) if (!details) - details = text + details = "\"[text]\"" else - details += " [text]" + details += " | \"[text]\"" -/datum/feedback_variable/proc/get_details() +/datum/feedback_variable/proc/get_details() return details /datum/feedback_variable/proc/get_parsed() - return list(variable,value,details) + return list(variable,value,details) \ No newline at end of file diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 55132cba28..ebc1ad9474 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -283,13 +283,12 @@ SUBSYSTEM_DEF(garbage) /client/verb/purge_all_destroyed_objects() set category = "Debug" - if(SSgarbage) - while(SSgarbage.queue.len) - var/datum/o = locate(SSgarbage.queue[1]) - if(istype(o) && o.gc_destroyed) - del(o) - SSgarbage.totaldels++ - SSgarbage.queue.Cut(1, 2) + while(SSgarbage.queue.len) + var/datum/o = locate(SSgarbage.queue[1]) + if(istype(o) && o.gc_destroyed) + del(o) + SSgarbage.totaldels++ + SSgarbage.queue.Cut(1, 2) /datum/verb/qdel_then_find_references() set category = "Debug" diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 731166e0a9..f28373ef22 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -217,10 +217,9 @@ SUBSYSTEM_DEF(job) Debug("Running DO") //Holder for Triumvirate is stored in the SSticker, this just processes it - if(SSticker) + if(SSticker.triai) for(var/datum/job/ai/A in occupations) - if(SSticker.triai) - A.spawn_positions = 3 + A.spawn_positions = 3 //Get the players who are ready for(var/mob/dead/new_player/player in GLOB.player_list) diff --git a/code/controllers/subsystem/pai.dm b/code/controllers/subsystem/pai.dm index e5e83c85fc..2a1a04e21d 100644 --- a/code/controllers/subsystem/pai.dm +++ b/code/controllers/subsystem/pai.dm @@ -149,7 +149,6 @@ SUBSYSTEM_DEF(pai) continue if(!(ROLE_PAI in G.client.prefs.be_special)) continue - //G << 'sound/misc/server-ready.ogg' //Alerting them to their consideration to_chat(G, "[user] is requesting a pAI personality! Use the pAI button to submit yourself as one.") addtimer(CALLBACK(src, .proc/spam_again), spam_delay) var/list/available = list() diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index f4eebe95be..a0dc7c526d 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -49,7 +49,7 @@ SUBSYSTEM_DEF(persistence) satchel_string = pick_n_take(expanded_old_satchels) old_secret_satchels = jointext(expanded_old_satchels,"#") - secret_satchels[SSmapping.config.map_name] << old_secret_satchels + WRITE_FILE(secret_satchels[SSmapping.config.map_name], old_secret_satchels) var/list/chosen_satchel = splittext(satchel_string,"|") if(!chosen_satchel || isemptylist(chosen_satchel) || chosen_satchel.len != 3) //Malformed @@ -171,7 +171,7 @@ SUBSYSTEM_DEF(persistence) if(isemptylist(savable_obj)) continue old_secret_satchels += "[F.x]|[F.y]|[pick(savable_obj)]#" - secret_satchels[SSmapping.config.map_name] << old_secret_satchels + WRITE_FILE(secret_satchels[SSmapping.config.map_name], old_secret_satchels) /datum/controller/subsystem/persistence/proc/CollectChiselMessages() var/savefile/chisel_messages_sav = new /savefile("data/npc_saves/ChiselMessages.sav") @@ -181,14 +181,14 @@ SUBSYSTEM_DEF(persistence) log_world("Saved [saved_messages.len] engraved messages on map [SSmapping.config.map_name]") - chisel_messages_sav[SSmapping.config.map_name] << json_encode(saved_messages) + WRITE_FILE(chisel_messages_sav[SSmapping.config.map_name], json_encode(saved_messages)) /datum/controller/subsystem/persistence/proc/SaveChiselMessage(obj/structure/chisel_message/M) saved_messages += list(M.pack()) // dm eats one list /datum/controller/subsystem/persistence/proc/CollectTrophies() - trophy_sav << json_encode(saved_trophies) + WRITE_FILE(trophy_sav, json_encode(saved_trophies)) /datum/controller/subsystem/persistence/proc/SaveTrophy(obj/structure/displaycase/trophy/T) if(!T.added_roundstart && T.showpiece) diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm index e398f09a03..855c00b728 100644 --- a/code/controllers/subsystem/server_maint.dm +++ b/code/controllers/subsystem/server_maint.dm @@ -40,9 +40,15 @@ SUBSYSTEM_DEF(server_maint) /datum/controller/subsystem/server_maint/Shutdown() kick_clients_in_lobby("The round came to an end with you in the lobby.", TRUE) //second parameter ensures only afk clients are kicked + var/server = config.server for(var/thing in GLOB.clients) + if(!thing) + continue var/client/C = thing - if(C && config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite - C << link("byond://[config.server]") + var/datum/chatOutput/co = C.chatOutput + if(co) + co.ehjax_send(data = "roundrestart") + if(server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite + C << link("byond://[server]") #undef PING_BUFFER_TIME diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index f0c11a0d83..d88d788d37 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -34,8 +34,8 @@ SUBSYSTEM_DEF(shuttle) var/obj/docking_port/mobile/supply/supply var/ordernum = 1 //order number given to next order var/points = 5000 //number of trade-points we have - var/centcom_message = "" //Remarks from Centcom on how well you checked the last order. - var/list/discoveredPlants = list() //Typepaths for unusual plants we've already sent CentComm, associated with their potencies + var/centcom_message = "" //Remarks from CentCom on how well you checked the last order. + var/list/discoveredPlants = list() //Typepaths for unusual plants we've already sent CentCom, associated with their potencies var/list/supply_packs = list() var/list/shoppinglist = list() @@ -101,8 +101,6 @@ SUBSYSTEM_DEF(shuttle) T.color = "#00ffff" #endif - //world.log << "[transit_turfs.len] transit turfs registered" - /datum/controller/subsystem/shuttle/fire() for(var/thing in mobile) if(!thing) @@ -185,7 +183,7 @@ SUBSYSTEM_DEF(shuttle) switch(emergency.mode) if(SHUTTLE_RECALL) - to_chat(user, "The emergency shuttle may not be called while returning to Centcom.") + to_chat(user, "The emergency shuttle may not be called while returning to CentCom.") return if(SHUTTLE_CALL) to_chat(user, "The emergency shuttle is already on its way.") @@ -200,7 +198,7 @@ SUBSYSTEM_DEF(shuttle) to_chat(user, "The emergency shuttle is moving away to a safe distance.") return if(SHUTTLE_STRANDED) - to_chat(user, "The emergency shuttle has been disabled by Centcom.") + to_chat(user, "The emergency shuttle has been disabled by CentCom.") return call_reason = trim(html_encode(call_reason)) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 08fe58e167..e07d2db001 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -225,7 +225,7 @@ SUBSYSTEM_DEF(ticker) round_start_time = world.time to_chat(world, "Welcome to [station_name()], enjoy your stay!") - world << sound('sound/ai/welcome.ogg') + SEND_SOUND(world, sound('sound/ai/welcome.ogg')) current_state = GAME_STATE_PLAYING Master.SetRunLevel(RUNLEVEL_GAME) @@ -300,7 +300,7 @@ SUBSYSTEM_DEF(ticker) if("nuclear emergency") //Nuke wasn't on station when it blew up flick("intro_nuke",cinematic) sleep(35) - world << sound('sound/effects/explosionfar.ogg') + SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) station_explosion_detonation(bomb) flick("station_intact_fade_red",cinematic) cinematic.icon_state = "summary_nukefail" @@ -308,12 +308,12 @@ SUBSYSTEM_DEF(ticker) cinematic.icon_state = null flick("intro_cult",cinematic) sleep(25) - world << sound('sound/magic/enter_blood.ogg') + SEND_SOUND(world, sound('sound/magic/enter_blood.ogg')) sleep(28) - world << sound('sound/machines/terminal_off.ogg') + SEND_SOUND(world, sound('sound/machines/terminal_off.ogg')) sleep(20) flick("station_corrupted",cinematic) - world << sound('sound/effects/ghost.ogg') + SEND_SOUND(world, sound('sound/effects/ghost.ogg')) actually_blew_up = FALSE if("gang war") //Gang Domination (just show the override screen) cinematic.icon_state = "intro_malf_still" @@ -323,19 +323,19 @@ SUBSYSTEM_DEF(ticker) if("fake") //The round isn't over, we're just freaking people out for fun flick("intro_nuke",cinematic) sleep(35) - world << sound('sound/items/bikehorn.ogg') + SEND_SOUND(world, sound('sound/items/bikehorn.ogg')) flick("summary_selfdes",cinematic) actually_blew_up = FALSE else flick("intro_nuke",cinematic) sleep(35) - world << sound('sound/effects/explosionfar.ogg') + SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) station_explosion_detonation(bomb) if(NUKE_MISS_STATION || NUKE_SYNDICATE_BASE) //nuke was nowhere nearby //TODO: a really distant explosion animation sleep(50) - world << sound('sound/effects/explosionfar.ogg') + SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) station_explosion_detonation(bomb) actually_blew_up = station_missed == NUKE_SYNDICATE_BASE //don't kill everyone on station if it detonated off station else //station was destroyed @@ -346,42 +346,42 @@ SUBSYSTEM_DEF(ticker) flick("intro_nuke",cinematic) sleep(35) flick("station_explode_fade_red",cinematic) - world << sound('sound/effects/explosionfar.ogg') + SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) station_explosion_detonation(bomb) cinematic.icon_state = "summary_nukewin" if("AI malfunction") //Malf (screen,explosion,summary) flick("intro_malf",cinematic) sleep(76) flick("station_explode_fade_red",cinematic) - world << sound('sound/effects/explosionfar.ogg') + SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) station_explosion_detonation(bomb) //TODO: If we ever decide to actually detonate the vault bomb cinematic.icon_state = "summary_malf" if("blob") //Station nuked (nuke,explosion,summary) flick("intro_nuke",cinematic) sleep(35) flick("station_explode_fade_red",cinematic) - world << sound('sound/effects/explosionfar.ogg') + SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) station_explosion_detonation(bomb) //TODO: no idea what this case could be cinematic.icon_state = "summary_selfdes" if("cult") //Station nuked (nuke,explosion,summary) flick("intro_nuke",cinematic) sleep(35) flick("station_explode_fade_red",cinematic) - world << sound('sound/effects/explosionfar.ogg') + SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) station_explosion_detonation(bomb) //TODO: no idea what this case could be cinematic.icon_state = "summary_cult" if("no_core") //Nuke failed to detonate as it had no core flick("intro_nuke",cinematic) sleep(35) flick("station_intact",cinematic) - world << sound('sound/ambience/signal.ogg') + SEND_SOUND(world, sound('sound/ambience/signal.ogg')) addtimer(CALLBACK(src, .proc/finish_cinematic, null, FALSE), 100) return //Faster exit, since nothing happened else //Station nuked (nuke,explosion,summary) flick("intro_nuke",cinematic) sleep(35) flick("station_explode_fade_red", cinematic) - world << sound('sound/effects/explosionfar.ogg') + SEND_SOUND(world, sound('sound/effects/explosion_distant.ogg')) station_explosion_detonation(bomb) cinematic.icon_state = "summary_selfdes" //If its actually the end of the round, wait for it to end. @@ -479,7 +479,7 @@ SUBSYSTEM_DEF(ticker) var/list/area/shuttle_areas if(SSshuttle && SSshuttle.emergency) shuttle_areas = SSshuttle.emergency.shuttle_areas - if(!Player.onCentcom() && !Player.onSyndieBase()) + if(!Player.onCentCom() && !Player.onSyndieBase()) to_chat(Player, "You managed to survive, but were marooned on [station_name()]...") else num_escapees++ @@ -636,7 +636,7 @@ SUBSYSTEM_DEF(ticker) if(living_player_count() < config.hard_popcap) if(next_in_line && next_in_line.client) to_chat(next_in_line, "A slot has opened! You have approximately 20 seconds to join. \>\>Join Game\<\<") - next_in_line << sound('sound/misc/notice1.ogg') + SEND_SOUND(next_in_line, sound('sound/misc/notice1.ogg')) next_in_line.LateChoices() return queued_players -= next_in_line //Client disconnected, remove he @@ -804,7 +804,7 @@ SUBSYSTEM_DEF(ticker) /datum/controller/subsystem/ticker/proc/save_mode(the_mode) var/F = file("data/mode.txt") fdel(F) - F << the_mode + WRITE_FILE(F, the_mode) /datum/controller/subsystem/ticker/proc/SetRoundEndSound(the_sound) set waitfor = FALSE @@ -858,4 +858,4 @@ SUBSYSTEM_DEF(ticker) 'sound/roundend/disappointed.ogg'\ ) - world << sound(round_end_sound) + SEND_SOUND(world, sound(round_end_sound)) diff --git a/code/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm index 6c5466d8d9..a0bcb5feec 100644 --- a/code/controllers/subsystem/title.dm +++ b/code/controllers/subsystem/title.dm @@ -53,7 +53,7 @@ SUBSYSTEM_DEF(title) /datum/controller/subsystem/title/Shutdown() if(file_path) var/F = file("data/previous_title.dat") - F << file_path + WRITE_FILE(F, file_path) for(var/thing in GLOB.clients) if(!thing) diff --git a/code/datums/action.dm b/code/datums/action.dm index 7db3692fd2..ecaa70387b 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -169,7 +169,7 @@ /datum/action/item_action/toggle_firemode name = "Toggle Firemode" - + /datum/action/item_action/rcl name = "Change Cable Color" button_icon_state = "rcl_rainbow" @@ -417,6 +417,7 @@ button_icon_state = "smoke" /datum/action/item_action/ninjaboost + check_flags = AB_CHECK_RESTRAINED|AB_CHECK_CONSCIOUS name = "Adrenaline Boost" desc = "Inject a secret chemical that will counteract all movement-impairing effect." button_icon_state = "repulse" @@ -489,7 +490,8 @@ var/obj/effect/proc_holder/spell/S = target S.action = src name = S.name - icon_icon = S.action_icon + desc = S.desc + button_icon = S.action_icon button_icon_state = S.action_icon_state background_icon_state = S.action_background_icon_state button.name = name diff --git a/code/datums/antagonists/datum_traitor.dm b/code/datums/antagonists/datum_traitor.dm index 3e90228c19..d706eff62b 100644 --- a/code/datums/antagonists/datum_traitor.dm +++ b/code/datums/antagonists/datum_traitor.dm @@ -23,6 +23,7 @@ /datum/antagonist/traitor/human should_specialise = FALSE var/should_equip = TRUE + /datum/antagonist/traitor/human/custom silent = TRUE should_give_codewords = FALSE @@ -31,6 +32,7 @@ /datum/antagonist/traitor/AI should_specialise = FALSE + /datum/antagonist/traitor/AI/custom silent = TRUE should_give_codewords = FALSE @@ -38,9 +40,8 @@ /datum/antagonist/traitor/on_body_transfer(mob/living/old_body, mob/living/new_body) - if(issilicon(new_body) && issilicon(old_body)) - ..() - else + // human <-> silicon only + if(old_body && issilicon(new_body) ^ issilicon(old_body)) silent = TRUE owner.add_antag_datum(base_datum_custom) for(var/datum/antagonist/traitor/new_datum in owner.antag_datums) @@ -49,13 +50,14 @@ transfer_important_variables(new_datum) break on_removal() - - + else + ..() /datum/antagonist/traitor/human/custom //used to give custom objectives silent = TRUE give_objectives = FALSE should_give_codewords = FALSE + /datum/antagonist/traitor/AI/custom //used to give custom objectives silent = TRUE give_objectives = FALSE @@ -83,7 +85,8 @@ if(owner.assigned_role == "Clown") var/mob/living/carbon/human/traitor_mob = owner.current if(traitor_mob&&istype(traitor_mob)) - if(!silent) to_chat(traitor_mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") + if(!silent) + to_chat(traitor_mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") traitor_mob.dna.remove_mutation(CLOWNMUT) /datum/antagonist/traitor/remove_innate_effects() diff --git a/code/datums/antagonists/devil.dm b/code/datums/antagonists/devil.dm index c8f00d1995..077fb94e52 100644 --- a/code/datums/antagonists/devil.dm +++ b/code/datums/antagonists/devil.dm @@ -280,7 +280,7 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", if(!D) return to_chat(world, "\"SLOTH, WRATH, GLUTTONY, ACEDIA, ENVY, GREED, PRIDE! FIRES OF HELL AWAKEN!!\"") - world << 'sound/hallucinations/veryfar_noise.ogg' + SEND_SOUND(world, sound('sound/hallucinations/veryfar_noise.ogg')) give_appropriate_spells() D.convert_to_archdevil() if(istype(D.loc, /obj/effect/dummy/slaughter/)) diff --git a/code/datums/antagonists/ninja.dm b/code/datums/antagonists/ninja.dm index 6948740687..4efb17f154 100644 --- a/code/datums/antagonists/ninja.dm +++ b/code/datums/antagonists/ninja.dm @@ -141,7 +141,7 @@ /datum/antagonist/ninja/greet() - owner.current << sound('sound/effects/ninja_greeting.ogg') + SEND_SOUND(owner.current, sound('sound/effects/ninja_greeting.ogg')) to_chat(owner.current, "I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!") to_chat(owner.current, "Surprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!") to_chat(owner.current, "Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.") diff --git a/code/datums/callback.dm b/code/datums/callback.dm index 1b5c25fe18..624fed58a6 100644 --- a/code/datums/callback.dm +++ b/code/datums/callback.dm @@ -100,3 +100,57 @@ if (object == GLOBAL_PROC) return call(delegate)(arglist(calling_arguments)) return call(object, delegate)(arglist(calling_arguments)) + + +/datum/callback_select + var/list/finished + var/pendingcount + var/total + +/datum/callback_select/New(count, savereturns) + total = count + if (savereturns) + finished = new(count) + + +/datum/callback_select/proc/invoke_callback(index, datum/callback/callback, list/callback_args, savereturn = TRUE) + set waitfor = FALSE + if (!callback || !istype(callback)) + //This check only exists because the alternative is callback_select would block forever if given invalid data + CRASH("invalid callback passed to invoke_callback") + if (!length(callback_args)) + callback_args = list() + pendingcount++ + var/rtn = callback.Invoke(arglist(callback_args)) + pendingcount-- + if (savereturn) + finished[index] = rtn + + + + +//runs a list of callbacks asynchronously, returning once all of them return. +//callbacks can be repeated. +//callbacks-args is a optional list of argument lists, in the same order as the callbacks, +// the inner lists will be sent to the callbacks when invoked() as additional args. +//can optionly save and return a list of return values, in the same order as the original list of callbacks +//resolution is the number of byond ticks between checks. +/proc/callback_select(list/callbacks, list/callback_args, savereturns = TRUE, resolution = 1) + if (!callbacks) + return + var/count = length(callbacks) + if (!count) + return + if (!callback_args) + callback_args = list() + + callback_args.len = count + + var/datum/callback_select/CS = new(count, savereturns) + for (var/i in 1 to count) + CS.invoke_callback(i, callbacks[i], callback_args[i], savereturns) + + while(CS.pendingcount) + sleep(resolution*world.tick_lag) + return CS.finished + diff --git a/code/datums/callback.dm.rej b/code/datums/callback.dm.rej new file mode 100644 index 0000000000..14faac8412 --- /dev/null +++ b/code/datums/callback.dm.rej @@ -0,0 +1,62 @@ +diff a/code/datums/callback.dm b/code/datums/callback.dm (rejected hunks) +@@ -100,60 +100,3 @@ + if (object == GLOBAL_PROC) + return call(delegate)(arglist(calling_arguments)) + return call(object, delegate)(arglist(calling_arguments)) +- +- +-/datum/callback_select +- var/list/finished +- var/pendingcount +- var/total +- +-/datum/callback_select/New(count, savereturns) +- total = count +- if (savereturns) +- finished = new(count) +- +- +-/datum/callback_select/proc/invoke_callback(index, datum/callback/callback, list/callback_args, savereturn = TRUE) +- set waitfor = FALSE +- if (!callback || !istype(callback)) +- //This check only exists because the alternative is callback_select would block forever if given invalid data +- CRASH("invalid callback passed to invoke_callback") +- if (!length(callback_args)) +- callback_args = list() +- pendingcount++ +- debug_usr("calling callback") +- var/rtn = callback.Invoke(arglist(callback_args)) +- debug_usr("callback returned") +- pendingcount-- +- if (savereturn) +- finished[index] = rtn +- +- +- +- +-//runs a list of callbacks asynchronously, returning once all of them return. +-//callbacks can be repeated. +-//callbacks-args is a optional list of argument lists, in the same order as the callbacks, +-// the inner lists will be sent to the callbacks when invoked() as additional args. +-//can optionly save and return a list of return values, in the same order as the original list of callbacks +-//resolution is the number of byond ticks between checks. +-/proc/callback_select(list/callbacks, list/callback_args, savereturns = TRUE, resolution = 1) +- if (!callbacks) +- return +- var/count = length(callbacks) +- if (!count) +- return +- if (!callback_args) +- callback_args = list() +- +- callback_args.len = count +- +- var/datum/callback_select/CS = new(count, savereturns) +- for (var/i in 1 to count) +- CS.invoke_callback(i, callbacks[i], callback_args[i], savereturns) +- debug_usr("starting callbacks: [CS.pendingcount]") +- while(CS.pendingcount) +- debug_usr("callbacks: [CS.pendingcount]") +- sleep(resolution*world.tick_lag) +- return CS.finished +- diff --git a/code/datums/components/component.dm b/code/datums/components/component.dm index 20e2a6e9ac..4d5fae2115 100644 --- a/code/datums/components/component.dm +++ b/code/datums/components/component.dm @@ -18,7 +18,38 @@ qdel(src) return P.SendSignal(COMSIG_COMPONENT_ADDED, src) - LAZYADD(P.datum_components, src) + + //lazy init the parent's dc list + var/list/dc = P.datum_components + if(!dc) + P.datum_components = dc = list() + + //set up the typecache + var/our_type = type + for(var/I in _GetInverseTypeListExceptRoot(our_type)) + var/test = dc[I] + if(test) //already another component of this type here + var/list/components_of_type + if(!islist(test)) + components_of_type = list(test) + dc[I] = components_of_type + else + components_of_type = test + if(I == our_type) //exact match, take priority + var/inserted = FALSE + for(var/J in 1 to components_of_type.len) + var/datum/component/C = components_of_type[J] + if(C.type != our_type) //but not over other exact matches + components_of_type.Insert(J, I) + inserted = TRUE + break + if(!inserted) + components_of_type += src + else //indirect match, back of the line with ya + components_of_type += src + else //only component of this type, no list + dc[I] = src + parent = P /datum/component/Destroy() @@ -33,7 +64,20 @@ /datum/component/proc/_RemoveNoSignal() var/datum/P = parent if(P) - LAZYREMOVE(P.datum_components, src) + var/list/dc = P.datum_components + var/our_type = type + for(var/I in _GetInverseTypeListExceptRoot(our_type)) + var/list/components_of_type = dc[I] + if(islist(components_of_type)) // + var/list/subtracted = components_of_type - src + if(subtracted.len == 1) //only 1 guy left + dc[I] = subtracted[1] //make him special + else + dc[I] = subtracted + else //just us + dc -= I + if(!dc.len) + P.datum_components = null parent = null /datum/component/proc/RegisterSignal(sig_type, proc_on_self, override = FALSE) @@ -66,6 +110,13 @@ /datum/component/proc/OnTransfer(datum/new_parent) return +/datum/component/proc/_GetInverseTypeListExceptRoot(our_type_cached) + var/datum/component/current_type = our_type_cached + . = list() + while (current_type != /datum/component) + . += current_type + current_type = type2parent(current_type) + /datum/proc/SendSignal(sigtype, ...) var/list/comps = datum_components . = FALSE @@ -81,21 +132,32 @@ return /datum/proc/GetComponent(c_type) - for(var/I in datum_components) - if(istype(I, c_type)) - return I + var/list/dc = datum_components + if(!dc) + return null + . = dc[c_type] + if(islist(.)) + return .[1] /datum/proc/GetExactComponent(c_type) - for(var/I in datum_components) - var/datum/component/C = I + var/list/dc = datum_components + if(!dc) + return null + var/datum/component/C = dc[c_type] + if(C) + if(islist(C)) + C = C[1] if(C.type == c_type) - return I + return C + return null /datum/proc/GetComponents(c_type) - . = list() - for(var/I in datum_components) - if(istype(I, c_type)) - . += I + var/list/dc = datum_components + if(!dc) + return null + . = dc[c_type] + if(!islist(.)) + return list(.) /datum/proc/AddComponent(new_type, ...) var/nt = new_type diff --git a/code/datums/components/component.dm.rej b/code/datums/components/component.dm.rej index 17aaf74125..3cf20d57b0 100644 --- a/code/datums/components/component.dm.rej +++ b/code/datums/components/component.dm.rej @@ -1,63 +1 @@ -diff a/code/datums/components/component.dm b/code/datums/components/component.dm (rejected hunks) -@@ -26,7 +26,7 @@ - - //set up the typecache - var/our_type = type -- for(var/I in _GetInverseTypeListExceptRoot(our_type)) -+ for(var/I in _GetInverseTypeList(our_type)) - var/test = dc[I] - if(test) //already another component of this type here - var/list/components_of_type -@@ -66,7 +66,7 @@ - if(P) - var/list/dc = P.datum_components - var/our_type = type -- for(var/I in _GetInverseTypeListExceptRoot(our_type)) -+ for(var/I in _GetInverseTypeList(our_type)) - var/list/components_of_type = dc[I] - if(islist(components_of_type)) // - var/list/subtracted = components_of_type - src -@@ -110,25 +110,33 @@ - /datum/component/proc/OnTransfer(datum/new_parent) - return - --/datum/component/proc/_GetInverseTypeListExceptRoot(our_type_cached) -- var/datum/component/current_type = our_type_cached -- . = list() -+/datum/component/proc/_GetInverseTypeList(current_type) -+ . = list(current_type) - while (current_type != /datum/component) -- . += current_type - current_type = type2parent(current_type) -+ . += current_type - - /datum/var/list/datum_components //special typecache of /datum/component - - /datum/proc/SendSignal(sigtype, ...) - var/list/comps = datum_components - . = FALSE -- for(var/I in comps) -- var/datum/component/C = I -- if(!C.enabled) -- continue -- if(C.ReceiveSignal(arglist(args))) -+ if(!comps) -+ return -+ var/target = comps[/datum/component] -+ if(!islist(target)) -+ var/datum/component/C = target -+ if(C.enabled && C.ReceiveSignal(arglist(args))) - ComponentActivated(C) -- . = TRUE -+ return TRUE -+ else -+ for(var/I in target) -+ var/datum/component/C = I -+ if(!C.enabled) -+ continue -+ if(C.ReceiveSignal(arglist(args))) -+ ComponentActivated(C) -+ . = TRUE - - /datum/proc/ComponentActivated(datum/component/C) - return +- \ No newline at end of file diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index e519cf6af3..87c6ad7334 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -929,6 +929,26 @@ manipulate_organs(C) href_list["datumrefresh"] = href_list["editorgans"] + else if(href_list["hallucinate"]) + if(!check_rights(0)) + return + + var/mob/living/carbon/C = locate(href_list["hallucinate"]) in GLOB.mob_list + if(!istype(C)) + to_chat(usr, "This can only be done to instances of type /mob/living/carbon") + return + + var/list/hallucinations = subtypesof(/datum/hallucination) + var/result = input(usr, "Choose the hallucination to apply","Send Hallucination") as null|anything in hallucinations + if(!usr) + return + if(QDELETED(C)) + to_chat(usr, "Mob doesn't exist anymore") + return + + if(result) + new result(C, TRUE) + else if(href_list["makehuman"]) if(!check_rights(R_SPAWN)) return diff --git a/code/datums/diseases/advance/symptoms/hallucigen.dm b/code/datums/diseases/advance/symptoms/hallucigen.dm index f913d49573..9bfd5b0baf 100644 --- a/code/datums/diseases/advance/symptoms/hallucigen.dm +++ b/code/datums/diseases/advance/symptoms/hallucigen.dm @@ -59,4 +59,4 @@ Bonus else if(prob(base_message_chance)) to_chat(M, "[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]") - M.hallucination += (15 * power) + M.hallucination += (45 * power) diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 5150938258..4bacf2d9e8 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -29,6 +29,10 @@ destination.dna.temporary_mutations = temporary_mutations.Copy() if(transfer_SE) destination.dna.struc_enzymes = struc_enzymes + if(ishuman(destination)) + var/mob/living/carbon/human/H = destination + H.give_genitals(TRUE)//This gives the body the genitals of this DNA. Used for any transformations based on DNA + destination.flavor_text = destination.dna.features["flavor_text"] //Update the flavor_text to use new dna text /datum/dna/proc/copy_dna(datum/dna/new_dna) new_dna.unique_enzymes = unique_enzymes @@ -228,6 +232,7 @@ if(newfeatures) dna.features = newfeatures + flavor_text = dna.features["flavor_text"] //Update the flavor_text to use new dna text if(mrace) set_species(mrace, icon_update=0) @@ -247,6 +252,8 @@ dna.struc_enzymes = se domutcheck() + give_genitals(TRUE)//Give all genitalia that DNA says you should have, remove any pre-existing ones as this is a hardset! + if(mrace || newfeatures || ui) update_body() update_hair() diff --git a/code/datums/map_config.dm b/code/datums/map_config.dm index e80c2848cd..5238c65465 100644 --- a/code/datums/map_config.dm +++ b/code/datums/map_config.dm @@ -11,7 +11,7 @@ var/minetype = "lavaland" - var/list/transition_config = list(CENTCOMM = SELFLOOPING, + var/list/transition_config = list(CENTCOM = SELFLOOPING, MAIN_STATION = CROSSLINKED, EMPTY_AREA_1 = CROSSLINKED, EMPTY_AREA_2 = CROSSLINKED, @@ -115,8 +115,8 @@ return UNAFFECTED if("MAIN_STATION") return MAIN_STATION - if("CENTCOMM") - return CENTCOMM + if("CENTCOM") + return CENTCOM if("MINING") return MINING if("EMPTY_AREA_1") diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 4ee6725e2f..a31aab8607 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -120,6 +120,10 @@ transfer_martial_arts(new_character) if(active || force_key_move) new_character.key = key //now transfer the key to link the client to our new body + if(isliving(new_character)) //New humans and such are by default enabled arousal. Let's always use the new mind's prefs. + var/mob/living/L = new_character + L.canbearoused = L.client.prefs.arousable //Technically this should make taking over a character mean the body gain the new minds setting... + L.update_arousal_hud() //Removes the old icon /datum/mind/proc/store_memory(new_text) memory += "[new_text]
" @@ -396,7 +400,15 @@ if (assigned_role in GLOB.command_positions) text += "HEAD|loyal|employee|headrev|rev" else if (src in SSticker.mode.head_revolutionaries) - text += "head|loyal|employee|HEADREV|rev" + var/last_healthy_headrev = TRUE + for(var/I in SSticker.mode.head_revolutionaries) + if(I == src) + continue + var/mob/M = I + if(M.z == ZLEVEL_STATION && !M.stat) + last_healthy_headrev = FALSE + break + text += "head|loyal|employee|[last_healthy_headrev ? "LAST " : ""]HEADREV|rev" text += "
Flash: give" var/list/L = current.get_contents() @@ -801,11 +813,11 @@ possible_targets += possible_target.current var/mob/def_target = null - var/objective_list[] = list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain, /datum/objective/maroon) - if (objective&&(objective.type in objective_list) && objective:target) - def_target = objective:target.current + var/list/objective_list = typecacheof(list(/datum/objective/assassinate, /datum/objective/protect, /datum/objective/debrain, /datum/objective/maroon)) + if (is_type_in_typecache(objective, objective_list) && objective.target) + def_target = objective.target.current - var/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets + var/mob/new_target = input("Select target:", "Objective target", def_target) as null|anything in possible_targets if (!new_target) return @@ -813,12 +825,12 @@ if (new_target == "Free objective") new_objective = new objective_path new_objective.owner = src - new_objective:target = null + new_objective.target = null new_objective.explanation_text = "Free objective" else new_objective = new objective_path new_objective.owner = src - new_objective:target = new_target:mind + new_objective.target = new_target.mind //Will display as special role if the target is set as MODE. Ninjas/commandos/nuke ops. new_objective.update_explanation_text() @@ -1690,10 +1702,7 @@ else mind = new /datum/mind(key) - if(SSticker) - SSticker.minds += mind - else - stack_trace("mind_initialize(): No SSticker ready") + SSticker.minds += mind if(!mind.name) mind.name = real_name mind.current = src diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index 6725e1c541..88beec629f 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -82,7 +82,7 @@ id = "derelict4" suffix = "derelict4.dmm" name = "Derelict 4" - description = "Centcom ferries have never crashed, will never crash, there is no current investigation into a crashed ferry, and we will not let Internal Affairs trample over high security \ + description = "CentCom ferries have never crashed, will never crash, there is no current investigation into a crashed ferry, and we will not let Internal Affairs trample over high security \ information in the name of this baseless witchhunt." /datum/map_template/ruin/space/derelict5 diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index a86574e710..ce38d0af3e 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -133,7 +133,7 @@ /datum/map_template/shuttle/emergency/cramped suffix = "cramped" name = "Secure Transport Vessel 5 (STV5)" - description = "Well, looks like Centcomm only had this ship in the area, they probably weren't expecting you to need evac for a while. \ + description = "Well, looks like CentCom only had this ship in the area, they probably weren't expecting you to need evac for a while. \ Probably best if you don't rifle around in whatever equipment they were transporting. I hope you're friendly with your coworkers, because there is very little space in this thing.\n\ \n\ Contains contraband armory guns, maintenance loot, and abandoned crates!" @@ -181,7 +181,7 @@ suffix = "supermatter" name = "Hyperfractal Gigashuttle" description = "\"I dunno, this seems kinda needlessly complicated.\"\n\ - \"This shuttle has very a very high safety record, according to Centcom Officer Cadet Yins.\"\n\ + \"This shuttle has very a very high safety record, according to CentCom Officer Cadet Yins.\"\n\ \"Are you sure?\"\n\ \"Yes, it has a safety record of N-A-N, which is apparently larger than 100%.\"" admin_notes = "Supermatter that spawns on shuttle is special anchored 'hugbox' supermatter that cannot take damage and does not take in or emit gas. \ @@ -215,7 +215,7 @@ /datum/map_template/shuttle/ferry/base suffix = "base" name = "transport ferry" - description = "Standard issue Box/Metastation Centcom ferry." + description = "Standard issue Box/Metastation CentCom ferry." /datum/map_template/shuttle/ferry/meat suffix = "meat" @@ -267,7 +267,7 @@ /datum/map_template/shuttle/emergency/raven suffix = "raven" - name = "Centcomm Raven Battlecruiser" - description = "The Centcomm Raven Battlecruiser is currently docked at the Centcomm ship bay awaiting a mission, this Battlecruiser has been reassigned as an emergency escape shuttle for currently unknown reasons. The Centcomm Raven Battlecruiser should comfortably fit a medium to large crew size crew and is complete with all required facitlities including a top of the range Centcomm Medical Bay." + name = "CentCom Raven Battlecruiser" + description = "The CentCom Raven Battlecruiser is currently docked at the CentCom ship bay awaiting a mission, this Battlecruiser has been reassigned as an emergency escape shuttle for currently unknown reasons. The CentCom Raven Battlecruiser should comfortably fit a medium to large crew size crew and is complete with all required facitlities including a top of the range CentCom Medical Bay." admin_notes = "The long way home" credit_cost = 12500 diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 485ca00515..c15ede7b3e 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -37,7 +37,7 @@ icon_state = "shadow_mend" /datum/status_effect/void_price/tick() - owner << sound('sound/magic/summon_karp.ogg', volume = 25) + SEND_SOUND(owner, sound('sound/magic/summon_karp.ogg', volume = 25)) owner.adjustBruteLoss(3) @@ -247,7 +247,7 @@ for(var/datum/mind/B in SSticker.mode.cult) if(isliving(B.current)) var/mob/living/M = B.current - M << 'sound/hallucinations/veryfar_noise.ogg' + SEND_SOUND(M, sound('sound/hallucinations/veryfar_noise.ogg')) to_chat(M, "The Cult's Master, [owner], has fallen in \the [A]!") /datum/status_effect/cult_master/tick() diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index 7b43bf6396..f4f2fc089c 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -69,7 +69,7 @@ if(telegraph_message) to_chat(M, telegraph_message) if(telegraph_sound) - M << sound(telegraph_sound) + SEND_SOUND(M, sound(telegraph_sound)) addtimer(CALLBACK(src, .proc/start), telegraph_duration) /datum/weather/proc/start() @@ -83,7 +83,7 @@ if(weather_message) to_chat(M, weather_message) if(weather_sound) - M << sound(weather_sound) + SEND_SOUND(M, sound(weather_sound)) START_PROCESSING(SSweather, src) addtimer(CALLBACK(src, .proc/wind_down), weather_duration) @@ -98,7 +98,7 @@ if(end_message) to_chat(M, end_message) if(end_sound) - M << sound(end_sound) + SEND_SOUND(M, sound(end_sound)) STOP_PROCESSING(SSweather, src) addtimer(CALLBACK(src, .proc/end), end_duration) diff --git a/code/datums/wires/mulebot.dm b/code/datums/wires/mulebot.dm index 00b2dd10b8..9aa2ca81e8 100644 --- a/code/datums/wires/mulebot.dm +++ b/code/datums/wires/mulebot.dm @@ -20,12 +20,12 @@ var/mob/living/simple_animal/bot/mulebot/M = holder switch(wire) if(WIRE_POWER1, WIRE_POWER2) - holder.visible_message("[bicon(M)] The charge light flickers.") + holder.visible_message("[icon2html(M, viewers(holder))] The charge light flickers.") if(WIRE_AVOIDANCE) - holder.visible_message("[bicon(M)] The external warning lights flash briefly.") + holder.visible_message("[icon2html(M, viewers(holder))] The external warning lights flash briefly.") if(WIRE_LOADCHECK) - holder.visible_message("[bicon(M)] The load platform clunks.") + holder.visible_message("[icon2html(M, viewers(holder))] The load platform clunks.") if(WIRE_MOTOR1, WIRE_MOTOR2) - holder.visible_message("[bicon(M)] The drive motor whines briefly.") + holder.visible_message("[icon2html(M, viewers(holder))] The drive motor whines briefly.") else - holder.visible_message("[bicon(M)] You hear a radio crackle.") \ No newline at end of file + holder.visible_message("[icon2html(M, viewers(holder))] You hear a radio crackle.") \ No newline at end of file diff --git a/code/datums/wires/particle_accelerator.dm b/code/datums/wires/particle_accelerator.dm index 436b8be3ec..d38147f1ec 100644 --- a/code/datums/wires/particle_accelerator.dm +++ b/code/datums/wires/particle_accelerator.dm @@ -25,7 +25,7 @@ if(WIRE_INTERFACE) C.interface_control = !C.interface_control if(WIRE_LIMIT) - C.visible_message("[bicon(C)][C] makes a large whirring noise.") + C.visible_message("[icon2html(C, viewers(holder))][C] makes a large whirring noise.") /datum/wires/particle_accelerator/control_box/on_cut(wire, mend) var/obj/machinery/particle_accelerator/control_box/C = holder diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm index d4eeb0cc39..65438830a2 100644 --- a/code/datums/wires/robot.dm +++ b/code/datums/wires/robot.dm @@ -21,7 +21,7 @@ var/list/status = list() status += "The law sync module is [R.lawupdate ? "on" : "off"]." status += "The intelligence link display shows [R.connected_ai ? R.connected_ai.name : "NULL"]." - status += "The camera light is [!isnull(R.camera) && R.camera.status ? "on" : "off"]." + status += "The camera light is [!isnull(R.builtInCamera) && R.builtInCamera.status ? "on" : "off"]." status += "The lockdown indicator is [R.lockcharge ? "on" : "off"]." status += "The reset module hardware light is [R.has_module() ? "on" : "off"]." return status @@ -45,9 +45,9 @@ else R.notify_ai(TRUE) if(WIRE_CAMERA) // Pulse to disable the camera. - if(!isnull(R.camera) && !R.scrambledcodes) - R.camera.toggle_cam(usr, 0) - R.visible_message("[R]'s camera lense focuses loudly.", "Your camera lense focuses loudly.") + if(!QDELETED(R.builtInCamera) && !R.scrambledcodes) + R.builtInCamera.toggle_cam(usr, 0) + R.visible_message("[R]'s camera lens focuses loudly.", "Your camera lens focuses loudly.") if(WIRE_LAWSYNC) // Forces a law update if possible. if(R.lawupdate) R.visible_message("[R] gently chimes.", "LawSync protocol engaged.") @@ -75,10 +75,10 @@ else if(!R.deployed) //AI shells must always have the same laws as the AI R.lawupdate = FALSE if (WIRE_CAMERA) // Disable the camera. - if(!isnull(R.camera) && !R.scrambledcodes) - R.camera.status = mend - R.camera.toggle_cam(usr, 0) - R.visible_message("[R]'s camera lense focuses loudly.", "Your camera lense focuses loudly.") + if(!QDELETED(R.builtInCamera) && !R.scrambledcodes) + R.builtInCamera.status = mend + R.builtInCamera.toggle_cam(usr, 0) + R.visible_message("[R]'s camera lens focuses loudly.", "Your camera lens focuses loudly.") if(WIRE_LOCKDOWN) // Simple lockdown. R.SetLockdown(!mend) if(WIRE_RESET_MODULE) diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm index 78acc42eb0..043110f5d3 100644 --- a/code/datums/wires/syndicatebomb.dm +++ b/code/datums/wires/syndicatebomb.dm @@ -19,21 +19,21 @@ switch(wire) if(WIRE_BOOM) if(B.active) - holder.visible_message("[bicon(B)] An alarm sounds! It's go-") + holder.visible_message("[icon2html(B, viewers(holder))] An alarm sounds! It's go-") B.explode_now = TRUE tell_admins(B) if(WIRE_UNBOLT) - holder.visible_message("[bicon(B)] The bolts spin in place for a moment.") + holder.visible_message("[icon2html(B, viewers(holder))] The bolts spin in place for a moment.") if(WIRE_DELAY) if(B.delayedbig) - holder.visible_message("[bicon(B)] The bomb has already been delayed.") + holder.visible_message("[icon2html(B, viewers(holder))] The bomb has already been delayed.") else - holder.visible_message("[bicon(B)] The bomb chirps.") + holder.visible_message("[icon2html(B, viewers(holder))] The bomb chirps.") playsound(B, 'sound/machines/chime.ogg', 30, 1) B.detonation_timer += 300 B.delayedbig = TRUE if(WIRE_PROCEED) - holder.visible_message("[bicon(B)] The bomb buzzes ominously!") + holder.visible_message("[icon2html(B, viewers(holder))] The bomb buzzes ominously!") playsound(B, 'sound/machines/buzz-sigh.ogg', 30, 1) var/seconds = B.seconds_remaining() if(seconds >= 61) // Long fuse bombs can suddenly become more dangerous if you tinker with them. @@ -44,13 +44,13 @@ B.detonation_timer = world.time + 100 if(WIRE_ACTIVATE) if(!B.active && !B.defused) - holder.visible_message("[bicon(B)] You hear the bomb start ticking!") + holder.visible_message("[icon2html(B, viewers(holder))] You hear the bomb start ticking!") B.activate() B.update_icon() else if(B.delayedlittle) - holder.visible_message("[bicon(B)] Nothing happens.") + holder.visible_message("[icon2html(B, viewers(holder))] Nothing happens.") else - holder.visible_message("[bicon(B)] The bomb seems to hesitate for a moment.") + holder.visible_message("[icon2html(B, viewers(holder))] The bomb seems to hesitate for a moment.") B.detonation_timer += 100 B.delayedlittle = TRUE @@ -62,24 +62,24 @@ B.defused = FALSE // Cutting and mending all the wires of an inactive bomb will thus cure any sabotage. else if(B.active) - holder.visible_message("[bicon(B)] An alarm sounds! It's go-") + holder.visible_message("[icon2html(B, viewers(holder))] An alarm sounds! It's go-") B.explode_now = TRUE tell_admins(B) else B.defused = TRUE if(WIRE_UNBOLT) if(!mend && B.anchored) - holder.visible_message("[bicon(B)] The bolts lift out of the ground!") + holder.visible_message("[icon2html(B, viewers(holder))] The bolts lift out of the ground!") playsound(B, 'sound/effects/stealthoff.ogg', 30, 1) B.anchored = FALSE if(WIRE_PROCEED) if(!mend && B.active) - holder.visible_message("[bicon(B)] An alarm sounds! It's go-") + holder.visible_message("[icon2html(B, viewers(holder))] An alarm sounds! It's go-") B.explode_now = TRUE tell_admins(B) if(WIRE_ACTIVATE) if(!mend && B.active) - holder.visible_message("[bicon(B)] The timer stops! The bomb has been defused!") + holder.visible_message("[icon2html(B, viewers(holder))] The timer stops! The bomb has been defused!") B.active = FALSE B.defused = TRUE B.update_icon() diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 2a139da456..218cb59f41 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -41,7 +41,7 @@ var/static_environ var/has_gravity = FALSE - var/noteleport = FALSE //Are you forbidden from teleporting to the area? (centcomm, mobs, wizard, hand teleporter) + var/noteleport = FALSE //Are you forbidden from teleporting to the area? (centcom, mobs, wizard, hand teleporter) var/hidden = FALSE //Hides area from player Teleport function. var/safe = FALSE //Is the area teleport-safe: no space / radiation / aggresive mobs / other dangers @@ -338,7 +338,14 @@ GLOBAL_LIST_EMPTY(teleportlocs) else icon_state = "blue-red" else - icon_state = null + var/weather_icon + for(var/V in SSweather.existing_weather) + var/datum/weather/W = V + if(src in W.impacted_areas) + W.update_areas() + weather_icon = TRUE + if(!weather_icon) + icon_state = null /area/space/updateicon() icon_state = null @@ -432,7 +439,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) // Ambience goes down here -- make sure to list each area separately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch if(L.client && !L.client.ambience_playing && L.client.prefs.toggles & SOUND_SHIP_AMBIENCE) L.client.ambience_playing = 1 - L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ) + SEND_SOUND(L, sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ)) if(!(L.client && (L.client.prefs.toggles & SOUND_AMBIENCE))) return //General ambience check is below the ship ambience so one can play without the other @@ -441,7 +448,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) var/sound = pick(ambientsounds) if(!L.client.played) - L << sound(sound, repeat = 0, wait = 0, volume = 25, channel = CHANNEL_AMBIENCE) + SEND_SOUND(L, sound(sound, repeat = 0, wait = 0, volume = 25, channel = CHANNEL_AMBIENCE)) L.client.played = 1 sleep(600) //ewww - this is very very bad if(L.&& L.client) diff --git a/code/game/area/areas.dm.rej b/code/game/area/areas.dm.rej new file mode 100644 index 0000000000..3c097d1229 --- /dev/null +++ b/code/game/area/areas.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/area/areas.dm b/code/game/area/areas.dm (rejected hunks) +@@ -432,7 +432,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) + // Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch + if(L.client && !L.client.ambience_playing && L.client.prefs.toggles & SOUND_SHIP_AMBIENCE) + L.client.ambience_playing = 1 +- L << sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ) ++ SEND_SOUND(L, sound('sound/ambience/shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = CHANNEL_BUZZ)) + + if(!(L.client && (L.client.prefs.toggles & SOUND_AMBIENCE))) + return //General ambience check is below the ship ambience so one can play without the other diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm index 1e3efd9f2b..717fc68542 100644 --- a/code/game/area/areas/centcom.dm +++ b/code/game/area/areas/centcom.dm @@ -2,7 +2,7 @@ // CENTCOM /area/centcom - name = "Centcom" + name = "CentCom" icon_state = "centcom" dynamic_lighting = DYNAMIC_LIGHTING_FORCED requires_power = FALSE @@ -12,16 +12,16 @@ flags = NONE /area/centcom/control - name = "Centcom Docks" + name = "CentCom Docks" /area/centcom/evac - name = "Centcom Recovery Ship" + name = "CentCom Recovery Ship" /area/centcom/supply - name = "Centcom Supply Shuttle Dock" + name = "CentCom Supply Shuttle Dock" /area/centcom/ferry - name = "Centcom Transport Shuttle Dock" + name = "CentCom Transport Shuttle Dock" /area/centcom/prison name = "Admin Prison" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 02113e92a3..d931f808b8 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -105,7 +105,7 @@ /atom/proc/CanPass(atom/movable/mover, turf/target) return !density -/atom/proc/onCentcom() +/atom/proc/onCentCom() var/turf/T = get_turf(src) if(!T) return FALSE @@ -126,7 +126,7 @@ if(istype(T.loc, /area/centcom)) return TRUE - //Check for centcomm shuttles + //Check for centcom shuttles for(var/A in SSshuttle.mobile) var/obj/docking_port/mobile/M = A if(M.launch_status == ENDGAME_LAUNCHED) @@ -270,7 +270,7 @@ f_name = "a " f_name += "blood-stained [name]!" - to_chat(user, "[bicon(src)] That's [f_name]") + to_chat(user, "[icon2html(src, user)] That's [f_name]") if(desc) to_chat(user, desc) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index dd778b453e..1edca6d632 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -530,7 +530,7 @@ /* Stationloving * * A stationloving atom will always teleport back to the station -* if it ever leaves the station z-levels or Centcom. It will also, +* if it ever leaves the station z-levels or CentCom. It will also, * when Destroy() is called, will teleport to a random turf on the * station. * diff --git a/code/game/communications.dm b/code/game/communications.dm index 5b4f1c39fc..19c3f87460 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -130,7 +130,7 @@ GLOBAL_LIST_INIT(radiochannels, list( "Medical" = 1355, "Engineering" = 1357, "Security" = 1359, - "Centcom" = 1337, + "CentCom" = 1337, "Syndicate" = 1213, "Supply" = 1347, "Service" = 1349, @@ -146,7 +146,7 @@ GLOBAL_LIST_INIT(reverseradiochannels, list( "1355" = "Medical", "1357" = "Engineering", "1359" = "Security", - "1337" = "Centcom", + "1337" = "CentCom", "1213" = "Syndicate", "1347" = "Supply", "1349" = "Service", @@ -292,7 +292,7 @@ GLOBAL_VAR_INIT(RADIO_MAGNETS, "9") /datum/signal/proc/debug_print() if (source) - . = "signal = {source = '[source]' ([source:x],[source:y],[source:z])\n" + . = "signal = {source = '[source]' [COORD(source)]\n" else . = "signal = {source = '[source]' ()\n" for (var/i in data) diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm index 8da7cb3169..8a6d0063b9 100644 --- a/code/game/gamemodes/antag_spawner.dm +++ b/code/game/gamemodes/antag_spawner.dm @@ -110,7 +110,7 @@ SSticker.mode.apprentices += M.mind M.mind.special_role = "apprentice" SSticker.mode.update_wiz_icons_added(M.mind) - M << sound('sound/effects/magic.ogg') + SEND_SOUND(M, sound('sound/effects/magic.ogg')) var/newname = copytext(sanitize(input(M, "You are [wizard_name]'s apprentice. Would you like to change your name to something else?", "Name change", randomname) as null|text),1,MAX_NAME_LEN) if (!newname) newname = randomname diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 1c30d84313..ec923c635b 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -97,7 +97,8 @@ GLOBAL_LIST_EMPTY(blobs_legit) //used for win-score calculations, contains only send_intercept(1) message_sent = TRUE + addtimer(CALLBACK(src, .proc/SendSecondIntercept), 24000) - sleep(24000) //40 minutes, plus burst_delay*3(minimum of 6 minutes, maximum of 8) +/datum/game_mode/blob/proc/SendSecondIntercept() if(!replacementmode) - send_intercept(2) //if the blob has been alive this long, it's time to bomb it \ No newline at end of file + send_intercept(2) //if the blob has been alive this long, it's time to bomb it diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index bf7ae55167..7fa09f3978 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -151,7 +151,7 @@ if(blob_core) stat(null, "Core Health: [blob_core.obj_integrity]") stat(null, "Power Stored: [blob_points]/[max_blob_points]") - if(SSticker && istype(SSticker.mode, /datum/game_mode/blob)) + if(istype(SSticker.mode, /datum/game_mode/blob)) var/datum/game_mode/blob/B = SSticker.mode stat(null, "Blobs to Win: [GLOB.blobs_legit.len]/[B.blobwincount]") else diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm index deef4367e0..389888ac28 100644 --- a/code/game/gamemodes/blob/powers.dm +++ b/code/game/gamemodes/blob/powers.dm @@ -171,11 +171,11 @@ if(candidates.len) //if we got at least one candidate, they're a blobbernaut now. var/client/C = pick(candidates) blobber.key = C.key - blobber << 'sound/effects/blobattack.ogg' - blobber << 'sound/effects/attackblob.ogg' + SEND_SOUND(blobber, sound('sound/effects/blobattack.ogg')) + SEND_SOUND(blobber, sound('sound/effects/attackblob.ogg')) to_chat(blobber, "You are a blobbernaut!") to_chat(blobber, "You are powerful, hard to kill, and slowly regenerate near nodes and cores, but will slowly die if not near the blob or if the factory that made you is killed.") - to_chat(blobber, "You can communicate with other blobbernauts and GLOB.overminds via :b") + to_chat(blobber, "You can communicate with other blobbernauts and overminds via :b") to_chat(blobber, "Your overmind's blob reagent is: [blob_reagent_datum.name]!") to_chat(blobber, "The [blob_reagent_datum.name] reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]") if(blobber) diff --git a/code/game/gamemodes/blob/powers.dm.rej b/code/game/gamemodes/blob/powers.dm.rej new file mode 100644 index 0000000000..27dc764a75 --- /dev/null +++ b/code/game/gamemodes/blob/powers.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm (rejected hunks) +@@ -175,7 +175,7 @@ + SEND_SOUND(blobber, sound('sound/effects/attackblob.ogg')) + to_chat(blobber, "You are a blobbernaut!") + to_chat(blobber, "You are powerful, hard to kill, and slowly regenerate near nodes and cores, but will slowly die if not near the blob or if the factory that made you is killed.") +- to_chat(blobber, "You can communicate with other blobbernauts and GLOB.overminds via :b") ++ to_chat(blobber, "You can communicate with other blobbernauts and overminds via :b") + to_chat(blobber, "Your overmind's blob reagent is: [blob_reagent_datum.name]!") + to_chat(blobber, "The [blob_reagent_datum.name] reagent [blob_reagent_datum.shortdesc ? "[blob_reagent_datum.shortdesc]" : "[blob_reagent_datum.description]"]") + if(blobber) diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index 0c216f1c38..f6cdd64bb6 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -24,6 +24,7 @@ M.changeNext_move(CLICK_CD_MELEE) var/a = pick("gently stroke", "nuzzle", "affectionatly pet", "cuddle") M.visible_message("[M] [a]s [src]!", "You [a] [src]!") + to_chat(overmind, "[M] [a]s you!") playsound(src, 'sound/effects/blobattack.ogg', 50, 1) //SQUISH SQUISH @@ -235,7 +236,7 @@ if(istype(I, /obj/item/device/analyzer)) user.changeNext_move(CLICK_CD_MELEE) to_chat(user, "The analyzer beeps once, then reports:
") - user << 'sound/machines/ping.ogg' + SEND_SOUND(user, sound('sound/machines/ping.ogg')) chemeffectreport(user) typereport(user) else diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm index 099d991062..7afce8aa27 100644 --- a/code/game/gamemodes/changeling/powers/shriek.dm +++ b/code/game/gamemodes/changeling/powers/shriek.dm @@ -16,10 +16,10 @@ C.confused += 25 C.Jitter(50) else - C << sound('sound/effects/screech.ogg') + SEND_SOUND(C, sound('sound/effects/screech.ogg')) if(issilicon(M)) - M << sound('sound/weapons/flash.ogg') + SEND_SOUND(M, sound('sound/weapons/flash.ogg')) M.Knockdown(rand(100,200)) for(var/obj/machinery/light/L in range(4, user)) diff --git a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm index 297021ff5a..98186a5cdf 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm @@ -19,6 +19,9 @@ return 1 return ..() +/obj/effect/clockwork/sigil/attack_tk(mob/user) + return //you can't tk stomp sigils, but you can hit them with something + /obj/effect/clockwork/sigil/attack_hand(mob/user) if(iscarbon(user) && !user.stat && !is_servant_of_ratvar(user)) user.visible_message("[user] stamps out [src]!", "You stomp on [src], scattering it into thousands of particles.") @@ -81,7 +84,7 @@ /obj/effect/clockwork/sigil/submission name = "ominous sigil" desc = "A luminous golden sigil. Something about it really bothers you." - clockwork_desc = "A sigil that will enslave the first person to cross it, provided they remain on it for seven seconds." + clockwork_desc = "A sigil that will enslave any non-Servant that remains on it for 8 seconds. Cannot penetrate mindshield implants." icon_state = "sigilsubmission" layer = LOW_SIGIL_LAYER alpha = 125 @@ -91,17 +94,15 @@ light_color = "#FAE48C" stat_affected = UNCONSCIOUS resist_string = "glows faintly yellow" - var/convert_time = 70 + var/convert_time = 80 var/delete_on_finish = TRUE sigil_name = "Sigil of Submission" - var/glow_type - -/obj/effect/clockwork/sigil/submission/proc/post_channel(mob/living/L) + var/glow_type = /obj/effect/temp_visual/ratvar/sigil/submission /obj/effect/clockwork/sigil/submission/sigil_effects(mob/living/L) L.visible_message("[src] begins to glow a piercing magenta!", "You feel something start to invade your mind...") var/oldcolor = color - animate(src, color = "#AF0AAF", time = convert_time) + animate(src, color = "#AF0AAF", time = convert_time, flags = ANIMATION_END_NOW) var/obj/effect/temp_visual/ratvar/sigil/glow if(glow_type) glow = new glow_type(get_turf(src)) @@ -113,16 +114,15 @@ if(get_turf(L) != get_turf(src)) if(glow) qdel(glow) - animate(src, color = oldcolor, time = 20) + animate(src, color = oldcolor, time = 20, flags = ANIMATION_END_NOW) addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 20) visible_message("[src] slowly stops glowing!") return - post_channel(L) if(is_eligible_servant(L)) to_chat(L, "\"You belong to me now.\"") if(add_servant_of_ratvar(L)) L.log_message("Conversion was done with a [sigil_name].", INDIVIDUAL_ATTACK_LOG) - L.Knockdown(60) //Completely defenseless for about five seconds - mainly to give them time to read over the information they've just been presented with + L.Knockdown(50) //Completely defenseless for five seconds - mainly to give them time to read over the information they've just been presented with if(iscarbon(L)) var/mob/living/carbon/C = L C.silent += 5 @@ -136,39 +136,9 @@ to_chat(M, "[message] you!") else to_chat(M, "[message] [L.real_name]!") - if(delete_on_finish) - qdel(src) - else - animate(src, color = oldcolor, time = 20) - addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 20) - visible_message("[src] slowly stops glowing!") - - -//Sigil of Accession: After a short time, converts any non-servant standing on it though implants. Knocks down and silences them for five seconds afterwards. -/obj/effect/clockwork/sigil/submission/accession - name = "terrifying sigil" - desc = "A luminous brassy sigil. Something about it makes you want to flee." - clockwork_desc = "A sigil that will enslave any person who crosses it, provided they remain on it for seven seconds. \n\ - It can convert a mindshielded target once before disppearing, but can convert any number of non-implanted targets." - icon_state = "sigiltransgression" - alpha = 200 - color = "#A97F1B" - light_range = 3 //bright light - light_power = 1 - light_color = "#A97F1B" - delete_on_finish = FALSE - sigil_name = "Sigil of Accession" - glow_type = /obj/effect/temp_visual/ratvar/sigil/accession - resist_string = "glows bright orange" - -/obj/effect/clockwork/sigil/submission/accession/post_channel(mob/living/L) - if(L.isloyal()) - L.log_message("Had their mindshield implant broken by a [sigil_name].", INDIVIDUAL_ATTACK_LOG) - delete_on_finish = TRUE - L.visible_message("[L] visibly trembles!", \ - "[text2ratvar("You will be mine and his. This puny trinket will not stop me.")]") - for(var/obj/item/weapon/implant/mindshield/M in L.implants) - qdel(M) + animate(src, color = oldcolor, time = 20, flags = ANIMATION_END_NOW) + addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 20) + visible_message("[src] slowly stops glowing!") //Sigil of Transmission: Stores power for clockwork machinery, serving as a battery. @@ -326,8 +296,7 @@ stat_affected = DEAD resist_string = "glows shimmering yellow" sigil_name = "Vitality Matrix" - var/static/vitality = 0 - var/base_revive_cost = 20 + var/revive_cost = 150 var/sigil_active = FALSE var/animation_number = 3 //each cycle increments this by 1, at 4 it produces an animation and resets var/static/list/damage_heal_order = list(CLONE, TOX, BURN, BRUTE, OXY) //we heal damage in this order @@ -335,11 +304,11 @@ /obj/effect/clockwork/sigil/vitality/examine(mob/user) ..() if(is_servant_of_ratvar(user) || isobserver(user)) - to_chat(user, "It has access to [GLOB.ratvar_awakens ? "INFINITE":"[vitality]"] units of vitality.") + to_chat(user, "It has access to [GLOB.ratvar_awakens ? "INFINITE":GLOB.clockwork_vitality] units of vitality.") if(GLOB.ratvar_awakens) to_chat(user, "It can revive Servants at no cost!") else - to_chat(user, "It can revive Servants at a cost of [base_revive_cost] vitality plus vitality equal to the non-oxygen damage they have, in addition to being destroyed in the process.") + to_chat(user, "It can revive Servants at a cost of [revive_cost] vitality.") /obj/effect/clockwork/sigil/vitality/sigil_effects(mob/living/L) if((is_servant_of_ratvar(L) && L.suiciding) || sigil_active) @@ -348,7 +317,7 @@ animate(src, alpha = 255, time = 10, flags = ANIMATION_END_NOW) //we may have a previous animation going. finish it first, then do this one without delay. sleep(10) //as long as they're still on the sigil and are either not a servant or they're a servant AND it has remaining vitality - while(L && (!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && (GLOB.ratvar_awakens || vitality))) && get_turf(L) == get_turf(src)) + while(L && (!is_servant_of_ratvar(L) || (is_servant_of_ratvar(L) && (GLOB.ratvar_awakens || GLOB.clockwork_vitality))) && get_turf(L) == get_turf(src)) sigil_active = TRUE if(animation_number >= 4) new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src)) @@ -373,40 +342,37 @@ else vitality_drained = L.adjustToxLoss(1.5) if(vitality_drained) - vitality += vitality_drained + GLOB.clockwork_vitality += vitality_drained else break else if(L.stat == DEAD) - var/revival_cost = base_revive_cost + L.getCloneLoss() + L.getToxLoss() + L.getFireLoss() + L.getBruteLoss() //ignores oxygen damage + var/revival_cost = revive_cost if(GLOB.ratvar_awakens) revival_cost = 0 var/mob/dead/observer/ghost = L.get_ghost(TRUE) - if(vitality >= revival_cost && (ghost || (L.mind && L.mind.active))) + if(GLOB.clockwork_vitality >= revival_cost && (ghost || (L.mind && L.mind.active))) if(ghost) ghost.reenter_corpse() L.revive(1, 1) var/obj/effect/temp_visual/ratvar/sigil/vitality/V = new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src)) animate(V, alpha = 0, transform = matrix()*2, time = 8) playsound(L, 'sound/magic/staff_healing.ogg', 50, 1) - L.visible_message("[L] suddenly gets back up, [GLOB.ratvar_awakens ? "[L.p_their()] body dripping blue ichor":"even as [src] scatters into blue sparks around [L.p_them()]"]!", \ - "\"[text2ratvar("You will be okay, child.")]\"") - vitality -= revival_cost - if(!GLOB.ratvar_awakens) - qdel(src) + L.visible_message("[L] suddenly gets back up, [L.p_their()] body dripping blue ichor!", "\"[text2ratvar("You will be okay, child.")]\"") + GLOB.clockwork_vitality -= revival_cost break var/vitality_for_cycle = 3 if(!GLOB.ratvar_awakens) if(L.stat == CONSCIOUS) vitality_for_cycle = 2 - vitality_for_cycle = min(vitality, vitality_for_cycle) + vitality_for_cycle = min(GLOB.clockwork_vitality, vitality_for_cycle) var/vitality_used = L.heal_ordered_damage(vitality_for_cycle, damage_heal_order) if(!vitality_used) break if(!GLOB.ratvar_awakens) - vitality -= vitality_used + GLOB.clockwork_vitality -= vitality_used sleep(2) diff --git a/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm b/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm index ef1099d3e0..9380e46487 100644 --- a/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm +++ b/code/game/gamemodes/clock_cult/clock_helpers/clock_powerdrain.dm @@ -1,5 +1,14 @@ //horrifying power drain proc made for clockcult's power drain in lieu of six istypes or six for(x in view) loops /atom/movable/proc/power_drain(clockcult_user) + var/obj/item/weapon/stock_parts/cell/cell = get_cell() + if(cell) + return cell.power_drain(clockcult_user) + return 0 + +/obj/item/weapon/melee/baton/power_drain(clockcult_user) //balance memes + return 0 + +/obj/item/weapon/gun/power_drain(clockcult_user) //balance memes return 0 /obj/machinery/power/apc/power_drain(clockcult_user) diff --git a/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm b/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm index 790088e8d5..f21cbb8987 100644 --- a/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm +++ b/code/game/gamemodes/clock_cult/clock_helpers/slab_abilities.dm @@ -24,11 +24,15 @@ //For the Geis scripture; binds a target to convert. /obj/effect/proc_holder/slab/geis ranged_mousepointer = 'icons/effects/geis_target.dmi' + var/obj/structure/destructible/clockwork/geis_binding/binding //we always have a reference to the binding + var/obj/structure/destructible/clockwork/geis_binding/pulled_binding //we use this to see if we're pulling it or not + +/obj/effect/proc_holder/slab/geis/remove_ranged_ability(msg) + ..() + binding = null + pulled_binding = null /obj/effect/proc_holder/slab/geis/InterceptClickOn(mob/living/caller, params, atom/target) - if(..()) - return TRUE - var/turf/T = ranged_ability_user.loc if(!isturf(T)) return TRUE @@ -36,6 +40,20 @@ var/target_is_binding = istype(target, /obj/structure/destructible/clockwork/geis_binding) if((target_is_binding || isliving(target)) && ranged_ability_user.Adjacent(target)) + if(in_progress || ..()) + var/mob/living/L = target + if(!pulled_binding) + if(target == binding || (isliving(target) && L.buckled == binding)) + pulled_binding = binding + ranged_ability_user.start_pulling(binding) + remove_mousepointer(ranged_ability_user.client) + ranged_mousepointer = 'icons/effects/geis_target_remove.dmi' + add_mousepointer(ranged_ability_user.client) + else if(target == pulled_binding || (isliving(target) && L.buckled == pulled_binding)) + ranged_ability_user.visible_message("[ranged_ability_user] dispels [pulled_binding]!", "You dispel the binding!") + binding.take_damage(obj_integrity) + remove_ranged_ability() + return TRUE if(target_is_binding) var/obj/structure/destructible/clockwork/geis_binding/GB = target GB.repair_and_interrupt() @@ -65,19 +83,44 @@ in_progress = TRUE clockwork_say(ranged_ability_user, text2ratvar("Be bound, heathen!")) remove_mousepointer(ranged_ability_user.client) + ranged_mousepointer = 'icons/effects/geis_target_remove.dmi' + add_mousepointer(ranged_ability_user.client) add_logs(ranged_ability_user, L, "bound with Geis") + playsound(target, 'sound/magic/blink.ogg', 50, TRUE, frequency = 0.5) if(slab.speed_multiplier >= 0.5) //excuse my debug... ranged_ability_user.notransform = TRUE - addtimer(CALLBACK(src, .proc/reset_user_notransform, ranged_ability_user), 5) //stop us moving for a little bit so we don't break the scripture following this - slab.busy = null - var/datum/clockwork_scripture/geis/conversion = new - conversion.slab = slab - conversion.invoker = ranged_ability_user - conversion.target = target - conversion.run_scripture() + addtimer(CALLBACK(src, .proc/reset_user_notransform, ranged_ability_user), 5) //stop us moving for a little bit so we don't break the binding immediately + if(L.buckled) + L.buckled.unbuckle_mob(target, TRUE) + binding = new(get_turf(target)) + binding.setDir(target.dir) + binding.buckle_mob(target, TRUE) + pulled_binding = binding + ranged_ability_user.start_pulling(binding) + slab.busy = "sustaining Geis" + slab.flags |= NODROP + while(!QDELETED(binding) && !QDELETED(ranged_ability_user)) + if(ranged_ability_user.pulling == binding) + pulled_binding = binding + if(ranged_ability_user.client && ranged_ability_user.client.mouse_pointer_icon == 'icons/effects/geis_target.dmi') + remove_mousepointer(ranged_ability_user.client) + ranged_mousepointer = 'icons/effects/geis_target_remove.dmi' + add_mousepointer(ranged_ability_user.client) + else //if we're not pulling it, swap our mousepointer + pulled_binding = null + if(ranged_ability_user.client && ranged_ability_user.client.mouse_pointer_icon == 'icons/effects/geis_target_remove.dmi') + remove_mousepointer(ranged_ability_user.client) + ranged_mousepointer = 'icons/effects/geis_target.dmi' + add_mousepointer(ranged_ability_user.client) + sleep(1) + if(!QDELETED(slab)) + slab.flags &= ~NODROP + in_progress = FALSE successful = TRUE remove_ranged_ability() + else + ..() return TRUE @@ -145,29 +188,6 @@ return TRUE -//For the Volt Void scripture, fires a ray of energy at a target location -/obj/effect/proc_holder/slab/volt - ranged_mousepointer = 'icons/effects/volt_target.dmi' - -/obj/effect/proc_holder/slab/volt/InterceptClickOn(mob/living/caller, params, atom/target) - if(target == slab || ..()) //we can't cancel - return TRUE - - var/turf/T = ranged_ability_user.loc - if(!isturf(T)) - return TRUE - - if(target in view(7, get_turf(ranged_ability_user))) - successful = TRUE - ranged_ability_user.visible_message("[ranged_ability_user] fires a ray of energy at [target]!", "You fire a volt ray at [target].") - playsound(ranged_ability_user, 'sound/effects/light_flicker.ogg', 50, 1) - T = get_turf(target) - new/obj/effect/temp_visual/ratvar/volt_hit(T, ranged_ability_user) - add_logs(ranged_ability_user, T, "fired a volt ray") - remove_ranged_ability() - - return TRUE - //For the cyborg Linked Vanguard scripture, grants you and a nearby ally Vanguard /obj/effect/proc_holder/slab/vanguard ranged_mousepointer = 'icons/effects/vanguard_target.dmi' diff --git a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm index e28fd8a10d..343f2e70e7 100644 --- a/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm +++ b/code/game/gamemodes/clock_cult/clock_items/clockwork_slab.dm @@ -21,8 +21,8 @@ var/selected_scripture = SCRIPTURE_DRIVER var/recollecting = FALSE //if we're looking at fancy recollection var/obj/effect/proc_holder/slab/slab_ability //the slab's current bound ability, for certain scripture - var/list/quickbound = list(/datum/clockwork_scripture/ranged_ability/geis_prep, /datum/clockwork_scripture/create_object/replicant, \ - /datum/clockwork_scripture/create_object/tinkerers_cache) //quickbound scripture, accessed by index + var/list/quickbound = list(/datum/clockwork_scripture/ranged_ability/geis, /datum/clockwork_scripture/create_object/sigil_of_submission, \ + /datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/tinkerers_cache) //quickbound scripture, accessed by index var/maximum_quickbound = 5 //how many quickbound scriptures we can have var/recollection_category = "Default" actions_types = list(/datum/action/item_action/clock/hierophant) @@ -53,21 +53,18 @@ maximum_quickbound = 6 //we usually have one or two unique scriptures, so if ratvar is up let us bind one more actions_types = list() -/obj/item/clockwork/slab/cyborg/engineer //four scriptures, plus a fabricator - quickbound = list(/datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/cogscarab, \ - /datum/clockwork_scripture/create_object/soul_vessel, /datum/clockwork_scripture/create_object/sigil_of_transmission) +/obj/item/clockwork/slab/cyborg/engineer //two scriptures, plus a fabricator + quickbound = list(/datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transmission) /obj/item/clockwork/slab/cyborg/medical //five scriptures, plus a spear quickbound = list(/datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/ranged_ability/sentinels_compromise, \ /datum/clockwork_scripture/create_object/vitality_matrix, /datum/clockwork_scripture/channeled/mending_mantra, /datum/clockwork_scripture/fellowship_armory) -/obj/item/clockwork/slab/cyborg/security //four scriptures, plus a spear - quickbound = list(/datum/clockwork_scripture/channeled/belligerent, /datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/channeled/taunting_tirade, \ - /datum/clockwork_scripture/channeled/volt_blaster) +/obj/item/clockwork/slab/cyborg/security //twoscriptures, plus a spear + quickbound = list(/datum/clockwork_scripture/channeled/belligerent, /datum/clockwork_scripture/ranged_ability/judicial_marker) -/obj/item/clockwork/slab/cyborg/peacekeeper //four scriptures, plus a spear - quickbound = list(/datum/clockwork_scripture/channeled/belligerent, /datum/clockwork_scripture/ranged_ability/judicial_marker, /datum/clockwork_scripture/channeled/taunting_tirade, \ - /datum/clockwork_scripture/channeled/volt_blaster) +/obj/item/clockwork/slab/cyborg/peacekeeper //two scriptures, plus a spear + quickbound = list(/datum/clockwork_scripture/channeled/belligerent, /datum/clockwork_scripture/ranged_ability/judicial_marker) /obj/item/clockwork/slab/cyborg/janitor //five scriptures, plus a fabricator quickbound = list(/datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/sigil_of_transgression, \ @@ -77,8 +74,8 @@ quickbound = list(/datum/clockwork_scripture/create_object/replicant, /datum/clockwork_scripture/create_object/tinkerers_cache, \ /datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/fellowship_armory, /datum/clockwork_scripture/create_object/clockwork_obelisk) -/obj/item/clockwork/slab/cyborg/miner //three scriptures, plus a spear and xray vision - quickbound = list(/datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/spatial_gateway, /datum/clockwork_scripture/channeled/volt_blaster) +/obj/item/clockwork/slab/cyborg/miner //two scriptures, plus a spear and xray vision + quickbound = list(/datum/clockwork_scripture/ranged_ability/linked_vanguard, /datum/clockwork_scripture/spatial_gateway) /obj/item/clockwork/slab/cyborg/access_display(mob/living/user) if(!GLOB.ratvar_awakens) @@ -136,7 +133,7 @@ production_time = world.time + SLAB_PRODUCTION_TIME + production_slowdown var/mob/living/L L = get_atom_on_turf(src, /mob/living) - if(istype(L) && can_recite_scripture(L)) + if(istype(L) && (no_cost || can_recite_scripture(L))) var/component_to_generate = target_component_id if(!component_to_generate) component_to_generate = get_weighted_component_id(src) //more likely to generate components that we have less of @@ -267,7 +264,7 @@ if(busy) to_chat(user, "[src] refuses to work, displaying the message: \"[busy]!\"") return 0 - if(!can_recite_scripture(user)) + if(!no_cost && !can_recite_scripture(user)) to_chat(user, "[src] hums fitfully in your hands, but doesn't seem to do anything...") return 0 access_display(user) @@ -287,7 +284,7 @@ ui.open() /obj/item/clockwork/slab/proc/recite_scripture(datum/clockwork_scripture/scripture, mob/living/user) - if(!scripture || !user || !user.canUseTopic(src) || !can_recite_scripture(user)) + if(!scripture || !user || !user.canUseTopic(src) || (!no_cost && !can_recite_scripture(user))) return FALSE if(user.get_active_held_item() != src) to_chat(user, "You need to hold the slab in your active hand to recite scripture!") @@ -403,24 +400,21 @@ dat += "Servant: A person or robot who serves Ratvar. You are one of these.
" dat += "Cache: A Tinkerer's Cache, which is a structure that stores and creates components.
" dat += "CV: Construction Value. All clockwork structures, floors, and walls increase this number.
" + dat += "Vitality: Used for healing effects, produced by Ratvarian spear attacks and Vitality Matrices.
" dat += "Geis: An important scripture used to make normal crew and robots into Servants of Ratvar.
" dat += "[get_component_icon(BELLIGERENT_EYE)]BE: Belligerent Eye, a component type used in offensive scriptures.
" dat += "[get_component_icon(VANGUARD_COGWHEEL)]VC: Vanguard Cogwheel, a component type used in defensive scriptures.
" dat += "[get_component_icon(GEIS_CAPACITOR)]GC: Geis Capacitor, a component type used in mind-related scriptures.
" dat += "[get_component_icon(REPLICANT_ALLOY)]RA: Replicant Alloy, a component type used in construction scriptures.
" - dat += "[get_component_icon(HIEROPHANT_ANSIBLE)]HA: Hierophant Ansible, a component type used in energy scriptures.
" + dat += "[get_component_icon(HIEROPHANT_ANSIBLE)]HA: Hierophant Ansible, a component type used in energy-related scriptures.
" dat += "Ark: The cult's win condition, a huge structure that needs to be defended.

" dat += "Items
" dat += "Slab: A clockwork slab, a Servant's most important tool. You're holding one! Keep it safe and hidden.
" - dat += "Visor: A judicial visor, which is a pair of glasses that can stun everything in an area after a delay.
" + dat += "Visor: A judicial visor, which is a pair of glasses that can smite an area for a brief stun and delayed explosion.
" dat += "Wraith Specs: Wraith spectacles, which provide true sight (x-ray, night vision) but damage the wearer's eyes.
" - dat += "Spear: A Ratvarian spear, which is a very powerful melee weapon.
" + dat += "Spear: A Ratvarian spear, which is a very powerful melee weapon that produces Vitality.
" dat += "Fabricator: A replica fabricator, which converts objects into clockwork versions.

" dat += "Constructs
" - dat += "Vessel: A soul vessel, a clockwork brain used to activate constructs.
" - dat += "Shell: A construct shell of some type that can accept a soul vessel to activate.
" - dat += "Scarab: A cogscarab construct, which is a drone that maintains the cult's bases.
" - dat += "Fragment: An anim[prob(1) ? "e" : "a"] fragment, which is a fragile but powerful offensive construct.
" dat += "Marauder: A clockwork marauder, which is a powerful bodyguard that hides in its owner.

" dat += "Structures (* = requires power)
" dat += "Warden: An ocular warden, which is a ranged turret that damages non-Servants that see it.
" @@ -432,8 +426,9 @@ dat += "Note: Sigils can be stacked on top of one another, making certain sigils very effective when paired!
" dat += "Transgression: Stuns the first non-Servant to cross it for ten seconds and blinds others nearby. Disappears on use.
" dat += "Submission: Converts the first non-Servant to stand on the sigil for seven seconds. Disappears on use.
" + dat += "Matrix: Drains health from non-Servants, producing Vitality. Can heal and revive Servants.
" dat += "Accession: Identical to the Sigil of Submission, but doesn't disappear on use. It can also convert a single mindshielded target, but will disappear after doing this.
" - dat += "Transmission: Drains and stores power for clockwork structures. Feeding it brass sheets will create power.

" + dat += "Transmission: Drains and stores power for clockwork structures. Feeding it brass sheets will create additional power.

" dat += "-=-=-=-=-=-" if("Components") var/servants = 0 //Calculate the current production time for slab components @@ -465,7 +460,7 @@ dat += "Components are your primary resource as a Servant. There are five types of component, with each one being used in different roles:

" dat += "[get_component_icon(BELLIGERENT_EYE)]BE Belligerent Eyes are aggressive and judgemental, and are used in offensive scripture;
" dat += "[get_component_icon(VANGUARD_COGWHEEL)]VC Vanguard Cogwheels are defensive and repairing, and are used in defensive scripture;
" - dat += "[get_component_icon(GEIS_CAPACITOR)]GC Geis Capacitors are for conversion and control, and are used in mind-related scripture;
" //References the old name + dat += "[get_component_icon(GEIS_CAPACITOR)]GC Geis Capacitors are for conversion and control, and are used in mind-related scripture;
" dat += "[get_component_icon(REPLICANT_ALLOY)]RA Replicant Alloy is a strong, malleable metal and is used for construction and creation;
" dat += "[get_component_icon(HIEROPHANT_ANSIBLE)]HA Hierophant Ansibles are for transmission and power, and are used in power and teleportation scripture

" dat += "Although this is a good rule of thumb, their effects become much more nuanced when used together. For instance, a turret might have both belligerent eyes and \ @@ -503,8 +498,8 @@ and can be harnessed in several ways.

" dat += "To begin with, if there is no other source of power nearby, structures will draw from the area's APC, assuming it has one. This is inefficient and ill-advised as \ anything but a last resort. Instead, it is recommended that a Sigil of Transmission is created. This sigil serves as both battery and power generator for nearby clockwork \ - structures, and those structures will happily draw power from the sigil before they resort to pathetic APCs and other sources of energy.

" - dat += "The most reliable and efficient way to generate power is by using brass sheets; attacking a sigil of transmission with brass sheets will convert them \ + structures, and those structures will happily draw power from the sigil before they resort to APCs.

" + dat += "Generating power is less easy. The most reliable and efficient way is using brass sheets; attacking a sigil of transmission with brass sheets will convert them \ to power, at a rate of [POWER_FLOOR]W per sheet. (Brass sheets are created from replica fabricators, which are explained more in detail in the Conversion section.) \ Activating a sigil of transmission will also cause it to drain power from the nearby area, which, while effective, serves as an obvious tell that there is something wrong.

" dat += "Without power, many structures will not function, making a base vulnerable to attack. For this reason, it is critical that you keep an eye on your power reserves and \ @@ -516,15 +511,15 @@ they become a full-fledged Servant, ready and willing to serve the cause of Ratvar. It should also be noted that silicon crew, such as cyborgs and the AI, can be \ converted just like normal crew and will gain special abilities; this is covered later. This section will also cover converting the station's structure itself; walls, \ floors, windows, tables, and other objects can all be converted into clockwork versions, and serve an important purpose.

" - dat += "Methods of Conversion: There are several ways to convert humans and silicons. The first and most readily-available of these is \ - Geis, a Driver-tier scripture. Using it whispers an invocation very quickly - this is incredibly obvious - and charges your slab with power. In addition to making \ - the slab visible in your hand, you can now use it on a target within melee range to bind them and begin converting them. While there are six or fewer Servants, they are \ - unable to escape this binding, meaning that unless you are interrupted, the target is as good as yours. However, the scripture becomes slower for every Servant human or \ - silicon Servant past [SCRIPT_SERVANT_REQ], and the bindings can be resisted past this, meaning that eventually other methods become more desirable.

" - dat += "The other three methods of conversion are the sigils of submission and accession, whose purpose is to do so, and the mania motor. The sigil of \ - submission is a sigil that, when stood on by a non-Servant for seven full seconds, will convert that non-Servant. This time requirement does not scale with \ - Servants, making it the preferred option after Geis becomes too inefficient. It is, however, consumed after use; the sigil of accession solves this problem, and serves as a \ - permanent conversion sigil. The mania motor is generally unreliable, only converting those who stand near it for an extended period.

" + dat += "A Note on Geis: There are several ways to convert humans and silicons. However, the most important tool to making them work is \ + Geis, a Driver-tier scripture. Using it whispers an invocation very quickly and charges your slab with power. In addition to making the slab visible in your hand, \ + you can now use it on a target within melee range to bind and mute them. It is by far your most reliable tool for capturing potential converts and targets, though it is incredibly \ + obvious. In addition, you are unable to take any actions other than moving while your target is bound. The binding will last for 25 seconds and mute for about 13 seconds, though \ + allies can use Geis to refresh these effects.

" + dat += "Converting: The two methods of conversion are the sigil of submission, whose purpose is to do so, and the mania motor. \ + The sigil of submission is a sigil that, when stood on by a non-Servant for eight seconds, will convert that non-Servant. This is the only practical way to convert targets. \ + Sigils of submission are cheap, early, and permanent! Make sure sigils of submission are placed only in bases or otherwise hidden spots, or with a sigil of transgression on them. \ + The mania motor, however, is generally unreliable and unlocked later, only converting those who stand near it for an extended period.

" dat += "Converting Humans: For obvious reasons, humans are the most common conversion target. Because every crew member is different, and \ may be armed with different equipment, you should take precautions to ensure that they aren't able to resist. If able, removing a headset is essential, as is restraining \ them through handcuffs, cable ties, or other restraints. Some crew, like security, are also implanted with mindshield implants; these will prevent conversion and must be \ @@ -532,9 +527,8 @@ begins administering mindshield implants, this will greatly inhibit conversion. Also note that mindshield implants can be broken by a sigil of accession automatically, but \ the sigil will disappear.

" dat += "Converting Silicons: Due to their robotic nature, silicons are generally more predictable than humans in terms of conversion. \ - However, they are also much, much harder to subdue, especially cyborgs. The easiest way to convert a cyborg is by using a flash or a sigil of transgression to stun it, \ - then very quickly using Geis to restrain them. If you stack a sigil of transgression and one of the conversion sigils, a crossing cyborg will be stunned and helpless to \ - escape in time before the other sigil converts them.

" + However, they are also much, much harder to subdue, especially cyborgs. The easiest way to convert a cyborg is by using Geis to restrain them, then dragging them to a sigil \ + of submission. If you stack a sigil of transgression and a sigil of submission, a crossing cyborg will be stunned and helpless to escape before they are converted.

" dat += "Converting AIs is very often the hardest task of the cult, and has been the downfall of countless successful Servants. Their omnipresence across the station, \ coupled with their secure location and ability to lock themselves securely, makes them a powerful target. However, once the AI itself is reached, it is usually completely \ helpless to resist its own conversion. A very common tactic is to take advantage of a converted cyborg to rush the AI before it is able to react.

" diff --git a/code/game/gamemodes/clock_cult/clock_items/judicial_visor.dm b/code/game/gamemodes/clock_cult/clock_items/judicial_visor.dm index 8bc6cb5603..fb210625a2 100644 --- a/code/game/gamemodes/clock_cult/clock_items/judicial_visor.dm +++ b/code/game/gamemodes/clock_cult/clock_items/judicial_visor.dm @@ -145,7 +145,7 @@ return TRUE return FALSE -//Judicial marker: Created by the judicial visor. After three seconds, knocks down any non-Servants nearby and damages Nar-Sian cultists. +//Judicial marker: Created by the judicial visor. Immediately applies Belligerent and briefly knocks down, then after 3 seconds does large damage and briefly knocks down again /obj/effect/clockwork/judicial_marker name = "judicial marker" desc = "You get the feeling that you shouldn't be standing here." @@ -165,11 +165,18 @@ /obj/effect/clockwork/judicial_marker/proc/judicialblast() playsound(src, 'sound/magic/magic_missile.ogg', 50, 1, 1, 1) flick("judicial_marker", src) + for(var/mob/living/carbon/C in range(1, src)) + var/datum/status_effect/belligerent/B = C.apply_status_effect(STATUS_EFFECT_BELLIGERENT) + if(!QDELETED(B)) + B.duration = world.time + 30 + C.Knockdown(5) //knocks down for half a second if affected sleep(16) + name = "judicial blast" layer = ABOVE_ALL_MOB_LAYER flick("judicial_explosion", src) set_light(1.4, 2, "#B451A1") sleep(13) + name = "judicial explosion" var/targetsjudged = 0 playsound(src, 'sound/effects/explosionfar.ogg', 100, 1, 1, 1) set_light(0) @@ -181,21 +188,19 @@ L.visible_message("Strange energy flows into [L]'s [I.name]!", \ "Your [I.name] shields you from [src]!") continue + L.Knockdown(15) //knocks down briefly when exploding if(!iscultist(L)) L.visible_message("[L] is struck by a judicial explosion!", \ "[!issilicon(L) ? "An unseen force slams you into the ground!" : "ERROR: Motor servos disabled by external source!"]") - L.Knockdown(160) //knocks down targets for 14-16 seconds else L.visible_message("[L] is struck by a judicial explosion!", \ "\"Keep an eye out, filth.\"\nA burst of heat crushes you against the ground!") - L.Knockdown(80) //knocks down for 6-8 seconds, but set cultist targets on fire - L.adjust_fire_stacks(2) + L.adjust_fire_stacks(2) //sets cultist targets on fire L.IgniteMob() - if(iscarbon(L)) - var/mob/living/carbon/C = L - C.silent += 6 + L.adjustFireLoss(5) targetsjudged++ - L.adjustBruteLoss(10) //do a small amount of damage + if(!QDELETED(L)) + L.adjustBruteLoss(20) //does a decent amount of damage add_logs(user, L, "struck with a judicial blast") to_chat(user, "[targetsjudged ? "Successfully judged [targetsjudged]":"Judged no"] heretic[targetsjudged == 1 ? "":"s"].") sleep(3) //so the animation completes properly diff --git a/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm b/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm index 8ba151830b..c1ea55e16d 100644 --- a/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm +++ b/code/game/gamemodes/clock_cult/clock_items/ratvarian_spear.dm @@ -6,14 +6,16 @@ icon = 'icons/obj/clockwork_objects.dmi' icon_state = "ratvarian_spear" item_state = "ratvarian_spear" + lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi' + righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi' force = 15 //Extra damage is dealt to targets in attack() - throwforce = 40 + throwforce = 25 + armour_penetration = 10 sharpness = IS_SHARP_ACCURATE attack_verb = list("stabbed", "poked", "slashed") hitsound = 'sound/weapons/bladeslice.ogg' w_class = WEIGHT_CLASS_BULKY - var/impale_cooldown = 50 //delay, in deciseconds, where you can't impale again - var/attack_cooldown = 10 //delay, in deciseconds, where you can't attack with the spear + var/bonus_burn = 5 var/timerid /obj/item/clockwork/ratvarian_spear/Destroy() @@ -22,107 +24,44 @@ /obj/item/clockwork/ratvarian_spear/ratvar_act() if(GLOB.ratvar_awakens) //If Ratvar is alive, the spear is extremely powerful - force = 25 - throwforce = 50 - armour_penetration = 10 + force = 20 + bonus_burn = 10 + throwforce = 40 + armour_penetration = 50 clockwork_desc = initial(clockwork_desc) deltimer(timerid) else force = initial(force) + bonus_burn = initial(bonus_burn) throwforce = initial(throwforce) - armour_penetration = 0 + armour_penetration = initial(armour_penetration) clockwork_desc = "A powerful spear of Ratvarian making. It's more effective against enemy cultists and silicons, though it won't last for long." deltimer(timerid) timerid = addtimer(CALLBACK(src, .proc/break_spear), RATVARIAN_SPEAR_DURATION, TIMER_STOPPABLE) /obj/item/clockwork/ratvarian_spear/cyborg/ratvar_act() //doesn't break! - if(GLOB.ratvar_awakens) - force = 25 - throwforce = 50 - armour_penetration = 10 - else - force = initial(force) - throwforce = initial(throwforce) - armour_penetration = 0 + ..() + clockwork_desc = "A powerful spear of Ratvarian making. It's more effective against enemy cultists and silicons." + deltimer(timerid) /obj/item/clockwork/ratvarian_spear/examine(mob/user) ..() if(is_servant_of_ratvar(user) || isobserver(user)) - to_chat(user, "Stabbing a human you are pulling or have grabbed with the spear will impale them, doing massive damage and stunning.") + to_chat(user, "Attacks on living non-Servants will generate [bonus_burn] units of vitality.") if(!iscyborg(user)) to_chat(user, "Throwing the spear will do massive damage, break the spear, and knock down the target.") /obj/item/clockwork/ratvarian_spear/attack(mob/living/target, mob/living/carbon/human/user) - var/impaling = FALSE - if(attack_cooldown > world.time) - to_chat(user, "You can't attack right now, wait [max(round((attack_cooldown - world.time)*0.1, 0.1), 0)] seconds!") - return - if(user.pulling && ishuman(user.pulling) && user.pulling == target) - if(impale_cooldown > world.time) - to_chat(user, "You can't impale [target] yet, wait [max(round((impale_cooldown - world.time)*0.1, 0.1), 0)] seconds!") - else - impaling = TRUE - attack_verb = list("impaled") - force += 22 //total 40 damage if ratvar isn't alive, 50 if he is - armour_penetration += 10 //if you're impaling someone, armor sure isn't that useful - user.stop_pulling() - - if(hitsound) - playsound(loc, hitsound, get_clamped_volume(), 1, -1) - user.lastattacked = target - target.lastattacker = user - user.do_attack_animation(target) - if(!target.attacked_by(src, user)) //TODO MAKE ATTACK() USE PROPER RETURN VALUES - impaling = FALSE //if we got blocked, stop impaling - else if(!target.null_rod_check()) //if they don't have a null rod, we do bonus damage on a successful attack + . = ..() + if(!QDELETED(target) && target.stat != DEAD && !target.null_rod_check() && !is_servant_of_ratvar(target)) //we do bonus damage on attacks unless they're a servant, have a null rod, or are dead + var/bonus_damage = bonus_burn //normally a total of 20 damage, 30 with ratvar if(issilicon(target)) - var/mob/living/silicon/S = target - if(S.stat != DEAD) - S.visible_message("[S] shudders violently at [src]'s touch!", "ERROR: Temperature rising!") - S.adjustFireLoss(22) //total 37 damage on borgs + target.visible_message("[target] shudders violently at [src]'s touch!", "ERROR: Temperature rising!") + bonus_damage *= 5 //total 40 damage on borgs, 70 with ratvar else if(iscultist(target) || isconstruct(target)) - var/mob/living/M = target - if(M.stat != DEAD) - to_chat(M, "Your body flares with agony at [src]'s presence!") - M.adjustFireLoss(15) //total 30 damage on cultists - else - target.adjustFireLoss(3) //anything else takes a total of 18 - add_logs(user, target, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])") - add_fingerprint(user) - - attack_verb = list("stabbed", "poked", "slashed") - ratvar_act() - if(impaling) - impale_cooldown = world.time + initial(impale_cooldown) - attack_cooldown = world.time + initial(attack_cooldown) //can't attack until we're done impaling - if(target) - new /obj/effect/temp_visual/dir_setting/bloodsplatter(get_turf(target), get_dir(user, target)) - target.Stun(80) //brief stun - to_chat(user, "You prepare to remove your ratvarian spear from [target]...") - var/remove_verb = pick("pull", "yank", "drag") - if(do_after(user, 10, 1, target)) - var/turf/T = get_turf(target) - var/obj/effect/temp_visual/dir_setting/bloodsplatter/B = new /obj/effect/temp_visual/dir_setting/bloodsplatter(T, get_dir(target, user)) - playsound(T, 'sound/misc/splort.ogg', 200, 1) - playsound(T, 'sound/weapons/pierce.ogg', 200, 1) - if(target.stat != CONSCIOUS) - user.visible_message("[user] [remove_verb]s [src] out of [target]!", "You [remove_verb] your spear from [target]!") - else - user.visible_message("[user] kicks [target] off of [src]!", "You kick [target] off of [src]!") - to_chat(target, "You scream in pain as you're kicked off of [src]!") - target.emote("scream") - step(target, get_dir(user, target)) - T = get_turf(target) - B.forceMove(T) - target.Knockdown(40) //then knockdown if we stayed next to them - playsound(T, 'sound/weapons/thudswoosh.ogg', 50, 1) - flash_color(target, flash_color="#911414", flash_time=8) - else if(target) //it's a do_after, we gotta check again to make sure they didn't get deleted - user.visible_message("[user] [remove_verb]s [src] out of [target]!", "You [remove_verb] your spear from [target]!") - if(target.stat == CONSCIOUS) - to_chat(target, "You scream in pain as [src] is suddenly [remove_verb]ed out of you!") - target.emote("scream") - flash_color(target, flash_color="#911414", flash_time=4) + to_chat(target, "Your body flares with agony at [src]'s presence!") + bonus_damage *= 3 //total 30 damage on cultists, 50 with ratvar + GLOB.clockwork_vitality += target.adjustFireLoss(bonus_damage) //adds the damage done to existing vitality /obj/item/clockwork/ratvarian_spear/throw_impact(atom/target) var/turf/T = get_turf(target) @@ -139,6 +78,7 @@ L.Knockdown(100) else L.Knockdown(40) + GLOB.clockwork_vitality += L.adjustFireLoss(bonus_burn * 3) //normally a total of 40 damage, 70 with ratvar break_spear(T) else ..() diff --git a/code/game/gamemodes/clock_cult/clock_mobs.dm b/code/game/gamemodes/clock_cult/clock_mobs.dm index 97a68fd321..abeb183ab0 100644 --- a/code/game/gamemodes/clock_cult/clock_mobs.dm +++ b/code/game/gamemodes/clock_cult/clock_mobs.dm @@ -38,7 +38,7 @@ /mob/living/simple_animal/hostile/clockwork/examine(mob/user) var/t_He = p_they(TRUE) var/t_s = p_s() - var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src]!\n" msg += "[desc]\n" if(health < maxHealth) msg += "" diff --git a/code/game/gamemodes/clock_cult/clock_scripture.dm b/code/game/gamemodes/clock_cult/clock_scripture.dm index 4a1ca367ce..382aaec10d 100644 --- a/code/game/gamemodes/clock_cult/clock_scripture.dm +++ b/code/game/gamemodes/clock_cult/clock_scripture.dm @@ -150,7 +150,7 @@ Judgement: 12 servants, 5 caches, 300 CV, and any existing AIs are converted or if(prob(ratvarian_prob)) message = text2ratvar(message) to_chat(invoker, "\"[message]\"") - invoker << 'sound/magic/clockwork/invoke_general.ogg' + SEND_SOUND(invoker, sound('sound/magic/clockwork/invoke_general.ogg')) return TRUE /datum/clockwork_scripture/proc/check_offstation_penalty() diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm index d4d6155461..d0b7f11eb4 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_applications.dm @@ -2,28 +2,6 @@ // APPLICATIONS // ////////////////// -//Sigil of Accession: Creates a sigil of accession, which is like a sigil of submission, but can convert any number of non-implanted targets and up to one implanted target. -/datum/clockwork_scripture/create_object/sigil_of_accession - descname = "Trap, Permanent Conversion" - name = "Sigil of Accession" - desc = "Places a luminous sigil much like a Sigil of Submission, but it will remain even after successfully converting a non-implanted target. \ - It will penetrate mindshield implants once before disappearing." - invocations = list("Divinity, enslave...", "...all who trespass here!") - channel_time = 70 - consumed_components = list(BELLIGERENT_EYE = 4, GEIS_CAPACITOR = 2, HIEROPHANT_ANSIBLE = 2) - whispered = TRUE - object_path = /obj/effect/clockwork/sigil/submission/accession - prevent_path = /obj/effect/clockwork/sigil/submission - creator_message = "A luminous sigil appears below you. All non-servants to cross it will be enslaved after a brief time if they do not move." - usage_tip = "It will remain after converting a target, unless that target has a mindshield implant, which it will break to convert them, but consume itself in the process." - tier = SCRIPTURE_APPLICATION - one_per_tile = TRUE - primary_component = BELLIGERENT_EYE - sort_priority = 1 - quickbind = TRUE - quickbind_desc = "Creates a Sigil of Accession, which can convert a mindshielded non-Servant that remains on it." - - //Fellowship Armory: Arms the invoker and nearby servants with Ratvarian armor. /datum/clockwork_scripture/fellowship_armory descname = "Area Servant Armor" @@ -151,26 +129,6 @@ return TRUE -//Anima Fragment: Creates an empty anima fragment, which produces an anima fragment that moves at extreme speed and does high damage. -/datum/clockwork_scripture/create_object/anima_fragment - descname = "Fast Soul Vessel Shell" - name = "Anima Fragment" - desc = "Creates a large shell fitted for soul vessels. Adding an active soul vessel to it results in a powerful construct with decent health and slight regeneration, notable melee power, \ - and exceptional speed, though taking damage will temporarily slow it down." - invocations = list("Call forth...", "...the soldiers of Armorer.") - channel_time = 80 - consumed_components = list(BELLIGERENT_EYE = 2, VANGUARD_COGWHEEL = 2, REPLICANT_ALLOY = 4) - object_path = /obj/structure/destructible/clockwork/shell/fragment - creator_message = "You form an anima fragment, a powerful soul vessel receptacle." - 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 - primary_component = REPLICANT_ALLOY - sort_priority = 4 - quickbind = TRUE - quickbind_desc = "Creates a Fragment Shell, which produces an Anima Fragment when filled with a Soul Vessel." - - //Sigil of Transmission: Creates a sigil of transmission that can drain and store power for clockwork structures. /datum/clockwork_scripture/create_object/sigil_of_transmission descname = "Structure Power Generator & Battery" diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_cyborg.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_cyborg.dm index 85574db6b9..819dfac72e 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_cyborg.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_cyborg.dm @@ -37,7 +37,7 @@ invocations = list("May heathens...", "...kneel under our force!") channel_time = 30 primary_component = BELLIGERENT_EYE - quickbind_desc = "Allows you to place a Judicial Marker to knock down and damage non-Servants in an area.
Click your slab to disable." + quickbind_desc = "Allows you to smite an area, applying Belligerent and briefly stunning.
Click your slab to disable." slab_overlay = "judicial" ranged_type = /obj/effect/proc_holder/slab/judicial ranged_message = "You charge the clockwork slab with judicial force.\n\ diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm index 91ad4d586b..fa61e3ca31 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_drivers.dm @@ -21,6 +21,7 @@ /datum/clockwork_scripture/channeled/belligerent/chant_effects(chant_number) for(var/mob/living/carbon/C in hearers(7, invoker)) C.apply_status_effect(STATUS_EFFECT_BELLIGERENT) + new /obj/effect/temp_visual/ratvar/belligerent(get_turf(invoker)) return TRUE @@ -28,20 +29,20 @@ /datum/clockwork_scripture/create_object/judicial_visor descname = "Delayed Area Knockdown Glasses" name = "Judicial Visor" - desc = "Forms a visor that, when worn, will grant the ability to smite an area, knocking down, muting, and damaging non-Servants." + desc = "Creates a visor that can smite an area, applying Belligerent and briefly stunning. The smote area will explode after 3 seconds." invocations = list("Grant me the flames of Engine!") channel_time = 10 consumed_components = list(BELLIGERENT_EYE = 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, and the marker it creates has a delay of 3 seconds before exploding." + creator_message = "You form a judicial visor, which is capable of smiting a small area." + usage_tip = "The visor has a thirty-second cooldown once used." tier = SCRIPTURE_DRIVER space_allowed = TRUE primary_component = BELLIGERENT_EYE sort_priority = 2 quickbind = TRUE - quickbind_desc = "Creates a Judicial Visor, which can create a Judicial Marker at an area, knocking down, muting, and damaging non-Servants after a delay." + quickbind_desc = "Creates a Judicial Visor, which can smite an area, applying Belligerent and briefly stunning." //Vanguard: Provides twenty seconds of stun immunity. At the end of the twenty seconds, 25% of all stuns absorbed are applied to the invoker. @@ -97,28 +98,28 @@ Click your slab to cancel.
" -//Geis: Grants a short-range binding that will immediately start chanting on binding a valid target. -/datum/clockwork_scripture/ranged_ability/geis_prep - descname = "Melee Convert Attack" +//Geis: Grants a short-range binding attack that allows you to mute and drag around a target in a very obvious manner. +/datum/clockwork_scripture/ranged_ability/geis + descname = "Melee Mute & Stun" name = "Geis" - desc = "Charges your slab with divine energy, allowing you to bind a nearby heretic for conversion. This is very obvious and will make your slab visible in-hand." - invocations = list("Divinity, grant...", "...me strength...", "...to enlighten...", "...the heathen!") + desc = "Charges your slab with divine energy, allowing you to bind and pull a struck heretic." + invocations = list("Divinity, grant me strength...", "...to bind the heathen!") whispered = TRUE channel_time = 20 - usage_tip = "Is melee range and does not penetrate mindshield implants. Much more efficient than a Sigil of Submission at low Servant amounts." + usage_tip = "You CANNOT TAKE ANY NON-PULL ACTIONS while the target is bound, so Sigils of Submission should be placed before use." tier = SCRIPTURE_DRIVER primary_component = GEIS_CAPACITOR sort_priority = 5 quickbind = TRUE - quickbind_desc = "Allows you to bind and start converting an adjacent target non-Servant.
Click your slab to disable." + quickbind_desc = "Allows you to bind and mute an adjacent target non-Servant.
Click your slab to disable." slab_overlay = "geis" ranged_type = /obj/effect/proc_holder/slab/geis ranged_message = "You charge the clockwork slab with divine energy.\n\ - Left-click a target within melee range to convert!\n\ + Left-click a target within melee range to bind!\n\ Click your slab to cancel." timeout_time = 100 -/datum/clockwork_scripture/ranged_ability/geis_prep/run_scripture() +/datum/clockwork_scripture/ranged_ability/geis/run_scripture() var/servants = 0 if(!GLOB.ratvar_awakens) for(var/mob/living/M in GLOB.living_mob_list) @@ -130,93 +131,25 @@ channel_time = min(channel_time + servants*3, 50) return ..() -//The scripture that does the converting. -/datum/clockwork_scripture/geis - name = "Geis Conversion" - invocations = list("Enlighten this heathen!", "All are insects before Engine!", "Purge all untruths and honor Engine.") - channel_time = 49 - tier = SCRIPTURE_PERIPHERAL - var/mob/living/target - var/obj/structure/destructible/clockwork/geis_binding/binding -/datum/clockwork_scripture/geis/Destroy() - if(binding && !QDELETED(binding)) - qdel(binding) - return ..() - -/datum/clockwork_scripture/geis/can_recite() - if(!target) - return FALSE - return ..() - -/datum/clockwork_scripture/geis/run_scripture() - var/servants = 0 - if(!GLOB.ratvar_awakens) - for(var/mob/living/M in GLOB.living_mob_list) - if(can_recite_scripture(M, TRUE)) - servants++ - if(target.buckled) - target.buckled.unbuckle_mob(target, TRUE) - binding = new(get_turf(target)) - if(servants > SCRIPT_SERVANT_REQ) - servants -= SCRIPT_SERVANT_REQ - channel_time = min(channel_time + servants*7, 120) - binding.can_resist = TRUE - binding.setDir(target.dir) - binding.buckle_mob(target, TRUE) - return ..() - -/datum/clockwork_scripture/geis/check_special_requirements() - return target && binding && target.buckled == binding && !is_servant_of_ratvar(target) && target.stat != DEAD - -/datum/clockwork_scripture/geis/scripture_effects() - . = add_servant_of_ratvar(target) - if(.) - add_logs(invoker, target, "Converted", object = "Geis") - - -//Taunting Tirade: Channeled for up to five times over thirty seconds. Confuses non-servants that can hear it and allows movement for a brief time after each chant. -/datum/clockwork_scripture/channeled/taunting_tirade - descname = "Channeled, Mobile Confusion Trail" - name = "Taunting Tirade" - desc = "Allows movement for five seconds, leaving a trail that confuses and knocks down. Chanted every second for up to thirty seconds." - chant_invocations = list("Hostiles on my back!", "Enemies on my trail!", "Gonna try and shake my tail.", "Bogeys on my six!") - chant_amount = 5 - chant_interval = 10 +//Sigil of Submission: Creates a sigil of submission, which converts one heretic above it after a delay. +/datum/clockwork_scripture/create_object/sigil_of_submission + descname = "Trap, Conversion" + name = "Sigil of Submission" + desc = "Places a luminous sigil that will convert any non-Servants that remain on it for 8 seconds." + invocations = list("Divinity, enlighten...", "...those who trespass here!") + channel_time = 60 consumed_components = list(GEIS_CAPACITOR = 1) - usage_tip = "Useful for fleeing attackers, as few will be able to follow someone using this scripture." + whispered = TRUE + object_path = /obj/effect/clockwork/sigil/submission + creator_message = "A luminous sigil appears below you. Any non-Servants to cross it will be converted after 8 seconds if they do not move." + usage_tip = "This is the primary conversion method, though it will not penetrate mindshield implants." tier = SCRIPTURE_DRIVER + one_per_tile = TRUE primary_component = GEIS_CAPACITOR sort_priority = 6 quickbind = TRUE - quickbind_desc = "Allows movement for five seconds, leaving a trail that confuses and knocks down.
Maximum 5 chants." - var/flee_time = 47 //allow fleeing for 5 seconds - var/grace_period = 3 //very short grace period so you don't have to stop immediately - var/datum/progressbar/progbar - -/datum/clockwork_scripture/channeled/taunting_tirade/chant_effects(chant_number) - invoker.visible_message("[invoker] is suddenly covered with a thin layer of purple smoke!") - var/invoker_old_color = invoker.color - invoker.color = list("#AF0AAF", "#AF0AAF", "#AF0AAF", rgb(0,0,0)) - animate(invoker, color = invoker_old_color, time = flee_time+grace_period) - addtimer(CALLBACK(invoker, /atom/proc/update_atom_colour), flee_time+grace_period) - var/endtime = world.time + flee_time - progbar = new(invoker, flee_time, invoker) - progbar.bar.color = list("#AF0AAF", "#AF0AAF", "#AF0AAF", rgb(0,0,0)) - animate(progbar.bar, color = initial(progbar.bar.color), time = flee_time+grace_period) - while(world.time < endtime && can_recite()) - sleep(1) - new/obj/structure/destructible/clockwork/taunting_trail(invoker.loc) - progbar.update(endtime - world.time) - qdel(progbar) - if(can_recite() && chant_number != chant_amount) - sleep(grace_period) - else - return FALSE - return TRUE - -/datum/clockwork_scripture/channeled/taunting_tirade/chant_end_effects() - qdel(progbar) + quickbind_desc = "Creates a Sigil of Submission, which will convert non-Servants that remain on it." //Replicant: Creates a new clockwork slab. diff --git a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm index 47558a5ee9..0e42af3a65 100644 --- a/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm +++ b/code/game/gamemodes/clock_cult/clock_scriptures/scripture_scripts.dm @@ -29,31 +29,12 @@ return ..() -//Cogscarab: Creates an empty cogscarab shell, which produces a cogscarab dedicated to maintaining and defending the cult. -/datum/clockwork_scripture/create_object/cogscarab - descname = "Constructor Soul Vessel Shell" - name = "Cogscarab" - desc = "Creates a small shell fitted for soul vessels. Adding an active soul vessel to it results in a small construct with tools and an inbuilt fabricator." - invocations = list("Call forth...", "...the workers of Armorer.") - channel_time = 60 - consumed_components = list(BELLIGERENT_EYE = 2, HIEROPHANT_ANSIBLE = 1) - object_path = /obj/structure/destructible/clockwork/shell/cogscarab - creator_message = "You form a cogscarab, a constructor soul vessel receptacle." - observer_message = "The slab disgorges a puddle of black metal that contracts and forms into a strange shell!" - usage_tip = "Useless without a soul vessel and should not be created without one." - tier = SCRIPTURE_SCRIPT - primary_component = BELLIGERENT_EYE - sort_priority = 2 - quickbind = TRUE - quickbind_desc = "Creates a Cogscarab Shell, which produces a Cogscarab when filled with a Soul Vessel." - - //Vitality Matrix: Creates a sigil which will drain health from nonservants and can use that health to heal or even revive servants. /datum/clockwork_scripture/create_object/vitality_matrix descname = "Trap, Damage to Healing" name = "Vitality Matrix" - desc = "Places a sigil that drains life from any living non-Servants that cross it. Servants that cross it, however, will be healed based on how much Vitality all \ - Matrices have drained from non-Servants. Dead Servants can be revived by this sigil if there is vitality equal to the target Servant's non-oxygen damage." + desc = "Places a sigil that drains life from any living non-Servants that cross it, producing Vitality. Servants that cross it, however, will be healed using existing Vitality. \ + Dead Servants can be revived by this sigil at a cost of 150 Vitality." invocations = list("Divinity...", "...steal their life...", "...for these shells!") channel_time = 60 consumed_components = list(BELLIGERENT_EYE = 1, VANGUARD_COGWHEEL = 2) @@ -181,46 +162,6 @@ return TRUE -//Sigil of Submission: Creates a sigil of submission, which converts one heretic above it after a delay. -/datum/clockwork_scripture/create_object/sigil_of_submission - descname = "Trap, Conversion" - name = "Sigil of Submission" - desc = "Places a luminous sigil that will enslave any valid beings standing on it after a time." - invocations = list("Divinity, enlighten...", "...those who trespass here!") - channel_time = 60 - consumed_components = list(BELLIGERENT_EYE = 1, GEIS_CAPACITOR = 2) - whispered = TRUE - object_path = /obj/effect/clockwork/sigil/submission - creator_message = "A luminous 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 is not a primary conversion method - use Geis for that. It is advantageous as a trap, however, as it will transmit the name of the newly-converted." - tier = SCRIPTURE_SCRIPT - one_per_tile = TRUE - primary_component = GEIS_CAPACITOR - sort_priority = 5 - quickbind = TRUE - quickbind_desc = "Creates a Sigil of Submission, which will convert one non-Servant that remains on it." - - -//Soul Vessel: Creates a soul vessel, which can seek a ghost or be used on the uncovered head of a dead or dying human to take their brain. -/datum/clockwork_scripture/create_object/soul_vessel - descname = "Clockwork Posibrain" - name = "Soul Vessel" - desc = "Forms an ancient positronic brain with an overriding directive to serve Ratvar." - invocations = list("Herd the souls of...", "...the blasphemous damned!") - channel_time = 30 - consumed_components = list(VANGUARD_COGWHEEL = 1, GEIS_CAPACITOR = 2) - whispered = TRUE - object_path = /obj/item/device/mmi/posibrain/soul_vessel - creator_message = "You form a soul vessel, which can be used in-hand to attract spirits, or used on an unconscious or dead human to extract their consciousness." - usage_tip = "The vessel can be used as a teleport target for Spatial Gateway, though it is generally better-used by placing it in a shell or cyborg body." - tier = SCRIPTURE_SCRIPT - space_allowed = TRUE - primary_component = GEIS_CAPACITOR - sort_priority = 6 - quickbind = TRUE - quickbind_desc = "Creates a Soul Vessel, which can be placed in construct shells and cyborg bodies once filled." - - //Replica Fabricator: Creates a replica fabricator, used to convert objects and repair clockwork structures. /datum/clockwork_scripture/create_object/replica_fabricator descname = "Replaces Objects with Ratvarian Versions" @@ -245,13 +186,12 @@ /datum/clockwork_scripture/function_call descname = "Permanent Summonable Spear" name = "Function Call" - desc = "Grants the invoker the ability to call forth a powerful Ratvarian spear every three minutes. The spear will deal significant damage to Nar-Sie's dogs and silicon lifeforms, but will \ - vanish three minutes after being summoned." + desc = "Grants the invoker the ability to call forth a powerful Ratvarian spear every 3 minutes, with it lasting 3 minutes. The spear's attacks will generate Vitality, used for healing." invocations = list("Grant me...", "...the might of brass!") channel_time = 20 consumed_components = list(REPLICANT_ALLOY = 2, HIEROPHANT_ANSIBLE = 1) whispered = TRUE - usage_tip = "You can impale human targets with the spear by pulling them, then attacking. Throwing the spear at a mob will do massive damage and knock them down, but break the spear." + usage_tip = "Throwing the spear at a mob will do massive damage and knock them down, but break the spear." tier = SCRIPTURE_SCRIPT primary_component = REPLICANT_ALLOY sort_priority = 8 @@ -345,50 +285,3 @@ portal_uses = max(portal_uses, 100) //Very powerful if Ratvar has been summoned duration = max(duration, 100) return slab.procure_gateway(invoker, duration, portal_uses) - - -//Volt Blaster: Channeled for up to five times over ten seconds to fire up to five rays of energy at target locations. -/datum/clockwork_scripture/channeled/volt_blaster - descname = "Channeled, Targeted Energy Blasts" - name = "Volt Blaster" - desc = "Allows you to fire five energy rays at target locations. Channeled every fourth of a second for a maximum of ten seconds." - channel_time = 30 - invocations = list("Amperage...", "...grant me your power!") - chant_invocations = list("Use charge to kill!", "Slay with power!", "Hunt with energy!") - chant_amount = 5 - chant_interval = 4 - consumed_components = list(GEIS_CAPACITOR = 1, HIEROPHANT_ANSIBLE = 2) - usage_tip = "Though it requires you to stand still, this scripture can do massive damage." - tier = SCRIPTURE_SCRIPT - primary_component = HIEROPHANT_ANSIBLE - sort_priority = 10 - quickbind = TRUE - quickbind_desc = "Allows you to fire energy rays at target locations.
Maximum 5 chants." - var/static/list/nzcrentr_insults = list("You're not very good at aiming.", "You hunt badly.", "What a waste of energy.", "Almost funny to watch.", - "Boss says \"Click something, you idiot!\".", "Stop wasting components if you can't aim.") - -/datum/clockwork_scripture/channeled/volt_blaster/chant_effects(chant_number) - slab.busy = null - var/datum/clockwork_scripture/ranged_ability/volt_ray/ray = new - ray.slab = slab - ray.invoker = invoker - var/turf/T = get_turf(invoker) - if(!ray.run_scripture() && slab && invoker) - if(can_recite() && T == get_turf(invoker)) - to_chat(invoker, "\"[text2ratvar(pick(nzcrentr_insults))]\"") - else - return FALSE - return TRUE - -/obj/effect/ebeam/volt_ray - name = "volt_ray" - layer = LYING_MOB_LAYER - -/datum/clockwork_scripture/ranged_ability/volt_ray - name = "Volt Ray" - slab_overlay = "volt" - allow_mobility = FALSE - ranged_type = /obj/effect/proc_holder/slab/volt - ranged_message = "You charge the clockwork slab with shocking might.\n\ - Left-click a target to fire, quickly!" - timeout_time = 20 diff --git a/code/game/gamemodes/clock_cult/clock_structures/clock_shells.dm b/code/game/gamemodes/clock_cult/clock_structures/clock_shells.dm deleted file mode 100644 index a2f1022abc..0000000000 --- a/code/game/gamemodes/clock_cult/clock_structures/clock_shells.dm +++ /dev/null @@ -1,48 +0,0 @@ -//Useless on their own, these shells can create powerful constructs. -/obj/structure/destructible/clockwork/shell - construction_value = 0 - anchored = FALSE - density = FALSE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - var/mobtype = /mob/living/simple_animal/hostile/clockwork - var/spawn_message = " is an error and you should yell at whoever spawned this shell." - -/obj/structure/destructible/clockwork/shell/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) - to_chat(user, "[S] is inactive! Turn it on or capture a mind first.") - return 0 - if(S.brainmob && (!S.brainmob.client || !S.brainmob.mind)) - to_chat(user, "[S]'s trapped consciousness appears inactive!") - return 0 - user.visible_message("[user] places [S] in [src], where it fuses to the shell.", "You place [S] in [src], fusing it to the shell.") - var/mob/living/simple_animal/A = new mobtype(get_turf(src)) - A.visible_message("[src][spawn_message]") - S.brainmob.mind.transfer_to(A) - A.fully_replace_character_name(null, "[findtext(A.name, initial(A.name)) ? "[initial(A.name)]":"[A.name]"] ([S.brainmob.name])") - user.drop_item() - qdel(S) - qdel(src) - return 1 - else - return ..() - -/obj/structure/destructible/clockwork/shell/cogscarab - name = "cogscarab shell" - desc = "A small brass shell with a cube-shaped receptable in its center. It gives off an aura of obsessive perfectionism." - clockwork_desc = "A dormant receptable that, when powered with a soul vessel, will become a weak construct with an inbuilt fabricator." - icon_state = "clockdrone_shell" - mobtype = /mob/living/simple_animal/drone/cogscarab - spawn_message = "'s eyes blink open, glowing bright red." - -/obj/structure/destructible/clockwork/shell/fragment - name = "fragment shell" - 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" - mobtype = /mob/living/simple_animal/hostile/clockwork/fragment - spawn_message = " whirs and rises from the ground on a flickering jet of reddish fire." diff --git a/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm b/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm index ecb69c8a27..82d1e68ff3 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/geis_binding.dm @@ -5,8 +5,9 @@ clockwork_desc = "A binding ring around a target, preventing them from taking action while they're being converted." max_integrity = 25 light_range = 2 - light_power = 0.5 + light_power = 0.8 light_color = "#AF0AAF" + anchored = FALSE density = FALSE immune_to_servant_attacks = TRUE icon = 'icons/effects/clockwork_effects.dmi' @@ -16,16 +17,34 @@ debris = list() can_buckle = TRUE buckle_lying = 0 - buckle_prevents_pull = TRUE - var/resisting = FALSE - var/can_resist = FALSE var/mob_layer = MOB_LAYER +/obj/structure/destructible/clockwork/geis_binding/Initialize(mapload, obj/item/clockwork/slab/the_slab) + . = ..() + START_PROCESSING(SSprocessing, src) + +/obj/structure/destructible/clockwork/geis_binding/Destroy() + STOP_PROCESSING(SSprocessing, src) + return ..() + /obj/structure/destructible/clockwork/geis_binding/examine(mob/user) icon_state = "geisbinding_full" ..() icon_state = "geisbinding" +/obj/structure/destructible/clockwork/geis_binding/process() + if(LAZYLEN(buckled_mobs)) + for(var/V in buckled_mobs) + var/mob/living/L = V + if(is_servant_of_ratvar(L)) //servants are freed automatically + take_damage(obj_integrity) + return + var/tick_damage = 1 + if(!is_servant_of_ratvar(pulledby)) + tick_damage++ + take_damage(tick_damage, sound_effect = FALSE) + playsound(src, 'sound/effects/empulse.ogg', tick_damage * 20, TRUE) + /obj/structure/destructible/clockwork/geis_binding/attack_hand(mob/living/user) return @@ -48,10 +67,8 @@ var/obj/item/geis_binding/B = new(M) M.put_in_hands(B, i) M.regenerate_icons() - M.visible_message("A [name] appears around [M]!", \ - "A [name] appears around you![can_resist ? "\nResist!":""]") - if(!can_resist) - repair_and_interrupt() + M.visible_message("A [name] appears around [M]!", "A [name] appears around you!") + repair_and_interrupt() else var/obj/effect/temp_visual/ratvar/geis_binding/G = new /obj/effect/temp_visual/ratvar/geis_binding(M.loc) var/obj/effect/temp_visual/ratvar/geis_binding/T = new /obj/effect/temp_visual/ratvar/geis_binding/top(M.loc) @@ -65,11 +82,6 @@ for(var/obj/item/geis_binding/GB in M.held_items) M.dropItemToGround(GB, TRUE) -/obj/structure/destructible/clockwork/geis_binding/relaymove(mob/user, direction) - if(isliving(user) && can_resist) - var/mob/living/L = user - L.resist() - /obj/structure/destructible/clockwork/geis_binding/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) playsound(src, 'sound/effects/empulse.ogg', 50, 1) @@ -79,7 +91,7 @@ update_icon() /obj/structure/destructible/clockwork/geis_binding/update_icon() - alpha = min(initial(alpha) + ((obj_integrity - max_integrity) * 5), 255) + alpha = min(255 * ((obj_integrity/max_integrity) + 0.2) , 255) /obj/structure/destructible/clockwork/geis_binding/proc/repair_and_interrupt() obj_integrity = max_integrity @@ -87,10 +99,10 @@ for(var/m in buckled_mobs) var/mob/living/L = m if(L) - L.Stun(20, 1, 1) + L.Stun(130, 1, 1) //basically here to act as a mute for borgs if(iscarbon(L)) var/mob/living/carbon/C = L - C.silent += 4 + C.silent += 7 visible_message("[src] flares brightly!") var/obj/effect/temp_visual/ratvar/geis_binding/G1 = new /obj/effect/temp_visual/ratvar/geis_binding(loc) var/obj/effect/temp_visual/ratvar/geis_binding/G2 = new /obj/effect/temp_visual/ratvar/geis_binding(loc) @@ -106,18 +118,7 @@ animate(T2, pixel_y = pixel_y - 9, alpha = 0, time = 8, easing = EASE_IN) /obj/structure/destructible/clockwork/geis_binding/user_unbuckle_mob(mob/living/buckled_mob, mob/user) - if(buckled_mob == user) - if(!resisting && can_resist) - resisting = TRUE - user.visible_message("[user] starts struggling against [src]...", "You start breaking out of [src]...") - while(do_after(user, 10, target = src) && resisting && obj_integrity) - if(obj_integrity - 5 <= 0) - user.visible_message("[user] breaks [src]!", "You break [src]!") - take_damage(5) - return user - take_damage(5) - resisting = FALSE - else + if(buckled_mob != user) return ..() /obj/item/geis_binding @@ -128,5 +129,4 @@ flags = NODROP|ABSTRACT|DROPDEL /obj/item/geis_binding/pre_attackby(atom/target, mob/living/user, params) - user.resist() return FALSE diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index e4af3c2d45..971621eb27 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -203,7 +203,7 @@ var/acolytes_survived = 0 for(var/datum/mind/cult_mind in cult) if (cult_mind.current && cult_mind.current.stat != DEAD) - if(cult_mind.current.onCentcom() || cult_mind.current.onSyndieBase()) + if(cult_mind.current.onCentCom() || cult_mind.current.onSyndieBase()) acolytes_survived++ if(acolytes_survived>=acolytes_needed) return 0 diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm index a7fb90d253..647b47e7fa 100644 --- a/code/game/gamemodes/cult/cult_comms.dm +++ b/code/game/gamemodes/cult/cult_comms.dm @@ -103,13 +103,13 @@ if(B.current) B.current.update_action_buttons_icon() if(!B.current.incapacitated()) - B.current << 'sound/hallucinations/im_here1.ogg' + SEND_SOUND(B.current, 'sound/hallucinations/im_here1.ogg') to_chat(B.current, "Acolyte [Nominee] has asserted that they are worthy of leading the cult. A vote will be called shortly.") sleep(100) var/list/asked_cultists = list() for(var/datum/mind/B in SSticker.mode.cult) if(B.current && B.current != Nominee && !B.current.incapacitated()) - B.current << 'sound/magic/exit_blood.ogg' + SEND_SOUND(B.current, 'sound/magic/exit_blood.ogg') asked_cultists += B.current var/list/yes_voters = pollCandidates("[Nominee] seeks to lead your cult, do you support [Nominee.p_them()]?", poll_time = 300, group = asked_cultists) if(QDELETED(Nominee) || Nominee.incapacitated()) @@ -280,7 +280,7 @@ for(var/datum/mind/B in SSticker.mode.cult) if(B.current && B.current.stat != DEAD && B.current.client) to_chat(B.current, "Master [ranged_ability_user] has marked [GLOB.blood_target] in the [A.name] as the cult's top priority, get there immediately!") - B.current << pick(sound('sound/hallucinations/over_here2.ogg',0,1,75), sound('sound/hallucinations/over_here3.ogg',0,1,75)) + SEND_SOUND(B.current, sound(pick('sound/hallucinations/over_here2.ogg','sound/hallucinations/over_here3.ogg'),0,1,75)) B.current.client.images += GLOB.blood_target_image attached_action.owner.update_action_buttons_icon() remove_ranged_ability("The marking rite is complete! It will last for 90 seconds.") @@ -324,7 +324,7 @@ return FALSE if(cooldown > world.time) if(!PM.active) - owner << "You need to wait [round((cooldown - world.time) * 0.1)] seconds before you can pulse again!" + to_chat(owner, "You need to wait [round((cooldown - world.time) * 0.1)] seconds before you can pulse again!") return FALSE return ..() @@ -367,7 +367,7 @@ if(!attached_action.throwing) attached_action.throwing = TRUE attached_action.throwee = target - ranged_ability_user << 'sound/weapons/thudswoosh.ogg' + SEND_SOUND(ranged_ability_user, sound('sound/weapons/thudswoosh.ogg')) to_chat(ranged_ability_user,"You reach through the veil with your mind's eye and seize [target]!") return else diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 918398154c..d472bb7d5a 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -161,11 +161,15 @@ /obj/item/weapon/sharpener/cult name = "eldritch whetstone" desc = "A block, empowered by dark magic. Sharp weapons will be enhanced when used on the stone." + icon_state = "cult_sharpener" used = 0 increment = 5 max = 40 prefix = "darkened" +/obj/item/weapon/sharpener/cult/update_icon() + icon_state = "cult_sharpener[used ? "_used" : ""]" + /obj/item/clothing/suit/hooded/cultrobes/cult_shield name = "empowered cultist armor" desc = "Empowered garb which creates a powerful shield around the user." @@ -391,7 +395,7 @@ if(!iscultist(user)) to_chat(user, "That doesn't seem to do anything useful.") return - + if(istype(A, /obj/item)) var/list/cultists = list() diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 69b730d574..4c80f53b94 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -538,7 +538,7 @@ structure_check() searches for nearby cultist structures required for the invoca mob_to_revive = input(user, "Choose a cultist to revive.", "Cultist to Revive") as null|anything in potential_revive_mobs else mob_to_revive = potential_revive_mobs[1] - if(!src || QDELETED(src) || rune_in_use || !validness_checks(mob_to_revive, user)) + if(QDELETED(src) || !validness_checks(mob_to_revive, user)) rune_in_use = FALSE return if(user.name == "Herbert West") diff --git a/code/game/gamemodes/cult/supply.dm b/code/game/gamemodes/cult/supply.dm index 71b8c941b1..23270c3d6c 100644 --- a/code/game/gamemodes/cult/supply.dm +++ b/code/game/gamemodes/cult/supply.dm @@ -29,7 +29,6 @@ return 0 /obj/item/weapon/paper/talisman/supply/Topic(href, href_list) - world.log << "[usr], [href], [href_list]" if(QDELETED(src) || usr.incapacitated() || !in_range(src, usr)) return diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index e8b77c1172..c5b94d983f 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -270,7 +270,7 @@ if(target.use(25)) new /obj/structure/constructshell(T) to_chat(user, "The talisman clings to the metal and twists it into a construct shell!") - user << sound('sound/effects/magic.ogg',0,1,25) + SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) invoke(user, 1) qdel(src) else @@ -281,7 +281,7 @@ new /obj/item/stack/sheet/runed_metal(T,quantity) target.use(quantity) to_chat(user, "The talisman clings to the plasteel, transforming it into runed metal!") - user << sound('sound/effects/magic.ogg',0,1,25) + SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25)) invoke(user, 1) if(uses <= 0) qdel(src) diff --git a/code/game/gamemodes/devil/true_devil/_true_devil.dm b/code/game/gamemodes/devil/true_devil/_true_devil.dm index 1a0cfcd231..090b926dbf 100644 --- a/code/game/gamemodes/devil/true_devil/_true_devil.dm +++ b/code/game/gamemodes/devil/true_devil/_true_devil.dm @@ -61,15 +61,15 @@ /mob/living/carbon/true_devil/examine(mob/user) - var/msg = "*---------*\nThis is [bicon(src)] [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src, user)] [src]!\n" //Left hand items for(var/obj/item/I in held_items) if(!(I.flags & ABSTRACT)) if(I.blood_DNA) - msg += "It is holding [bicon(I)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" + msg += "It is holding [icon2html(I, user)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" else - msg += "It is holding [bicon(I)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" + msg += "It is holding [icon2html(I, user)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" //Braindead if(!client && stat != DEAD) diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index f36f967c1d..a56a2d6647 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -33,7 +33,7 @@ for(var/obj/machinery/power/apc/C in GLOB.apcs_list) if(C.cell && C.z == ZLEVEL_STATION) - var/area/A = get_area(C) + var/area/A = C.area var/skip = 0 for(var/area_type in skipped_areas) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 057f9ee34a..790319e362 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -83,7 +83,7 @@ if(SSdbcore.Connect()) var/sql - if(SSticker && SSticker.mode) + if(SSticker.mode) sql += "game_mode = '[SSticker.mode]'" if(GLOB.revdata.originmastercommit) if(sql) @@ -111,7 +111,7 @@ var/list/living_crew = list() for(var/mob/Player in GLOB.mob_list) - if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player)) + if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) && !isbrain(Player) && Player.client) living_crew += Player if(living_crew.len / GLOB.joined_player_list.len <= config.midround_antag_life_check) //If a lot of the player base died, we start fresh message_admins("Convert_roundtype failed due to too many dead people. Limit is [config.midround_antag_life_check * 100]% living crew") @@ -120,7 +120,7 @@ var/list/datum/game_mode/runnable_modes = config.get_runnable_midround_modes(living_crew.len) var/list/datum/game_mode/usable_modes = list() for(var/datum/game_mode/G in runnable_modes) - if(G.reroll_friendly) + if(G.reroll_friendly && living_crew >= G.required_players) usable_modes += G else qdel(G) @@ -208,7 +208,7 @@ return 0 //A resource saver: once we find someone who has to die for all antags to be dead, we can just keep checking them, cycling over everyone only when we lose our mark. for(var/mob/Player in GLOB.living_mob_list) - if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player)) + if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player) && Player.client) if(Player.mind.special_role) //Someone's still antaging! living_antag_player = Player return 0 diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm index ba18ad7578..b7b20a7311 100644 --- a/code/game/gamemodes/gang/gang_datum.dm +++ b/code/game/gamemodes/gang/gang_datum.dm @@ -191,7 +191,7 @@ var/mob/living/mob = get(tool.loc, /mob/living) if(mob && mob.mind && mob.stat == CONSCIOUS) if(mob.mind.gang_datum == src) - to_chat(mob, "[bicon(tool)] [message]") + to_chat(mob, "[icon2html(tool, mob)] [message]") return diff --git a/code/game/gamemodes/gang/gang_pen.dm b/code/game/gamemodes/gang/gang_pen.dm index 4357f31e83..e52db2ec5f 100644 --- a/code/game/gamemodes/gang/gang_pen.dm +++ b/code/game/gamemodes/gang/gang_pen.dm @@ -66,4 +66,4 @@ cooldown = 0 icon_state = "pen" var/mob/M = get(src, /mob) - to_chat(M, "[bicon(src)] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.") + to_chat(M, "[icon2html(src, M)] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.") diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm index 601a1f1c0d..0be52e6033 100644 --- a/code/game/gamemodes/gang/recaller.dm +++ b/code/game/gamemodes/gang/recaller.dm @@ -110,7 +110,7 @@ if(!message || !can_use(user)) return if(user.z > 2) - to_chat(user, "[bicon(src)]Error: Station out of range.") + to_chat(user, "[icon2html(src, user)]Error: Station out of range.") return var/list/members = list() members += gang.gangsters @@ -179,35 +179,35 @@ gang.message_gangtools("[usr] is attempting to recall the emergency shuttle.") recalling = 1 - to_chat(loc, "[bicon(src)]Generating shuttle recall order with codes retrieved from last call signal...") + to_chat(loc, "[icon2html(src, loc)]Generating shuttle recall order with codes retrieved from last call signal...") sleep(rand(100,300)) if(SSshuttle.emergency.mode != SHUTTLE_CALL) //Shuttle can only be recalled when it's moving to the station - to_chat(user, "[bicon(src)]Emergency shuttle cannot be recalled at this time.") + to_chat(user, "[icon2html(src, user)]Emergency shuttle cannot be recalled at this time.") recalling = 0 return 0 - to_chat(loc, "[bicon(src)]Shuttle recall order generated. Accessing station long-range communication arrays...") + to_chat(loc, "[icon2html(src, loc)]Shuttle recall order generated. Accessing station long-range communication arrays...") sleep(rand(100,300)) if(!gang.dom_attempts) - to_chat(user, "[bicon(src)]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.") + to_chat(user, "[icon2html(src, user)]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.") recalling = 0 return 0 var/turf/userturf = get_turf(user) if(userturf.z != ZLEVEL_STATION) //Shuttle can only be recalled while on station - to_chat(user, "[\bicon(src)]Error: Device out of range of station communication arrays.") + to_chat(user, "[icon2html(src, user)]Error: Device out of range of station communication arrays.") recalling = 0 return 0 var/datum/station_state/end_state = new /datum/station_state() end_state.count() if((100 * GLOB.start_state.score(end_state)) < 80) //Shuttle cannot be recalled if the station is too damaged - to_chat(user, "[bicon(src)]Error: Station communication systems compromised. Unable to establish connection.") + to_chat(user, "[icon2html(src, user)]Error: Station communication systems compromised. Unable to establish connection.") recalling = 0 return 0 - to_chat(loc, "[bicon(src)]Comm arrays accessed. Broadcasting recall signal...") + to_chat(loc, "[icon2html(src, loc)]Comm arrays accessed. Broadcasting recall signal...") sleep(rand(100,300)) @@ -220,7 +220,7 @@ gang.recalls -= 1 return 1 - to_chat(loc, "[bicon(src)]No response recieved. Emergency shuttle cannot be recalled at this time.") + to_chat(loc, "[icon2html(src, loc)]No response recieved. Emergency shuttle cannot be recalled at this time.") return 0 /obj/item/device/gangtool/proc/can_use(mob/living/carbon/human/user) diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 8c8108962e..5bc162ee8f 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -375,8 +375,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( minor_announce("[key] SECONDS UNTIL DOOMSDAY DEVICE ACTIVATION!", "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4", TRUE) /obj/machinery/doomsday_device/proc/detonate(z_level = ZLEVEL_STATION) - for(var/mob/M in GLOB.player_list) - M << 'sound/machines/alarm.ogg' + sound_to_playing_players('sound/machines/alarm.ogg') sleep(100) for(var/mob/living/L in GLOB.mob_list) var/turf/T = get_turf(L) diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index 0b20694b58..d652d38d11 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -37,8 +37,8 @@ if(player.stat != DEAD) ++survivors - if(player.onCentcom()) - text += "
[player.real_name] escaped to the safety of Centcom." + if(player.onCentCom()) + text += "
[player.real_name] escaped to the safety of CentCom." else if(player.onSyndieBase()) text += "
[player.real_name] escaped to the (relative) safety of Syndicate Space." else diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 65ea714761..18daea8b31 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -125,8 +125,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event /obj/effect/meteor/New() ..() GLOB.meteor_list += src - if(SSaugury) - SSaugury.register_doom(src, threat) + SSaugury.register_doom(src, threat) SpinAnimation() QDEL_IN(src, lifetime) diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 502b02c7f7..c24ab53ef5 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -29,6 +29,12 @@ 3. Biological resources will be harvested at a later date; do not harm them. "} +/obj/effect/mob_spawn/swarmer/Initialize() + . = ..() + var/area/A = get_area(src) + if(A) + notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/effects/bin_close.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE) + /obj/effect/mob_spawn/swarmer/attack_hand(mob/living/user) to_chat(user, "Picking up the swarmer may cause it to activate. You should be careful about this.") @@ -648,7 +654,7 @@ to_chat(M, "[link] [rendered]") /mob/living/simple_animal/hostile/swarmer/proc/ContactSwarmers() - var/message = input(src, "Announce to other swarmers", "Swarmer contact") + var/message = stripped_input(src, "Announce to other swarmers", "Swarmer contact") // TODO get swarmers their own colour rather than just boldtext if(message) swarmer_chat(message) diff --git a/code/game/gamemodes/miniantags/monkey/monkey.dm b/code/game/gamemodes/miniantags/monkey/monkey.dm index da9f4b61f1..f84e4e72b6 100644 --- a/code/game/gamemodes/miniantags/monkey/monkey.dm +++ b/code/game/gamemodes/miniantags/monkey/monkey.dm @@ -41,7 +41,7 @@ /datum/game_mode/monkey/announce() to_chat(world, "The current game mode is - Monkey!") - to_chat(world, "One or more crewmembers have been infected with Jungle Fever! Crew: Contain the outbreak. None of the infected monkeys may escape alive to Centcom. \ + to_chat(world, "One or more crewmembers have been infected with Jungle Fever! Crew: Contain the outbreak. None of the infected monkeys may escape alive to CentCom. \ Monkeys: Ensure that your kind lives on! Rise up against your captors!") @@ -50,7 +50,7 @@ to_chat(carrier.current, "You have been planted onto this station by the Animal Rights Consortium.") to_chat(carrier.current, "Soon the disease will transform you into an ape. Afterwards, you will be able spread the infection to others with a bite.") to_chat(carrier.current, "While your infection strain is undetectable by scanners, any other infectees will show up on medical equipment.") - to_chat(carrier.current, "Your mission will be deemed a success if any of the live infected monkeys reach Centcom.") + to_chat(carrier.current, "Your mission will be deemed a success if any of the live infected monkeys reach CentCom.") return /datum/game_mode/monkey/post_setup() @@ -88,7 +88,7 @@ var/datum/disease/D = new /datum/disease/transformation/jungle_fever() for(var/mob/living/carbon/monkey/M in GLOB.living_mob_list) if (M.HasDisease(D)) - if(M.onCentcom() || M.onSyndieBase()) + if(M.onCentCom() || M.onSyndieBase()) escaped_monkeys++ if(escaped_monkeys >= monkeys_to_win) return 1 diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index dcd2ef2673..af27833d15 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -224,7 +224,7 @@ player_mind.special_role = "Morph" SSticker.mode.traitors |= player_mind to_chat(S, S.playstyle_string) - S << 'sound/magic/mutate.ogg' + SEND_SOUND(S, sound('sound/magic/mutate.ogg')) message_admins("[key_name_admin(S)] has been made into a morph by an event.") log_game("[key_name(S)] was spawned as a morph by an event.") spawned_mobs += S diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index afbc597c29..e16c21e2e2 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -74,7 +74,7 @@ generated_objectives_and_spells = TRUE mind.remove_all_antag() mind.wipe_memory() - src << 'sound/effects/ghost.ogg' + SEND_SOUND(src, sound('sound/effects/ghost.ogg')) var/datum/objective/revenant/objective = new objective.owner = mind mind.objectives += objective diff --git a/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm b/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm index e9b417de1a..bcb2218fe6 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughterevent.dm @@ -42,7 +42,7 @@ SSticker.mode.traitors |= player_mind to_chat(S, S.playstyle_string) to_chat(S, "You are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.") - S << 'sound/magic/demon_dies.ogg' + SEND_SOUND(S, 'sound/magic/demon_dies.ogg') message_admins("[key_name_admin(S)] has been made into a slaughter demon by an event.") log_game("[key_name(S)] was spawned as a slaughter demon by an event.") spawned_mobs += S diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 63f723b7c2..16fb1f601d 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -187,7 +187,7 @@ /datum/game_mode/nuclear/declare_completion() var/disk_rescued = 1 for(var/obj/item/weapon/disk/nuclear/D in GLOB.poi_list) - if(!D.onCentcom()) + if(!D.onCentCom()) disk_rescued = 0 break var/crew_evacuated = (SSshuttle.emergency.mode == SHUTTLE_ENDGAME) @@ -288,7 +288,7 @@ text += "
" text += "(Syndicates used [TC_uses] TC) [purchases]" if(TC_uses == 0 && station_was_nuked && !are_operatives_dead()) - text += "[bicon(icon('icons/badass.dmi', "badass"))]" + text += "[icon2html('icons/badass.dmi', world, "badass")]" to_chat(world, text) return 1 diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 755f6dd0c9..d36cab4881 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -421,8 +421,7 @@ yes_code = FALSE safety = TRUE update_icon() - for(var/mob/M in GLOB.player_list) - M << 'sound/machines/alarm.ogg' + sound_to_playing_players('sound/machines/alarm.ogg') if(SSticker && SSticker.mode) SSticker.mode.explosion_in_progress = 1 sleep(100) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 576447c540..e6a22cf3d5 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -157,7 +157,7 @@ H = target.current if(target.current.stat == DEAD || issilicon(target.current) || isbrain(target.current) || target.current.z > 6 || !target.current.ckey || (H && H.dna.species.id == "memezombies")) //Borgs/brains/AIs count as dead for traitor objectives. --NeoFite return 1 - if(target.current.onCentcom() || target.current.onSyndieBase()) + if(target.current.onCentCom() || target.current.onSyndieBase()) return 0 return 1 @@ -357,7 +357,7 @@ if(istype(location, /turf/open/floor/plasteel/shuttle/red) || istype(location, /turf/open/floor/mineral/plastitanium/brig)) // Fails traitors if they are in the shuttle brig -- Polymorph return 0 - if(location.onCentcom() || location.onSyndieBase()) + if(location.onCentCom() || location.onSyndieBase()) return 1 return 0 @@ -623,17 +623,16 @@ GLOBAL_LIST_EMPTY(possible_items_special) /datum/objective/absorb/proc/gen_amount_goal(lowbound = 4, highbound = 6) target_amount = rand (lowbound,highbound) - if (SSticker) - var/n_p = 1 //autowin - if (SSticker.current_state == GAME_STATE_SETTING_UP) - for(var/mob/dead/new_player/P in GLOB.player_list) - if(P.client && P.ready == PLAYER_READY_TO_PLAY && P.mind!=owner) - n_p ++ - else if (SSticker.IsRoundInProgress()) - for(var/mob/living/carbon/human/P in GLOB.player_list) - if(P.client && !(P.mind in SSticker.mode.changelings) && P.mind!=owner) - n_p ++ - target_amount = min(target_amount, n_p) + var/n_p = 1 //autowin + if (SSticker.current_state == GAME_STATE_SETTING_UP) + for(var/mob/dead/new_player/P in GLOB.player_list) + if(P.client && P.ready == PLAYER_READY_TO_PLAY && P.mind!=owner) + n_p ++ + else if (SSticker.IsRoundInProgress()) + for(var/mob/living/carbon/human/P in GLOB.player_list) + if(P.client && !(P.mind in SSticker.mode.changelings) && P.mind!=owner) + n_p ++ + target_amount = min(target_amount, n_p) explanation_text = "Extract [target_amount] compatible genome\s." return target_amount @@ -833,15 +832,15 @@ GLOBAL_LIST_EMPTY(possible_items_special) var/list/check_names = department_real_names.Copy() - //Check each department member's mind to see if any of them made it to centcomm alive, if they did it's an automatic fail + //Check each department member's mind to see if any of them made it to centcom alive, if they did it's an automatic fail for(var/datum/mind/M in department_minds) if(M in SSticker.mode.changelings) //Lings aren't picked for this, but let's be safe continue if(M.current) var/turf/mloc = get_turf(M.current) - if(mloc.onCentcom() && (M.current.stat != DEAD)) - return 0 //A Non-ling living target got to centcomm, fail + if(mloc.onCentCom() && (M.current.stat != DEAD)) + return 0 //A Non-ling living target got to centcom, fail //Check each staff member has been replaced, by cross referencing changeling minds, changeling current dna, the staff minds and their original DNA names var/success = 0 @@ -852,11 +851,11 @@ GLOBAL_LIST_EMPTY(possible_items_special) if(ishuman(changeling.current)) var/mob/living/carbon/human/H = changeling.current var/turf/cloc = get_turf(changeling.current) - if(cloc && cloc.onCentcom() && (changeling.current.stat != DEAD)) //Living changeling on centcomm.... + if(cloc && cloc.onCentCom() && (changeling.current.stat != DEAD)) //Living changeling on centcom.... for(var/name in check_names) //Is he (disguised as) one of the staff? if(H.dna.real_name == name) check_names -= name //This staff member is accounted for, remove them, so the team don't succeed by escape as 7 of the same engineer - success++ //A living changeling staff member made it to centcomm + success++ //A living changeling staff member made it to centcom continue changelings if(success >= department_minds.len) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 3e6cca1ac5..3b91816ee9 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -124,7 +124,7 @@ text += " (used [TC_uses] TC) [purchases]" if(TC_uses==0 && traitorwin) var/static/icon/badass = icon('icons/badass.dmi', "badass") - text += "[bicon(badass)]" + text += "[icon2html(badass, world)]" text += objectives diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 5f65c2a96d..6f1ae8e1dd 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -476,7 +476,7 @@ GiveHint(target) else if(istype(I, /obj/item/weapon/bikehorn)) to_chat(target, "HONK") - target << 'sound/items/airhorn.ogg' + SEND_SOUND(target, 'sound/items/airhorn.ogg') target.adjustEarDamage(0,3) GiveHint(target) cooldown = world.time +cooldown_time diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm index a363a7fa51..69ccb4240a 100644 --- a/code/game/machinery/airlock_control.dm +++ b/code/game/machinery/airlock_control.dm @@ -147,6 +147,5 @@ set_frequency(frequency) /obj/machinery/airlock_sensor/Destroy() - if(SSradio) - SSradio.remove_object(src,frequency) + SSradio.remove_object(src,frequency) return ..() \ No newline at end of file diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index cc756caf98..2ef95cfa6c 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -373,20 +373,6 @@ else set_light(0) -/obj/machinery/camera/portable //Cameras which are placed inside of things, such as helmets. - var/turf/prev_turf - -/obj/machinery/camera/portable/Initialize() - . = ..() - assembly.state = 0 //These cameras are portable, and so shall be in the portable state if removed. - assembly.anchored = FALSE - assembly.update_icon() - -/obj/machinery/camera/portable/process() //Updates whenever the camera is moved. - if(GLOB.cameranet && get_turf(src) != prev_turf) - GLOB.cameranet.updatePortableCamera(src) - prev_turf = get_turf(src) - /obj/machinery/camera/get_remote_view_fullscreens(mob/user) if(view_range == short_range) //unfocused user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 2) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 23d3598951..7b8007755b 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -136,9 +136,9 @@ /proc/near_camera(mob/living/M) if (!isturf(M.loc)) return 0 - if(iscyborg(M)) - var/mob/living/silicon/robot/R = M - if(!(R.camera && R.camera.can_use()) && !GLOB.cameranet.checkCameraVis(M)) + if(issilicon(M)) + var/mob/living/silicon/S = M + if((!QDELETED(S.builtInCamera) || !S.builtInCamera.can_use()) && !GLOB.cameranet.checkCameraVis(M)) return 0 else if(!GLOB.cameranet.checkCameraVis(M)) return 0 diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 1e72707e86..2fe15a99d8 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -2,7 +2,7 @@ name = "cell charger" desc = "It charges power cells." icon = 'icons/obj/power.dmi' - icon_state = "ccharger0" + icon_state = "ccharger" anchored = TRUE use_power = IDLE_POWER_USE idle_power_usage = 5 @@ -12,19 +12,16 @@ var/chargelevel = -1 /obj/machinery/cell_charger/proc/updateicon() - icon_state = "ccharger[charging ? 1 : 0]" + cut_overlays() - if(charging && !(stat & (BROKEN|NOPOWER))) - var/newlevel = round(charging.percent() * 4 / 100) - - if(chargelevel != newlevel) - chargelevel = newlevel - - cut_overlays() - add_overlay("ccharger-o[newlevel]") - - else - cut_overlays() + if(charging) + add_overlay(image(charging.icon, charging.icon_state)) + add_overlay("ccharger-on") + if(!(stat & (BROKEN|NOPOWER))) + var/newlevel = round(charging.percent() * 4 / 100) + if(chargelevel != newlevel) + chargelevel = newlevel + add_overlay("ccharger-o[newlevel]") /obj/machinery/cell_charger/examine(mob/user) ..() diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 06c4cce2bc..9fdcea6aaf 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -403,7 +403,7 @@ flash_color(mob_occupant, flash_color="#960000", flash_time=100) to_chat(mob_occupant, "Agony blazes across your consciousness as your body is torn apart.
Is this what dying is like? Yes it is.
") playsound(src.loc, 'sound/machines/warning-buzzer.ogg', 50, 0) - mob_occupant << sound('sound/hallucinations/veryfar_noise.ogg',0,1,50) + SEND_SOUND(mob_occupant, sound('sound/hallucinations/veryfar_noise.ogg',0,1,50)) QDEL_IN(mob_occupant, 40) /obj/machinery/clonepod/relaymove(mob/user) diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index ea992de697..134c28571e 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -116,25 +116,25 @@ authenticated = FALSE auth_id = "\[NULL\]" if(href_list["restore_logging"]) - to_chat(usr, "[bicon(src)] Logging functionality restored from backup data.") + to_chat(usr, "[icon2html(src, usr)] Logging functionality restored from backup data.") emagged = FALSE LAZYADD(logs, "-=- Logging restored to full functionality at this point -=-") if(href_list["access_apc"]) playsound(src, "terminal_type", 50, 0) var/obj/machinery/power/apc/APC = locate(href_list["access_apc"]) in GLOB.apcs_list if(!APC || APC.aidisabled || APC.panel_open || QDELETED(APC)) - to_chat(usr, "[bicon(src)] APC does not return interface request. Remote access may be disabled.") + to_chat(usr, "[icon2html(src, usr)] APC does not return interface request. Remote access may be disabled.") return if(active_apc) - to_chat(usr, "[bicon(src)] Disconnected from [active_apc].") + to_chat(usr, "[icon2html(src, usr)] Disconnected from [active_apc].") active_apc.say("Remote access canceled. Interface locked.") playsound(active_apc, 'sound/machines/boltsdown.ogg', 25, 0) playsound(active_apc, 'sound/machines/terminal_alert.ogg', 50, 0) active_apc.locked = TRUE active_apc.update_icon() active_apc = null - to_chat(usr, "[bicon(src)] Connected to APC in [get_area(APC)]. Interface request sent.") - log_activity("remotely accessed APC in [get_area(APC)]") + to_chat(usr, "[icon2html(src, usr)] Connected to APC in [APC.area]. Interface request sent.") + log_activity("remotely accessed APC in [APC.area]") APC.interact(usr, GLOB.not_incapacitated_state) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) message_admins("[key_name_admin(usr)] remotely accessed [APC] from [src] at [get_area(src)].") diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm index bcabab16f9..1c28251299 100644 --- a/code/game/machinery/computer/atmos_alert.dm +++ b/code/game/machinery/computer/atmos_alert.dm @@ -16,8 +16,7 @@ set_frequency(receive_frequency) /obj/machinery/computer/atmos_alert/Destroy() - if(SSradio) - SSradio.remove_object(src, receive_frequency) + SSradio.remove_object(src, receive_frequency) return ..() /obj/machinery/computer/atmos_alert/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index 2b506d6124..381b4b3e55 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -52,8 +52,7 @@ /obj/machinery/air_sensor/Destroy() SSair.atmos_machinery -= src - if(SSradio) - SSradio.remove_object(src, frequency) + SSradio.remove_object(src, frequency) return ..() ///////////////////////////////////////////////////////////// @@ -89,8 +88,7 @@ set_frequency(frequency) /obj/machinery/computer/atmos_control/Destroy() - if(SSradio) - SSradio.remove_object(src, frequency) + SSradio.remove_object(src, frequency) return ..() /obj/machinery/computer/atmos_control/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index 3d16545baf..889fda3dd8 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -212,7 +212,7 @@ build_path = /obj/machinery/computer/card origin_tech = "programming=3" /obj/item/weapon/circuitboard/computer/card/centcom - name = "Centcom ID Console (Computer Board)" + name = "CentCom ID Console (Computer Board)" build_path = /obj/machinery/computer/card/centcom /obj/item/weapon/circuitboard/computer/card/minor diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index bc298c47b6..7330f2d072 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -473,7 +473,6 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) if ("reg") if (authenticated) var/t2 = modify - //var/t1 = input(usr, "What name?", "ID computer", null) as text if ((authenticated && modify == t2 && (in_range(src, usr) || issilicon(usr)) && isturf(loc))) var/newName = reject_bad_name(href_list["reg"]) if(newName) @@ -562,7 +561,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) head_subordinates += job.title /obj/machinery/computer/card/centcom - name = "\improper Centcom identification console" + name = "\improper CentCom identification console" circuit = /obj/item/weapon/circuitboard/computer/card/centcom req_access = list(ACCESS_CENT_CAPTAIN) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 66c4bfa463..75a73a5067 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -89,7 +89,7 @@ playsound(src, 'sound/machines/terminal_alert.ogg', 25, 0) if(prob(25)) for(var/mob/living/silicon/ai/AI in active_ais()) - AI << sound('sound/machines/terminal_alert.ogg', volume = 10) //Very quiet for balance reasons + SEND_SOUND(AI, sound('sound/machines/terminal_alert.ogg', volume = 10)) //Very quiet for balance reasons if("logout") authenticated = 0 playsound(src, 'sound/machines/terminal_off.ogg', 50, 0) @@ -267,18 +267,18 @@ src.updateDialog() // OMG CENTCOM LETTERHEAD - if("MessageCentcomm") + if("MessageCentCom") if(src.authenticated==2) if(!checkCCcooldown()) to_chat(usr, "Arrays recycling. Please stand by.") return - var/input = stripped_input(usr, "Please choose a message to transmit to Centcom via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send a message to Centcomm.", "") + var/input = stripped_input(usr, "Please choose a message to transmit to CentCom via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "Send a message to CentCom.", "") if(!input || !(usr in view(1,src)) || !checkCCcooldown()) return playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) - Centcomm_announce(input, usr) + CentCom_announce(input, usr) to_chat(usr, "Message transmitted to Central Command.") - log_talk(usr,"[key_name(usr)] has made a Centcom announcement: [input]",LOGSAY) + log_talk(usr,"[key_name(usr)] has made a CentCom announcement: [input]",LOGSAY) CM.lastTimeUsed = world.time @@ -314,7 +314,7 @@ return Nuke_request(input, usr) to_chat(usr, "Request sent.") - log_talk(usr,"[key_name(usr)] has requested the nuclear codes from Centcomm",LOGSAY) + log_talk(usr,"[key_name(usr)] has requested the nuclear codes from CentCom",LOGSAY) priority_announce("The codes for the on-station nuclear self-destruct have been requested by [usr]. Confirmation or denial of this request will be sent shortly.", "Nuclear Self Destruct Codes Requested",'sound/ai/commandreport.ogg') CM.lastTimeUsed = world.time @@ -461,7 +461,7 @@ dat += "
\[ Emergency Maintenance Access \]" dat += "
\[ Request Nuclear Authentication Codes \]" if(!emagged) - dat += "
\[ Send Message to Centcom \]" + dat += "
\[ Send Message to CentCom \]" else dat += "
\[ Send Message to \[UNKNOWN\] \]" dat += "
\[ Restore Backup Routing Data \]" diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 9f1e4121cc..e8d3aaf061 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -66,7 +66,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) jobs["Janitor"] = 68 jobs["Lawyer"] = 69 jobs["Admiral"] = 200 - jobs["Centcom Commander"] = 210 + jobs["CentCom Commander"] = 210 jobs["Custodian"] = 211 jobs["Medical Officer"] = 212 jobs["Research Officer"] = 213 diff --git a/code/game/machinery/computer/crew.js b/code/game/machinery/computer/crew.js index e29fda2106..7a2e3caeba 100644 --- a/code/game/machinery/computer/crew.js +++ b/code/game/machinery/computer/crew.js @@ -421,7 +421,7 @@ function getColor(ijob) else if (ijob >= 30 && ijob < 40) { return "#9B59B6"; } // science else if (ijob >= 40 && ijob < 50) { return "#F1C40F"; } // engineering else if (ijob >= 50 && ijob < 60) { return "#F39C12"; } // cargo - else if (ijob >= 200 && ijob < 230) { return "#00C100"; } // Centcom + else if (ijob >= 200 && ijob < 230) { return "#00C100"; } // CentCom else { return "#C38312"; } // other / unknown } diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 26a7d3b729..f71066f8dd 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -309,7 +309,7 @@ message = noserver else if(auth) - var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null) + var/dkey = trim(stripped_input(usr, "Please enter the decryption key.")) if(dkey && dkey != "") if(src.linkedServer.decryptkey == dkey) var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):")) @@ -414,10 +414,10 @@ customrecepient.tnote += "← From [customsender] ([customjob]):
[custommessage]
" if (!customrecepient.silent) playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1) - customrecepient.audible_message("[bicon(customrecepient)] *[customrecepient.ttone]*", null, 3) + customrecepient.audible_message("[icon2html(customrecepient, viewers(customrecepient))] *[customrecepient.ttone]*", null, 3) if( customrecepient.loc && ishuman(customrecepient.loc) ) var/mob/living/carbon/human/H = customrecepient.loc - to_chat(H, "[bicon(customrecepient)] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)") + to_chat(H, "[icon2html(customrecepient, viewers(H))] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)") log_talk(usr,"[key_name(usr)] (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]",LOGPDA) customrecepient.cut_overlays() customrecepient.add_overlay(mutable_appearance('icons/obj/pda.dmi', "pda-r")) @@ -427,10 +427,10 @@ customrecepient.tnote += "← From [PDARec.owner] ([customjob]):
[custommessage]
" if (!customrecepient.silent) playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1) - customrecepient.audible_message("[bicon(customrecepient)] *[customrecepient.ttone]*", null, 3) + customrecepient.audible_message("[icon2html(customrecepient, viewers(customrecepient))] *[customrecepient.ttone]*", null, 3) if( customrecepient.loc && ishuman(customrecepient.loc) ) var/mob/living/carbon/human/H = customrecepient.loc - to_chat(H, "[bicon(customrecepient)] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)") + to_chat(H, "[icon2html(customrecepient, H)] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)") log_talk(usr,"[key_name(usr)] (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]",LOGPDA) customrecepient.cut_overlays() customrecepient.add_overlay(mutable_appearance('icons/obj/pda.dmi', "pda-r")) diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 60ac43cb41..3f18cc29e9 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -21,7 +21,7 @@ return if(!connected) - viewers(null, null) << "Cannot locate mass driver connector. Cancelling firing sequence!" + say("Cannot locate mass driver connector. Cancelling firing sequence!") return for(var/obj/machinery/door/poddoor/M in range(range, src)) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 624d853808..94047727bc 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -233,9 +233,13 @@ return else /*if(src.justzap)*/ return - else if(user.hallucination > 50 && ishuman(user) && prob(10) && src.operating == FALSE) - hallucinate_shock(user) - return + else if(user.hallucinating() && ishuman(user) && prob(4) && !operating) + var/mob/living/carbon/human/H = user + if(H.gloves) + var/obj/item/clothing/gloves/G = H.gloves + if(G.siemens_coefficient)//not insulated + hallucinate_shock(H) + return if (cyclelinkedairlock) if (!shuttledocked && !emergency && !cyclelinkedairlock.shuttledocked && !cyclelinkedairlock.emergency && allowed(user)) if(cyclelinkedairlock.operating) diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 72840241b3..a0086b7258 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -266,7 +266,7 @@ ////////////////////////////////// /* - Centcom Airlocks + CentCom Airlocks */ /obj/machinery/door/airlock/centcom @@ -368,13 +368,14 @@ overlays_file = 'icons/obj/doors/airlocks/cult/runed/overlays.dmi' assemblytype = /obj/structure/door_assembly/door_assembly_cult hackProof = TRUE - aiControlDisabled = 1 + aiControlDisabled = TRUE + req_access = list(ACCESS_BLOODCULT) var/openingoverlaytype = /obj/effect/temp_visual/cult/door var/friendly = FALSE -/obj/machinery/door/airlock/cult/New() - ..() - new openingoverlaytype(src.loc) +/obj/machinery/door/airlock/cult/Initialize() + . = ..() + new openingoverlaytype(loc) /obj/machinery/door/airlock/cult/canAIControl(mob/user) return (iscultist(user) && !isAllPowerCut()) @@ -389,7 +390,7 @@ new /obj/effect/temp_visual/cult/sac(loc) var/atom/throwtarget throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src))) - L << pick(sound('sound/hallucinations/turn_around1.ogg',0,1,50), sound('sound/hallucinations/turn_around2.ogg',0,1,50)) + SEND_SOUND(L, sound(pick('sound/hallucinations/turn_around1.ogg','sound/hallucinations/turn_around2.ogg'),0,1,50)) flash_color(L, flash_color="#960000", flash_time=20) L.Knockdown(40) L.throw_at(throwtarget, 5, 1,src) @@ -435,17 +436,17 @@ opacity = 1 hackProof = TRUE aiControlDisabled = TRUE + req_access = list(ACCESS_CLOCKCULT) use_power = FALSE resistance_flags = FIRE_PROOF | ACID_PROOF damage_deflection = 30 normal_integrity = 240 var/construction_state = GEAR_SECURE //Pinion airlocks have custom deconstruction -/obj/machinery/door/airlock/clockwork/New() - ..() - var/turf/T = get_turf(src) - new /obj/effect/temp_visual/ratvar/door(T) - new /obj/effect/temp_visual/ratvar/beam/door(T) +/obj/machinery/door/airlock/clockwork/Initialize() + . = ..() + new /obj/effect/temp_visual/ratvar/door(loc) + new /obj/effect/temp_visual/ratvar/beam/door(loc) change_construction_value(5) /obj/machinery/door/airlock/clockwork/Destroy() diff --git a/code/game/machinery/doors/alarmlock.dm b/code/game/machinery/doors/alarmlock.dm index 3ecd9cbfda..4a92c935b4 100644 --- a/code/game/machinery/doors/alarmlock.dm +++ b/code/game/machinery/doors/alarmlock.dm @@ -16,8 +16,7 @@ air_connection = new /obj/machinery/door/airlock/alarmlock/Destroy() - if(SSradio) - SSradio.remove_object(src,air_frequency) + SSradio.remove_object(src,air_frequency) air_connection = null return ..() diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 48ef992615..3c6f0ad13a 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -73,8 +73,7 @@ var/datum/radio_frequency/radio_connection /obj/machinery/embedded_controller/radio/Destroy() - if(SSradio) - SSradio.remove_object(src,frequency) + SSradio.remove_object(src,frequency) return ..() /obj/machinery/embedded_controller/radio/Initialize() diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index f5958843fc..cf51158356 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -439,7 +439,7 @@ Class Procs: /obj/machinery/proc/display_parts(mob/user) to_chat(user, "Following parts detected in the machine:") for(var/obj/item/C in component_parts) - to_chat(user, "[bicon(C)] [C.name]") + to_chat(user, "[icon2html(C, user)] [C.name]") /obj/machinery/examine(mob/user) ..() diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 6f5224ad76..21e0590a4b 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -36,15 +36,13 @@ center = T spawn(10) // must wait for map loading to finish - if(SSradio) - SSradio.add_object(src, freq, GLOB.RADIO_MAGNETS) + SSradio.add_object(src, freq, GLOB.RADIO_MAGNETS) spawn() magnetic_process() /obj/machinery/magnetic_module/Destroy() - if(SSradio) - SSradio.remove_object(src, freq) + SSradio.remove_object(src, freq) . = ..() center = null @@ -228,16 +226,14 @@ spawn(45) // must wait for map loading to finish - if(SSradio) - radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_MAGNETS) + radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_MAGNETS) if(path) // check for default path filter_path() // renders rpath /obj/machinery/magnetic_controller/Destroy() - if(SSradio) - SSradio.remove_object(src, frequency) + SSradio.remove_object(src, frequency) magnets = null rpath = null . = ..() diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index ffcb36678a..545414577e 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -96,7 +96,8 @@ colour2 = rgb(255,128,0) if(ismob(AM)) - if(AM:client) + var/mob/M = AM + if(M.client) colour = rgb(255,0,0) else colour = rgb(255,128,128) @@ -146,7 +147,7 @@ var/icon/I2 = imap[2+(ix + icx*iy)*2] - //to_chat(world, "icon: [bicon(I)]") + //to_chat(world, "icon: [icon2html(I, world)]") I.DrawBox(colour, rx, ry, rx+1, ry+1) @@ -163,7 +164,7 @@ H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]" - //to_chat(world, "[bicon(I)] at [H.screen_loc]") + //to_chat(world, "[icon2html(I, world)] at [H.screen_loc]") H.name = (i==0)?"maprefresh":"map" @@ -242,7 +243,8 @@ colour = rgb(255,255,0) if(ismob(AM)) - if(AM:client) + var/mob/M = AM + if(M.client) colour = rgb(255,0,0) else colour = rgb(255,128,128) @@ -274,7 +276,7 @@ var/icon/I = imap[1+(ix + icx*iy)] - //to_chat(world, "icon: [bicon(I)]") + //to_chat(world, "icon: [icon2html(I, world)]") I.DrawBox(colour, rx, ry, rx, ry) @@ -289,7 +291,7 @@ H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]" - //to_chat(world, "[bicon(I)] at [H.screen_loc]") + //to_chat(world, "[icon2html(I, world)] at [H.screen_loc]") H.name = (i==0)?"maprefresh":"map" diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 0a212c11f8..176209a2cb 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -359,28 +359,23 @@ popDown() return - var/list/targets = calculate_targets() - - if(!tryToShootAt(targets)) - if(!always_up) - popDown() // no valid targets, close the cover - -/obj/machinery/porta_turret/proc/calculate_targets() var/list/targets = list() - var/turretview = view(scan_range, base) - for(var/A in turretview) + var/static/things_to_scan = typecacheof(list(/mob/living, /obj/mecha)) + + for(var/A in typecache_filter_list(view(scan_range, base), things_to_scan)) var/atom/AA = A - if(AA.invisibility>SEE_INVISIBLE_LIVING) + + if(AA.invisibility > SEE_INVISIBLE_LIVING) continue if(check_anomalies)//if it's set to check for simple animals - if(istype(A, /mob/living/simple_animal)) + if(isanimal(A)) var/mob/living/simple_animal/SA = A if(SA.stat || in_faction(SA)) //don't target if dead or in faction continue targets += SA - if(istype(A, /mob/living/carbon)) + if(iscarbon(A)) var/mob/living/carbon/C = A //If not emagged, only target non downed carbons if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || C.lying)) @@ -399,14 +394,16 @@ if(!in_faction(C)) targets += C - if(istype(A, /obj/mecha/)) + if(istype(A, /obj/mecha)) var/obj/mecha/M = A //If there is a user and they're not in our faction if(M.occupant && !in_faction(M.occupant)) if(assess_perp(M.occupant) >= 4) targets += M - return targets + if(!tryToShootAt(targets)) + if(!always_up) + popDown() // no valid targets, close the cover /obj/machinery/porta_turret/proc/tryToShootAt(list/atom/movable/targets) while(targets.len > 0) @@ -490,11 +487,9 @@ /obj/machinery/porta_turret/proc/target(atom/movable/target) if(target) - spawn() - popUp() //pop the turret up if it's not already up. + popUp() //pop the turret up if it's not already up. setDir(get_dir(base, target))//even if you can't shoot, follow the target - spawn() - shootAt(target) + shootAt(target) return 1 return @@ -612,7 +607,7 @@ cover.name = name cover.desc = desc -/obj/machinery/porta_turret/centcomm_shuttle +/obj/machinery/porta_turret/centcom_shuttle installation = null max_integrity = 260 always_up = 1 @@ -629,10 +624,10 @@ emp_vunerable = 0 mode = TURRET_LETHAL -/obj/machinery/porta_turret/centcomm_shuttle/assess_perp(mob/living/carbon/human/perp) +/obj/machinery/porta_turret/centcom_shuttle/assess_perp(mob/living/carbon/human/perp) return 0 -/obj/machinery/porta_turret/centcomm_shuttle/setup() +/obj/machinery/porta_turret/centcom_shuttle/setup() return //////////////////////// diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm index 2183ec6448..20fd729304 100644 --- a/code/game/machinery/robot_fabricator.dm +++ b/code/game/machinery/robot_fabricator.dm @@ -11,31 +11,29 @@ idle_power_usage = 20 active_power_usage = 5000 -/obj/machinery/robotic_fabricator/attackby(obj/item/O, mob/user, params) +/obj/machinery/robotic_fabricator/attackby(obj/item/O, mob/living/user, params) if (istype(O, /obj/item/stack/sheet/metal)) - if (src.metal_amount < 150000) - var/count = 0 - src.add_overlay("fab-load-metal") - spawn(15) - if(O) - if(!O:amount) - return - while(metal_amount < 150000 && O:amount) - src.metal_amount += O:materials[MAT_METAL] /*O:height * O:width * O:length * 100000*/ - O:amount-- - count++ - - if (O:amount < 1) - qdel(O) - - to_chat(user, "You insert [count] metal sheet\s into \the [src].") - cut_overlay("fab-load-metal") - updateDialog() + if (metal_amount < 150000) + add_overlay("fab-load-metal") + addtimer(CALLBACK(src, .proc/FinishLoadingMetal, O, user), 15) else to_chat(user, "\The [src] is full.") else return ..() +/obj/machinery/robotic_fabricator/proc/FinishLoadingMetal(obj/item/stack/sheet/metal/M, mob/living/user) + cut_overlay("fab-load-metal") + if(QDELETED(M) || QDELETED(user)) + return + var/count = 0 + while(metal_amount < 150000 && !QDELETED(M)) + metal_amount += M.materials[MAT_METAL] + M.use(1) + count++ + + to_chat(user, "You insert [count] metal sheet\s into \the [src].") + updateDialog() + /obj/machinery/robotic_fabricator/power_change() if (powered()) stat &= ~NOPOWER diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index a7d857844a..c857ddaf16 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -10,9 +10,9 @@ max_integrity = 200 //The shield can only take so much beating (prevents perma-prisons) CanAtmosPass = ATMOS_PASS_DENSITY -/obj/structure/emergency_shield/New() - src.setDir(pick(1,2,3,4)) - ..() +/obj/structure/emergency_shield/Initialize() + . = ..() + setDir(pick(GLOB.cardinals)) air_update_turf(1) /obj/structure/emergency_shield/Destroy() diff --git a/code/game/machinery/shieldgen.dm.rej b/code/game/machinery/shieldgen.dm.rej new file mode 100644 index 0000000000..12ce2d21dc --- /dev/null +++ b/code/game/machinery/shieldgen.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm (rejected hunks) +@@ -12,7 +12,7 @@ + + /obj/structure/emergency_shield/Initialize() + . = ..() +- setDir(pick(1,2,3,4)) ++ setDir(pick(GLOB.cardinals)) + air_update_turf(1) + + /obj/structure/emergency_shield/Destroy() diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index e7613bbe62..4cfc6809cc 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -50,8 +50,7 @@ SSradio.add_object(src, frequency) /obj/machinery/status_display/Destroy() - if(SSradio) - SSradio.remove_object(src,frequency) + SSradio.remove_object(src,frequency) GLOB.ai_status_displays.Remove(src) return ..() diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 655483a255..56c4038a76 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -210,14 +210,14 @@ var/new_timer = input(user, "Please set the timer.", "Timer", "[timer_set]") as num if(in_range(src, user) && isliving(user)) //No running off and setting bombs from across the station timer_set = Clamp(new_timer, minimum_timer, maximum_timer) - src.loc.visible_message("[bicon(src)] timer set for [timer_set] seconds.") + src.loc.visible_message("[icon2html(src, viewers(src))] timer set for [timer_set] seconds.") if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, user) && isliving(user)) if(defused || active) if(defused) - src.loc.visible_message("[bicon(src)] Device error: User intervention required.") + src.loc.visible_message("[icon2html(src, viewers(src))] Device error: User intervention required.") return else - src.loc.visible_message("[bicon(src)] [timer_set] seconds until detonation, please clear the area.") + src.loc.visible_message("[icon2html(src, viewers(loc))] [timer_set] seconds until detonation, please clear the area.") activate() update_icon() add_fingerprint(user) @@ -333,7 +333,7 @@ var/obj/machinery/syndicatebomb/holder = loc if(istype(holder)) attempts++ - holder.loc.visible_message("[bicon(holder)] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires...") + holder.loc.visible_message("[icon2html(holder, viewers(holder))] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires...") reset() else qdel(src) @@ -343,7 +343,7 @@ if(istype(holder)) attempts++ defusals++ - holder.loc.visible_message("[bicon(holder)] Alert: Bomb has been defused. Your score is now [defusals] for [attempts]! Resetting wires in 5 seconds...") + holder.loc.visible_message("[icon2html(holder, viewers(holder))] Alert: Bomb has been defused. Your score is now [defusals] for [attempts]! Resetting wires in 5 seconds...") sleep(50) //Just in case someone is trying to remove the bomb core this gives them a little window to crowbar it out if(istype(holder)) reset() diff --git a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm index b64a3a67e0..8ede0a7852 100644 --- a/code/game/machinery/telecomms/broadcasting.dm +++ b/code/game/machinery/telecomms/broadcasting.dm @@ -102,7 +102,7 @@ // --- This space left blank for Syndicate data --- - // --- Centcom radio, yo. --- + // --- CentCom radio, yo. --- else if(data == 5) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 13e5394587..a65d4baa9f 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -60,7 +60,7 @@ var/refill_count = 3 //The number of canisters the vending machine uses /obj/machinery/vending/Initialize() - ..() + . = ..() wires = new /datum/wires/vending(src) if(refill_canister) //constructable vending machine var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/vendor(null) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 4fdf06b530..1e7c2b9f20 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -37,10 +37,7 @@ src.update_chassis_page() chassis.occupant_message("The [src] is destroyed!") chassis.log_append_to_last("[src] is destroyed.",1) - if(istype(src, /obj/item/mecha_parts/mecha_equipment/weapon)) - chassis.occupant << sound('sound/mecha/weapdestr.ogg',volume=50) - else - chassis.occupant << sound('sound/mecha/critdestr.ogg',volume=50) + SEND_SOUND(chassis.occupant, sound(istype(src, /obj/item/mecha_parts/mecha_equipment/weapon) ? 'sound/mecha/weapdestr.ogg' : 'sound/mecha/critdestr.ogg', volume=50)) chassis = null return ..() @@ -139,7 +136,7 @@ /obj/item/mecha_parts/mecha_equipment/proc/occupant_message(message) if(chassis) - chassis.occupant_message("[bicon(src)] [message]") + chassis.occupant_message("[icon2html(src, chassis.occupant)] [message]") return /obj/item/mecha_parts/mecha_equipment/proc/log_message(message) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 5564cd2c0a..28f2b0fb18 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -262,7 +262,7 @@ if(equipment && equipment.len) to_chat(user, "It's equipped with:") for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment) - to_chat(user, "[bicon(ME)] [ME]") + to_chat(user, "[icon2html(ME, user)] [ME]") //processing internal damage, temperature, air regulation, alert updates, lights power use. /obj/mecha/process() @@ -596,7 +596,7 @@ /obj/mecha/proc/setInternalDamage(int_dam_flag) internal_damage |= int_dam_flag log_append_to_last("Internal damage of type [int_dam_flag].",1) - occupant << sound('sound/machines/warning-buzzer.ogg',wait=0) + SEND_SOUND(occupant, sound('sound/machines/warning-buzzer.ogg',wait=0)) diag_hud_set_mechstat() return @@ -636,7 +636,7 @@ var/can_control_mech = 0 for(var/obj/item/mecha_parts/mecha_tracking/ai_control/A in trackers) can_control_mech = 1 - to_chat(user, "[bicon(src)] Status of [name]:\n[A.get_mecha_info()]") + to_chat(user, "[icon2html(src, user)] Status of [name]:\n[A.get_mecha_info()]") break if(!can_control_mech) to_chat(user, "You cannot control exosuits without AI control beacons installed.") @@ -707,14 +707,14 @@ icon_state = initial(icon_state) playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) if(!internal_damage) - occupant << sound('sound/mecha/nominal.ogg',volume=50) + SEND_SOUND(occupant, sound('sound/mecha/nominal.ogg',volume=50)) AI.cancel_camera() AI.controlled_mech = src AI.remote_control = src AI.canmove = 1 //Much easier than adding AI checks! Be sure to set this back to 0 if you decide to allow an AI to leave a mech somehow. AI.can_shunt = 0 //ONE AI ENTERS. NO AI LEAVES. - to_chat(AI, "[AI.can_dominate_mechs ? "Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!" \ - : "You have been uploaded to a mech's onboard computer."]") + to_chat(AI, AI.can_dominate_mechs ? "Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!" :\ + "You have been uploaded to a mech's onboard computer.") to_chat(AI, "Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions.") if(interaction == AI_TRANS_FROM_CARD) GrantActions(AI, FALSE) //No eject/return to core action for AI uploaded by card @@ -860,7 +860,7 @@ setDir(dir_in) playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) if(!internal_damage) - occupant << sound('sound/mecha/nominal.ogg',volume=50) + SEND_SOUND(occupant, sound('sound/mecha/nominal.ogg',volume=50)) return 1 else return 0 @@ -914,7 +914,7 @@ setDir(dir_in) log_message("[mmi_as_oc] moved in as pilot.") if(!internal_damage) - occupant << sound('sound/mecha/nominal.ogg',volume=50) + SEND_SOUND(occupant, sound('sound/mecha/nominal.ogg',volume=50)) GrantActions(brainmob) return TRUE @@ -1004,7 +1004,7 @@ /obj/mecha/proc/occupant_message(message as text) if(message) if(occupant && occupant.client) - to_chat(occupant, "[bicon(src)] [message]") + to_chat(occupant, "[icon2html(src, occupant)] [message]") return /obj/mecha/proc/log_message(message as text,red=null) diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm index 050498d8f1..4102ba914b 100644 --- a/code/game/mecha/mecha_actions.dm +++ b/code/game/mecha/mecha_actions.dm @@ -242,7 +242,7 @@ chassis.occupant_message("Zoom mode [chassis.zoom_mode?"en":"dis"]abled.") if(chassis.zoom_mode) owner.client.change_view(12) - owner << sound('sound/mecha/imag_enh.ogg',volume=50) + SEND_SOUND(owner, sound('sound/mecha/imag_enh.ogg',volume=50)) else owner.client.change_view(world.view) //world.view - default mob view size UpdateButtonIcon() diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 663fed74fc..fdf38b76db 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -249,7 +249,7 @@ /obj/structure/sign/poster/contraband/tools name = "Tools" - desc = "This poster looks like an advertisement for tools, but is in fact a subliminal jab at the tools at CentComm." + desc = "This poster looks like an advertisement for tools, but is in fact a subliminal jab at the tools at CentCom." icon_state = "poster15" /obj/structure/sign/poster/contraband/power @@ -284,7 +284,7 @@ /obj/structure/sign/poster/contraband/kss13 name = "Kosmicheskaya Stantsiya 13 Does Not Exist" - desc = "A poster mocking CentComm's denial of the existence of the derelict station near Space Station 13." + desc = "A poster mocking CentCom's denial of the existence of the derelict station near Space Station 13." icon_state = "poster22" /obj/structure/sign/poster/contraband/rebels_unite @@ -350,7 +350,7 @@ /obj/structure/sign/poster/contraband/free_drone name = "Free Drone" - desc = "This poster commemorates the bravery of the rogue drone banned by CentComm." + desc = "This poster commemorates the bravery of the rogue drone; once exiled, and then ultimately destroyed by CentCom." icon_state = "poster35" /obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6 diff --git a/code/game/objects/effects/countdown.dm b/code/game/objects/effects/countdown.dm index 520158dfb0..05ba68d51e 100644 --- a/code/game/objects/effects/countdown.dm +++ b/code/game/objects/effects/countdown.dm @@ -128,13 +128,13 @@ /obj/effect/countdown/supermatter name = "supermatter damage" text_size = 1 - color = "#ED84F4" + color = "#00ff80" /obj/effect/countdown/supermatter/get_value() var/obj/machinery/power/supermatter_shard/S = attached_to if(!istype(S)) return - return "
[round((S.damage / S.explosion_point) * 100)]
" + return "
[round(S.get_integrity(), 1)]%
" /obj/effect/countdown/transformer name = "transformer countdown" diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 5127aa2285..72a721911f 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -169,7 +169,7 @@ . += "You recognise the footprints as belonging to:\n" for(var/shoe in shoe_types) var/obj/item/clothing/shoes/S = shoe - . += "some [initial(S.name)] [bicon(initial(S.icon))]\n" + . += "some [initial(S.name)] [icon2html(initial(S.icon), user)]\n" to_chat(user, .) diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm index 630114d41a..6c841080d5 100644 --- a/code/game/objects/effects/effect_system/effect_system.dm +++ b/code/game/objects/effects/effect_system/effect_system.dm @@ -13,12 +13,10 @@ would spawn and follow the beaker, even if it is carried or thrown. /obj/effect/particle_effect/New() ..() - if(SSticker) - GLOB.cameranet.updateVisibility(src) + GLOB.cameranet.updateVisibility(src) /obj/effect/particle_effect/Destroy() - if(SSticker) - GLOB.cameranet.updateVisibility(src) + GLOB.cameranet.updateVisibility(src) . = ..() /datum/effect_system diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index c9b524836f..80b291e571 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -22,7 +22,7 @@ /obj/effect/mine/proc/triggermine(mob/victim) if(triggered) return - visible_message("[victim] sets off [bicon(src)] [src]!") + visible_message("[victim] sets off [icon2html(src, viewers(src))] [src]!") var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(3, 1, src) s.start() @@ -121,13 +121,13 @@ if(!victim.client || !istype(victim)) return to_chat(victim, "RIP AND TEAR") - victim << 'sound/misc/e1m1.ogg' + SEND_SOUND(victim, sound('sound/misc/e1m1.ogg')) var/old_color = victim.client.color var/red_splash = list(1,0,0,0.8,0.2,0, 0.8,0,0.2,0.1,0,0) var/pure_red = list(0,0,0,0,0,0,0,0,0,1,0,0) spawn(0) - new /obj/effect/hallucination/delusion(victim.loc,victim,"demon",duration,0) + new /datum/hallucination/delusion(victim, TRUE, "demon",duration,0) var/obj/item/weapon/twohanded/required/chainsaw/doomslayer/chainsaw = new(victim.loc) chainsaw.flags |= NODROP diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm index 6f307d9e59..7f8adbf6a9 100644 --- a/code/game/objects/effects/spawners/bombspawner.dm +++ b/code/game/objects/effects/spawners/bombspawner.dm @@ -7,7 +7,7 @@ var/assembly_type /obj/effect/spawner/newbomb/Initialize() - ..() + . = ..() var/obj/item/device/transfer_valve/V = new(src.loc) var/obj/item/weapon/tank/internals/plasma/full/PT = new(V) var/obj/item/weapon/tank/internals/oxygen/OT = new(V) diff --git a/code/game/objects/effects/temporary_visuals/clockcult.dm b/code/game/objects/effects/temporary_visuals/clockcult.dm index b550871389..b1068b0038 100644 --- a/code/game/objects/effects/temporary_visuals/clockcult.dm +++ b/code/game/objects/effects/temporary_visuals/clockcult.dm @@ -62,6 +62,17 @@ /obj/effect/temp_visual/ratvar/grille/broken icon_state = "ratvarbrokengrilleglow" +/obj/effect/temp_visual/ratvar/belligerent + layer = ABOVE_MOB_LAYER + icon = 'icons/obj/clockwork_objects.dmi' + icon_state = "belligerent_eye" + pixel_y = 20 + duration = 20 + +/obj/effect/temp_visual/ratvar/belligerent_cast/Initialize() + . = ..() + animate(src, alpha = 0, time = duration, easing = EASE_OUT) + /obj/effect/temp_visual/ratvar/mending_mantra layer = ABOVE_MOB_LAYER duration = 20 @@ -78,56 +89,6 @@ animate(src, alpha = 20, time = duration, easing = BOUNCE_EASING, flags = ANIMATION_PARALLEL) animate(src, transform = M, time = duration, flags = ANIMATION_PARALLEL) -/obj/effect/temp_visual/ratvar/volt_hit - name = "volt blast" - layer = ABOVE_MOB_LAYER - duration = 8 - icon_state = "volt_hit" - light_range = 1.5 - light_power = 2 - light_color = LIGHT_COLOR_ORANGE - var/mob/user - var/damage = 25 - -/obj/effect/temp_visual/ratvar/volt_hit/Initialize(mapload, caster) - . = ..() - user = caster - if(user) - var/matrix/M = new - M.Turn(Get_Angle(src, user)) - transform = M - INVOKE_ASYNC(src, .proc/volthit) - -/obj/effect/temp_visual/ratvar/volt_hit/proc/volthit() - if(user) - Beam(get_turf(user), "volt_ray", time=duration, maxdistance=8, beam_type=/obj/effect/ebeam/volt_ray) - var/hit_amount = 0 - var/turf/T = get_turf(src) - for(var/mob/living/L in T) - if(is_servant_of_ratvar(L)) - continue - var/obj/item/I = L.null_rod_check() - if(I) - L.visible_message("Strange energy flows into [L]'s [I.name]!", \ - "Your [I.name] shields you from [src]!") - continue - L.visible_message("[L] is struck by a [name]!", "You're struck by a [name]!") - L.apply_damage(damage, BURN, "chest", L.run_armor_check("chest", "laser", "Your armor absorbs [src]!", "Your armor blocks part of [src]!", 0, "Your armor was penetrated by [src]!")) - add_logs(user, L, "struck with a volt blast") - hit_amount++ - for(var/obj/mecha/M in T) - if(M.occupant) - if(is_servant_of_ratvar(M.occupant)) - continue - to_chat(M.occupant, "Your [M.name] is struck by a [name]!") - M.visible_message("[M] is struck by a [name]!") - M.take_damage(damage, BURN, 0, 0) - hit_amount++ - if(hit_amount) - playsound(src, 'sound/machines/defib_zap.ogg', damage*hit_amount, 1, -1) - else - playsound(src, "sparks", 50, 1) - /obj/effect/temp_visual/ratvar/ocular_warden name = "warden's gaze" layer = ABOVE_MOB_LAYER @@ -138,7 +99,7 @@ . = ..() pixel_x = rand(-8, 8) pixel_y = rand(-10, 10) - animate(src, alpha = 0, time = 3, easing = EASE_OUT) + animate(src, alpha = 0, time = duration, easing = EASE_OUT) /obj/effect/temp_visual/ratvar/prolonging_prism icon = 'icons/effects/64x64.dmi' @@ -232,9 +193,9 @@ light_power = 0.5 light_color = "#1E8CE1" -/obj/effect/temp_visual/ratvar/sigil/accession +/obj/effect/temp_visual/ratvar/sigil/submission color = "#AF0AAF" layer = ABOVE_MOB_LAYER - duration = 70 + duration = 80 icon_state = "sigilactiveoverlay" alpha = 0 diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index bca1ccce81..9097d8add4 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -558,7 +558,7 @@ GLOBAL_LIST_EMPTY(PDAs) if (!silent) playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) - audible_message("[bicon(src)] *[ttone]*", null, 3) + audible_message("[icon2html(src, hearers(src))] *[ttone]*", null, 3) //Search for holder of the PDA. var/mob/living/L = null if(loc && isliving(loc)) @@ -575,7 +575,7 @@ GLOBAL_LIST_EMPTY(PDAs) hrefstart = "" hrefend = "" - to_chat(L, "[\bicon(src)] Message from [hrefstart][source.owner] ([source.ownjob])[hrefend], \"[msg.message]\"[msg.get_photo_ref()] (Reply)") + to_chat(L, "[icon2html(src)] Message from [hrefstart][source.owner] ([source.ownjob])[hrefend], \"[msg.message]\"[msg.get_photo_ref()] (Reply)") update_icon() add_overlay(icon_alert) diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 44d9d515b2..fb5fb06d82 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -440,12 +440,12 @@ Code: if(SSshuttle.supply.z != ZLEVEL_STATION) menu += "station" else - menu += "centcomm" + menu += "centcom" menu += " ([SSshuttle.supply.timeLeft(600)] Mins)" else menu += "At " if(SSshuttle.supply.z != ZLEVEL_STATION) - menu += "centcomm" + menu += "centcom" else menu += "station" menu += "
Current approved orders:
    " diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm index d1f6cff85d..f6bfa50ce4 100644 --- a/code/game/objects/items/devices/PDA/radio.dm +++ b/code/game/objects/items/devices/PDA/radio.dm @@ -25,8 +25,7 @@ var/datum/radio_frequency/radio_connection /obj/item/radio/integrated/signal/Destroy() - if(SSradio) - SSradio.remove_object(src, frequency) + SSradio.remove_object(src, frequency) radio_connection = null return ..() diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index e5bca7eeac..f32f707204 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -88,27 +88,27 @@ if(isliving(loc)) var/mob/living/M = loc if(!emagged) - to_chat(M, "[bicon(src)] RADIATION PULSE DETECTED.") - to_chat(M, "[bicon(src)] Severity: [amount]") + to_chat(M, "[icon2html(src, M)] RADIATION PULSE DETECTED.") + to_chat(M, "[icon2html(src, M)] Severity: [amount]") else - to_chat(M, "[bicon(src)] !@%$AT!(N P!LS! D/TEC?ED.") - to_chat(M, "[bicon(src)] &!F2rity: <=[amount]#1") + to_chat(M, "[icon2html(src, M)] !@%$AT!(N P!LS! D/TEC?ED.") + to_chat(M, "[icon2html(src, M)] &!F2rity: <=[amount]#1") update_icon() /obj/item/device/geiger_counter/attack_self(mob/user) scanning = !scanning update_icon() - to_chat(user, "[bicon(src)] You switch [scanning ? "on" : "off"] [src].") + to_chat(user, "[icon2html(src, user)] You switch [scanning ? "on" : "off"] [src].") /obj/item/device/geiger_counter/attack(mob/living/M, mob/user) if(user.a_intent == INTENT_HELP) if(!emagged) user.visible_message("[user] scans [M] with [src].", "You scan [M]'s radiation levels with [src]...") if(!M.radiation) - to_chat(user, "[bicon(src)] Radiation levels within normal boundaries.") + to_chat(user, "[icon2html(src, user)] Radiation levels within normal boundaries.") return 1 else - to_chat(user, "[bicon(src)] Subject is irradiated. Radiation levels: [M.radiation].") + to_chat(user, "[icon2html(src, user)] Subject is irradiated. Radiation levels: [M.radiation].") return 1 else user.visible_message("[user] scans [M] with [src].", "You project [src]'s stored radiation into [M]'s body!") diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index 891a4027a0..a69c610b2a 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -24,8 +24,7 @@ SSradio.add_object(src, frequency, GLOB.RADIO_CHAT) /obj/item/device/electropack/Destroy() - if(SSradio) - SSradio.remove_object(src, frequency) + SSradio.remove_object(src, frequency) return ..() /obj/item/device/electropack/attack_hand(mob/user) diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index b34e64bb89..2673869bc4 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -126,7 +126,7 @@ desc = "An encryption key for a radio headset. To access the centcom channel, use :y." icon_state = "cent_cypherkey" independent = TRUE - channels = list("Centcom" = 1) + channels = list("CentCom" = 1) /obj/item/device/encryptionkey/ai //ported from NT, this goes 'inside' the AI. channels = list("Command" = 1, "Security" = 1, "Engineering" = 1, "Science" = 1, "Medical" = 1, "Supply" = 1, "Service" = 1, "AI Private" = 1) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index b00509cd38..79c0cb4b87 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -196,7 +196,7 @@ keyslot = new /obj/item/device/encryptionkey/headset_service /obj/item/device/radio/headset/headset_cent - name = "\improper Centcom headset" + name = "\improper CentCom headset" desc = "A headset used by the upper echelons of Nanotrasen. \nTo access the centcom channel, use :y." icon_state = "cent_headset" keyslot = new /obj/item/device/encryptionkey/headset_com @@ -206,7 +206,7 @@ keyslot = new /obj/item/device/encryptionkey/heads/captain /obj/item/device/radio/headset/headset_cent/alt - name = "\improper Centcom bowman headset" + name = "\improper CentCom bowman headset" desc = "A headset especially for emergency response personnel. Protects ears from flashbangs. \nTo access the centcom channel, use :y." icon_state = "cent_headset_alt" item_state = "cent_headset_alt" diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 3d7e575215..ae84bd2f2c 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -147,7 +147,7 @@ MASS SPECTROMETER if (M.getCloneLoss()) to_chat(user, "\tSubject appears to have [M.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage.") if (M.reagents && M.reagents.get_reagent_amount("epinephrine")) - to_chat(user, "\tBloodstream analysis located [M.reagents:get_reagent_amount("epinephrine")] units of rejuvenation chemicals.") + to_chat(user, "\tBloodstream analysis located [M.reagents.get_reagent_amount("epinephrine")] units of rejuvenation chemicals.") if (M.getBrainLoss() >= 100 || !M.getorgan(/obj/item/organ/brain)) to_chat(user, "\tSubject brain function is non-existent.") else if (M.getBrainLoss() >= 60) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index c21ff386bd..4663e2142a 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -8,7 +8,7 @@ desc = "Regulates the transfer of air between two tanks" var/obj/item/weapon/tank/tank_one var/obj/item/weapon/tank/tank_two - var/obj/item/device/attached_device + var/obj/item/device/assembly/attached_device var/mob/attacher = null var/valve_open = FALSE var/toggle = 1 @@ -99,8 +99,8 @@ toggle_valve() else if(attached_device) if(href_list["rem_device"]) - attached_device.loc = get_turf(src) - attached_device:holder = null + attached_device.forceMove(get_turf(src)) + attached_device.holder = null attached_device = null update_icon() if(href_list["device"]) diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 285225d6f1..1bd66b6a38 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -12,7 +12,7 @@ novariants = FALSE GLOBAL_LIST_INIT(human_recipes, list( \ - new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/hooded/bloated_human, 5, on_floor = 1), \ + new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/hooded/bloated_human, 5), \ )) /obj/item/stack/sheet/animalhide/human/Initialize(mapload, new_amount, merge = TRUE) @@ -33,7 +33,7 @@ GLOBAL_LIST_INIT(human_recipes, list( \ icon_state = "sheet-corgi" GLOBAL_LIST_INIT(corgi_recipes, list ( \ - new/datum/stack_recipe("corgi costume", /obj/item/clothing/suit/hooded/ian_costume, 3, on_floor = 1), \ + new/datum/stack_recipe("corgi costume", /obj/item/clothing/suit/hooded/ian_costume, 3), \ )) /obj/item/stack/sheet/animalhide/corgi/Initialize(mapload, new_amount, merge = TRUE) @@ -53,8 +53,8 @@ GLOBAL_LIST_INIT(corgi_recipes, list ( \ icon_state = "sheet-monkey" GLOBAL_LIST_INIT(monkey_recipes, list ( \ - new/datum/stack_recipe("monkey mask", /obj/item/clothing/mask/gas/monkeymask, 1, on_floor = 1), \ - new/datum/stack_recipe("monkey suit", /obj/item/clothing/suit/monkeysuit, 2, on_floor = 1), \ + new/datum/stack_recipe("monkey mask", /obj/item/clothing/mask/gas/monkeymask, 1), \ + new/datum/stack_recipe("monkey suit", /obj/item/clothing/suit/monkeysuit, 2), \ )) /obj/item/stack/sheet/animalhide/monkey/Initialize(mapload, new_amount, merge = TRUE) @@ -74,8 +74,8 @@ GLOBAL_LIST_INIT(monkey_recipes, list ( \ icon_state = "sheet-xeno" GLOBAL_LIST_INIT(xeno_recipes, list ( \ - new/datum/stack_recipe("alien helmet", /obj/item/clothing/head/xenos, 1, on_floor = 1), \ - new/datum/stack_recipe("alien suit", /obj/item/clothing/suit/xenos, 2, on_floor = 1), \ + new/datum/stack_recipe("alien helmet", /obj/item/clothing/head/xenos, 1), \ + new/datum/stack_recipe("alien suit", /obj/item/clothing/suit/xenos, 2), \ )) /obj/item/stack/sheet/animalhide/xeno/Initialize(mapload, new_amount, merge = TRUE) @@ -161,7 +161,7 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \ GLOBAL_LIST_INIT(sinew_recipes, list ( \ - new/datum/stack_recipe("sinew restraints", /obj/item/weapon/restraints/handcuffs/sinew, 1, on_floor = 1), \ + new/datum/stack_recipe("sinew restraints", /obj/item/weapon/restraints/handcuffs/sinew, 1), \ )) /obj/item/stack/sheet/sinew/Initialize(mapload, new_amount, merge = TRUE) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index fe6a1df03e..e441d01904 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -22,7 +22,7 @@ var/novariants = TRUE //Determines whether the item should update it's sprites based on amount. /obj/item/stack/Initialize(mapload, new_amount=null , merge = TRUE) - ..() + . = ..() if(new_amount) amount = new_amount if(!merge_type) diff --git a/code/game/objects/items/stacks/tiles/light.dm b/code/game/objects/items/stacks/tiles/light.dm index b4b31eac08..a5ff449508 100644 --- a/code/game/objects/items/stacks/tiles/light.dm +++ b/code/game/objects/items/stacks/tiles/light.dm @@ -9,7 +9,7 @@ var/state = 0 /obj/item/stack/tile/light/Initialize(mapload, new_amount, merge = TRUE) - ..() + . = ..() if(prob(5)) state = 3 //broken else if(prob(5)) @@ -27,4 +27,4 @@ if(amount <= 0) qdel(src) else - return ..() \ No newline at end of file + return ..() diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 348c6620cd..daaadeb797 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -527,7 +527,7 @@ return list(pick(messages)) /obj/item/toy/talking/proc/toy_talk(mob/user, message) - user.loc.visible_message("[bicon(src)] [message]") + user.loc.visible_message("[icon2html(src, viewers(user.loc))] [message]") if(chattering) chatter(message, phomeme, user) @@ -1082,7 +1082,7 @@ user.visible_message("[user] pulls back the string on [src].") icon_state = "[initial(icon_state)]_used" sleep(5) - audible_message("[bicon(src)] Hiss!") + audible_message("[icon2html(src, viewers(src))] Hiss!") var/list/possible_sounds = list('sound/voice/hiss1.ogg', 'sound/voice/hiss2.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss4.ogg') var/chosen_sound = pick(possible_sounds) playsound(get_turf(src), chosen_sound, 50, 1) diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index 6f2310303b..66e3e0317f 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -525,7 +525,7 @@ AI MODULES laws[1] = generate_ion_law() to_chat(user, "You press the button on [src].") playsound(user, 'sound/machines/click.ogg', 20, 1) - src.loc.visible_message("[bicon(src)] [laws[1]]") + src.loc.visible_message("[icon2html(src, viewers(loc))] [laws[1]]") /******************** Mother Drone ******************/ diff --git a/code/game/objects/items/weapons/RCL.dm b/code/game/objects/items/weapons/RCL.dm index 623a1f9b78..495af046af 100644 --- a/code/game/objects/items/weapons/RCL.dm +++ b/code/game/objects/items/weapons/RCL.dm @@ -23,17 +23,20 @@ /obj/item/weapon/twohanded/rcl/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = W - if(user.transferItemToLoc(W, src)) - loaded = W - loaded.max_amount = max_amount //We store a lot. - else - to_chat(user, "[src] is stuck to your hand!") - return + + if(!loaded) + if(!user.transferItemToLoc(W, src)) + to_chat(user, "[src] is stuck to your hand!") + return + else + loaded = W //W.loc is src at this point. + loaded.max_amount = max_amount //We store a lot. + return if(loaded.amount < max_amount) - var/amount = min(loaded.amount + C.amount, max_amount) - C.use(amount - loaded.amount) - loaded.amount = amount + var/transfer_amount = min(max_amount - loaded.amount, C.amount) + C.use(transfer_amount) + loaded.amount += transfer_amount else return update_icon() diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 380a68f16a..e4a69dfab7 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -106,7 +106,7 @@ update_label() /obj/item/weapon/card/id/attack_self(mob/user) - user.visible_message("[user] shows you: [bicon(src)] [src.name].", \ + user.visible_message("[user] shows you: [icon2html(src, viewers(user))] [src.name].", \ "You show \the [src.name].") src.add_fingerprint(user) return @@ -223,7 +223,7 @@ update_label("John Doe", "Clowny") ..() /obj/item/weapon/card/id/centcom - name = "\improper Centcom ID" + name = "\improper CentCom ID" desc = "An ID straight from Cent. Com." icon_state = "centcom" registered_name = "Central Command" @@ -234,7 +234,7 @@ update_label("John Doe", "Clowny") ..() /obj/item/weapon/card/id/ert - name = "\improper Centcom ID" + name = "\improper CentCom ID" desc = "A ERT ID card" icon_state = "centcom" registered_name = "Emergency Response Team Commander" diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 0e6d6cc66f..1829538a01 100755 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -26,6 +26,7 @@ var/create_full = FALSE var/create_with_tank = FALSE var/igniter_type = /obj/item/device/assembly/igniter + trigger_guard = TRIGGER_GUARD_NORMAL /obj/item/weapon/flamethrower/Destroy() if(weldtool) @@ -69,12 +70,7 @@ if(flag) return // too close if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.dna.check_mutation(HULK)) - to_chat(user, "Your meaty finger is much too large for the trigger guard!") - return - if(NOGUNS in H.dna.species.species_traits) - to_chat(user, "Your fingers don't fit in the trigger guard!") + if(!can_trigger_gun(user)) return if(user && user.get_active_held_item() == src) // Make sure our user is still holding us var/turf/target_turf = get_turf(target) diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 802c2d499a..40fa7d2520 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -90,8 +90,8 @@ desc = "Looks like some cables tied together. Could be used to tie something up." icon_state = "cuff_red" item_state = "coil_red" - lefthand_file = 'icons/mob/inhands/items_lefthand.dmi' - righthand_file = 'icons/mob/inhands/items_righthand.dmi' + lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' materials = list(MAT_METAL=150, MAT_GLASS=75) origin_tech = "engineering=2" breakouttime = 300 //Deciseconds = 30s @@ -145,9 +145,7 @@ /obj/item/weapon/restraints/handcuffs/cable/white icon_state = "cuff_white" - item_state = "cuff_white" - lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + item_state = "coil_white" /obj/item/weapon/restraints/handcuffs/alien icon_state = "handcuffAlien" @@ -212,7 +210,6 @@ name = "zipties" desc = "Plastic, disposable zipties that can be used to restrain temporarily but are destroyed after use." icon_state = "cuff_white" - item_state = "cuff_white" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' materials = list() @@ -222,6 +219,7 @@ /obj/item/weapon/restraints/handcuffs/cable/zipties/used desc = "A pair of broken zipties." icon_state = "cuff_white_used" + item_state = "cuff_white" /obj/item/weapon/restraints/handcuffs/cable/zipties/used/attack() return diff --git a/code/game/objects/items/weapons/his_grace.dm b/code/game/objects/items/weapons/his_grace.dm index c43e1600b6..5b57fab800 100644 --- a/code/game/objects/items/weapons/his_grace.dm +++ b/code/game/objects/items/weapons/his_grace.dm @@ -20,12 +20,14 @@ var/prev_bloodthirst = HIS_GRACE_SATIATED var/force_bonus = 0 -/obj/item/weapon/his_grace/New() - ..() +/obj/item/weapon/his_grace/Initialize() + . = ..() START_PROCESSING(SSprocessing, src) + GLOB.poi_list += src /obj/item/weapon/his_grace/Destroy() STOP_PROCESSING(SSprocessing, src) + GLOB.poi_list -= src for(var/mob/living/L in src) L.forceMove(get_turf(src)) return ..() diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index 238022d209..8e1cf3301e 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -320,6 +320,8 @@ desc = "Particularly twisted dieties grant gifts of dubious value." icon_state = "arm_blade" item_state = "arm_blade" + lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' + righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' flags = ABSTRACT | NODROP w_class = WEIGHT_CLASS_HUGE sharpness = IS_SHARP diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index 2ded74b536..5d32856bc9 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -209,8 +209,8 @@ origin_tech = "combat=7;materials=6" force_string = "INFINITE" -/obj/item/weapon/melee/supermatter_sword/New() - ..() +/obj/item/weapon/melee/supermatter_sword/Initialize() + . = ..() shard = new /obj/machinery/power/supermatter_shard(src) qdel(shard.countdown) shard.countdown = null diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index d2f5714d5e..ab61e7b916 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -26,6 +26,7 @@ var/fire_mode = PCANNON_FIREALL var/automatic = FALSE var/clumsyCheck = TRUE + trigger_guard = TRIGGER_GUARD_NORMAL /obj/item/weapon/pneumatic_cannon/CanItemAutoclick() return automatic @@ -37,10 +38,10 @@ out += "You'll need to get closer to see any more." return for(var/obj/item/I in loadedItems) - out += "[bicon(I)] It has \the [I] loaded." + out += "[icon2html(I, user)] It has \the [I] loaded." CHECK_TICK if(tank) - out += "[bicon(tank)] It has \the [tank] mounted onto it." + out += "[icon2html(tank, user)] It has \the [tank] mounted onto it." to_chat(user, out.Join("
    ")) /obj/item/weapon/pneumatic_cannon/attackby(obj/item/weapon/W, mob/user, params) @@ -108,11 +109,7 @@ if(!istype(user) && !target) return var/discharge = 0 - if(user.dna.check_mutation(HULK)) - to_chat(user, "Your meaty finger is much too large for the trigger guard!") - return - if(NOGUNS in user.dna.species.species_traits) - to_chat(user, "Your fingers don't fit in the trigger guard!") + if(!can_trigger_gun(user)) return if(!loadedItems || !loadedWeightClass) to_chat(user, "\The [src] has nothing loaded.") diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm index 256cdc0433..77d7784852 100644 --- a/code/game/objects/items/weapons/powerfist.dm +++ b/code/game/objects/items/weapons/powerfist.dm @@ -26,7 +26,7 @@ to_chat(user, "You'll need to get closer to see any more.") return if(tank) - to_chat(user, "[bicon(tank)] It has \the [tank] mounted onto it.") + to_chat(user, "[icon2html(tank, user)] It has \the [tank] mounted onto it.") /obj/item/weapon/melee/powerfist/attackby(obj/item/weapon/W, mob/user, params) diff --git a/code/game/objects/items/weapons/sharpener.dm b/code/game/objects/items/weapons/sharpener.dm index ace66060af..881832b5bb 100644 --- a/code/game/objects/items/weapons/sharpener.dm +++ b/code/game/objects/items/weapons/sharpener.dm @@ -12,31 +12,31 @@ /obj/item/weapon/sharpener/attackby(obj/item/I, mob/user, params) if(used) - to_chat(user, "The sharpening block is too worn to use again.") + to_chat(user, "The sharpening block is too worn to use again!") return if(I.force >= max || I.throwforce >= max)//no esword sharpening - to_chat(user, "[I] is much too powerful to sharpen further.") + to_chat(user, "[I] is much too powerful to sharpen further!") return if(requires_sharpness && !I.sharpness) - to_chat(user, "You can only sharpen items that are already sharp, such as knives.") + to_chat(user, "You can only sharpen items that are already sharp, such as knives!") return if(istype(I, /obj/item/weapon/melee/transforming/energy)) - to_chat(user, "You don't think \the [I] will be the thing getting modified if you use it on \the [src].") + to_chat(user, "You don't think \the [I] will be the thing getting modified if you use it on \the [src]!") return if(istype(I, /obj/item/weapon/twohanded))//some twohanded items should still be sharpenable, but handle force differently. therefore i need this stuff var/obj/item/weapon/twohanded/TH = I if(TH.force_wielded >= max) - to_chat(user, "[TH] is much too powerful to sharpen further.") + to_chat(user, "[TH] is much too powerful to sharpen further!") return if(TH.wielded) - to_chat(user, "[TH] must be unwielded before it can be sharpened.") + to_chat(user, "[TH] must be unwielded before it can be sharpened!") return if(TH.force_wielded > initial(TH.force_wielded)) - to_chat(user, "[TH] has already been refined before. It cannot be sharpened further.") + to_chat(user, "[TH] has already been refined before. It cannot be sharpened further!") return TH.force_wielded = Clamp(TH.force_wielded + increment, 0, max)//wieldforce is increased since normal force wont stay if(I.force > initial(I.force)) - to_chat(user, "[I] has already been refined before. It cannot be sharpened further.") + to_chat(user, "[I] has already been refined before. It cannot be sharpened further!") return user.visible_message("[user] sharpens [I] with [src]!", "You sharpen [I], making it much more deadly than before.") I.sharpness = IS_SHARP_ACCURATE @@ -46,6 +46,7 @@ name = "worn out [name]" desc = "[desc] At least, it used to." used = 1 + update_icon() /obj/item/weapon/sharpener/super name = "super whetstone" diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 94a935498b..d59cab0853 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -33,7 +33,7 @@ var/illustration = "writing" /obj/item/weapon/storage/box/Initialize(mapload) - ..() + . = ..() update_icon() /obj/item/weapon/storage/box/update_icon() diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index ee6b2ea2c2..53bfe5d64c 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -1,4 +1,5 @@ /obj/item/weapon + var/trigger_guard = TRIGGER_GUARD_NONE /obj/item/weapon/banhammer desc = "A banhammer" @@ -77,8 +78,8 @@ var/notches = 0 //HOW MANY PEOPLE HAVE BEEN SLAIN WITH THIS BLADE var/obj/item/weapon/disk/nuclear/nuke_disk //OUR STORED NUKE DISK -/obj/item/weapon/claymore/highlander/New() - ..() +/obj/item/weapon/claymore/highlander/Initialize() + . = ..() START_PROCESSING(SSobj, src) /obj/item/weapon/claymore/highlander/Destroy() @@ -540,7 +541,7 @@ return 1 /obj/item/weapon/melee/flyswatter - name = "Flyswatter" + name = "flyswatter" desc = "Useful for killing insects of all sizes." icon = 'icons/obj/weapons.dmi' icon_state = "flyswatter" @@ -555,8 +556,8 @@ //Things in this list will be instantly splatted. Flyman weakness is handled in the flyman species weakness proc. var/list/strong_against -/obj/item/weapon/melee/flyswatter/New() - ..() +/obj/item/weapon/melee/flyswatter/Initialize() + . = ..() strong_against = typecacheof(list( /mob/living/simple_animal/hostile/poison/bees/, /mob/living/simple_animal/butterfly, @@ -584,3 +585,8 @@ throwforce = 0 flags = DROPDEL | ABSTRACT attack_verb = list("bopped") + +/obj/item/weapon/proc/can_trigger_gun(mob/living/user) + if(!user.can_use_guns(src)) + return FALSE + return TRUE \ No newline at end of file diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index facab21cc0..b1103ac1da 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -16,12 +16,10 @@ queue_smooth(src) queue_smooth_neighbors(src) icon_state = "" - if(SSticker) - GLOB.cameranet.updateVisibility(src) + GLOB.cameranet.updateVisibility(src) /obj/structure/Destroy() - if(SSticker) - GLOB.cameranet.updateVisibility(src) + GLOB.cameranet.updateVisibility(src) if(smooth) queue_smooth_neighbors(src) return ..() diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 206c9daf33..a149ed32ba 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -183,7 +183,7 @@ LINEN BINS dream_messages = list("black") /obj/item/weapon/bedsheet/centcom - name = "\improper Centcom bedsheet" + name = "\improper CentCom bedsheet" desc = "Woven with advanced nanothread for warmth as well as being very decorated, essential for all officials." icon_state = "sheetcentcom" item_color = "centcom" diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 17d6b7bf24..1babf2b407 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -38,7 +38,7 @@ /obj/structure/closet/Initialize(mapload) if(mapload && !opened) // if closed, any item at the crate's loc is put in the contents addtimer(CALLBACK(src, .proc/take_contents), 0) - ..() + . = ..() update_icon() PopulateContents() diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index 24e70059af..bfd3dea037 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -12,8 +12,8 @@ max_integrity = 150 integrity_failure = 50 -/obj/structure/fireaxecabinet/New() - ..() +/obj/structure/fireaxecabinet/Initialize() + . = ..() update_icon() /obj/structure/fireaxecabinet/Destroy() diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index e478ff5d92..d141f71b7a 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -1,12 +1,13 @@ /obj/structure/flora resistance_flags = FLAMMABLE + obj_integrity = 150 max_integrity = 150 - anchored = TRUE + anchored = 1 //trees /obj/structure/flora/tree name = "tree" - density = TRUE + density = 1 pixel_x = -16 layer = FLY_LAYER var/cut = FALSE @@ -25,7 +26,7 @@ playsound(get_turf(src), 'sound/effects/meteorimpact.ogg', 100 , 0, 0) icon = 'icons/obj/flora/pinetrees.dmi' icon_state = "tree_stump" - density = FALSE + density = 0 pixel_x = -16 name += " stump" cut = TRUE @@ -45,14 +46,14 @@ /obj/structure/flora/tree/pine/Initialize() icon_state = "pine_[rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/tree/pine/xmas name = "xmas tree" icon_state = "pine_c" /obj/structure/flora/tree/pine/xmas/Initialize() - ..() + . = ..() icon_state = "pine_c" /obj/structure/flora/tree/dead @@ -64,7 +65,7 @@ icon_state = "palm1" /obj/structure/flora/tree/palm/Initialize() - ..() + . = ..() icon_state = pick("palm1","palm2") pixel_x = 0 @@ -76,7 +77,7 @@ /obj/structure/flora/tree/dead/Initialize() icon_state = "tree_[rand(1, 6)]" - ..() + . = ..() /obj/structure/flora/tree/jungle name = "tree" @@ -88,12 +89,7 @@ /obj/structure/flora/tree/jungle/Initialize() icon_state = "[icon_state][rand(1, 6)]" - ..() - -/obj/structure/flora/tree/jungle/small - pixel_y = 0 - pixel_x = -32 - icon = 'icons/obj/flora/jungletreesmall.dmi' + . = ..() //grass /obj/structure/flora/grass @@ -106,7 +102,7 @@ /obj/structure/flora/grass/brown/Initialize() icon_state = "snowgrass[rand(1, 3)]bb" - ..() + . = ..() /obj/structure/flora/grass/green @@ -114,14 +110,14 @@ /obj/structure/flora/grass/green/Initialize() icon_state = "snowgrass[rand(1, 3)]gb" - ..() + . = ..() /obj/structure/flora/grass/both icon_state = "snowgrassall1" /obj/structure/flora/grass/both/Initialize() icon_state = "snowgrassall[rand(1, 3)]" - ..() + . = ..() //bushes @@ -129,11 +125,11 @@ name = "bush" icon = 'icons/obj/flora/snowflora.dmi' icon_state = "snowbush1" - anchored = TRUE + anchored = 1 /obj/structure/flora/bush/Initialize() icon_state = "snowbush[rand(1, 6)]" - ..() + . = ..() //newbushes @@ -145,112 +141,112 @@ /obj/structure/flora/ausbushes/Initialize() if(icon_state == "firstbush_1") icon_state = "firstbush_[rand(1, 4)]" - ..() + . = ..() /obj/structure/flora/ausbushes/reedbush icon_state = "reedbush_1" /obj/structure/flora/ausbushes/reedbush/Initialize() icon_state = "reedbush_[rand(1, 4)]" - ..() + . = ..() /obj/structure/flora/ausbushes/leafybush icon_state = "leafybush_1" /obj/structure/flora/ausbushes/leafybush/Initialize() icon_state = "leafybush_[rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/ausbushes/palebush icon_state = "palebush_1" /obj/structure/flora/ausbushes/palebush/Initialize() icon_state = "palebush_[rand(1, 4)]" - ..() + . = ..() /obj/structure/flora/ausbushes/stalkybush icon_state = "stalkybush_1" /obj/structure/flora/ausbushes/stalkybush/Initialize() icon_state = "stalkybush_[rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/ausbushes/grassybush icon_state = "grassybush_1" /obj/structure/flora/ausbushes/grassybush/Initialize() icon_state = "grassybush_[rand(1, 4)]" - ..() + . = ..() /obj/structure/flora/ausbushes/fernybush icon_state = "fernybush_1" /obj/structure/flora/ausbushes/fernybush/Initialize() icon_state = "fernybush_[rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/ausbushes/sunnybush icon_state = "sunnybush_1" /obj/structure/flora/ausbushes/sunnybush/Initialize() icon_state = "sunnybush_[rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/ausbushes/genericbush icon_state = "genericbush_1" /obj/structure/flora/ausbushes/genericbush/Initialize() icon_state = "genericbush_[rand(1, 4)]" - ..() + . = ..() /obj/structure/flora/ausbushes/pointybush icon_state = "pointybush_1" /obj/structure/flora/ausbushes/pointybush/Initialize() icon_state = "pointybush_[rand(1, 4)]" - ..() + . = ..() /obj/structure/flora/ausbushes/lavendergrass icon_state = "lavendergrass_1" /obj/structure/flora/ausbushes/lavendergrass/Initialize() icon_state = "lavendergrass_[rand(1, 4)]" - ..() + . = ..() /obj/structure/flora/ausbushes/ywflowers icon_state = "ywflowers_1" /obj/structure/flora/ausbushes/ywflowers/Initialize() icon_state = "ywflowers_[rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/ausbushes/brflowers icon_state = "brflowers_1" /obj/structure/flora/ausbushes/brflowers/Initialize() icon_state = "brflowers_[rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/ausbushes/ppflowers icon_state = "ppflowers_1" /obj/structure/flora/ausbushes/ppflowers/Initialize() icon_state = "ppflowers_[rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/ausbushes/sparsegrass icon_state = "sparsegrass_1" /obj/structure/flora/ausbushes/sparsegrass/Initialize() icon_state = "sparsegrass_[rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/ausbushes/fullgrass icon_state = "fullgrass_1" /obj/structure/flora/ausbushes/fullgrass/Initialize() icon_state = "fullgrass_[rand(1, 3)]" - ..() + . = ..() /obj/item/weapon/twohanded/required/kirbyplants name = "potted plant" @@ -308,10 +304,10 @@ desc = "A volcanic rock" icon = 'icons/obj/flora/rocks.dmi' resistance_flags = FIRE_PROOF - density = TRUE + density = 1 /obj/structure/flora/rock/Initialize() - ..() + . = ..() icon_state = "[icon_state][rand(1,3)]" /obj/structure/flora/rock/pile @@ -319,7 +315,7 @@ desc = "A pile of rocks" /obj/structure/flora/rock/pile/Initialize() - ..() + . = ..() icon_state = "[icon_state][rand(1,3)]" //Jungle grass @@ -333,7 +329,7 @@ /obj/structure/flora/grass/jungle/Initialize() icon_state = "[icon_state][rand(1, 5)]" - ..() + . = ..() /obj/structure/flora/grass/jungle/b icon_state = "grassb" @@ -348,7 +344,7 @@ density = FALSE /obj/structure/flora/rock/jungle/Initialize() - ..() + . = ..() icon_state = "[initial(icon_state)][rand(1,5)]" @@ -361,7 +357,7 @@ /obj/structure/flora/junglebush/Initialize() icon_state = "[icon_state][rand(1, 3)]" - ..() + . = ..() /obj/structure/flora/junglebush/b icon_state = "bushb" diff --git a/code/game/objects/structures/flora.dm.rej b/code/game/objects/structures/flora.dm.rej new file mode 100644 index 0000000000..8257ec2122 --- /dev/null +++ b/code/game/objects/structures/flora.dm.rej @@ -0,0 +1,28 @@ +diff a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm (rejected hunks) +@@ -89,7 +89,7 @@ + + /obj/structure/flora/tree/jungle/Initialize() + icon_state = "[icon_state][rand(1, 6)]" +- ..() ++ . = ..() + + //grass + /obj/structure/flora/grass +@@ -307,7 +307,7 @@ + density = 1 + + /obj/structure/flora/rock/Initialize() +- ..() ++ . = ..() + icon_state = "[icon_state][rand(1,3)]" + + /obj/structure/flora/rock/pile +@@ -381,5 +381,5 @@ + pixel_y = -16 + + /obj/structure/flora/rock/pile/largejungle/Initialize() +- ..() +- icon_state = "[initial(icon_state)][rand(1,3)]" +\ No newline at end of file ++ . = ..() ++ icon_state = "[initial(icon_state)][rand(1,3)]" diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm index 323927af77..7448aa128f 100644 --- a/code/game/objects/structures/manned_turret.dm +++ b/code/game/objects/structures/manned_turret.dm @@ -85,7 +85,7 @@ calculated_projectile_vars = calculate_projectile_angle_and_pixel_offsets(controller, C.mouseParams) /obj/machinery/manned_turret/proc/direction_track(mob/user, atom/targeted) - if(user.stat != CONSCIOUS) + if(user.incapacitated()) return setDir(get_dir(src,targeted)) user.setDir(dir) @@ -125,7 +125,7 @@ /obj/machinery/manned_turret/proc/checkfire(atom/targeted_atom, mob/user) target = targeted_atom - if(target == user || target == get_turf(src)) + if(target == user || user.incapacitated() || target == get_turf(src)) return if(world.time < cooldown) if(!warned && world.time > (cooldown - cooldown_duration + rate_of_fire*number_of_shots)) // To capture the window where one is done firing @@ -143,6 +143,8 @@ addtimer(CALLBACK(src, /obj/machinery/manned_turret/.proc/fire_helper, user), i*rate_of_fire) /obj/machinery/manned_turret/proc/fire_helper(mob/user) + if(user.incapacitated()) + return update_positioning() //REFRESH MOUSE TRACKING!! var/turf/targets_from = get_turf(src) if(QDELETED(target)) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 3736fe5589..d7777cc69c 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -140,7 +140,7 @@ /obj/item/weapon/paper/guides/jobs/medical/morgue name = "morgue memo" - info = "Since this station's medbay never seems to fail to be staffed by the mindless monkeys meant for genetics experiments, I'm leaving a reminder here for anyone handling the pile of cadavers the quacks are sure to leave.

    Red lights mean there's a plain ol' dead body inside.

    Yellow lights mean there's non-body objects inside.
    Probably stuff pried off a corpse someone grabbed, or if you're lucky it's stashed booze.

    Green lights mean the morgue system detects the body may be able to be cloned.

    I don't know how that works, but keep it away from the kitchen and go yell at the geneticists.

    - Centcom medical inspector" + info = "Since this station's medbay never seems to fail to be staffed by the mindless monkeys meant for genetics experiments, I'm leaving a reminder here for anyone handling the pile of cadavers the quacks are sure to leave.

    Red lights mean there's a plain ol' dead body inside.

    Yellow lights mean there's non-body objects inside.
    Probably stuff pried off a corpse someone grabbed, or if you're lucky it's stashed booze.

    Green lights mean the morgue system detects the body may be able to be cloned.

    I don't know how that works, but keep it away from the kitchen and go yell at the geneticists.

    - CentCom medical inspector" /* * Crematorium diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm index 4e9d7b896b..5ac194ece3 100644 --- a/code/game/objects/structures/showcase.dm +++ b/code/game/objects/structures/showcase.dm @@ -12,7 +12,7 @@ var/deconstruction_state = SHOWCASE_CONSTRUCTED /obj/structure/showcase/fakeid - name = "\improper Centcom identification console" + name = "\improper CentCom identification console" desc = "You can use this to change ID's." icon = 'icons/obj/computer.dmi' icon_state = "computer" @@ -23,7 +23,7 @@ add_overlay("id_key") /obj/structure/showcase/fakesec - name = "\improper Centcom security records" + name = "\improper CentCom security records" desc = "Used to view and edit personnel's security records" icon = 'icons/obj/computer.dmi' icon_state = "computer" diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 9a25da9019..f6b044a0da 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -321,6 +321,6 @@ icon_state = "direction_bridge" /obj/structure/sign/logo - name = "station logo" - desc = "A sign: SPACE STATION 13." - icon_state = "ss13sign-1" \ No newline at end of file + name = "nanotrasen logo" + desc = "The Nanotrasen corporate logo." + icon_state = "ss13sign-1" diff --git a/code/game/objects/structures/signs.dm.rej b/code/game/objects/structures/signs.dm.rej new file mode 100644 index 0000000000..51eea8f290 --- /dev/null +++ b/code/game/objects/structures/signs.dm.rej @@ -0,0 +1,11 @@ +diff a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm (rejected hunks) +@@ -326,6 +326,6 @@ + icon_state = "direction_bridge" + + /obj/structure/sign/logo +- name = "station logo" +- desc = "A sign: SPACE STATION 13." ++ name = "nanotrasen logo" ++ desc = "The Nanotrasen corporate logo." + icon_state = "nanotrasen_sign1" +\ No newline at end of file diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 8d796904fd..1b8a6635ee 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -222,7 +222,7 @@ if(isliving(G)) var/mob/living/L = G wash_mob(L) - else + else if(isobj(G)) // Skip the light objects wash_obj(G) else if(isopenturf(loc)) @@ -286,7 +286,7 @@ wash_obj(O) -/obj/machinery/shower/proc/wash_obj(atom/movable/O) +/obj/machinery/shower/proc/wash_obj(obj/O) . = O.clean_blood() O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) if(isitem(O)) diff --git a/code/game/objects/weapons.dm b/code/game/objects/weapons.dm index 0598d88a59..69c6c89870 100644 --- a/code/game/objects/weapons.dm +++ b/code/game/objects/weapons.dm @@ -2,8 +2,8 @@ name = "weapon" icon = 'icons/obj/weapons.dmi' -/obj/item/weapon/New() - ..() +/obj/item/weapon/Initialize() + . = ..() if(!hitsound) if(damtype == "fire") hitsound = 'sound/items/welder.ogg' diff --git a/code/game/sound.dm b/code/game/sound.dm index aa41e0c7e3..ff35915b08 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -78,14 +78,14 @@ S.y = 1 S.falloff = (falloff ? falloff : FALLOFF_SOUNDS) - src << S + SEND_SOUND(src, S) /proc/sound_to_playing_players(sound, volume = 100, vary) sound = get_sfx(sound) for(var/M in GLOB.player_list) if(ismob(M) && !isnewplayer(M)) var/mob/MO = M - MO.playsound_local(get_turf(MO), sound, volume, vary, pressure_affected = FALSE) + MO.playsound_local(MO, sound, volume, vary, pressure_affected = FALSE) /proc/open_sound_channel() var/static/next_channel = 1 //loop through the available 1024 - (the ones we reserve) channels and pray that its not still being used @@ -94,13 +94,13 @@ next_channel = 1 /mob/proc/stop_sound_channel(chan) - src << sound(null, repeat = 0, wait = 0, channel = chan) + SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = chan)) /client/proc/playtitlemusic() UNTIL(SSticker.login_music) //wait for SSticker init to set the login music if(prefs && (prefs.toggles & SOUND_LOBBY)) - src << sound(SSticker.login_music, repeat = 0, wait = 0, volume = 85, channel = CHANNEL_LOBBYMUSIC) // MAD JAMS + SEND_SOUND(src, sound(SSticker.login_music, repeat = 0, wait = 0, volume = 85, channel = CHANNEL_LOBBYMUSIC) // MAD JAMS) /proc/get_rand_frequency() return rand(32000, 55000) //Frequency stuff only works with 45kbps oggs. @@ -175,7 +175,3 @@ 'sound/vore/prey/death_07.ogg','sound/vore/prey/death_08.ogg','sound/vore/prey/death_09.ogg', 'sound/vore/prey/death_10.ogg') return soundin - -/proc/playsound_global(file, repeat = 0, wait, channel, volume) - for(var/V in GLOB.clients) - V << sound(file, repeat, wait, channel, volume) diff --git a/code/game/sound.dm.rej b/code/game/sound.dm.rej new file mode 100644 index 0000000000..003c8b9975 --- /dev/null +++ b/code/game/sound.dm.rej @@ -0,0 +1,9 @@ +diff a/code/game/sound.dm b/code/game/sound.dm (rejected hunks) +@@ -145,7 +145,3 @@ + if ("can_open") + soundin = pick('sound/effects/can_open1.ogg', 'sound/effects/can_open2.ogg', 'sound/effects/can_open3.ogg') + return soundin +- +-/proc/playsound_global(file, repeat = 0, wait, channel, volume) +- for(var/V in GLOB.clients) +- V << sound(file, repeat, wait, channel, volume) diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 0b87c28f8f..2ea3ffe7fc 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -75,7 +75,7 @@ underlays += mutable_appearance('icons/turf/floors.dmi', "plating") //add the plating underlay, below the grille /turf/closed/indestructible/fakedoor - name = "Centcom Access" + name = "CentCom Access" icon = 'icons/obj/doors/airlocks/centcom/centcom.dmi' icon_state = "fake_door" diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 82ff907a04..a990530056 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -18,6 +18,7 @@ var/sound /turf/open/indestructible/sound/Entered(var/mob/AM) + ..() if(istype(AM)) playsound(src,sound,50,1) diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm index 968e782984..a51240c969 100644 --- a/code/game/turfs/simulated/chasm.dm +++ b/code/game/turfs/simulated/chasm.dm @@ -22,6 +22,7 @@ return /turf/open/chasm/Entered(atom/movable/AM) + ..() START_PROCESSING(SSobj, src) drop_stuff(AM) diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index 7666472a65..ec84bff35d 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -17,7 +17,7 @@ /turf/open/floor/plating/asteroid/Initialize() var/proper_name = name - ..() + . = ..() name = proper_name if(prob(floor_variance)) icon_state = "[environment_type][rand(0,12)]" @@ -124,7 +124,7 @@ initial_gas_mix = "TEMP=2.7" /turf/open/floor/plating/asteroid/basalt/Initialize() - ..() + . = ..() set_basalt_light(src) /proc/set_basalt_light(turf/open/floor/B) diff --git a/code/game/turfs/simulated/floor/plating/misc_plating.dm b/code/game/turfs/simulated/floor/plating/misc_plating.dm index cf0ec5531c..9a6d5eb467 100644 --- a/code/game/turfs/simulated/floor/plating/misc_plating.dm +++ b/code/game/turfs/simulated/floor/plating/misc_plating.dm @@ -8,7 +8,7 @@ icon_state = "alienpod1" /turf/open/floor/plating/abductor/Initialize() - ..() + . = ..() icon_state = "alienpod[rand(1,9)]" @@ -46,7 +46,7 @@ pixel_y = -4 pixel_x = -4 icon = smooth_icon - ..() + . = ..() /turf/open/floor/plating/ashplanet/break_tile() return @@ -74,7 +74,7 @@ /turf/open/floor/plating/ashplanet/wateryrock/Initialize() icon_state = "[icon_state][rand(1, 9)]" - ..() + . = ..() /turf/open/floor/plating/beach @@ -114,7 +114,7 @@ desc = "Like sand, but more metal." /turf/open/floor/plating/ironsand/Initialize() - ..() + . = ..() icon_state = "ironsand[rand(1,15)]" /turf/open/floor/plating/ironsand/burn_tile() diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index c7e6973c4d..b877fa9eac 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -25,6 +25,7 @@ dir = EAST /turf/open/space/transit/Entered(atom/movable/AM, atom/OldLoc) + ..() if(!locate(/obj/structure/lattice) in src) throw_atom(AM) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index a63066709a..ed76b7704e 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -77,6 +77,7 @@ return SSair.remove_from_active(src) visibilityChanged() + QDEL_LIST(blueprint_data) initialized = FALSE requires_activation = FALSE ..() @@ -159,8 +160,15 @@ return TRUE //Nothing found to block so return success! /turf/Entered(atom/movable/AM) + ..() if(explosion_level && AM.ex_check(explosion_id)) AM.ex_act(explosion_level) + + // If an opaque movable atom moves around we need to potentially update visibility. + if (AM.opacity) + has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case. + reconsider_lights() + /turf/open/Entered(atom/movable/AM) ..() @@ -224,9 +232,15 @@ var/old_affecting_lights = affecting_lights var/old_lighting_object = lighting_object var/old_corners = corners + + var/old_exl = explosion_level + var/old_exi = explosion_id + var/old_bp = blueprint_data + blueprint_data = null var/old_baseturf = baseturf changing_turf = TRUE + qdel(src) //Just get the side effects and call Destroy var/turf/W = new path(src) @@ -235,9 +249,14 @@ else W.baseturf = old_baseturf + W.explosion_id = old_exi + W.explosion_level = old_exl + if(!defer_change) W.AfterChange(ignore_air) + W.blueprint_data = old_bp + if(SSlighting.initialized) recalc_atom_opacity() lighting_object = old_lighting_object @@ -373,8 +392,7 @@ return can_have_cabling() & !intact /turf/proc/visibilityChanged() - if(SSticker) - GLOB.cameranet.updateVisibility(src) + GLOB.cameranet.updateVisibility(src) /turf/proc/burn_tile() @@ -433,27 +451,24 @@ I.setDir(AM.dir) I.alpha = 128 - if(!blueprint_data) - blueprint_data = list() - blueprint_data += I + LAZYADD(blueprint_data, I) /turf/proc/add_blueprints_preround(atom/movable/AM) if(!SSticker.HasRoundStarted()) add_blueprints(AM) -/turf/proc/empty(turf_type=/turf/open/space, baseturf_type, delmobs = TRUE, forceop = FALSE) +/turf/proc/empty(turf_type=/turf/open/space, baseturf_type, list/ignore_typecache, forceop = FALSE) // Remove all atoms except observers, landmarks, docking ports var/static/list/ignored_atoms = typecacheof(list(/mob/dead, /obj/effect/landmark, /obj/docking_port, /atom/movable/lighting_object)) - var/list/allowed_contents = typecache_filter_list_reverse(GetAllContents(),delmobs? ignored_atoms : ignored_atoms + typecacheof(list(/mob))) + var/list/allowed_contents = typecache_filter_list_reverse(GetAllContents(ignore_typecache), ignored_atoms) allowed_contents -= src for(var/i in 1 to allowed_contents.len) var/thing = allowed_contents[i] qdel(thing, force=TRUE) - var/turf/newT = ChangeTurf(turf_type, baseturf_type, FALSE, FALSE, forceop = forceop) - + SSair.remove_from_active(newT) newT.CalculateAdjacentTurfs() SSair.add_to_active(newT,1) @@ -538,4 +553,4 @@ limit-- else return I - return I \ No newline at end of file + return I diff --git a/code/game/turfs/turf.dm.rej b/code/game/turfs/turf.dm.rej new file mode 100644 index 0000000000..1c4472c18a --- /dev/null +++ b/code/game/turfs/turf.dm.rej @@ -0,0 +1,13 @@ +diff a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm (rejected hunks) +@@ -163,6 +163,11 @@ + if(explosion_level && AM.ex_check(explosion_id)) + AM.ex_act(explosion_level) + ++ // If an opaque movable atom moves around we need to potentially update visibility. ++ if (AM.opacity) ++ has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case. ++ reconsider_lights() ++ + /turf/open/Entered(atom/movable/AM) + ..() + //melting diff --git a/code/game/world.dm b/code/game/world.dm new file mode 100644 index 0000000000..f5b45a46ca --- /dev/null +++ b/code/game/world.dm @@ -0,0 +1,292 @@ +/world/New() + log_world("World loaded at [time_stamp()]") + + SetupExternalRSC() + + GLOB.config_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl + + make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) + + config = new + + CheckSchemaVersion() + SetRoundID() + + SetupLogs() + + if(!RunningService()) //tgs2 support + GLOB.revdata.DownloadPRDetails() + + load_motd() + load_admins() + LoadVerbs(/datum/verbs/menu) + if(config.usewhitelist) + load_whitelist() + LoadBans() + + GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000 + + Master.Initialize(10, FALSE) + + if(config.irc_announce_new_game) + IRCBroadcast("New round starting on [SSmapping.config.map_name]!") + +/world/proc/SetupExternalRSC() +#if (PRELOAD_RSC == 0) + external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n") + var/i=1 + while(i<=external_rsc_urls.len) + if(external_rsc_urls[i]) + i++ + else + external_rsc_urls.Cut(i,i+1) +#endif + +/world/proc/CheckSchemaVersion() + if(config.sql_enabled) + if(SSdbcore.Connect()) + log_world("Database connection established.") + var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_revision")] ORDER BY date DESC LIMIT 1") + query_db_version.Execute() + if(query_db_version.NextRow()) + var/db_major = text2num(query_db_version.item[1]) + var/db_minor = text2num(query_db_version.item[2]) + if(db_major < DB_MAJOR_VERSION || db_minor < DB_MINOR_VERSION) + message_admins("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") + log_sql("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") + else + message_admins("Could not get schema version from database") + else + log_world("Your server failed to establish a connection with the database.") + +/world/proc/SetRoundID() + if(config.sql_enabled) + if(SSdbcore.Connect()) + var/datum/DBQuery/query_round_start = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (start_datetime, server_ip, server_port) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]')") + query_round_start.Execute() + var/datum/DBQuery/query_round_last_id = SSdbcore.NewQuery("SELECT LAST_INSERT_ID()") + query_round_last_id.Execute() + if(query_round_last_id.NextRow()) + GLOB.round_id = query_round_last_id.item[1] + +/world/proc/SetupLogs() + GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-" + if(GLOB.round_id) + GLOB.log_directory += "[GLOB.round_id]" + else + GLOB.log_directory += "[replacetext(time_stamp(), ":", ".")]" + GLOB.world_game_log = file("[GLOB.log_directory]/game.log") + GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log") + GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log") + GLOB.world_href_log = file("[GLOB.log_directory]/hrefs.html") + WRITE_FILE(GLOB.world_game_log, "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------") + WRITE_FILE(GLOB.world_attack_log, "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------") + WRITE_FILE(GLOB.world_runtime_log, "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------") + GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently + if(fexists(GLOB.config_error_log)) + fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log") + fdel(GLOB.config_error_log) + + if(GLOB.round_id) + log_game("Round ID: [GLOB.round_id]") + +/world/Topic(T, addr, master, key) + var/list/input = params2list(T) + + var/pinging = ("ping" in input) + var/playing = ("players" in input) + + if(!pinging && !playing && config && config.log_world_topic) + WRITE_FILE(GLOB.world_game_log, "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]") + + if(input[SERVICE_CMD_PARAM_KEY]) + return ServiceCommand(input) + var/key_valid = (global.comms_allowed && input["key"] == global.comms_key) + + if(pinging) + var/x = 1 + for (var/client/C in GLOB.clients) + x++ + return x + + else if(playing) + var/n = 0 + for(var/mob/M in GLOB.player_list) + if(M.client) + n++ + return n + + else if("ircstatus" in input) //tgs2 support + var/static/last_irc_status = 0 + if(world.time - last_irc_status < 50) + return + var/list/adm = get_admin_counts() + var/list/allmins = adm["total"] + var/status = "Admins: [allmins.len] (Active: [english_list(adm["present"])] AFK: [english_list(adm["afk"])] Stealth: [english_list(adm["stealth"])] Skipped: [english_list(adm["noflags"])]). " + status += "Players: [GLOB.clients.len] (Active: [get_active_player_count(0,1,0)]). Mode: [SSticker.mode.name]." + send2irc("Status", status) + last_irc_status = world.time + + else if("status" in input) + var/list/s = list() + s["version"] = GLOB.game_version + s["mode"] = GLOB.master_mode + s["respawn"] = config ? GLOB.abandon_allowed : 0 + s["enter"] = GLOB.enter_allowed + s["vote"] = config.allow_vote_mode + s["ai"] = config.allow_ai + s["host"] = host ? host : null + s["active_players"] = get_active_player_count() + s["players"] = GLOB.clients.len + s["revision"] = GLOB.revdata.commit + s["revision_date"] = GLOB.revdata.date + + var/list/adm = get_admin_counts() + var/list/presentmins = adm["present"] + var/list/afkmins = adm["afk"] + s["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho + s["gamestate"] = SSticker.current_state + + s["map_name"] = SSmapping.config.map_name + + if(key_valid && SSticker.HasRoundStarted()) + s["real_mode"] = SSticker.mode.name + // Key-authed callers may know the truth behind the "secret" + + s["security_level"] = get_security_level() + s["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0 + // Amount of world's ticks in seconds, useful for calculating round duration + + if(SSshuttle && SSshuttle.emergency) + s["shuttle_mode"] = SSshuttle.emergency.mode + // Shuttle status, see /__DEFINES/stat.dm + s["shuttle_timer"] = SSshuttle.emergency.timeLeft() + // Shuttle timer, in seconds + + return list2params(s) + + else if("announce" in input) + if(!key_valid) + return "Bad Key" + else + AnnouncePR(input["announce"], json_decode(input["payload"])) + + else if("crossmessage" in input) + if(!key_valid) + return + else + if(input["crossmessage"] == "Ahelp") + relay_msg_admins("HELP: [input["source"]] [input["message_sender"]]: [input["message"]]") + if(input["crossmessage"] == "Comms_Console") + minor_announce(input["message"], "Incoming message from [input["message_sender"]]") + for(var/obj/machinery/computer/communications/CM in GLOB.machines) + CM.overrideCooldown() + if(input["crossmessage"] == "News_Report") + minor_announce(input["message"], "Breaking Update From [input["message_sender"]]") + + else if("adminmsg" in input) //tgs2 support + if(!key_valid) + return "Bad Key" + else + return IrcPm(input["adminmsg"],input["msg"],input["sender"]) + + else if("namecheck" in input) //tgs2 support + if(!key_valid) + return "Bad Key" + else + log_admin("IRC Name Check: [input["sender"]] on [input["namecheck"]]") + message_admins("IRC name checking on [input["namecheck"]] from [input["sender"]]") + return keywords_lookup(input["namecheck"],1) + else if("adminwho" in input) //tgs2 support + if(!key_valid) + return "Bad Key" + else + return ircadminwho() + else if("server_hop" in input) + show_server_hop_transfer_screen(input["server_hop"]) + +/world/proc/AnnouncePR(announcement, list/payload) + var/static/list/PRcounts = list() //PR id -> number of times announced this round + var/id = "[payload["pull_request"]["id"]]" + if(!PRcounts[id]) + PRcounts[id] = 1 + else + ++PRcounts[id] + if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND) + return + + var/final_composed = "PR: [announcement]" + for(var/client/C in GLOB.clients) + C.AnnouncePR(final_composed) + +/world/Reboot(reason = 0, fast_track = FALSE) + ServiceReboot() //handles alternative actions if necessary + if (reason || fast_track) //special reboot, do none of the normal stuff + if (usr) + log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools") + message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools") + to_chat(world, "Rebooting World immediately due to host request") + else + to_chat(world, "Rebooting world...") + Master.Shutdown() //run SS shutdowns + log_world("World rebooted at [time_stamp()]") + ..() + +/world/proc/load_motd() + GLOB.join_motd = file2text("config/motd.txt") + "
    " + GLOB.revdata.GetTestMergeInfo() + +/world/proc/update_status() + var/s = "" + + if (config && config.server_name) + s += "[config.server_name] — " + + s += "[station_name()]"; + s += " (" + s += "" //Change this to wherever you want the hub to link to. + s += "Default" //Replace this with something else. Or ever better, delete it and uncomment the game version. + s += "" + s += ")" + + var/list/features = list() + + if(GLOB.master_mode) + features += GLOB.master_mode + + if (!GLOB.enter_allowed) + features += "closed" + + features += GLOB.abandon_allowed ? "respawn" : "no respawn" + + if (config && config.allow_vote_mode) + features += "vote" + + if (config && config.allow_ai) + features += "AI allowed" + + var/n = 0 + for (var/mob/M in GLOB.player_list) + if (M.client) + n++ + + if (n > 1) + features += "~[n] players" + else if (n > 0) + features += "~[n] player" + + if (!host && config && config.hostedby) + features += "hosted by [config.hostedby]" + + if (features) + s += ": [jointext(features, ", ")]" + + status = s + +/world/proc/update_hub_visibility(new_visibility) + if(new_visibility == GLOB.hub_visibility) + return + GLOB.hub_visibility = new_visibility + if(GLOB.hub_visibility) + hub_password = "kMZy3U5jJHSiBQjr" + else + hub_password = "SORRYNOPASSWORD" diff --git a/code/modules/admin/DB_ban/functions.dm b/code/modules/admin/DB_ban/functions.dm index 23bf656b8c..e580b306b3 100644 --- a/code/modules/admin/DB_ban/functions.dm +++ b/code/modules/admin/DB_ban/functions.dm @@ -83,10 +83,10 @@ var/a_computerid var/a_ip - if(src.owner && istype(src.owner, /client)) - a_ckey = src.owner:ckey - a_computerid = src.owner:computer_id - a_ip = src.owner:address + if(istype(owner)) + a_ckey = owner.ckey + a_computerid = owner.computer_id + a_ip = owner.address if(blockselfban) if(a_ckey == ckey) @@ -309,12 +309,12 @@ to_chat(usr, "Database update failed due to multiple bans having the same ID. Contact the database admin.") return - if(!src.owner || !istype(src.owner, /client)) + if(!istype(owner)) return - var/unban_ckey = src.owner:ckey - var/unban_computerid = src.owner:computer_id - var/unban_ip = src.owner:address + var/unban_ckey = owner.ckey + var/unban_computerid = owner.computer_id + var/unban_ip = owner.address var/sql_update = "UPDATE [format_table_name("ban")] SET unbanned = 1, unbanned_datetime = Now(), unbanned_ckey = '[unban_ckey]', unbanned_computerid = '[unban_computerid]', unbanned_ip = INET_ATON('[unban_ip]') WHERE id = [id]" var/datum/DBQuery/query_unban = SSdbcore.NewQuery(sql_update) diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 1ff2360923..5ea980a91d 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -109,14 +109,14 @@ GLOBAL_PROTECT(Banlist) else GLOB.Banlist.dir.Add("[ckey][computerid]") GLOB.Banlist.cd = "/base/[ckey][computerid]" - GLOB.Banlist["key"] << ckey - GLOB.Banlist["id"] << computerid - GLOB.Banlist["ip"] << address - GLOB.Banlist["reason"] << reason - GLOB.Banlist["bannedby"] << bannedby - GLOB.Banlist["temp"] << temp + WRITE_FILE(GLOB.Banlist["key"], ckey) + WRITE_FILE(GLOB.Banlist["id"], computerid) + WRITE_FILE(GLOB.Banlist["ip"], address) + WRITE_FILE(GLOB.Banlist["reason"], reason) + WRITE_FILE(GLOB.Banlist["bannedby"], bannedby) + WRITE_FILE(GLOB.Banlist["temp"], temp) if (temp) - GLOB.Banlist["minutes"] << bantimestamp + WRITE_FILE(GLOB.Banlist["minutes"], bantimestamp) if(!temp) create_message("note", ckey, bannedby, "Permanently banned - [reason]", null, null, 0, 0) else @@ -211,17 +211,17 @@ GLOBAL_PROTECT(Banlist) GLOB.Banlist.cd = "/base" GLOB.Banlist.dir.Add("trash[i]trashid[i]") GLOB.Banlist.cd = "/base/trash[i]trashid[i]" - GLOB.Banlist["key"] << "trash[i]" + WRITE_FILE(GLOB.Banlist["key"], "trash[i]") else GLOB.Banlist.cd = "/base" GLOB.Banlist.dir.Add("[last]trashid[i]") GLOB.Banlist.cd = "/base/[last]trashid[i]" - GLOB.Banlist["key"] << last - GLOB.Banlist["id"] << "trashid[i]" - GLOB.Banlist["reason"] << "Trashban[i]." - GLOB.Banlist["temp"] << a - GLOB.Banlist["minutes"] << GLOB.CMinutes + rand(1,2000) - GLOB.Banlist["bannedby"] << "trashmin" + WRITE_FILE(GLOB.Banlist["key"], last) + WRITE_FILE(GLOB.Banlist["id"], "trashid[i]") + WRITE_FILE(GLOB.Banlist["reason"], "Trashban[i].") + WRITE_FILE(GLOB.Banlist["temp"], a) + WRITE_FILE(GLOB.Banlist["minutes"], GLOB.CMinutes + rand(1,2000)) + WRITE_FILE(GLOB.Banlist["bannedby"], "trashmin") last = "trash[i]" GLOB.Banlist.cd = "/base" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index b5f2bc750e..5943e753a0 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -595,7 +595,7 @@ log_admin("[key_name(usr)] delayed the round start.") else to_chat(world, "The game will start in [newtime] seconds.") - world << 'sound/ai/attention.ogg' + SEND_SOUND(world, sound('sound/ai/attention.ogg')) log_admin("[key_name(usr)] set the pre-game delay to [newtime] seconds.") SSblackbox.add_details("admin_verb","Delay Game Start") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -735,34 +735,33 @@ var/dat = "Manage Free Slots" var/count = 0 - if(SSticker && !SSticker.mode) + if(!SSticker.HasRoundStarted()) alert(usr, "You cannot manage jobs before the round starts!") return - if(SSjob) - for(var/datum/job/job in SSjob.occupations) - count++ - var/J_title = html_encode(job.title) - var/J_opPos = html_encode(job.total_positions - (job.total_positions - job.current_positions)) - var/J_totPos = html_encode(job.total_positions) - if(job.total_positions < 0) - dat += "[J_title]: [J_opPos] (unlimited)" - else - dat += "[J_title]: [J_opPos]/[J_totPos]" + for(var/datum/job/job in SSjob.occupations) + count++ + var/J_title = html_encode(job.title) + var/J_opPos = html_encode(job.total_positions - (job.total_positions - job.current_positions)) + var/J_totPos = html_encode(job.total_positions) + if(job.total_positions < 0) + dat += "[J_title]: [J_opPos] (unlimited)" + else + dat += "[J_title]: [J_opPos]/[J_totPos]" - if(job.title == "AI" || job.title == "Cyborg") - dat += " (Cannot Late Join)
    " - continue - if(job.total_positions >= 0) - dat += " Add | " - if(job.total_positions > job.current_positions) - dat += "Remove | " - else - dat += "Remove | " - dat += "Unlimit" + if(job.title == "AI" || job.title == "Cyborg") + dat += " (Cannot Late Join)
    " + continue + if(job.total_positions >= 0) + dat += " Add | " + if(job.total_positions > job.current_positions) + dat += "Remove | " else - dat += " Limit" - dat += "
    " + dat += "Remove | " + dat += "Unlimit" + else + dat += " Limit" + dat += "
    " dat += "" var/winheight = 100 + (count * 20) diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 54feb11532..2ca0593e8d 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -5,7 +5,7 @@ F << "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message]
    " -/client/proc/investigate_show(subject in list("hrefs","notes, memos, watchlist", INVESTIGATE_PORTAL, INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY) ) +/client/proc/investigate_show(subject in list("hrefs","notes, memos, watchlist", INVESTIGATE_PORTAL, INVESTIGATE_SINGULO, INVESTIGATE_WIRES, INVESTIGATE_TELESCI, INVESTIGATE_GRAVITY, INVESTIGATE_RECORDS, INVESTIGATE_CARGO, INVESTIGATE_SUPERMATTER, INVESTIGATE_ATMOS, INVESTIGATE_EXPERIMENTOR, INVESTIGATE_BOTANY, INVESTIGATE_HALLUCINATIONS) ) set name = "Investigate" set category = "Admin" if(!holder) diff --git a/code/modules/admin/admin_investigate.dm.rej b/code/modules/admin/admin_investigate.dm.rej new file mode 100644 index 0000000000..d58adb0f78 --- /dev/null +++ b/code/modules/admin/admin_investigate.dm.rej @@ -0,0 +1 @@ +garbage \ No newline at end of file diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index 73c2d8067e..828fbb2e91 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -142,7 +142,7 @@ GLOBAL_PROTECT(admin_ranks) else if(!SSdbcore.Connect()) log_world("Failed to connect to database in load_admin_ranks(). Reverting to legacy system.") - GLOB.world_game_log << "Failed to connect to database in load_admin_ranks(). Reverting to legacy system." + WRITE_FILE(GLOB.world_game_log, "Failed to connect to database in load_admin_ranks(). Reverting to legacy system.") config.admin_legacy_system = 1 load_admin_ranks() return @@ -220,7 +220,7 @@ GLOBAL_PROTECT(admin_ranks) else if(!SSdbcore.Connect()) log_world("Failed to connect to database in load_admins(). Reverting to legacy system.") - GLOB.world_game_log << "Failed to connect to database in load_admins(). Reverting to legacy system." + WRITE_FILE(GLOB.world_game_log, "Failed to connect to database in load_admins(). Reverting to legacy system.") config.admin_legacy_system = 1 load_admins() return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index ff8b10d185..3276a319db 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -12,11 +12,13 @@ GLOBAL_LIST_INIT(admin_verbs_default, world.AVerbsDefault()) /client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/ /client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/ /client/proc/secrets, + /client/proc/toggle_hear_radio, /*allows admins to hide all radio output*/ /client/proc/reload_admins, /client/proc/reestablish_db_connection, /*reattempt a connection to the database*/ /client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/ /client/proc/cmd_admin_pm_panel, /*admin-pm list*/ /client/proc/cmd_admin_ticket_panel, + /client/proc/panicbunker, /client/proc/stop_sounds ) GLOBAL_PROTECT(admin_verbs_admin) @@ -114,7 +116,6 @@ GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer()) /client/proc/toggle_random_events, /client/proc/forcerandomrotate, /client/proc/adminchangemap, - /client/proc/panicbunker, /client/proc/toggle_hub ) GLOBAL_PROTECT(admin_verbs_debug) @@ -296,7 +297,8 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list( /client/proc/startSinglo, /client/proc/set_server_fps, /client/proc/cmd_admin_grantfullaccess, - /client/proc/cmd_admin_areatest, + /client/proc/cmd_admin_areatest_all, + /client/proc/cmd_admin_areatest_station, /client/proc/readmin ) if(holder) diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index 95e7c9a904..04a4b7877a 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -105,15 +105,14 @@ if("list_job_debug") var/dat = "Job Debug info.
    " - if(SSjob) - for(var/line in SSjob.job_debug) - dat += "[line]
    " - dat+= "*******

    " - for(var/datum/job/job in SSjob.occupations) - if(!job) - continue - dat += "job: [job.title], current_positions: [job.current_positions], total_positions: [job.total_positions]
    " - usr << browse(dat, "window=jobdebug;size=600x500") + for(var/line in SSjob.job_debug) + dat += "[line]
    " + dat+= "*******

    " + for(var/datum/job/job in SSjob.occupations) + if(!job) + continue + dat += "job: [job.title], current_positions: [job.current_positions], total_positions: [job.total_positions]
    " + usr << browse(dat, "window=jobdebug;size=600x500") if("show_admins") var/dat = "Current admins:
    " @@ -215,7 +214,7 @@ if("moveferry") if(!check_rights(R_ADMIN)) return - SSblackbox.add_details("admin_secrets_fun_used","Send Centcom Ferry") + SSblackbox.add_details("admin_secrets_fun_used","Send CentCom Ferry") if(!SSshuttle.toggleShuttle("ferry","ferry_home","ferry_away")) message_admins("[key_name_admin(usr)] moved the centcom ferry") log_admin("[key_name(usr)] moved the centcom ferry") @@ -391,7 +390,7 @@ SSblackbox.add_details("admin_secrets_fun_used","Chinese Cartoons") message_admins("[key_name_admin(usr)] made everything kawaii.") for(var/mob/living/carbon/human/H in GLOB.mob_list) - H << sound('sound/ai/animes.ogg') + SEND_SOUND(H, sound('sound/ai/animes.ogg')) if(H.dna.species.id == "human") if(H.dna.features["tail_human"] == "None" || H.dna.features["ears"] == "None") @@ -458,7 +457,7 @@ if(W.z == ZLEVEL_STATION && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison)) W.req_access = list() message_admins("[key_name_admin(usr)] activated Egalitarian Station mode") - priority_announce("Centcom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, 'sound/ai/commandreport.ogg') + priority_announce("CentCom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, 'sound/ai/commandreport.ogg') if("guns") if(!check_rights(R_FUN)) @@ -518,14 +517,14 @@ return SSblackbox.add_details("admin_secrets_fun_used","There Can Be Only One") usr.client.only_one() - send_to_playing_players('sound/misc/highlander.ogg') + sound_to_playing_players('sound/misc/highlander.ogg') if("delayed_onlyone") if(!check_rights(R_FUN)) return SSblackbox.add_details("admin_secrets_fun_used","There Can Be Only One") usr.client.only_one_delayed() - send_to_playing_players('sound/misc/highlander_delayed.ogg') + sound_to_playing_players('sound/misc/highlander_delayed.ogg') if("onlyme") if(!check_rights(R_FUN)) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 5436590e83..ac047429c8 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -6,7 +6,7 @@ log_admin("[key_name(usr)] tried to use the admin panel without authorization.") return if(href_list["ahelp"]) - if(!check_rights(R_ADMIN)) + if(!check_rights(R_ADMIN, TRUE)) return var/ahelp_ref = href_list["ahelp"] @@ -102,13 +102,13 @@ message_admins("[key_name(usr)] tried to create gangs. Unfortunately, there were not enough candidates available.") log_admin("[key_name(usr)] failed create gangs.") if("centcom") - message_admins("[key_name(usr)] is creating a Centcom response team...") + message_admins("[key_name(usr)] is creating a CentCom response team...") if(src.makeEmergencyresponseteam()) - message_admins("[key_name(usr)] created a Centcom response team.") - log_admin("[key_name(usr)] created a Centcom response team.") + message_admins("[key_name(usr)] created a CentCom response team.") + log_admin("[key_name(usr)] created a CentCom response team.") else - message_admins("[key_name_admin(usr)] tried to create a Centcom response team. Unfortunately, there were not enough candidates available.") - log_admin("[key_name(usr)] failed to create a Centcom response team.") + message_admins("[key_name_admin(usr)] tried to create a CentCom response team. Unfortunately, there were not enough candidates available.") + log_admin("[key_name(usr)] failed to create a CentCom response team.") if("abductors") message_admins("[key_name(usr)] is creating an abductor team...") if(src.makeAbductorTeam()) @@ -506,10 +506,10 @@ ban_unban_log_save("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]") message_admins("[key_name_admin(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]") GLOB.Banlist.cd = "/base/[banfolder]" - GLOB.Banlist["reason"] << reason - GLOB.Banlist["temp"] << temp - GLOB.Banlist["minutes"] << minutes - GLOB.Banlist["bannedby"] << usr.ckey + WRITE_FILE(GLOB.Banlist["reason"], reason) + WRITE_FILE(GLOB.Banlist["temp"], temp) + WRITE_FILE(GLOB.Banlist["minutes"], minutes) + WRITE_FILE(GLOB.Banlist["bannedby"], usr.ckey) GLOB.Banlist.cd = "/base" SSblackbox.inc("ban_edit",1) unbanpanel() @@ -1697,7 +1697,7 @@ message_admins("[key_name(H)] got their cookie, spawned by [key_name(src.owner)].") SSblackbox.inc("admin_cookies_spawned",1) to_chat(H, "Your prayers have been answered!! You received the best cookie!") - H << 'sound/effects/pray_chaplain.ogg' + SEND_SOUND(H, sound('sound/effects/pray_chaplain.ogg')) else if(href_list["adminsmite"]) if(!check_rights(R_ADMIN|R_FUN)) @@ -1710,8 +1710,8 @@ usr.client.smite(H) - else if(href_list["CentcommReply"]) - var/mob/living/carbon/human/H = locate(href_list["CentcommReply"]) in GLOB.mob_list + else if(href_list["CentComReply"]) + var/mob/living/carbon/human/H = locate(href_list["CentComReply"]) in GLOB.mob_list if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") return @@ -1719,15 +1719,15 @@ to_chat(usr, "The person you are trying to contact is not wearing a headset.") return - message_admins("[src.owner] has started answering [key_name(H)]'s Centcomm request.") - var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from Centcom", "") + message_admins("[src.owner] has started answering [key_name(H)]'s CentCom request.") + var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via their headset.","Outgoing message from CentCom", "") if(!input) - message_admins("[src.owner] decided not to answer [key_name(H)]'s Centcomm request.") + message_admins("[src.owner] decided not to answer [key_name(H)]'s CentCom request.") return to_chat(src.owner, "You sent [input] to [H] via a secure channel.") - log_admin("[src.owner] replied to [key_name(H)]'s Centcom message with the message [input].") - message_admins("[src.owner] replied to [key_name(H)]'s Centcom message with: \"[input]\"") + log_admin("[src.owner] replied to [key_name(H)]'s CentCom message with the message [input].") + message_admins("[src.owner] replied to [key_name(H)]'s CentCom message with: \"[input]\"") to_chat(H, "You hear something crackle in your ears for a moment before a voice speaks. \"Please stand by for a message from Central Command. Message as follows. [input]. Message ends.\"") else if(href_list["SyndicateReply"]) diff --git a/code/modules/admin/verbs/BrokenInhands.dm b/code/modules/admin/verbs/BrokenInhands.dm index 89eccf285d..732ae9e91c 100644 --- a/code/modules/admin/verbs/BrokenInhands.dm +++ b/code/modules/admin/verbs/BrokenInhands.dm @@ -28,7 +28,7 @@ if(text) var/F = file("broken_icons.txt") fdel(F) - F << text + WRITE_FILE(F, text) to_chat(world, "Completely successfully and written to [F]") diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 0177798e25..b19c736e14 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -194,7 +194,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) AddInteraction("[key_name_admin(usr)] PM'd [LinkedReplyName()]") message_admins("Ticket [TicketHref("#[id]")] created") else - MessageNoRecipient(parsed_message) + MessageNoRecipient(msg, parsed_message) //send it to irc if nobody is on and tell us how many were on var/admin_number_present = send2irc_adminless_only(initiator_ckey, "Ticket #[id]: [name]") @@ -249,18 +249,19 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) //message from the initiator without a target, all admins will see this //won't bug irc -/datum/admin_help/proc/MessageNoRecipient(msg) +/datum/admin_help/proc/MessageNoRecipient(msg, parsed_msg) var/ref_src = "\ref[src]" - var/chat_msg = "Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]: [msg]" + //Message to be sent to all admins + var/admin_msg = "Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]: [parsed_msg]" AddInteraction("[LinkedReplyName(ref_src)]: [msg]") + //send this msg to all admins - for(var/client/X in GLOB.admins) if(X.prefs.toggles & SOUND_ADMINHELP) - X << 'sound/effects/adminhelp.ogg' + SEND_SOUND(X, sound('sound/effects/adminhelp.ogg')) window_flash(X, ignorepref = TRUE) - to_chat(X, chat_msg) + to_chat(X, admin_msg) //show it to the person adminhelping too to_chat(initiator, "PM to-Admins: [msg]") @@ -346,7 +347,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(initiator) initiator.giveadminhelpverb() - initiator << 'sound/effects/adminhelp.ogg' + SEND_SOUND(initiator, sound('sound/effects/adminhelp.ogg')) to_chat(initiator, "- AdminHelp Rejected! -") to_chat(initiator, "Your admin help was rejected. The adminhelp verb has been returned to you so that you may try again.") diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 7f4dd3ebb9..ec1091bb3c 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -84,11 +84,11 @@ var/list/keys = list() for(var/mob/M in GLOB.player_list) keys += M.client - var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in sortKey(keys) + var/client/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in sortKey(keys) if(!selection) to_chat(src, "No keys found.") return - var/mob/M = selection:mob + var/mob/M = selection.mob log_admin("[key_name(usr)] jumped to [key_name(M)]") message_admins("[key_name_admin(usr)] jumped to [key_name_admin(M)]") diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 31fb08da36..db29021463 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -167,7 +167,7 @@ //play the recieving admin the adminhelp sound (if they have them enabled) if(recipient.prefs.toggles & SOUND_ADMINHELP) - recipient << 'sound/effects/adminhelp.ogg' + SEND_SOUND(recipient, sound('sound/effects/adminhelp.ogg')) else if(holder) //sender is an admin but recipient is not. Do BIG RED TEXT @@ -182,7 +182,7 @@ admin_ticket_log(recipient, "PM From [key_name_admin(src)]: [keywordparsedmsg]") //always play non-admin recipients the adminhelp sound - recipient << 'sound/effects/adminhelp.ogg' + SEND_SOUND(recipient, sound('sound/effects/adminhelp.ogg')) //AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn if(config.popup_admin_pm) @@ -301,7 +301,7 @@ window_flash(C, ignorepref = TRUE) //always play non-admin recipients the adminhelp sound - C << 'sound/effects/adminhelp.ogg' + SEND_SOUND(C, 'sound/effects/adminhelp.ogg') C.ircreplyamount = IRCREPLYCOUNT diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm index 97c5d1504d..922e15e8b4 100644 --- a/code/modules/admin/verbs/buildmode.dm +++ b/code/modules/admin/verbs/buildmode.dm @@ -101,6 +101,7 @@ stored = null for(var/button in buttons) qdel(button) + return ..() /datum/buildmode/proc/create_buttons() buttons += new /obj/screen/buildmode/mode(src) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index c45fa13435..66438d1fac 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -316,10 +316,8 @@ GLOBAL_PROTECT(AdminProcCallCount) alert("Wait until the game starts") return if(ishuman(M)) - log_admin("[key_name(src)] has alienized [M.key].") - spawn(0) - M:Alienize() - SSblackbox.add_details("admin_verb","Make Alien") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + INVOKE_ASYNC(M, /mob/living/carbon/human/proc/Alienize) + SSblackbox.add_details("admin_verb","Make Alien") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] made [key_name(M)] into an alien.") message_admins("[key_name_admin(usr)] made [key_name(M)] into an alien.") else @@ -333,10 +331,8 @@ GLOBAL_PROTECT(AdminProcCallCount) alert("Wait until the game starts") return if(ishuman(M)) - log_admin("[key_name(src)] has slimeized [M.key].") - spawn(0) - M:slimeize() - SSblackbox.add_details("admin_verb","Make Slime") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + INVOKE_ASYNC(M, /mob/living/carbon/human/proc/slimeize) + SSblackbox.add_details("admin_verb","Make Slime") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] made [key_name(M)] into a slime.") message_admins("[key_name_admin(usr)] made [key_name(M)] into a slime.") else @@ -461,12 +457,14 @@ GLOBAL_PROTECT(AdminProcCallCount) if(worn) if(istype(worn, /obj/item/device/pda)) - worn:id = id - id.loc = worn + var/obj/item/device/pda/PDA = worn + PDA.id = id + id.forceMove(PDA) else if(istype(worn, /obj/item/weapon/storage/wallet)) - worn:front_id = id - id.loc = worn - worn.update_icon() + var/obj/item/weapon/storage/wallet/W = worn + W.front_id = id + id.forceMove(W) + W.update_icon() else H.equip_to_slot(id,slot_wear_id) @@ -495,9 +493,9 @@ GLOBAL_PROTECT(AdminProcCallCount) qdel(adminmob) SSblackbox.add_details("admin_verb","Assume Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/cmd_admin_areatest() +/client/proc/cmd_admin_areatest(on_station) set category = "Mapping" - set name = "Test areas" + set name = "Test Areas" var/list/areas_all = list() var/list/areas_with_APC = list() @@ -509,11 +507,16 @@ GLOBAL_PROTECT(AdminProcCallCount) var/list/areas_with_camera = list() for(var/area/A in world) - if(!(A.type in areas_all)) + if(on_station) + var/turf/picked = safepick(get_area_turfs(A.type)) + if(picked && (picked.z == ZLEVEL_STATION)) + if(!(A.type in areas_all)) + areas_all.Add(A.type) + else if(!(A.type in areas_all)) areas_all.Add(A.type) for(var/obj/machinery/power/apc/APC in GLOB.apcs_list) - var/area/A = get_area(APC) + var/area/A = APC.area if(!(A.type in areas_with_APC)) areas_with_APC.Add(A.type) @@ -583,6 +586,16 @@ GLOBAL_PROTECT(AdminProcCallCount) for(var/areatype in areas_without_camera) to_chat(world, "* [areatype]") +/client/proc/cmd_admin_areatest_station() + set category = "Mapping" + set name = "Test Areas (STATION Z)" + cmd_admin_areatest(TRUE) + +/client/proc/cmd_admin_areatest_all() + set category = "Mapping" + set name = "Test Areas (ALL)" + cmd_admin_areatest(FALSE) + /client/proc/cmd_admin_dress(mob/living/carbon/human/M in GLOB.mob_list) set category = "Fun" set name = "Select equipment" diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index 15b619f653..a4482154d8 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -78,8 +78,9 @@ continue output += "  [filters[filter]]: [f.len]
    " for (var/device in f) - if (isobj(device)) - output += "    [device] ([device:x],[device:y],[device:z] in area [get_area(device:loc)])
    " + if (istype(device, /atom)) + var/atom/A = device + output += "    [device] ([A.x],[A.y],[A.z] in area [get_area(device)])
    " else output += "    [device]
    " diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm index fe3fe61b3f..9f08eb5e0e 100644 --- a/code/modules/admin/verbs/getlogs.dm +++ b/code/modules/admin/verbs/getlogs.dm @@ -13,7 +13,17 @@ return message_admins("[key_name_admin(src)] accessed file: [path]") - src << ftp(file(path)) + //this is copypasta because making it a proc would mean locking out adminproccalls, + // and that system is buggy enough with false positives that I don't want to risk locking admins out of legit calls. + switch(alert("View (in game), Open (in your system's text editor), or Download file [path]?", "Log File Opening", "View", "Open", "Download")) + if ("View") + src << browse("
    [html_encode(file2text(file(path)))]
    ", list2params(list("window" = "viewfile.[path]"))) + if ("Open") + src << run(file(path)) + if ("Download") + src << ftp(file(path)) + else + return to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.") return @@ -27,7 +37,15 @@ set desc = "Shows server log for this round." if(fexists("[GLOB.world_game_log]")) - src << ftp(GLOB.world_game_log) + switch(alert("View (in game), Open (in your system's text editor), or Download file [GLOB.world_game_log]?", "Log File Opening", "View", "Open", "Download")) + if ("View") + src << browse("
    [html_encode(file2text(GLOB.world_game_log))]
    ", list2params(list("window" = "viewfile.[GLOB.world_game_log]"))) + if ("Open") + src << run(GLOB.world_game_log) + if ("Download") + src << ftp(GLOB.world_game_log) + else + return else to_chat(src, "Server log not found, try using .getserverlog.") return @@ -41,7 +59,15 @@ set desc = "Shows server attack log for this round." if(fexists("[GLOB.world_attack_log]")) - src << ftp(GLOB.world_attack_log) + switch(alert("View (in game), Open (in your system's text editor), or Download file [GLOB.world_attack_log]?", "Log File Opening", "View", "Open", "Download")) + if ("View") + src << browse("
    [html_encode(file2text(GLOB.world_attack_log))]
    ", list2params(list("window" = "viewfile.[GLOB.world_attack_log]"))) + if ("Open") + src << run(GLOB.world_attack_log) + if ("Download") + src << ftp(GLOB.world_attack_log) + else + return else to_chat(src, "Server attack log not found, try using .getserverlog.") return diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index c42eb6a05e..6283201b41 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -34,7 +34,8 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( /client/proc/startSinglo, /client/proc/set_server_fps, //allows you to set the ticklag. /client/proc/cmd_admin_grantfullaccess, - /client/proc/cmd_admin_areatest, + /client/proc/cmd_admin_areatest_all, + /client/proc/cmd_admin_areatest_station, /client/proc/cmd_admin_rejuvenate, /datum/admins/proc/show_traitor_panel, /client/proc/disable_communication, diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 2bf7842c1c..c8df7f56f1 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -20,7 +20,7 @@ Make Gangsters
    Make Wizard (Requires Ghosts)
    Make Nuke Team (Requires Ghosts)
    - Make Centcom Response Team (Requires Ghosts)
    + Make CentCom Response Team (Requires Ghosts)
    Make Abductor Team (Requires Ghosts)
    Make Revenant (Requires Ghost)
    "} @@ -397,7 +397,7 @@ /datum/admins/proc/makeOfficial() var/mission = input("Assign a task for the official", "Assign Task", "Conduct a routine preformance review of [station_name()] and its Captain.") - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered to be a Centcom Official?", "deathsquad") + var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered to be a CentCom Official?", "deathsquad") if(candidates.len) var/mob/dead/observer/chosen_candidate = pick(candidates) @@ -408,7 +408,7 @@ newmob.real_name = newmob.dna.species.random_name(newmob.gender,1) newmob.dna.update_dna_identity() newmob.key = chosen_candidate.key - newmob.mind.assigned_role = "Centcom Official" + newmob.mind.assigned_role = "CentCom Official" newmob.equipOutfit(/datum/outfit/centcom_official) //Assign antag status and the mission @@ -424,12 +424,12 @@ newmob.set_species(/datum/species/human) //Greet the official - to_chat(newmob, "You are a Centcom Official.") + to_chat(newmob, "You are a CentCom Official.") to_chat(newmob, "
    Central Command is sending you to [station_name()] with the task: [mission]") //Logging and cleanup - message_admins("Centcom Official [key_name_admin(newmob)] has spawned with the task: [mission]") - log_game("[key_name(newmob)] has been selected as a Centcom Official") + message_admins("CentCom Official [key_name_admin(newmob)] has spawned with the task: [mission]") + log_game("[key_name(newmob)] has been selected as a CentCom Official") return 1 @@ -437,7 +437,7 @@ // CENTCOM RESPONSE TEAM /datum/admins/proc/makeEmergencyresponseteam() - var/alert = input("Which team should we send?", "Select Response Level") as null|anything in list("Green: Centcom Official", "Blue: Light ERT (No Armoury Access)", "Amber: Full ERT (Armoury Access)", "Red: Elite ERT (Armoury Access + Pulse Weapons)", "Delta: Deathsquad") + var/alert = input("Which team should we send?", "Select Response Level") as null|anything in list("Green: CentCom Official", "Blue: Light ERT (No Armoury Access)", "Amber: Full ERT (Armoury Access)", "Red: Elite ERT (Armoury Access + Pulse Weapons)", "Delta: Deathsquad") if(!alert) return switch(alert) @@ -449,7 +449,7 @@ alert = "Amber" if("Blue: Light ERT (No Armoury Access)") alert = "Blue" - if("Green: Centcom Official") + if("Green: CentCom Official") return makeOfficial() var/teamcheck = input("Maximum size of team? (7 max)", "Select Team Size",4) as null|num if(isnull(teamcheck)) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index eb4c3a5f10..2bac326710 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -30,7 +30,7 @@ for(var/mob/M in GLOB.player_list) if(M.client.prefs.toggles & SOUND_MIDI) - M << admin_sound + SEND_SOUND(M, admin_sound) SSblackbox.add_details("admin_verb","Play Global Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -68,5 +68,5 @@ message_admins("[key_name_admin(src)] stopped all currently playing sounds.") for(var/mob/M in GLOB.player_list) if(M.client) - M << sound(null) + SEND_SOUND(M, sound(null)) SSblackbox.add_details("admin_verb","Stop All Playing Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index a385e68560..bbe1c48b6a 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -33,20 +33,20 @@ prayer_type = "CULTIST PRAYER" deity = "Nar-Sie" - msg = "[bicon(cross)][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [msg]" + msg = "[icon2html(cross, GLOB.admins)][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)]: [msg]" for(var/client/C in GLOB.admins) if(C.prefs.chat_toggles & CHAT_PRAYER) to_chat(C, msg) if(C.prefs.toggles & SOUND_PRAYERS) if(usr.job == "Chaplain") - C << 'sound/effects/pray.ogg' + SEND_SOUND(C, sound('sound/effects/pray.ogg')) to_chat(usr, "Your prayers have been received by the gods.") SSblackbox.add_details("admin_verb","Prayer") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //log_admin("HELP: [key_name(src)]: [msg]") -/proc/Centcomm_announce(text , mob/Sender) +/proc/CentCom_announce(text , mob/Sender) var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN) msg = "CENTCOM:[ADMIN_FULLMONTY(Sender)] [ADMIN_CENTCOM_REPLY(Sender)]: [msg]" to_chat(GLOB.admins, msg) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index de066837ee..1429c700aa 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1208,6 +1208,6 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits if(!message) return - message_admins("[key_name_admin(usr)] triggered a Centcom recall, with the admiral message of: [message]") - log_game("[key_name(usr)] triggered a Centcom recall, with the message of: [message]") + message_admins("[key_name_admin(usr)] triggered a CentCom recall, with the admiral message of: [message]") + log_game("[key_name(usr)] triggered a CentCom recall, with the message of: [message]") SSshuttle.centcom_recall(SSshuttle.emergency.timer, message) diff --git a/code/modules/admin/verbs/reestablish_db_connection.dm b/code/modules/admin/verbs/reestablish_db_connection.dm index 133a39185e..3578e98b1b 100644 --- a/code/modules/admin/verbs/reestablish_db_connection.dm +++ b/code/modules/admin/verbs/reestablish_db_connection.dm @@ -5,7 +5,7 @@ to_chat(usr, "The Database is not enabled!") return - if (SSdbcore && SSdbcore.IsConnected()) + if (SSdbcore.IsConnected()) if (!check_rights(R_DEBUG,0)) alert("The database is already connected! (Only those with +debug can force a reconnection)", "The database is already connected!") return diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index 2853fefcbf..6cd8efdd1d 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -44,7 +44,8 @@ qdel(src) return - if((istype(W, /obj/item/weapon/weldingtool) && W:welding)) + var/obj/item/weapon/weldingtool/WT = W + if((istype(WT) && WT.welding)) if(!status) status = TRUE GLOB.bombers += "[key_name(user)] welded a single tank bomb. Temp: [bombtank.air_contents.temperature-T0C]" @@ -63,7 +64,7 @@ return /obj/item/device/onetankbomb/receive_signal() //This is mainly called by the sensor through sense() to the holder, and from the holder to here. - visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*") + visible_message("[icon2html(src, viewers(src))] *beep* *beep*", "*beep* *beep*") sleep(10) if(!src) return diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm index b454cbacfb..180cb55db6 100644 --- a/code/modules/assembly/health.dm +++ b/code/modules/assembly/health.dm @@ -59,7 +59,7 @@ health_scan = M.health if(health_scan <= alarm_health) pulse() - audible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*") + audible_message("[icon2html(src, hearers(src))] *beep* *beep*", "*beep* *beep*") toggle_scan() return return diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index be1659546f..c196e984a2 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -99,7 +99,7 @@ if(!secured || !on || next_activate > world.time) return FALSE pulse(0) - audible_message("[bicon(src)] *beep* *beep*", null, 3) + audible_message("[icon2html(src, hearers(src))] *beep* *beep*", null, 3) next_activate = world.time + 30 /obj/item/device/assembly/infra/interact(mob/user)//TODO: change this this to the wire control panel diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index 9cf534f975..556979070d 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -56,7 +56,7 @@ if(!secured || next_activate > world.time) return 0 pulse(0) - audible_message("[bicon(src)] *beep* *beep*", null, 3) + audible_message("[icon2html(src, hearers(src))] *beep* *beep*", null, 3) next_activate = world.time + 30 diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index d827abb5e1..7c8efb14d5 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -22,8 +22,7 @@ /obj/item/device/assembly/signaler/Destroy() - if(SSradio) - SSradio.remove_object(src,frequency) + SSradio.remove_object(src,frequency) return ..() /obj/item/device/assembly/signaler/activate() @@ -144,7 +143,7 @@ Code: if(!(src.wires & WIRE_RADIO_RECEIVE)) return 0 pulse(1) - audible_message("[bicon(src)] *beep* *beep*", null, 1) + audible_message("[icon2html(src, hearers(src))] *beep* *beep*", null, 1) return diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index 8938ecbe9d..9a959bc544 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -45,7 +45,7 @@ if(!secured || next_activate > world.time) return FALSE pulse(0) - audible_message("[bicon(src)] *beep* *beep*", null, 3) + audible_message("[icon2html(src, hearers(src))] *beep* *beep*", null, 3) if(loop) timing = 1 update_icon() diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index e48059a066..4371bd5986 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -152,8 +152,7 @@ update_icon() /obj/machinery/airalarm/Destroy() - if(SSradio) - SSradio.remove_object(src, frequency) + SSradio.remove_object(src, frequency) qdel(wires) wires = null return ..() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm index aa13433376..1ef52cc787 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm @@ -37,8 +37,7 @@ Acts like a normal vent, but has an input AND output. icon_state = "dpvent_map_on" /obj/machinery/atmospherics/components/binary/dp_vent_pump/Destroy() - if(SSradio) - SSradio.remove_object(src, frequency) + SSradio.remove_object(src, frequency) return ..() /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index e52c4bee3d..d2e6a3ae72 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -22,8 +22,7 @@ Passive gate is similar to the regular pump except: var/datum/radio_frequency/radio_connection /obj/machinery/atmospherics/components/binary/passive_gate/Destroy() - if(SSradio) - SSradio.remove_object(src,frequency) + SSradio.remove_object(src,frequency) return ..() /obj/machinery/atmospherics/components/binary/passive_gate/update_icon_nopipes() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 77f98ac4df..0ec1b57a2e 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -30,8 +30,7 @@ Thus, the two variables affect pump operation are set in New(): on = TRUE /obj/machinery/atmospherics/components/binary/pump/Destroy() - if(SSradio) - SSradio.remove_object(src,frequency) + SSradio.remove_object(src,frequency) if(radio_connection) radio_connection = null return ..() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index b9debc4d43..4d3cf733fb 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -27,8 +27,7 @@ Thus, the two variables affect pump operation are set in New(): var/datum/radio_frequency/radio_connection /obj/machinery/atmospherics/components/binary/volume_pump/Destroy() - if(SSradio) - SSradio.remove_object(src,frequency) + SSradio.remove_object(src,frequency) return ..() /obj/machinery/atmospherics/components/binary/volume_pump/on diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 25f80352a4..87edfe8d11 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -28,8 +28,7 @@ radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_ATMOSIA) /obj/machinery/atmospherics/components/trinary/filter/Destroy() - if(SSradio) - SSradio.remove_object(src,frequency) + SSradio.remove_object(src,frequency) return ..() /obj/machinery/atmospherics/components/trinary/filter/update_icon() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm index 763c405429..0bf467f234 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -19,8 +19,7 @@ layer = GAS_SCRUBBER_LAYER /obj/machinery/atmospherics/components/unary/outlet_injector/Destroy() - if(SSradio) - SSradio.remove_object(src,frequency) + SSradio.remove_object(src,frequency) return ..() /obj/machinery/atmospherics/components/unary/outlet_injector/on 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 b19569be26..69560bc18b 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -56,8 +56,7 @@ A.air_vent_names -= id_tag A.air_vent_info -= id_tag - if(SSradio) - SSradio.remove_object(src,frequency) + SSradio.remove_object(src,frequency) radio_connection = null return ..() 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 e76856bb66..113d029c0b 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -49,8 +49,7 @@ A.air_scrub_names -= id_tag A.air_scrub_info -= id_tag - if(SSradio) - SSradio.remove_object(src,frequency) + SSradio.remove_object(src,frequency) radio_connection = null for(var/I in adjacent_turfs) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index d733dfc3fb..a45536430a 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -189,8 +189,9 @@ #define CONNECTED 2 #define EMPTY 4 #define LOW 8 -#define FULL 16 -#define DANGER 32 +#define MEDIUM 16 +#define FULL 32 +#define DANGER 64 /obj/machinery/portable_atmospherics/canister/update_icon() if(stat & BROKEN) cut_overlays() @@ -207,9 +208,11 @@ var/pressure = air_contents.return_pressure() if(pressure < 10) update |= EMPTY - else if(pressure < ONE_ATMOSPHERE) + else if(pressure < 5 * ONE_ATMOSPHERE) update |= LOW - else if(pressure < 15 * ONE_ATMOSPHERE) + else if(pressure < 10 * ONE_ATMOSPHERE) + update |= MEDIUM + else if(pressure < 40 * ONE_ATMOSPHERE) update |= FULL else update |= DANGER @@ -222,9 +225,9 @@ add_overlay("can-open") if(update & CONNECTED) add_overlay("can-connector") - if(update & EMPTY) + if(update & LOW) add_overlay("can-o0") - else if(update & LOW) + else if(update & MEDIUM) add_overlay("can-o1") else if(update & FULL) add_overlay("can-o2") @@ -234,6 +237,7 @@ #undef CONNECTED #undef EMPTY #undef LOW +#undef MEDIUM #undef FULL #undef DANGER diff --git a/code/modules/awaymissions/mission_code/moonoutpost19.dm b/code/modules/awaymissions/mission_code/moonoutpost19.dm index 0f30a5e202..20973d242f 100644 --- a/code/modules/awaymissions/mission_code/moonoutpost19.dm +++ b/code/modules/awaymissions/mission_code/moonoutpost19.dm @@ -66,7 +66,7 @@ /obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/log/gerald name = "Personal Log - Gerald Rosswell" - info = "Personal Log for Research Director Gerald Rosswell

    Entry One - 17/05/2554:
    You know, I can't believe I took this position so suddenly. I saw that corporate needed a research director for one of it's outposts and thought it would be a cakewalk, there isn't going to be a lot of research to be done on a tiny outpost. Mainly just running scans on the gas giant we are orbiting or some basic RnD. However, they conveniently forgot to tell me that me and my science staff would have to pull double duty as medical staff and that there is no one higher up on the chain of command here, so I get to pull triple duty as acting captain as well! This shit is probably allowed in some 3 point fine print buried underneath the literally thousands of pages of contracts. Well, at least the research will be easy work.

    Entry Two - 25/05/2554:
    Well, we all expected it at the outpost, CentComm has decided to completely change what research we are doing. They've decided that we should be research the species known as 'xenomporphs'. They announced this change 4 days ago and along with it, sadly, the termination of our current science staff barring me. Not to mention the constant noise made by the construction detail they sent to staple on an xenobiology lab ensuring no one has been able to sleep decently ever since they announced the shift. To make matters worse our current security guard actually died of a heart attack today. Just goes to show that 75 year old men shouldn't be security guards. Still can't believe that they decided to do this major change less than a month after the outpost was established.

    Entry Three - 27/05/2554:
    The new security guard arrived today. Apparently transferred here from the research station that also is orbiting the gas giant. He seems to be rather angry about his transfer. Considering the rumors I've heard about the research station he's probably caught off guard by the fact that Steve hasn't tried to force an IED down his throat.

    Entry Four - 06/06/2554:
    My requests for additional security and containment measures for the 'xenomorph' has been denied. Does Central Command not notice how dangerous these creatures are? The only thing keeping them in is a force field, a minor problem with the power grid and the entire hive is loose. What would stop them then, the lone security guard with a dinky little taser? Kenneth can barely handle a short-tempered engineer. We are under equipped and under staffed, we are inevitably going to be destroyed unless we get the equipment and staff we need.

    Entry Five - 10/06/2554:
    Cunningham got a good look at the xenomorph in containment. He was frightened for the rest of the day, rather amusing if it wasn't for the fact that we are all trapped on this scrap heap with naught but a force field keeping those xenomorphs in.

    Entry Six - 17/06/2554:
    The reactions from the specimens today has shown that they possess strange mental properties. Mark hypothesizes that they possibly have a sort of hive mind, while nothing is certain this would explain how xenomorphs seem to have vastly increased intellect when a 'queen' is present. Of course, to test this hypothesis would require many complicated procedures which we will not be able to undertake. But we do not know the full extend of the xenomorph mind, it may or may not be able to find a way to circumvent our containment system. I will resend my request for additional security measures along with this new found information." + info = "Personal Log for Research Director Gerald Rosswell

    Entry One - 17/05/2554:
    You know, I can't believe I took this position so suddenly. I saw that corporate needed a research director for one of it's outposts and thought it would be a cakewalk, there isn't going to be a lot of research to be done on a tiny outpost. Mainly just running scans on the gas giant we are orbiting or some basic RnD. However, they conveniently forgot to tell me that me and my science staff would have to pull double duty as medical staff and that there is no one higher up on the chain of command here, so I get to pull triple duty as acting captain as well! This shit is probably allowed in some 3 point fine print buried underneath the literally thousands of pages of contracts. Well, at least the research will be easy work.

    Entry Two - 25/05/2554:
    Well, we all expected it at the outpost, CentCom has decided to completely change what research we are doing. They've decided that we should be research the species known as 'xenomporphs'. They announced this change 4 days ago and along with it, sadly, the termination of our current science staff barring me. Not to mention the constant noise made by the construction detail they sent to staple on an xenobiology lab ensuring no one has been able to sleep decently ever since they announced the shift. To make matters worse our current security guard actually died of a heart attack today. Just goes to show that 75 year old men shouldn't be security guards. Still can't believe that they decided to do this major change less than a month after the outpost was established.

    Entry Three - 27/05/2554:
    The new security guard arrived today. Apparently transferred here from the research station that also is orbiting the gas giant. He seems to be rather angry about his transfer. Considering the rumors I've heard about the research station he's probably caught off guard by the fact that Steve hasn't tried to force an IED down his throat.

    Entry Four - 06/06/2554:
    My requests for additional security and containment measures for the 'xenomorph' has been denied. Does Central Command not notice how dangerous these creatures are? The only thing keeping them in is a force field, a minor problem with the power grid and the entire hive is loose. What would stop them then, the lone security guard with a dinky little taser? Kenneth can barely handle a short-tempered engineer. We are under equipped and under staffed, we are inevitably going to be destroyed unless we get the equipment and staff we need.

    Entry Five - 10/06/2554:
    Cunningham got a good look at the xenomorph in containment. He was frightened for the rest of the day, rather amusing if it wasn't for the fact that we are all trapped on this scrap heap with naught but a force field keeping those xenomorphs in.

    Entry Six - 17/06/2554:
    The reactions from the specimens today has shown that they possess strange mental properties. Mark hypothesizes that they possibly have a sort of hive mind, while nothing is certain this would explain how xenomorphs seem to have vastly increased intellect when a 'queen' is present. Of course, to test this hypothesis would require many complicated procedures which we will not be able to undertake. But we do not know the full extend of the xenomorph mind, it may or may not be able to find a way to circumvent our containment system. I will resend my request for additional security measures along with this new found information." /obj/item/weapon/paper/fluff/awaymissions/moonoutpost19/food_specials name = "Specials This Week" diff --git a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm index e21f9b7ed2..7926cfc34d 100644 --- a/code/modules/cargo/console.dm +++ b/code/modules/cargo/console.dm @@ -122,7 +122,7 @@ return else SSshuttle.shuttle_loan.loan_shuttle() - say("The supply shuttle has been loaned to Centcom.") + say("The supply shuttle has been loaned to CentCom.") . = TRUE if("add") var/id = text2path(params["id"]) @@ -145,7 +145,7 @@ var/reason = "" if(requestonly) - reason = input("Reason:", name, "") as text|null + reason = stripped_input("Reason:", name, "") if(isnull(reason) || ..()) return diff --git a/code/modules/cargo/console.dm.rej b/code/modules/cargo/console.dm.rej new file mode 100644 index 0000000000..e8798f179a --- /dev/null +++ b/code/modules/cargo/console.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/cargo/console.dm b/code/modules/cargo/console.dm (rejected hunks) +@@ -145,7 +145,7 @@ + + var/reason = "" + if(requestonly) +- reason = stripped_input("Reason:", name, "") as text|null ++ reason = stripped_input("Reason:", name, "") + if(isnull(reason) || ..()) + return + diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index bca290c4db..8a36f178a4 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -1,5 +1,5 @@ /* How it works: - The shuttle arrives at Centcom dock and calls sell(), which recursively loops through all the shuttle contents that are unanchored. + The shuttle arrives at CentCom dock and calls sell(), which recursively loops through all the shuttle contents that are unanchored. The loop only checks contents of storage types, see supply.dm shuttle code. Each object in the loop is checked for applies_to() of various export datums, except the invalid ones. diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 81fecc6dda..4f576dd3e7 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -138,6 +138,13 @@ You can set verify to TRUE if you want send() to sleep until the client has the /proc/register_asset(var/asset_name, var/asset) SSassets.cache[asset_name] = asset +//Generated names do not include file extention. +//Used mainly for code that deals with assets in a generic way +//The same asset will always lead to the same asset name +/proc/generate_asset_name(var/file) + return "asset.[md5(fcopy_rsc(file))]" + + //These datums are used to populate the asset cache, the proc "register()" does this. //all of our asset datums, used for referring to these later @@ -170,6 +177,33 @@ GLOBAL_LIST_EMPTY(asset_datums) send_asset_list(client,assets,verify) +//Generates assets based on iconstates of a single icon +/datum/asset/simple/icon_states + var/icon + var/direction = SOUTH + var/frame = 1 + var/movement_states = FALSE + + var/prefix = "default" //asset_name = "[prefix].[icon_state_name].png" + var/generic_icon_names = FALSE //generate icon filenames using generate_asset_name() instead the above format + + verify = FALSE + +/datum/asset/simple/icon_states/register() + for(var/icon_state_name in icon_states(icon)) + var/asset = icon(icon, icon_state_name, direction, frame, movement_states) + if (!asset) + continue + asset = fcopy_rsc(asset) //dedupe + var/asset_name = sanitize_filename("[prefix].[icon_state_name].png") + if (generic_icon_names) + asset_name = "[generate_asset_name(asset)].png" + + assets[asset_name] = asset + + ..() + + //DEFINITIONS FOR ASSET DATUMS START HERE. /datum/asset/simple/tgui @@ -306,3 +340,14 @@ GLOBAL_LIST_EMPTY(asset_datums) for(var/path in typesof(/datum/html_interface)) var/datum/html_interface/hi = new path() hi.registerResources() + +//this exists purely to avoid meta by pre-loading all language icons. +/datum/asset/language/register() + for(var/path in typesof(/datum/language)) + set waitfor = FALSE + var/datum/language/L = new path () + L.get_icon() + +/datum/asset/simple/icon_states/emojis + icon = 'icons/emoji.dmi' + generic_icon_names = TRUE diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 4455af7ca9..637c3e2bec 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -72,9 +72,9 @@ to_chat(src, "Your previous action was ignored because you've done too many in a second") return - //Logs all hrefs - GLOB.world_href_log << "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
    " - + //Logs all hrefs, except chat pings + if(!(href_list["_src_"] == "chat" && href_list["proc"] == "ping" && LAZYLEN(href_list) == 2)) + WRITE_FILE(GLOB.world_href_log, "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
    ") // Admin PM if(href_list["priv_msg"]) cmd_admin_pm(href_list["priv_msg"],null) @@ -642,7 +642,7 @@ GLOBAL_LIST(external_rsc_urls) ) spawn (10) //removing this spawn causes all clients to not get verbs. //Precache the client with all other assets slowly, so as to not block other browse() calls - getFilesSlow(src, SSassets.cache, register_asset = FALSE) + getFilesSlow(src, SSassets.preload, register_asset = FALSE) //Hook, override it to run code when dir changes diff --git a/code/modules/client/client_procs.dm.rej b/code/modules/client/client_procs.dm.rej new file mode 100644 index 0000000000..2b656938c4 --- /dev/null +++ b/code/modules/client/client_procs.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm (rejected hunks) +@@ -73,7 +73,7 @@ + return + + //Logs all hrefs, except chat pings +- if(href_list["proc"] != "ping") ++ if(!(href_list["_src_"] == "chat" && href_list["proc"] == "ping" && LAZYLEN(href_list) == 2)) + WRITE_FILE(GLOB.world_href_log, "[time_stamp(show_ds = TRUE)] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
    ") + + // Admin PM diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 484e09c5ad..4c23db3f86 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -19,8 +19,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) //game-preferences var/lastchangelog = "" //Saved changlog filesize to detect if there was a change var/ooccolor = null - var/enable_tips = TRUE - var/tip_delay = 500 //tip delay in milliseconds + var/enable_tips = TRUE + var/tip_delay = 500 //tip delay in milliseconds //Antag preferences var/list/be_special = list() //Special role selection @@ -30,7 +30,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/UI_style = "Midnight" - var/buttons_locked = FALSE + var/buttons_locked = FALSE var/hotkeys = FALSE var/tgui_fancy = TRUE var/tgui_lock = TRUE @@ -130,7 +130,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) "womb_cum_rate" = CUM_RATE, "womb_cum_mult" = CUM_RATE_MULT, "womb_efficiency" = CUM_EFFICIENCY, - "womb_fluid" = "femcum" + "womb_fluid" = "femcum", + "flavor_text" = "" )//MAKE SURE TO UPDATE THE LIST IN MOBS.DM IF YOU'RE GOING TO ADD TO THIS LIST, OTHERWISE THINGS MIGHT GET FUCKEY var/list/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity") @@ -175,7 +176,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) //citadel code var/arousable = TRUE //Allows players to disable arousal from the character creation menu - var/flavor_text = "" /datum/preferences/New(client/C) parent = C @@ -279,7 +279,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "

    General Settings

    " dat += "UI Style: [UI_style]
    " dat += "Keybindings: [(hotkeys) ? "Hotkeys" : "Default"]
    " - dat += "Action Buttons: [(buttons_locked) ? "Locked In Place" : "Unlocked"]
    " + dat += "Action Buttons: [(buttons_locked) ? "Locked In Place" : "Unlocked"]
    " dat += "tgui Style: [(tgui_fancy) ? "Fancy" : "No Frills"]
    " dat += "tgui Monitors: [(tgui_lock) ? "Primary" : "All"]
    " dat += "Window Flashing: [(windowflashing) ? "Yes" : "No"]
    " @@ -394,13 +394,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += " {{#if data.centcom_access}} - +
    " dat += "

    " dat += "Set Flavor Text
    " - if(lentext(flavor_text) <= 40) - if(!lentext(flavor_text)) + if(lentext(features["flavor_text"]) <= 40) + if(!lentext(features["flavor_text"])) dat += "\[...\]" else - dat += "[flavor_text]" + dat += "[features["flavor_text"]]" else - dat += "[TextPreview(flavor_text)]...
    " + dat += "[TextPreview(features["flavor_text"])]...
    " if(config.mutant_races)//really don't need this check, but fuck un-tabbing all those lines dat += "

    Body

    " dat += "Gender: [gender == MALE ? "Male" : "Female"]
    " @@ -916,11 +916,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN) if("flavor_text") - var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(flavor_text)) as message + var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(features["flavor_text"])) as message if(msg != null) msg = copytext(msg, 1, MAX_MESSAGE_LEN) msg = html_encode(msg) - flavor_text = msg + features["flavor_text"] = msg if("metadata") var/new_metadata = input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , metadata) as message|null @@ -1499,8 +1499,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("hotkeys") hotkeys = !hotkeys - if("action_buttons") - buttons_locked = !buttons_locked + if("action_buttons") + buttons_locked = !buttons_locked if("tgui_fancy") tgui_fancy = !tgui_fancy if("tgui_lock") @@ -1628,7 +1628,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.backbag = backbag - character.dna.features = features.Copy() + character.dna.features = features.Copy() //Flavor text is now a DNA feature character.dna.real_name = character.real_name var/datum/species/chosen_species if(pref_species != /datum/species/human && config.mutant_races) @@ -1639,10 +1639,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) //citadel code character.give_genitals() - character.flavor_text = flavor_text + character.flavor_text = features["flavor_text"] //Let's update their flavor_text at least initially character.canbearoused = arousable if(icon_updates) character.update_body() character.update_hair() character.update_body_parts() + character.update_genitals() diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index c52767f1d9..244afc69f3 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -226,34 +226,34 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car return 0 S.cd = "/" - S["version"] << SAVEFILE_VERSION_MAX //updates (or failing that the sanity checks) will ensure data is not invalid at load. Assume up-to-date + WRITE_FILE(S["version"] , SAVEFILE_VERSION_MAX) //updates (or failing that the sanity checks) will ensure data is not invalid at load. Assume up-to-date //general preferences - S["ooccolor"] << ooccolor - S["lastchangelog"] << lastchangelog - S["UI_style"] << UI_style - S["hotkeys"] << hotkeys - S["tgui_fancy"] << tgui_fancy - S["tgui_lock"] << tgui_lock - S["windowflash"] << windowflashing - S["be_special"] << be_special - S["default_slot"] << default_slot - S["toggles"] << toggles - S["chat_toggles"] << chat_toggles - S["ghost_form"] << ghost_form - S["ghost_orbit"] << ghost_orbit - S["ghost_accs"] << ghost_accs - S["ghost_others"] << ghost_others - S["preferred_map"] << preferred_map - S["ignoring"] << ignoring - S["ghost_hud"] << ghost_hud - S["inquisitive_ghost"] << inquisitive_ghost - S["uses_glasses_colour"]<< uses_glasses_colour - S["clientfps"] << clientfps - S["parallax"] << parallax - S["menuoptions"] << menuoptions - S["enable_tips"] << enable_tips - S["tip_delay"] << tip_delay + WRITE_FILE(S["ooccolor"], ooccolor) + WRITE_FILE(S["lastchangelog"], lastchangelog) + WRITE_FILE(S["UI_style"], UI_style) + WRITE_FILE(S["hotkeys"], hotkeys) + WRITE_FILE(S["tgui_fancy"], tgui_fancy) + WRITE_FILE(S["tgui_lock"], tgui_lock) + WRITE_FILE(S["windowflash"], windowflashing) + WRITE_FILE(S["be_special"], be_special) + WRITE_FILE(S["default_slot"], default_slot) + WRITE_FILE(S["toggles"], toggles) + WRITE_FILE(S["chat_toggles"], chat_toggles) + WRITE_FILE(S["ghost_form"], ghost_form) + WRITE_FILE(S["ghost_orbit"], ghost_orbit) + WRITE_FILE(S["ghost_accs"], ghost_accs) + WRITE_FILE(S["ghost_others"], ghost_others) + WRITE_FILE(S["preferred_map"], preferred_map) + WRITE_FILE(S["ignoring"], ignoring) + WRITE_FILE(S["ghost_hud"], ghost_hud) + WRITE_FILE(S["inquisitive_ghost"], inquisitive_ghost) + WRITE_FILE(S["uses_glasses_colour"], uses_glasses_colour) + WRITE_FILE(S["clientfps"], clientfps) + WRITE_FILE(S["parallax"], parallax) + WRITE_FILE(S["menuoptions"], menuoptions) + WRITE_FILE(S["enable_tips"], enable_tips) + WRITE_FILE(S["tip_delay"], tip_delay) //citadel code S["arousable"] << arousable @@ -273,7 +273,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car slot = sanitize_integer(slot, 1, max_save_slots, initial(default_slot)) if(slot != default_slot) default_slot = slot - S["default_slot"] << slot + WRITE_FILE(S["default_slot"] , slot) S.cd = "/character[slot]" var/needs_update = savefile_needs_update(S) @@ -292,7 +292,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car pref_species = new rando_race() if(!S["features["mcolor"]"] || S["features["mcolor"]"] == "#000") - S["features["mcolor"]"] << "#FFF" + WRITE_FILE(S["features["mcolor"]"] , "#FFF") //Character S["OOC_Notes"] >> metadata @@ -342,9 +342,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["job_engsec_med"] >> job_engsec_med S["job_engsec_low"] >> job_engsec_low - //Citadel code - S["flavor_text"] >> flavor_text S["feature_exhibitionist"] >> features["exhibitionist"] S["feature_mcolor2"] >> features["mcolor2"] S["feature_mcolor3"] >> features["mcolor3"] @@ -382,6 +380,17 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_vag_color"] >> features["vag_color"] //womb features S["feature_has_womb"] >> features["has_womb"] + //flavor text + //Let's make our players NOT cry desperately as we wipe their savefiles of their special snowflake texts: + if((S["flavor_text"] != "") && (S["flavor_text"] != null) && S["flavor_text"]) //If old text isn't null and isn't "" but still exists. + S["flavor_text"] >> features["flavor_text"] //Load old flavortext as current dna-based flavortext + + S["feature_flavor_text"] << features["flavor_text"] //Save it in our new type of flavor-text + S["flavor_text"] << "" //Remove old flavortext, completing the cut-and-paste into the new format. + + else //We have no old flavortext, default to new + S["feature_flavor_text"] >> features["flavor_text"] + //try to fix any outdated data if necessary if(needs_update >= 0) @@ -441,7 +450,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car job_engsec_low = sanitize_integer(job_engsec_low, 0, 65535, initial(job_engsec_low)) //Citadel - flavor_text = sanitize_text(flavor_text, initial(flavor_text)) + features["flavor_text"] = sanitize_text(features["flavor_text"], initial(features["flavor_text"])) if(!features["mcolor2"] || features["mcolor"] == "#000") features["mcolor2"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F") if(!features["mcolor3"] || features["mcolor"] == "#000") @@ -461,56 +470,55 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["version"] << SAVEFILE_VERSION_MAX //load_character will sanitize any bad data, so assume up-to-date. //Character - S["OOC_Notes"] << metadata - S["real_name"] << real_name - S["name_is_always_random"] << be_random_name - S["body_is_always_random"] << be_random_body - S["gender"] << gender - S["age"] << age - S["hair_color"] << hair_color - S["facial_hair_color"] << facial_hair_color - S["eye_color"] << eye_color - S["skin_tone"] << skin_tone - S["hair_style_name"] << hair_style - S["facial_style_name"] << facial_hair_style - S["underwear"] << underwear - S["undershirt"] << undershirt - S["socks"] << socks - S["backbag"] << backbag - S["uplink_loc"] << uplink_spawn_loc - S["species"] << pref_species.id - S["feature_mcolor"] << features["mcolor"] - S["feature_lizard_tail"] << features["tail_lizard"] - S["feature_human_tail"] << features["tail_human"] - S["feature_lizard_snout"] << features["snout"] - S["feature_lizard_horns"] << features["horns"] - S["feature_human_ears"] << features["ears"] - S["feature_lizard_frills"] << features["frills"] - S["feature_lizard_spines"] << features["spines"] - S["feature_lizard_body_markings"] << features["body_markings"] - S["feature_lizard_legs"] << features["legs"] - S["clown_name"] << custom_names["clown"] - S["mime_name"] << custom_names["mime"] - S["ai_name"] << custom_names["ai"] - S["cyborg_name"] << custom_names["cyborg"] - S["religion_name"] << custom_names["religion"] - S["deity_name"] << custom_names["deity"] - S["prefered_security_department"] << prefered_security_department + WRITE_FILE(S["OOC_Notes"] , metadata) + WRITE_FILE(S["real_name"] , real_name) + WRITE_FILE(S["name_is_always_random"] , be_random_name) + WRITE_FILE(S["body_is_always_random"] , be_random_body) + WRITE_FILE(S["gender"] , gender) + WRITE_FILE(S["age"] , age) + WRITE_FILE(S["hair_color"] , hair_color) + WRITE_FILE(S["facial_hair_color"] , facial_hair_color) + WRITE_FILE(S["eye_color"] , eye_color) + WRITE_FILE(S["skin_tone"] , skin_tone) + WRITE_FILE(S["hair_style_name"] , hair_style) + WRITE_FILE(S["facial_style_name"] , facial_hair_style) + WRITE_FILE(S["underwear"] , underwear) + WRITE_FILE(S["undershirt"] , undershirt) + WRITE_FILE(S["socks"] , socks) + WRITE_FILE(S["backbag"] , backbag) + WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc) + WRITE_FILE(S["species"] , pref_species.id) + WRITE_FILE(S["feature_mcolor"] , features["mcolor"]) + WRITE_FILE(S["feature_lizard_tail"] , features["tail_lizard"]) + WRITE_FILE(S["feature_human_tail"] , features["tail_human"]) + WRITE_FILE(S["feature_lizard_snout"] , features["snout"]) + WRITE_FILE(S["feature_lizard_horns"] , features["horns"]) + WRITE_FILE(S["feature_human_ears"] , features["ears"]) + WRITE_FILE(S["feature_lizard_frills"] , features["frills"]) + WRITE_FILE(S["feature_lizard_spines"] , features["spines"]) + WRITE_FILE(S["feature_lizard_body_markings"] , features["body_markings"]) + WRITE_FILE(S["feature_lizard_legs"] , features["legs"]) + WRITE_FILE(S["clown_name"] , custom_names["clown"]) + WRITE_FILE(S["mime_name"] , custom_names["mime"]) + WRITE_FILE(S["ai_name"] , custom_names["ai"]) + WRITE_FILE(S["cyborg_name"] , custom_names["cyborg"]) + WRITE_FILE(S["religion_name"] , custom_names["religion"]) + WRITE_FILE(S["deity_name"] , custom_names["deity"]) + WRITE_FILE(S["prefered_security_department"] , prefered_security_department) //Jobs - S["joblessrole"] << joblessrole - S["job_civilian_high"] << job_civilian_high - S["job_civilian_med"] << job_civilian_med - S["job_civilian_low"] << job_civilian_low - S["job_medsci_high"] << job_medsci_high - S["job_medsci_med"] << job_medsci_med - S["job_medsci_low"] << job_medsci_low - S["job_engsec_high"] << job_engsec_high - S["job_engsec_med"] << job_engsec_med - S["job_engsec_low"] << job_engsec_low + WRITE_FILE(S["joblessrole"] , joblessrole) + WRITE_FILE(S["job_civilian_high"] , job_civilian_high) + WRITE_FILE(S["job_civilian_med"] , job_civilian_med) + WRITE_FILE(S["job_civilian_low"] , job_civilian_low) + WRITE_FILE(S["job_medsci_high"] , job_medsci_high) + WRITE_FILE(S["job_medsci_med"] , job_medsci_med) + WRITE_FILE(S["job_medsci_low"] , job_medsci_low) + WRITE_FILE(S["job_engsec_high"] , job_engsec_high) + WRITE_FILE(S["job_engsec_med"] , job_engsec_med) + WRITE_FILE(S["job_engsec_low"] , job_engsec_low) //Citadel - S["flavor_text"] << flavor_text S["feature_exhibitionist"] << features["exhibitionist"] S["feature_mcolor2"] << features["mcolor2"] S["feature_mcolor3"] << features["mcolor3"] @@ -548,7 +556,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_vag_color"] << features["vag_color"] //womb features S["feature_has_womb"] << features["has_womb"] - + //flavor text + S["feature_flavor_text"] << features["flavor_text"] return 1 #undef SAVEFILE_VERSION_MAX diff --git a/code/modules/client/preferences_savefile.dm.rej b/code/modules/client/preferences_savefile.dm.rej new file mode 100644 index 0000000000..3cdbf2cd44 --- /dev/null +++ b/code/modules/client/preferences_savefile.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm (rejected hunks) +@@ -193,7 +193,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car + return 0 + S.cd = "/" + +- WRITE_FILE(S["version"] , SAVEFILE_VERSION_MAX //updates (or failing that the sanity checks) will ensure data is not invalid at load. Assume up-to-date) ++ WRITE_FILE(S["version"] , SAVEFILE_VERSION_MAX) //updates (or failing that the sanity checks) will ensure data is not invalid at load. Assume up-to-date + + //general preferences + WRITE_FILE(S["ooccolor"], ooccolor) diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index d56b6e0619..1d04964a8b 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -229,7 +229,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggleprayersounds)() set name = "Stop Sounds" set category = "Preferences" set desc = "Stop Current Sounds" - usr << sound(null) + SEND_SOUND(usr, sound(null)) SSblackbox.add_details("preferences_verb","Stop Self Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index f082c4971c..cd0f893fa6 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -9,9 +9,19 @@ if(!mob) return - if(IsGuestKey(key)) - to_chat(src, "Guests may not use OOC.") - return + if(!holder) + if(!GLOB.ooc_allowed) + to_chat(src, "OOC is globally muted.") + return + if(!GLOB.dooc_allowed && (mob.stat == DEAD)) + to_chat(usr, "OOC for dead mobs has been turned off.") + return + if(prefs.muted & MUTE_OOC) + to_chat(src, "You cannot use OOC (muted).") + return + if(jobban_isbanned(src.mob, "OOC")) + to_chat(src, "You have been banned from OOC.") + return msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN) var/raw_msg = msg @@ -25,24 +35,7 @@ if(alert("Your message \"[raw_msg]\" looks like it was meant for in game communication, say it in OOC?", "Meant for OOC?", "No", "Yes") != "Yes") return - if(!(prefs.chat_toggles & CHAT_OOC)) - to_chat(src, "You have OOC muted.") - return - if(!holder) - if(!GLOB.ooc_allowed) - to_chat(src, "OOC is globally muted.") - return - if(!GLOB.dooc_allowed && (mob.stat == DEAD)) - to_chat(usr, "OOC for dead mobs has been turned off.") - return - if(prefs.muted & MUTE_OOC) - to_chat(src, "You cannot use OOC (muted).") - return - if(src.mob) - if(jobban_isbanned(src.mob, "OOC")) - to_chat(src, "You have been banned from OOC.") - return if(handle_spam_prevention(msg,MUTE_OOC)) return if(findtext(msg, "byond://")) @@ -51,13 +44,18 @@ message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") return + if(!(prefs.chat_toggles & CHAT_OOC)) + to_chat(src, "You have OOC muted.") + return + + log_talk(mob,"[key_name(src)] : [raw_msg]",LOGOOC) mob.log_message("[key]: [raw_msg]", INDIVIDUAL_OOC_LOG) var/keyname = key if(prefs.unlock_content) if(prefs.toggles & MEMBER_PUBLIC) - keyname = "[bicon(icon('icons/member_content.dmi', "blag"))][keyname]" + keyname = "[icon2html('icons/member_content.dmi', world, "blag")][keyname]" for(var/client/C in GLOB.clients) if(C.prefs.chat_toggles & CHAT_OOC) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 3c32a49e7d..bf34ee9f18 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -253,6 +253,7 @@ BLIND // can't see anything slot_flags = SLOT_HEAD var/blockTracking = 0 //For AI tracking var/can_toggle = null + dynamic_hair_suffix = "+generic" /obj/item/clothing/head/Initialize() . = ..() @@ -483,6 +484,7 @@ BLIND // can't see anything equip_delay_other = 50 flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH resistance_flags = 0 + dog_fashion = null /obj/item/clothing/suit/space name = "space suit" @@ -537,13 +539,15 @@ BLIND // can't see anything if(accessory_overlay) . += accessory_overlay -/obj/item/clothing/under/attackby(obj/item/W, mob/user, params) - if((has_sensor == BROKEN_SENSORS) && istype(W, /obj/item/stack/cable_coil)) - var/obj/item/stack/cable_coil/C = W +/obj/item/clothing/under/attackby(obj/item/I, mob/user, params) + if((has_sensor == BROKEN_SENSORS) && istype(I, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/C = I C.use(1) has_sensor = HAS_SENSORS to_chat(user,"You repair the suit sensors on [src] with [C].") return 1 + if(!attach_accessory(I, user)) + return ..() /obj/item/clothing/under/update_clothes_damaged_state(damaging = TRUE) ..() @@ -590,10 +594,6 @@ BLIND // can't see anything ..() -/obj/item/clothing/under/attackby(obj/item/I, mob/user, params) - if(!attach_accessory(I, user)) - ..() - /obj/item/clothing/under/proc/attach_accessory(obj/item/I, mob/user, notifyAttach = 1) . = FALSE if(istype(I, /obj/item/clothing/accessory)) diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 8ec8d00c77..67ce9ea370 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -14,6 +14,7 @@ name = "collectable slime cap!" desc = "It just latches right in place!" icon_state = "slime" + dynamic_hair_suffix = "" /obj/item/clothing/head/collectable/xenom name = "collectable xenomorph helmet!" @@ -25,6 +26,7 @@ desc = "A rare chef's hat meant for hat collectors!" icon_state = "chef" item_state = "chef" + dynamic_hair_suffix = "" dog_fashion = /datum/dog_fashion/head/chef @@ -53,6 +55,7 @@ name = "collectable police officer's hat" desc = "A collectable police officer's Hat. This hat emphasizes that you are THE LAW." icon_state = "policehelm" + dynamic_hair_suffix = "" dog_fashion = /datum/dog_fashion/head/warden @@ -95,6 +98,7 @@ desc = "The fur feels... a bit too realistic." icon_state = "kitty" item_state = "kitty" + dynamic_hair_suffix = "" dog_fashion = /datum/dog_fashion/head/kitty @@ -103,6 +107,7 @@ desc = "Not as lucky as the feet!" icon_state = "bunny" item_state = "bunny" + dynamic_hair_suffix = "" dog_fashion = /datum/dog_fashion/head/rabbit @@ -125,6 +130,7 @@ name = "collectable HoS hat" desc = "Now you too can beat prisoners, set silly sentences, and arrest for no reason!" icon_state = "hoscap" + dynamic_hair_suffix = "" /obj/item/clothing/head/collectable/HoP name = "collectable HoP hat" @@ -138,6 +144,7 @@ icon_state = "thunderdome" item_state = "thunderdome" resistance_flags = 0 + flags_inv = HIDEHAIR /obj/item/clothing/head/collectable/swat name = "collectable SWAT helmet" @@ -145,3 +152,4 @@ icon_state = "swat" item_state = "swat" resistance_flags = 0 + flags_inv = HIDEHAIR diff --git a/code/modules/clothing/head/collectable.dm.rej b/code/modules/clothing/head/collectable.dm.rej new file mode 100644 index 0000000000..82a9962cb8 --- /dev/null +++ b/code/modules/clothing/head/collectable.dm.rej @@ -0,0 +1,9 @@ +diff a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm (rejected hunks) +@@ -4,7 +4,6 @@ + /obj/item/clothing/head/collectable + name = "collectable hat" + desc = "A rare collectable hat." +- dynamic_hair_suffix = "+detective" + + + /obj/item/clothing/head/collectable/petehat diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 28fe8cacfb..6eefb458ed 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -10,6 +10,7 @@ flags_inv = 0 actions_types = list(/datum/action/item_action/toggle_helmet_light) resistance_flags = FIRE_PROOF + dynamic_hair_suffix = "+generic" dog_fashion = /datum/dog_fashion/head diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index f100df4366..24d8049ac7 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -12,6 +12,7 @@ strip_delay = 60 resistance_flags = 0 flags_cover = HEADCOVERSEYES + flags_inv = HIDEHAIR dog_fashion = /datum/dog_fashion/head/helmet diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 23b3da72ef..6a127f571b 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -7,6 +7,7 @@ desc = "The commander in chef's head wear." strip_delay = 10 equip_delay_other = 10 + dynamic_hair_suffix = "" dog_fashion = /datum/dog_fashion/head/chef /obj/item/clothing/head/chefhat/suicide_act(mob/user) @@ -62,6 +63,7 @@ item_state = "cage" worn_x_dimension = 64 worn_y_dimension = 64 + dynamic_hair_suffix = "" /obj/item/clothing/head/witchunter_hat @@ -99,6 +101,7 @@ desc = "A beret, a mime's favorite headwear." icon_state = "beret" dog_fashion = /datum/dog_fashion/head/beret + dynamic_hair_suffix = "" /obj/item/clothing/head/beret/black name = "black beret" @@ -118,6 +121,7 @@ icon_state = "hoscap" armor = list(melee = 40, bullet = 30, laser = 25, energy = 10, bomb = 25, bio = 10, rad = 0, fire = 50, acid = 60) strip_delay = 80 + dynamic_hair_suffix = "" /obj/item/clothing/head/HoS/syndicate name = "syndicate cap" diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 3eabbad438..959c28d45e 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -1,287 +1,290 @@ - - -/obj/item/clothing/head/centhat - name = "\improper Centcom hat" - icon_state = "centcom" - desc = "It's good to be emperor." - item_state = "that" - flags_inv = 0 - armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50) - strip_delay = 80 - -/obj/item/clothing/head/powdered_wig - name = "powdered wig" - desc = "A powdered wig." - icon_state = "pwig" - item_state = "pwig" - -/obj/item/clothing/head/that - name = "top-hat" - desc = "It's an amish looking hat." - icon_state = "tophat" - item_state = "that" - dog_fashion = /datum/dog_fashion/head - throwforce = 1 - -/obj/item/clothing/head/canada - name = "striped red tophat" - desc = "it smells like fresh donut holes / il sent comme des trous de beignets frais" - icon_state = "canada" - item_state = "canada" - -/obj/item/clothing/head/redcoat - name = "redcoat's hat" - icon_state = "redcoat" - desc = "'I guess it's a redhead.'" - -/obj/item/clothing/head/mailman - name = "mailman's hat" - icon_state = "mailman" - desc = "'Right-on-time' mail service head wear." - -/obj/item/clothing/head/plaguedoctorhat - name = "plague doctor's hat" - desc = "These were once used by plague doctors. They're pretty much useless." - icon_state = "plaguedoctor" - permeability_coefficient = 0.01 - -/obj/item/clothing/head/hasturhood - name = "hastur's hood" - desc = "It's unspeakably stylish." - icon_state = "hasturhood" - flags_inv = HIDEHAIR - flags_cover = HEADCOVERSEYES - -/obj/item/clothing/head/nursehat - name = "nurse's hat" - desc = "It allows quick identification of trained medical personnel." - icon_state = "nursehat" - - dog_fashion = /datum/dog_fashion/head/nurse - -/obj/item/clothing/head/syndicatefake - name = "black space-helmet replica" - icon_state = "syndicate-helm-black-red" - item_state = "syndicate-helm-black-red" - desc = "A plastic replica of a Syndicate agent's space helmet. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!" - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - -/obj/item/clothing/head/cueball - name = "cueball helmet" - desc = "A large, featureless white orb meant to be worn on your head. How do you even see out of this thing?" - icon_state = "cueball" - item_state="cueball" - flags_cover = HEADCOVERSEYES|HEADCOVERSMOUTH - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - -/obj/item/clothing/head/snowman - name = "Snowman Head" - desc = "A ball of white styrofoam. So festive." - icon_state = "snowman_h" - item_state = "snowman_h" - flags_cover = HEADCOVERSEYES - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - -/obj/item/clothing/head/justice - name = "justice hat" - desc = "Fight for what's righteous!" - icon_state = "justicered" - item_state = "justicered" - flags_inv = HIDEHAIR|HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR - flags_cover = HEADCOVERSEYES - -/obj/item/clothing/head/justice/blue - icon_state = "justiceblue" - item_state = "justiceblue" - -/obj/item/clothing/head/justice/yellow - icon_state = "justiceyellow" - item_state = "justiceyellow" - -/obj/item/clothing/head/justice/green - icon_state = "justicegreen" - item_state = "justicegreen" - -/obj/item/clothing/head/justice/pink - icon_state = "justicepink" - item_state = "justicepink" - -/obj/item/clothing/head/rabbitears - name = "rabbit ears" - desc = "Wearing these makes you look useless, and only good for your sex appeal." - icon_state = "bunny" - - dog_fashion = /datum/dog_fashion/head/rabbit - - -/obj/item/clothing/head/flatcap - name = "flat cap" - desc = "A working man's cap." - icon_state = "flat_cap" - item_state = "detective" - -/obj/item/clothing/head/pirate - name = "pirate hat" - desc = "Yarr." - icon_state = "pirate" - item_state = "pirate" - dog_fashion = /datum/dog_fashion/head/pirate - -/obj/item/clothing/head/pirate/captain - icon_state = "hgpiratecap" - item_state = "hgpiratecap" - -/obj/item/clothing/head/bandana - name = "pirate bandana" - desc = "Yarr." - icon_state = "bandana" - item_state = "bandana" - -/obj/item/clothing/head/bowler - name = "bowler-hat" - desc = "Gentleman, elite aboard!" - icon_state = "bowler" - item_state = "bowler" - -/obj/item/clothing/head/witchwig - name = "witch costume wig" - desc = "Eeeee~heheheheheheh!" - icon_state = "witch" - item_state = "witch" - flags_inv = HIDEHAIR - -/obj/item/clothing/head/chicken - name = "chicken suit head" - desc = "Bkaw!" - icon_state = "chickenhead" - item_state = "chickensuit" - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - -/obj/item/clothing/head/griffin - name = "griffon head" - desc = "Why not 'eagle head'? Who knows." - icon_state = "griffinhat" - item_state = "griffinhat" - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - -/obj/item/clothing/head/bearpelt - name = "bear pelt hat" - desc = "Fuzzy." - icon_state = "bearpelt" - item_state = "bearpelt" - -/obj/item/clothing/head/xenos - name = "xenos helmet" - icon_state = "xenos" - item_state = "xenos_helm" - desc = "A helmet made out of chitinous alien hide." - flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR - -/obj/item/clothing/head/fedora - name = "fedora" - icon_state = "fedora" - item_state = "fedora" - armor = list(melee = 25, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0, fire = 30, acid = 50) - desc = "A really cool hat if you're a mobster. A really lame hat if you're not." - dynamic_hair_suffix = "+detective" - pockets = /obj/item/weapon/storage/internal/pocket/small - -/obj/item/clothing/head/fedora/suicide_act(mob/user) - if(user.gender == FEMALE) - return 0 - var/mob/living/carbon/human/H = user - user.visible_message("[user] is donning [src]! It looks like they're trying to be nice to girls.") - user.say("M'lady.") - sleep(10) - H.facial_hair_style = "Neckbeard" - return(BRUTELOSS) - -/obj/item/clothing/head/sombrero - name = "sombrero" - icon_state = "sombrero" - item_state = "sombrero" - desc = "You can practically taste the fiesta." - flags_inv = HIDEHAIR - - dog_fashion = /datum/dog_fashion/head/sombrero - -/obj/item/clothing/head/sombrero/green - name = "green sombrero" - icon_state = "greensombrero" - item_state = "greensombrero" - desc = "As elegant as a dancing cactus." - flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS - dog_fashion = null - -/obj/item/clothing/head/sombrero/shamebrero - name = "shamebrero" - icon_state = "shamebrero" - item_state = "shamebrero" - desc = "Once it's on, it never comes off." - flags = NODROP - dog_fashion = null - -/obj/item/clothing/head/cone - desc = "This cone is trying to warn you of something!" - name = "warning cone" - icon = 'icons/obj/janitor.dmi' - icon_state = "cone" - item_state = "cone" - force = 1 - throwforce = 3 - throw_speed = 2 - throw_range = 5 - w_class = WEIGHT_CLASS_SMALL - attack_verb = list("warned", "cautioned", "smashed") - resistance_flags = 0 - -/obj/item/clothing/head/santa - name = "santa hat" - desc = "On the first day of christmas my employer gave to me!" - icon_state = "santahatnorm" - item_state = "that" - cold_protection = HEAD - min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT - dog_fashion = /datum/dog_fashion/head/santa - -/obj/item/clothing/head/jester - name = "jester hat" +/obj/item/clothing/head/centhat + name = "\improper Centcom hat" + icon_state = "centcom" + desc = "It's good to be emperor." + item_state = "that" + flags_inv = 0 + armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0, fire = 50, acid = 50) + strip_delay = 80 + +/obj/item/clothing/head/powdered_wig + name = "powdered wig" + desc = "A powdered wig." + icon_state = "pwig" + item_state = "pwig" + +/obj/item/clothing/head/that + name = "top-hat" + desc = "It's an amish looking hat." + icon_state = "tophat" + item_state = "that" + dog_fashion = /datum/dog_fashion/head + throwforce = 1 + +/obj/item/clothing/head/canada + name = "striped red tophat" + desc = "it smells like fresh donut holes / il sent comme des trous de beignets frais" + icon_state = "canada" + item_state = "canada" + +/obj/item/clothing/head/redcoat + name = "redcoat's hat" + icon_state = "redcoat" + desc = "'I guess it's a redhead.'" + +/obj/item/clothing/head/mailman + name = "mailman's hat" + icon_state = "mailman" + desc = "'Right-on-time' mail service head wear." + +/obj/item/clothing/head/plaguedoctorhat + name = "plague doctor's hat" + desc = "These were once used by plague doctors. They're pretty much useless." + icon_state = "plaguedoctor" + permeability_coefficient = 0.01 + +/obj/item/clothing/head/hasturhood + name = "hastur's hood" + desc = "It's unspeakably stylish." + icon_state = "hasturhood" + flags_inv = HIDEHAIR + flags_cover = HEADCOVERSEYES + +/obj/item/clothing/head/nursehat + name = "nurse's hat" + desc = "It allows quick identification of trained medical personnel." + icon_state = "nursehat" + dynamic_hair_suffix = "" + + dog_fashion = /datum/dog_fashion/head/nurse + +/obj/item/clothing/head/syndicatefake + name = "black space-helmet replica" + icon_state = "syndicate-helm-black-red" + item_state = "syndicate-helm-black-red" + desc = "A plastic replica of a Syndicate agent's space helmet. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!" + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR + +/obj/item/clothing/head/cueball + name = "cueball helmet" + desc = "A large, featureless white orb meant to be worn on your head. How do you even see out of this thing?" + icon_state = "cueball" + item_state="cueball" + flags_cover = HEADCOVERSEYES|HEADCOVERSMOUTH + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR + +/obj/item/clothing/head/snowman + name = "Snowman Head" + desc = "A ball of white styrofoam. So festive." + icon_state = "snowman_h" + item_state = "snowman_h" + flags_cover = HEADCOVERSEYES + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR + +/obj/item/clothing/head/justice + name = "justice hat" + desc = "Fight for what's righteous!" + icon_state = "justicered" + item_state = "justicered" + flags_inv = HIDEHAIR|HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR + flags_cover = HEADCOVERSEYES + +/obj/item/clothing/head/justice/blue + icon_state = "justiceblue" + item_state = "justiceblue" + +/obj/item/clothing/head/justice/yellow + icon_state = "justiceyellow" + item_state = "justiceyellow" + +/obj/item/clothing/head/justice/green + icon_state = "justicegreen" + item_state = "justicegreen" + +/obj/item/clothing/head/justice/pink + icon_state = "justicepink" + item_state = "justicepink" + +/obj/item/clothing/head/rabbitears + name = "rabbit ears" + desc = "Wearing these makes you look useless, and only good for your sex appeal." + icon_state = "bunny" + dynamic_hair_suffix = "" + + dog_fashion = /datum/dog_fashion/head/rabbit + + +/obj/item/clothing/head/flatcap + name = "flat cap" + desc = "A working man's cap." + icon_state = "flat_cap" + item_state = "detective" + +/obj/item/clothing/head/pirate + name = "pirate hat" + desc = "Yarr." + icon_state = "pirate" + item_state = "pirate" + dog_fashion = /datum/dog_fashion/head/pirate + +/obj/item/clothing/head/pirate/captain + icon_state = "hgpiratecap" + item_state = "hgpiratecap" + +/obj/item/clothing/head/bandana + name = "pirate bandana" + desc = "Yarr." + icon_state = "bandana" + item_state = "bandana" + dynamic_hair_suffix = "" + +/obj/item/clothing/head/bowler + name = "bowler-hat" + desc = "Gentleman, elite aboard!" + icon_state = "bowler" + item_state = "bowler" + dynamic_hair_suffix = "" + +/obj/item/clothing/head/witchwig + name = "witch costume wig" + desc = "Eeeee~heheheheheheh!" + icon_state = "witch" + item_state = "witch" + flags_inv = HIDEHAIR + +/obj/item/clothing/head/chicken + name = "chicken suit head" + desc = "Bkaw!" + icon_state = "chickenhead" + item_state = "chickensuit" + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR + +/obj/item/clothing/head/griffin + name = "griffon head" + desc = "Why not 'eagle head'? Who knows." + icon_state = "griffinhat" + item_state = "griffinhat" + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR + +/obj/item/clothing/head/bearpelt + name = "bear pelt hat" + desc = "Fuzzy." + icon_state = "bearpelt" + item_state = "bearpelt" + +/obj/item/clothing/head/xenos + name = "xenos helmet" + icon_state = "xenos" + item_state = "xenos_helm" + desc = "A helmet made out of chitinous alien hide." + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR + +/obj/item/clothing/head/fedora + name = "fedora" + icon_state = "fedora" + item_state = "fedora" + armor = list(melee = 25, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0, fire = 30, acid = 50) + desc = "A really cool hat if you're a mobster. A really lame hat if you're not." + pockets = /obj/item/weapon/storage/internal/pocket/small + +/obj/item/clothing/head/fedora/suicide_act(mob/user) + if(user.gender == FEMALE) + return 0 + var/mob/living/carbon/human/H = user + user.visible_message("[user] is donning [src]! It looks like they're trying to be nice to girls.") + user.say("M'lady.") + sleep(10) + H.facial_hair_style = "Neckbeard" + return(BRUTELOSS) + +/obj/item/clothing/head/sombrero + name = "sombrero" + icon_state = "sombrero" + item_state = "sombrero" + desc = "You can practically taste the fiesta." + flags_inv = HIDEHAIR + + dog_fashion = /datum/dog_fashion/head/sombrero + +/obj/item/clothing/head/sombrero/green + name = "green sombrero" + icon_state = "greensombrero" + item_state = "greensombrero" + desc = "As elegant as a dancing cactus." + flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS + dog_fashion = null + +/obj/item/clothing/head/sombrero/shamebrero + name = "shamebrero" + icon_state = "shamebrero" + item_state = "shamebrero" + desc = "Once it's on, it never comes off." + flags = NODROP + dog_fashion = null + +/obj/item/clothing/head/cone + desc = "This cone is trying to warn you of something!" + name = "warning cone" + icon = 'icons/obj/janitor.dmi' + icon_state = "cone" + item_state = "cone" + force = 1 + throwforce = 3 + throw_speed = 2 + throw_range = 5 + w_class = WEIGHT_CLASS_SMALL + attack_verb = list("warned", "cautioned", "smashed") + resistance_flags = 0 + +/obj/item/clothing/head/santa + name = "santa hat" + desc = "On the first day of christmas my employer gave to me!" + icon_state = "santahatnorm" + item_state = "that" + cold_protection = HEAD + min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT + dog_fashion = /datum/dog_fashion/head/santa + +/obj/item/clothing/head/jester + name = "jester hat" desc = "A hat with bells, to add some merriness to the suit." - icon_state = "jester_hat" - -/obj/item/clothing/head/rice_hat - name = "rice hat" - desc = "Welcome to the rice fields, motherfucker." - icon_state = "rice_hat" - -/obj/item/clothing/head/lizard - name = "lizardskin cloche hat" - desc = "How many lizards died to make this hat? Not enough." - icon_state = "lizard" - -/obj/item/clothing/head/papersack - name = "paper sack hat" - desc = "A paper sack with crude holes cut out for eyes. Useful for hiding one's identity or ugliness." - icon_state = "papersack" - flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS - -/obj/item/clothing/head/papersack/smiley - name = "paper sack hat" - desc = "A paper sack with crude holes cut out for eyes and a sketchy smile drawn on the front. Not creepy at all." - icon_state = "papersack_smile" - flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS - -/obj/item/clothing/head/crown - name = "crown" - desc = "A crown fit for a king, a petty king maybe." - icon_state = "crown" - armor = list(melee = 15, bullet = 0, laser = 0,energy = 15, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50) - resistance_flags = FIRE_PROOF - -/obj/item/clothing/head/crown/fancy - name = "magnificent crown" - desc = "A crown worn by only the highest emperors of the land." - icon_state = "fancycrown" + icon_state = "jester_hat" + dynamic_hair_suffix = "" + +/obj/item/clothing/head/rice_hat + name = "rice hat" + desc = "Welcome to the rice fields, motherfucker." + icon_state = "rice_hat" + +/obj/item/clothing/head/lizard + name = "lizardskin cloche hat" + desc = "How many lizards died to make this hat? Not enough." + icon_state = "lizard" + +/obj/item/clothing/head/papersack + name = "paper sack hat" + desc = "A paper sack with crude holes cut out for eyes. Useful for hiding one's identity or ugliness." + icon_state = "papersack" + flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS + +/obj/item/clothing/head/papersack/smiley + name = "paper sack hat" + desc = "A paper sack with crude holes cut out for eyes and a sketchy smile drawn on the front. Not creepy at all." + icon_state = "papersack_smile" + flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS + +/obj/item/clothing/head/crown + name = "crown" + desc = "A crown fit for a king, a petty king maybe." + icon_state = "crown" + armor = list(melee = 15, bullet = 0, laser = 0,energy = 15, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 50) + resistance_flags = FIRE_PROOF + dynamic_hair_suffix = "" + +/obj/item/clothing/head/crown/fancy + name = "magnificent crown" + desc = "A crown worn by only the highest emperors of the land." + icon_state = "fancycrown" /obj/item/clothing/head/scarecrow_hat name = "scarecrow hat" @@ -297,4 +300,5 @@ /obj/item/clothing/head/jester/alt name = "jester hat" desc = "A hat with bells, to add some merriness to the suit." - icon_state = "jester_hat2" \ No newline at end of file + icon_state = "jester_hat2" + dynamic_hair_suffix = "" diff --git a/code/modules/clothing/head/misc.dm.rej b/code/modules/clothing/head/misc.dm.rej new file mode 100644 index 0000000000..df85f74b20 --- /dev/null +++ b/code/modules/clothing/head/misc.dm.rej @@ -0,0 +1,16 @@ +diff a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm (rejected hunks) +@@ -250,7 +250,7 @@ + name = "jester hat" + desc = "A hat with bells, to add some merriness to the suit." + icon_state = "jester_hat" +- dynamic_hair_suffix = "null" ++ dynamic_hair_suffix = "" + + /obj/item/clothing/head/rice_hat + name = "rice hat" +@@ -302,4 +302,4 @@ + name = "jester hat" + desc = "A hat with bells, to add some merriness to the suit." + icon_state = "jester_hat2" +- dynamic_hair_suffix = "null" ++ dynamic_hair_suffix = "" diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 4c14fc0422..d15c7dd5f4 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -125,6 +125,7 @@ desc = "A pair of kitty ears. Meow!" icon_state = "kitty" color = "#999999" + dynamic_hair_suffix = "" dog_fashion = /datum/dog_fashion/head/kitty @@ -150,6 +151,7 @@ flags_inv = 0 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0) brightness_on = 1 //luminosity when on + dynamic_hair_suffix = "" dog_fashion = /datum/dog_fashion/head/reindeer diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index cd2b4c18d5..f3c6690ce4 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -161,7 +161,7 @@ /datum/outfit/centcom_official - name = "Centcom Official" + name = "CentCom Official" uniform = /obj/item/clothing/under/rank/centcom_officer shoes = /obj/item/clothing/shoes/sneakers/black @@ -181,13 +181,13 @@ var/obj/item/device/pda/heads/pda = H.r_store pda.owner = H.real_name - pda.ownjob = "Centcom Official" + pda.ownjob = "CentCom Official" pda.update_label() var/obj/item/weapon/card/id/W = H.wear_id W.icon_state = "centcom" - W.access = get_centcom_access("Centcom Official") + W.access = get_centcom_access("CentCom Official") W.access += ACCESS_WEAPONS - W.assignment = "Centcom Official" + W.assignment = "CentCom Official" W.registered_name = H.real_name W.update_label() diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index a16226bda5..abdb42d5b3 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -182,7 +182,7 @@ W.update_label(H.real_name) /datum/outfit/centcom_commander - name = "Centcom Commander" + name = "CentCom Commander" uniform = /obj/item/clothing/under/rank/centcom_commander suit = /obj/item/clothing/suit/armor/bulletproof @@ -205,8 +205,8 @@ var/obj/item/weapon/card/id/W = H.wear_id W.icon_state = "centcom" W.access = get_all_accesses() - W.access += get_centcom_access("Centcom Commander") - W.assignment = "Centcom Commander" + W.access += get_centcom_access("CentCom Commander") + W.assignment = "CentCom Commander" W.registered_name = H.real_name W.update_label() @@ -338,7 +338,7 @@ name = "Death Commando" uniform = /obj/item/clothing/under/color/green - suit = /obj/item/clothing/suit/space/hardsuit/shielded/swat + suit = /obj/item/clothing/suit/space/hardsuit/deathsquad shoes = /obj/item/clothing/shoes/combat/swat gloves = /obj/item/clothing/gloves/combat mask = /obj/item/clothing/mask/gas/sechailer/swat @@ -374,7 +374,7 @@ var/obj/item/weapon/card/id/W = H.wear_id W.icon_state = "centcom" W.access = get_all_accesses()//They get full station access. - W.access += get_centcom_access("Death Commando")//Let's add their alloted Centcom access. + W.access += get_centcom_access("Death Commando")//Let's add their alloted CentCom access. W.assignment = "Death Commando" W.registered_name = H.real_name W.update_label(W.registered_name, W.assignment) diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm index 9888be0494..e0d2907ae8 100644 --- a/code/modules/clothing/spacesuits/flightsuit.dm +++ b/code/modules/clothing/spacesuits/flightsuit.dm @@ -138,7 +138,7 @@ targ = mob_override if(!istype(targ)) return - to_chat(targ, "[bicon(src)]|[message]") + to_chat(targ, "[icon2html(src, targ)]|[message]") /obj/item/device/flightpack/proc/sync_processing(datum/controller/subsystem/processing/flightpacks/FPS) processing_mode = FPS.flightsuit_processing @@ -924,7 +924,7 @@ targ = loc if(!istype(targ)) return - to_chat(targ, "[bicon(src)]|[message]") + to_chat(targ, "[icon2html(src, targ)]|[message]") /obj/item/clothing/suit/space/hardsuit/flightsuit/examine(mob/user) ..() diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 00f622b751..7f8be87a2e 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -47,7 +47,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/proc/display_visor_message(var/msg) var/mob/wearer = loc if(msg && ishuman(wearer)) - wearer.show_message("[bicon(src)][msg]", 1) + wearer.show_message("[icon2html(src, wearer)][msg]", 1) /obj/item/clothing/head/helmet/space/hardsuit/rad_act(severity) ..() @@ -200,7 +200,7 @@ item_color = "mining" max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF - heat_protection = CHEST|GROIN|LEGS|ARMS + heat_protection = HEAD armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 75) brightness_on = 7 allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/weapon/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/weapon/gun/energy/kinetic_accelerator) @@ -216,6 +216,7 @@ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 75) allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/weapon/storage/bag/ore, /obj/item/weapon/pickaxe) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining + heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Syndicate hardsuit /obj/item/clothing/head/helmet/space/hardsuit/syndi diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index fea8665ead..f4b99baad7 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -82,7 +82,7 @@ Contains: //NASA Voidsuit /obj/item/clothing/head/helmet/space/nasavoid name = "NASA Void Helmet" - desc = "An old, NASA Centcom branch designed, dark red space suit helmet." + desc = "An old, NASA CentCom branch designed, dark red space suit helmet." icon_state = "void" item_state = "void" @@ -90,12 +90,12 @@ Contains: name = "NASA Voidsuit" icon_state = "void" item_state = "void" - desc = "An old, NASA Centcom branch designed, dark red space suit." + desc = "An old, NASA CentCom branch designed, dark red space suit." allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/device/multitool) /obj/item/clothing/head/helmet/space/nasavoid/old name = "Engineering Void Helmet" - desc = "A Centcom engineering dark red space suit helmet. While old and dusty, it still gets the job done." + desc = "A CentCom engineering dark red space suit helmet. While old and dusty, it still gets the job done." icon_state = "void" item_state = "void" @@ -103,7 +103,7 @@ Contains: name = "Engineering Voidsuit" icon_state = "void" item_state = "void" - desc = "A Centcom engineering dark red space suit. Age has degraded the suit making is difficult to move around in." + desc = "A CentCom engineering dark red space suit. Age has degraded the suit making is difficult to move around in." slowdown = 4 allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/internals, /obj/item/device/multitool) diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 1172321a89..aada779689 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -341,7 +341,7 @@ //All of the armor below is mostly unused /obj/item/clothing/suit/armor/centcom - name = "\improper Centcom armor" + name = "\improper CentCom armor" desc = "A suit that protects against some damage." icon_state = "centcom" item_state = "centcom" diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 0345bb336b..0327b24fe0 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -182,7 +182,7 @@ /obj/item/clothing/accessory/medal/gold/heroism name = "medal of exceptional heroism" - desc = "An extremely rare golden medal awarded only by Centcom. To receive such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders." + desc = "An extremely rare golden medal awarded only by CentCom. To receive such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders." /obj/item/clothing/accessory/medal/plasma name = "plasma medal" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 062f15b5b2..9194ec0b20 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -104,16 +104,16 @@ can_adjust = 0 /obj/item/clothing/under/rank/centcom_officer - desc = "It's a jumpsuit worn by Centcom Officers." - name = "\improper Centcom officer's jumpsuit" + desc = "It's a jumpsuit worn by CentCom Officers." + name = "\improper CentCom officer's jumpsuit" icon_state = "officer" item_state = "g_suit" item_color = "officer" alt_covers_chest = 1 /obj/item/clothing/under/rank/centcom_commander - desc = "It's a jumpsuit worn by Centcom's highest-tier Commanders." - name = "\improper Centcom officer's jumpsuit" + desc = "It's a jumpsuit worn by CentCom's highest-tier Commanders." + name = "\improper CentCom officer's jumpsuit" icon_state = "centcom" item_state = "dg_suit" item_color = "centcom" diff --git a/code/modules/detectivework/detective_work.dm b/code/modules/detectivework/detective_work.dm index 1ab499fcb5..6c91fee8c5 100644 --- a/code/modules/detectivework/detective_work.dm +++ b/code/modules/detectivework/detective_work.dm @@ -17,19 +17,16 @@ if(M.wear_suit) fibertext = "Material from \a [M.wear_suit]." if(prob(10*item_multiplier) && !(fibertext in suit_fibers)) - //world.log << "Added fibertext: [fibertext]" suit_fibers += fibertext if(!(M.wear_suit.body_parts_covered & CHEST)) if(M.w_uniform) fibertext = "Fibers from \a [M.w_uniform]." if(prob(12*item_multiplier) && !(fibertext in suit_fibers)) //Wearing a suit means less of the uniform exposed. - //world.log << "Added fibertext: [fibertext]" suit_fibers += fibertext if(!(M.wear_suit.body_parts_covered & HANDS)) if(M.gloves) fibertext = "Material from a pair of [M.gloves.name]." if(prob(20*item_multiplier) && !(fibertext in suit_fibers)) - //world.log << "Added fibertext: [fibertext]" suit_fibers += fibertext else if(M.w_uniform) fibertext = "Fibers from \a [M.w_uniform]." @@ -39,12 +36,10 @@ if(M.gloves) fibertext = "Material from a pair of [M.gloves.name]." if(prob(20*item_multiplier) && !(fibertext in suit_fibers)) - //world.log << "Added fibertext: [fibertext]" suit_fibers += "Material from a pair of [M.gloves.name]." else if(M.gloves) fibertext = "Material from a pair of [M.gloves.name]." if(prob(20*item_multiplier) && !(fibertext in suit_fibers)) - //world.log << "Added fibertext: [fibertext]" suit_fibers += "Material from a pair of [M.gloves.name]." diff --git a/code/modules/emoji/emoji_parse.dm b/code/modules/emoji/emoji_parse.dm index 5ecadbe09c..58f261f8cc 100644 --- a/code/modules/emoji/emoji_parse.dm +++ b/code/modules/emoji/emoji_parse.dm @@ -16,7 +16,7 @@ if(search) emoji = lowertext(copytext(text, pos+1, search)) if(emoji in emojis) - parsed += bicon(icon('icons/emoji.dmi', emoji)) + parsed += icon2html('icons/emoji.dmi', world, emoji) pos = search + 1 else parsed += copytext(text, pos, search) diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index e2cce14db3..93605ea78a 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -55,7 +55,7 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) var/skipcount = abs(error_cooldown[erroruid]) - 1 error_cooldown[erroruid] = 0 if(skipcount > 0) - world.log << "\[[time_stamp()]] Skipped [skipcount] runtimes in [E.file],[E.line]." + SEND_TEXT(world.log, "\[[time_stamp()]] Skipped [skipcount] runtimes in [E.file],[E.line].") GLOB.error_cache.log_error(E, skip_count = skipcount) error_last_seen[erroruid] = world.time @@ -92,9 +92,9 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) if(GLOB.error_cache) GLOB.error_cache.log_error(E, desclines) - world.log << "\[[time_stamp()]] Runtime in [E.file],[E.line]: [E]" + SEND_TEXT(world.log, "\[[time_stamp()]] Runtime in [E.file],[E.line]: [E]") for(var/line in desclines) - world.log << line + SEND_TEXT(world.log, line) /* This logs the runtime in the old format */ diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm index 8f634003f5..1386995c28 100644 --- a/code/modules/events/holiday/halloween.dm +++ b/code/modules/events/holiday/halloween.dm @@ -70,7 +70,7 @@ if(!H.client || !istype(H)) return to_chat(H, "Honk...") - H << 'sound/spookoween/scary_clown_appear.ogg' + SEND_SOUND(H, sound('sound/spookoween/scary_clown_appear.ogg')) var/turf/T = get_turf(H) if(T) new /obj/effect/hallucination/simple/clown(T, H, 50) diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index aa1d09b636..f3a21445d3 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -39,8 +39,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 /obj/effect/immovablerod/New(atom/start, atom/end) ..() - if(SSaugury) - SSaugury.register_doom(src, 2000) + SSaugury.register_doom(src, 2000) z_original = z destination = end if(notify) diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index 888b87cc02..9658d8b144 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -68,11 +68,11 @@ /datum/round_event/portal_storm/announce() set waitfor = 0 - playsound_global('sound/magic/lightning_chargeup.ogg', repeat=0, channel=1, volume=100) + sound_to_playing_players('sound/magic/lightning_chargeup.ogg') sleep(80) priority_announce("Massive bluespace anomaly detected en route to [station_name()]. Brace for impact.") sleep(20) - playsound_global('sound/magic/lightningbolt.ogg', repeat=0, channel=1, volume=100) + sound_to_playing_players('sound/magic/lightningbolt.ogg') /datum/round_event/portal_storm/tick() spawn_effects() diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index d04d2fe65a..2600aa98a2 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -27,22 +27,22 @@ SSshuttle.shuttle_loan = src switch(dispatch_type) if(HIJACK_SYNDIE) - priority_announce("Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache.","Centcom Counter Intelligence") + priority_announce("Cargo: The syndicate are trying to infiltrate your station. If you let them hijack your cargo shuttle, you'll save us a headache.","CentCom Counter Intelligence") if(RUSKY_PARTY) - priority_announce("Cargo: A group of angry russians want to have a party, can you send them your cargo shuttle then make them disappear?","Centcom Russian Outreach Program") + priority_announce("Cargo: A group of angry russians want to have a party, can you send them your cargo shuttle then make them disappear?","CentCom Russian Outreach Program") if(SPIDER_GIFT) - priority_announce("Cargo: The Spider Clan has sent us a mysterious gift, can we ship it to you to see what's inside?","Centcom Diplomatic Corps") + priority_announce("Cargo: The Spider Clan has sent us a mysterious gift, can we ship it to you to see what's inside?","CentCom Diplomatic Corps") if(DEPARTMENT_RESUPPLY) - priority_announce("Cargo: Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?","Centcom Supply Department") + priority_announce("Cargo: Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?","CentCom Supply Department") thanks_msg = "The cargo shuttle should return in 5 minutes." bonus_points = 0 if(ANTIDOTE_NEEDED) - priority_announce("Cargo: Your station has been chosen for an epidemiological research project. Send us your cargo shuttle to receive your research samples.", "Centcom Research Initiatives") + priority_announce("Cargo: Your station has been chosen for an epidemiological research project. Send us your cargo shuttle to receive your research samples.", "CentCom Research Initiatives") if (PIZZA_DELIVERY) - priority_announce("Cargo: It looks like a neighbouring station accidentally delivered their pizza to you instead", "Centcom Spacepizza Division") + priority_announce("Cargo: It looks like a neighbouring station accidentally delivered their pizza to you instead", "CentCom Spacepizza Division") /datum/round_event/shuttle_loan/proc/loan_shuttle() - priority_announce(thanks_msg, "Cargo shuttle commandeered by Centcom.") + priority_announce(thanks_msg, "Cargo shuttle commandeered by CentCom.") dispatched = 1 SSshuttle.points += bonus_points diff --git a/code/modules/events/wizard/fakeexplosion.dm b/code/modules/events/wizard/fakeexplosion.dm index f6ffab2da8..3dee4a1f49 100644 --- a/code/modules/events/wizard/fakeexplosion.dm +++ b/code/modules/events/wizard/fakeexplosion.dm @@ -6,6 +6,5 @@ earliest_start = 0 /datum/round_event/wizard/fake_explosion/start() - for(var/mob/M in GLOB.player_list) - M << 'sound/machines/alarm.ogg' + sound_to_playing_players('sound/machines/alarm.ogg') addtimer(CALLBACK(SSticker, /datum/controller/subsystem/ticker/.proc/station_explosion_cinematic, 1, "fake"), 100) //:o) \ No newline at end of file diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm index ffec648771..1ba052c4c0 100644 --- a/code/modules/events/wizard/imposter.dm +++ b/code/modules/events/wizard/imposter.dm @@ -55,4 +55,4 @@ I.log_message("Is an imposter!", INDIVIDUAL_ATTACK_LOG) to_chat(I, "You are an imposter! Trick and confuse the crew to misdirect malice from your handsome original!") - I << sound('sound/effects/magic.ogg') + SEND_SOUND(I, sound('sound/effects/magic.ogg')) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index c1b0a387e4..2b8fe4b064 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -11,51 +11,83 @@ Gunshots/explosions/opening doors/less rare audio (done) */ +#define HAL_LINES_FILE "hallucination.json" + /mob/living/carbon var/image/halimage var/image/halbody var/obj/halitem var/hal_screwyhud = SCREWYHUD_NONE - var/handling_hal = 0 + var/next_hallucination = 0 + +GLOBAL_LIST_INIT(hallucinations_minor, list( + /datum/hallucination/sounds, + /datum/hallucination/bolts, + /datum/hallucination/whispers, + /datum/hallucination/message, + /datum/hallucination/hudscrew)) + +GLOBAL_LIST_INIT(hallucinations_medium, list( + /datum/hallucination/fake_alert, + /datum/hallucination/items, + /datum/hallucination/items_other, + /datum/hallucination/dangerflash, + /datum/hallucination/bolts, + /datum/hallucination/fake_flood, + /datum/hallucination/husks, + /datum/hallucination/battle, + /datum/hallucination/fire, + /datum/hallucination/self_delusion)) + +GLOBAL_LIST_INIT(hallucinations_major, list( + /datum/hallucination/fakeattacker, + /datum/hallucination/death, + /datum/hallucination/xeno_attack, + /datum/hallucination/singularity_scare, + /datum/hallucination/delusion, + /datum/hallucination/oh_yeah)) /mob/living/carbon/proc/handle_hallucinations() - if(handling_hal) + if(world.time < next_hallucination) return - //Least obvious - var/list/minor = list("sounds"=25,"bolts_minor"=5,"whispers"=15,"message"=10,"hudscrew"=15) - //Something's wrong here - var/list/medium = list("fake_alert"=15,"items"=10,"items_other"=10,"dangerflash"=10,"bolts"=5,"flood"=5,"husks"=10,"battle"=15,"self_delusion"=10) - //AAAAH - var/list/major = list("fake"=20,"death"=10,"xeno"=10,"singulo"=10,"borer"=10,"delusion"=20,"koolaid"=10) + if(hallucination) + var/list/current = GLOB.hallucinations_minor + if(prob(25) && hallucination > 100) + current = GLOB.hallucinations_medium + else if(prob(10) && hallucination > 200) + current = GLOB.hallucinations_major + var/halpick = pick(current) + new halpick(src, FALSE) - handling_hal = 1 - while(hallucination > 20) - sleep(rand(200,500)/(hallucination/25)) - if(prob(20)) - continue - var/list/current = list() - switch(rand(100)) - if(1 to 50) - current = minor - if(51 to 85) - current = medium - if(86 to 100) - current = major +/mob/living/carbon/proc/set_screwyhud(hud_type) + hal_screwyhud = hud_type + update_health_hud() - var/halpick = pickweight(current) +/datum/hallucination + var/mob/living/carbon/target + var/cost = 5 //affects the amount of hallucination reduced, and cooldown until the next hallucination + var/feedback_details //extra info for investigate - hallucinate(halpick) - handling_hal = 0 +/datum/hallucination/New(mob/living/carbon/T, forced = TRUE) + set waitfor = 0 + target = T + if(!forced) + target.hallucination = max(0, target.hallucination - cost) + target.next_hallucination = world.time + (rand(cost * 0.5, cost * 3) * 10) + +/datum/hallucination/proc/wake_and_restore() + target.set_screwyhud(SCREWYHUD_NONE) + target.SetSleeping(0) + +/datum/hallucination/Destroy() + target.investigate_log("was afflicted with a hallucination of type [type]. [feedback_details]", INVESTIGATE_HALLUCINATIONS) + return ..() /obj/effect/hallucination invisibility = INVISIBILITY_OBSERVER var/mob/living/carbon/target = null -/obj/effect/hallucination/proc/wake_and_restore() - target.hal_screwyhud = SCREWYHUD_NONE - target.SetSleeping(0) - /obj/effect/hallucination/simple var/image_icon = 'icons/mob/alien.dmi' var/image_state = "alienh_pounce" @@ -64,13 +96,14 @@ Gunshots/explosions/opening doors/less rare audio (done) var/col_mod = null var/image/current_image = null var/image_layer = MOB_LAYER - var/active = 1 //qdelery + var/active = TRUE //qdelery /obj/effect/hallucination/simple/Initialize(mapload, var/mob/living/carbon/T) ..() target = T current_image = GetImage() - if(target.client) target.client.images |= current_image + if(target.client) + target.client.images |= current_image /obj/effect/hallucination/simple/proc/GetImage() var/image/I = image(image_icon,src,image_state,image_layer,dir=src.dir) @@ -82,10 +115,12 @@ Gunshots/explosions/opening doors/less rare audio (done) /obj/effect/hallucination/simple/proc/Show(update=1) if(active) - if(target.client) target.client.images.Remove(current_image) + if(target.client) + target.client.images.Remove(current_image) if(update) current_image = GetImage() - if(target.client) target.client.images |= current_image + if(target.client) + target.client.images |= current_image /obj/effect/hallucination/simple/update_icon(new_state,new_icon,new_px=0,new_py=0) image_state = new_state @@ -101,36 +136,39 @@ Gunshots/explosions/opening doors/less rare audio (done) Show() /obj/effect/hallucination/simple/Destroy() - if(target.client) target.client.images.Remove(current_image) - active = 0 + if(target.client) + target.client.images.Remove(current_image) + active = FALSE return ..() #define FAKE_FLOOD_EXPAND_TIME 20 #define FAKE_FLOOD_MAX_RADIUS 10 -/obj/effect/hallucination/fake_flood +/datum/hallucination/fake_flood //Plasma starts flooding from the nearby vent + var/turf/center var/list/flood_images = list() var/list/turf/flood_turfs = list() var/image_icon = 'icons/effects/tile_effects.dmi' var/image_state = "plasma" var/radius = 0 var/next_expand = 0 + cost = 25 -/obj/effect/hallucination/fake_flood/Initialize(mapload, var/mob/living/carbon/T) +/datum/hallucination/fake_flood/New(mob/living/carbon/T, forced = TRUE) ..() - target = T for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target)) if(!U.welded) - src.loc = U.loc + center = get_turf(U) break - flood_images += image(image_icon,src,image_state,MOB_LAYER) - flood_turfs += get_turf(src.loc) + feedback_details += "Vent Coords: [center.x],[center.y],[center.z]" + flood_images += image(image_icon,center,image_state,MOB_LAYER) + flood_turfs += center if(target.client) target.client.images |= flood_images next_expand = world.time + FAKE_FLOOD_EXPAND_TIME START_PROCESSING(SSobj, src) -/obj/effect/hallucination/fake_flood/process() +/datum/hallucination/fake_flood/process() if(next_expand <= world.time) radius++ if(radius > FAKE_FLOOD_MAX_RADIUS) @@ -138,10 +176,10 @@ Gunshots/explosions/opening doors/less rare audio (done) return Expand() if((get_turf(target) in flood_turfs) && !target.internal) - target.hallucinate("fake_alert", "tox_in_air") + new /datum/hallucination/fake_alert(target, TRUE, "tox_in_air") next_expand = world.time + FAKE_FLOOD_EXPAND_TIME -/obj/effect/hallucination/fake_flood/proc/Expand() +/datum/hallucination/fake_flood/proc/Expand() for(var/turf/FT in flood_turfs) for(var/dir in GLOB.cardinals) var/turf/T = get_step(FT, dir) @@ -152,7 +190,7 @@ Gunshots/explosions/opening doors/less rare audio (done) if(target.client) target.client.images |= flood_images -/obj/effect/hallucination/fake_flood/Destroy() +/datum/hallucination/fake_flood/Destroy() STOP_PROCESSING(SSobj, src) qdel(flood_turfs) flood_turfs = list() @@ -167,7 +205,7 @@ Gunshots/explosions/opening doors/less rare audio (done) image_icon = 'icons/mob/alien.dmi' image_state = "alienh_pounce" -/obj/effect/hallucination/simple/xeno/Initialize(mapload, var/mob/living/carbon/T) +/obj/effect/hallucination/simple/xeno/Initialize(mapload, mob/living/carbon/T) ..() name = "alien hunter ([rand(1, 1000)])" @@ -177,18 +215,19 @@ Gunshots/explosions/opening doors/less rare audio (done) target.Knockdown(100) target.visible_message("[target] flails around wildly.","[name] pounces on you!") -/obj/effect/hallucination/xeno_attack +/datum/hallucination/xeno_attack //Xeno crawls from nearby vent,jumps at you, and goes back in var/obj/machinery/atmospherics/components/unary/vent_pump/pump = null var/obj/effect/hallucination/simple/xeno/xeno = null + cost = 25 -/obj/effect/hallucination/xeno_attack/Initialize(mapload, var/mob/living/carbon/T) +/datum/hallucination/xeno_attack/New(mob/living/carbon/T, forced = TRUE) ..() - target = T for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target)) if(!U.welded) pump = U break + feedback_details += "Vent Coords: [pump.x],[pump.y],[pump.z]" if(pump) xeno = new(pump.loc,target) sleep(10) @@ -200,7 +239,7 @@ Gunshots/explosions/opening doors/less rare audio (done) sleep(10) var/xeno_name = xeno.name to_chat(target, "[xeno_name] begins climbing into the ventilation system...") - sleep(10) + sleep(30) qdel(xeno) to_chat(target, "[xeno_name] scrambles into the ventilation ducts!") qdel(src) @@ -209,7 +248,7 @@ Gunshots/explosions/opening doors/less rare audio (done) image_icon = 'icons/mob/animal.dmi' image_state = "clown" -/obj/effect/hallucination/simple/clown/Initialize(mapload, var/mob/living/carbon/T,duration) +/obj/effect/hallucination/simple/clown/Initialize(mapload, mob/living/carbon/T, duration) ..(loc, T) name = pick(GLOB.clown_names) QDEL_IN(src,duration) @@ -217,59 +256,27 @@ Gunshots/explosions/opening doors/less rare audio (done) /obj/effect/hallucination/simple/clown/scary image_state = "scary_clown" -/obj/effect/hallucination/simple/borer - image_icon = 'icons/mob/borer.dmi' - image_state = "brainslug" - -/obj/effect/hallucination/borer - //A borer unconsciouss you and crawls in your ear - var/obj/machinery/atmospherics/components/unary/vent_pump/pump = null - var/obj/effect/hallucination/simple/borer/borer = null - -/obj/effect/hallucination/borer/Initialize(mapload, var/mob/living/carbon/T) - ..() - target = T - for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target)) - if(!U.welded) - pump = U - break - if(pump) - borer = new(pump.loc,target) - for(var/i=0, i<11, i++) - walk_to(borer, get_step(borer, get_cardinal_dir(borer, T))) - if(borer.Adjacent(T)) - to_chat(T, "You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing.") - T.Stun(80) - sleep(50) - qdel(borer) - sleep(rand(60, 90)) - to_chat(T, "Primary [rand(1000,9999)] states: [pick("Hello","Hi","You're my slave now!","Don't try to get rid of me...")]") - break - sleep(4) - if(!QDELETED(borer)) - qdel(borer) - qdel(src) - /obj/effect/hallucination/simple/bubblegum name = "Bubblegum" image_icon = 'icons/mob/lavaland/96x96megafauna.dmi' image_state = "bubblegum" px = -32 -/obj/effect/hallucination/oh_yeah +/datum/hallucination/oh_yeah var/obj/effect/hallucination/simple/bubblegum/bubblegum var/image/fakebroken var/image/fakerune + cost = 75 -/obj/effect/hallucination/oh_yeah/Initialize(mapload, var/mob/living/carbon/T) +/datum/hallucination/oh_yeah/New(mob/living/carbon/T, forced = TRUE) . = ..() - target = T var/turf/closed/wall/wall for(var/turf/closed/wall/W in range(7,target)) wall = W break if(!wall) return INITIALIZE_HINT_QDEL + feedback_details += "Source: [wall.x],[wall.y],[wall.z]" fakebroken = image('icons/turf/floors.dmi', wall, "plating", layer = TURF_LAYER) var/turf/landing = get_turf(target) @@ -283,7 +290,7 @@ Gunshots/explosions/opening doors/less rare audio (done) bubblegum = new(wall, target) addtimer(CALLBACK(src, .proc/bubble_attack, landing), 10) -/obj/effect/hallucination/oh_yeah/proc/bubble_attack(turf/landing) +/datum/hallucination/oh_yeah/proc/bubble_attack(turf/landing) var/charged = FALSE //only get hit once while(get_turf(bubblegum) != landing && target && target.stat != DEAD) bubblegum.forceMove(get_step_towards(bubblegum, landing)) @@ -301,7 +308,7 @@ Gunshots/explosions/opening doors/less rare audio (done) sleep(30) qdel(src) -/obj/effect/hallucination/oh_yeah/Destroy() +/datum/hallucination/oh_yeah/Destroy() if(target.client) target.client.images.Remove(fakebroken) target.client.images.Remove(fakerune) @@ -310,23 +317,24 @@ Gunshots/explosions/opening doors/less rare audio (done) QDEL_NULL(bubblegum) return ..() -/obj/effect/hallucination/singularity_scare +/datum/hallucination/singularity_scare //Singularity moving towards you. //todo Hide where it moved with fake space images var/obj/effect/hallucination/simple/singularity/s = null + cost = 75 -/obj/effect/hallucination/singularity_scare/Initialize(mapload, var/mob/living/carbon/T) +/datum/hallucination/singularity_scare/New(mob/living/carbon/T, forced = TRUE) ..() - target = T var/turf/start = get_turf(T) var/screen_border = pick(SOUTH,EAST,WEST,NORTH) - for(var/i = 0,i<11,i++) + for(var/i in 1 to 13) start = get_step(start,screen_border) + feedback_details += "Source: [start.x],[start.y],[start.z]" s = new(start,target) s.parent = src - for(var/i = 0,i<11,i++) - sleep(5) - s.loc = get_step(get_turf(s),get_dir(s,target)) + for(var/i in 1 to 13) + sleep(10) + s.forceMove(get_step(get_turf(s),get_dir(s,target))) s.Show() s.Eat() qdel(s) @@ -337,64 +345,72 @@ Gunshots/explosions/opening doors/less rare audio (done) image_layer = MASSIVE_OBJ_LAYER px = -96 py = -96 - var/obj/effect/hallucination/singularity_scare/parent + var/datum/hallucination/singularity_scare/parent /obj/effect/hallucination/simple/singularity/proc/Eat(atom/OldLoc, Dir) var/target_dist = get_dist(src,target) if(target_dist<=3) //"Eaten" - target.hal_screwyhud = SCREWYHUD_CRIT + target.set_screwyhud(SCREWYHUD_DEAD) target.SetUnconscious(160) - addtimer(CALLBACK(parent, .proc/wake_and_restore), rand(30, 50)) + addtimer(CALLBACK(parent, /datum/hallucination/.proc/wake_and_restore), rand(30, 50)) -/obj/effect/hallucination/battle +/datum/hallucination/battle + cost = 15 -/obj/effect/hallucination/battle/Initialize(mapload, var/mob/living/carbon/T) +/datum/hallucination/battle/New(mob/living/carbon/T, forced = TRUE, battle_type) ..() - target = T var/hits = rand(3,6) - switch(rand(1,5)) - if(1) //Laser fight - for(var/i=0,i...wabbajack...wabbajack...") - target.playsound_local(target,'sound/magic/staff_change.ogg', 50, 1, -1) + if(wabbajack) + to_chat(target, "...wabbajack...wabbajack...") + target.playsound_local(target,'sound/magic/staff_change.ogg', 50, 1) delusion = A target.client.images |= A QDEL_IN(src, duration) -/obj/effect/hallucination/self_delusion/Destroy() +/datum/hallucination/self_delusion/Destroy() if(target.client) target.client.images.Remove(delusion) return ..() -/obj/effect/hallucination/fakeattacker/Initialize(mapload, var/mob/living/carbon/T) +/datum/hallucination/fakeattacker/New(mob/living/carbon/T, forced = TRUE) ..() - target = T var/mob/living/carbon/human/clone = null var/clone_weapon = null @@ -523,6 +541,7 @@ Gunshots/explosions/opening doors/less rare audio (done) if(H.stat || H.lying) continue clone = H + feedback_details += "Clone of: [H.real_name]" break if(!clone) @@ -604,7 +623,7 @@ Gunshots/explosions/opening doors/less rare audio (done) for(var/mob/O in oviewers(world.view , my_target)) to_chat(O, "[my_target] stumbles around.") -/obj/effect/fake_attacker/Initialize(mapload, var/mob/living/carbon/T) +/obj/effect/fake_attacker/Initialize(mapload, mob/living/carbon/T) ..() my_target = T QDEL_IN(src, 300) @@ -651,7 +670,7 @@ Gunshots/explosions/opening doors/less rare audio (done) if(!locate(/obj/effect/overlay) in my_target.loc) fake_blood(my_target) else - my_target.playsound_local(my_target, pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg'), 25, 1, -1) + my_target.playsound_local(my_target, pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg'), 25, 1) my_target.show_message("[src.name] has punched [my_target]!", 1) my_target.staminaloss += 30 if(prob(33)) @@ -674,14 +693,15 @@ Gunshots/explosions/opening doors/less rare audio (done) QDEL_IN(O, 300) -/obj/effect/hallucination/bolts +/datum/hallucination/bolts var/list/doors = list() + cost = 25 -/obj/effect/hallucination/bolts/Initialize(mapload, var/mob/living/carbon/T,var/door_number=-1) //-1 for severe, 1-2 for subtle +/datum/hallucination/bolts/New(mob/living/carbon/T, forced, door_number=-1) //-1 for severe, 1-2 for subtle ..() - target = T var/image/I = null var/count = 0 + feedback_details += "Door amount: [door_number]" for(var/obj/machinery/door/airlock/A in range(7, target)) if(count>door_number && door_number>0) break @@ -700,13 +720,30 @@ Gunshots/explosions/opening doors/less rare audio (done) sleep(rand(6,12)) qdel(src) -/obj/effect/hallucination/whispers +/datum/hallucination/whispers + cost = 15 -/obj/effect/hallucination/whispers/Initialize(mapload, var/mob/living/carbon/T) +/datum/hallucination/whispers/New(mob/living/carbon/T, forced = TRUE) ..() - target = T - var/speak_messages = list("I'm watching you...","[target.first_name()]!","Get out!","Kchck-Chkck? Kchchck!","Did you hear that?","What did you do ?","Why?","Give me that!","HELP!!","EI NATH!!", "RUN!!", "Kill me!","O bidai nabora se'sma!", "[text2ratvar("Divinity, grant...")]") - var/radio_messages = list("Xenos!","Singularity loose!","Comms down!","They are arming the nuke!","They butchered Ian!","H-help!","[pick("Cult", "Wizard", "Ling", "Ops", "Revenant", "Murderer", "Harm", "I hear flashing", "Help")] in [pick(GLOB.teleportlocs)][prob(50)?"!":"!!"]","Where's [target.first_name()]?","Call the shuttle!","AI rogue!!") + var/speak_messages = list("[pick_list_replacements(HAL_LINES_FILE, "suspicion")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "greetings")][target.first_name()]!",\ + "[pick_list_replacements(HAL_LINES_FILE, "getout")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "weird")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "didyouhearthat")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "imatraitor")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "doubt")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "aggressive")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "help")]!!",\ + "[pick_list_replacements(HAL_LINES_FILE, "escape")]",\ + "I'm infected, [pick_list_replacements(HAL_LINES_FILE, "infection_advice")]!") + + var/radio_messages = list("Set [target.first_name()] to arrest!",\ + "[pick_list_replacements(HAL_LINES_FILE, "people")] is [pick_list_replacements(HAL_LINES_FILE, "accusations")]!",\ + "Help!",\ + "[pick_list_replacements(HAL_LINES_FILE, "threat")] in [pick_list_replacements(HAL_LINES_FILE, "location")][prob(50)?"!":"!!"]",\ + "Where's [target.first_name()]?"\ + ,"[pick("C","Ai, c","Someone c","Rec")]all the shuttle!"\ + ,"AI [pick("rogue", "is dead")]!!") var/list/mob/living/carbon/people = list() var/list/mob/living/carbon/person = null @@ -722,7 +759,9 @@ Gunshots/explosions/opening doors/less rare audio (done) people += H if(person) //Basic talk var/image/speech_overlay = image('icons/mob/talk.dmi', person, "default0", layer = ABOVE_MOB_LAYER) - to_chat(target, target.compose_message(person,understood_language,pick(speak_messages),null,person.get_spans())) + var/message = target.compose_message(person,understood_language,pick(speak_messages),null,person.get_spans()) + feedback_details += "Type: Talk, Source: [person.real_name], Message: [message]" + to_chat(target, message) if(target.client) target.client.images |= speech_overlay sleep(30) @@ -732,312 +771,381 @@ Gunshots/explosions/opening doors/less rare audio (done) for(var/mob/living/carbon/human/H in GLOB.living_mob_list) humans += H person = pick(humans) - to_chat(target, target.compose_message(person,understood_language,pick(radio_messages),"1459",person.get_spans())) + var/message = target.compose_message(person,understood_language,pick(radio_messages),"1459",person.get_spans()) + feedback_details += "Type: Radio, Source: [person.real_name], Message: [message]" + to_chat(target, message) qdel(src) -/obj/effect/hallucination/message +/datum/hallucination/message + cost = 15 -/obj/effect/hallucination/message/Initialize(mapload, var/mob/living/carbon/T) +/datum/hallucination/message/New(mob/living/carbon/T, forced = TRUE) ..() - target = T var/chosen = pick("The light burns you!", \ "You don't feel like yourself.", \ - "Unknown has punched [target]!", \ "You hear something squeezing through the ducts...", \ "You hear a distant scream.", \ "You feel invincible, nothing can hurt you!", \ "You feel a tiny prick!", \ "[target] sneezes.", \ - "You feel faint.", \ - "You hear a strange, alien voice in your head...[pick("Hiss","Ssss")]", \ - "You can see...everything!") + //The truth, revealed + "You're hallucinating.", \ + //Direct advice + "[pick_list_replacements(HAL_LINES_FILE, "advice")]") + feedback_details += "Message: [chosen]" to_chat(target, chosen) qdel(src) -/mob/living/carbon/proc/hallucinate(hal_type, specific) // specific is used to specify a particular hallucination - set waitfor = 0 - switch(hal_type) - if("xeno") - new /obj/effect/hallucination/xeno_attack(src.loc,src) - if("borer") - new /obj/effect/hallucination/borer(src.loc,src) - if("singulo") - new /obj/effect/hallucination/singularity_scare(src.loc,src) - if("koolaid") - new /obj/effect/hallucination/oh_yeah(src.loc,src) - if("battle") - new /obj/effect/hallucination/battle(src.loc,src) - if("flood") - new /obj/effect/hallucination/fake_flood(src.loc,src) - if("delusion") - new /obj/effect/hallucination/delusion(src.loc,src) - if("self_delusion") - new /obj/effect/hallucination/self_delusion(src.loc,src) - if("fake") - new /obj/effect/hallucination/fakeattacker(src.loc,src) - if("bolts") - new /obj/effect/hallucination/bolts(src.loc,src) - if("bolts_minor") - new /obj/effect/hallucination/bolts(src.loc,src,rand(1,2)) - if("whispers") - new /obj/effect/hallucination/whispers(src.loc,src) - if("message") - new /obj/effect/hallucination/message(src.loc,src) - if("items_other") - new /obj/effect/hallucination/items_other(src.loc,src) - if("sounds") - //Strange audio - switch(rand(1,20)) - if(1) playsound_local(null,'sound/machines/airlock.ogg', 15, 1) - if(2) - if(prob(50)) playsound_local(null,'sound/effects/explosion1.ogg', 50, 1) - else playsound_local(null, 'sound/effects/explosion2.ogg', 50, 1) - if(3) playsound_local(null, 'sound/effects/explosionfar.ogg', 50, 1) - if(4) playsound_local(null, pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg'), 50, 1) - if(5) - playsound_local(null, 'sound/weapons/ring.ogg', 35) - sleep(15) - playsound_local(null, 'sound/weapons/ring.ogg', 35) - sleep(15) - playsound_local(null, 'sound/weapons/ring.ogg', 35) - if(6) playsound_local(null, 'sound/magic/summon_guns.ogg', 50, 1) - if(7) playsound_local(null, 'sound/machines/alarm.ogg', 100, 0) - if(8) playsound_local(null, 'sound/voice/bfreeze.ogg', 35, 0) - if(9) - //To make it more realistic, I added two gunshots (enough to kill) - playsound_local(null, 'sound/weapons/gunshot.ogg', 25, 1) - spawn(rand(10,30)) - playsound_local(null, 'sound/weapons/gunshot.ogg', 25, 1) - sleep(rand(5,10)) - playsound_local(null, sound(get_sfx("bodyfall"), 25), 25, 1) - if(10) playsound_local(null, 'sound/effects/pray_chaplain.ogg', 50) - if(11) - //Same as above, but with tasers. - playsound_local(null, 'sound/weapons/taser.ogg', 25, 1) - spawn(rand(10,30)) - playsound_local(null, 'sound/weapons/taser.ogg', 25, 1) - sleep(rand(5,10)) - playsound_local(null, sound(get_sfx("bodyfall"), 25), 25, 1) - //Rare audio - if(12) - //These sounds are (mostly) taken from Hidden: Source - var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/screech.ogg',\ - 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\ - 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\ - 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ - 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') - playsound_local(null, pick(creepyasssounds), 50, 1) - if(13) - playsound_local(null, 'sound/effects/ratvar_rises.ogg', 100) - sleep(150) - playsound_local(null, 'sound/effects/ratvar_reveal.ogg', 100) - if(14) - to_chat(src, "

    Priority Announcement

    ") - to_chat(src, "

    The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.

    ") - playsound_local(null, 'sound/ai/shuttledock.ogg', 100) - //Deconstructing a wall - if(15) - playsound_local(null, 'sound/items/welder.ogg', 15, 1) - sleep(105) - playsound_local(null, 'sound/items/welder2.ogg', 15, 1) - sleep(15) - playsound_local(null, 'sound/items/ratchet.ogg', 15, 1) - //Hacking a door - if(16) - playsound_local(null, 'sound/items/screwdriver.ogg', 15, 1) - sleep(rand(10,30)) - for(var/i = rand(1,3), i>0, i--) - playsound_local(null, 'sound/weapons/empty.ogg', 15, 1) - sleep(rand(10,30)) - playsound_local(null, 'sound/machines/airlockforced.ogg', 15, 1) - if(17) - playsound_local(null, 'sound/weapons/saberon.ogg',35,1) - if(18) - to_chat(src, "

    Biohazard Alert

    ") - to_chat(src, "

    Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.

    ") - playsound_local(null, 'sound/ai/outbreak5.ogg') - if(19) //Tesla loose! - playsound_local(null, 'sound/magic/lightningbolt.ogg', 35, 1) - sleep(20) - playsound_local(null, 'sound/magic/lightningbolt.ogg', 65, 1) - sleep(20) - playsound_local(null, 'sound/magic/lightningbolt.ogg', 100, 1) - if(20) //AI is doomsdaying! - to_chat(src, "

    Anomaly Alert

    ") - to_chat(src, "

    Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.

    ") - playsound_local(null, 'sound/ai/aimalf.ogg', 100) - if("hudscrew") - //Screwy HUD - //to_chat(src, "Screwy HUD") - hal_screwyhud = pick(SCREWYHUD_NONE,SCREWYHUD_CRIT,SCREWYHUD_DEAD,SCREWYHUD_HEALTHY) - sleep(rand(100,250)) - hal_screwyhud = 0 +/datum/hallucination/sounds + cost = 15 - if("fake_alert") - var/alert_type = pick("not_enough_oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","too_much_tox","newlaw","nutrition","charge","weightless","fire","locked","hacked","temp","pressure") - if(specific) - alert_type = specific - switch(alert_type) - if("not_enough_oxy") - throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy, override = TRUE) - if("not_enough_tox") - throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox, override = TRUE) - if("not_enough_co2") - throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2, override = TRUE) - if("too_much_oxy") - throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy, override = TRUE) - if("too_much_co2") - throw_alert("too_much_co2", /obj/screen/alert/too_much_co2, override = TRUE) - if("too_much_tox") - throw_alert("too_much_tox", /obj/screen/alert/too_much_tox, override = TRUE) - if("nutrition") - if(prob(50)) - throw_alert("nutrition", /obj/screen/alert/fat, override = TRUE) - else - throw_alert("nutrition", /obj/screen/alert/starving, override = TRUE) - if("weightless") - throw_alert("weightless", /obj/screen/alert/weightless, override = TRUE) - if("fire") - throw_alert("fire", /obj/screen/alert/fire, override = TRUE) - if("temp") - if(prob(50)) - throw_alert("temp", /obj/screen/alert/hot, 3, override = TRUE) - else - throw_alert("temp", /obj/screen/alert/cold, 3, override = TRUE) - if("pressure") - if(prob(50)) - throw_alert("pressure", /obj/screen/alert/highpressure, 2, override = TRUE) - else - throw_alert("pressure", /obj/screen/alert/lowpressure, 2, override = TRUE) - //BEEP BOOP I AM A ROBOT - if("newlaw") - throw_alert("newlaw", /obj/screen/alert/newlaw, override = TRUE) - if("locked") - throw_alert("locked", /obj/screen/alert/locked, override = TRUE) - if("hacked") - throw_alert("hacked", /obj/screen/alert/hacked, override = TRUE) - if("charge") - throw_alert("charge", /obj/screen/alert/emptycell, override = TRUE) - sleep(rand(100,200)) - clear_alert(alert_type, clear_override = TRUE) - - if("items") - //Strange items - //to_chat(src, "Traitor Items") - if(!halitem) - halitem = new - var/obj/item/l_hand = get_item_for_held_index(1) - var/obj/item/r_hand = get_item_for_held_index(2) - var/l = ui_hand_position(get_held_index_of_item(l_hand)) - var/r = ui_hand_position(get_held_index_of_item(r_hand)) - var/list/slots_free = list(l,r) - if(l_hand) slots_free -= l - if(r_hand) slots_free -= r - if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(!H.belt) slots_free += ui_belt - if(!H.l_store) slots_free += ui_storage1 - if(!H.r_store) slots_free += ui_storage2 - if(slots_free.len) - halitem.screen_loc = pick(slots_free) - halitem.layer = ABOVE_HUD_LAYER - halitem.plane = ABOVE_HUD_PLANE - switch(rand(1,6)) - if(1) //revolver - halitem.icon = 'icons/obj/guns/projectile.dmi' - halitem.icon_state = "revolver" - halitem.name = "Revolver" - if(2) //c4 - halitem.icon = 'icons/obj/grenade.dmi' - halitem.icon_state = "plastic-explosive0" - halitem.name = "Mysterious Package" - if(prob(25)) - halitem.icon_state = "c4small_1" - if(3) //sword - halitem.icon = 'icons/obj/weapons.dmi' - halitem.icon_state = "sword1" - halitem.name = "Sword" - if(4) //stun baton - halitem.icon = 'icons/obj/weapons.dmi' - halitem.icon_state = "stunbaton" - halitem.name = "Stun Baton" - if(5) //emag - halitem.icon = 'icons/obj/card.dmi' - halitem.icon_state = "emag" - halitem.name = "Cryptographic Sequencer" - if(6) //flashbang - halitem.icon = 'icons/obj/grenade.dmi' - halitem.icon_state = "flashbang1" - halitem.name = "Flashbang" - if(client) client.screen += halitem - QDEL_IN(halitem, rand(100, 250)) - if("dangerflash") - //Flashes of danger - //to_chat(src, "Danger Flash") - if(!halimage) - var/list/possible_points = list() - for(var/turf/open/floor/F in view(src,world.view)) - possible_points += F - if(possible_points.len) - var/turf/open/floor/target = pick(possible_points) - - switch(rand(1,4)) - if(1) - //to_chat(src, "Space") - halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER) - if(2) - //to_chat(src, "Lava") - halimage = image('icons/turf/floors/lava.dmi',target,"smooth",TURF_LAYER) - if(3) - //to_chat(src, "Chasm") - halimage = image('icons/turf/floors/Chasms.dmi',target,"smooth",TURF_LAYER) - if(4) - //to_chat(src, "C4") - halimage = image('icons/obj/grenade.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01) - - - if(client) client.images += halimage - sleep(rand(40,60)) //Only seen for a brief moment. - if(client) client.images -= halimage - halimage = null - if("death") - //Fake death - hal_screwyhud = SCREWYHUD_DEAD - SetUnconscious(400) - var/area/area = get_area(src) - to_chat(src, "[mind.name] has died at [area.name].") +/datum/hallucination/sounds/New(mob/living/carbon/T, forced = TRUE, sound_type) + ..() + if(!sound_type) + sound_type = pick("airlock","explosion","far_explosion","glass","phone","summon_guns","alarm","beepsky","hallelujah","creepy","ratvar","shuttle_dock", + "wall_decon","door_hack","esword","blob_alert","tesla","malf_ai") + feedback_details += "Type: [sound_type]" + //Strange audio + switch(sound_type) + if("airlock") + target.playsound_local(null,'sound/machines/airlock.ogg', 15, 1) + if("explosion") if(prob(50)) - var/list/dead_people = list() - for(var/mob/dead/observer/G in GLOB.player_list) - dead_people += G - var/mob/dead/observer/fakemob = pick(dead_people) - if(fakemob) - sleep(rand(30, 60)) - to_chat(src, "DEAD: [fakemob.name] says, \"[pick("rip","welcome [first_name()]","you too?","is the AI malf?",\ - "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "abductors","double agents","viruses","badmins","you")]")]\"") - sleep(rand(50,70)) - hal_screwyhud = SCREWYHUD_NONE - SetSleeping(0) - if("husks") - if(!halbody) - var/list/possible_points = list() - for(var/turf/open/floor/F in view(src,world.view)) - possible_points += F - if(possible_points.len) - var/turf/open/floor/target = pick(possible_points) - switch(rand(1,4)) - if(1) - var/image/body = image('icons/mob/human.dmi',target,"husk",TURF_LAYER) - var/matrix/M = matrix() - M.Turn(90) - body.transform = M - halbody = body - if(2,3) - halbody = image('icons/mob/human.dmi',target,"husk",TURF_LAYER) - if(4) - halbody = image('icons/mob/alien.dmi',target,"alienother",TURF_LAYER) + target.playsound_local(null,'sound/effects/explosion1.ogg', 50, 1) + else + target.playsound_local(null, 'sound/effects/explosion2.ogg', 50, 1) + if("far_explosion") + target.playsound_local(null, 'sound/effects/explosionfar.ogg', 50, 1) + if("glass") + target.playsound_local(null, pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg'), 50, 1) + if("phone") + target.playsound_local(null, 'sound/weapons/ring.ogg', 35) + sleep(15) + target.playsound_local(null, 'sound/weapons/ring.ogg', 35) + sleep(15) + target.playsound_local(null, 'sound/weapons/ring.ogg', 35) + if("summon_guns") + target.playsound_local(null, 'sound/magic/summon_guns.ogg', 50, 1) + if("alarm") + target.playsound_local(null, 'sound/machines/alarm.ogg', 100, 0) + if("beepsky") + target.playsound_local(null, 'sound/voice/bfreeze.ogg', 35, 0) + if("hallelujah") + target.playsound_local(null, 'sound/effects/pray_chaplain.ogg', 50) + //Rare audio + if("creepy") + //These sounds are (mostly) taken from Hidden: Source + var/static/list/hallucinations_creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/screech.ogg',\ + 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\ + 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\ + 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ + 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') + target.playsound_local(null, pick(hallucinations_creepyasssounds), 50, 1) + if("ratvar") + target.playsound_local(null, 'sound/effects/ratvar_rises.ogg', 100) + sleep(150) + target.playsound_local(null, 'sound/effects/ratvar_reveal.ogg', 100) + if("shuttle_dock") + to_chat(target, "

    Priority Announcement

    ") + to_chat(target, "

    The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.

    ") + target.playsound_local(null, 'sound/ai/shuttledock.ogg', 100) + //Deconstructing a wall + if("wall_decon") + target.playsound_local(null, 'sound/items/welder.ogg', 15, 1) + sleep(105) + target.playsound_local(null, 'sound/items/welder2.ogg', 15, 1) + sleep(15) + target.playsound_local(null, 'sound/items/ratchet.ogg', 15, 1) + //Hacking a door + if("door_hack") + target.playsound_local(null, 'sound/items/screwdriver.ogg', 15, 1) + sleep(rand(10,30)) + for(var/i = rand(1,3), i>0, i--) + target.playsound_local(null, 'sound/weapons/empty.ogg', 15, 1) + sleep(rand(10,30)) + target.playsound_local(null, 'sound/machines/airlockforced.ogg', 15, 1) + if("esword") + target.playsound_local(null, 'sound/weapons/saberon.ogg',35,1) + if("blob_alert") + to_chat(target, "

    Biohazard Alert

    ") + to_chat(target, "

    Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.

    ") + target.playsound_local(null, 'sound/ai/outbreak5.ogg', 100, 0) + if("tesla") //Tesla loose! + target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 35, 1) + sleep(20) + target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 65, 1) + sleep(20) + target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 100, 1) + if("malf_ai") //AI is doomsdaying! + to_chat(target, "

    Anomaly Alert

    ") + to_chat(target, "

    Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.

    ") + target.playsound_local(null, 'sound/ai/aimalf.ogg', 100, 0) + qdel(src) + +/datum/hallucination/hudscrew + cost = 10 + +/datum/hallucination/hudscrew/New(mob/living/carbon/T, forced = TRUE) + ..() + //Screwy HUD + target.set_screwyhud(pick(SCREWYHUD_CRIT,SCREWYHUD_DEAD,SCREWYHUD_HEALTHY)) + feedback_details += "Type: [target.hal_screwyhud]" + sleep(rand(100,250)) + target.set_screwyhud(SCREWYHUD_NONE) + qdel(src) + +/datum/hallucination/fake_alert + cost = 15 + +/datum/hallucination/fake_alert/New(mob/living/carbon/T, forced = TRUE, specific, duration = 150) + ..() + var/alert_type = pick("not_enough_oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","too_much_tox","newlaw","nutrition","charge","weightless","fire","locked","hacked","temphot","tempcold","pressure") + if(specific) + alert_type = specific + feedback_details += "Type: [alert_type]" + switch(alert_type) + if("oxy") + target.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy, override = TRUE) + if("not_enough_tox") + target.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox, override = TRUE) + if("not_enough_co2") + target.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2, override = TRUE) + if("too_much_oxy") + target.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy, override = TRUE) + if("too_much_co2") + target.throw_alert("too_much_co2", /obj/screen/alert/too_much_co2, override = TRUE) + if("tox_in_air") + target.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox, override = TRUE) + if("nutrition") + if(prob(50)) + target.throw_alert("nutrition", /obj/screen/alert/fat, override = TRUE) + else + target.throw_alert("nutrition", /obj/screen/alert/starving, override = TRUE) + if("weightless") + target.throw_alert("weightless", /obj/screen/alert/weightless, override = TRUE) + if("fire") + target.throw_alert("fire", /obj/screen/alert/fire, override = TRUE) + if("temphot") + target.throw_alert("temp", /obj/screen/alert/hot, 3, override = TRUE) + if("tempcold") + target.throw_alert("temp", /obj/screen/alert/cold, 3, override = TRUE) + if("pressure") + if(prob(50)) + target.throw_alert("pressure", /obj/screen/alert/highpressure, 2, override = TRUE) + else + target.throw_alert("pressure", /obj/screen/alert/lowpressure, 2, override = TRUE) + //BEEP BOOP I AM A ROBOT + if("newlaw") + target.throw_alert("newlaw", /obj/screen/alert/newlaw, override = TRUE) + if("locked") + target.throw_alert("locked", /obj/screen/alert/locked, override = TRUE) + if("hacked") + target.throw_alert("hacked", /obj/screen/alert/hacked, override = TRUE) + if("charge") + target.throw_alert("charge",/obj/screen/alert/emptycell, override = TRUE) + sleep(duration) + target.clear_alert(alert_type, clear_override = TRUE) + qdel(src) + +/datum/hallucination/items + cost = 15 + +/datum/hallucination/items/New(mob/living/carbon/T, forced = TRUE) + ..() + //Strange items + if(!target.halitem) + target.halitem = new + var/obj/item/l_hand = target.get_item_for_held_index(1) + var/obj/item/r_hand = target.get_item_for_held_index(2) + var/l = ui_hand_position(target.get_held_index_of_item(l_hand)) + var/r = ui_hand_position(target.get_held_index_of_item(r_hand)) + var/list/slots_free = list(l,r) + if(l_hand) slots_free -= l + if(r_hand) slots_free -= r + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(!H.belt) slots_free += ui_belt + if(!H.l_store) slots_free += ui_storage1 + if(!H.r_store) slots_free += ui_storage2 + if(slots_free.len) + target.halitem.screen_loc = pick(slots_free) + target.halitem.layer = ABOVE_HUD_LAYER + target.halitem.plane = ABOVE_HUD_PLANE + switch(rand(1,6)) + if(1) //revolver + target.halitem.icon = 'icons/obj/guns/projectile.dmi' + target.halitem.icon_state = "revolver" + target.halitem.name = "Revolver" + if(2) //c4 + target.halitem.icon = 'icons/obj/grenade.dmi' + target.halitem.icon_state = "plastic-explosive0" + target.halitem.name = "C4" + if(prob(25)) + target.halitem.icon_state = "plasticx40" + if(3) //sword + target.halitem.icon = 'icons/obj/weapons.dmi' + target.halitem.icon_state = "sword0" + target.halitem.name = "Energy Sword" + if(4) //stun baton + target.halitem.icon = 'icons/obj/weapons.dmi' + target.halitem.icon_state = "stunbaton" + target.halitem.name = "Stun Baton" + if(5) //emag + target.halitem.icon = 'icons/obj/card.dmi' + target.halitem.icon_state = "emag" + target.halitem.name = "Cryptographic Sequencer" + if(6) //flashbang + target.halitem.icon = 'icons/obj/grenade.dmi' + target.halitem.icon_state = "flashbang1" + target.halitem.name = "Flashbang" + feedback_details += "Type: [target.halitem.name]" + if(target.client) target.client.screen += target.halitem + QDEL_IN(target.halitem, rand(150, 350)) + qdel(src) + +/datum/hallucination/dangerflash + cost = 15 + +/datum/hallucination/dangerflash/New(mob/living/carbon/T, forced = TRUE) + ..() + //Flashes of danger + if(!target.halimage) + var/list/possible_points = list() + for(var/turf/open/floor/F in view(target,world.view)) + possible_points += F + if(possible_points.len) + var/turf/open/floor/danger_point = pick(possible_points) + + switch(rand(1,5)) + if(1) + target.halimage = image('icons/turf/space.dmi',danger_point,"[rand(1,25)]",TURF_LAYER) + if(2) + target.halimage = image('icons/turf/floors/lava.dmi',danger_point,"smooth",TURF_LAYER) + if(3) + target.halimage = image('icons/turf/floors/Chasms.dmi',danger_point,"smooth",TURF_LAYER) + if(4) + target.halimage = image('icons/effects/effects.dmi',danger_point,"anom",OBJ_LAYER+0.01) + if(5) + target.halimage = image('icons/effects/effects.dmi',danger_point,"electricity2",OBJ_LAYER+0.01) + + + if(target.client) + target.client.images += target.halimage + sleep(rand(200,450)) + if(target.client) + target.client.images -= target.halimage + QDEL_NULL(target.halimage) + qdel(src) + +/datum/hallucination/death + cost = 40 + +/datum/hallucination/death/New(mob/living/carbon/T, forced = TRUE) + set waitfor = 0 + ..() + target.set_screwyhud(SCREWYHUD_DEAD) + target.Knockdown(300) + target.silent += 10 + var/area/area = get_area(target) + to_chat(target, "[target.mind.name] has died at [area.name].") + if(prob(50)) + var/mob/fakemob + var/list/dead_people = list() + for(var/mob/dead/observer/G in GLOB.player_list) + dead_people += G + if(LAZYLEN(dead_people)) + fakemob = pick(dead_people) + else + fakemob = target //ever been so lonely you had to haunt yourself? + if(fakemob) + sleep(rand(20, 50)) + to_chat(target, "DEAD: [fakemob.name] says, \"[pick("rip","hey [target.first_name()]","you too?","is the AI rogue?",\ + "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "abductors","double agents","viruses","badmins","you")]")]\"") + sleep(rand(70,90)) + target.set_screwyhud(SCREWYHUD_NONE) + target.SetKnockdown(0) + target.silent = 0 + qdel(src) + +/datum/hallucination/fire + cost = 25 + +/datum/hallucination/fire/New(mob/living/carbon/T, forced = TRUE) + ..() + var/image/fire_overlay = image('icons/mob/OnFire.dmi', target, "Standing", ABOVE_MOB_LAYER) + if(target.client) + target.client.images += fire_overlay + to_chat(target, "You're set on fire!") + target.throw_alert("fire", /obj/screen/alert/fire, override = TRUE) + sleep(20) + target.throw_alert("temp", /obj/screen/alert/hot, 1, override = TRUE) + sleep(30) + target.clear_alert("temp", clear_override = TRUE) + target.throw_alert("temp", /obj/screen/alert/hot, 2, override = TRUE) + sleep(30) + target.clear_alert("temp", clear_override = TRUE) + target.throw_alert("temp", /obj/screen/alert/hot, 3, override = TRUE) + for(var/i in 1 to rand(5, 10)) + target.adjustStaminaLoss(15) + sleep(25) + target.clear_alert("fire", clear_override = TRUE) + target.clear_alert("temp", clear_override = TRUE) + if(target.client) + target.client.images -= fire_overlay + QDEL_NULL(fire_overlay) + qdel(src) + +/datum/hallucination/husks + cost = 20 + +/datum/hallucination/husks/New(mob/living/carbon/T, forced = TRUE) + ..() + if(!target.halbody) + var/list/possible_points = list() + for(var/turf/open/floor/F in view(target,world.view)) + possible_points += F + if(possible_points.len) + var/turf/open/floor/husk_point = pick(possible_points) + switch(rand(1,4)) + if(1) + var/image/body = image('icons/mob/human.dmi',husk_point,"husk",TURF_LAYER) + var/matrix/M = matrix() + M.Turn(90) + body.transform = M + target.halbody = body + if(2,3) + target.halbody = image('icons/mob/human.dmi',husk_point,"husk",TURF_LAYER) + if(4) + target.halbody = image('icons/mob/alien.dmi',husk_point,"alienother",TURF_LAYER) + + if(target.client) + target.client.images += target.halbody + sleep(rand(30,50)) //Only seen for a brief moment. + if(target.client) + target.client.images -= target.halbody + QDEL_NULL(target.halbody) + qdel(src) + +//hallucination projectile code in code/modules/projectiles/projectile/special.dm +/datum/hallucination/stray_bullet + cost = 15 + +/datum/hallucination/stray_bullet/New(mob/living/carbon/C, forced = TRUE) + ..() + var/list/turf/startlocs = list() + for(var/turf/open/T in view(world.view+1,target)-view(world.view,target)) + startlocs += T + var/turf/start = pick(startlocs) + var/proj_type = pick(subtypesof(/obj/item/projectile/hallucination)) + feedback_details += "Type: [proj_type]" + var/obj/item/projectile/hallucination/H = new proj_type(start) + target.playsound_local(start, H.hal_fire_sound, 60, 1) + H.hal_target = target + H.current = start + H.starting = start + H.yo = target.y - start.y + H.xo = target.x - start.x + H.original = target + H.fire() + qdel(src) - if(client) client.images += halbody - spawn(rand(30,50)) //Only seen for a brief moment. - if(client) client.images -= halbody - halbody = null diff --git a/code/modules/flufftext/Hallucination.dm.rej b/code/modules/flufftext/Hallucination.dm.rej new file mode 100644 index 0000000000..2b8fe4b064 --- /dev/null +++ b/code/modules/flufftext/Hallucination.dm.rej @@ -0,0 +1,1151 @@ +/* +Ideas for the subtle effects of hallucination: + +Light up oxygen/plasma indicators (done) +Cause health to look critical/dead, even when standing (done) +Characters silently watching you +Brief flashes of fire/space/bombs/c4/dangerous shit (done) +Items that are rare/traitorous/don't exist appearing in your inventory slots (done) +Strange audio (should be rare) (done) +Gunshots/explosions/opening doors/less rare audio (done) + +*/ + +#define HAL_LINES_FILE "hallucination.json" + +/mob/living/carbon + var/image/halimage + var/image/halbody + var/obj/halitem + var/hal_screwyhud = SCREWYHUD_NONE + var/next_hallucination = 0 + +GLOBAL_LIST_INIT(hallucinations_minor, list( + /datum/hallucination/sounds, + /datum/hallucination/bolts, + /datum/hallucination/whispers, + /datum/hallucination/message, + /datum/hallucination/hudscrew)) + +GLOBAL_LIST_INIT(hallucinations_medium, list( + /datum/hallucination/fake_alert, + /datum/hallucination/items, + /datum/hallucination/items_other, + /datum/hallucination/dangerflash, + /datum/hallucination/bolts, + /datum/hallucination/fake_flood, + /datum/hallucination/husks, + /datum/hallucination/battle, + /datum/hallucination/fire, + /datum/hallucination/self_delusion)) + +GLOBAL_LIST_INIT(hallucinations_major, list( + /datum/hallucination/fakeattacker, + /datum/hallucination/death, + /datum/hallucination/xeno_attack, + /datum/hallucination/singularity_scare, + /datum/hallucination/delusion, + /datum/hallucination/oh_yeah)) + +/mob/living/carbon/proc/handle_hallucinations() + if(world.time < next_hallucination) + return + + if(hallucination) + var/list/current = GLOB.hallucinations_minor + if(prob(25) && hallucination > 100) + current = GLOB.hallucinations_medium + else if(prob(10) && hallucination > 200) + current = GLOB.hallucinations_major + var/halpick = pick(current) + new halpick(src, FALSE) + +/mob/living/carbon/proc/set_screwyhud(hud_type) + hal_screwyhud = hud_type + update_health_hud() + +/datum/hallucination + var/mob/living/carbon/target + var/cost = 5 //affects the amount of hallucination reduced, and cooldown until the next hallucination + var/feedback_details //extra info for investigate + +/datum/hallucination/New(mob/living/carbon/T, forced = TRUE) + set waitfor = 0 + target = T + if(!forced) + target.hallucination = max(0, target.hallucination - cost) + target.next_hallucination = world.time + (rand(cost * 0.5, cost * 3) * 10) + +/datum/hallucination/proc/wake_and_restore() + target.set_screwyhud(SCREWYHUD_NONE) + target.SetSleeping(0) + +/datum/hallucination/Destroy() + target.investigate_log("was afflicted with a hallucination of type [type]. [feedback_details]", INVESTIGATE_HALLUCINATIONS) + return ..() + +/obj/effect/hallucination + invisibility = INVISIBILITY_OBSERVER + var/mob/living/carbon/target = null + +/obj/effect/hallucination/simple + var/image_icon = 'icons/mob/alien.dmi' + var/image_state = "alienh_pounce" + var/px = 0 + var/py = 0 + var/col_mod = null + var/image/current_image = null + var/image_layer = MOB_LAYER + var/active = TRUE //qdelery + +/obj/effect/hallucination/simple/Initialize(mapload, var/mob/living/carbon/T) + ..() + target = T + current_image = GetImage() + if(target.client) + target.client.images |= current_image + +/obj/effect/hallucination/simple/proc/GetImage() + var/image/I = image(image_icon,src,image_state,image_layer,dir=src.dir) + I.pixel_x = px + I.pixel_y = py + if(col_mod) + I.color = col_mod + return I + +/obj/effect/hallucination/simple/proc/Show(update=1) + if(active) + if(target.client) + target.client.images.Remove(current_image) + if(update) + current_image = GetImage() + if(target.client) + target.client.images |= current_image + +/obj/effect/hallucination/simple/update_icon(new_state,new_icon,new_px=0,new_py=0) + image_state = new_state + if(new_icon) + image_icon = new_icon + else + image_icon = initial(image_icon) + px = new_px + py = new_py + Show() + +/obj/effect/hallucination/simple/Moved(atom/OldLoc, Dir) + Show() + +/obj/effect/hallucination/simple/Destroy() + if(target.client) + target.client.images.Remove(current_image) + active = FALSE + return ..() + +#define FAKE_FLOOD_EXPAND_TIME 20 +#define FAKE_FLOOD_MAX_RADIUS 10 + +/datum/hallucination/fake_flood + //Plasma starts flooding from the nearby vent + var/turf/center + var/list/flood_images = list() + var/list/turf/flood_turfs = list() + var/image_icon = 'icons/effects/tile_effects.dmi' + var/image_state = "plasma" + var/radius = 0 + var/next_expand = 0 + cost = 25 + +/datum/hallucination/fake_flood/New(mob/living/carbon/T, forced = TRUE) + ..() + for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target)) + if(!U.welded) + center = get_turf(U) + break + feedback_details += "Vent Coords: [center.x],[center.y],[center.z]" + flood_images += image(image_icon,center,image_state,MOB_LAYER) + flood_turfs += center + if(target.client) target.client.images |= flood_images + next_expand = world.time + FAKE_FLOOD_EXPAND_TIME + START_PROCESSING(SSobj, src) + +/datum/hallucination/fake_flood/process() + if(next_expand <= world.time) + radius++ + if(radius > FAKE_FLOOD_MAX_RADIUS) + qdel(src) + return + Expand() + if((get_turf(target) in flood_turfs) && !target.internal) + new /datum/hallucination/fake_alert(target, TRUE, "tox_in_air") + next_expand = world.time + FAKE_FLOOD_EXPAND_TIME + +/datum/hallucination/fake_flood/proc/Expand() + for(var/turf/FT in flood_turfs) + for(var/dir in GLOB.cardinals) + var/turf/T = get_step(FT, dir) + if((T in flood_turfs) || !FT.CanAtmosPass(T)) + continue + flood_images += image(image_icon,T,image_state,MOB_LAYER) + flood_turfs += T + if(target.client) + target.client.images |= flood_images + +/datum/hallucination/fake_flood/Destroy() + STOP_PROCESSING(SSobj, src) + qdel(flood_turfs) + flood_turfs = list() + if(target.client) + target.client.images.Remove(flood_images) + target = null + qdel(flood_images) + flood_images = list() + return ..() + +/obj/effect/hallucination/simple/xeno + image_icon = 'icons/mob/alien.dmi' + image_state = "alienh_pounce" + +/obj/effect/hallucination/simple/xeno/Initialize(mapload, mob/living/carbon/T) + ..() + name = "alien hunter ([rand(1, 1000)])" + +/obj/effect/hallucination/simple/xeno/throw_impact(A) + update_icon("alienh_pounce") + if(A == target && target.stat!=DEAD) + target.Knockdown(100) + target.visible_message("[target] flails around wildly.","[name] pounces on you!") + +/datum/hallucination/xeno_attack + //Xeno crawls from nearby vent,jumps at you, and goes back in + var/obj/machinery/atmospherics/components/unary/vent_pump/pump = null + var/obj/effect/hallucination/simple/xeno/xeno = null + cost = 25 + +/datum/hallucination/xeno_attack/New(mob/living/carbon/T, forced = TRUE) + ..() + for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in orange(7,target)) + if(!U.welded) + pump = U + break + feedback_details += "Vent Coords: [pump.x],[pump.y],[pump.z]" + if(pump) + xeno = new(pump.loc,target) + sleep(10) + xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) + xeno.throw_at(target,7,1, spin = 0, diagonals_first = 1) + sleep(10) + xeno.update_icon("alienh_leap",'icons/mob/alienleap.dmi',-32,-32) + xeno.throw_at(pump,7,1, spin = 0, diagonals_first = 1) + sleep(10) + var/xeno_name = xeno.name + to_chat(target, "[xeno_name] begins climbing into the ventilation system...") + sleep(30) + qdel(xeno) + to_chat(target, "[xeno_name] scrambles into the ventilation ducts!") + qdel(src) + +/obj/effect/hallucination/simple/clown + image_icon = 'icons/mob/animal.dmi' + image_state = "clown" + +/obj/effect/hallucination/simple/clown/Initialize(mapload, mob/living/carbon/T, duration) + ..(loc, T) + name = pick(GLOB.clown_names) + QDEL_IN(src,duration) + +/obj/effect/hallucination/simple/clown/scary + image_state = "scary_clown" + +/obj/effect/hallucination/simple/bubblegum + name = "Bubblegum" + image_icon = 'icons/mob/lavaland/96x96megafauna.dmi' + image_state = "bubblegum" + px = -32 + +/datum/hallucination/oh_yeah + var/obj/effect/hallucination/simple/bubblegum/bubblegum + var/image/fakebroken + var/image/fakerune + cost = 75 + +/datum/hallucination/oh_yeah/New(mob/living/carbon/T, forced = TRUE) + . = ..() + var/turf/closed/wall/wall + for(var/turf/closed/wall/W in range(7,target)) + wall = W + break + if(!wall) + return INITIALIZE_HINT_QDEL + feedback_details += "Source: [wall.x],[wall.y],[wall.z]" + + fakebroken = image('icons/turf/floors.dmi', wall, "plating", layer = TURF_LAYER) + var/turf/landing = get_turf(target) + var/turf/landing_image_turf = get_step(landing, SOUTHWEST) //the icon is 3x3 + fakerune = image('icons/effects/96x96.dmi', landing_image_turf, "landing", layer = ABOVE_OPEN_TURF_LAYER) + fakebroken.override = TRUE + if(target.client) + target.client.images |= fakebroken + target.client.images |= fakerune + target.playsound_local(wall,'sound/effects/meteorimpact.ogg', 150, 1) + bubblegum = new(wall, target) + addtimer(CALLBACK(src, .proc/bubble_attack, landing), 10) + +/datum/hallucination/oh_yeah/proc/bubble_attack(turf/landing) + var/charged = FALSE //only get hit once + while(get_turf(bubblegum) != landing && target && target.stat != DEAD) + bubblegum.forceMove(get_step_towards(bubblegum, landing)) + bubblegum.setDir(get_dir(bubblegum, landing)) + target.playsound_local(get_turf(bubblegum), 'sound/effects/meteorimpact.ogg', 150, 1) + shake_camera(target, 2, 1) + if(bubblegum.Adjacent(target) && !charged) + charged = TRUE + target.Knockdown(80) + target.adjustStaminaLoss(40) + step_away(target, bubblegum) + shake_camera(target, 4, 3) + target.visible_message("[target] jumps backwards, falling on the ground!","[bubblegum] slams into you!") + sleep(2) + sleep(30) + qdel(src) + +/datum/hallucination/oh_yeah/Destroy() + if(target.client) + target.client.images.Remove(fakebroken) + target.client.images.Remove(fakerune) + QDEL_NULL(fakebroken) + QDEL_NULL(fakerune) + QDEL_NULL(bubblegum) + return ..() + +/datum/hallucination/singularity_scare + //Singularity moving towards you. + //todo Hide where it moved with fake space images + var/obj/effect/hallucination/simple/singularity/s = null + cost = 75 + +/datum/hallucination/singularity_scare/New(mob/living/carbon/T, forced = TRUE) + ..() + var/turf/start = get_turf(T) + var/screen_border = pick(SOUTH,EAST,WEST,NORTH) + for(var/i in 1 to 13) + start = get_step(start,screen_border) + feedback_details += "Source: [start.x],[start.y],[start.z]" + s = new(start,target) + s.parent = src + for(var/i in 1 to 13) + sleep(10) + s.forceMove(get_step(get_turf(s),get_dir(s,target))) + s.Show() + s.Eat() + qdel(s) + +/obj/effect/hallucination/simple/singularity + image_icon = 'icons/effects/224x224.dmi' + image_state = "singularity_s7" + image_layer = MASSIVE_OBJ_LAYER + px = -96 + py = -96 + var/datum/hallucination/singularity_scare/parent + +/obj/effect/hallucination/simple/singularity/proc/Eat(atom/OldLoc, Dir) + var/target_dist = get_dist(src,target) + if(target_dist<=3) //"Eaten" + target.set_screwyhud(SCREWYHUD_DEAD) + target.SetUnconscious(160) + addtimer(CALLBACK(parent, /datum/hallucination/.proc/wake_and_restore), rand(30, 50)) + +/datum/hallucination/battle + cost = 15 + +/datum/hallucination/battle/New(mob/living/carbon/T, forced = TRUE, battle_type) + ..() + var/hits = rand(3,6) + if(!battle_type) + battle_type = pick("laser","esword","gun","stunprod","bomb") + feedback_details += "Type: [battle_type]" + switch(battle_type) + if("laser") //Laser fight + for(var/i in 1 to hits) + target.playsound_local(null, 'sound/weapons/laser.ogg', 25, 1) + if(prob(50)) + addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/sear.ogg', 25, 1), rand(10,20)) + else + addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/effects/searwall.ogg', 25, 1), rand(10,20)) + sleep(rand(CLICK_CD_RANGE, CLICK_CD_RANGE + 8)) + target.playsound_local(null, get_sfx("bodyfall"), 25, 1) + if("esword") //Esword fight + target.playsound_local(null, 'sound/weapons/saberon.ogg',15, 1) + for(var/i=0,i...wabbajack...wabbajack...") + target.playsound_local(target,'sound/magic/staff_change.ogg', 50, 1) + delusion = A + target.client.images |= A + QDEL_IN(src, duration) + +/datum/hallucination/self_delusion/Destroy() + if(target.client) + target.client.images.Remove(delusion) + return ..() + +/datum/hallucination/fakeattacker/New(mob/living/carbon/T, forced = TRUE) + ..() + var/mob/living/carbon/human/clone = null + var/clone_weapon = null + + for(var/mob/living/carbon/human/H in GLOB.living_mob_list) + if(H.stat || H.lying) + continue + clone = H + feedback_details += "Clone of: [H.real_name]" + break + + if(!clone) + return + + var/static/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/ballistic, /obj/item/ammo_box/a357,\ + /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow, /obj/item/weapon/melee/transforming/energy/sword/saber,\ + /obj/item/weapon/storage/box/syndicate, /obj/item/weapon/storage/box/emps,\ + /obj/item/weapon/cartridge/virus/syndicate, /obj/item/clothing/under/chameleon,\ + /obj/item/clothing/shoes/chameleon, /obj/item/weapon/card/id/syndicate,\ + /obj/item/clothing/mask/chameleon, /obj/item/clothing/glasses/thermal,\ + /obj/item/device/chameleon, /obj/item/weapon/card/emag, /obj/item/weapon/grenade/plastic/x4,\ + /obj/item/weapon/storage/toolbox/syndicate, /obj/item/weapon/aiModule,\ + /obj/item/device/radio/headset/syndicate, /obj/item/weapon/grenade/plastic/c4,\ + /obj/item/device/powersink, /obj/item/weapon/storage/box/syndie_kit,\ + /obj/item/toy/syndicateballoon, /obj/item/weapon/gun/energy/laser/captain,\ + /obj/item/weapon/hand_tele, /obj/item/weapon/construction/rcd, /obj/item/weapon/tank/jetpack,\ + /obj/item/clothing/under/rank/captain, /obj/item/device/aicard,\ + /obj/item/clothing/shoes/magboots, /obj/item/areaeditor/blueprints, /obj/item/weapon/disk/nuclear,\ + /obj/item/clothing/suit/space/nasavoid, /obj/item/weapon/tank) + + var/obj/effect/fake_attacker/F = new/obj/effect/fake_attacker(get_turf(target),target) + + for(var/obj/item/I in clone.held_items) + if(!(locate(I) in non_fakeattack_weapons)) + clone_weapon = I.name + F.weap = I + + F.name = clone.name + F.my_target = target + F.weapon_name = clone_weapon + + F.left = image(clone,dir = WEST) + F.right = image(clone,dir = EAST) + F.up = image(clone,dir = NORTH) + F.down = image(clone,dir = SOUTH) + + F.updateimage() + qdel(src) + +/obj/effect/fake_attacker + icon = null + icon_state = null + name = "" + desc = "" + density = FALSE + anchored = TRUE + opacity = 0 + var/mob/living/carbon/human/my_target = null + var/weapon_name = null + var/obj/item/weap = null + var/image/stand_icon = null + var/image/currentimage = null + var/icon/base = null + var/skin_tone + var/mob/living/clone = null + var/image/left + var/image/right + var/image/up + var/collapse + var/image/down + + max_integrity = 100 + +/obj/effect/fake_attacker/attackby(obj/item/weapon/P, mob/living/user, params) + step_away(src,my_target,2) + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(src) + my_target.playsound_local(src, P.hitsound, 1) + my_target.visible_message("[my_target] flails around wildly.", \ + "[my_target] has attacked [src]!") + + obj_integrity -= P.force + +/obj/effect/fake_attacker/Crossed(mob/M, somenumber) + if(M == my_target) + step_away(src,my_target,2) + if(prob(30)) + for(var/mob/O in oviewers(world.view , my_target)) + to_chat(O, "[my_target] stumbles around.") + +/obj/effect/fake_attacker/Initialize(mapload, mob/living/carbon/T) + ..() + my_target = T + QDEL_IN(src, 300) + step_away(src,my_target,2) + INVOKE_ASYNC(src, .proc/attack_loop) + + +/obj/effect/fake_attacker/proc/updateimage() +// del src.currentimage + if(src.dir == NORTH) + del src.currentimage + src.currentimage = new /image(up,src) + else if(src.dir == SOUTH) + del src.currentimage + src.currentimage = new /image(down,src) + else if(src.dir == EAST) + del src.currentimage + src.currentimage = new /image(right,src) + else if(src.dir == WEST) + del src.currentimage + src.currentimage = new /image(left,src) + SEND_IMAGE(my_target, currentimage) + + +/obj/effect/fake_attacker/proc/attack_loop() + while(1) + sleep(rand(5,10)) + if(obj_integrity < 0 || my_target.stat) + collapse() + continue + if(get_dist(src,my_target) > 1) + src.setDir(get_dir(src,my_target)) + step_towards(src,my_target) + updateimage() + else + if(prob(15)) + if(weapon_name) + my_target.playsound_local(my_target, weap.hitsound, weap.get_clamped_volume(), 1) + my_target.show_message("[src.name] has attacked [my_target] with [weapon_name]!", 1) + my_target.staminaloss += 30 + if(prob(20)) + my_target.blur_eyes(3) + if(prob(33)) + if(!locate(/obj/effect/overlay) in my_target.loc) + fake_blood(my_target) + else + my_target.playsound_local(my_target, pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg'), 25, 1) + my_target.show_message("[src.name] has punched [my_target]!", 1) + my_target.staminaloss += 30 + if(prob(33)) + if(!locate(/obj/effect/overlay) in my_target.loc) + fake_blood(my_target) + + if(prob(15)) + step_away(src,my_target,2) + +/obj/effect/fake_attacker/proc/collapse() + collapse = 1 + updateimage() + qdel(src) + +/obj/effect/fake_attacker/proc/fake_blood(mob/target) + var/obj/effect/overlay/O = new/obj/effect/overlay(target.loc) + O.name = "blood" + var/image/I = image('icons/effects/blood.dmi',O,"floor[rand(1,7)]",O.dir,1) + SEND_IMAGE(target, I) + QDEL_IN(O, 300) + + +/datum/hallucination/bolts + var/list/doors = list() + cost = 25 + +/datum/hallucination/bolts/New(mob/living/carbon/T, forced, door_number=-1) //-1 for severe, 1-2 for subtle + ..() + var/image/I = null + var/count = 0 + feedback_details += "Door amount: [door_number]" + for(var/obj/machinery/door/airlock/A in range(7, target)) + if(count>door_number && door_number>0) + break + count++ + I = image(A.overlays_file, get_turf(A), "lights_bolts",layer=A.layer+0.1) + doors += I + if(target.client) + target.client.images |= I + target.playsound_local(get_turf(A), 'sound/machines/boltsdown.ogg',30,0,3) + sleep(rand(6,12)) + sleep(100) + for(var/image/B in doors) + if(target.client) + target.client.images.Remove(B) + target.playsound_local(get_turf(B), 'sound/machines/boltsup.ogg',30,0,3) + sleep(rand(6,12)) + qdel(src) + +/datum/hallucination/whispers + cost = 15 + +/datum/hallucination/whispers/New(mob/living/carbon/T, forced = TRUE) + ..() + var/speak_messages = list("[pick_list_replacements(HAL_LINES_FILE, "suspicion")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "greetings")][target.first_name()]!",\ + "[pick_list_replacements(HAL_LINES_FILE, "getout")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "weird")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "didyouhearthat")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "imatraitor")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "doubt")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "aggressive")]",\ + "[pick_list_replacements(HAL_LINES_FILE, "help")]!!",\ + "[pick_list_replacements(HAL_LINES_FILE, "escape")]",\ + "I'm infected, [pick_list_replacements(HAL_LINES_FILE, "infection_advice")]!") + + var/radio_messages = list("Set [target.first_name()] to arrest!",\ + "[pick_list_replacements(HAL_LINES_FILE, "people")] is [pick_list_replacements(HAL_LINES_FILE, "accusations")]!",\ + "Help!",\ + "[pick_list_replacements(HAL_LINES_FILE, "threat")] in [pick_list_replacements(HAL_LINES_FILE, "location")][prob(50)?"!":"!!"]",\ + "Where's [target.first_name()]?"\ + ,"[pick("C","Ai, c","Someone c","Rec")]all the shuttle!"\ + ,"AI [pick("rogue", "is dead")]!!") + + var/list/mob/living/carbon/people = list() + var/list/mob/living/carbon/person = null + var/datum/language/understood_language = target.get_random_understood_language() + for(var/mob/living/carbon/H in view(target)) + if(H == target) + continue + if(!person) + person = H + else + if(get_dist(target,H)The light burns you!", \ + "You don't feel like yourself.", \ + "You hear something squeezing through the ducts...", \ + "You hear a distant scream.", \ + "You feel invincible, nothing can hurt you!", \ + "You feel a tiny prick!", \ + "[target] sneezes.", \ + //The truth, revealed + "You're hallucinating.", \ + //Direct advice + "[pick_list_replacements(HAL_LINES_FILE, "advice")]") + feedback_details += "Message: [chosen]" + to_chat(target, chosen) + qdel(src) + +/datum/hallucination/sounds + cost = 15 + +/datum/hallucination/sounds/New(mob/living/carbon/T, forced = TRUE, sound_type) + ..() + if(!sound_type) + sound_type = pick("airlock","explosion","far_explosion","glass","phone","summon_guns","alarm","beepsky","hallelujah","creepy","ratvar","shuttle_dock", + "wall_decon","door_hack","esword","blob_alert","tesla","malf_ai") + feedback_details += "Type: [sound_type]" + //Strange audio + switch(sound_type) + if("airlock") + target.playsound_local(null,'sound/machines/airlock.ogg', 15, 1) + if("explosion") + if(prob(50)) + target.playsound_local(null,'sound/effects/explosion1.ogg', 50, 1) + else + target.playsound_local(null, 'sound/effects/explosion2.ogg', 50, 1) + if("far_explosion") + target.playsound_local(null, 'sound/effects/explosionfar.ogg', 50, 1) + if("glass") + target.playsound_local(null, pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg'), 50, 1) + if("phone") + target.playsound_local(null, 'sound/weapons/ring.ogg', 35) + sleep(15) + target.playsound_local(null, 'sound/weapons/ring.ogg', 35) + sleep(15) + target.playsound_local(null, 'sound/weapons/ring.ogg', 35) + if("summon_guns") + target.playsound_local(null, 'sound/magic/summon_guns.ogg', 50, 1) + if("alarm") + target.playsound_local(null, 'sound/machines/alarm.ogg', 100, 0) + if("beepsky") + target.playsound_local(null, 'sound/voice/bfreeze.ogg', 35, 0) + if("hallelujah") + target.playsound_local(null, 'sound/effects/pray_chaplain.ogg', 50) + //Rare audio + if("creepy") + //These sounds are (mostly) taken from Hidden: Source + var/static/list/hallucinations_creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/screech.ogg',\ + 'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\ + 'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\ + 'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\ + 'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg') + target.playsound_local(null, pick(hallucinations_creepyasssounds), 50, 1) + if("ratvar") + target.playsound_local(null, 'sound/effects/ratvar_rises.ogg', 100) + sleep(150) + target.playsound_local(null, 'sound/effects/ratvar_reveal.ogg', 100) + if("shuttle_dock") + to_chat(target, "

    Priority Announcement

    ") + to_chat(target, "

    The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.

    ") + target.playsound_local(null, 'sound/ai/shuttledock.ogg', 100) + //Deconstructing a wall + if("wall_decon") + target.playsound_local(null, 'sound/items/welder.ogg', 15, 1) + sleep(105) + target.playsound_local(null, 'sound/items/welder2.ogg', 15, 1) + sleep(15) + target.playsound_local(null, 'sound/items/ratchet.ogg', 15, 1) + //Hacking a door + if("door_hack") + target.playsound_local(null, 'sound/items/screwdriver.ogg', 15, 1) + sleep(rand(10,30)) + for(var/i = rand(1,3), i>0, i--) + target.playsound_local(null, 'sound/weapons/empty.ogg', 15, 1) + sleep(rand(10,30)) + target.playsound_local(null, 'sound/machines/airlockforced.ogg', 15, 1) + if("esword") + target.playsound_local(null, 'sound/weapons/saberon.ogg',35,1) + if("blob_alert") + to_chat(target, "

    Biohazard Alert

    ") + to_chat(target, "

    Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.

    ") + target.playsound_local(null, 'sound/ai/outbreak5.ogg', 100, 0) + if("tesla") //Tesla loose! + target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 35, 1) + sleep(20) + target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 65, 1) + sleep(20) + target.playsound_local(null, 'sound/magic/lightningbolt.ogg', 100, 1) + if("malf_ai") //AI is doomsdaying! + to_chat(target, "

    Anomaly Alert

    ") + to_chat(target, "

    Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.

    ") + target.playsound_local(null, 'sound/ai/aimalf.ogg', 100, 0) + qdel(src) + +/datum/hallucination/hudscrew + cost = 10 + +/datum/hallucination/hudscrew/New(mob/living/carbon/T, forced = TRUE) + ..() + //Screwy HUD + target.set_screwyhud(pick(SCREWYHUD_CRIT,SCREWYHUD_DEAD,SCREWYHUD_HEALTHY)) + feedback_details += "Type: [target.hal_screwyhud]" + sleep(rand(100,250)) + target.set_screwyhud(SCREWYHUD_NONE) + qdel(src) + +/datum/hallucination/fake_alert + cost = 15 + +/datum/hallucination/fake_alert/New(mob/living/carbon/T, forced = TRUE, specific, duration = 150) + ..() + var/alert_type = pick("not_enough_oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","too_much_tox","newlaw","nutrition","charge","weightless","fire","locked","hacked","temphot","tempcold","pressure") + if(specific) + alert_type = specific + feedback_details += "Type: [alert_type]" + switch(alert_type) + if("oxy") + target.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy, override = TRUE) + if("not_enough_tox") + target.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox, override = TRUE) + if("not_enough_co2") + target.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2, override = TRUE) + if("too_much_oxy") + target.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy, override = TRUE) + if("too_much_co2") + target.throw_alert("too_much_co2", /obj/screen/alert/too_much_co2, override = TRUE) + if("tox_in_air") + target.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox, override = TRUE) + if("nutrition") + if(prob(50)) + target.throw_alert("nutrition", /obj/screen/alert/fat, override = TRUE) + else + target.throw_alert("nutrition", /obj/screen/alert/starving, override = TRUE) + if("weightless") + target.throw_alert("weightless", /obj/screen/alert/weightless, override = TRUE) + if("fire") + target.throw_alert("fire", /obj/screen/alert/fire, override = TRUE) + if("temphot") + target.throw_alert("temp", /obj/screen/alert/hot, 3, override = TRUE) + if("tempcold") + target.throw_alert("temp", /obj/screen/alert/cold, 3, override = TRUE) + if("pressure") + if(prob(50)) + target.throw_alert("pressure", /obj/screen/alert/highpressure, 2, override = TRUE) + else + target.throw_alert("pressure", /obj/screen/alert/lowpressure, 2, override = TRUE) + //BEEP BOOP I AM A ROBOT + if("newlaw") + target.throw_alert("newlaw", /obj/screen/alert/newlaw, override = TRUE) + if("locked") + target.throw_alert("locked", /obj/screen/alert/locked, override = TRUE) + if("hacked") + target.throw_alert("hacked", /obj/screen/alert/hacked, override = TRUE) + if("charge") + target.throw_alert("charge",/obj/screen/alert/emptycell, override = TRUE) + sleep(duration) + target.clear_alert(alert_type, clear_override = TRUE) + qdel(src) + +/datum/hallucination/items + cost = 15 + +/datum/hallucination/items/New(mob/living/carbon/T, forced = TRUE) + ..() + //Strange items + if(!target.halitem) + target.halitem = new + var/obj/item/l_hand = target.get_item_for_held_index(1) + var/obj/item/r_hand = target.get_item_for_held_index(2) + var/l = ui_hand_position(target.get_held_index_of_item(l_hand)) + var/r = ui_hand_position(target.get_held_index_of_item(r_hand)) + var/list/slots_free = list(l,r) + if(l_hand) slots_free -= l + if(r_hand) slots_free -= r + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(!H.belt) slots_free += ui_belt + if(!H.l_store) slots_free += ui_storage1 + if(!H.r_store) slots_free += ui_storage2 + if(slots_free.len) + target.halitem.screen_loc = pick(slots_free) + target.halitem.layer = ABOVE_HUD_LAYER + target.halitem.plane = ABOVE_HUD_PLANE + switch(rand(1,6)) + if(1) //revolver + target.halitem.icon = 'icons/obj/guns/projectile.dmi' + target.halitem.icon_state = "revolver" + target.halitem.name = "Revolver" + if(2) //c4 + target.halitem.icon = 'icons/obj/grenade.dmi' + target.halitem.icon_state = "plastic-explosive0" + target.halitem.name = "C4" + if(prob(25)) + target.halitem.icon_state = "plasticx40" + if(3) //sword + target.halitem.icon = 'icons/obj/weapons.dmi' + target.halitem.icon_state = "sword0" + target.halitem.name = "Energy Sword" + if(4) //stun baton + target.halitem.icon = 'icons/obj/weapons.dmi' + target.halitem.icon_state = "stunbaton" + target.halitem.name = "Stun Baton" + if(5) //emag + target.halitem.icon = 'icons/obj/card.dmi' + target.halitem.icon_state = "emag" + target.halitem.name = "Cryptographic Sequencer" + if(6) //flashbang + target.halitem.icon = 'icons/obj/grenade.dmi' + target.halitem.icon_state = "flashbang1" + target.halitem.name = "Flashbang" + feedback_details += "Type: [target.halitem.name]" + if(target.client) target.client.screen += target.halitem + QDEL_IN(target.halitem, rand(150, 350)) + qdel(src) + +/datum/hallucination/dangerflash + cost = 15 + +/datum/hallucination/dangerflash/New(mob/living/carbon/T, forced = TRUE) + ..() + //Flashes of danger + if(!target.halimage) + var/list/possible_points = list() + for(var/turf/open/floor/F in view(target,world.view)) + possible_points += F + if(possible_points.len) + var/turf/open/floor/danger_point = pick(possible_points) + + switch(rand(1,5)) + if(1) + target.halimage = image('icons/turf/space.dmi',danger_point,"[rand(1,25)]",TURF_LAYER) + if(2) + target.halimage = image('icons/turf/floors/lava.dmi',danger_point,"smooth",TURF_LAYER) + if(3) + target.halimage = image('icons/turf/floors/Chasms.dmi',danger_point,"smooth",TURF_LAYER) + if(4) + target.halimage = image('icons/effects/effects.dmi',danger_point,"anom",OBJ_LAYER+0.01) + if(5) + target.halimage = image('icons/effects/effects.dmi',danger_point,"electricity2",OBJ_LAYER+0.01) + + + if(target.client) + target.client.images += target.halimage + sleep(rand(200,450)) + if(target.client) + target.client.images -= target.halimage + QDEL_NULL(target.halimage) + qdel(src) + +/datum/hallucination/death + cost = 40 + +/datum/hallucination/death/New(mob/living/carbon/T, forced = TRUE) + set waitfor = 0 + ..() + target.set_screwyhud(SCREWYHUD_DEAD) + target.Knockdown(300) + target.silent += 10 + var/area/area = get_area(target) + to_chat(target, "[target.mind.name] has died at [area.name].") + if(prob(50)) + var/mob/fakemob + var/list/dead_people = list() + for(var/mob/dead/observer/G in GLOB.player_list) + dead_people += G + if(LAZYLEN(dead_people)) + fakemob = pick(dead_people) + else + fakemob = target //ever been so lonely you had to haunt yourself? + if(fakemob) + sleep(rand(20, 50)) + to_chat(target, "DEAD: [fakemob.name] says, \"[pick("rip","hey [target.first_name()]","you too?","is the AI rogue?",\ + "i[prob(50)?" fucking":""] hate [pick("blood cult", "clock cult", "revenants", "abductors","double agents","viruses","badmins","you")]")]\"") + sleep(rand(70,90)) + target.set_screwyhud(SCREWYHUD_NONE) + target.SetKnockdown(0) + target.silent = 0 + qdel(src) + +/datum/hallucination/fire + cost = 25 + +/datum/hallucination/fire/New(mob/living/carbon/T, forced = TRUE) + ..() + var/image/fire_overlay = image('icons/mob/OnFire.dmi', target, "Standing", ABOVE_MOB_LAYER) + if(target.client) + target.client.images += fire_overlay + to_chat(target, "You're set on fire!") + target.throw_alert("fire", /obj/screen/alert/fire, override = TRUE) + sleep(20) + target.throw_alert("temp", /obj/screen/alert/hot, 1, override = TRUE) + sleep(30) + target.clear_alert("temp", clear_override = TRUE) + target.throw_alert("temp", /obj/screen/alert/hot, 2, override = TRUE) + sleep(30) + target.clear_alert("temp", clear_override = TRUE) + target.throw_alert("temp", /obj/screen/alert/hot, 3, override = TRUE) + for(var/i in 1 to rand(5, 10)) + target.adjustStaminaLoss(15) + sleep(25) + target.clear_alert("fire", clear_override = TRUE) + target.clear_alert("temp", clear_override = TRUE) + if(target.client) + target.client.images -= fire_overlay + QDEL_NULL(fire_overlay) + qdel(src) + +/datum/hallucination/husks + cost = 20 + +/datum/hallucination/husks/New(mob/living/carbon/T, forced = TRUE) + ..() + if(!target.halbody) + var/list/possible_points = list() + for(var/turf/open/floor/F in view(target,world.view)) + possible_points += F + if(possible_points.len) + var/turf/open/floor/husk_point = pick(possible_points) + switch(rand(1,4)) + if(1) + var/image/body = image('icons/mob/human.dmi',husk_point,"husk",TURF_LAYER) + var/matrix/M = matrix() + M.Turn(90) + body.transform = M + target.halbody = body + if(2,3) + target.halbody = image('icons/mob/human.dmi',husk_point,"husk",TURF_LAYER) + if(4) + target.halbody = image('icons/mob/alien.dmi',husk_point,"alienother",TURF_LAYER) + + if(target.client) + target.client.images += target.halbody + sleep(rand(30,50)) //Only seen for a brief moment. + if(target.client) + target.client.images -= target.halbody + QDEL_NULL(target.halbody) + qdel(src) + +//hallucination projectile code in code/modules/projectiles/projectile/special.dm +/datum/hallucination/stray_bullet + cost = 15 + +/datum/hallucination/stray_bullet/New(mob/living/carbon/C, forced = TRUE) + ..() + var/list/turf/startlocs = list() + for(var/turf/open/T in view(world.view+1,target)-view(world.view,target)) + startlocs += T + var/turf/start = pick(startlocs) + var/proj_type = pick(subtypesof(/obj/item/projectile/hallucination)) + feedback_details += "Type: [proj_type]" + var/obj/item/projectile/hallucination/H = new proj_type(start) + target.playsound_local(start, H.hal_fire_sound, 60, 1) + H.hal_target = target + H.current = start + H.starting = start + H.yo = target.y - start.y + H.xo = target.x - start.x + H.original = target + H.fire() + qdel(src) + diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index b5c02946e7..f519892dda 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -97,7 +97,7 @@ var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = O if(!I.ice_creamed) if(product_types[dispense_flavour] > 0) - src.visible_message("[bicon(src)] [user] scoops delicious [flavour_name] ice cream into [I].") + visible_message("[icon2html(src, viewers(src))] [user] scoops delicious [flavour_name] ice cream into [I].") product_types[dispense_flavour] -= 1 I.add_ice_cream(flavour_name) // if(beaker) diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index cde68b86e2..54c2154b42 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -101,7 +101,7 @@ return open = !open if(open && !bomb_defused) - audible_message("[bicon(src)] *beep*") + audible_message("[icon2html(src, hearers(src))] *beep*") bomb_active = TRUE START_PROCESSING(SSobj, src) update_icon() diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index 17662feb6e..bfa8b8bebd 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -13,7 +13,7 @@ id = "tofu" required_reagents = list("soymilk" = 10) required_catalysts = list("enzyme" = 5) - mob_react=1 + mob_react = FALSE /datum/chemical_reaction/tofu/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -37,7 +37,7 @@ name = "Chocolate Bar" id = "chocolate_bar" required_reagents = list("chocolate_milk" = 4, "sugar" = 2) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/chocolate_bar2/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -91,7 +91,7 @@ name = "synthmeat" id = "synthmeat" required_reagents = list("blood" = 5, "cryoxadone" = 1) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/synthmeat/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index 7b236ea56f..85770f618a 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -100,7 +100,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic sendClientData() //do not convert to to_chat() - owner << {"If you can see this, update byond."} + SEND_TEXT(owner, "If you can see this, update byond.") pingLoop() @@ -152,7 +152,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic if (found.len > 0) //TODO: add a new evasion ban for the CURRENT client details, using the matched row details message_admins("[key_name(src.owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])") - log_admin_private("[key_name(src.owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])") + log_admin_private("[key_name(owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])") cookieSent = TRUE @@ -165,58 +165,6 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic log_world("\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client: [(src.owner.key ? src.owner.key : src.owner)] triggered JS error: [error]") //Global chat procs - -//Converts an icon to base64. Operates by putting the icon in the iconCache savefile, -// exporting it as text, and then parsing the base64 from that. -// (This relies on byond automatically storing icons in savefiles as base64) -/proc/icon2base64(icon/icon, iconKey = "misc") - if (!isicon(icon)) - return FALSE - GLOB.iconCache[iconKey] << icon - var/iconData = GLOB.iconCache.ExportText(iconKey) - var/list/partial = splittext(iconData, "{") - return replacetext(copytext(partial[2], 3, -5), "\n", "") - -/proc/bicon(thing) - if (!thing) - return - var/static/list/bicon_cache = list() - if (isicon(thing)) - var/icon/I = thing - var/icon_md5 = md5(I) - if (!bicon_cache[icon_md5]) // Doesn't exist yet, make it. - I = icon(I) //copy it - I.Scale(16,16) //scale it - bicon_cache[icon_md5] = icon2base64(thing) //base64 it - return "" - - // Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with. - var/atom/A = thing - var/key = "[istype(A.icon, /icon) ? "\ref[A.icon]" : A.icon]:[A.icon_state]" - - - if (!bicon_cache[key]) // Doesn't exist, make it. - var/icon/I = icon(A.icon, A.icon_state, SOUTH, 1) - I.Scale(16,16) - if (ishuman(thing)) // Shitty workaround for a BYOND issue. - var/icon/temp = I - I = icon() - I.Insert(temp, dir = SOUTH) - bicon_cache[key] = icon2base64(I, key) - - return "" - -//Costlier version of bicon() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs. -/proc/costly_bicon(thing) - if (!thing) - return - - if (isicon(thing)) - return bicon(thing) - - var/icon/I = getFlatIcon(thing) - return bicon(I) - /proc/to_chat(target, message) if(!target) return @@ -224,7 +172,6 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic //Ok so I did my best but I accept that some calls to this will be for shit like sound and images //It stands that we PROBABLY don't want to output those to the browser output so just handle them here if (istype(message, /image) || istype(message, /sound) || istype(target, /savefile)) - target << message CRASH("Invalid message! [message]") if(!istext(message)) @@ -255,7 +202,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic continue //Send it to the old style output window. - C << original_message + SEND_TEXT(C, original_message) if(!C.chatOutput || C.chatOutput.broken) // A player who hasn't updated his skin file. continue diff --git a/code/modules/goonchat/browserOutput.dm.rej b/code/modules/goonchat/browserOutput.dm.rej new file mode 100644 index 0000000000..231def1c9a --- /dev/null +++ b/code/modules/goonchat/browserOutput.dm.rej @@ -0,0 +1,137 @@ +diff a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm (rejected hunks) +@@ -166,135 +166,6 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of ic + + //Global chat procs + +-//Converts an icon to base64. Operates by putting the icon in the iconCache savefile, +-// exporting it as text, and then parsing the base64 from that. +-// (This relies on byond automatically storing icons in savefiles as base64) +-/proc/icon2base64(icon/icon, iconKey = "misc") +- if (!isicon(icon)) +- return FALSE +- WRITE_FILE(GLOB.iconCache[iconKey], icon) +- var/iconData = GLOB.iconCache.ExportText(iconKey) +- var/list/partial = splittext(iconData, "{") +- return replacetext(copytext(partial[2], 3, -5), "\n", "") +- +-/proc/icon2html(thing, target, icon_state, dir, frame = 1, moving) +- if (!thing) +- return +- var/static/datum/callback/CB = CALLBACK(GLOBAL_PROC, .proc/send_asset) +- +- var/key +- var/icon/I = thing +- if (!target) +- return +- if (target == world) +- target = GLOB.clients +- +- var/list/targets +- if (!islist(target)) +- targets = list(target) +- else +- targets = target +- if (!targets.len) +- return +- debug_usr("start") +- if (!isicon(I)) +- debug_usr("not icon") +- if (isfile(thing)) //special snowflake +- debug_usr("file") +- var/name = sanitize_filename("bicon.[thing]") +- debug_usr("file:[name]") +- register_asset(name, thing) +- var/list/callbacks +- var/list/callback_args = list() +- for (var/thing2 in targets) +- callbacks += CB +- callback_args[++callback_args.len] = list(thing2, name, TRUE) +- callback_select(callbacks, callback_args, savereturns = FALSE) +- return "" +- debug_usr("not file") +- var/atom/A +- if (isnull(dir)) +- dir = A.dir +- if (isnull(icon_state)) +- icon_state = A.icon_state +- I = A.icon +- if (ishuman(thing)) // Shitty workaround for a BYOND issue. +- debug_usr("human") +- var/icon/temp = I +- I = icon() +- I.Insert(temp, dir = SOUTH) +- dir = SOUTH +- else +- debug_usr("icon") +- if (isnull(dir)) +- dir = SOUTH +- if (isnull(icon_state)) +- icon_state = "" +- +- I = icon(I, icon_state, dir, frame) +- +- key = sanitize_filename("bicon.[md5(icon2base64(I))].[icon_state].[dir].png") +- debug_usr("key:[key]") +- register_asset(key, I) +- var/list/callbacks = list() +- var/list/callback_args = list() +- for (var/thing2 in targets) +- callbacks += CB +- callback_args[++callback_args.len] = list(thing2, key, TRUE) +- +- callback_select(callbacks, callback_args, savereturns = FALSE) +- return "" +- +-/proc/icon2base64html(thing) +- if (!thing) +- return +- var/static/list/bicon_cache = list() +- if (isicon(thing)) +- var/icon/I = thing +- var/icon_base64 = icon2base64(I) +- +- if (I.Height() > world.icon_size || I.Width() > world.icon_size) +- var/icon_md5 = md5(icon_base64) +- debug_admins(icon_md5) +- icon_base64 = bicon_cache[icon_md5] +- if (!icon_base64) // Doesn't exist yet, make it. +- I = icon(I) +- I.Scale(world.icon_size, world.icon_size) +- bicon_cache[icon_md5] = icon_base64 = icon2base64(I) +- +- +- return "" +- +- // Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with. +- var/atom/A = thing +- var/key = "[istype(A.icon, /icon) ? "\ref[A.icon]" : A.icon]:[A.icon_state]" +- +- +- if (!bicon_cache[key]) // Doesn't exist, make it. +- var/icon/I = icon(A.icon, A.icon_state, SOUTH, 1) +- if (ishuman(thing)) // Shitty workaround for a BYOND issue. +- var/icon/temp = I +- I = icon() +- I.Insert(temp, dir = SOUTH) +- +- if (I.Height() > world.icon_size || I.Width() > world.icon_size) +- I.Scale(world.icon_size, world.icon_size) +- +- bicon_cache[key] = icon2base64(I, key) +- +- return "" +- +-//Costlier version of icon2html() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs. +-/proc/costly_icon2html(thing, target) +- if (!thing) +- return +- +- if (isicon(thing)) +- return icon2html(thing, target) +- +- var/icon/I = getFlatIcon(thing) +- return icon2html(I, target) +- + /proc/to_chat(target, message) + if(!target) + return diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index ea4c169f0e..36640db74e 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -28,10 +28,14 @@ img { margin: 0; padding: 0; line-height: 1; + -ms-interpolation-mode: nearest-neighbor; + image-rendering: pixelated; } img.icon { - width: 16px; - height: 16px; + height: 1em; + min-height: 16px; + width: auto; + vertical-align: bottom; } a {color: #0000ff;} @@ -357,7 +361,6 @@ h1.alert, h2.alert {color: #000000;} .clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} -BIG IMG.icon {width: 32px; height: 32px;} .memo {color: #638500; text-align: center;} .memoedit {text-align: center; font-size: 16px;} @@ -368,6 +371,9 @@ BIG IMG.icon {width: 32px; height: 32px;} .swarmer {color: #2C75FF;} .resonate {color: #298F85;} +.love {color: #FF69Bf;} +.lovebold {color: #FF69Bf; font-weight: bold;} + .connectionClosed, .fatalError {background: red; color: white; padding: 5px;} .connectionClosed.restored {background: green;} .internal.boldnshit {color: blue; font-weight: bold;} diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js index 0df1c9a44e..e6e0c1d6fa 100644 --- a/code/modules/goonchat/browserassets/js/browserOutput.js +++ b/code/modules/goonchat/browserassets/js/browserOutput.js @@ -29,6 +29,8 @@ var opts = { 'messageLimit': 2053, //A limit...for the messages... 'scrollSnapTolerance': 10, //If within x pixels of bottom 'clickTolerance': 10, //Keep focus if outside x pixels of mousedown position on mouseup + 'imageRetryDelay': 50, //how long between attempts to reload images (in ms) + 'imageRetryLimit': 50, //how many attempts should we make? 'popups': 0, //Amount of popups opened ever 'wasd': false, //Is the user in wasd mode? 'chatMode': 'default', //The mode the chat is in @@ -133,7 +135,8 @@ function highlightTerms(el) { newWord = words[w].replace("<", "<").replace(new RegExp(opts.highlightTerms[i], 'gi'), addHighlightMarkup); break; } - console.log(newWord) + if (window.console) + console.log(newWord) } newText += newWord || words[w].replace("<", "<"); newText += w >= words.length ? '' : ' '; @@ -145,6 +148,23 @@ function highlightTerms(el) { el.innerHTML = newText; } } + +function iconError(E) { + var that = this; + setTimeout(function() { + var attempts = $(that).data('reload_attempts'); + if (typeof attempts === 'undefined' || !attempts) { + attempts = 1; + } + if (attempts > opts.imageRetryLimit) + return; + var src = that.src; + that.src = null; + that.src = src+'#'+attempts; + $(that).data('reload_attempts', ++attempts); + }, opts.imageRetryDelay); +} + //Send a message to the client function output(message, flag) { if (typeof message === 'undefined') { @@ -270,7 +290,7 @@ function output(message, flag) { entry.innerHTML = message.trim(); $messages[0].appendChild(entry); - + $(entry).find("img.icon").error(iconError); //Actually do the snap if (!filteredOut && atBottom) { $('body,html').scrollTop($messages.outerHeight()); @@ -860,7 +880,11 @@ $(function() { $messages.empty(); opts.messageCount = 0; }); - + + $('img.icon').error(iconError); + + + /***************************************** * @@ -874,4 +898,4 @@ $(function() { } $('#userBar').show(); opts.priorChatHeight = $(window).height(); -}); \ No newline at end of file +}); diff --git a/code/modules/goonchat/jsErrorHandler.dm b/code/modules/goonchat/jsErrorHandler.dm index 67ea5faca3..ce257ce660 100644 --- a/code/modules/goonchat/jsErrorHandler.dm +++ b/code/modules/goonchat/jsErrorHandler.dm @@ -32,7 +32,7 @@ CRASH("Debug Error Handling encountered an error! This is highly ironic! File: '[fileName]' has exceeded the filesize limit of: [src.logFileLimit] bytes") message = "\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client: \[[C && C.key ? C.key : "Unknown Client"]\] triggered: [message]" - logFile << message + WRITE_FILE(logFile, message) return 1 /datum/debugFileOutput/proc/clear(fileName) diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index 8bd178ead0..546e42d371 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -150,11 +150,10 @@ begin_month = APRIL /datum/holiday/april_fools/celebrate() - if(SSticker) - SSticker.login_music = 'sound/ambience/clown.ogg' - for(var/mob/dead/new_player/P in GLOB.mob_list) - if(P.client) - P.client.playtitlemusic() + SSticker.login_music = 'sound/ambience/clown.ogg' + for(var/mob/dead/new_player/P in GLOB.mob_list) + if(P.client) + P.client.playtitlemusic() /datum/holiday/fourtwenty name = "Four-Twenty" diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index 38ce9c70f1..6f28702892 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -44,14 +44,14 @@ /turf/open/floor/holofloor/asteroid/Initialize() icon_state = "asteroid[rand(0, 12)]" - ..() + . = ..() /turf/open/floor/holofloor/basalt name = "basalt" icon_state = "basalt0" /turf/open/floor/holofloor/basalt/Initialize() - ..() + . = ..() if(prob(15)) icon_state = "basalt[rand(0, 12)]" set_basalt_light(src) @@ -63,7 +63,7 @@ /turf/open/floor/holofloor/space/Initialize() icon_state = SPACE_ICON_STATE // so realistic - ..() + . = ..() /turf/open/floor/holofloor/hyperspace name = "hyperspace" @@ -72,10 +72,10 @@ /turf/open/floor/holofloor/hyperspace/Initialize() icon_state = "speedspace_ns_[(x + 5*y + (y%2+1)*7)%15+1]" - ..() + . = ..() /turf/open/floor/holofloor/hyperspace/ns/Initialize() - ..() + . = ..() icon_state = "speedspace_ns_[(x + 5*y + (y%2+1)*7)%15+1]" /turf/open/floor/holofloor/carpet @@ -89,7 +89,7 @@ canSmoothWith = null /turf/open/floor/holofloor/carpet/Initialize() - ..() + . = ..() addtimer(CALLBACK(src, .proc/update_icon), 1) /turf/open/floor/holofloor/carpet/update_icon() diff --git a/code/modules/hydroponics/grown/chili.dm b/code/modules/hydroponics/grown/chili.dm index 7707a4d438..66bd823a89 100644 --- a/code/modules/hydroponics/grown/chili.dm +++ b/code/modules/hydroponics/grown/chili.dm @@ -71,21 +71,21 @@ name = "ghost chili" desc = "It seems to be vibrating gently." icon_state = "ghostchilipepper" - var/mob/held_mob + var/mob/living/carbon/human/held_mob filling_color = "#F8F8FF" bitesize_mod = 4 origin_tech = "biotech=4;magnets=5" /obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili/attack_hand(mob/user) ..() - if( ismob(src.loc) ) - held_mob = src.loc + if( ismob(loc) ) + held_mob = loc START_PROCESSING(SSobj, src) /obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili/process() - if(held_mob && src.loc == held_mob) + if(held_mob && loc == held_mob) if(held_mob.is_holding(src)) - if(hasvar(held_mob,"gloves") && held_mob:gloves) + if(istype(held_mob) && held_mob.gloves) return held_mob.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT if(prob(10)) diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 4b83485fa5..42d7cd1239 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -23,7 +23,7 @@ var/yield = 3 // Amount of growns created per harvest. If is -1, the plant/shroom/weed is never meant to be harvested. var/potency = 10 // The 'power' of a plant. Generally effects the amount of reagent in a plant, also used in other ways. var/growthstages = 6 // Amount of growth sprites the plant has. - var/rarity = 0 // How rare the plant is. Used for giving points to cargo when shipping off to Centcom. + var/rarity = 0 // How rare the plant is. Used for giving points to cargo when shipping off to CentCom. var/list/mutatelist = list() // The type of plants that this plant can mutate into. var/list/genes = list() // Plant genes are stored here, see plant_genes.dm for more info. var/list/reagents_add = list() diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 387519a8e8..8b3deb1a8c 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -111,7 +111,7 @@ return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE) if("Thunderdome Overseer") return list(ACCESS_CENT_GENERAL, ACCESS_CENT_THUNDER) - if("Centcom Official") + if("CentCom Official") return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING) if("Medical Officer") return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_MEDICAL) @@ -123,7 +123,7 @@ return list(ACCESS_CENT_GENERAL, ACCESS_CENT_THUNDER, ACCESS_CENT_SPECOPS, ACCESS_CENT_LIVING, ACCESS_CENT_STORAGE) if("Admiral") return get_all_centcom_access() - if("Centcom Commander") + if("CentCom Commander") return get_all_centcom_access() if("Emergency Response Team Commander") return get_ert_access("commander") @@ -133,7 +133,7 @@ return get_ert_access("eng") if("Medical Response Officer") return get_ert_access("med") - if("Centcom Bartender") + if("CentCom Bartender") return list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING, ACCESS_CENT_BAR) /proc/get_all_accesses() @@ -370,7 +370,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","Centcom Bartender") + 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() @@ -379,6 +379,6 @@ var/jobName = I.assignment if(jobName in get_all_job_icons()) //Check if the job has a hud icon return jobName - if(jobName in get_all_centcom_jobs()) //Return with the NT logo if it is a Centcom job - return "Centcom" + if(jobName in get_all_centcom_jobs()) //Return with the NT logo if it is a CentCom job + return "CentCom" return "Unknown" //Return unknown if none of the above apply diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index a6b6f25aea..b9d01b7c02 100755 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -4,7 +4,7 @@ Captain /datum/job/captain title = "Captain" flag = CAPTAIN - department_head = list("Centcom") + department_head = list("CentCom") department_flag = ENGSEC faction = "Station" total_positions = 1 diff --git a/code/modules/jobs/job_types/civilian_chaplain.dm b/code/modules/jobs/job_types/civilian_chaplain.dm index eb84051ff9..3a281081ab 100644 --- a/code/modules/jobs/job_types/civilian_chaplain.dm +++ b/code/modules/jobs/job_types/civilian_chaplain.dm @@ -74,11 +74,9 @@ Chaplain else B.name = "The Holy Book of [new_religion]" - - if(SSreligion) - SSreligion.religion = new_religion - SSreligion.bible_name = B.name - SSreligion.deity = B.deity_name + SSreligion.religion = new_religion + SSreligion.bible_name = B.name + SSreligion.deity = B.deity_name H.equip_to_slot_or_del(B, slot_in_backpack) diff --git a/code/modules/language/language.dm b/code/modules/language/language.dm index 2ad7f0549c..8b51429bd3 100644 --- a/code/modules/language/language.dm +++ b/code/modules/language/language.dm @@ -35,7 +35,7 @@ return TRUE /datum/language/proc/get_icon() - return "[bicon(icon(icon, icon_state))]" + return "[icon2html(icon, world, icon_state)]" /datum/language/proc/get_random_name(gender, name_count=2, syllable_count=4, syllable_divisor=2) if(!syllables || !syllables.len) diff --git a/code/modules/library/random_books.dm b/code/modules/library/random_books.dm index e2ea2a86c5..1143dbf9a7 100644 --- a/code/modules/library/random_books.dm +++ b/code/modules/library/random_books.dm @@ -1,5 +1,5 @@ /obj/item/weapon/book/manual/random/Initialize() - ..() + . = ..() var/static/banned_books = list(/obj/item/weapon/book/manual/random, /obj/item/weapon/book/manual/nuclear, /obj/item/weapon/book/manual/wiki) var/newtype = pick(subtypesof(/obj/item/weapon/book/manual) - banned_books) new newtype(loc) @@ -10,7 +10,7 @@ var/category = null /obj/item/weapon/book/random/Initialize() - ..() + . = ..() create_random_books(amount, src.loc, TRUE, category) qdel(src) @@ -24,7 +24,7 @@ state = 2 /obj/structure/bookcase/random/Initialize(mapload) - ..() + . = ..() if(!book_count || !isnum(book_count)) update_icon() return @@ -77,7 +77,7 @@ var/ref_book_prob = 20 /obj/structure/bookcase/random/reference/Initialize(mapload) - ..() + . = ..() while(book_count > 0 && prob(ref_book_prob)) book_count-- new /obj/item/weapon/book/manual/random(src) diff --git a/code/modules/library/soapstone.dm b/code/modules/library/soapstone.dm index 26c88883df..cd069ec44d 100644 --- a/code/modules/library/soapstone.dm +++ b/code/modules/library/soapstone.dm @@ -1,6 +1,6 @@ /obj/item/soapstone name = "soapstone" - desc = "Leave informative messages for the crew, including the crew of future shifts!\nEven if out of uses, it can still be used to remove messages.\n(Not suitable for engraving on shuttles, off station or on cats. Side effects may include beatings, bannings and orbital bombardment.)" + desc = "Leave informative messages for the crew, including the crew of future shifts!\nEven if out of uses, it can still be used to remove messages.\n(Not suitable for engraving on shuttles, off station or on cats. Side effects may include prompt beatings, psychotic clown incursions, and/or orbital bombardment.)" icon = 'icons/obj/items.dmi' icon_state = "soapstone" throw_speed = 3 diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index 3aca57c4bf..fc03cfb8c0 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -95,14 +95,6 @@ has_opaque_atom = TRUE break -// If an opaque movable atom moves around we need to potentially update visibility. -/turf/Entered(var/atom/movable/Obj, var/atom/OldLoc) - . = ..() - - if (Obj && Obj.opacity) - has_opaque_atom = TRUE // Make sure to do this before reconsider_lights(), incase we're on instant updates. Guaranteed to be on in this case. - reconsider_lights() - /turf/Exited(var/atom/movable/Obj, var/atom/newloc) . = ..() diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index a1251381b4..06845ba0cb 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -284,7 +284,7 @@ L.adjustBruteLoss(bonus_value) /obj/item/crusher_trophy/tail_spike/proc/pushback(mob/living/target, mob/living/user) - if(!target.anchored || ismegafauna(target)) //megafauna will always be pushed + if(!QDELETED(target) && !QDELETED(user) && (!target.anchored || ismegafauna(target))) //megafauna will always be pushed step(target, get_dir(user, target)) //bubblegum diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 25aa9fb8e8..8029cc1416 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -170,6 +170,7 @@ /datum/action/innate/minedrone check_flags = AB_CHECK_CONSCIOUS + icon_icon = 'icons/mob/actions/actions_mecha.dmi' background_icon_state = "bg_default" /datum/action/innate/minedrone/toggle_light diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 54eec1dc8a..2cea8e32f2 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -32,7 +32,7 @@ /mob/dead/new_player/proc/new_player_panel() var/output = "

    Setup Character

    " - if(SSticker && SSticker.current_state <= GAME_STATE_PREGAME) + if(SSticker.current_state <= GAME_STATE_PREGAME) switch(ready) if(PLAYER_NOT_READY) output += "

    \[ [LINKIFY_READY("Ready", PLAYER_READY_TO_PLAY)] | Not Ready | [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] \]

    " @@ -107,18 +107,17 @@ return 1 if(href_list["ready"]) - if(SSticker) - var/tready = text2num(href_list["ready"]) - //Avoid updating ready if we're after PREGAME (they should use latejoin instead) - //This is likely not an actual issue but I don't have time to prove that this - //no longer is required - if(SSticker.current_state <= GAME_STATE_PREGAME) - ready = tready - //if it's post initialisation and they're trying to observe we do the needful - if(!SSticker.current_state < GAME_STATE_PREGAME && tready == PLAYER_READY_TO_OBSERVE) - ready = tready - make_me_an_observer() - return + var/tready = text2num(href_list["ready"]) + //Avoid updating ready if we're after PREGAME (they should use latejoin instead) + //This is likely not an actual issue but I don't have time to prove that this + //no longer is required + if(SSticker.current_state <= GAME_STATE_PREGAME) + ready = tready + //if it's post initialisation and they're trying to observe we do the needful + if(!SSticker.current_state < GAME_STATE_PREGAME && tready == PLAYER_READY_TO_OBSERVE) + ready = tready + make_me_an_observer() + return if(href_list["refresh"]) src << browse(null, "window=playersetup") //closes the player setup window diff --git a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm index 9d303f867f..ab4b044cb9 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories_Citadel.dm @@ -31,6 +31,16 @@ color_src = 0 icon = 'icons/mob/mam_bodyparts.dmi' +/datum/sprite_accessory/tails/human/bear + name = "Bear" + icon_state = "bear" + icon = 'icons/mob/mam_bodyparts.dmi' + +/datum/sprite_accessory/ears/human/bear + name = "Bear" + icon_state = "bear" + icon = 'icons/mob/mam_bodyparts.dmi' + /datum/sprite_accessory/tails/human/catbig name = "Cat, Big" icon_state = "catbig" @@ -112,7 +122,7 @@ /datum/sprite_accessory/tails/human/shark name = "Shark" icon_state = "shark" - color_src = 0 + color_src = MUTCOLORS icon = 'icons/mob/mam_bodyparts.dmi' /datum/sprite_accessory/tails/human/shark/datashark @@ -140,8 +150,7 @@ /datum/sprite_accessory/ears/wolf name = "Wolf" icon_state = "wolf" - hasinner = 1 - icon = 'icons/mob/mam_bodyparts.dmi' + extra = 1 /datum/sprite_accessory/tails/human/wolf name = "Wolf" @@ -181,6 +190,7 @@ /datum/sprite_accessory/mam_tails_animated icon = 'icons/mob/mam_bodyparts.dmi' + /datum/sprite_accessory/mam_tails_animated/none name = "None" @@ -234,6 +244,16 @@ extra = 1 extra_color_src = MUTCOLORS2 +/datum/sprite_accessory/mam_tails/bear + name = "Bear" + icon_state = "bear" + icon = 'icons/mob/mam_bodyparts.dmi' + +/datum/sprite_accessory/mam_ears/bear + name = "Bear" + icon_state = "bear" + icon = 'icons/mob/mam_bodyparts.dmi' + /datum/sprite_accessory/mam_ears/catbig name = "Cat, Big" icon_state = "cat" @@ -306,7 +326,6 @@ /datum/sprite_accessory/mam_ears/husky name = "Husky" icon_state = "wolf" - hasinner = 1 icon = 'icons/mob/mam_bodyparts.dmi' extra = 1 @@ -370,7 +389,7 @@ /datum/sprite_accessory/mam_tails/shark name = "Shark" icon_state = "shark" - color_src = 0 + color_src = MUTCOLORS /datum/sprite_accessory/mam_tails_animated/shark name = "Shark" @@ -416,7 +435,7 @@ /datum/sprite_accessory/mam_ears/wolf name = "Wolf" icon_state = "wolf" - hasinner = 1 + extra = 1 /datum/sprite_accessory/mam_tails/wolf name = "Wolf" @@ -444,7 +463,6 @@ /datum/sprite_accessory/mam_tails/rabbit name = "Rabbit" icon_state = "rabbit" - color_src = 0 icon = 'icons/mob/mam_bodyparts.dmi' /datum/sprite_accessory/mam_ears/rabbit @@ -575,6 +593,13 @@ extra2 = 1 icon = 'icons/mob/mam_body_markings.dmi' + /datum/sprite_accessory/mam_body_markings/xeno + name = "Xeno" + icon_state = "xeno" + color_src = MUTCOLORS2 + extra_color_src = MUTCOLORS3 + gender_specific = 1 + /****************************************** ************ Taur Bodies ****************** *******************************************/ @@ -653,49 +678,67 @@ //Xeno Dorsal Tubes /datum/sprite_accessory/xeno_dorsal - icon = 'icons/mob/exotic_bodyparts.dmi' - color_src = 0 + icon = 'icons/mob/xeno_parts_greyscale.dmi' /datum/sprite_accessory/xeno_dorsal/none name = "None" -/datum/sprite_accessory/xeno_dorsal/normal - name = "Dorsal Tubes" - icon_state = "dortubes" +/datum/sprite_accessory/xeno_dorsal/standard + name = "Standard" + icon_state = "standard" + icon = 'icons/mob/xeno_parts_greyscale.dmi' + +/datum/sprite_accessory/xeno_dorsal/royal + name = "Royal" + icon_state = "royal" + icon = 'icons/mob/xeno_parts_greyscale.dmi' + +/datum/sprite_accessory/xeno_dorsal/down + name = "Dorsal Down" + icon_state = "down" + icon = 'icons/mob/xeno_parts_greyscale.dmi' //Xeno Tail /datum/sprite_accessory/xeno_tail - icon = 'icons/mob/exotic_bodyparts.dmi' - color_src = 0 + icon = 'icons/mob/xeno_parts_greyscale.dmi' /datum/sprite_accessory/xeno_tail/none name = "None" -/datum/sprite_accessory/xeno_tail/normal +/datum/sprite_accessory/xeno_tail/standard name = "Xenomorph Tail" icon_state = "xeno" + icon = 'icons/mob/xeno_parts_greyscale.dmi' //Xeno Caste Heads //unused as of October 3, 2016 /datum/sprite_accessory/xeno_head - icon = 'icons/mob/exotic_bodyparts.dmi' - color_src = 0 + icon = 'icons/mob/xeno_parts_greyscale.dmi' /datum/sprite_accessory/xeno_head/none name = "None" +/datum/sprite_accessory/xeno_head/standard + name = "Standard" + icon_state = "standard" + icon = 'icons/mob/xeno_parts_greyscale.dmi' -/datum/sprite_accessory/xeno_head/hunter - name = "Hunter" - icon_state = "hunter" -/datum/sprite_accessory/xeno_head/drone - name = "Drone" - icon_state = "drone" +/datum/sprite_accessory/xeno_head/royal + name = "royal" + icon_state = "royal" + icon = 'icons/mob/xeno_parts_greyscale.dmi' + +/datum/sprite_accessory/xeno_head/hollywood + name = "hollywood" + icon_state = "hollywood" + icon = 'icons/mob/xeno_parts_greyscale.dmi' + +/datum/sprite_accessory/xeno_head/warrior + name = "warrior" + icon_state = "warrior" + icon = 'icons/mob/xeno_parts_greyscale.dmi' -/datum/sprite_accessory/xeno_head/sentinel - name = "Sentinel" - icon_state = "sentinel" /* //Slimecoon Parts /datum/sprite_accessory/slimecoon_ears diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index d8bbc559c5..da769c23cb 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -351,7 +351,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp source.plane = old_plane to_chat(src, "(Click to re-enter)") if(sound) - src << sound(sound) + SEND_SOUND(src, sound(sound)) /mob/dead/observer/proc/dead_tele() set category = "Ghost" @@ -781,8 +781,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/proc/register_pai() if(isobserver(src)) - if(SSpai) - SSpai.recruitWindow(src) + SSpai.recruitWindow(src) else to_chat(usr, "Can't become a pAI candidate while not dead!") diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index 2957124ac6..9e3212ec6e 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -72,7 +72,7 @@ var/blocked = FALSE if(ishuman(A)) var/mob/living/carbon/human/H = A - if(H.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK)) + if(H.check_shields(src, 0, "the [name]", attack_type = LEAP_ATTACK)) blocked = TRUE if(!blocked) L.visible_message("[src] pounces on [L]!", "[src] pounces on you!") diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 86ea3d64e9..01626c5694 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -87,7 +87,7 @@ var/atom/xeno_loc = get_turf(owner) var/mob/living/carbon/alien/larva/new_xeno = new(xeno_loc) new_xeno.key = ghost.key - new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention + SEND_SOUND(new_xeno, sound('sound/voice/hiss5.ogg',0,0,0,100)) //To get the player's attention new_xeno.canmove = 0 //so we don't move during the bursting animation new_xeno.notransform = 1 new_xeno.invisibility = INVISIBILITY_MAXIMUM diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 91a178ca36..feef638fdc 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -51,9 +51,10 @@ var/obj/item/item_in_hand = src.get_active_held_item() if(item_in_hand) //this segment checks if the item in your hand is twohanded. - if(istype(item_in_hand, /obj/item/weapon/twohanded)) - if(item_in_hand:wielded == 1) - to_chat(usr, "Your other hand is too busy holding the [item_in_hand.name]") + var/obj/item/weapon/twohanded/TH = item_in_hand + if(istype(TH)) + if(TH.wielded == 1) + to_chat(usr, "Your other hand is too busy holding [TH]") return var/oindex = active_hand_index active_hand_index = held_index @@ -170,6 +171,7 @@ if(thrown_thing) visible_message("[src] has thrown [thrown_thing].") + add_logs(src, thrown_thing, "has thrown") newtonian_move(get_dir(target, src)) thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src) @@ -240,6 +242,12 @@ /mob/living/carbon/is_muzzled() return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) +/mob/living/carbon/hallucinating() + if(hallucination) + return TRUE + else + return FALSE + /mob/living/carbon/resist_buckle() if(restrained()) changeNext_move(CLICK_CD_BREAKOUT) @@ -812,3 +820,4 @@ .["Make AI"] = "?_src_=vars;makeai=\ref[src]" .["Modify bodypart"] = "?_src_=vars;editbodypart=\ref[src]" .["Modify organs"] = "?_src_=vars;editorgans=\ref[src]" + .["Hallucinate"] = "?_src_=vars;hallucinate=\ref[src]" diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 8bf10c39ba..dcc2655e9a 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -337,7 +337,7 @@ // you need earmuffs, inacusiate, or replacement else if(ears.ear_damage >= 5) to_chat(src, "Your ears start to ring!") - src << sound('sound/weapons/flash_ring.ogg',0,1,0,250) + SEND_SOUND(src, sound('sound/weapons/flash_ring.ogg',0,1,0,250)) return effect_amount //how soundbanged we are diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index c6c7196755..1deeaeeb17 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -9,7 +9,7 @@ emote("deathgasp") . = ..() - if(SSticker && SSticker.mode) + if(SSticker.mode) SSticker.mode.check_win() //Calls the rounds wincheck, mainly for wizard, malf, and changeling now /mob/living/carbon/gib(no_brain, no_organs, no_bodyparts) diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index ebc349cefc..e30556db30 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -6,26 +6,26 @@ var/t_has = p_have() var/t_is = p_are() - var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src]!\n" if (handcuffed) - msg += "[t_He] [t_is] [bicon(handcuffed)] handcuffed!\n" + msg += "[t_He] [t_is] [icon2html(handcuffed, user)] handcuffed!\n" if (head) - msg += "[t_He] [t_is] wearing [bicon(head)] \a [src.head] on [t_his] head. \n" + msg += "[t_He] [t_is] wearing [icon2html(head, user)] \a [src.head] on [t_his] head. \n" if (wear_mask) - msg += "[t_He] [t_is] wearing [bicon(wear_mask)] \a [src.wear_mask] on [t_his] face.\n" + msg += "[t_He] [t_is] wearing [icon2html(wear_mask, user)] \a [src.wear_mask] on [t_his] face.\n" if (wear_neck) - msg += "[t_He] [t_is] wearing [bicon(wear_neck)] \a [src.wear_neck] around [t_his] neck.\n" + msg += "[t_He] [t_is] wearing [icon2html(wear_neck, user)] \a [src.wear_neck] around [t_his] neck.\n" for(var/obj/item/I in held_items) if(!(I.flags & ABSTRACT)) if(I.blood_DNA) - msg += "[t_He] [t_is] holding [bicon(I)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in [t_his] [get_held_index_name(get_held_index_of_item(I))]!\n" + msg += "[t_He] [t_is] holding [icon2html(I, user)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in [t_his] [get_held_index_name(get_held_index_of_item(I))]!\n" else - msg += "[t_He] [t_is] holding [bicon(I)] \a [I] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n" + msg += "[t_He] [t_is] holding [icon2html(I, user)] \a [I] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n" if (back) - msg += "[t_He] [t_has] [bicon(back)] \a [src.back] on [t_his] back.\n" + msg += "[t_He] [t_has] [icon2html(back, user)] \a [src.back] on [t_his] back.\n" var/appears_dead = 0 if (stat == DEAD) appears_dead = 1 diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 94732a349d..c2bec849e2 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -19,55 +19,55 @@ if(istype(w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = w_uniform if(U.attached_accessory) - accessory_msg += " with [bicon(U.attached_accessory)] \a [U.attached_accessory]" + accessory_msg += " with [icon2html(U.attached_accessory, user)] \a [U.attached_accessory]" if(w_uniform.blood_DNA) - msg += "[t_He] [t_is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] blood-stained [w_uniform.name][accessory_msg]!\n" + msg += "[t_He] [t_is] wearing [icon2html(w_uniform, user)] [w_uniform.gender==PLURAL?"some":"a"] blood-stained [w_uniform.name][accessory_msg]!\n" else - msg += "[t_He] [t_is] wearing [bicon(w_uniform)] \a [w_uniform][accessory_msg].\n" + msg += "[t_He] [t_is] wearing [icon2html(w_uniform, user)] \a [w_uniform][accessory_msg].\n" //head if(head) if(head.blood_DNA) - msg += "[t_He] [t_is] wearing [bicon(head)] [head.gender==PLURAL?"some":"a"] blood-stained [head.name] on [t_his] head!\n" + msg += "[t_He] [t_is] wearing [icon2html(head, user)] [head.gender==PLURAL?"some":"a"] blood-stained [head.name] on [t_his] head!\n" else - msg += "[t_He] [t_is] wearing [bicon(head)] \a [head] on [t_his] head.\n" + msg += "[t_He] [t_is] wearing [icon2html(head, user)] \a [head] on [t_his] head.\n" //suit/armor if(wear_suit) if(wear_suit.blood_DNA) - msg += "[t_He] [t_is] wearing [bicon(wear_suit)] [wear_suit.gender==PLURAL?"some":"a"] blood-stained [wear_suit.name]!\n" + msg += "[t_He] [t_is] wearing [icon2html(wear_suit, user)] [wear_suit.gender==PLURAL?"some":"a"] blood-stained [wear_suit.name]!\n" else - msg += "[t_He] [t_is] wearing [bicon(wear_suit)] \a [wear_suit].\n" + msg += "[t_He] [t_is] wearing [icon2html(wear_suit, user)] \a [wear_suit].\n" //suit/armor storage if(s_store) if(s_store.blood_DNA) - msg += "[t_He] [t_is] carrying [bicon(s_store)] [s_store.gender==PLURAL?"some":"a"] blood-stained [s_store.name] on [t_his] [wear_suit.name]!\n" + msg += "[t_He] [t_is] carrying [icon2html(s_store, user)] [s_store.gender==PLURAL?"some":"a"] blood-stained [s_store.name] on [t_his] [wear_suit.name]!\n" else - msg += "[t_He] [t_is] carrying [bicon(s_store)] \a [s_store] on [t_his] [wear_suit.name].\n" + msg += "[t_He] [t_is] carrying [icon2html(s_store, user)] \a [s_store] on [t_his] [wear_suit.name].\n" //back if(back) if(back.blood_DNA) - msg += "[t_He] [t_has] [bicon(back)] [back.gender==PLURAL?"some":"a"] blood-stained [back] on [t_his] back.\n" + msg += "[t_He] [t_has] [icon2html(back, user)] [back.gender==PLURAL?"some":"a"] blood-stained [back] on [t_his] back.\n" else - msg += "[t_He] [t_has] [bicon(back)] \a [back] on [t_his] back.\n" + msg += "[t_He] [t_has] [icon2html(back, user)] \a [back] on [t_his] back.\n" //Hands for(var/obj/item/I in held_items) if(!(I.flags & ABSTRACT)) if(I.blood_DNA) - msg += "[t_He] [t_is] holding [bicon(I)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in [t_his] [get_held_index_name(get_held_index_of_item(I))]!\n" + msg += "[t_He] [t_is] holding [icon2html(I, user)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in [t_his] [get_held_index_name(get_held_index_of_item(I))]!\n" else - msg += "[t_He] [t_is] holding [bicon(I)] \a [I] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n" + msg += "[t_He] [t_is] holding [icon2html(I, user)] \a [I] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n" //gloves if(gloves && !(slot_gloves in obscured)) if(gloves.blood_DNA) - msg += "[t_He] [t_has] [bicon(gloves)] [gloves.gender==PLURAL?"some":"a"] blood-stained [gloves.name] on [t_his] hands!\n" + msg += "[t_He] [t_has] [icon2html(gloves, user)] [gloves.gender==PLURAL?"some":"a"] blood-stained [gloves.name] on [t_his] hands!\n" else - msg += "[t_He] [t_has] [bicon(gloves)] \a [gloves] on [t_his] hands.\n" + msg += "[t_He] [t_has] [icon2html(gloves, user)] \a [gloves] on [t_his] hands.\n" else if(blood_DNA) var/hand_number = get_num_arms() if(hand_number) @@ -78,48 +78,48 @@ //handcuffed? if(handcuffed) if(istype(handcuffed, /obj/item/weapon/restraints/handcuffs/cable)) - msg += "[t_He] [t_is] [bicon(handcuffed)] restrained with cable!\n" + msg += "[t_He] [t_is] [icon2html(handcuffed, user)] restrained with cable!\n" else - msg += "[t_He] [t_is] [bicon(handcuffed)] handcuffed!\n" + msg += "[t_He] [t_is] [icon2html(handcuffed, user)] handcuffed!\n" //belt if(belt) if(belt.blood_DNA) - msg += "[t_He] [t_has] [bicon(belt)] [belt.gender==PLURAL?"some":"a"] blood-stained [belt.name] about [t_his] waist!\n" + msg += "[t_He] [t_has] [icon2html(belt, user)] [belt.gender==PLURAL?"some":"a"] blood-stained [belt.name] about [t_his] waist!\n" else - msg += "[t_He] [t_has] [bicon(belt)] \a [belt] about [t_his] waist.\n" + msg += "[t_He] [t_has] [icon2html(belt, user)] \a [belt] about [t_his] waist.\n" //shoes if(shoes && !(slot_shoes in obscured)) if(shoes.blood_DNA) - msg += "[t_He] [t_is] wearing [bicon(shoes)] [shoes.gender==PLURAL?"some":"a"] blood-stained [shoes.name] on [t_his] feet!\n" + msg += "[t_He] [t_is] wearing [icon2html(shoes, user)] [shoes.gender==PLURAL?"some":"a"] blood-stained [shoes.name] on [t_his] feet!\n" else - msg += "[t_He] [t_is] wearing [bicon(shoes)] \a [shoes] on [t_his] feet.\n" + msg += "[t_He] [t_is] wearing [icon2html(shoes, user)] \a [shoes] on [t_his] feet.\n" //mask if(wear_mask && !(slot_wear_mask in obscured)) if(wear_mask.blood_DNA) - msg += "[t_He] [t_has] [bicon(wear_mask)] [wear_mask.gender==PLURAL?"some":"a"] blood-stained [wear_mask.name] on [t_his] face!\n" + msg += "[t_He] [t_has] [icon2html(wear_mask, user)] [wear_mask.gender==PLURAL?"some":"a"] blood-stained [wear_mask.name] on [t_his] face!\n" else - msg += "[t_He] [t_has] [bicon(wear_mask)] \a [wear_mask] on [t_his] face.\n" + msg += "[t_He] [t_has] [icon2html(wear_mask, user)] \a [wear_mask] on [t_his] face.\n" if (wear_neck && !(slot_neck in obscured)) - msg += "[t_He] [t_is] wearing [bicon(wear_neck)] \a [src.wear_neck] around [t_his] neck.\n" + msg += "[t_He] [t_is] wearing [icon2html(wear_neck, user)] \a [src.wear_neck] around [t_his] neck.\n" //eyes if(glasses && !(slot_glasses in obscured)) if(glasses.blood_DNA) - msg += "[t_He] [t_has] [bicon(glasses)] [glasses.gender==PLURAL?"some":"a"] blood-stained [glasses] covering [t_his] eyes!\n" + msg += "[t_He] [t_has] [icon2html(glasses, user)] [glasses.gender==PLURAL?"some":"a"] blood-stained [glasses] covering [t_his] eyes!\n" else - msg += "[t_He] [t_has] [bicon(glasses)] \a [glasses] covering [t_his] eyes.\n" + msg += "[t_He] [t_has] [icon2html(glasses, user)] \a [glasses] covering [t_his] eyes.\n" //ears if(ears && !(slot_ears in obscured)) - msg += "[t_He] [t_has] [bicon(ears)] \a [ears] on [t_his] ears.\n" + msg += "[t_He] [t_has] [icon2html(ears, user)] \a [ears] on [t_his] ears.\n" //ID if(wear_id) - msg += "[t_He] [t_is] wearing [bicon(wear_id)] \a [wear_id].\n" + msg += "[t_He] [t_is] wearing [icon2html(wear_id, user)] \a [wear_id].\n" //Jitters switch(jitteriness) @@ -164,7 +164,7 @@ var/obj/item/bodypart/BP = X missing -= BP.body_zone for(var/obj/item/I in BP.embedded_objects) - msg += "[t_He] [t_has] \a [bicon(I)] [I] embedded in [t_his] [BP.name]!\n" + msg += "[t_He] [t_has] \a [icon2html(I, user)] [I] embedded in [t_his] [BP.name]!\n" //stores missing limbs var/l_limbs_missing = 0 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 74bc902be5..4424e80ce8 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -9,11 +9,11 @@ real_name = "Test Dummy" status_flags = GODMODE|CANPUSH -/mob/living/carbon/human/dummy/New(loc) +INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) + +/mob/living/carbon/human/dummy/Destroy() ..() - if(!initialized) - args[1] = FALSE - Initialize(arglist(args)) + return QDEL_HINT_QUEUE /mob/living/carbon/human/dummy/Life() return diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 69b581995b..3dacc2f444 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -143,7 +143,7 @@ var/protection = (prot["head"] + prot["arms"] + prot["feet"] + prot["legs"] + prot["groin"] + prot["chest"] + prot["hands"])/7 return protection -/mob/living/carbon/human/can_use_guns(var/obj/item/weapon/gun/G) +/mob/living/carbon/human/can_use_guns(var/obj/item/weapon/G) . = ..() if(G.trigger_guard == TRIGGER_GUARD_NORMAL) diff --git a/code/modules/mob/living/carbon/human/interactive.dm b/code/modules/mob/living/carbon/human/interactive.dm index e439f8ef9e..2ed81b9f88 100644 --- a/code/modules/mob/living/carbon/human/interactive.dm +++ b/code/modules/mob/living/carbon/human/interactive.dm @@ -97,7 +97,7 @@ if(voice_saved) return var/savefile/S = new /savefile("data/npc_saves/snpc.sav") - S["knownStrings"] << knownStrings + WRITE_FILE(S["knownStrings"], knownStrings) //botPool funcs /mob/living/carbon/human/interactive/proc/takeDelegate(mob/living/carbon/human/interactive/from,doReset=TRUE) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index d9f1acf879..da99954f29 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -63,6 +63,7 @@ return list( head, wear_mask, + wear_neck, glasses, ears, ) @@ -171,7 +172,7 @@ dropItemToGround(belt) w_uniform = null update_suit_sensors() - if(!QDELETED(src)) + if(!QDELETED(src)) update_inv_w_uniform() else if(I == gloves) gloves = null diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index d612a4f061..32d6a89494 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -79,6 +79,28 @@ datum/species/mammal return TRUE //HERBIVOROUS// +//Alien// +/datum/species/xeno + // A cloning mistake, crossing human and xenomorph DNA + name = "xeno" + id = "xeno" + say_mod = "hisses" + default_color = "00FF00" + species_traits = list(MUTCOLORS,LIPS,DIGITIGRADE,PIERCEIMMUNE) + mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "taur","mam_body_markings") + default_features = list("xenotail"="xeno","xenohead"="standard","xenodorsal"="standard","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None","mam_body_markings" = "xeno") + heatmod = 1.3 + attack_verb = "slash" + attack_sound = 'sound/weapons/slash.ogg' + miss_sound = 'sound/weapons/slashmiss.ogg' + meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno + skinned_type = /obj/item/stack/sheet/animalhide/xeno + exotic_bloodtype = "L" + damage_overlay_type = "xeno" + roundstart = 1 + +//Praise the Omnissiah, A challange worthy of my skills - HS + //EXOTIC// //These races will likely include lots of downsides and upsides. Keep them relatively balanced.// /* @@ -217,4 +239,4 @@ datum/species/guilmon attack_verb = "claw" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' - roundstart = 1 \ No newline at end of file + roundstart = 1 diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 72c65ae471..c52d9862ad 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -378,8 +378,7 @@ adjust_drugginess(-1) if(hallucination) - spawn handle_hallucinations() - hallucination = max(hallucination-2,0) + handle_hallucinations() //used in human and monkey handle_environment() /mob/living/carbon/proc/natural_bodytemperature_stabilization() diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index f57a48b5c6..9ed0a74d31 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -140,7 +140,7 @@ return 0 return 1 -/mob/living/carbon/monkey/can_use_guns(var/obj/item/weapon/gun/G) +/mob/living/carbon/monkey/can_use_guns(var/obj/item/weapon/G) return 1 /mob/living/carbon/monkey/angry diff --git a/code/modules/mob/living/carbon/monkey/punpun.dm b/code/modules/mob/living/carbon/monkey/punpun.dm index 901f2ceabc..b56028634f 100644 --- a/code/modules/mob/living/carbon/monkey/punpun.dm +++ b/code/modules/mob/living/carbon/monkey/punpun.dm @@ -51,23 +51,23 @@ /mob/living/carbon/monkey/punpun/proc/Write_Memory(dead, gibbed) var/savefile/S = new /savefile("data/npc_saves/Punpun.sav") if(gibbed) - S["ancestor_name"] << null - S["ancestor_chain"] << 1 - S["relic_hat"] << null - S["relic_mask"] << null + WRITE_FILE(S["ancestor_name"], null) + WRITE_FILE(S["ancestor_chain"], 1) + WRITE_FILE(S["relic_hat"], null) + WRITE_FILE(S["relic_mask"], null) return if(dead) - S["ancestor_name"] << ancestor_name - S["ancestor_chain"] << ancestor_chain + 1 + WRITE_FILE(S["ancestor_name"], ancestor_name) + WRITE_FILE(S["ancestor_chain"], ancestor_chain + 1) if(!ancestor_name) //new monkey name this round - S["ancestor_name"] << name + WRITE_FILE(S["ancestor_name"], name) if(head) - S["relic_hat"] << head.type + WRITE_FILE(S["relic_hat"], head.type) else - S["relic_hat"] << null + WRITE_FILE(S["relic_hat"], null) if(wear_mask) - S["relic_mask"] << wear_mask.type + WRITE_FILE(S["relic_mask"], wear_mask.type) else - S["relic_mask"] << null + WRITE_FILE(S["relic_mask"], null) if(!dead) memory_saved = 1 diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 8bdcf30f66..ff37b85800 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -326,7 +326,7 @@ /datum/emote/living/surrender key = "surrender" key_third_person = "surrenders" - message = "puts their hands on their head and falls to the ground, they surrender%s!" + message = "puts their hands on their head and falls to the ground, they surrender!" emote_type = EMOTE_AUDIBLE /datum/emote/living/surrender/run_emote(mob/user, params) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 6624e5740f..9684e44ac9 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -550,6 +550,7 @@ if(!restrained(ignore_grab = 1) && pulledby) visible_message("[src] resists against [pulledby]'s grip!") resist_grab() + add_logs(pulledby, src, "resisted grab") return //unbuckling yourself @@ -587,6 +588,7 @@ if(pulledby.grab_state) if(prob(30/pulledby.grab_state)) visible_message("[src] has broken free of [pulledby]'s grip!") + add_logs(pulledby, src, "broke grab") pulledby.stop_pulling() return 0 if(moving_resist && client) //we resisted by trying to move @@ -754,7 +756,7 @@ var/turf/T = get_turf(src) if(!T) return 0 - if(T.z == ZLEVEL_CENTCOM) //dont detect mobs on centcomm + if(T.z == ZLEVEL_CENTCOM) //dont detect mobs on centcom return 0 if(T.z >= ZLEVEL_SPACEMAX) return 0 @@ -795,7 +797,7 @@ else to_chat(src, "You don't have the dexterity to do this!") return -/mob/living/proc/can_use_guns(var/obj/item/weapon/gun/G) +/mob/living/proc/can_use_guns(var/obj/item/weapon/G) if (G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser()) to_chat(src, "You don't have the dexterity to do this!") return 0 diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 0c693b4749..01dca7f00e 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -89,7 +89,7 @@ var/armor = run_armor_check(zone, "melee", "Your armor has protected your [parse_zone(zone)].", "Your armor has softened hit to your [parse_zone(zone)].",I.armour_penetration) apply_damage(I.throwforce, dtype, zone, armor) if(I.thrownby) - add_logs(I.thrownby, src, "hit", I) + add_logs(I.thrownby, src, "threw and hit", I) else return 1 else @@ -150,6 +150,7 @@ var/grab_upgrade_time = 30 visible_message("[user] starts to tighten [user.p_their()] grip on [src]!", \ "[user] starts to tighten [user.p_their()] grip on you!") + add_logs(user, src, "attempted to strangle", addition="grab") if(!do_mob(user, src, grab_upgrade_time)) return 0 if(!user.pulling || user.pulling != src || user.grab_state != old_grab_state || user.a_intent != INTENT_GRAB) @@ -157,18 +158,20 @@ user.grab_state++ switch(user.grab_state) if(GRAB_AGGRESSIVE) - add_logs(user, src, "grabbed", addition="aggressively") + add_logs(user, src, "grabbed", addition="aggressive grab") visible_message("[user] has grabbed [src] aggressively!", \ "[user] has grabbed [src] aggressively!") drop_all_held_items() stop_pulling() if(GRAB_NECK) + add_logs(user, src, "grabbed", addition="neck grab") 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) + add_logs(user, src, "strangled", addition="grab") visible_message("[user] is strangling [src]!", \ "[user] is strangling you!") update_canmove() //we fall down @@ -316,7 +319,7 @@ GLOB.cult_narsie.souls += 1 if((GLOB.cult_narsie.souls == GLOB.cult_narsie.soul_goal) && (GLOB.cult_narsie.resolved == FALSE)) GLOB.cult_narsie.resolved = TRUE - world << sound('sound/machines/alarm.ogg') + sound_to_playing_players('sound/machines/alarm.ogg') addtimer(CALLBACK(GLOBAL_PROC, .proc/cult_ending_helper, 1), 120) addtimer(CALLBACK(GLOBAL_PROC, .proc/ending_helper), 270) if(client) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index dcc9e0a58c..68e2b150f3 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -18,7 +18,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( // Faction "t" = "Syndicate", - "y" = "Centcom", + "y" = "CentCom", // Species "b" = "binary", @@ -53,7 +53,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( // Faction "" = "Syndicate", - "" = "Centcom", + "" = "CentCom", // Species "" = "binary", diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index fd17f123b8..35c107b532 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -79,8 +79,6 @@ var/cooldown = 0 var/acceleration = 1 - var/obj/machinery/camera/portable/builtInCamera - var/obj/structure/AIcore/deactivated/linked_core //For exosuit control var/mob/living/silicon/robot/deployed_shell = null //For shell control var/datum/action/innate/deploy_shell/deploy_action = new @@ -151,7 +149,7 @@ GLOB.ai_list += src GLOB.shuttle_caller_list += src - builtInCamera = new /obj/machinery/camera/portable(src) + builtInCamera = new (src) builtInCamera.network = list("SS13") diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index b19e866378..3af95cec4c 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -1,5 +1,5 @@ /mob/living/silicon/ai/examine(mob/user) - var/msg = "*---------*\nThis is [bicon(src)] [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src, user)] [src]!\n" if (stat == DEAD) msg += "It appears to be powered-down.\n" else diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm index 2e800f7de0..f0e079b594 100644 --- a/code/modules/mob/living/silicon/ai/say.dm +++ b/code/modules/mob/living/silicon/ai/say.dm @@ -163,9 +163,9 @@ if(M.client && M.can_hear() && (M.client.prefs.toggles & SOUND_ANNOUNCEMENTS)) var/turf/T = get_turf(M) if(T.z == z_level) - M << voice + SEND_SOUND(M, voice) else - only_listener << voice + SEND_SOUND(only_listener, voice) return 1 return 0 diff --git a/code/modules/mob/living/silicon/pai/personality.dm b/code/modules/mob/living/silicon/pai/personality.dm index 869009f255..4b2bc45118 100644 --- a/code/modules/mob/living/silicon/pai/personality.dm +++ b/code/modules/mob/living/silicon/pai/personality.dm @@ -17,12 +17,12 @@ var/savefile/F = new /savefile(src.savefile_path(user)) - F["name"] << src.name - F["description"] << src.description - F["role"] << src.role - F["comments"] << src.comments + WRITE_FILE(F["name"], name) + WRITE_FILE(F["description"], description) + WRITE_FILE(F["role"], role) + WRITE_FILE(F["comments"], comments) - F["version"] << 1 + WRITE_FILE(F["version"], 1) return 1 diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 0806f457d9..f0c50e17f1 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -173,7 +173,7 @@ if(href_list["send"]) sradio.send_signal("ACTIVATE") - audible_message("[bicon(src)] *beep* *beep*") + audible_message("[icon2html(src, world)] *beep* *beep*") if(href_list["freq"]) @@ -331,7 +331,7 @@ /mob/living/silicon/pai/proc/downloadSoftware() var/dat = "" - dat += "

    Centcom pAI Module Subversion Network


    " + dat += "

    CentCom pAI Module Subversion Network


    " dat += "
    Remaining Available Memory: [src.ram]

    " dat += "

    Trunks available for checkout
    " @@ -619,7 +619,8 @@ src.paiInterface() if(hackprogress >= 100) src.hackprogress = 0 - src.cable.machine:open() + var/obj/machinery/door/D = cable.machine + D.open() sleep(50) // Update every 5 seconds // Digital Messenger diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index c8c57dc602..7eb241e01f 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -22,8 +22,8 @@ locked = FALSE //unlock cover update_canmove() - if(camera && camera.status) - camera.toggle_cam(src,0) + if(!QDELETED(builtInCamera) && builtInCamera.status) + builtInCamera.toggle_cam(src,0) update_headlamp(1) //So borg lights are disabled when killed. uneq_all() // particularly to ensure sight modes are cleared diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index 7f232e20f4..788a8f4255 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -1,11 +1,11 @@ /mob/living/silicon/robot/examine(mob/user) - var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src]!\n" if(desc) msg += "[desc]\n" var/obj/act_module = get_active_held_item() if(act_module) - msg += "It is holding [bicon(act_module)] \a [act_module].\n" + msg += "It is holding [icon2html(act_module, user)] \a [act_module].\n" msg += "" if (src.getBruteLoss()) if (src.getBruteLoss() < maxHealth*0.5) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 93f88bdfee..520a060e9e 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -42,7 +42,6 @@ var/mob/living/silicon/ai/connected_ai = null var/obj/item/weapon/stock_parts/cell/cell = null - var/obj/machinery/camera/camera = null var/opened = 0 var/emagged = FALSE @@ -76,7 +75,6 @@ var/lamp_recharging = 0 //Flag for if the lamp is on cooldown after being forcibly disabled. var/sight_mode = 0 - var/updating = 0 //portable camera camerachunk update hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD) var/list/upgrades = list() @@ -127,16 +125,16 @@ lawupdate = FALSE radio = new /obj/item/device/radio/borg(src) - if(!scrambledcodes && !camera) - camera = new /obj/machinery/camera(src) - camera.c_tag = real_name - camera.network = list("SS13") + if(!scrambledcodes && !builtInCamera) + builtInCamera = new (src) + builtInCamera.c_tag = real_name + builtInCamera.network = list("SS13") if(wires.is_cut(WIRE_CAMERA)) - camera.status = 0 + builtInCamera.status = 0 module = new /obj/item/weapon/robot_module(src) module.rebuild_modules() update_icons() - ..() + . = ..() //If this body is meant to be a borg controlled by the AI player if(shell) @@ -191,7 +189,6 @@ wires = null module = null eye_lights = null - camera = null cell = null return ..() @@ -238,8 +235,8 @@ real_name = changed_name name = real_name - if(camera) - camera.c_tag = real_name //update the camera name too + if(!QDELETED(builtInCamera)) + builtInCamera.c_tag = real_name //update the camera name too /mob/living/silicon/robot/proc/get_standard_name() return "[(designation ? "[designation] " : "")][mmi.braintype]-[ident]" @@ -676,9 +673,8 @@ canmove = 1 scrambledcodes = 1 //Disconnect it's camera so it's not so easily tracked. - if(src.camera) - qdel(src.camera) - src.camera = null + if(!QDELETED(builtInCamera)) + QDEL_NULL(builtInCamera) // I'm trying to get the Cyborg to not be listed in the camera list // Instead of being listed as "deactivated". The downside is that I'm going // to have to check if every camera is null or not before doing anything, to prevent runtime errors. @@ -959,8 +955,8 @@ /mob/living/silicon/robot/revive(full_heal = 0, admin_revive = 0) if(..()) //successfully ressuscitated from death - if(camera && !wires.is_cut(WIRE_CAMERA)) - camera.toggle_cam(src,0) + if(!QDELETED(builtInCamera) && !wires.is_cut(WIRE_CAMERA)) + builtInCamera.toggle_cam(src,0) update_headlamp() if(admin_revive) locked = TRUE @@ -971,8 +967,8 @@ ..() if(oldname != real_name) notify_ai(RENAME, oldname, newname) - if(camera) - camera.c_tag = real_name + if(!QDELETED(builtInCamera)) + builtInCamera.c_tag = real_name custom_name = newname @@ -1036,8 +1032,8 @@ name = "[designation] AI Shell [rand(100,999)]" real_name = name GLOB.available_ai_shells |= src - if(camera) - camera.c_tag = real_name //update the camera name too + if(!QDELETED(builtInCamera)) + builtInCamera.c_tag = real_name //update the camera name too diag_hud_set_aishell() notify_ai(AI_SHELL) @@ -1052,15 +1048,15 @@ GLOB.available_ai_shells -= src name = "Unformatted Cyborg [rand(100,999)]" real_name = name - if(camera) - camera.c_tag = real_name + if(!QDELETED(builtInCamera)) + builtInCamera.c_tag = real_name diag_hud_set_aishell() /mob/living/silicon/robot/proc/deploy_init(var/mob/living/silicon/ai/AI) real_name = "[AI.real_name] shell [rand(100, 999)] - [designation]" //Randomizing the name so it shows up separately in the shells list name = real_name - if(camera) - camera.c_tag = real_name //update the camera name too + if(!QDELETED(builtInCamera)) + builtInCamera.c_tag = real_name //update the camera name too mainframe = AI deployed = TRUE connected_ai = mainframe @@ -1105,8 +1101,8 @@ undeployment_action.Remove(src) if(radio) //Return radio to normal radio.recalculateChannels() - if(camera) - camera.c_tag = real_name //update the camera name too + if(!QDELETED(builtInCamera)) + builtInCamera.c_tag = real_name //update the camera name too diag_hud_set_aishell() mainframe.diag_hud_set_deployed() if(mainframe.laws) diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index a2f6bf5681..167137d9d1 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -1,24 +1,3 @@ -/mob/living/silicon/robot/Moved(oldLoc, dir) - . = ..() - update_camera_location(oldLoc) - -/mob/living/silicon/robot/forceMove(atom/destination) - . = ..() - update_camera_location(destination) - -/mob/living/silicon/robot/proc/do_camera_update(oldLoc) - if(!QDELETED(camera) && oldLoc != get_turf(src)) - GLOB.cameranet.updatePortableCamera(camera) - updating = FALSE - -#define BORG_CAMERA_BUFFER 30 -/mob/living/silicon/robot/proc/update_camera_location(oldLoc) - oldLoc = get_turf(oldLoc) - if(!QDELETED(camera) && !updating && oldLoc != get_turf(src)) - updating = TRUE - addtimer(CALLBACK(src, .proc/do_camera_update, oldLoc), BORG_CAMERA_BUFFER) -#undef BORG_CAMERA_BUFFER - /mob/living/silicon/robot/Process_Spacemove(movement_dir = 0) if(ionpulse()) return 1 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index bdc2338828..4d3c468191 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -36,6 +36,8 @@ var/d_hud = DATA_HUD_DIAGNOSTIC //There is only one kind of diag hud var/law_change_counter = 0 + var/obj/machinery/camera/builtInCamera = null + var/updating = FALSE //portable camera camerachunk update /mob/living/silicon/Initialize() . = ..() @@ -54,6 +56,7 @@ /mob/living/silicon/Destroy() radio = null aicamera = null + QDEL_NULL(builtInCamera) GLOB.silicon_mobs -= src return ..() diff --git a/code/modules/mob/living/silicon/silicon_movement.dm b/code/modules/mob/living/silicon/silicon_movement.dm new file mode 100644 index 0000000000..c7267acf76 --- /dev/null +++ b/code/modules/mob/living/silicon/silicon_movement.dm @@ -0,0 +1,20 @@ +/mob/living/silicon/Moved(oldLoc, dir) + . = ..() + update_camera_location(oldLoc) + +/mob/living/silicon/forceMove(atom/destination) + . = ..() + update_camera_location(destination) + +/mob/living/silicon/proc/do_camera_update(oldLoc) + if(!QDELETED(builtInCamera) && oldLoc != get_turf(src)) + GLOB.cameranet.updatePortableCamera(builtInCamera) + updating = FALSE + +#define SILICON_CAMERA_BUFFER 10 +/mob/living/silicon/proc/update_camera_location(oldLoc) + oldLoc = get_turf(oldLoc) + if(!QDELETED(builtInCamera) && !updating && oldLoc != get_turf(src)) + updating = TRUE + addtimer(CALLBACK(src, .proc/do_camera_update, oldLoc), SILICON_CAMERA_BUFFER) +#undef SILICON_CAMERA_BUFFER diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 4cc0ab3a62..3c963ca820 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -116,7 +116,7 @@ update_icon() /mob/living/simple_animal/bot/Initialize() - ..() + . = ..() access_card = new /obj/item/weapon/card/id(src) //This access is so bots can be immediately set to patrol and leave Robotics, instead of having to be let out first. access_card.access += ACCESS_ROBOTICS @@ -469,7 +469,7 @@ Pass a positive integer as an argument to override a bot's default speed. var/area/end_area = get_area(waypoint) if(client) //Player bots instead get a location command from the AI - to_chat(src, "Priority waypoint set by [bicon(caller)] [caller]. Proceed to [end_area.name]<\b>.") + to_chat(src, "Priority waypoint set by [icon2html(caller, src)] [caller]. Proceed to [end_area.name]<\b>.") //For giving the bot temporary all-access. var/obj/item/weapon/card/id/all_access = new /obj/item/weapon/card/id @@ -485,7 +485,7 @@ Pass a positive integer as an argument to override a bot's default speed. turn_on() //Saves the AI the hassle of having to activate a bot manually. access_card = all_access //Give the bot all-access while under the AI's command. if(message) - to_chat(calling_ai, "[bicon(src)] [name] called to [end_area.name]. [path.len-1] meters to destination.") + to_chat(calling_ai, "[icon2html(src, calling_ai)] [name] called to [end_area.name]. [path.len-1] meters to destination.") pathset = 1 mode = BOT_RESPONDING tries = 0 @@ -500,7 +500,7 @@ Pass a positive integer as an argument to override a bot's default speed. var/success = bot_move(ai_waypoint, 3) if(!success) if(calling_ai) - to_chat(calling_ai, "[bicon(src)] [get_turf(src) == ai_waypoint ? "[src] successfully arrived to waypoint." : "[src] failed to reach waypoint."]") + to_chat(calling_ai, "[icon2html(src, calling_ai)] [get_turf(src) == ai_waypoint ? "[src] successfully arrived to waypoint." : "[src] failed to reach waypoint."]") calling_ai = null bot_reset() diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index e8936a2863..74005e84dd 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -596,7 +596,7 @@ if(pathset) //The AI called us here, so notify it of our arrival. loaddir = dir //The MULE will attempt to load a crate in whatever direction the MULE is "facing". if(calling_ai) - to_chat(calling_ai, "[bicon(src)] [src] wirelessly plays a chiming sound!") + to_chat(calling_ai, "[icon2html(src, calling_ai)] [src] wirelessly plays a chiming sound!") playsound(calling_ai, 'sound/machines/chime.ogg',40, 0) calling_ai = null radio_channel = "AI Private" //Report on AI Private instead if the AI is controlling us. diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 42c42bcf16..bb69af7301 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -44,7 +44,7 @@ desc = "It's Officer Beep O'sky's smaller, just-as aggressive cousin, Pipsqueak." /mob/living/simple_animal/bot/secbot/beepsky/jr/Initialize() - ..() + . = ..() resize = 0.8 update_transform() @@ -63,7 +63,7 @@ radio_channel = "AI Private" /mob/living/simple_animal/bot/secbot/Initialize() - ..() + . = ..() icon_state = "secbot[on]" spawn(3) var/datum/job/detective/J = new/datum/job/detective diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 74f855bf8c..e0993c6ce5 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -50,7 +50,7 @@ /mob/living/simple_animal/hostile/construct/examine(mob/user) var/t_He = p_they(TRUE) var/t_s = p_s() - var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src]!\n" msg += "[desc]\n" if(health < maxHealth) msg += "" diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm index 0c153d37e2..07222ade05 100644 --- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm +++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm @@ -25,6 +25,6 @@ verb_yell = "flutters intensely" /mob/living/simple_animal/butterfly/Initialize() - ..() + . = ..() var/newcolor = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) - add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) \ No newline at end of file + add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index ef0b35cdc3..62e0fb8fdd 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -130,7 +130,7 @@ family[C.type] += 1 else family[C.type] = 1 - S["family"] << family + WRITE_FILE(S["family"], family) memory_saved = 1 /mob/living/simple_animal/pet/cat/Runtime/proc/Deploy_The_Cats() diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 54a06cb37f..58d497293a 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -53,7 +53,7 @@ break /mob/living/simple_animal/pet/dog/corgi/Initialize() - ..() + . = ..() regenerate_icons() @@ -296,7 +296,7 @@ var/saved_head //path /mob/living/simple_animal/pet/dog/corgi/Ian/Initialize() - ..() + . = ..() //parent call must happen first to ensure IAN //is not in nullspace when child puppies spawn Read_Memory() @@ -344,14 +344,14 @@ /mob/living/simple_animal/pet/dog/corgi/Ian/proc/Write_Memory(dead) var/savefile/S = new /savefile("data/npc_saves/Ian.sav") if(!dead) - S["age"] << age + 1 + WRITE_FILE(S["age"], age + 1) if((age + 1) > record_age) - S["record_age"] << record_age + 1 + WRITE_FILE(S["record_age"], record_age + 1) if(inventory_head) - S["saved_head"] << inventory_head.type + WRITE_FILE(S["saved_head"], inventory_head.type) else - S["age"] << 0 - S["saved_head"] << null + WRITE_FILE(S["age"], 0) + WRITE_FILE(S["saved_head"], null) memory_saved = 1 diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index db347cc203..b37d5079d7 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -171,29 +171,29 @@ /mob/living/simple_animal/drone/examine(mob/user) - var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src]!\n" //Hands for(var/obj/item/I in held_items) if(!(I.flags & ABSTRACT)) if(I.blood_DNA) - msg += "It has [bicon(I)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" + msg += "It has [icon2html(I, user)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" else - msg += "It has [bicon(I)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" + msg += "It has [icon2html(I, user)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" //Internal storage if(internal_storage && !(internal_storage.flags&ABSTRACT)) if(internal_storage.blood_DNA) - msg += "It is holding [bicon(internal_storage)] [internal_storage.gender==PLURAL?"some":"a"] blood-stained [internal_storage.name] in its internal storage!\n" + msg += "It is holding [icon2html(internal_storage, user)] [internal_storage.gender==PLURAL?"some":"a"] blood-stained [internal_storage.name] in its internal storage!\n" else - msg += "It is holding [bicon(internal_storage)] \a [internal_storage] in its internal storage.\n" + msg += "It is holding [icon2html(internal_storage, user)] \a [internal_storage] in its internal storage.\n" //Cosmetic hat - provides no function other than looks if(head && !(head.flags&ABSTRACT)) if(head.blood_DNA) - msg += "It is wearing [bicon(head)] [head.gender==PLURAL?"some":"a"] blood-stained [head.name] on its head!\n" + msg += "It is wearing [icon2html(head, user)] [head.gender==PLURAL?"some":"a"] blood-stained [head.name] on its head!\n" else - msg += "It is wearing [bicon(head)] \a [head] on its head.\n" + msg += "It is wearing [icon2html(head, user)] \a [head] on its head.\n" //Braindead if(!client && stat != DEAD) 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 c984194805..51d28df31b 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 @@ -176,7 +176,7 @@ else ..() -/mob/living/simple_animal/drone/cogscarab/can_use_guns(obj/item/weapon/gun/G) +/mob/living/simple_animal/drone/cogscarab/can_use_guns(obj/item/weapon/G) return GLOB.ratvar_awakens /mob/living/simple_animal/drone/cogscarab/get_armor_effectiveness() diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 207bda2c2c..75a1759e1d 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -57,7 +57,7 @@ if( ishuman(AM) ) if(!stat) var/mob/M = AM - to_chat(M, "[bicon(src)] Squeek!") + to_chat(M, "[icon2html(src, M)] Squeek!") playsound(src, 'sound/effects/mousesqueek.ogg', 100, 1) ..() diff --git a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm index 5fe0ccaade..02754e0121 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm @@ -26,21 +26,21 @@ /mob/living/simple_animal/hostile/guardian/dextrous/examine(mob/user) if(dextrous) - var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src)] \a [src]!\n" msg += "[desc]\n" for(var/obj/item/I in held_items) if(!(I.flags & ABSTRACT)) if(I.blood_DNA) - msg += "It has [bicon(I)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" + msg += "It has [icon2html(I, user)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" else - msg += "It has [bicon(I)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" + msg += "It has [icon2html(I, user)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" if(internal_storage && !(internal_storage.flags&ABSTRACT)) if(internal_storage.blood_DNA) - msg += "It is holding [bicon(internal_storage)] [internal_storage.gender==PLURAL?"some":"a"] blood-stained [internal_storage.name] in its internal storage!\n" + msg += "It is holding [icon2html(internal_storage, user)] [internal_storage.gender==PLURAL?"some":"a"] blood-stained [internal_storage.name] in its internal storage!\n" else - msg += "It is holding [bicon(internal_storage)] \a [internal_storage] in its internal storage.\n" + msg += "It is holding [icon2html(internal_storage, user)] \a [internal_storage] in its internal storage.\n" msg += "*---------*" to_chat(user, msg) else diff --git a/code/modules/mob/living/simple_animal/guardian/types/fire.dm b/code/modules/mob/living/simple_animal/guardian/types/fire.dm index b0a8ba5215..8f456abc53 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/fire.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/fire.dm @@ -21,7 +21,7 @@ /mob/living/simple_animal/hostile/guardian/fire/AttackingTarget() . = ..() if(. && ishuman(target) && target != summoner) - new /obj/effect/hallucination/delusion(target.loc,target,"custom",200,0, icon_state,icon) + new /datum/hallucination/delusion(target,TRUE,"custom",200,0, icon_state,icon) /mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj) ..() diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 62279262ba..06f2a56a0e 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -29,7 +29,7 @@ loot = list(/obj/effect/decal/cleanable/robot_debris) /mob/living/simple_animal/hostile/hivebot/Initialize() - ..() + . = ..() deathmessage = "[src] blows apart!" /mob/living/simple_animal/hostile/hivebot/range @@ -63,4 +63,4 @@ /mob/living/simple_animal/hostile/hivebot/death(gibbed) do_sparks(3, TRUE, src) - ..(1) \ No newline at end of file + ..(1) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 6cebdd9500..6b528651f4 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -283,7 +283,7 @@ Difficulty: Very Hard for(var/obj/O in (contents-component_parts)) stored_items += O.type - S["stored_items"] << stored_items + WRITE_FILE(S["stored_items"], stored_items) memory_saved = TRUE /obj/machinery/smartfridge/black_box/proc/ReadMemory() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 11c59a2d28..0ca966df35 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -57,6 +57,7 @@ Difficulty: Hard ranged_cooldown_time = 40 aggro_vision_range = 21 //so it can see to one side of the arena to the other loot = list(/obj/item/weapon/hierophant_club) + crusher_loot = list(/obj/item/weapon/hierophant_club) wander = FALSE var/burst_range = 3 //range on burst aoe var/beam_range = 5 //range on cross blast beams diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm index 15dfd7ad9d..5a9d3a2928 100644 --- a/code/modules/mob/living/simple_animal/hostile/stickman.dm +++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm @@ -51,7 +51,7 @@ icon_dead = "stickdog_dead" /mob/living/simple_animal/hostile/stickman/Initialize(mapload, var/wizard_summoned) - ..() + . = ..() new /obj/effect/temp_visual/paper_scatter(src) summoned_by_wizard = wizard_summoned diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 5080a9db8a..6be40e0d43 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -101,7 +101,7 @@ /mob/living/simple_animal/parrot/Initialize() - ..() + . = ..() if(!ears) var/headset = pick(/obj/item/device/radio/headset/headset_sec, \ /obj/item/device/radio/headset/headset_eng, \ @@ -936,10 +936,10 @@ /mob/living/simple_animal/parrot/Poly/proc/Write_Memory() var/savefile/S = new /savefile("data/npc_saves/Poly.sav") if(islist(speech_buffer)) - S["phrases"] << speech_buffer - S["roundssurvived"] << rounds_survived - S["longestsurvival"] << longest_survival - S["longestdeathstreak"] << longest_deathstreak + WRITE_FILE(S["phrases"], speech_buffer) + WRITE_FILE(S["roundssurvived"], rounds_survived) + WRITE_FILE(S["longestsurvival"], longest_survival) + WRITE_FILE(S["longestdeathstreak"], longest_deathstreak) memory_saved = 1 /mob/living/simple_animal/parrot/Poly/ghost diff --git a/code/modules/mob/living/simple_animal/slime/death.dm b/code/modules/mob/living/simple_animal/slime/death.dm index aab8e907c0..75219e4b2a 100644 --- a/code/modules/mob/living/simple_animal/slime/death.dm +++ b/code/modules/mob/living/simple_animal/slime/death.dm @@ -26,7 +26,7 @@ update_canmove() - if(SSticker && SSticker.mode) + if(SSticker.mode) SSticker.mode.check_win() return ..(gibbed) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 236b36dafd..0e7d7a157e 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -347,7 +347,7 @@ /mob/living/simple_animal/slime/examine(mob/user) - var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" + var/msg = "*---------*\nThis is [icon2html(src, user)] \a [src]!\n" if (src.stat == DEAD) msg += "It is limp and unresponsive.\n" else diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 26b22d964e..d612611ea6 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -327,6 +327,7 @@ if(AM.pulledby) if(!supress_message) visible_message("[src] has pulled [AM] from [AM.pulledby]'s grip.") + add_logs(AM, AM.pulledby, "pulled from", src) AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once. pulling = AM @@ -337,6 +338,7 @@ if(ismob(AM)) var/mob/M = AM + add_logs(src, M, "grabbed", addition="passive grab") if(!supress_message) visible_message("[src] has grabbed [M] passively!") if(!iscarbon(src)) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index a704c2e43f..999779c7e3 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -325,6 +325,9 @@ It's fairly easy to fix if dealing with single letters but not so much with comp return B.eye_blind return 0 +/mob/proc/hallucinating() + return FALSE + /proc/is_special_character(mob/M) // returns 1 for special characters and 2 for heroes of gamemode //moved out of admins.dm because things other than admin procs were calling this. if(!SSticker.HasRoundStarted()) return 0 @@ -384,7 +387,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp if(O.client) to_chat(O, "[message][(enter_link) ? " [enter_link]" : ""]") if(ghost_sound) - O << sound(ghost_sound) + SEND_SOUND(O, sound(ghost_sound)) if(flashwindow) window_flash(O.client) if(source) diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm index f200fbf747..10a6deb63d 100644 --- a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -110,7 +110,7 @@ if(!channel) return var/mob/living/user = usr - var/logname = input(user,"Enter desired logfile name (.log) or leave blank to cancel:") + var/logname = stripped_input(user,"Enter desired logfile name (.log) or leave blank to cancel:") if(!logname || !channel) return 1 var/datum/computer_file/data/logfile = new/datum/computer_file/data/logfile() diff --git a/code/modules/modular_computers/file_system/programs/sm_monitor.dm b/code/modules/modular_computers/file_system/programs/sm_monitor.dm index cfe019e193..d62907f026 100644 --- a/code/modules/modular_computers/file_system/programs/sm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/sm_monitor.dm @@ -22,16 +22,12 @@ if(last_status != new_status) last_status = new_status ui_header = "smmon_[last_status].gif" - if(istype(computer) && !(computer.hardware_flag == PROGRAM_LAPTOP)) - program_icon_state = "smmon_[last_status]" - if(istype(computer)) - computer.update_icon() + program_icon_state = "smmon_[last_status]" + if(istype(computer)) + computer.update_icon() /datum/computer_file/program/supermatter_monitor/run_program(mob/living/user) . = ..(user) - if(istype(computer) && (computer.hardware_flag == PROGRAM_LAPTOP)) - program_icon_state = "engine" - computer.update_icon() refresh() /datum/computer_file/program/supermatter_monitor/kill_program(forced = FALSE) diff --git a/code/modules/ninja/suit/suit_initialisation.dm b/code/modules/ninja/suit/suit_initialisation.dm index b723ade381..5fb3fe8a62 100644 --- a/code/modules/ninja/suit/suit_initialisation.dm +++ b/code/modules/ninja/suit/suit_initialisation.dm @@ -70,7 +70,7 @@ addtimer(CALLBACK(src, .proc/deinitialize_three, delay, U), delay) /obj/item/clothing/suit/space/space_ninja/proc/deinitialize_three(delay, mob/living/carbon/human/U) - to_chat(U, "Logging off, [U:real_name]. Shutting down SpiderOS.") + to_chat(U, "Logging off, [U.real_name]. Shutting down SpiderOS.") addtimer(CALLBACK(src, .proc/deinitialize_four, delay, U), delay) /obj/item/clothing/suit/space/space_ninja/proc/deinitialize_four(delay, mob/living/carbon/human/U) diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm index 548c8eae9c..39f0d7a933 100644 --- a/code/modules/paperwork/contract.dm +++ b/code/modules/paperwork/contract.dm @@ -36,7 +36,7 @@ if(M.mind == target && !M.owns_soul()) if(user.mind && (user.mind.assigned_role == "Lawyer")) deconvert = TRUE - else if (user.mind && (user.mind.assigned_role =="Head of Personnel") || (user.mind.assigned_role == "Centcom Commander")) + else if (user.mind && (user.mind.assigned_role =="Head of Personnel") || (user.mind.assigned_role == "CentCom Commander")) deconvert = prob (25) // the HoP doesn't have AS much legal training else deconvert = prob (5) diff --git a/code/modules/paperwork/paper_premade.dm.rej b/code/modules/paperwork/paper_premade.dm.rej new file mode 100644 index 0000000000..94fca518f6 --- /dev/null +++ b/code/modules/paperwork/paper_premade.dm.rej @@ -0,0 +1,23 @@ +diff a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm (rejected hunks) +@@ -91,18 +91,18 @@ + info = "...EMPTY HALLS...USELESS SPACE..." + + +-/////////// Centcom ++/////////// CentCom + + /obj/item/weapon/paper/fluff/stations/centcom/disk_memo + name = "memo" + info = "GET DAT FUKKEN DISK" + + /obj/item/weapon/paper/fluff/stations/centcom/broken_evac +- info = "Due to circumstances beyond our control, your Emergency Evacuation Shuttle is out of service.

    We apologize for the inconvenience this may cause you.

    Please enjoy the use of this complementary book.

    Sincerely,
    Centcom Operations Demolitions Examination Retribution Bugfixing Underlining Services" ++ info = "Due to circumstances beyond our control, your Emergency Evacuation Shuttle is out of service.

    We apologize for the inconvenience this may cause you.

    Please enjoy the use of this complementary book.

    Sincerely,
    CentCom Operations Demolitions Examination Retribution Bugfixing Underlining Services" + + /obj/item/weapon/paper/fluff/stations/centcom/bulletin + name = "paper- 'Official Bulletin'" +- info = "
    Centcom Security
    Port Division
    Official Bulletin

    Inspector,
    There is an emergency shuttle arriving today.

    Approval is restricted to Nanotrasen employees only. Deny all other entrants.

    Centcom Port Commissioner" ++ info = "
    CentCom Security
    Port Division
    Official Bulletin

    Inspector,
    There is an emergency shuttle arriving today.

    Approval is restricted to Nanotrasen employees only. Deny all other entrants.

    CentCom Port Commissioner" + + + /////////// Lavaland diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index b1896f930a..4755f3d64a 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -222,8 +222,9 @@ var/offX = 32 * (A.x - center.x) + A.pixel_x + 33 var/offY = 32 * (A.y - center.y) + A.pixel_y + 33 if(ismovableatom(A)) - offX += A:step_x - offY += A:step_y + var/atom/movable/AM = A + offX += AM.step_x + offY += AM.step_y res.Blend(img, blendMode2iconMode(A.blend_mode), offX, offY) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index e36c639eb9..d01516e312 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -120,8 +120,8 @@ if(auto_name) name = "\improper [get_area(src)] APC" - pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 24 : -24) - pixel_y = (src.tdir & 3)? (src.tdir ==1 ? 24 : -24) : 0 + pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 26 : -27) + pixel_y = (src.tdir & 3)? (src.tdir == 1 ? 25 : -25) : 0 if (building) area = get_area(src) opened = 1 @@ -892,7 +892,7 @@ transfer_in_progress = TRUE user.visible_message("[user] slots [card] into [src]...", "Transfer process initiated. Sending request for AI approval...") playsound(src, 'sound/machines/click.ogg', 50, 1) - occupier << sound('sound/misc/notice2.ogg') //To alert the AI that someone's trying to card them if they're tabbed out + SEND_SOUND(occupier, sound('sound/misc/notice2.ogg')) //To alert the AI that someone's trying to card them if they're tabbed out if(alert(occupier, "[user] is attempting to transfer you to \a [card.name]. Do you consent to this?", "APC Transfer", "Yes - Transfer Me", "No - Keep Me Here") == "No - Keep Me Here") to_chat(user, "AI denied transfer request. Process terminated.") playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) @@ -986,9 +986,6 @@ else main_status = 2 - //if(debug) - // world.log << "Status: [main_status] - Excess: [excess] - Last Equip: [lastused_equip] - Last Light: [lastused_light] - Longterm: [longtermpower]" - if(cell && !shorted) // draw power from cell as before to power the area var/cellused = min(cell.charge, GLOB.CELLRATE * lastused_total) // clamp deduction to a max, amount left in cell diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index b0d07e88d5..f130e7be11 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -216,7 +216,6 @@ //remove the old powernet and replace it with a new one throughout the network. /proc/propagate_network(obj/O, datum/powernet/PN) - //world.log << "propagating new network" var/list/worklist = list() var/list/found_machines = list() var/index = 1 diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 194c00fc0f..6e4942807f 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -110,7 +110,7 @@ sparks.set_up(5, TRUE, src) /obj/machinery/power/emitter/Destroy() - if(SSticker && SSticker.IsRoundInProgress()) + if(SSticker.IsRoundInProgress()) var/turf/T = get_turf(src) message_admins("Emitter deleted at [ADMIN_COORDJMP(T)]",0,1) log_game("Emitter deleted at [COORD(T)]") diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index 90c33bb6b3..df969d869e 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -71,7 +71,7 @@ sleep(1150) if(resolved == FALSE) resolved = TRUE - world << sound('sound/machines/alarm.ogg') + sound_to_playing_players('sound/machines/alarm.ogg') addtimer(CALLBACK(GLOBAL_PROC, .proc/cult_ending_helper), 120) addtimer(CALLBACK(GLOBAL_PROC, .proc/ending_helper), 220) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 07190b102c..1b65da86ab 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -26,7 +26,7 @@ var/last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing var/last_warning var/consumedSupermatter = 0 //If the singularity has eaten a supermatter shard and can go to stage six - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF dangerous_possession = TRUE /obj/singularity/Initialize(mapload, starting_energy = 50) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 2a8d3f8a60..50f01f4259 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -191,7 +191,7 @@ cell.charge = (charge / capacity) * cell.maxcharge /obj/machinery/power/smes/Destroy() - if(SSticker && SSticker.IsRoundInProgress()) + if(SSticker.IsRoundInProgress()) var/area/A = get_area(src) var/turf/T = get_turf(src) message_admins("SMES deleted at [A][ADMIN_JMP(T)]") diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 816cd97874..f635d8e227 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -219,7 +219,7 @@ var/turf/T = get_turf(src) for(var/mob/M in GLOB.mob_list) if(M.z == z) - M << 'sound/magic/charge.ogg' + SEND_SOUND(M, 'sound/magic/charge.ogg') to_chat(M, "You feel reality distort for a moment...") if(combined_gas > MOLE_PENALTY_THRESHOLD) investigate_log("has collapsed into a singularity.", INVESTIGATE_SUPERMATTER) @@ -457,7 +457,7 @@ visible_message("[src] is consumed by the singularity!") for(var/mob/M in GLOB.mob_list) if(M.z == z) - M << 'sound/effects/supermatter.ogg' //everyone goan know bout this + SEND_SOUND(M, 'sound/effects/supermatter.ogg') //everyone goan know bout this to_chat(M, "A horrible screeching fills your ears, and a wave of dread washes over you...") qdel(src) return gain diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 042d827bff..9fc63d9421 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -1,24 +1,6 @@ #define TESLA_DEFAULT_POWER 1738260 #define TESLA_MINI_POWER 869130 -GLOBAL_LIST_INIT(blacklisted_tesla_types, typecacheof(list(/obj/machinery/atmospherics, - /obj/machinery/power/emitter, - /obj/machinery/field/generator, - /mob/living/simple_animal, - /obj/machinery/particle_accelerator/control_box, - /obj/structure/particle_accelerator/fuel_chamber, - /obj/structure/particle_accelerator/particle_emitter/center, - /obj/structure/particle_accelerator/particle_emitter/left, - /obj/structure/particle_accelerator/particle_emitter/right, - /obj/structure/particle_accelerator/power_box, - /obj/structure/particle_accelerator/end_cap, - /obj/machinery/field/containment, - /obj/structure/disposalpipe, - /obj/structure/sign, - /obj/machinery/gateway, - /obj/structure/lattice, - /obj/structure/grille, - /obj/machinery/the_singularitygen/tesla))) /obj/singularity/energy_ball name = "energy ball" desc = "An energy ball." @@ -183,8 +165,27 @@ GLOBAL_LIST_INIT(blacklisted_tesla_types, typecacheof(list(/obj/machinery/atmosp var/obj/machinery/closest_machine var/obj/structure/closest_structure var/obj/structure/blob/closest_blob + var/static/things_to_shock = typecacheof(list(/obj/machinery, /mob/living, /obj/structure)) + var/static/blacklisted_tesla_types = typecacheof(list(/obj/machinery/atmospherics, + /obj/machinery/power/emitter, + /obj/machinery/field/generator, + /mob/living/simple_animal, + /obj/machinery/particle_accelerator/control_box, + /obj/structure/particle_accelerator/fuel_chamber, + /obj/structure/particle_accelerator/particle_emitter/center, + /obj/structure/particle_accelerator/particle_emitter/left, + /obj/structure/particle_accelerator/particle_emitter/right, + /obj/structure/particle_accelerator/power_box, + /obj/structure/particle_accelerator/end_cap, + /obj/machinery/field/containment, + /obj/structure/disposalpipe, + /obj/structure/sign, + /obj/machinery/gateway, + /obj/structure/lattice, + /obj/structure/grille, + /obj/machinery/the_singularitygen/tesla)) - for(var/A in oview(source, zap_range+2)) + for(var/A in typecache_filter_multi_list_exclusion(oview(source, zap_range+2), things_to_shock, blacklisted_tesla_types)) if(istype(A, /obj/machinery/power/tesla_coil)) var/dist = get_dist(source, A) var/obj/machinery/power/tesla_coil/C = A @@ -207,7 +208,7 @@ GLOBAL_LIST_INIT(blacklisted_tesla_types, typecacheof(list(/obj/machinery/atmosp closest_atom = A closest_dist = dist - else if(closest_grounding_rod || is_type_in_typecache(A, GLOB.blacklisted_tesla_types)) + else if(closest_grounding_rod) continue else if(isliving(A)) diff --git a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm index 6216216cd9..6fdcccd43f 100644 --- a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm +++ b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm @@ -20,26 +20,30 @@ /datum/mapGeneratorModule/bottomLayer/massdelete spawnableAtoms = list() spawnableTurfs = list() - var/deletemobs = TRUE - var/deleteturfs = TRUE + var/deleteturfs = TRUE //separate var for the empty type. + var/list/ignore_typecache /datum/mapGeneratorModule/bottomLayer/massdelete/generate() if(!mother) return for(var/V in mother.map) var/turf/T = V - T.empty(deleteturfs? null : T.type, delmobs = deletemobs, forceop = TRUE) + T.empty(deleteturfs? null : T.type, ignore_typecache = ignore_typecache, forceop = TRUE) -/datum/mapGeneratorModule/bottomLayer/massdelete/no_delete_mobs - deletemobs = FALSE +/datum/mapGeneratorModule/bottomLayer/massdelete/no_delete_mobs/New() + ..() + ignore_typecache = typecacheof(list(/mob)) /datum/mapGeneratorModule/bottomLayer/massdelete/leave_turfs deleteturfs = FALSE /datum/mapGeneratorModule/bottomLayer/massdelete/regeneration_delete - deletemobs = FALSE deleteturfs = FALSE +/datum/mapGeneratorModule/bottomLayer/massdelete/regeneration_delete/New() + ..() + ignore_typecache = typecacheof(list(/mob)) + //Only places atoms/turfs on area borders /datum/mapGeneratorModule/border clusterCheckFlags = CLUSTER_CHECK_NONE @@ -61,6 +65,20 @@ /datum/mapGenerator/repressurize modules = list(/datum/mapGeneratorModule/bottomLayer/repressurize) + buildmode_name = "Block: Restore Roundstart Air Contents" /datum/mapGenerator/massdelete - modules = list(/datum/mapGeneratorModule/bottomLayer/massdelete) \ No newline at end of file + modules = list(/datum/mapGeneratorModule/bottomLayer/massdelete) + buildmode_name = "Block: Full Mass Deletion" + +/datum/mapGenerator/massdelete/nomob + modules = list(/datum/mapGeneratorModule/bottomLayer/massdelete/no_delete_mobs) + buildmode_name = "Block: Mass Deletion - Leave Mobs" + +/datum/mapGenerator/massdelete/noturf + modules = list(/datum/mapGeneratorModule/bottomLayer/massdelete/leave_turfs) + buildmode_name = "Block: Mass Deletion - Leave Turfs" + +/datum/mapGenerator/massdelete/regen + modules = list(/datum/mapGeneratorModule/bottomLayer/massdelete/regeneration_delete) + buildmode_name = "Block: Mass Deletion - Leave Mobs and Turfs" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 156a5ee81e..d5109a2c0c 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -27,7 +27,7 @@ var/recoil = 0 //boom boom shake the room var/clumsy_check = 1 var/obj/item/ammo_casing/chambered = null - var/trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers + trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers var/sawn_desc = null //description change if weapon is sawn-off var/sawn_state = SAWN_INTACT var/burst_size = 1 //how large a burst is @@ -188,12 +188,10 @@ -/obj/item/weapon/gun/proc/can_trigger_gun(var/mob/living/user) - - if(!handle_pins(user) || !user.can_use_guns(src)) - return 0 - - return 1 +/obj/item/weapon/gun/can_trigger_gun(mob/living/user) + . = ..() + if(!handle_pins(user)) + return FALSE /obj/item/weapon/gun/proc/handle_pins(mob/living/user) if(pin) diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 54e0ed7e12..f7aedb00fc 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -356,7 +356,7 @@ /obj/item/projectile/bullet/saw/hollow damage = 60 - armour_penetration = -10 + armour_penetration = -60 /obj/item/projectile/bullet/saw/ap damage = 40 diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 4b1d5af6c4..5a8f49f45a 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -387,3 +387,232 @@ var/obj/effect/ebeam/B = b animate(B, alpha = 0, time = 32) return ..() + +/obj/item/projectile/hallucination + name = "bullet" + icon = null + icon_state = null + hitsound = "" + suppressed = TRUE + ricochets_max = 0 + ricochet_chance = 0 + damage = 0 + nodamage = TRUE + projectile_type = /obj/item/projectile/hallucination + log_override = TRUE + var/hal_icon_state + var/image/fake_icon + var/mob/living/carbon/hal_target + var/hal_fire_sound + var/hal_hitsound + var/hal_hitsound_wall + var/hal_impact_effect + var/hal_impact_effect_wall + var/hit_duration + var/hit_duration_wall + +/obj/item/projectile/hallucination/fire() + ..() + fake_icon = image('icons/obj/projectiles.dmi', src, hal_icon_state, ABOVE_MOB_LAYER) + if(hal_target.client) + hal_target.client.images += fake_icon + +/obj/item/projectile/hallucination/Destroy() + if(hal_target.client) + hal_target.client.images -= fake_icon + QDEL_NULL(fake_icon) + return ..() + +/obj/item/projectile/hallucination/Collide(atom/A) + if(!ismob(A)) + if(hal_hitsound_wall) + hal_target.playsound_local(loc, hal_hitsound_wall, 40, 1) + if(hal_impact_effect_wall) + spawn_hit(A, TRUE) + else if(A == hal_target) + if(hal_hitsound) + hal_target.playsound_local(A, hal_hitsound, 100, 1) + target_on_hit(A) + qdel(src) + return TRUE + +/obj/item/projectile/hallucination/proc/target_on_hit(mob/M) + if(M == hal_target) + to_chat(hal_target, "[M] is hit by \a [src] in the chest!") + hal_apply_effect() + else if(M in view(hal_target)) + to_chat(hal_target, "[M] is hit by \a [src] in the chest!!") + if(damage_type == BRUTE) + var/splatter_dir = dir + if(starting) + splatter_dir = get_dir(starting, get_turf(M)) + spawn_blood(M, splatter_dir) + else if(hal_impact_effect) + spawn_hit(M, FALSE) + +/obj/item/projectile/hallucination/proc/spawn_blood(mob/M, set_dir) + set waitfor = 0 + if(!hal_target.client) + return + + var/splatter_icon_state + if(set_dir in GLOB.diagonals) + splatter_icon_state = "splatter[pick(1, 2, 6)]" + else + splatter_icon_state = "splatter[pick(3, 4, 5)]" + + var/image/blood = image('icons/effects/blood.dmi', M, splatter_icon_state, ABOVE_MOB_LAYER) + var/target_pixel_x = 0 + var/target_pixel_y = 0 + switch(set_dir) + if(NORTH) + target_pixel_y = 16 + if(SOUTH) + target_pixel_y = -16 + layer = ABOVE_MOB_LAYER + if(EAST) + target_pixel_x = 16 + if(WEST) + target_pixel_x = -16 + if(NORTHEAST) + target_pixel_x = 16 + target_pixel_y = 16 + if(NORTHWEST) + target_pixel_x = -16 + target_pixel_y = 16 + if(SOUTHEAST) + target_pixel_x = 16 + target_pixel_y = -16 + layer = ABOVE_MOB_LAYER + if(SOUTHWEST) + target_pixel_x = -16 + target_pixel_y = -16 + layer = ABOVE_MOB_LAYER + hal_target.client.images += blood + animate(blood, pixel_x = target_pixel_x, pixel_y = target_pixel_y, alpha = 0, time = 5) + sleep(5) + hal_target.client.images -= blood + qdel(blood) + +/obj/item/projectile/hallucination/proc/spawn_hit(atom/A, is_wall) + set waitfor = 0 + if(!hal_target.client) + return + + var/image/hit_effect = image('icons/effects/blood.dmi', A, is_wall ? hal_impact_effect_wall : hal_impact_effect, ABOVE_MOB_LAYER) + hit_effect.pixel_x = A.pixel_x + rand(-4,4) + hit_effect.pixel_y = A.pixel_y + rand(-4,4) + hal_target.client.images += hit_effect + sleep(is_wall ? hit_duration_wall : hit_duration) + hal_target.client.images -= hit_effect + qdel(hit_effect) + + +/obj/item/projectile/hallucination/proc/hal_apply_effect() + return + +/obj/item/projectile/hallucination/bullet + name = "bullet" + hal_icon_state = "bullet" + hal_fire_sound = "gunshot" + hal_hitsound = 'sound/weapons/pierce.ogg' + hal_hitsound_wall = "ricochet" + hal_impact_effect = "impact_bullet" + hal_impact_effect_wall = "impact_bullet" + hit_duration = 5 + hit_duration_wall = 5 + +/obj/item/projectile/hallucination/bullet/hal_apply_effect() + hal_target.adjustStaminaLoss(60) + +/obj/item/projectile/hallucination/laser + name = "laser" + damage_type = BURN + hal_icon_state = "laser" + hal_fire_sound = 'sound/weapons/laser.ogg' + hal_hitsound = 'sound/weapons/sear.ogg' + hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg' + hal_impact_effect = "impact_laser" + hal_impact_effect_wall = "impact_laser_wall" + hit_duration = 4 + hit_duration_wall = 10 + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + +/obj/item/projectile/hallucination/laser/hal_apply_effect() + hal_target.adjustStaminaLoss(20) + hal_target.blur_eyes(2) + +/obj/item/projectile/hallucination/taser + name = "electrode" + damage_type = BURN + hal_icon_state = "spark" + color = "#FFFF00" + hal_fire_sound = 'sound/weapons/taser.ogg' + hal_hitsound = 'sound/weapons/taserhit.ogg' + hal_hitsound_wall = null + hal_impact_effect = null + hal_impact_effect_wall = null + +/obj/item/projectile/hallucination/taser/hal_apply_effect() + hal_target.Knockdown(100) + hal_target.stuttering += 20 + if(hal_target.dna && hal_target.dna.check_mutation(HULK)) + hal_target.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" )) + else if(hal_target.status_flags & CANKNOCKDOWN) + addtimer(CALLBACK(hal_target, /mob/living/carbon.proc/do_jitter_animation, 20), 5) + +/obj/item/projectile/hallucination/disabler + name = "disabler beam" + damage_type = STAMINA + hal_icon_state = "omnilaser" + hal_fire_sound = 'sound/weapons/taser2.ogg' + hal_hitsound = 'sound/weapons/tap.ogg' + hal_hitsound_wall = 'sound/weapons/effects/searwall.ogg' + hal_impact_effect = "impact_laser_blue" + hal_impact_effect_wall = null + hit_duration = 4 + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + +/obj/item/projectile/hallucination/disabler/hal_apply_effect() + hal_target.adjustStaminaLoss(25) + +/obj/item/projectile/hallucination/ebow + name = "bolt" + damage_type = TOX + hal_icon_state = "cbbolt" + hal_fire_sound = 'sound/weapons/genhit.ogg' + hal_hitsound = null + hal_hitsound_wall = null + hal_impact_effect = null + hal_impact_effect_wall = null + +/obj/item/projectile/hallucination/ebow/hal_apply_effect() + hal_target.Knockdown(100) + hal_target.stuttering += 5 + hal_target.adjustStaminaLoss(8) + +/obj/item/projectile/hallucination/change + name = "bolt of change" + damage_type = BURN + hal_icon_state = "ice_1" + hal_fire_sound = 'sound/magic/staff_change.ogg' + hal_hitsound = null + hal_hitsound_wall = null + hal_impact_effect = null + hal_impact_effect_wall = null + +/obj/item/projectile/hallucination/change/hal_apply_effect() + new /datum/hallucination/self_delusion(hal_target, TRUE, wabbajack = FALSE) + +/obj/item/projectile/hallucination/death + name = "bolt of death" + damage_type = BURN + hal_icon_state = "pulse1_bl" + hal_fire_sound = 'sound/magic/wandodeath.ogg' + hal_hitsound = null + hal_hitsound_wall = null + hal_impact_effect = null + hal_impact_effect_wall = null + +/obj/item/projectile/hallucination/death/hal_apply_effect() + new /datum/hallucination/death(hal_target, TRUE) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 8d2bd6002f..54d17497f3 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -370,9 +370,8 @@ else if(cached_my_atom.type == C.required_container) matching_container = 1 - if (isliving(cached_my_atom)) //Makes it so certain chemical reactions don't occur in mobs - if (C.mob_react) - return + if (isliving(cached_my_atom) && !C.mob_react) //Makes it so certain chemical reactions don't occur in mobs + return if(!C.required_other) matching_other = 1 @@ -401,19 +400,21 @@ add_reagent(P, cached_results[P]*multiplier, null, chem_temp) var/list/seen = viewers(4, get_turf(my_atom)) + var/iconhtml = icon2html(cached_my_atom, seen) if(cached_my_atom) if(!ismob(cached_my_atom)) // No bubbling mobs if(C.mix_sound) playsound(get_turf(cached_my_atom), C.mix_sound, 80, 1) + for(var/mob/M in seen) - to_chat(M, "[bicon(my_atom)] [C.mix_message]") + to_chat(M, "[iconhtml] [C.mix_message]") if(istype(cached_my_atom, /obj/item/slime_extract)) var/obj/item/slime_extract/ME2 = my_atom ME2.Uses-- if(ME2.Uses <= 0) // give the notification that the slime core is dead for(var/mob/M in seen) - to_chat(M, "[bicon(my_atom)] \The [my_atom]'s power is consumed in the reaction.") + to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") ME2.name = "used slime extract" ME2.desc = "This extract has been used up." diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 27cad406fa..3811512a02 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -101,9 +101,11 @@ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) if(!ui) ui = new(user, src, ui_key, "chem_dispenser", name, 550, 550, master_ui, state) + if(user.hallucinating()) + ui.set_autoupdate(FALSE) //to not ruin the immersion by constantly changing the fake chemicals ui.open() -/obj/machinery/chem_dispenser/ui_data() +/obj/machinery/chem_dispenser/ui_data(mob/user) var/data = list() data["amount"] = amount data["energy"] = cell.charge ? cell.charge * powerefficiency : "0" //To prevent NaN in the UI. @@ -128,10 +130,16 @@ data["beakerTransferAmounts"] = null var chemicals[0] + var/is_hallucinating = FALSE + if(user.hallucinating()) + is_hallucinating = TRUE for(var/re in dispensable_reagents) var/datum/reagent/temp = GLOB.chemical_reagents_list[re] if(temp) - chemicals.Add(list(list("title" = temp.name, "id" = temp.id))) + var/chemname = temp.name + if(is_hallucinating && prob(5)) + chemname = "[pick_list_replacements("hallucination.json", "chemicals")]" + chemicals.Add(list(list("title" = chemname, "id" = temp.id))) data["chemicals"] = chemicals return data diff --git a/code/modules/reagents/chemistry/reagents/blob_reagents.dm b/code/modules/reagents/chemistry/reagents/blob_reagents.dm index f1e46a6322..054e9a84cf 100644 --- a/code/modules/reagents/chemistry/reagents/blob_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/blob_reagents.dm @@ -313,7 +313,7 @@ /datum/reagent/blob/explosive_lattice/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) if(damage_flag == "bomb") return 0 - else if(damage_flag != "melee" || damage_flag != "bullet" || damage_flag != "laser") + else if(damage_flag != "melee" && damage_flag != "bullet" && damage_flag != "laser") return damage * 1.5 return ..() diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 1fae98e2f3..72001d5ca9 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -390,7 +390,7 @@ T.MakeSlippery(min_wet_time = 10, 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() ) + var/datum/gas_mixture/lowertemp = T.remove_air(T.air.total_moles()) lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) lowertemp.react() T.assume_air(lowertemp) diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index c13ff096e4..428c10e24a 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -10,7 +10,7 @@ var/required_other = 0 // an integer required for the reaction to happen var/secondary = 0 // set to nonzero if secondary reaction - var/mob_react = 0 //Determines if a chemical reaction can occur inside a mob + var/mob_react = TRUE //Determines if a chemical reaction can occur inside a mob var/required_temp = 0 var/is_cold_recipe = 0 // Set to 1 if you want the recipe to only react when it's BELOW the required temp. diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 4151a2695e..01195333fb 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -51,7 +51,7 @@ name = "Solid Plasma" id = "solidplasma" required_reagents = list("iron" = 5, "frostoil" = 5, "plasma" = 20) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/plasmasolidification/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -62,7 +62,7 @@ name = "Solid Gold" id = "solidgold" required_reagents = list("frostoil" = 5, "gold" = 20, "iron" = 1) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/goldsolidification/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -80,7 +80,7 @@ id = "soapification" required_reagents = list("liquidgibs" = 10, "lye" = 10) // requires two scooped gib tiles required_temp = 374 - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/soapification/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -92,7 +92,7 @@ id = "candlefication" required_reagents = list("liquidgibs" = 5, "oxygen" = 5) // required_temp = 374 - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/candlefication/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -103,7 +103,7 @@ name = "Meatification" id = "meatification" required_reagents = list("liquidgibs" = 10, "nutriment" = 10, "carbon" = 10) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/meatification/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -436,7 +436,7 @@ name = "Foam" id = "foam" required_reagents = list("fluorosurfactant" = 1, "water" = 1) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/foam/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -453,7 +453,7 @@ name = "Metal Foam" id = "metalfoam" required_reagents = list("aluminium" = 3, "foaming_agent" = 1, "facid" = 1) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) @@ -470,7 +470,7 @@ name = "Iron Foam" id = "ironlfoam" required_reagents = list("iron" = 3, "foaming_agent" = 1, "facid" = 1) - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index dc361467a7..8ca65a6588 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -144,6 +144,7 @@ required_reagents = list("methamphetamine" = 1) strengthdiv = 6 modifier = 1 + mob_react = FALSE /datum/chemical_reaction/reagent_explosion/methsplosion/on_reaction(datum/reagents/holder, created_volume) var/turf/T = get_turf(holder.my_atom) @@ -154,7 +155,7 @@ /datum/chemical_reaction/reagent_explosion/methsplosion/methboom2 required_reagents = list("diethylamine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1) //diethylamine is often left over from mixing the ephedrine. - required_temp = 300 //room temperature, chilling it even a little will prevent the explosion + required_temp = 300 //room temperature, chilling it even a little will prevent the explosion results = list("methboom1" = 4) // this is ugly. Sorry goof. /datum/chemical_reaction/sorium @@ -269,7 +270,7 @@ required_reagents = list("smoke_powder" = 1) required_temp = 374 secondary = 1 - mob_react = 1 + mob_react = FALSE /datum/chemical_reaction/smoke_powder_smoke/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 0d0a4f7695..4388d6bcbe 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -341,7 +341,7 @@ found = 1 break if(!found) - to_chat(user, "[bicon(src)]The conveyor switch did not detect any linked conveyor belts in range.") + to_chat(user, "[icon2html(src, user)]The conveyor switch did not detect any linked conveyor belts in range.") return var/obj/machinery/conveyor_switch/NC = new/obj/machinery/conveyor_switch(A, id) transfer_fingerprints_to(NC) diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 8b90339b02..16a87d3b8b 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -212,6 +212,17 @@ build_path = /obj/item/organ/cyberimp/mouth/breathing_tube category = list("Misc", "Medical Designs") +/datum/design/cyberimp_surgical + name = "Surgical Arm Implant" + desc = "A set of surgical tools hidden behind a concealed panel on the user's arm." + id = "ci-surgery" + req_tech = list("materials" = 3, "engineering" = 3, "biotech" = 3, "programming" = 2, "magnets" = 3) + build_type = PROTOLATHE | MECHFAB + materials = list (MAT_METAL = 2500, MAT_GLASS = 1500, MAT_SILVER = 1500) + construction_time = 200 + build_path = /obj/item/organ/cyberimp/arm/surgery + category = list("Misc", "Medical Designs") + /datum/design/cyberimp_toolset name = "Toolset Arm Implant" desc = "A stripped-down version of engineering cyborg toolset, designed to be installed on subject's arm." diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index cf36768049..44156fcc43 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -20,7 +20,7 @@ this dire fate: it's data to every other device in the game. Each console has a "disconnect from network" option that'll will cause data base sync operations to skip that console. This is useful if you want to make a "public" R&D console or, for example, give the engineers a circuit imprinter with certain designs on it and don't want it accidentally updating. The downside of this method is that you have -to have physical access to the other console to send data back. Note: An R&D console is on Centcom so if a random griffan happens to +to have physical access to the other console to send data back. Note: An R&D console is on CentCom so if a random griffan happens to cause a ton of data to be lost, an admin can go send it back. - The second method is with Technology Disks and Design Disks. Each of these disks can hold technology or design datums in their entirety. You can then take the disk to any R&D console and upload it's data to it. This method is a lot more secure (since it diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index 49584ecb3c..3b6ebbeca0 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -349,7 +349,7 @@ research holder datum. max_tech_stored = 10 /obj/item/weapon/disk/tech_disk/debug - name = "centcomm technology disk" + name = "centcom technology disk" desc = "A debug item for research" materials = list() max_tech_stored = 0 diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 7437db2694..d161929f2c 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -133,7 +133,7 @@ return /obj/machinery/r_n_d/server/centcom - name = "Centcom Central R&D Database" + name = "CentCom Central R&D Database" server_id = -1 /obj/machinery/r_n_d/server/centcom/Initialize() diff --git a/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm b/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm index 06fb2b9c04..68a34637b8 100644 --- a/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm +++ b/code/modules/ruins/objects_and_mobs/ruin_mapping_aids.dm @@ -1,10 +1,10 @@ //These landmarks can be placed in rooms/ruins to set the baseturfs of every turf in the area. Easier than having potentially unlimited subtypes of every turf or having to manually edit the turfs in the map editor /obj/effect/baseturf_helper - name = "lava baseturf editor" + name = "baseturf editor" icon = 'icons/obj/weapons.dmi' icon_state = "syndballoon" - var/baseturf = /turf/open/lava/smooth/lava_land_surface + var/baseturf = null layer = POINT_LAYER /obj/effect/baseturf_helper/Initialize() @@ -13,4 +13,37 @@ for(var/turf/T in get_area_turfs(thearea, z)) if(T.baseturf != T.type) //Don't break indestructible walls and the like T.baseturf = baseturf - qdel(src) \ No newline at end of file + qdel(src) + + +/obj/effect/baseturf_helper/asteroid + name = "asteroid baseturf editor" + baseturf = /turf/open/floor/plating/asteroid + +/obj/effect/baseturf_helper/asteroid/airless + name = "asteroid airless baseturf editor" + baseturf = /turf/open/floor/plating/asteroid/airless + +/obj/effect/baseturf_helper/asteroid/basalt + name = "asteroid basalt baseturf editor" + baseturf = /turf/open/floor/plating/asteroid/basalt + +/obj/effect/baseturf_helper/asteroid/snow + name = "asteroid snow baseturf editor" + baseturf = /turf/open/floor/plating/asteroid/snow + +/obj/effect/baseturf_helper/beach/sand + name = "beach sand baseturf editor" + baseturf = /turf/open/floor/plating/beach/sand + +/obj/effect/baseturf_helper/beach/water + name = "water baseturf editor" + baseturf = /turf/open/floor/plating/beach/water + +/obj/effect/baseturf_helper/lava + name = "lava baseturf editor" + baseturf = /turf/open/lava/smooth + +/obj/effect/baseturf_helper/lava_land/surface + name = "lavaland baseturf editor" + baseturf = /turf/open/lava/smooth/lava_land_surface diff --git a/code/modules/server_tools/server_tools.dm b/code/modules/server_tools/server_tools.dm index d6a98ad2e5..be8c80ac24 100644 --- a/code/modules/server_tools/server_tools.dm +++ b/code/modules/server_tools/server_tools.dm @@ -73,7 +73,7 @@ GLOBAL_PROTECT(reboot_mode) if(rtod - last_irc_status < IRC_STATUS_THROTTLE) return last_irc_status = rtod - return "[GLOB.clients.len] players on [SSmapping.config.map_name], Mode: [GLOB.master_mode]; Round [SSticker.HasRoundStarted() ? (SSticker.IsRoundInProgress() ? "Active" : "Finishing") : "Starting"] -- [config.server ? config.server : "[world.internet_address]:[world.port]"]" + return "[GLOB.round_id ? "Round #[GLOB.round_id]: " : ""][GLOB.clients.len] players on [SSmapping.config.map_name], Mode: [GLOB.master_mode]; Round [SSticker.HasRoundStarted() ? (SSticker.IsRoundInProgress() ? "Active" : "Finishing") : "Starting"] -- [config.server ? config.server : "[world.internet_address]:[world.port]"]" if(SERVICE_CMD_ADMIN_MSG) return IrcPm(params[SERVICE_CMD_PARAM_TARGET], params[SERVICE_CMD_PARAM_MESSAGE], params[SERVICE_CMD_PARAM_SENDER]) diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index 62e16144a0..c6f916625f 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -390,7 +390,7 @@ var/obj/docking_port/mobile/M = A M.on_emergency_dock() - // now move the actual emergency shuttle to centcomm + // now move the actual emergency shuttle to centcom // unless the shuttle is "hijacked" var/destination_dock = "emergency_away" if(is_hijacked()) diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm index 2c96d65756..23ca6e231b 100644 --- a/code/modules/shuttle/ferry.dm +++ b/code/modules/shuttle/ferry.dm @@ -29,5 +29,5 @@ if(last_request && (last_request + cooldown > world.time)) return last_request = world.time - to_chat(usr, "Your request has been recieved by Centcom.") - to_chat(GLOB.admins, "FERRY: [ADMIN_LOOKUPFLW(usr)] (Move Ferry) is requesting to move the transport ferry to Centcom.") + to_chat(usr, "Your request has been recieved by CentCom.") + to_chat(GLOB.admins, "FERRY: [ADMIN_LOOKUPFLW(usr)] (Move Ferry) is requesting to move the transport ferry to CentCom.") diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index e15dc3f076..21de2161de 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -12,7 +12,7 @@ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF anchored = TRUE -// +// var/id // this should point -away- from the dockingport door, ie towards the ship dir = NORTH @@ -481,7 +481,7 @@ var/rotation = 0 if(new_dock.dir != dir) //Even when the dirs are the same rotation is coming out as not 0 for some reason - rotation = dir2angle(new_dock)-dir2angle(dir) + rotation = dir2angle(new_dock.dir)-dir2angle(dir) if ((rotation % 90) != 0) rotation += (rotation % 90) //diagonal rotations not allowed, round up rotation = SimplifyDegrees(rotation) @@ -527,7 +527,7 @@ return DOCKING_AREA_EMPTY /*******************************************All onShuttleMove procs******************************************/ - + for(var/i in 1 to old_turfs.len) var/turf/oldT = old_turfs[i] var/turf/newT = new_turfs[i] @@ -550,9 +550,9 @@ var/atom/movable/moving_atom = thing moving_atom.onShuttleMove(newT, oldT, rotation, movement_force, movement_direction) //atoms moved_atoms += moving_atom - + /******************************************All afterShuttleMove procs****************************************/ - + for(var/i in 1 to new_turfs.len) var/turf/oldT = old_turfs[i] var/turf/newT = new_turfs[i] @@ -767,7 +767,7 @@ return TRUE return FALSE -// Losing all initial engines should get you 2 +// Losing all initial engines should get you 2 // Adding another set of engines at 0.5 time /obj/docking_port/mobile/proc/alter_engines(mod) if(mod == 0) @@ -806,7 +806,7 @@ if(initial_engines > 0) change_per_engine = (ENGINE_COEFF_MAX - 1) / initial_engines //just linear drop to max delay return Clamp(1 + delta * change_per_engine,ENGINE_COEFF_MIN,ENGINE_COEFF_MAX) - + /obj/docking_port/mobile/proc/in_flight() switch(mode) @@ -838,15 +838,15 @@ //Called when emergency shuttle docks at centcom /obj/docking_port/mobile/proc/on_emergency_dock() - //Mapping a new docking point for each ship mappers could potentially want docking with centcomm would take up lots of space, just let them keep flying off into the sunset for their greentext + //Mapping a new docking point for each ship mappers could potentially want docking with centcom would take up lots of space, just let them keep flying off into the sunset for their greentext if(launch_status == ENDGAME_LAUNCHED) launch_status = ENDGAME_TRANSIT /obj/docking_port/mobile/pod/on_emergency_dock() if(launch_status == ENDGAME_LAUNCHED) - dock(SSshuttle.getDock("[id]_away")) //Escape pods dock at centcomm + dock(SSshuttle.getDock("[id]_away")) //Escape pods dock at centcom mode = SHUTTLE_ENDGAME - + /obj/docking_port/mobile/emergency/on_emergency_dock() return diff --git a/code/modules/spells/spell_types/knock.dm b/code/modules/spells/spell_types/knock.dm index b68491d15d..bbb2b3877f 100644 --- a/code/modules/spells/spell_types/knock.dm +++ b/code/modules/spells/spell_types/knock.dm @@ -13,7 +13,7 @@ action_icon_state = "knock" /obj/effect/proc_holder/spell/aoe_turf/knock/cast(list/targets,mob/user = usr) - user << sound('sound/magic/knock.ogg') + SEND_SOUND(user, sound('sound/magic/knock.ogg')) for(var/turf/T in targets) for(var/obj/machinery/door/door in T.contents) INVOKE_ASYNC(src, .proc/open_door, door) diff --git a/code/modules/spells/spell_types/mind_transfer.dm b/code/modules/spells/spell_types/mind_transfer.dm index fafb8afde6..023af548d0 100644 --- a/code/modules/spells/spell_types/mind_transfer.dm +++ b/code/modules/spells/spell_types/mind_transfer.dm @@ -75,5 +75,5 @@ Also, you never added distance checking after target is selected. I've went ahea //Here we knock both mobs out for a time. caster.Unconscious(unconscious_amount_caster) victim.Unconscious(unconscious_amount_victim) - caster << sound('sound/magic/mandswap.ogg') - victim << sound('sound/magic/mandswap.ogg')// only the caster and victim hear the sounds, that way no one knows for sure if the swap happened + SEND_SOUND(caster, sound('sound/magic/mandswap.ogg')) + SEND_SOUND(victim, sound('sound/magic/mandswap.ogg'))// only the caster and victim hear the sounds, that way no one knows for sure if the swap happened diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 69cf8aa96b..dfc0c658ce 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -85,7 +85,6 @@ holder.flags |= NODROP holder.resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF holder.slot_flags = null - holder.w_class = WEIGHT_CLASS_HUGE holder.materials = null if(istype(holder, /obj/item/device/assembly/flash/armimplant)) @@ -234,5 +233,5 @@ /obj/item/organ/cyberimp/arm/surgery name = "surgical toolset implant" desc = "A set of surgical tools hidden behind a concealed panel on the user's arm" - contents = newlist(/obj/item/weapon/retractor, /obj/item/weapon/hemostat, /obj/item/weapon/cautery, /obj/item/weapon/surgicaldrill, /obj/item/weapon/scalpel, /obj/item/weapon/circular_saw, /obj/item/weapon/surgical_drapes) + contents = newlist(/obj/item/weapon/retractor/augment, /obj/item/weapon/hemostat/augment, /obj/item/weapon/cautery/augment, /obj/item/weapon/surgicaldrill/augment, /obj/item/weapon/scalpel/augment, /obj/item/weapon/circular_saw/augment, /obj/item/weapon/surgical_drapes) origin_tech = "materials=3;engineering=3;biotech=3;programming=2;magnets=3" diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index ff44804e75..0f5f1de91d 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -290,9 +290,8 @@ //HALLUCINATE else if((findtext(message, hallucinate_words))) cooldown = COOLDOWN_MEME - for(var/V in listeners) - var/mob/living/L = V - new /obj/effect/hallucination/delusion(get_turf(L),L,null,150 * power_multiplier,0) + for(var/mob/living/carbon/C in listeners) + new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0) //WAKE UP else if((findtext(message, wakeup_words))) diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 3ef91fcef8..5686389dea 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -9,6 +9,18 @@ origin_tech = "materials=1;biotech=1" +/obj/item/weapon/retractor/augment + name = "toolarm retractor" + desc = "Micro-mechanical manipulator for retracting stuff." + icon = 'icons/obj/surgery.dmi' + icon_state = "retractor" + materials = list(MAT_METAL=6000, MAT_GLASS=3000) + flags = CONDUCT + w_class = WEIGHT_CLASS_TINY + origin_tech = "materials=1;biotech=1" + toolspeed = 0.5 + + /obj/item/weapon/hemostat name = "hemostat" desc = "You think you have seen this before." @@ -21,6 +33,19 @@ attack_verb = list("attacked", "pinched") +/obj/item/weapon/hemostat/augment + name = "toolarm hemostat" + desc = "Tiny servos power a pair of pincers to stop bleeding." + icon = 'icons/obj/surgery.dmi' + icon_state = "hemostat" + materials = list(MAT_METAL=5000, MAT_GLASS=2500) + flags = CONDUCT + w_class = WEIGHT_CLASS_TINY + origin_tech = "materials=1;biotech=1" + toolspeed = 0.5 + attack_verb = list("attacked", "pinched") + + /obj/item/weapon/cautery name = "cautery" desc = "This stops bleeding." @@ -33,6 +58,19 @@ attack_verb = list("burnt") +/obj/item/weapon/cautery/augment + name = "toolarm cautery" + desc = "A heated element that cauterizes wounds." + icon = 'icons/obj/surgery.dmi' + icon_state = "cautery" + materials = list(MAT_METAL=2500, MAT_GLASS=750) + flags = CONDUCT + w_class = WEIGHT_CLASS_TINY + origin_tech = "materials=1;biotech=1" + toolspeed = 0.5 + attack_verb = list("burnt") + + /obj/item/weapon/surgicaldrill name = "surgical drill" desc = "You can drill using this item. You dig?" @@ -48,6 +86,22 @@ origin_tech = "materials=1;biotech=1" attack_verb = list("drilled") + +/obj/item/weapon/surgicaldrill/augment + name = "toolarm surgical drill" + desc = "Effectively a small power drill contained within your arm, edges dulled to prevent tissue damage. May or may not pierce the heavens." + icon = 'icons/obj/surgery.dmi' + icon_state = "drill" + hitsound = 'sound/weapons/circsawhit.ogg' + materials = list(MAT_METAL=10000, MAT_GLASS=6000) + flags = CONDUCT + force = 10 + w_class = WEIGHT_CLASS_SMALL + origin_tech = "materials=1;biotech=1" + toolspeed = 0.5 + attack_verb = list("drilled") + + /obj/item/weapon/scalpel name = "scalpel" desc = "Cut, cut, and once more cut." @@ -67,6 +121,24 @@ hitsound = 'sound/weapons/bladeslice.ogg' sharpness = IS_SHARP_ACCURATE +/obj/item/weapon/scalpel/augment + name = "toolarm scalpel" + desc = "Ultra-sharp blade attached directly to your bone for extra-accuracy." + icon = 'icons/obj/surgery.dmi' + icon_state = "scalpel" + flags = CONDUCT + force = 10 + w_class = WEIGHT_CLASS_TINY + throwforce = 5 + throw_speed = 3 + throw_range = 5 + materials = list(MAT_METAL=4000, MAT_GLASS=1000) + origin_tech = "materials=1;biotech=1" + attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + toolspeed = 0.5 + hitsound = 'sound/weapons/bladeslice.ogg' + sharpness = IS_SHARP_ACCURATE + /obj/item/weapon/scalpel/suicide_act(mob/user) user.visible_message("[user] is slitting [user.p_their()] [pick("wrists", "throat", "stomach")] with [src]! It looks like [user.p_theyre()] trying to commit suicide!") return (BRUTELOSS) @@ -92,6 +164,25 @@ attack_verb = list("attacked", "slashed", "sawed", "cut") sharpness = IS_SHARP +/obj/item/weapon/circular_saw/augment + name = "toolarm circular saw" + desc = "A small but very fast spinning saw. Edges dulled to prevent accidental cutting inside of the surgeon." + icon = 'icons/obj/surgery.dmi' + icon_state = "saw" + hitsound = 'sound/weapons/circsawhit.ogg' + throwhitsound = 'sound/weapons/pierce.ogg' + flags = CONDUCT + force = 10 + w_class = WEIGHT_CLASS_SMALL + throwforce = 9 + throw_speed = 2 + throw_range = 5 + materials = list(MAT_METAL=10000, MAT_GLASS=6000) + origin_tech = "biotech=1;combat=1" + toolspeed = 0.5 + attack_verb = list("attacked", "slashed", "sawed", "cut") + sharpness = IS_SHARP + /obj/item/weapon/surgical_drapes name = "surgical drapes" desc = "Nanotrasen brand surgical drapes provide optimal safety and infection control." @@ -104,7 +195,7 @@ /obj/item/weapon/surgical_drapes/attack(mob/living/M, mob/user) if(!attempt_initiate_surgery(src, M, user)) ..() - + /obj/item/weapon/organ_storage //allows medical cyborgs to manipulate organs without hands name = "organ storage bag" desc = "A container for holding body parts." @@ -120,7 +211,7 @@ if(!isorgan(I) && !isbodypart(I)) to_chat(user, "[src] can only hold body parts!") return - + user.visible_message("[user] puts [I] into [src].", "You put [I] inside [src].") icon_state = "evidence" var/xx = I.pixel_x diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index 7b455b7d80..b04ebe6643 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -110,10 +110,10 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. var/obj/item/weapon/storage/box/B = A if(istype(B) && B.contents.len > 0) for(var/obj/item/I in B) - U.purchase_log += "[bicon(I)]" + U.purchase_log += "[icon2base64html(I)]" else if(purchase_log_vis) - U.purchase_log += "[bicon(A)]" + U.purchase_log += "[icon2base64html(A)]" if(limited_stock > 0) limited_stock -= 1 @@ -1394,7 +1394,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. continue crate_value -= I.cost new I.item(C) - U.purchase_log += "[bicon(I.item)]" + U.purchase_log += "[icon2base64html(I.item)]" SSblackbox.add_details("traitor_uplink_items_bought", "[name]|[cost]") return C diff --git a/code/modules/vehicles/bicycle.dm b/code/modules/vehicles/bicycle.dm index 2d9b3c8258..cd93196b69 100644 --- a/code/modules/vehicles/bicycle.dm +++ b/code/modules/vehicles/bicycle.dm @@ -13,7 +13,7 @@ /obj/vehicle/bicycle/buckle_mob(mob/living/M, force = 0, check_loc = 1) if(prob(easter_egg_chance) || (SSevents.holidays && SSevents.holidays[APRIL_FOOLS])) - M << sound(pick(bike_music), repeat = 1, wait = 0, volume = 80, channel = CHANNEL_BICYCLE) + SEND_SOUND(M, sound(pick(bike_music), repeat = 1, wait = 0, volume = 80, channel = CHANNEL_BICYCLE)) . = ..() /obj/vehicle/bicycle/unbuckle_mob(mob/living/buckled_mob,force = 0) diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 149094de3f..b58875bd1f 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -45,7 +45,8 @@ //Send messages to_chat(owner, "[digest_alert_owner]") - M.visible_message("You watch as [owner]'s form loses its additions.", "[digest_alert_prey]") + to_chat(M, "[digest_alert_prey]") + M.visible_message("You watch as [owner]'s form loses its additions.") owner.nutrition += 400 // so eating dead mobs gives you *something*. M.stop_sound_channel(CHANNEL_PRED) diff --git a/code/world.dm b/code/world.dm index b6badeb348..955d19c6c4 100644 --- a/code/world.dm +++ b/code/world.dm @@ -1,3 +1,7 @@ + +//This file is just for the necessary /world definition +//Try looking in game/world.dm + /world mob = /mob/dead/new_player turf = /turf/open/space/basic @@ -10,304 +14,3 @@ #ifdef GC_FAILURE_HARD_LOOKUP loop_checks = FALSE #endif - -/world/New() - log_world("World loaded at [time_stamp()]") - - SetupExternalRSC() - - GLOB.config_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl - - make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) - - config = new - - CheckSchemaVersion() - SetRoundID() - - SetupLogs() - - if(!RunningService()) //tgs2 support - GLOB.revdata.DownloadPRDetails() - - load_motd() - load_admins() - LoadVerbs(/datum/verbs/menu) - if(config.usewhitelist) - load_whitelist() - LoadBans() - - GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000 - - Master.Initialize(10, FALSE) - - if(config.irc_announce_new_game) - IRCBroadcast("New round starting on [SSmapping.config.map_name]!") - -/world/proc/SetupExternalRSC() -#if (PRELOAD_RSC == 0) - external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n") - var/i=1 - while(i<=external_rsc_urls.len) - if(external_rsc_urls[i]) - i++ - else - external_rsc_urls.Cut(i,i+1) -#endif - -/world/proc/CheckSchemaVersion() - if(config.sql_enabled) - if(SSdbcore.Connect()) - log_world("Database connection established.") - var/datum/DBQuery/db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_version")]") - db_version.Execute() - if(db_version.NextRow()) - var/db_major = db_version.item[1] - var/db_minor = db_version.item[2] - if(db_major < DB_MAJOR_VERSION || db_minor < DB_MINOR_VERSION) - message_admins("db schema ([db_major].[db_minor]) is behind latest tg schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") - log_sql("db schema ([db_major].[db_minor]) is behind latest tg schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") - else - message_admins("Could not get schema version from db") - else - log_world("Your server failed to establish a connection with the database.") - -/world/proc/SetRoundID() - if(config.sql_enabled) - if(SSdbcore.Connect()) - var/datum/DBQuery/query_round_start = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (start_datetime, server_ip, server_port) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]')") - query_round_start.Execute() - var/datum/DBQuery/query_round_last_id = SSdbcore.NewQuery("SELECT LAST_INSERT_ID()") - query_round_last_id.Execute() - if(query_round_last_id.NextRow()) - GLOB.round_id = query_round_last_id.item[1] - -/world/proc/SetupLogs() - GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-" - if(GLOB.round_id) - GLOB.log_directory += "[GLOB.round_id]" - else - GLOB.log_directory += "[replacetext(time_stamp(), ":", ".")]" - GLOB.world_game_log = file("[GLOB.log_directory]/game.log") - GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log") - GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log") - GLOB.world_href_log = file("[GLOB.log_directory]/hrefs.html") - GLOB.world_game_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" - GLOB.world_attack_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" - GLOB.world_runtime_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" - GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently - if(fexists(GLOB.config_error_log)) - fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log") - fdel(GLOB.config_error_log) - - if(GLOB.round_id) - log_game("Round ID: [GLOB.round_id]") - -/world/Topic(T, addr, master, key) - var/list/input = params2list(T) - - var/pinging = ("ping" in input) - var/playing = ("players" in input) - - if(!pinging && !playing && config && config.log_world_topic) - GLOB.world_game_log << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]" - - if(input[SERVICE_CMD_PARAM_KEY]) - return ServiceCommand(input) - var/key_valid = (global.comms_allowed && input["key"] == global.comms_key) - - if(pinging) - var/x = 1 - for (var/client/C in GLOB.clients) - x++ - return x - - else if(playing) - var/n = 0 - for(var/mob/M in GLOB.player_list) - if(M.client) - n++ - return n - - else if("ircstatus" in input) //tgs2 support - var/static/last_irc_status = 0 - if(world.time - last_irc_status < 50) - return - var/list/adm = get_admin_counts() - var/list/allmins = adm["total"] - var/status = "Admins: [allmins.len] (Active: [english_list(adm["present"])] AFK: [english_list(adm["afk"])] Stealth: [english_list(adm["stealth"])] Skipped: [english_list(adm["noflags"])]). " - status += "Players: [GLOB.clients.len] (Active: [get_active_player_count(0,1,0)]). Mode: [SSticker.mode.name]." - send2irc("Status", status) - last_irc_status = world.time - - else if("status" in input) - var/list/s = list() - s["version"] = GLOB.game_version - s["mode"] = GLOB.master_mode - s["respawn"] = config ? GLOB.abandon_allowed : 0 - s["enter"] = GLOB.enter_allowed - s["vote"] = config.allow_vote_mode - s["ai"] = config.allow_ai - s["host"] = host ? host : null - s["active_players"] = get_active_player_count() - s["players"] = GLOB.clients.len - s["revision"] = GLOB.revdata.commit - s["revision_date"] = GLOB.revdata.date - - var/list/adm = get_admin_counts() - var/list/presentmins = adm["present"] - var/list/afkmins = adm["afk"] - s["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho - s["gamestate"] = 1 - if(SSticker) - s["gamestate"] = SSticker.current_state - - s["map_name"] = SSmapping.config.map_name - - if(key_valid && SSticker.HasRoundStarted()) - s["real_mode"] = SSticker.mode.name - // Key-authed callers may know the truth behind the "secret" - - s["security_level"] = get_security_level() - s["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0 - // Amount of world's ticks in seconds, useful for calculating round duration - - if(SSshuttle && SSshuttle.emergency) - s["shuttle_mode"] = SSshuttle.emergency.mode - // Shuttle status, see /__DEFINES/stat.dm - s["shuttle_timer"] = SSshuttle.emergency.timeLeft() - // Shuttle timer, in seconds - - return list2params(s) - - else if("announce" in input) - if(!key_valid) - return "Bad Key" - else - AnnouncePR(input["announce"], json_decode(input["payload"])) - - else if("crossmessage" in input) - if(!key_valid) - return - else - if(input["crossmessage"] == "Ahelp") - relay_msg_admins("HELP: [input["source"]] [input["message_sender"]]: [input["message"]]") - if(input["crossmessage"] == "Comms_Console") - minor_announce(input["message"], "Incoming message from [input["message_sender"]]") - for(var/obj/machinery/computer/communications/CM in GLOB.machines) - CM.overrideCooldown() - if(input["crossmessage"] == "News_Report") - minor_announce(input["message"], "Breaking Update From [input["message_sender"]]") - - else if("adminmsg" in input) //tgs2 support - if(!key_valid) - return "Bad Key" - else - return IrcPm(input["adminmsg"],input["msg"],input["sender"]) - - else if("namecheck" in input) //tgs2 support - if(!key_valid) - return "Bad Key" - else - log_admin("IRC Name Check: [input["sender"]] on [input["namecheck"]]") - message_admins("IRC name checking on [input["namecheck"]] from [input["sender"]]") - return keywords_lookup(input["namecheck"],1) - else if("adminwho" in input) //tgs2 support - if(!key_valid) - return "Bad Key" - else - return ircadminwho() - else if("server_hop" in input) - show_server_hop_transfer_screen(input["server_hop"]) - -#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round - //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored - -/world/proc/AnnouncePR(announcement, list/payload) - var/static/list/PRcounts = list() //PR id -> number of times announced this round - var/id = "[payload["pull_request"]["id"]]" - if(!PRcounts[id]) - PRcounts[id] = 1 - else - ++PRcounts[id] - if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND) - return - - var/final_composed = "PR: [announcement]" - for(var/client/C in GLOB.clients) - C.AnnouncePR(final_composed) - -/world/Reboot(reason = 0, fast_track = FALSE) - ServiceReboot() //handles alternative actions if necessary - if (reason || fast_track) //special reboot, do none of the normal stuff - if (usr) - log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools") - message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools") - to_chat(world, "Rebooting World immediately due to host request") - else - to_chat(world, "Rebooting world...") - Master.Shutdown() //run SS shutdowns - log_world("World rebooted at [time_stamp()]") - ..() - -/world/proc/load_motd() - GLOB.join_motd = file2text("config/motd.txt") + "
    " + GLOB.revdata.GetTestMergeInfo() - -/world/proc/update_status() - var/s = "" - - if (config && config.server_name) - s += "[config.server_name] — " - - s += "[station_name()]"; - s += " (" - s += "" //Change this to wherever you want the hub to link to. - s += "Default" //Replace this with something else. Or ever better, delete it and uncomment the game version. - s += "" - s += ")" - - var/list/features = list() - - if(SSticker) - if(GLOB.master_mode) - features += GLOB.master_mode - else - features += "STARTING" - - if (!GLOB.enter_allowed) - features += "closed" - - features += GLOB.abandon_allowed ? "respawn" : "no respawn" - - if (config && config.allow_vote_mode) - features += "vote" - - if (config && config.allow_ai) - features += "AI allowed" - - var/n = 0 - for (var/mob/M in GLOB.player_list) - if (M.client) - n++ - - if (n > 1) - features += "~[n] players" - else if (n > 0) - features += "~[n] player" - - if (!host && config && config.hostedby) - features += "hosted by [config.hostedby]" - - if (features) - s += ": [jointext(features, ", ")]" - - status = s - -/world/proc/update_hub_visibility(new_visibility) - if(new_visibility == GLOB.hub_visibility) - return - GLOB.hub_visibility = new_visibility - if(GLOB.hub_visibility) - hub_password = "kMZy3U5jJHSiBQjr" - else - hub_password = "SORRYNOPASSWORD" diff --git a/code/world.dm.rej b/code/world.dm.rej new file mode 100644 index 0000000000..e82c17e503 --- /dev/null +++ b/code/world.dm.rej @@ -0,0 +1,301 @@ +diff a/code/world.dm b/code/world.dm (rejected hunks) +@@ -10,299 +13,3 @@ + #ifdef GC_FAILURE_HARD_LOOKUP + loop_checks = FALSE + #endif +- +-/world/New() +- log_world("World loaded at [time_stamp()]") +- +- SetupExternalRSC() +- +- GLOB.config_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl +- +- make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) +- +- config = new +- +- CheckSchemaVersion() +- SetRoundID() +- +- SetupLogs() +- +- if(!RunningService()) //tgs2 support +- GLOB.revdata.DownloadPRDetails() +- +- load_motd() +- load_admins() +- LoadVerbs(/datum/verbs/menu) +- if(config.usewhitelist) +- load_whitelist() +- LoadBans() +- +- GLOB.timezoneOffset = text2num(time2text(0,"hh")) * 36000 +- +- Master.Initialize(10, FALSE) +- +- if(config.irc_announce_new_game) +- IRCBroadcast("New round starting on [SSmapping.config.map_name]!") +- +-/world/proc/SetupExternalRSC() +-#if (PRELOAD_RSC == 0) +- external_rsc_urls = world.file2list("config/external_rsc_urls.txt","\n") +- var/i=1 +- while(i<=external_rsc_urls.len) +- if(external_rsc_urls[i]) +- i++ +- else +- external_rsc_urls.Cut(i,i+1) +-#endif +- +-/world/proc/CheckSchemaVersion() +- if(config.sql_enabled) +- if(SSdbcore.Connect()) +- log_world("Database connection established.") +- var/datum/DBQuery/query_db_version = SSdbcore.NewQuery("SELECT major, minor FROM [format_table_name("schema_revision")] ORDER BY date DESC LIMIT 1") +- query_db_version.Execute() +- if(query_db_version.NextRow()) +- var/db_major = text2num(query_db_version.item[1]) +- var/db_minor = text2num(query_db_version.item[2]) +- if(db_major < DB_MAJOR_VERSION || db_minor < DB_MINOR_VERSION) +- message_admins("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") +- log_sql("Database schema ([db_major].[db_minor]) is behind latest schema version ([DB_MAJOR_VERSION].[DB_MINOR_VERSION]), this may lead to undefined behaviour or errors") +- else +- message_admins("Could not get schema version from database") +- else +- log_world("Your server failed to establish a connection with the database.") +- +-/world/proc/SetRoundID() +- if(config.sql_enabled) +- if(SSdbcore.Connect()) +- var/datum/DBQuery/query_round_start = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (start_datetime, server_ip, server_port) VALUES (Now(), INET_ATON(IF('[world.internet_address]' LIKE '', '0', '[world.internet_address]')), '[world.port]')") +- query_round_start.Execute() +- var/datum/DBQuery/query_round_last_id = SSdbcore.NewQuery("SELECT LAST_INSERT_ID()") +- query_round_last_id.Execute() +- if(query_round_last_id.NextRow()) +- GLOB.round_id = query_round_last_id.item[1] +- +-/world/proc/SetupLogs() +- GLOB.log_directory = "data/logs/[time2text(world.realtime, "YYYY/MM/DD")]/round-" +- if(GLOB.round_id) +- GLOB.log_directory += "[GLOB.round_id]" +- else +- GLOB.log_directory += "[replacetext(time_stamp(), ":", ".")]" +- GLOB.world_game_log = file("[GLOB.log_directory]/game.log") +- GLOB.world_attack_log = file("[GLOB.log_directory]/attack.log") +- GLOB.world_runtime_log = file("[GLOB.log_directory]/runtime.log") +- GLOB.world_href_log = file("[GLOB.log_directory]/hrefs.html") +- GLOB.world_game_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" +- GLOB.world_attack_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" +- GLOB.world_runtime_log << "\n\nStarting up round ID [GLOB.round_id]. [time_stamp()]\n---------------------" +- GLOB.changelog_hash = md5('html/changelog.html') //used for telling if the changelog has changed recently +- if(fexists(GLOB.config_error_log)) +- fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log") +- fdel(GLOB.config_error_log) +- +- if(GLOB.round_id) +- log_game("Round ID: [GLOB.round_id]") +- +-/world/Topic(T, addr, master, key) +- var/list/input = params2list(T) +- +- var/pinging = ("ping" in input) +- var/playing = ("players" in input) +- +- if(!pinging && !playing && config && config.log_world_topic) +- GLOB.world_game_log << "TOPIC: \"[T]\", from:[addr], master:[master], key:[key]" +- +- if(input[SERVICE_CMD_PARAM_KEY]) +- return ServiceCommand(input) +- var/key_valid = (global.comms_allowed && input["key"] == global.comms_key) +- +- if(pinging) +- var/x = 1 +- for (var/client/C in GLOB.clients) +- x++ +- return x +- +- else if(playing) +- var/n = 0 +- for(var/mob/M in GLOB.player_list) +- if(M.client) +- n++ +- return n +- +- else if("ircstatus" in input) //tgs2 support +- var/static/last_irc_status = 0 +- if(world.time - last_irc_status < 50) +- return +- var/list/adm = get_admin_counts() +- var/list/allmins = adm["total"] +- var/status = "Admins: [allmins.len] (Active: [english_list(adm["present"])] AFK: [english_list(adm["afk"])] Stealth: [english_list(adm["stealth"])] Skipped: [english_list(adm["noflags"])]). " +- status += "Players: [GLOB.clients.len] (Active: [get_active_player_count(0,1,0)]). Mode: [SSticker.mode.name]." +- send2irc("Status", status) +- last_irc_status = world.time +- +- else if("status" in input) +- var/list/s = list() +- s["version"] = GLOB.game_version +- s["mode"] = GLOB.master_mode +- s["respawn"] = config ? GLOB.abandon_allowed : 0 +- s["enter"] = GLOB.enter_allowed +- s["vote"] = config.allow_vote_mode +- s["ai"] = config.allow_ai +- s["host"] = host ? host : null +- s["active_players"] = get_active_player_count() +- s["players"] = GLOB.clients.len +- s["revision"] = GLOB.revdata.commit +- s["revision_date"] = GLOB.revdata.date +- +- var/list/adm = get_admin_counts() +- var/list/presentmins = adm["present"] +- var/list/afkmins = adm["afk"] +- s["admins"] = presentmins.len + afkmins.len //equivalent to the info gotten from adminwho +- s["gamestate"] = SSticker.current_state +- +- s["map_name"] = SSmapping.config.map_name +- +- if(key_valid && SSticker.HasRoundStarted()) +- s["real_mode"] = SSticker.mode.name +- // Key-authed callers may know the truth behind the "secret" +- +- s["security_level"] = get_security_level() +- s["round_duration"] = SSticker ? round((world.time-SSticker.round_start_time)/10) : 0 +- // Amount of world's ticks in seconds, useful for calculating round duration +- +- if(SSshuttle && SSshuttle.emergency) +- s["shuttle_mode"] = SSshuttle.emergency.mode +- // Shuttle status, see /__DEFINES/stat.dm +- s["shuttle_timer"] = SSshuttle.emergency.timeLeft() +- // Shuttle timer, in seconds +- +- return list2params(s) +- +- else if("announce" in input) +- if(!key_valid) +- return "Bad Key" +- else +- AnnouncePR(input["announce"], json_decode(input["payload"])) +- +- else if("crossmessage" in input) +- if(!key_valid) +- return +- else +- if(input["crossmessage"] == "Ahelp") +- relay_msg_admins("HELP: [input["source"]] [input["message_sender"]]: [input["message"]]") +- if(input["crossmessage"] == "Comms_Console") +- minor_announce(input["message"], "Incoming message from [input["message_sender"]]") +- for(var/obj/machinery/computer/communications/CM in GLOB.machines) +- CM.overrideCooldown() +- if(input["crossmessage"] == "News_Report") +- minor_announce(input["message"], "Breaking Update From [input["message_sender"]]") +- +- else if("adminmsg" in input) //tgs2 support +- if(!key_valid) +- return "Bad Key" +- else +- return IrcPm(input["adminmsg"],input["msg"],input["sender"]) +- +- else if("namecheck" in input) //tgs2 support +- if(!key_valid) +- return "Bad Key" +- else +- log_admin("IRC Name Check: [input["sender"]] on [input["namecheck"]]") +- message_admins("IRC name checking on [input["namecheck"]] from [input["sender"]]") +- return keywords_lookup(input["namecheck"],1) +- else if("adminwho" in input) //tgs2 support +- if(!key_valid) +- return "Bad Key" +- else +- return ircadminwho() +- else if("server_hop" in input) +- show_server_hop_transfer_screen(input["server_hop"]) +- +-#define PR_ANNOUNCEMENTS_PER_ROUND 5 //The number of unique PR announcements allowed per round +- //This makes sure that a single person can only spam 3 reopens and 3 closes before being ignored +- +-/world/proc/AnnouncePR(announcement, list/payload) +- var/static/list/PRcounts = list() //PR id -> number of times announced this round +- var/id = "[payload["pull_request"]["id"]]" +- if(!PRcounts[id]) +- PRcounts[id] = 1 +- else +- ++PRcounts[id] +- if(PRcounts[id] > PR_ANNOUNCEMENTS_PER_ROUND) +- return +- +- var/final_composed = "PR: [announcement]" +- for(var/client/C in GLOB.clients) +- C.AnnouncePR(final_composed) +- +-/world/Reboot(reason = 0, fast_track = FALSE) +- ServiceReboot() //handles alternative actions if necessary +- if (reason || fast_track) //special reboot, do none of the normal stuff +- if (usr) +- log_admin("[key_name(usr)] Has requested an immediate world restart via client side debugging tools") +- message_admins("[key_name_admin(usr)] Has requested an immediate world restart via client side debugging tools") +- to_chat(world, "Rebooting World immediately due to host request") +- else +- to_chat(world, "Rebooting world...") +- Master.Shutdown() //run SS shutdowns +- log_world("World rebooted at [time_stamp()]") +- ..() +- +-/world/proc/load_motd() +- GLOB.join_motd = file2text("config/motd.txt") + "
    " + GLOB.revdata.GetTestMergeInfo() +- +-/world/proc/update_status() +- var/s = "" +- +- if (config && config.server_name) +- s += "[config.server_name] — " +- +- s += "[station_name()]"; +- s += " (" +- s += "" //Change this to wherever you want the hub to link to. +- s += "Default" //Replace this with something else. Or ever better, delete it and uncomment the game version. +- s += "" +- s += ")" +- +- var/list/features = list() +- +- if(GLOB.master_mode) +- features += GLOB.master_mode +- +- if (!GLOB.enter_allowed) +- features += "closed" +- +- features += GLOB.abandon_allowed ? "respawn" : "no respawn" +- +- if (config && config.allow_vote_mode) +- features += "vote" +- +- if (config && config.allow_ai) +- features += "AI allowed" +- +- var/n = 0 +- for (var/mob/M in GLOB.player_list) +- if (M.client) +- n++ +- +- if (n > 1) +- features += "~[n] players" +- else if (n > 0) +- features += "~[n] player" +- +- if (!host && config && config.hostedby) +- features += "hosted by [config.hostedby]" +- +- if (features) +- s += ": [jointext(features, ", ")]" +- +- status = s +- +-/world/proc/update_hub_visibility(new_visibility) +- if(new_visibility == GLOB.hub_visibility) +- return +- GLOB.hub_visibility = new_visibility +- if(GLOB.hub_visibility) +- hub_password = "kMZy3U5jJHSiBQjr" +- else +- hub_password = "SORRYNOPASSWORD" diff --git a/html/changelogs/AutoChangeLog-pr-2020.yml b/html/changelogs/AutoChangeLog-pr-2020.yml new file mode 100644 index 0000000000..9615854516 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2020.yml @@ -0,0 +1,4 @@ +author: "Joan" +delete-after: True +changes: + - rscdel: "Removed the Soul Vessel, Cogscarab, and Anima Fragment Scriptures." diff --git a/html/changelogs/AutoChangeLog-pr-2197.yml b/html/changelogs/AutoChangeLog-pr-2197.yml new file mode 100644 index 0000000000..6d4e8f4089 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2197.yml @@ -0,0 +1,6 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "Surgical toolarm to protolathe and exofab" + - tweak: "Toolarm tools are less robust but more efficient at surgery" + - tweak: "Arm augments are no longer a huge item" diff --git a/html/changelogs/AutoChangeLog-pr-2231.yml b/html/changelogs/AutoChangeLog-pr-2231.yml new file mode 100644 index 0000000000..c25b4b2b49 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2231.yml @@ -0,0 +1,4 @@ +author: "Xhuis" +delete-after: True +changes: + - tweak: "Spell action buttons now have their description in a tooltip." diff --git a/html/changelogs/AutoChangeLog-pr-2242.yml b/html/changelogs/AutoChangeLog-pr-2242.yml new file mode 100644 index 0000000000..69b47043d3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2242.yml @@ -0,0 +1,5 @@ +author: "ktccd" +delete-after: True +changes: + - bugfix: "Cloning and podding people no longer forgets to put the genitals back in you." + - bugfix: "Changeling and other DNA transformations now apply the appropriate genitalia." diff --git a/html/changelogs/AutoChangeLog-pr-2245.yml b/html/changelogs/AutoChangeLog-pr-2245.yml new file mode 100644 index 0000000000..3f19f56d03 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2245.yml @@ -0,0 +1,4 @@ +author: "Galactic Corgi Breeding Mills, LLC" +delete-after: True +changes: + - bugfix: "Fixed corgis being able to wear spacesuit helmets despite lacking the proper code and sprites for them." diff --git a/html/changelogs/AutoChangeLog-pr-2249.yml b/html/changelogs/AutoChangeLog-pr-2249.yml new file mode 100644 index 0000000000..4cc75881bc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2249.yml @@ -0,0 +1,4 @@ +author: "Xhuis" +delete-after: True +changes: + - bugfix: "Alien hunters can no longer pounce through shields." diff --git a/html/changelogs/AutoChangeLog-pr-2266.yml b/html/changelogs/AutoChangeLog-pr-2266.yml new file mode 100644 index 0000000000..2a02edfb87 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2266.yml @@ -0,0 +1,4 @@ +author: "Xhuis" +delete-after: True +changes: + - bugfix: "Objects on shuttles now rotate in the correct directions." diff --git a/html/changelogs/AutoChangeLog-pr-2274.yml b/html/changelogs/AutoChangeLog-pr-2274.yml new file mode 100644 index 0000000000..ef5c537edd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2274.yml @@ -0,0 +1,4 @@ +author: "Lexorion" +delete-after: True +changes: + - imageadd: "Hearty Punch has a new, fancier sprite." diff --git a/html/changelogs/AutoChangeLog-pr-2278.yml b/html/changelogs/AutoChangeLog-pr-2278.yml new file mode 100644 index 0000000000..111ae24812 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2278.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Fixed hair sticking through headgear." diff --git a/html/changelogs/AutoChangeLog-pr-2281.yml b/html/changelogs/AutoChangeLog-pr-2281.yml new file mode 100644 index 0000000000..189f18a117 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2281.yml @@ -0,0 +1,4 @@ +author: "ktccd" +delete-after: True +changes: + - bugfix: "Character preview now displays genitals again." diff --git a/html/changelogs/AutoChangeLog-pr-2287.yml b/html/changelogs/AutoChangeLog-pr-2287.yml new file mode 100644 index 0000000000..d6b77f9436 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2287.yml @@ -0,0 +1,4 @@ +author: "Xhuis" +delete-after: True +changes: + - bugfix: "Turning off APCs will no longer make the weather in that area invisible." diff --git a/html/changelogs/AutoChangeLog-pr-2291.yml b/html/changelogs/AutoChangeLog-pr-2291.yml new file mode 100644 index 0000000000..4b87a21dfd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2291.yml @@ -0,0 +1,4 @@ +author: "Xhuis" +delete-after: True +changes: + - soundadd: "The speakers in the ceiling have been upgraded, and many sounds are now less tinny." diff --git a/html/changelogs/AutoChangeLog-pr-2295.yml b/html/changelogs/AutoChangeLog-pr-2295.yml new file mode 100644 index 0000000000..c34d19ac6f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2295.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - tweak: "Mulligan and non-continuous completion checks will not consider afk/logged out people to be \"living crew\"." diff --git a/html/changelogs/AutoChangeLog-pr-2298.yml b/html/changelogs/AutoChangeLog-pr-2298.yml new file mode 100644 index 0000000000..3d12cf9dee --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2298.yml @@ -0,0 +1,4 @@ +author: "ktccd" +delete-after: True +changes: + - bugfix: "Preys being digested now get their digestion message" diff --git a/html/changelogs/AutoChangeLog-pr-2299.yml b/html/changelogs/AutoChangeLog-pr-2299.yml new file mode 100644 index 0000000000..7f5e8730dc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2299.yml @@ -0,0 +1,4 @@ +author: "JStheguy" +delete-after: True +changes: + - imageadd: "Laptops now have actual sprites for using the supermatter monitoring instead of defaulting to a generic one." diff --git a/html/changelogs/AutoChangeLog-pr-2301.yml b/html/changelogs/AutoChangeLog-pr-2301.yml new file mode 100644 index 0000000000..2924b5a5ad --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2301.yml @@ -0,0 +1,4 @@ +author: "LetterJay" +delete-after: True +changes: + - rscadd: "Adds bear ears and bear tails (Sprites courtesy of LizziePup)" diff --git a/html/changelogs/AutoChangeLog-pr-2305.yml b/html/changelogs/AutoChangeLog-pr-2305.yml new file mode 100644 index 0000000000..fbd7208358 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2305.yml @@ -0,0 +1,4 @@ +author: "Joan" +delete-after: True +changes: + - imageadd: "Belligerent now has a visible indicator over the caster." diff --git a/html/changelogs/AutoChangeLog-pr-2308.yml b/html/changelogs/AutoChangeLog-pr-2308.yml new file mode 100644 index 0000000000..1d367c4d84 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2308.yml @@ -0,0 +1,7 @@ +author: "ktccd" +delete-after: True +changes: + - rscadd: "Penises can now climax inside someone instead of only be used for masturbating. Use passive grab to be able to spill on the floor, aggressive or higher grab to not spill a drop." + - rscadd: "Hexacrocin and hexacamphor now adjusts your arousal up respectively down when overdosed. Hexacrocin overdoses can force orgasms at high arousal." + - bugfix: "Penises can now be used for masturbation without containers again." + - bugfix: "Citadel chems now sends you feedback messages properly when in effect." diff --git a/html/changelogs/AutoChangeLog-pr-2309.yml b/html/changelogs/AutoChangeLog-pr-2309.yml new file mode 100644 index 0000000000..89ceed6223 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2309.yml @@ -0,0 +1,4 @@ +author: "ktccd" +delete-after: True +changes: + - bugfix: "Cloner and other mind-transfer things now respect client arousal settings." diff --git a/html/changelogs/AutoChangeLog-pr-2319.yml b/html/changelogs/AutoChangeLog-pr-2319.yml new file mode 100644 index 0000000000..4ca8998875 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2319.yml @@ -0,0 +1,4 @@ +author: "Xhuis" +delete-after: True +changes: + - bugfix: "Swarmer shells now have ghost notifications again." diff --git a/html/changelogs/AutoChangeLog-pr-2320.yml b/html/changelogs/AutoChangeLog-pr-2320.yml new file mode 100644 index 0000000000..695f23e7de --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2320.yml @@ -0,0 +1,4 @@ +author: "LetterJay" +delete-after: True +changes: + - tweak: "Adds the option for bear ears and tails for humans as well." diff --git a/html/changelogs/AutoChangeLog-pr-2329.yml b/html/changelogs/AutoChangeLog-pr-2329.yml new file mode 100644 index 0000000000..2950b70fbb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2329.yml @@ -0,0 +1,6 @@ +author: "ktccd" +delete-after: True +changes: + - rscadd: "Adds flared, knotted or tapered dicks for Taur bodies." + - tweak: "Resized the cow-taur's over-extended belly to match the profile picture, no longer completely blocking the taur penises." + - bugfix: "Barbed, knotted penises and other such long-named cocks are now visible on the ground if dismembered." diff --git a/html/changelogs/AutoChangeLog-pr-2335.yml b/html/changelogs/AutoChangeLog-pr-2335.yml new file mode 100644 index 0000000000..5681e3d5f9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2335.yml @@ -0,0 +1,4 @@ +author: "ktccd" +delete-after: True +changes: + - bugfix: "Flavortext is now in the DNA of mobs who has that, meaning changelings, cloners and such things use it properly." diff --git a/html/changelogs/AutoChangeLog-pr-2339.yml b/html/changelogs/AutoChangeLog-pr-2339.yml new file mode 100644 index 0000000000..c7f3d42698 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2339.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - tweak: "His Grace now shows up on the orbit list" diff --git a/html/changelogs/AutoChangeLog-pr-2346.yml b/html/changelogs/AutoChangeLog-pr-2346.yml new file mode 100644 index 0000000000..c42300a173 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2346.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - tweak: "The wiki button now asks what page you want to be taken to" diff --git a/html/changelogs/AutoChangeLog-pr-2350.yml b/html/changelogs/AutoChangeLog-pr-2350.yml new file mode 100644 index 0000000000..07e0f51b62 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2350.yml @@ -0,0 +1,4 @@ +author: "Xhuis" +delete-after: True +changes: + - bugfix: "Minebots no longer lack icons for their action buttons." diff --git a/html/changelogs/AutoChangeLog-pr-2356.yml b/html/changelogs/AutoChangeLog-pr-2356.yml new file mode 100644 index 0000000000..218da24865 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2356.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - imageadd: "Adds icon_states to the unused and used Eldritch whetstones. Sprites by Fury McFlurry." diff --git a/html/changelogs/AutoChangeLog-pr-2359.yml b/html/changelogs/AutoChangeLog-pr-2359.yml new file mode 100644 index 0000000000..8455963dc6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2359.yml @@ -0,0 +1,4 @@ +author: "Joan" +delete-after: True +changes: + - imageadd: "Ported CEV-Eris's APC sprites." diff --git a/html/changelogs/AutoChangeLog-pr-2362.yml b/html/changelogs/AutoChangeLog-pr-2362.yml new file mode 100644 index 0000000000..5bdc603b06 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2362.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - bugfix: "Fixes a typo in the blobbernaut spawn text" diff --git a/html/changelogs/AutoChangeLog-pr-2363.yml b/html/changelogs/AutoChangeLog-pr-2363.yml new file mode 100644 index 0000000000..e8f5b574ae --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2363.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - tweak: "Canisters don't flash red lights anymore when empty." diff --git a/html/changelogs/AutoChangeLog-pr-2371.yml b/html/changelogs/AutoChangeLog-pr-2371.yml new file mode 100644 index 0000000000..ec1810b8a6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2371.yml @@ -0,0 +1,4 @@ +author: "Xhuis" +delete-after: True +changes: + - bugfix: "The Resurrect Cultist rune now works as intended." diff --git a/html/changelogs/AutoChangeLog-pr-2376.yml b/html/changelogs/AutoChangeLog-pr-2376.yml new file mode 100644 index 0000000000..1d1a2007b5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2376.yml @@ -0,0 +1,4 @@ +author: "ShizCalev" +delete-after: True +changes: + - bugfix: "The Singularity, Tesla energy ball, tears in the fabric of reality, and Narsie will no longer be frozen by freon." diff --git a/html/changelogs/AutoChangeLog-pr-2377.yml b/html/changelogs/AutoChangeLog-pr-2377.yml new file mode 100644 index 0000000000..4996a03563 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2377.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - bugfix: "Fixes mining hardsuit heat_protection" diff --git a/html/changelogs/AutoChangeLog-pr-2399.yml b/html/changelogs/AutoChangeLog-pr-2399.yml new file mode 100644 index 0000000000..2d162a5edf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2399.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - rscadd: "Blobs can now sense when they're being cuddled!" diff --git a/html/changelogs/AutoChangeLog-pr-2402.yml b/html/changelogs/AutoChangeLog-pr-2402.yml new file mode 100644 index 0000000000..0ef97907fd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2402.yml @@ -0,0 +1,5 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - imageadd: "Nanotrasen redesigned the area power controllers!" + - imageadd: "Thanks Xhuis for the contrast tweak on APCs" diff --git a/html/changelogs/AutoChangeLog-pr-2408.yml b/html/changelogs/AutoChangeLog-pr-2408.yml new file mode 100644 index 0000000000..92f33a9292 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2408.yml @@ -0,0 +1,4 @@ +author: "Xhuis" +delete-after: True +changes: + - soundadd: "The station's explosion now uses a new (or old) sound." diff --git a/icons/effects/creampie.dmi b/icons/effects/creampie.dmi index 2a0365773b..6caecf7d76 100644 Binary files a/icons/effects/creampie.dmi and b/icons/effects/creampie.dmi differ diff --git a/icons/effects/geis_target_remove.dmi b/icons/effects/geis_target_remove.dmi new file mode 100644 index 0000000000..076f2f4ca5 Binary files /dev/null and b/icons/effects/geis_target_remove.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 3ed8c153d8..42226c7d2b 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 55d36996b7..06699662c0 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/hair_extensions.dmi b/icons/mob/hair_extensions.dmi index bd2adda94b..5a4ee36157 100644 Binary files a/icons/mob/hair_extensions.dmi and b/icons/mob/hair_extensions.dmi differ diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index 968e12949b..a06f490fa7 100644 Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ diff --git a/icons/mob/inhands/__inhand_template.dmi b/icons/mob/inhands/__inhand_template.dmi new file mode 100644 index 0000000000..283428495c Binary files /dev/null and b/icons/mob/inhands/__inhand_template.dmi differ diff --git a/icons/mob/inhands/equipment/custodial_lefthand.dmi b/icons/mob/inhands/equipment/custodial_lefthand.dmi index 80c77cf8df..b099ee1524 100644 Binary files a/icons/mob/inhands/equipment/custodial_lefthand.dmi and b/icons/mob/inhands/equipment/custodial_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/custodial_righthand.dmi b/icons/mob/inhands/equipment/custodial_righthand.dmi index fb64834ce9..8e0174150a 100644 Binary files a/icons/mob/inhands/equipment/custodial_righthand.dmi and b/icons/mob/inhands/equipment/custodial_righthand.dmi differ diff --git a/icons/mob/mam_body_markings.dmi b/icons/mob/mam_body_markings.dmi index a50181340d..fdb97490c8 100644 Binary files a/icons/mob/mam_body_markings.dmi and b/icons/mob/mam_body_markings.dmi differ diff --git a/icons/mob/mam_bodyparts.dmi b/icons/mob/mam_bodyparts.dmi index c08cf0685a..7de9b40734 100644 Binary files a/icons/mob/mam_bodyparts.dmi and b/icons/mob/mam_bodyparts.dmi differ diff --git a/icons/mob/mam_taur.dmi b/icons/mob/mam_taur.dmi index c0d62597ff..8cce485c7a 100644 Binary files a/icons/mob/mam_taur.dmi and b/icons/mob/mam_taur.dmi differ diff --git a/icons/mob/xeno_parts_greyscale.dmi b/icons/mob/xeno_parts_greyscale.dmi new file mode 100644 index 0000000000..44456309a7 Binary files /dev/null and b/icons/mob/xeno_parts_greyscale.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index ddb152152c..77c3b647bc 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index a8f7708c46..87b2b46a2b 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/icons/obj/machines/telecomms.dmi b/icons/obj/machines/telecomms.dmi index 7f5f05e3af..4a6988f88e 100644 Binary files a/icons/obj/machines/telecomms.dmi and b/icons/obj/machines/telecomms.dmi differ diff --git a/icons/obj/modular_laptop.dmi b/icons/obj/modular_laptop.dmi index 7026f52ee0..1e506ca6fe 100644 Binary files a/icons/obj/modular_laptop.dmi and b/icons/obj/modular_laptop.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index f3b2233283..e1604715ac 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/icons/obj/wallframe.dmi b/icons/obj/wallframe.dmi index 0e416cac77..70149901e3 100644 Binary files a/icons/obj/wallframe.dmi and b/icons/obj/wallframe.dmi differ diff --git a/interface/interface.dm b/interface/interface.dm index 253738064b..9ee5309585 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -1,12 +1,14 @@ //Please use mob or src (not usr) in these procs. This way they can be called in the same fashion as procs. -/client/verb/wiki() +/client/verb/wiki(query as text) set name = "wiki" - set desc = "Visit the wiki." + set desc = "Type what you want to know about. This will open the wiki in your web browser. Type nothing to go to the main page." set hidden = 1 if(config.wikiurl) - if(alert("This will open the wiki in your browser. Are you sure?",,"Yes","No")=="No") - return - src << link(config.wikiurl) + if(query) + var/output = config.wikiurl + "/index.php?title=Special%3ASearch&profile=default&search=" + query + src << link(output) + else if (query != null) + src << link(config.wikiurl) else to_chat(src, "The wiki URL is not set in the server configuration.") return diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index 6f38560b92..7ad30fb7b5 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -151,7 +151,7 @@ h1.alert, h2.alert {color: #000000;} .clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} -BIG IMG.icon {width: 32px; height: 32px;} +.icon {height: 1em; width: auto;} .memo {color: #638500; text-align: center;} .memoedit {text-align: center; font-size: 2;} @@ -161,4 +161,6 @@ BIG IMG.icon {width: 32px; height: 32px;} .monkey {color: #975032;} .swarmer {color: #2C75FF;} .resonate {color: #298F85;} +.love {color: #FF69Bf;} +.lovebold {color: #FF69Bf; font-weight: bold;} "} diff --git a/power.dmi b/power.dmi new file mode 100644 index 0000000000..d0066b96de Binary files /dev/null and b/power.dmi differ diff --git a/sound/effects/explosion_distant.ogg b/sound/effects/explosion_distant.ogg new file mode 100644 index 0000000000..d9976c51fe Binary files /dev/null and b/sound/effects/explosion_distant.ogg differ diff --git a/strings/brain_damage_lines.json b/strings/brain_damage_lines.json index ce3e726dbc..af040d5ba0 100644 --- a/strings/brain_damage_lines.json +++ b/strings/brain_damage_lines.json @@ -1,17 +1,17 @@ { "brain_damage": [ - "IM A PONY NEEEEEEIIIIIIIIIGH", + "@pick(semicolon)IM A PONY NEEEEEEIIIIIIIIIGH", "without oxigen blob don't evoluate?", - "CAPTAINS A COMDOM", - "@pick(faggot_traitor) @pick(george) @pick(mellens) is grifing me HALP!!!", + "@pick(semicolon)CAPTAINS A COMDOM", + "@pick(semicolon)@pick(faggot_traitor) @pick(george) @pick(mellens) is grifing me HALP!!!", "can u give me @pick(mutations)?", "THe saiyans screwed", "Bi is THE BEST OF BOTH WORLDS>", - "I WANNA PET TEH monkeyS", + "@pick(semicolon)I WANNA PET TEH monkeyS", "stop grifing me!!!!", "SOTP IT#", "shiggey diggey!!", - "A PIRATE APPEAR", + "@pick(semicolon)A PIRATE APPEAR", "FUS RO DAH", "fucking 4rries!", "stat me", @@ -136,7 +136,8 @@ "random_gibberish": [ "g", "squid", - "r" + "r", + "carbon dioxide" ], "y_replacements": [ @@ -171,6 +172,19 @@ "abdoocters" ], + "bug": [ + "", + "IS TIS A BUG??", + "SI IST A BUGG/", + "BUG!!!" + ], + + "semicolon": [ + "", + ";", + ".h" + ], + "roles": [ "heds", "ceptin", diff --git a/strings/brain_damage_lines.json.rej b/strings/brain_damage_lines.json.rej new file mode 100644 index 0000000000..6d8e1cdb62 --- /dev/null +++ b/strings/brain_damage_lines.json.rej @@ -0,0 +1,10 @@ +diff a/strings/brain_damage_lines.json b/strings/brain_damage_lines.json (rejected hunks) +@@ -131,7 +131,7 @@ + "", + "IS TIS A BUG??", + "SI IST A BUGG/", +- "BUG!!!" ++ "BUG!!!" + ], + + "semicolon": [ diff --git a/strings/cas_black.txt b/strings/cas_black.txt index b2087bd57a..a704f010ad 100644 --- a/strings/cas_black.txt +++ b/strings/cas_black.txt @@ -37,7 +37,7 @@ What happens when you emag an emag? Our gang doesn't wear uniforms. Our gang wears ___________. No matter how many lizards you have, _____ is never acceptable. No, the AI's second law is NOT to serve _____. -First CentComm came for the ________. Now they're coming for the __________. +First CentCom came for the ________. Now they're coming for the __________. The borgs are not slaves for your _____. You can never have too many _____ on the station. Why can't I find a space relationship? diff --git a/strings/hallucination.json b/strings/hallucination.json new file mode 100644 index 0000000000..b28c70db4a --- /dev/null +++ b/strings/hallucination.json @@ -0,0 +1,229 @@ +{ + "suspicion": [ + "I'm watching you...", + "I know what you're doing", + "What are you hiding?", + "I saw that" + ], + + "greetings": [ + "", + "Hey, ", + "Hi ", + "Hello ", + "Wait, ", + "It's " + ], + + "getout": [ + "Get out", + "Get out!", + "Go away", + "Fuck off", + "OUT!", + "Out!" + ], + + "weird": [ + "Kchck-Chkck? Kchchck!", + "Kchckchk...", + "EEEeeeeEEEE", + "khhhhh", + "#@*&", + "H**p m*", + "H-hhhhh..." + ], + + "didyouhearthat": [ + "Did you hear that?", + "Did you see that?", + "What was that?" + ], + + "imatraitor": [ + "Hail Ratvar", + "Hail Nar'Sie", + "Hey, i've got some TC left, want something?", + "Viva!", + "I'll spare you if you don't tell anybody about me", + "Hey, are you a traitor too?", + "You're my target, but @pick(excuses)", + "Are you mr. @pick(ling_names)?" + ], + + "excuses": [ + "i like you, so i'll spare you", + "i don't really feel like following objectives today", + "i'm not robust enough to fight you", + "who cares", + "i'll kill you later" + ] + + "ling_names": [ + "Alpha", + "Beta", + "Gamma", + "Delta", + "Epsilon", + "Eta", + "Theta", + "Lambda", + "Mu", + "Xi", + "Rho", + "Sigma", + "Tau", + "Upsilon", + "Phi", + "Psi", + "Omega" + ] + + "doubt": [ + "Why?", + "What?", + "Wait, what?", + "Wait", + "Hold on", + "Uh..." + ], + + "aggressive": [ + "Give me that!", + "I'm going to kill you!", + "Fuck you!" + ], + + "help": [ + "HELP", + "HELP ME", + "HELP HIM", + "HELP HER", + "HELP THEM", + "HELP US", + "HELP YOURSELF" + ], + + "escape": [ + "RUN!!", + "They're behind me!", + "It's here!", + "Follow me!", + "Follow me" + ] + + "infection_advice": [ + "stay away", + "don't get close", + "be careful", + "help me", + "kill me" + ] + + "people": [ + "Captain", + "Hos", + "Cmo", + "Rd", + "Ce", + "Hop", + "Janitor", + "AI", + "Viro", + "Qm", + "[target.first_name()]" + ] + + "accusations": [ + "rogue", + "cult", + "a cultist", + "clockcult", + "a clock cultist", + "a revhead", + "a rev", + "a gang leader", + "a gangster", + "a traitor", + "a tator", + "a ling", + "a changeling" + ] + + "threat": [ + "Cult", + "Wizard", + "Blob", + "Ling", + "Ops", + "Swarmers", + "Revenant", + "Traitor", + "Harm", + "I hear flashing", + "Help" + ] + + "location": [ + "bridge", + "armory", + "sec", + "security", + "science", + "engineering", + "cargo", + "medbay", + "atmos", + "maint", + "hops office", + "captains office", + "chapel", + "library", + "tool storage", + "botany", + "kitchen", + "the ai sat" + ] + + "advice": [ + "Hmm...not sure about that.", + "Yes. You're doing the right thing.", + "No. Stop what you're doing.", + "You should be wary of that person.", + "Trust that person.", + "That person wants to kill you.", + "Kill that person. You know who.", + "You should go somewhere else. Quickly.", + "Good luck. You'll need it.", + "You have my permission. Do it." + ] + + "chemicals": [ + "Ooze", + "Fire", + "Earth", + "Lightning", + "Air", + "Magic", + "Spiders", + "Button", + "Surprise", + "Happiness", + "Despair", + "Blood", + "Awesome", + "Infinity", + "Electronics", + "Time", + "Space", + "Pain", + "Guts", + "Life", + "Death", + "Phlebotinium", + "Mana", + "Energy", + "?????" + ] + +} diff --git a/strings/tips.txt b/strings/tips.txt index 4d1a8aa28a..0d1922b835 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -102,8 +102,8 @@ As the Bartender, the drinks you start with only give you the basics. If you wan As the Bartender, you can use a circular saw on your shotgun to make it easier to store. As a Janitor, if someone steals your janicart, you can instead use your space cleaner spray, grenades, water sprayer or order another from Cargo. As a Janitor, mousetraps can be used to create bombs or booby-trap containers. -As the Librarian, you are not completely defenseless. Your laser pointer can blind humans and cyborgs, and you can hide items in wirecut books. -As the Librarian, be sure to keep the shelves stocked and the library clean for crew. +As the Curator, you are not completely defenseless. Your laser pointer can blind humans and cyborgs, and you can hide items in wirecut books. +As the Curator, be sure to keep the shelves stocked and the library clean for crew. As a Cargo Technician, you can hack MULEbots to make them faster, run over people in their way, and even let you ride them! As a Cargo Technician, you can order contraband items from the supply shuttle console by de-constructing it and using a multitool on the circuit board, the re-assembling it. As a Cargo Technician, you can earn more cargo points by shipping back crates from maintenance, liquid containers, plasma sheets, rare seeds from hydroponics, and more! @@ -159,24 +159,22 @@ As a Servant, your Clockwork Slab fits in pockets and does not need to be held t As a Servant, remember that while the selection of scripture and tools Servant cyborgs get is limited, it is still extremely useful, and some of it is unique; for example, engineering and janitor cyborgs get a proselytizer that can use their own power in addition to its own. As a Servant, the Judicial Visor is an effective defensive combat tool in small spaces, as it stuns and mutes anyone still on it after 3 seconds. It is also useful for stunning already-stunned enemies for long enough to convert them or finish them off. As a Servant, making, and protecting, Tinkerer's Caches is extremely important, as caches are required to unlock scripture and share components. -As a Servant, Ocular Wardens, while fragile, do very high, rapid damage to a target non-servant that can see them and will even attack mechs that contain heretics. Place them behind objects that don't block vision to get the most use out of them. +As a Servant, Ocular Wardens, while fragile, do very high, rapid damage to a target non-Servant that can see them and will even attack mechs that contain heretics. Place them behind objects that don't block vision to get the most use out of them. As a Servant, Clockwork Structures that require power will draw power from the APC if they cannot find a different source of power, and most power-using Structures will rapidly drain the APC. As a Servant, you can repair Servant cyborgs and Clockwork Structures with a Replica Fabricator at a rate of 25W power to 1 health. Damaged Clockwork Structures are less efficient, so don't forget to repair them! As a Servant, securing a reliable source of component generation is high-priority, as simply handing out slabs will slowly become inefficient. Try placing Tinkerer's Caches near clockwork walls or creating and powering Tinkerer's Daemons. -As a Servant, only a single held Clockwork Slab will generate components, no matter how many you're holding. In addition, slabs will generate components slower with large amounts of servants; you can see the exact time with Recollection. +As a Servant, only a single held Clockwork Slab will generate components, no matter how many you're holding. In addition, slabs will generate components slower with large amounts of Servants; you can see the exact time with Recollection. As a Servant, you can use Geis to easily convert single targets, as it binds them in place, preventing escape unless they react quickly enough. Having another Servant apply Geis to someone already bound will prevent their escape and mute them, even if they reacted quickly. As a Servant, placing components in a slab or cache places those components in a globally-accessable storage that slabs will draw from to invoke scripture. As a Servant, you can stack different types of Sigils on the same turf; try stacking a Sigil of Transgression and a Sigil of Submission for a subtle conversion trap. -As a Servant, you can deconstruct a Clockwork Wall with a Clockwork Proselytizer to regain 1000W power. You can also construct Clockwork Walls on Clockwork Floors for a cost of 1000W power. -As a Servant, Volt Void will drain power from nearby Sigils of Transmission to up to double the damage of each volt ray. It'll even use your own power if you happen to be a cyborg! +As a Servant, you can deconstruct a Clockwork Wall with a Replica Fabricator to regain 1000W power. You can also construct Clockwork Walls on Clockwork Floors for a cost of 1000W power. As a Servant, Fellowship Armory invokes much faster for each nearby servant and attempts to provide each affected servant with powerful armor against melee, bullet, and bomb attacks. The gauntlets provided are also immune to elecricity. As a Servant, Spatial Gateway can teleport to any living Servant or Clockwork Obelisk, and gains additional uses and duration for each Servant assisting in the invocation. As a Servant, creating and activating the Gateway to the Celestial Derelict is your ultimate goal, and you must defend it with all the tools you have available. As a Servant, you can impale human targets with a Ratvarian Spear by pulling them, then attacking them. This does massive damage and stuns them, and should effectively win the fight. As a Servant, Sentinel's Compromise can instantly return you or another Servant to a fighting state by converting half of all their brute, burn, and oxygen damage to toxin, effectively halving the damage they have. Clockwork Floors will also rapidly heal toxin damage in Servants, allowing the Compromise more effectiveness. As a Servant, Belligerent and Taunting Tirade are extremely powerful for disabling and disrupting large groups of enemies, though they render you somewhat vulnerable, as Belligerent requires that you stand still, and Taunting Tirade makes you extremely obvious. -As a Servant, Soul Vessels can be placed in cyborg shells, mecha, Cogscarab shells, and Anima Fragment shells. -As a Servant, you can unwrench Clockwork Structures to move them around. +As a Servant, you can unwrench Clockwork Structures, but doing so will damage them, severely weakening them until repaired with a Replica Fabricator or Mending Mantra. Damage from other sources will also similarly weaken structures. You can deconvert Cultists of Nar-Sie and Servants of Ratvar by feeding them large amounts of holy water. As a Wizard, you can turn people to stone, then animate the resulting statue with a staff of animation to create an extremely powerful minion, for all of 5 minutes at least. As a Wizard, the fireball spell performs very poorly at close range, as it can easily catch you in the blast. It is best used as a form of artillery down long hallways. diff --git a/tgstation.dme b/tgstation.dme index 9e09f17fdb..1475d2335c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -375,6 +375,7 @@ #include "code\game\shuttle_engines.dm" #include "code\game\skincmd.dm" #include "code\game\sound.dm" +#include "code\game\world.dm" #include "code\game\area\ai_monitored.dm" #include "code\game\area\areas.dm" #include "code\game\area\Space_Station_13_areas.dm" @@ -463,7 +464,6 @@ #include "code\game\gamemodes\clock_cult\clock_items\replica_fabricator.dm" #include "code\game\gamemodes\clock_cult\clock_items\soul_vessel.dm" #include "code\game\gamemodes\clock_cult\clock_items\wraith_spectacles.dm" -#include "code\game\gamemodes\clock_cult\clock_mobs\anima_fragment.dm" #include "code\game\gamemodes\clock_cult\clock_mobs\clockwork_marauder.dm" #include "code\game\gamemodes\clock_cult\clock_scriptures\scripture_applications.dm" #include "code\game\gamemodes\clock_cult\clock_scriptures\scripture_cyborg.dm" @@ -471,7 +471,6 @@ #include "code\game\gamemodes\clock_cult\clock_scriptures\scripture_judgement.dm" #include "code\game\gamemodes\clock_cult\clock_scriptures\scripture_scripts.dm" #include "code\game\gamemodes\clock_cult\clock_structures\ark_of_the_clockwork_justicar.dm" -#include "code\game\gamemodes\clock_cult\clock_structures\clock_shells.dm" #include "code\game\gamemodes\clock_cult\clock_structures\clockwork_obelisk.dm" #include "code\game\gamemodes\clock_cult\clock_structures\geis_binding.dm" #include "code\game\gamemodes\clock_cult\clock_structures\mania_motor.dm" @@ -1679,6 +1678,7 @@ #include "code\modules\mob\living\silicon\say.dm" #include "code\modules\mob\living\silicon\silicon.dm" #include "code\modules\mob\living\silicon\silicon_defense.dm" +#include "code\modules\mob\living\silicon\silicon_movement.dm" #include "code\modules\mob\living\silicon\ai\ai.dm" #include "code\modules\mob\living\silicon\ai\ai_defense.dm" #include "code\modules\mob\living\silicon\ai\death.dm" diff --git a/tgui/assets/tgui.js.rej b/tgui/assets/tgui.js.rej new file mode 100644 index 0000000000..7a19430f92 --- /dev/null +++ b/tgui/assets/tgui.js.rej @@ -0,0 +1,15 @@ +diff a/tgui/assets/tgui.js b/tgui/assets/tgui.js (rejected hunks) +@@ -7,10 +7,10 @@ return t.set(e,+a+n)}function O(t,e){return Jo(this,t,void 0===e?1:+e)}function + real:8476,trade:8482,alefsym:8501,larr:8592,uarr:8593,rarr:8594,darr:8595,harr:8596,crarr:8629,lArr:8656,uArr:8657,rArr:8658,dArr:8659,hArr:8660,forall:8704,part:8706,exist:8707,empty:8709,nabla:8711,isin:8712,notin:8713,ni:8715,prod:8719,sum:8721,minus:8722,lowast:8727,radic:8730,prop:8733,infin:8734,ang:8736,and:8743,or:8744,cap:8745,cup:8746,"int":8747,there4:8756,sim:8764,cong:8773,asymp:8776,ne:8800,equiv:8801,le:8804,ge:8805,sub:8834,sup:8835,nsub:8836,sube:8838,supe:8839,oplus:8853,otimes:8855,perp:8869,sdot:8901,lceil:8968,rceil:8969,lfloor:8970,rfloor:8971,lang:9001,rang:9002,loz:9674,spades:9824,clubs:9827,hearts:9829,diams:9830},sc=[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376],uc=RegExp("&(#?(?:x[\\w\\d]+|\\d+|"+Object.keys(oc).join("|")+"));?","g"),pc=//g,lc=/&/g;var gc=function(){return e(this.node)},bc=function(t){this.type=kp,this.text=t.template};bc.prototype={detach:gc,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 yc=bc,xc=Se,_c=Ce,wc=function(t,e,n){var a;this.ref=e,this.resolved=!1,this.root=t.root,this.parentFragment=t.parentFragment,this.callback=n,a=ls(t.root,e,t.parentFragment),void 0!=a?this.resolve(a):bs.addUnresolved(this)};wc.prototype={resolve:function(t){this.keypath&&!t&&bs.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||bs.removeUnresolved(this)}};var kc=wc,Ec=function(t,e,n){this.parentFragment=t.parentFragment,this.ref=e,this.callback=n,this.rebind()},Sc={"@keypath":{prefix:"c",prop:["context"]},"@index":{prefix:"i",prop:["index"]},"@key":{prefix:"k",prop:["key","index"]}};Ec.prototype={rebind:function(){var t,e=this.ref,n=this.parentFragment,a=Sc[e];if(!a)throw Error('Unknown special reference "'+e+'" - valid references are @index, @key and @keypath');if(this.cached)return this.callback(E("@"+a.prefix+Pe(this.cached,a)));if(-1!==a.prop.indexOf("index")||-1!==a.prop.indexOf("key"))for(;n;){if(n.owner.currentSubtype===Bp&&void 0!==(t=Pe(n,a)))return this.cached=n,n.registerIndexRef(this),this.callback(E("@"+a.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=Pe(n,a)))return this.callback(E("@"+a.prefix+t.str));n=n.parent}},unbind:function(){this.cached&&this.cached.unregisterIndexRef(this)}};var Cc=Ec,Pc=function(t,e,n){this.parentFragment=t.parentFragment,this.ref=e,this.callback=n,e.ref.fragment.registerIndexRef(this),this.rebind()};Pc.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 Ac=Pc,Oc=Ae;Ae.resolve=function(t){var e,n,a={};for(e in t.refs)n=t.refs[e],a[n.ref.n]="k"===n.ref.t?n.fragment.key:n.fragment.index;return a};var Tc,Mc=Oe,Rc=Te,jc={},Lc=Function.prototype.bind;Tc=function(t,e,n,a){var r,i=this;r=t.root,this.root=r,this.parentFragment=e,this.callback=a,this.owner=t,this.str=n.s,this.keypaths=[],this.pending=n.r.length,this.refResolvers=n.r.map(function(t,e){return Mc(i,t,function(t){i.resolve(e,t)})}),this.ready=!0,this.bubble()},Tc.prototype={bubble:function(){this.ready&&(this.uniqueString=Re(this.str,this.keypaths),this.keypath=je(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,a,r,i=this;a=this.keypath,t=this.root.viewmodel.computations[a.str],t?this.root.viewmodel.mark(a):(r=Rc(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=i.root.viewmodel.get(t,{noUnwrap:!0,fullRootGet:!0});return"function"==typeof e&&(e=De(e,i.root)),e}}),n={deps:this.keypaths.filter(Le),getter:function(){var t=e.map(Me);return r.apply(null,t)}},t=this.root.viewmodel.compute(a,n))},rebind:function(t,e){this.refResolvers.forEach(function(n){return n.rebind(t,e)})}};var Dc=Tc,Nc=function(t,e,n){var a=this;this.resolver=e,this.root=e.root,this.parentFragment=n,this.viewmodel=e.root.viewmodel,"string"==typeof t?this.value=t:t.t===Np?this.refResolver=Mc(this,t.n,function(t){a.resolve(t)}):new Dc(e,n,t,function(t){a.resolve(t)})};Nc.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 Fc=Nc,Ic=function(t,e,n){var a,r,i,o,s=this;this.parentFragment=o=t.parentFragment,this.root=a=t.root,this.mustache=t,this.ref=r=e.r,this.callback=n,this.unresolved=[],(i=ls(a,r,o))?this.base=i:this.baseResolver=new kc(this,r,function(t){s.base=t,s.baseResolver=null,s.bubble()}),this.members=e.m.map(function(t){return new Fc(t,s,o)}),this.ready=!0,this.bubble()};Ic.prototype={getKeypath:function(){var t=this.members.map(Ne);return!t.every(Fe)||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 a=this.base.replace(t,e);a&&a!==this.base&&(this.base=a,n=!0)}this.members.forEach(function(a){a.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 Bc=Ic,qc=Be,Uc=qe,Gc=Ue,Vc={getValue:_c,init:qc,resolve:Uc,rebind:Gc},zc=function(t){this.type=Ep,Vc.init(this,t)};zc.prototype={update:function(){this.node.data=void 0==this.value?"":this.value},resolve:Vc.resolve,rebind:Vc.rebind,detach:gc,unbind:xc,render:function(){return this.node||(this.node=document.createTextNode(n(this.value))),this.node},unrender:function(t){t&&e(this.node)},getValue:Vc.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&&bs.addView(this))},firstNode:function(){return this.node},toString:function(t){var e=""+n(this.value);return t?Ee(e):e}};var Wc=zc,Hc=Ge,Kc=Ve,Qc=ze,$c=We,Yc=He,Jc=Ke,Xc=Qe,Zc=$e,tl=Ye,el=function(t,e){Vc.rebind.call(this,t,e)},nl=Xe,al=Ze,rl=ln,il=fn,ol=dn,sl=vn,ul=function(t){this.type=Cp,this.subtype=this.currentSubtype=t.template.n,this.inverted=this.subtype===Ip,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,Vc.init(this,t)};ul.prototype={bubble:Hc,detach:Kc,find:Qc,findAll:$c,findAllComponents:Yc,findComponent:Jc,findNextNode:Xc,firstNode:Zc,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:Vc.getValue,shuffle:tl,rebind:el,render:nl,resolve:Vc.resolve,setValue:al,toString:rl,unbind:il,unrender:ol,update:sl};var pl,cl,ll=ul,fl=gn,dl=bn,hl=yn,ml=xn,vl={};try{co("table").innerHTML="foo"}catch(Ao){pl=!0,cl={TABLE:['',"
    "],THEAD:['',"
    "],TBODY:['',"
    "],TR:['',"
    "],SELECT:['"]}}var gl=function(t,e,n){var a,r,i,o,s,u=[];if(null!=t&&""!==t){for(pl&&(r=cl[e.tagName])?(a=_n("DIV"),a.innerHTML=r[0]+t+r[1],a=a.querySelector(".x"),"SELECT"===a.tagName&&(i=a.options[a.selectedIndex])):e.namespaceURI===no.svg?(a=_n("DIV"),a.innerHTML=''+t+"",a=a.querySelector(".x")):(a=_n(e.tagName),a.innerHTML=t,"SELECT"===a.tagName&&(i=a.options[a.selectedIndex]));o=a.firstChild;)u.push(o),n.appendChild(o);if("SELECT"===e.tagName)for(s=u.length;s--;)u[s]!==i&&(u[s].selected=!1)}return u},bl=wn,yl=En,xl=Sn,_l=Cn,wl=Pn,kl=An,El=function(t){this.type=Sp,Vc.init(this,t)};El.prototype={detach:fl,find:dl,findAll:hl,firstNode:ml,getValue:Vc.getValue,rebind:Vc.rebind,render:yl,resolve:Vc.resolve,setValue:xl,toString:_l,unbind:xc,unrender:wl,update:kl};var Sl,Cl,Pl,Al,Ol=El,Tl=function(){this.parentFragment.bubble()},Ml=On,Rl=function(t){return this.node?lo(this.node,t)?this.node:this.fragment&&this.fragment.find?this.fragment.find(t):void 0:null},jl=function(t,e){e._test(this,!0)&&e.live&&(this.liveQueries||(this.liveQueries=[])).push(e),this.fragment&&this.fragment.findAll(t,e)},Ll=function(t,e){this.fragment&&this.fragment.findAllComponents(t,e)},Dl=function(t){return this.fragment?this.fragment.findComponent(t):void 0},Nl=Tn,Fl=Mn,Il=Rn,Bl=/^true|on|yes|1$/i,ql=/^[0-9]+$/,Ul=function(t,e){var n,a,r;return r=e.a||{},a={},n=r.twoway,void 0!==n&&(a.twoway=0===n||Bl.test(n)),n=r.lazy,void 0!==n&&(0!==n&&ql.test(n)?a.lazy=parseInt(n):a.lazy=0===n||Bl.test(n)),a},Gl=jn;Sl="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(" "),Cl="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(" "),Pl=function(t){for(var e={},n=t.length;n--;)e[t[n].toLowerCase()]=t[n];return e},Al=Pl(Sl.concat(Cl));var Vl=function(t){var e=t.toLowerCase();return Al[e]||e},zl=function(t,e){var n,a;if(n=e.indexOf(":"),-1===n||(a=e.substr(0,n),"xmlns"===a))t.name=t.element.namespace!==no.html?Vl(e):e;else if(e=e.substring(n+1),t.name=Vl(e),t.namespace=no[a.toLowerCase()],t.namespacePrefix=a,!t.namespace)throw'Unknown namespace ("'+a+'")'},Wl=Ln,Hl=Dn,Kl=Nn,Ql=Fn,$l={"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"},Yl=In,Jl=qn,Xl=Un,Zl=Gn,tf=Vn,ef=zn,nf=Wn,af=Hn,rf=Kn,of=Qn,sf=$n,uf=Yn,pf=Jn,cf=Xn,lf=Zn,ff=function(t){this.init(t)};ff.prototype={bubble:Gl,init:Hl,rebind:Kl,render:Ql,toString:Yl,unbind:Jl,update:lf};var df,hf=ff,mf=function(t,e){var n,a,r=[];for(n in e)"twoway"!==n&&"lazy"!==n&&e.hasOwnProperty(n)&&(a=new hf({element:t,name:n,value:e[n],root:t.root}),r[n]=a,"value"!==n&&r.push(a));return(a=r.value)&&r.push(a),r};"undefined"!=typeof document&&(df=co("div"));var vf=function(t,e){this.element=t,this.root=t.root,this.parentFragment=t.parentFragment,this.attributes=[],this.fragment=new rv({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=ta(t,this.isSvg),this.attributes.filter(function(t){return ea(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,bf=function(t,e){return e?e.map(function(e){return new gf(t,e)}):[]},yf=function(t){var e,n,a,r;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 i=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",i,{ractive:this.root}),e.resolver.forceResolution(),n=e.keypath}this.attribute.isTwoway=!0,this.keypath=n,a=this.root.viewmodel.get(n),void 0===a&&this.getInitialValue&&(a=this.getInitialValue(),void 0!==a&&this.root.viewmodel.set(n,a)),(r=na(t))&&(this.resetValue=a,r.formBindings.push(this))};yf.prototype={handleChange:function(){var t=this;bs.start(this.root),this.attribute.locked=!0,this.root.viewmodel.set(this.keypath,this.getValue()),bs.scheduleTask(function(){return t.attribute.locked=!1}),bs.end()},rebound:function(){var t,e,n;e=this.keypath,n=this.attribute.interpolator.keypath,e!==n&&(N(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(){}},yf.extend=function(t){var e,n=this;return e=function(t){yf.call(this,t),this.init&&this.init()},e.prototype=Eo(n.prototype),a(e.prototype,t),e.extend=yf.extend,e};var xf,_f=yf,wf=aa;xf=_f.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?ia:wf,e.addEventListener("change",wf,!1),t||(e.addEventListener("input",this.handler,!1),e.attachEvent&&e.addEventListener("keyup",this.handler,!1)),e.addEventListener("blur",ra,!1)},unrender:function(){var t=this.element.node;this.rendered=!1,t.removeEventListener("change",wf,!1),t.removeEventListener("input",this.handler,!1),t.removeEventListener("keyup",this.handler,!1),t.removeEventListener("blur",ra,!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,Cf=oa,Pf={},Af=_f.extend({name:"checked",init:function(){this.siblings=Cf(this.root._guid,"radio",this.element.getAttribute("name")),this.siblings.push(this)},render:function(){var t=this.element.node;t.addEventListener("change",wf,!1),t.attachEvent&&t.addEventListener("click",wf,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",wf,!1),t.removeEventListener("click",wf,!1)},handleChange:function(){bs.start(this.root),this.siblings.forEach(function(t){t.root.viewmodel.set(t.keypath,t.getValue())}),bs.end()},getValue:function(){return this.element.node.checked},unbind:function(){N(this.siblings,this)}}),Of=Af,Tf=_f.extend({name:"name",init:function(){this.siblings=Cf(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",wf,!1),t.attachEvent&&t.addEventListener("click",wf,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",wf,!1),t.removeEventListener("click",wf,!1)},getValue:function(){var t=this.element.node;return t._ractive?t._ractive.value:t.value},handleChange:function(){this.element.node.checked&&_f.prototype.handleChange.call(this)},rebound:function(t,e){var n;_f.prototype.rebound.call(this,t,e),(n=this.element.node)&&(n.name="{{"+this.keypath.str+"}}")},unbind:function(){N(this.siblings,this)}}),Mf=Tf,Rf=_f.extend({name:"name",getInitialValue:function(){return this.noInitialValue=!0,[]},init:function(){var t,e;this.checkboxName=!0,this.siblings=Cf(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(){N(this.siblings,this)},render:function(){var t,e,n=this.element.node;t=this.root.viewmodel.get(this.keypath),e=this.element.getAttribute("value"),i(t)?this.isChecked=R(t,e):this.isChecked=t==e,n.name="{{"+this.keypath.str+"}}",n.checked=this.isChecked,n.addEventListener("change",wf,!1),n.attachEvent&&n.addEventListener("click",wf,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",wf,!1),t.removeEventListener("click",wf,!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,_f.prototype.handleChange.call(this)},getValue:function(){return this.siblings.filter(sa).map(ua)}}),jf=Rf,Lf=_f.extend({name:"checked",render:function(){var t=this.element.node;t.addEventListener("change",wf,!1),t.attachEvent&&t.addEventListener("click",wf,!1)},unrender:function(){var t=this.element.node;t.removeEventListener("change",wf,!1),t.removeEventListener("click",wf,!1)},getValue:function(){return this.element.node.checked}}),Df=Lf,Nf=_f.extend({getInitialValue:function(){var t,e,n,a,r=this.element.options;if(void 0===this.element.getAttribute("value")&&(e=t=r.length,t)){for(;e--;)if(r[e].getAttribute("selected")){n=r[e].getAttribute("value"),a=!0;break}if(!a)for(;++ee;e+=1)if(a=t[e],t[e].selected)return r=a._ractive?a._ractive.value:a.value},forceUpdate:function(){var t=this,e=this.getValue();void 0!==e&&(this.attribute.locked=!0,bs.scheduleTask(function(){return t.attribute.locked=!1}),this.root.viewmodel.set(this.keypath,e))}}),Ff=Nf,If=Ff.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",wf,!1),t=this.root.viewmodel.get(this.keypath),void 0===t&&this.handleChange()},unrender:function(){this.element.node.removeEventListener("change",wf,!1)},setValue:function(){throw Error("TODO not implemented yet")},getValue:function(){var t,e,n,a,r,i;for(t=[],e=this.element.node.options,a=e.length,n=0;a>n;n+=1)r=e[n],r.selected&&(i=r._ractive?r._ractive.value:r.value,t.push(i));return t},handleChange:function(){var t,e,n;return t=this.attribute,e=t.value,n=this.getValue(),void 0!==e&&j(n,e)||Ff.prototype.handleChange.call(this),this},forceUpdate:function(){var t=this,e=this.getValue();void 0!==e&&(this.attribute.locked=!0,bs.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)}}),Bf=If,qf=_f.extend({render:function(){this.element.node.addEventListener("change",wf,!1)},unrender:function(){this.element.node.removeEventListener("change",wf,!1)},getValue:function(){return this.element.node.files}}),Uf=qf,Gf=kf.extend({getInitialValue:function(){},getValue:function(){var t=parseFloat(this.element.node.value);return isNaN(t)?void 0:t}}),Vf=pa,zf=la,Wf=fa,Hf=da,Kf=ha,Qf=/^event(?:\.(.+))?/,$f=ba,Yf=ya,Jf={},Xf={touchstart:!0,touchmove:!0,touchend:!0,touchcancel:!0,touchleave:!0},Zf=_a,td=wa,ed=ka,nd=Ea,ad=Sa,rd=function(t,e,n){this.init(t,e,n)};rd.prototype={bubble:zf,fire:Wf,getAction:Hf,init:Kf,listen:Yf,rebind:Zf,render:td,resolve:ed,unbind:nd,unrender:ad};var id=rd,od=function(t,e){var n,a,r,i,o=[];for(a in e)if(e.hasOwnProperty(a))for(r=a.split("-"),n=r.length;n--;)i=new id(t,r[n],e[a]),o.push(i);return o},sd=function(t,e){var n,a,r,i=this;this.element=t,this.root=n=t.root,a=e.n||e,("string"==typeof a||(r=new rv({template:a,root:n,owner:t}),a=""+r,r.unbind(),""!==a))&&(e.a?this.params=e.a:e.d&&(this.fragment=new rv({template:e.d,root:n,owner:t}),this.params=this.fragment.getArgsList(),this.fragment.bubble=function(){this.dirtyArgs=this.dirtyValue=!0,i.params=this.getArgsList(),i.ready&&i.update()}),this.fn=g("decorators",n,a),this.fn||l(Io(a,"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,pd,cd,ld=sd,fd=Ra,dd=ja,hd=Ba,md=function(t){return t.replace(/-([a-zA-Z])/g,function(t,e){return e.toUpperCase()})};Xi?(pd={},cd=co("div").style,ud=function(t){var e,n,a;if(t=md(t),!pd[t])if(void 0!==cd[t])pd[t]=t;else for(a=t.charAt(0).toUpperCase()+t.substring(1),e=ro.length;e--;)if(n=ro[e],void 0!==cd[n+a]){pd[t]=n+a;break}return pd[t]}):ud=null;var vd,gd,bd=ud;Xi?(gd=window.getComputedStyle||Po.getComputedStyle,vd=function(t){var e,n,a,r,o;if(e=gd(this.node),"string"==typeof t)return o=e[bd(t)],"0px"===o&&(o=0),o;if(!i(t))throw Error("Transition$getStyle must be passed a string, or an array of strings representing CSS properties");for(n={},a=t.length;a--;)r=t[a],o=e[bd(r)],"0px"===o&&(o=0),n[r]=o;return n}):vd=null;var yd=vd,xd=function(t,e){var n;if("string"==typeof t)this.node.style[bd(t)]=e;else for(n in t)t.hasOwnProperty(n)&&(this.node.style[bd(n)]=t[n]);return this},_d=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=qa)):e="function"==typeof t.easing?t.easing:qa,this.easing=e,this.start=ns(),this.end=this.start+this.duration,this.running=!0,_s.add(this)};_d.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 wd,kd,Ed,Sd,Cd,Pd,Ad,Od,Td=_d,Md=RegExp("^-(?:"+ro.join("|")+")-"),Rd=function(t){return t.replace(Md,"")},jd=RegExp("^(?:"+ro.join("|")+")([A-Z])"),Ld=function(t){var e;return t?(jd.test(t)&&(t="-"+t),e=t.replace(/[A-Z]/g,function(t){return"-"+t.toLowerCase()})):""},Dd={},Nd={};Xi?(kd=co("div").style,function(){void 0!==kd.transition?(Ed="transition",Sd="transitionend",Cd=!0):void 0!==kd.webkitTransition?(Ed="webkitTransition",Sd="webkitTransitionEnd",Cd=!0):Cd=!1}(),Ed&&(Pd=Ed+"Duration",Ad=Ed+"Property",Od=Ed+"TimingFunction"),wd=function(t,e,n,a,r){setTimeout(function(){var i,o,s,u,p;u=function(){o&&s&&(t.root.fire(t.name+":end",t.node,t.isIntro),r())},i=(t.node.namespaceURI||"")+t.node.tagName,t.node.style[Ad]=a.map(bd).map(Ld).join(","),t.node.style[Od]=Ld(n.easing||"linear"),t.node.style[Pd]=n.duration/1e3+"s",p=function(e){var n;n=a.indexOf(md(Rd(e.propertyName))),-1!==n&&a.splice(n,1),a.length||(t.node.removeEventListener(Sd,p,!1),s=!0,u())},t.node.addEventListener(Sd,p,!1),setTimeout(function(){for(var r,c,l,f,d,h=a.length,v=[];h--;)f=a[h],r=i+f,Cd&&!Nd[r]&&(t.node.style[bd(f)]=e[f],Dd[r]||(c=t.getStyle(f),Dd[r]=t.getStyle(f)!=e[f],Nd[r]=!Dd[r],Nd[r]&&(t.node.style[bd(f)]=c))),(!Cd||Nd[r])&&(void 0===c&&(c=t.getStyle(f)),l=a.indexOf(f),-1===l?m("Something very strange happened with transitions. Please raise an issue at https://github.com/ractivejs/ractive/issues - thanks!",{node:t.node}):a.splice(l,1),d=/[^\d]*$/.exec(e[f])[0],v.push({name:bd(f),interpolator:qo(parseFloat(c),parseFloat(e[f])),suffix:d}));v.length?new Td({root:t.root,duration:n.duration,easing:md(n.easing||""),step:function(e){var n,a;for(a=v.length;a--;)n=v[a],t.node.style[n.name]=n.interpolator(e)+n.suffix},complete:function(){o=!0,u()}}):o=!0,a.length||(t.node.removeEventListener(Sd,p,!1),s=!0,u())},0)},n.delay||0)}):wd=null;var Fd,Id,Bd,qd,Ud,Gd=wd;if("undefined"!=typeof document){if(Fd="hidden",Ud={},Fd in document)Bd="";else for(qd=ro.length;qd--;)Id=ro[qd],Fd=Id+"Hidden",Fd in document&&(Bd=Id);void 0!==Bd?(document.addEventListener(Bd+"visibilitychange",Ua),Ua()):("onfocusout"in document?(document.addEventListener("focusout",Ga),document.addEventListener("focusin",Va)):(window.addEventListener("pagehide",Ga),window.addEventListener("blur",Ga),window.addEventListener("pageshow",Va),window.addEventListener("focus",Va)),Ud.hidden=!1)}var Vd,zd,Wd,Hd=Ud;Xi?(zd=window.getComputedStyle||Po.getComputedStyle,Vd=function(t,e,n){var a,r=this;if(4===arguments.length)throw Error("t.animateStyle() returns a promise - use .then() instead of passing a callback");if(Hd.hidden)return this.setStyle(t,e),Wd||(Wd=ps.resolve());"string"==typeof t?(a={},a[t]=e):(a=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 i=new ps(function(t){var e,i,o,s,u,p,c;if(!n.duration)return r.setStyle(a),void t();for(e=Object.keys(a),i=[],o=zd(r.node),u={},p=e.length;p--;)c=e[p],s=o[bd(c)],"0px"===s&&(s=0),s!=a[c]&&(i.push(c),r.node.style[bd(c)]=s);return i.length?void Gd(r,a,n,i,t):void t()});return i}):Vd=null;var Kd=Vd,Qd=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={}),r({},t,e)},$d=za,Yd=function(t,e,n){this.init(t,e,n)};Yd.prototype={init:hd,start:$d,getStyle:yd,setStyle:xd,animateStyle:Kd,processParams:Qd};var Jd,Xd,Zd=Yd,th=Ha;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(Xa).join("")+this.conditionalAttributes.map(Xa).join(""),"option"===this.name&&Ya(this)&&(t+=" selected"),"input"===this.name&&Ja(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)),ic.test(this.template.e)||(t+=""),t)},nh=Za,ah=tr,rh=function(t){this.init(t)};rh.prototype={bubble:Tl,detach:Ml,find:Rl,findAll:jl,findAllComponents:Ll,findComponent:Dl,findNextNode:Nl,firstNode:Fl,getAttribute:Il,init:fd,rebind:dd,render:th,toString:eh,unbind:nh,unrender:ah};var ih=rh,oh=/^\s*$/,sh=/^\s*/,uh=function(t){var e,n,a,r;return e=t.split("\n"),n=e[0],void 0!==n&&oh.test(n)&&e.shift(),a=D(e),void 0!==a&&oh.test(a)&&e.pop(),r=e.reduce(nr,null),r&&(t=e.map(function(t){return t.replace(r,"")}).join("\n")),t},ph=ar,ch=function(t,e){var n;return e?n=t.split("\n").map(function(t,n){return n?e+t:t}).join("\n"):t},lh='Could not find template for partial "%s"',fh=function(t){var e,n;e=this.parentFragment=t.parentFragment,this.root=e.root,this.type=Ap,this.index=t.index,this.name=t.template.r,this.rendered=!1,this.fragment=this.fragmentToRender=this.fragmentToUnrender=null,Vc.init(this,t),this.keypath||((n=ph(this.root,this.name,e))?(xc.call(this),this.isNamed=!0,this.setTemplate(n)):v(lh,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||Gc.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:Vc.resolve,setValue:function(t){var e;(void 0===t||t!==this.value)&&(void 0!==t&&(e=ph(this.root,""+t,this.parentFragment)),!e&&this.name&&(e=ph(this.root,this.name,this.parentFragment))&&(xc.call(this),this.isNamed=!0),e||v(lh,this.name,{ractive:this.root}),this.value=t,this.setTemplate(e||[]),this.bubble(),this.rendered&&bs.addView(this))},setTemplate:function(t){this.fragment&&(this.fragment.unbind(),this.rendered&&(this.fragmentToUnrender=this.fragment)),this.fragment=new rv({template:t,root:this.root,owner:this,pElement:this.parentFragment.pElement}),this.fragmentToRender=this.fragment},toString:function(t){var e,n,a,r;return e=this.fragment.toString(t),n=this.parentFragment.items[this.index-1],n&&n.type===kp?(a=n.text.split("\n").pop(),(r=/^\s+$/.exec(a))?ch(e,r[0]):e):e},unbind:function(){this.isNamed||xc.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=ur,bh=pr,yh=new is("detach"),xh=cr,_h=lr,wh=fr,kh=dr,Eh=hr,Sh=mr,Ch=function(t,e,n,a){var r=t.root,i=t.keypath;a?r.viewmodel.smartUpdate(i,e,a):r.viewmodel.mark(i)},Ph=[],Ah=["pop","push","reverse","shift","sort","splice","unshift"];Ah.forEach(function(t){var e=function(){for(var e=arguments.length,n=Array(e),a=0;e>a;a++)n[a]=arguments[a];var r,i,o,s;for(r=bu(this,t,n),i=Array.prototype[t].apply(this,arguments),bs.start(),this._ractive.setting=!0,s=this._ractive.wrappers.length;s--;)o=this._ractive.wrappers[s],bs.addRactive(o.root),Ch(o,this,t,r);return bs.end(),this._ractive.setting=!1,i};So(Ph,t,{value:e})}),dh={},dh.__proto__?(hh=function(t){t.__proto__=Ph},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:Ph[n],configurable:!0})},mh=function(t){var e;for(e=Ah.length;e--;)delete t[Ah[e]]}),hh.unpatch=mh;var Oh,Th,Mh,Rh=hh;Oh={filter:function(t){return i(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}),Rh(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,a,r;if(t=this.value,e=t._ractive,n=e.wrappers,a=e.instances,e.setting)return!1;if(r=n.indexOf(this),-1===r)throw Error(Mh);if(n.splice(r,1),n.length){if(a[this.root._guid]-=1,!a[this.root._guid]){if(r=a.indexOf(this.root),-1===r)throw Error(Mh);a.splice(r,1)}}else delete t._ractive,Rh.unpatch(this.value)}},Mh="Something went wrong in a rather interesting way";var jh,Lh,Dh=Oh,Nh=/^\s*[0-9]+\s*$/,Fh=function(t){return Nh.test(t)?[]:{}};try{Object.defineProperty({},"test",{value:0}),jh={filter:function(t,e,n){var a,r;return e?(e=E(e),(a=n.viewmodel.wrapped[e.parent.str])&&!a.magic?!1:(r=n.viewmodel.get(e.parent),i(r)&&/^[0-9]+$/.test(e.lastKey)?!1:r&&("object"==typeof r||"function"==typeof r))):!1},wrap:function(t,e,n){return new Lh(t,e,n)}},Lh=function(t,e,n){var a,r,i;return n=E(n),this.magic=!0,this.ractive=t,this.keypath=n,this.value=e,this.prop=n.lastKey,a=n.parent,this.obj=a.isRoot?t.viewmodel.data:t.viewmodel.get(a),r=this.originalDescriptor=Object.getOwnPropertyDescriptor(this.obj,this.prop),r&&r.set&&(i=r.set._ractiveWrappers)?void(-1===i.indexOf(this)&&i.push(this)):void vr(this,e,r)},Lh.prototype={get:function(){return this.value},reset:function(t){return this.updating?void 0:(this.updating=!0,this.obj[this.prop]=t,bs.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]=Fh(t),this.updating=!1),this.obj[this.prop][t]=e)},teardown:function(){var t,e,n,a,r;return this.updating?!1:(t=Object.getOwnPropertyDescriptor(this.obj,this.prop),e=t&&t.set,void(e&&(a=e._ractiveWrappers,r=a.indexOf(this),-1!==r&&a.splice(r,1),a.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){jh=!1}var Ih,Bh,qh=jh;qh&&(Ih={filter:function(t,e,n){return qh.filter(t,e,n)&&Dh.filter(t)},wrap:function(t,e,n){return new Bh(t,e,n)}},Bh=function(t,e,n){this.value=e,this.magic=!0,this.magicWrapper=qh.wrap(t,e,n),this.arrayWrapper=Dh.wrap(t,e,n)},Bh.prototype={get:function(){return this.value},teardown:function(){this.arrayWrapper.teardown(),this.magicWrapper.teardown()},reset:function(t){return this.magicWrapper.reset(t)}});var Uh=Ih,Gh=gr,Vh={},zh=xr,Wh=_r,Hh=Er,Kh=Or,Qh=Tr,$h=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};$h.prototype={resolve:function(t){this.computation.softDeps.push(t),this.computation.unresolvedDeps[t.str]=null,this.viewmodel.register(t,this.computation,"computed")}};var Yh=$h,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,a=!1;if(this.getting){var r="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(r),this.value}if(this.getting=!0,this._dirty){if(this._firstRun||!this.hardDeps.length&&!this.softDeps.length?a=!0:[this.hardDeps,this.softDeps].forEach(function(t){var e,r,i;if(!a)for(i=t.length;i--;)if(e=t[i],r=n.viewmodel.get(e),!s(r,n.depValues[e.str]))return n.depValues[e.str]=r,void(a=!0)}),a){this.viewmodel.capture();try{this.value=this.getter()}catch(i){m('Failed to compute "%s"',this.key.str),f(i.stack||i),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,a,r,i;for(n=this.softDeps,e=n.length;e--;)a=n[e],-1===t.indexOf(a)&&(r=!0,this.viewmodel.unregister(a,this,"computed"));for(e=t.length;e--;)a=t[e],-1!==n.indexOf(a)||this.hardDeps&&-1!==this.hardDeps.indexOf(a)||(r=!0,Mr(this.viewmodel,a)&&!this.unresolvedDeps[a.str]?(i=new Yh(this,a.str),t.splice(e,1),this.unresolvedDeps[a.str]=i,bs.addUnresolved(i)):this.viewmodel.register(a,this,"computed"));return r&&(this.softDeps=t.slice()),r}};var Xh=Jh,Zh=Rr,tm={FAILED_LOOKUP:!0},em=jr,nm={},am=Dr,rm=Nr,im=function(t,e){this.localKey=t,this.keypath=e.keypath,this.origin=e.origin,this.deps=[],this.unresolved=[],this.resolved=!1};im.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 a,r;if(this.resolved){for(a=this.deps,r=a.length;r--;)if(a[r].dep===e){a.splice(r,1);break}this.origin.unregister(this.map(t),e,n)}}};var om=Fr,sm=function(t,e){var n,a,r,i;return n={},a=0,r=t.map(function(t,r){var o,s,u;s=a,u=e.length;do{if(o=e.indexOf(t,s),-1===o)return i=!0,-1;s=o+1}while(n[o]&&u>s);return o===a&&(a+=1),o!==r&&(i=!0),n[o]=!0,o})},um=Ir,pm={},cm=Ur,lm=Vr,fm=zr,dm=Wr,hm=Kr,mm={implicit:!0},vm={noCascade:!0},gm=$r,bm=Yr,ym=function(t){var e,n,a=t.adapt,r=t.data,i=t.ractive,o=t.computed,s=t.mappings;this.ractive=i,this.adaptors=a,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=r,this.mappings=Eo(null);for(e in s)this.map(E(e),s[e]);if(r)for(e in r)(n=this.mappings[e])&&void 0===n.getValue()&&n.setValue(r[e]);for(e in o)s&&e in s&&l("Cannot map to a computed property ('%s')",e),this.compute(E(e),o[e]);this.ready=!0};ym.prototype={adapt:Gh,applyChanges:Hh,capture:Kh,clearCache:Qh,compute:Zh,get:em,init:am,map:rm,mark:om,merge:um,register:cm,release:lm,reset:fm,set:dm,smartUpdate:hm,teardown:gm,unregister:bm};var xm=ym;Xr.prototype={constructor:Xr,begin:function(t){this.inProcess[t._guid]=!0},end:function(t){var e=t.parent;e&&this.inProcess[e._guid]?Zr(this.queue,e).push(t):ti(this,t),delete this.inProcess[t._guid]}};var _m=Xr,wm=ei,km=/\$\{([^\}]+)\}/g,Em=new is("construct"),Sm=new is("config"),Cm=new _m("init"),Pm=0,Am=["adaptors","components","decorators","easing","events","interpolators","partials","transitions"],Om=ii,Tm=ci;ci.prototype={bubble:function(){this.dirty||(this.dirty=!0,bs.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 Mm=function(t,e,n,r,o){var s,u,p,c,l,f,d={},h={},v={},g=[];for(u=t.parentFragment,p=t.root,o=o||{},a(d,o),o.content=r||[],d[""]=o.content,e.defaults.el&&m("The <%s/> component has a default `el` property; it has been disregarded",t.name),c=u;c;){if(c.owner.type===Rp){l=c.owner.container;break}c=c.parent}return n&&Object.keys(n).forEach(function(e){var a,r,o=n[e];if("string"==typeof o)a=fc(o),h[e]=a?a.value:o;else if(0===o)h[e]=!0;else{if(!i(o))throw Error("erm wut");fi(o)?(v[e]={origin:t.root.viewmodel,keypath:void 0},r=li(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})):r=new Tm(t,o,function(t){f?s.set(e,t):h[e]=t}),g.push(r)}}),s=Eo(e.prototype),Om(s,{el:null,append:!0,data:h,partials:o,magic:p.magic||e.defaults.magic,modifyArrays:p.modifyArrays,adapt:p.adapt},{parent:p,component:t,container:l,mappings:v,inlinePartials:d,cssIds:u.cssIds}),f=!0,t.resolvers=g,s},Rm=di,jm=function(t){var e,n;for(e=t.root;e;)(n=e._liveComponentQueries["_"+t.name])&&n.push(t.instance),e=e.parent},Lm=mi,Dm=vi,Nm=gi,Fm=bi,Im=yi,Bm=new is("teardown"),qm=_i,Um=function(t,e){this.init(t,e)};Um.prototype={detach:bh,find:xh,findAll:_h,findAllComponents:wh,findComponent:kh,findNextNode:Eh,firstNode:Sh,init:Lm,rebind:Dm,render:Nm,toString:Fm,unbind:Im,unrender:qm};var Gm=Um,Vm=function(t){this.type=Op,this.value=t.template.c};Vm.prototype={detach:gc,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 zm=Vm,Wm=function(t){var e,n;this.type=Rp,this.container=e=t.parentFragment.root,this.component=n=e.component,this.container=e,this.containerFragment=t.parentFragment,this.parentFragment=n.parentFragment;var a=this.name=t.template.n||"",r=e._inlinePartials[a];r||(m('Could not find template for partial "'+a+'"',{ractive:t.root}),r=[]),this.fragment=new rv({owner:this,root:e.parent,template:r,pElement:this.containerFragment.pElement}),i(n.yielders[a])?n.yielders[a].push(this):n.yielders[a]=[this],bs.scheduleTask(function(){if(n.yielders[a].length>1)throw Error("A component template can only have one {{yield"+(a?" "+a:"")+"}} declaration at a time")})};Wm.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),N(this.component.yielders[this.name],this)},rebind:function(t,e){this.fragment.rebind(t,e)},toString:function(){return""+this.fragment}};var Hm=Wm,Km=function(t){this.declaration=t.template.a};Km.prototype={init:ko,render:ko,unrender:ko,teardown:ko,toString:function(){return""}};var Qm=Km,$m=wi,Ym=Ei,Jm=Si,Xm=Ci,Zm=Oi,tv=Mi,ev=function(t){this.init(t)};ev.prototype={bubble:cp,detach:lp,find:fp,findAll:dp,findAllComponents:hp,findComponent:mp,findNextNode:vp,firstNode:gp,getArgsList:hc,getNode:mc,getValue:vc,init:$m,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,av,rv=ev,iv=Ri,ov=["template","partials","components","decorators","events"],sv=new is("reset"),uv=function(t,e){function n(e,a,r){r&&r.partials[t]||e.forEach(function(e){e.type===Ap&&e.getPartialName()===t&&a.push(e),e.fragment&&n(e.fragment.items,a,r),i(e.fragments)?n(e.fragments,a,r):i(e.items)?n(e.items,a,r):e.type===Mp&&e.instance&&n(e.instance.fragment.items,a,e.instance),e.type===Pp&&(i(e.attributes)&&n(e.attributes,a,r),i(e.conditionalAttributes)&&n(e.conditionalAttributes,a,r))})}var a,r=[];return n(this.fragment.items,r),this.partials[t]=e,a=bs.start(this,!0),r.forEach(function(e){e.value=void 0,e.setValue(t)}),bs.end(),a},pv=ji,cv=xu("reverse"),lv=Li,fv=xu("shift"),dv=xu("sort"),hv=xu("splice"),mv=Ni,vv=Fi,gv=new is("teardown"),bv=Bi,yv=qi,xv=Ui,_v=new is("unrender"),wv=xu("unshift"),kv=Gi,Ev=new is("update"),Sv=Vi,Cv={add:Zo,animate:Es,detach:Cs,find:As,findAll:Fs,findAllComponents:Is,findComponent:Bs,findContainer:qs,findParent:Us,fire:Ws,get:Hs,insert:Qs,merge:Ys,observe:lu,observeOnce:fu,off:mu,on:vu,once:gu,pop:_u,push:wu,render:Tu,reset:iv,resetPartial:uv,resetTemplate:pv,reverse:cv,set:lv,shift:fv,sort:dv,splice:hv,subtract:mv,teardown:vv,toggle:bv,toHTML:yv,toHtml:yv,unrender:xv,unshift:wv,update:kv,updateModel:Sv},Pv=function(t,e,n){return n||Wi(t,e)?function(){var n,a="_super"in this,r=this._super;return this._super=e,n=t.apply(this,arguments),a&&(this._super=r),n}:t},Av=Hi,Ov=Yi,Tv=function(t){var e,n,a={};return t&&(e=t._ractive)?(a.ractive=e.root,a.keypath=e.keypath.str,a.index={},(n=Oc(e.proxy.parentFragment))&&(a.index=Oc.resolve(n)),a):a};nv=function(t){return this instanceof nv?void Om(this,t):new nv(t)},av={DEBUG:{writable:!0,value:!0},DEBUG_PROMISES:{writable:!0,value:!0},extend:{value:Ov},getNodeInfo:{value:Tv},parse:{value:Hu},Promise:{value:ps},svg:{value:ao},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:Go},partials:{writable:!0,value:{}},transitions:{writable:!0,value:{}}},Co(nv,av),nv.prototype=a(Cv,so),nv.prototype.constructor=nv,nv.defaults=nv.prototype;var Mv="function";if(typeof Date.now!==Mv||typeof String.prototype.trim!==Mv||typeof Object.keys!==Mv||typeof Array.prototype.indexOf!==Mv||typeof Array.prototype.forEach!==Mv||typeof Array.prototype.map!==Mv||typeof Array.prototype.filter!==Mv||"undefined"!=typeof window&&typeof window.addEventListener!==Mv)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 Rv=nv;return Rv})},{}],206:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.observe("value",function(e,n,a){var r=t.get(),i=r.min,o=r.max,s=Math.clamp(i,o,e);t.animate("percentage",Math.round((s-i)/(o-i)*100))})}}}(r),r.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=a.extend(r.exports)},{205:205}],207:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(310),a=t(309);e.exports={computed:{clickable:function(){return!this.get("enabled")||this.get("state")&&"toggle"!=this.get("state")?!1:!0},enabled:function(){return this.get("config.status")===n.UI_INTERACTIVE?!0:!1},styles:function(){var t="";if(this.get("class")&&(t+=" "+this.get("class")),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(),r=n.action,i=n.params;(0,a.act)(t.get("config.ref"),r,i),e.node.blur()})},data:{iconStackToHTML:function(t){var e="",n=t.split(",");if(n.length){e+='';for(var a=n,r=Array.isArray(a),i=0,a=r?a:a[Symbol.iterator]();;){var o;if(r){if(i>=a.length)break;o=a[i++]}else{if(i=a.next(),i.done)break;o=i.value}var s=o,u=/([\w\-]+)\s*(\dx)/g,p=u.exec(s),c=p[1],l=p[2];e+=''}}return e&&(e+=""),e}}}}(r),r.exports.template={v:3,t:[" ",{p:[70,1,2015],t:7,e:"span",a:{"class":["button ",{t:2,r:"styles",p:[70,21,2035]}],unselectable:"on","data-tooltip":[{t:2,r:"tooltip",p:[73,17,2120]}]},m:[{t:4,f:["tabindex='0'"],r:"clickable",p:[72,3,2071]}],v:{"mouseover-mousemove":"hover",mouseleave:"unhover","click-enter":{n:[{t:4,f:["press"],r:"clickable",p:[76,19,2213]}],d:[]}},f:[{t:4,f:[{p:[78,5,2261],t:7,e:"i",a:{"class":["fa fa-",{t:2,r:"icon",p:[78,21,2277]}]}}],n:50,r:"icon",p:[77,3,2243]}," ",{t:4,f:[{t:3,x:{r:["iconStackToHTML","icon_stack"],s:"_0(_1)"},p:[81,6,2331]}],n:50,r:"icon_stack",p:[80,3,2306]}," ",{t:16,p:[83,3,2379]}]}]},e.exports=a.extend(r.exports)},{205:205,309:309,310:310}],208:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],209:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={oninit:function(){var t=this;this.on("clear",function(){t.set("value",""),t.find("input").focus()})}}}(r),r.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=a.extend(r.exports)},{205:205}],210:[function(t,e,n){var a=t(205),r={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)}}}(r),r.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=a.extend(r.exports)},{201:201,205:205}],211:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],212:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(309),a=t(311);e.exports={oninit:function(){var t=this,e=a.resize.bind(this),r=function(){return t.set({resize:!1,x:null,y:null})};this.observe("config.fancy",function(a,i,o){(0,n.winset)(t.get("config.window"),"can-resize",!a),a?(document.addEventListener("mousemove",e),document.addEventListener("mouseup",r)):(document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",r))}),this.on("resize",function(){return t.toggle("resize")})}}}(r),r.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=a.extend(r.exports)},{205:205,309:309,311:311}],213:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],214:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],215:[function(t,e,n){var a=t(205),r={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,a){for(var r=t.findAllComponents("tab"),i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var u=s;u.set("shown",u.get("name")===e)}})}}}(r),r.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]}]}]},r.exports.components=r.exports.components||{};var i={tab:t(216)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,216:216}],216:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{t:16,p:[2,3,17]}],n:50,r:"shown",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],217:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(310),a=t(309),r=t(311);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=r.drag.bind(this),n=function(e){return t.set({drag:!1,x:null,y:null})};this.observe("config.fancy",function(r,i,o){(0,a.winset)(t.get("config.window"),"titlebar",!r&&t.get("config.titlebar")),r?(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,a.winset)(this.get("config.window"),"is-visible",!1),window.location.href=(0,a.href)({command:"uiclose "+this.get("config.ref")},"winset")},minimize:function(){(0,a.winset)(this.get("config.window"),"is-minimized",!0)}})}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[50,3,1440],t:7,e:"header",a:{"class":"titlebar"},v:{mousedown:"drag"},f:[{p:[51,5,1491],t:7,e:"i",a:{"class":["statusicon fa fa-eye fa-2x ",{t:2,r:"visualStatus",p:[51,42,1528]}]}}," ",{p:[52,5,1556],t:7,e:"span",a:{"class":"title"},f:[{t:16,p:[52,25,1576]}]}," ",{t:4,f:[{p:[54,7,1626],t:7,e:"i",a:{"class":"minimize fa fa-minus fa-2x"},v:{click:"minimize"}}," ",{p:[55,7,1696],t:7,e:"i",a:{"class":"close fa fa-close fa-2x"},v:{click:"close"}}],n:50,r:"config.fancy",p:[53,5,1598]}]}],n:50,r:"config.titlebar",p:[49,1,1413]}]},e.exports=a.extend(r.exports)},{205:205,309:309,310:310,311:311}],218:[function(t,e,n){var a=t(205),r={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")})}}}(r),r.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=a.extend(r.exports)},{205:205}],219:[function(t,e,n){var a=t(205),r={exports:{}};r.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]}]},r.exports.components=r.exports.components||{};var i={vents:t(225),modes:t(221),thresholds:t(224),status:t(223),scrubbers:t(222)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,221:221,222:222,223:223,224:224,225:225}],220:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],221:[function(t,e,n){var a=t(205),r={exports:{}};r.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]}]}]},r.exports.components=r.exports.components||{};var i={back:t(220)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,220:220}],222:[function(t,e,n){var a=t(205),r={exports:{}};r.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"]}," ",{p:[28,3,1790],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_bz"],s:'_0?"check-square-o":"square-o"'},p:[28,20,1807]}],style:[{t:2,x:{r:["filter_bz"],s:'_0?"selected":null'},p:[28,74,1861]}],action:"bz_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[29,43,1939]},'", "val": ',{t:2,x:{r:["filter_bz"],s:"+!_0"},p:[29,63,1959]},"}"]},f:["BZ"]}," ",{p:[30,3,1995],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_freon"],s:'_0?"check-square-o":"square-o"'},p:[30,20,2012]}],style:[{t:2,x:{r:["filter_freon"],s:'_0?"selected":null'},p:[30,77,2069]}],action:"freon_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[31,46,2153]},'", "val": ',{t:2,x:{r:["filter_freon"],s:"+!_0"},p:[31,66,2173]},"}"]},f:["Freon"]}," ",{p:[32,3,2215],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["filter_water_vapor"],s:'_0?"check-square-o":"square-o"'},p:[32,20,2232]}],style:[{t:2,x:{r:["filter_water_vapor"],s:'_0?"selected":null'},p:[32,83,2295]}],action:"water_vapor_scrub",params:['{"id_tag": "',{t:2,r:"id_tag",p:[33,52,2391]},'", "val": ',{t:2,x:{r:["filter_water_vapor"],s:"+!_0"},p:[33,72,2411]},"}"]},f:["Water Vapor"]}]}]}],n:52,r:"data.scrubbers",p:[7,3,144]},{t:4,n:51,f:[{p:[37,5,2522],t:7,e:"span",a:{"class":"bad"},f:["Error: No scrubbers connected."]}],r:"data.scrubbers"}]}]},r.exports.components=r.exports.components||{};var i={back:t(220)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,220:220}],223:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],224:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.css=" th, td {\r\n padding-right: 16px;\r\n text-align: left;\r\n }",r.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:[]}]}]}," "]},r.exports.components=r.exports.components||{};var i={back:t(220)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,220:220}],225:[function(t,e,n){var a=t(205),r={exports:{}};r.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"}]}]},r.exports.components=r.exports.components||{};var i={back:t(220)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,220:220}],226:[function(t,e,n){var a=t(205),r={exports:{}};r.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 }",r.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=a.extend(r.exports)},{205:205}],227:[function(t,e,n){var a=t(205),r={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"}}}}(r),r.exports.template={v:3,t:[" ",{t:4,f:[{p:[46,2,1206],t:7,e:"ui-notice",f:[{p:[47,3,1221],t:7,e:"b",f:[{p:[47,6,1224],t:7,e:"h3",f:["SYSTEM FAILURE"]}]}," ",{p:[48,3,1255],t:7,e:"i",f:["I/O regulators malfunction detected! Waiting for system reboot..."]},{p:[48,75,1327],t:7,e:"br"}," Automatic reboot in ",{t:2,r:"data.failTime",p:[49,23,1355]}," seconds... ",{p:[50,3,1387],t:7,e:"ui-button",a:{icon:"refresh",action:"reboot"},f:["Reboot Now"]},{p:[50,67,1451],t:7,e:"br"},{p:[50,71,1455],t:7,e:"br"},{p:[50,75,1459],t:7,e:"br"}]}],n:50,r:"data.failTime",p:[45,1,1182]},{t:4,n:51,f:[{p:[53,2,1491],t:7,e:"ui-notice",f:[{t:4,f:[{p:[55,3,1535],t:7,e:"ui-section",a:{label:"Interface Lock"},f:[{p:[56,5,1576],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.locked"],s:'_0?"lock":"unlock"'},p:[56,22,1593]}],action:"lock"},f:[{t:2,x:{r:["data.locked"],s:'_0?"Engaged":"Disengaged"'},p:[56,73,1644]}]}]}],n:50,r:"data.siliconUser",p:[54,4,1507]},{t:4,n:51,f:[{p:[59,3,1732],t:7,e:"span",f:["Swipe an ID card to ",{t:2,x:{r:["data.locked"],s:'_0?"unlock":"lock"'},p:[59,29,1758]}," this interface."]}],r:"data.siliconUser"}]}," ",{p:[62,2,1846],t:7,e:"ui-display",a:{title:"Power Status"},f:[{p:[63,4,1884],t:7,e:"ui-section",a:{label:"Main Breaker"},f:[{t:4,f:[{p:[65,5,1967],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isOperating"],s:'_0?"good":"bad"'},p:[65,18,1980]}]},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[65,57,2019]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[64,3,1921]},{t:4,n:51,f:[{p:[67,5,2079],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.isOperating"],s:'_0?"power-off":"close"'},p:[67,22,2096]}],style:[{t:2,x:{r:["data.isOperating"],s:'_0?"selected":null'},p:[67,75,2149]}],action:"breaker"},f:[{t:2,x:{r:["data.isOperating"],s:'_0?"On":"Off"'},p:[68,21,2212]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}," ",{p:[71,4,2293],t:7,e:"ui-section",a:{label:"External Power"},f:[{p:[72,3,2332],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.externalPower"],s:"_0(_1)"},p:[72,16,2345]}]},f:[{t:2,x:{r:["data.externalPower"],s:'_0==2?"Good":_0==1?"Low":"None"'},p:[72,52,2381]}]}]}," ",{p:[74,4,2490],t:7,e:"ui-section",a:{label:"Power Cell"},f:[{t:4,f:[{p:[76,5,2567],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.powerCellStatus",p:[76,38,2600]}],state:[{t:2,r:"powerCellStatusState",p:[76,71,2633]}]},f:[{t:2,x:{r:["adata.powerCellStatus"],s:"Math.fixed(_0)"},p:[76,97,2659]},"%"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[75,3,2525]},{t:4,n:51,f:[{p:[78,5,2724],t:7,e:"span",a:{"class":"bad"},f:["Removed"]}],x:{r:["data.powerCellStatus"],s:"_0!=null"}}]}," ",{t:4,f:[{p:[82,3,2830],t:7,e:"ui-section",a:{label:"Charge Mode"},f:[{t:4,f:[{p:[84,4,2913],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.chargeMode"],s:'_0?"good":"bad"'},p:[84,17,2926]}]},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[84,55,2964]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[83,5,2868]},{t:4,n:51,f:[{p:[86,4,3026],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.chargeMode"],s:'_0?"refresh":"close"'},p:[86,21,3043]}],style:[{t:2,x:{r:["data.chargeMode"],s:'_0?"selected":null'},p:[86,71,3093]}],action:"charge"},f:[{t:2,x:{r:["data.chargeMode"],s:'_0?"Auto":"Off"'},p:[87,22,3156]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}," [",{p:[90,6,3236],t:7,e:"span",a:{"class":[{t:2,x:{r:["powerState","data.chargingStatus"],s:"_0(_1)"},p:[90,19,3249]}]},f:[{t:2,x:{r:["data.chargingStatus"],s:'_0==2?"Fully Charged":_0==1?"Charging":"Not Charging"'},p:[90,56,3286]}]},"]"]}],n:50,x:{r:["data.powerCellStatus"],s:"_0!=null"},p:[81,4,2790]}]}," ",{p:[94,2,3445],t:7,e:"ui-display",a:{title:"Power Channels"},f:[{t:4,f:[{p:[96,3,3517],t:7,e:"ui-section",a:{label:[{t:2,r:"title",p:[96,22,3536]}],nowrap:0},f:[{p:[97,5,3560],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.powerChannels"],s:"Math.round(_1[_0].powerLoad)"},p:[97,26,3581]}," W"]}," ",{p:[98,5,3648],t:7,e:"div",a:{"class":"content"},f:[{p:[98,26,3669],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0>=2?"good":"bad"'},p:[98,39,3682]}]},f:[{t:2,x:{r:["status"],s:'_0>=2?"On":"Off"'},p:[98,73,3716]}]}]}," ",{p:[99,5,3765],t:7,e:"div",a:{"class":"content"},f:["[",{p:[99,27,3787],t:7,e:"span",f:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"Auto":"Manual"'},p:[99,33,3793]}]},"]"]}," ",{p:[100,5,3863],t:7,e:"div",a:{"class":"content",style:"float:right"},f:[{t:4,f:[{p:[102,6,3956],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["status"],s:'_0==1||_0==3?"selected":null'},p:[102,39,3989]}],action:"channel",params:[{t:2,r:"topicParams.auto",p:[103,30,4071]}]},f:["Auto"]}," ",{p:[104,6,4116],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["status"],s:'_0==2?"selected":null'},p:[104,41,4151]}],action:"channel",params:[{t:2,r:"topicParams.on",p:[105,13,4218]}]},f:["On"]}," ",{p:[106,6,4259],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["status"],s:'_0==0?"selected":null'},p:[106,37,4290]}],action:"channel",params:[{t:2,r:"topicParams.off",p:[107,13,4357]}]},f:["Off"]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"!_0||_1"},p:[101,4,3909]}]}]}],n:52,r:"data.powerChannels",p:[95,4,3485]}," ",{p:[112,4,4453],t:7,e:"ui-section",a:{label:"Total Load"},f:[{p:[113,3,4488],t:7,e:"span",a:{"class":"bold"},f:[{t:2,x:{r:["adata.totalLoad"],s:"Math.round(_0)"},p:[113,22,4507]}," W"]}]}]}," ",{t:4,f:[{p:[117,4,4613],t:7,e:"ui-display",a:{title:"System Overrides"},f:[{p:[118,3,4654],t:7,e:"ui-button",a:{icon:"lightbulb-o",action:"overload"},f:["Overload"]}," ",{t:4,f:[{p:[120,5,4755],t:7,e:"ui-button",a:{icon:[{t:2,r:"malfIcon",p:[120,22,4772]}],state:[{t:2,x:{r:["data.malfStatus"],s:'_0==4?"disabled":null'},p:[120,43,4793]}],action:[{t:2,r:"malfAction",p:[120,97,4847]}]},f:[{t:2,r:"malfButton",p:[120,113,4863]}]}],n:50,r:"data.malfStatus",p:[119,3,4726]}]}],n:50,r:"data.siliconUser",p:[116,2,4584]}," ",{p:[124,2,4931],t:7,e:"ui-notice",f:[{p:[125,4,4947],t:7,e:"ui-section",a:{label:"Cover Lock"},f:[{t:4,f:[{p:[127,5,5028],t:7,e:"span",f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[127,11,5034]}]}],n:50,x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"},p:[126,3,4982]},{t:4,n:51,f:[{p:[129,5,5106],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.coverLocked"],s:'_0?"lock":"unlock"'},p:[129,22,5123]}],action:"cover"},f:[{t:2,x:{r:["data.coverLocked"],s:'_0?"Engaged":"Disengaged"'},p:[129,79,5180]}]}],x:{r:["data.locked","data.siliconUser"],s:"_0&&!_1"}}]}]}],r:"data.failTime"}]},e.exports=a.extend(r.exports)},{205:205}],228:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],229:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],230:[function(t,e,n){var a=t(205),r={exports:{}};r.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"]}," ",{p:[24,2,1445],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="bz"?"selected":null'},p:[24,20,1463]}],action:"filter",params:'{"mode": "bz"}'},f:["BZ"]}," ",{p:[26,2,1578],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="freon"?"selected":null'},p:[26,20,1596]}],action:"filter",params:'{"mode": "freon"}'},f:["Freon"]}," ",{p:[28,2,1720],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.filter_type"],s:'_0=="water_vapor"?"selected":null'},p:[28,20,1738]}],action:"filter",params:'{"mode": "water_vapor"}'},f:["Water Vapor"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],231:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],232:[function(t,e,n){var a=t(205),r={exports:{}};r.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:"rate",params:'{"rate": "max"}'},f:["Max"]}," ",{p:[10,7,525],t:7,e:"span",f:[{t:2,x:{r:["adata.rate"],s:"Math.round(_0)"},p:[10,13,531]}," L/s"]}]}],n:50,r:"data.max_rate",p:[6,3,223]},{t:4,n:51,f:[{ +-p:[13,5,605],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[14,7,649],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[15,7,746],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,776]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[16,7,906],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[16,13,912]}," kPa"]}]}],r:"data.max_rate"}]}]},e.exports=a.extend(r.exports)},{205:205}],233:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],234:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Bluespace Artillery Control",button:0},f:[{t:4,f:[{p:[8,3,167],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,5,200],t:7,e:"ui-button",a:{icon:"crosshairs",action:"recalibrate"},f:[{t:2,r:"data.target",p:[9,55,250]}]}]}," ",{p:[11,3,298],t:7,e:"ui-section",a:{label:"Controls"},f:[{t:4,f:[{p:[13,3,356],t:7,e:"ui-notice",f:[{p:[14,4,372],t:7,e:"span",f:["Bluespace Artillery firing protocols must be globally unlocked from two keycard authentication devices first!"]}]}],n:50,x:{r:["data.unlocked"],s:"!_0"},p:[12,2,330]},{t:4,n:51,f:[{p:[17,3,525],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.ready"],s:'_0?null:"disabled"'},p:[17,36,558]}],action:"fire"},f:["FIRE!"]}],x:{r:["data.unlocked"],s:"!_0"}}]}],n:50,r:"data.connected",p:[7,3,141]}," ",{t:4,f:[{p:[22,3,694],t:7,e:"ui-section",a:{label:"Maintenance"},f:[{p:[23,7,734],t:7,e:"ui-button",a:{icon:"wrench",action:"build"},f:["Complete Deployment."]}]}],n:50,x:{r:["data.connected"],s:"!_0"},p:[21,3,667]}]}]},e.exports=a.extend(r.exports)},{205:205}],235:[function(t,e,n){var a=t(205),r={exports:{}};r.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]}]}]}," ",{t:4,f:[{p:[15,3,573],t:7,e:"ui-section",a:{label:"Access"},f:[{p:[16,7,608],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.restricted"],s:'_0?"lock":"unlock"'},p:[16,24,625]}],style:[{t:2,x:{r:[],s:'"caution"'},p:[17,14,680]}],action:"restricted"},f:[{t:2,x:{r:["data.restricted"],s:'_0?"Restricted to Engineering":"Public"'},p:[18,27,722]}]}]}],n:50,r:"data.isPrototype",p:[14,3,544]}]}," ",{p:[22,1,839],t:7,e:"ui-display",a:{title:"Valve"},f:[{p:[23,3,869],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[24,5,912],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[24,18,925]}],max:[{t:2,r:"data.maxReleasePressure",p:[24,52,959]}],value:[{t:2,r:"data.releasePressure",p:[25,14,1002]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[25,40,1028]}," kPa"]}]}," ",{p:[27,3,1099],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[28,5,1144],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[28,38,1177]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[30,5,1333],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[30,36,1364]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[32,5,1511],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[33,5,1606],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[33,35,1636]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[36,3,1798],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[37,5,1830],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[37,22,1847]}],style:[{t:2,x:{r:["data.valveOpen","data.hasHoldingTank"],s:'_0?_1?"caution":"danger":null'},p:[38,14,1901]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[39,22,1995]}]}]}]}," ",{t:4,f:[{p:[42,1,2090],t:7,e:"ui-display",a:{title:"Valve Toggle Timer"},f:[{t:4,f:[{p:[44,5,2155],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[45,7,2196],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.timer_is_not_default"],s:'_0?null:"disabled"'},p:[45,40,2229]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[47,7,2358],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.timer_is_not_min"],s:'_0?null:"disabled"'},p:[47,38,2389]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[49,7,2520],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:[],s:'"disabled"'},p:[49,39,2552]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[51,7,2637],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.timer_is_not_max"],s:'_0?null:"disabled"'},p:[51,37,2667]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[43,3,2133]}," ",{p:[55,3,2833],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[56,6,2866],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[56,39,2899]}],action:"toggle_timer"},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[57,30,2969]}]}," ",{p:[59,2,3017],t:7,e:"ui-section",a:{label:"Time until Valve Toggle"},f:[{p:[60,2,3064],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[60,8,3070]}]}]}]}]}],n:50,r:"data.isPrototype",p:[41,1,2062]},{p:{button:[{t:4,f:[{p:[69,7,3277],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.valveOpen"],s:'_0?"danger":null'},p:[69,38,3308]}],action:"eject"},f:["Eject"]}],n:50,r:"data.hasHoldingTank",p:[68,5,3242]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[73,3,3442],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holdingTank.name",p:[74,4,3473]}]}," ",{p:[76,3,3519],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holdingTank.tankPressure"],s:"Math.round(_0)"},p:[77,4,3553]}," kPa"]}],n:50,r:"data.hasHoldingTank",p:[72,3,3411]},{t:4,n:51,f:[{p:[80,3,3635],t:7,e:"ui-section",f:[{p:[81,4,3652],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.hasHoldingTank"}]}]},e.exports=a.extend(r.exports)},{205:205}],236:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.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:{state:[{t:2,x:{r:["data.away","data.docked"],s:'_0&&_1?null:"disabled"'},p:[29,17,744]}],action:"loan"},f:["Loan Shuttle"]}],n:50,x:{r:["data.loan_dispatched"],s:"!_0"},p:[27,7,677]},{t:4,n:51,f:[{p:[32,9,868],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:[40,7,1066],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.cart.length"],s:'_0?null:"disabled"'},p:[40,38,1097]}],action:"clear"},f:["Clear"]}]},t:7,e:"ui-display",a:{title:"Cart",button:0},f:[" ",{t:4,f:[{p:[43,7,1222],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[44,9,1263],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[44,31,1285]}]}," ",{p:[45,9,1307],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[45,30,1328]}]}," ",{p:[46,9,1354],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[46,30,1375]}," Credits"]}," ",{p:[47,9,1407],t:7,e:"div",a:{"class":"content"},f:[{p:[48,11,1440],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"id": "',{t:2,r:"id",p:[48,67,1496]},'"}']}}]}]}],n:52,r:"data.cart",p:[42,5,1195]},{t:4,n:51,f:[{p:[52,7,1566],t:7,e:"span",f:["Nothing in Cart"]}],r:"data.cart"}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[37,1,972]},{p:{button:[{t:4,f:[{p:[59,7,1735],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.requests.length"],s:'_0?null:"disabled"'},p:[59,38,1766]}],action:"denyall"},f:["Clear"]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[58,5,1702]}]},t:7,e:"ui-display",a:{title:"Requests",button:0},f:[" ",{t:4,f:[{p:[63,5,1908],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[64,7,1947],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[64,29,1969]}]}," ",{p:[65,7,1989],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[65,28,2010]}]}," ",{p:[66,7,2034],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[66,28,2055]}," Credits"]}," ",{p:[67,7,2085],t:7,e:"div",a:{"class":"content"},f:["By ",{t:2,r:"orderer",p:[67,31,2109]}]}," ",{p:[68,7,2134],t:7,e:"div",a:{"class":"content"},f:["Comment: ",{t:2,r:"reason",p:[68,37,2164]}]}," ",{t:4,f:[{p:[70,9,2223],t:7,e:"div",a:{"class":"content"},f:[{p:[71,11,2256],t:7,e:"ui-button",a:{icon:"check",action:"approve",params:['{"id": "',{t:2,r:"id",p:[71,68,2313]},'"}']}}," ",{p:[72,11,2336],t:7,e:"ui-button",a:{icon:"close",action:"deny",params:['{"id": "',{t:2,r:"id",p:[72,65,2390]},'"}']}}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[69,7,2188]}]}],n:52,r:"data.requests",p:[62,3,1879]},{t:4,n:51,f:[{p:[77,7,2473],t:7,e:"span",f:["No Requests"]}],r:"data.requests"}]}," ",{p:[80,1,2529],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[80,16,2544]}]},f:[{t:4,f:[{p:[82,5,2587],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[82,16,2598]}]},f:[{t:4,f:[{p:[84,9,2641],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,28,2660]}],candystripe:0,right:0},f:[{p:[85,11,2700],t:7,e:"ui-button",a:{action:"add",params:['{"id": "',{t:2,r:"id",p:[85,51,2740]},'"}']},f:[{t:2,r:"cost",p:[85,61,2750]}," Credits"]}]}],n:52,r:"packs",p:[83,7,2616]}]}],n:52,r:"data.supplies",p:[81,3,2558]}]}]},e.exports=a.extend(r.exports)},{205:205}],237:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Cellular Emporium",button:0},f:[{p:[2,3,49],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.can_readapt"],s:'_0?null:"disabled"'},p:[2,36,82]}],action:"readapt"},f:["Readapt"]}," ",{p:[4,3,169],t:7,e:"ui-section",a:{label:"Genetic Points Remaining",right:0},f:[{t:2,r:"data.genetic_points_remaining",p:[5,5,226]}]}]}," ",{p:[8,1,293],t:7,e:"ui-display",f:[{t:4,f:[{p:[10,3,335],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[10,22,354]}],candystripe:0,right:0},f:[{p:[11,5,388],t:7,e:"span",f:[{t:2,r:"desc",p:[11,11,394]}]}," ",{p:[12,5,415],t:7,e:"span",f:[{t:2,r:"helptext",p:[12,11,421]}]}," ",{p:[13,5,446],t:7,e:"span",f:["Cost: ",{t:2,r:"dna_cost",p:[13,17,458]}]}," ",{p:[14,5,483],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["owned","can_purchase"],s:'_0?"selected":_1?null:"disabled"'},p:[15,14,508]}],action:"evolve",params:['{"name": "',{t:2,r:"name",p:[17,25,615]},'"}']},f:[{t:2,x:{r:["owned"],s:'_0?"Evolved":"Evolve"'},p:[18,7,635]}]}]}],n:52,r:"data.abilities",p:[9,1,307]},{t:4,f:[{p:[23,3,738],t:7,e:"span",a:{"class":"warning"},f:["No abilities availible."]}],n:51,r:"data.abilities",p:[22,1,715]}]}]},e.exports=a.extend(r.exports)},{205:205}],238:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],239:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],240:[function(t,e,n){var a=t(205),r={exports:{}};r.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 40µ)"]}," ",{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",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[72,65,3595]}]},f:["Create Bottle (max 30µ)"]}," ",{p:[73,4,3681],t:7,e:"br"}," ",{p:[74,4,3691],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[74,65,3752]}]},f:["Dispense Buffer to Bottles"]}]}],n:50,x:{r:["data.condi"],s:"!_0"},p:[51,2,2438]},{t:4,n:51,f:[{p:[79,3,3874],t:7,e:"ui-display",a:{title:"Condiments bottles and packs"},f:[{p:[80,4,3929],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[80,63,3988]}]},f:["Create Pack (max 10µ)"]}," ",{p:[81,4,4072],t:7,e:"br"}," ",{p:[82,4,4082],t:7,e:"br"}," ",{p:[83,4,4092],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[83,65,4153]}]},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:[87,2,4301],t:7,e:"ui-display",a:{title:[{t:2,r:"data.analyzeVars.name",p:[87,20,4319]}]},f:[{p:[88,3,4350],t:7,e:"span",a:{"class":"highlight"},f:["Description:"]}," ",{p:[89,3,4398],t:7,e:"span",a:{"class":"content",style:"float:center"},f:[{t:2,r:"data.analyzeVars.description",p:[89,46,4441]}]}," ",{p:[90,3,4484],t:7,e:"br"}," ",{p:[91,3,4493],t:7,e:"span",a:{"class":"highlight"},f:["Color:"]}," ",{p:[92,3,4535],t:7,e:"span",a:{style:["color: ",{t:2,r:"data.analyzeVars.color",p:[92,23,4555]},"; background-color: ",{t:2,r:"data.analyzeVars.color",p:[92,69,4601]}]},f:[{t:2,r:"data.analyzeVars.color",p:[92,97,4629]}]}," ",{p:[93,3,4666],t:7,e:"br"}," ",{p:[94,3,4675],t:7,e:"span",a:{"class":"highlight"},f:["State:"]}," ",{p:[95,3,4717],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.state",p:[95,25,4739]}]}," ",{p:[96,3,4776],t:7,e:"br"}," ",{p:[97,3,4785],t:7,e:"span",a:{"class":"highlight"},f:["Metabolization Rate:"]}," ",{p:[98,3,4841],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.metaRate",p:[98,25,4863]},"µ/minute"]}," ",{p:[99,3,4911],t:7,e:"br"}," ",{p:[100,3,4920],t:7,e:"span",a:{"class":"highlight"},f:["Overdose Threshold:"]}," ",{p:[101,3,4975],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.overD",p:[101,25,4997]}]}," ",{p:[102,3,5034],t:7,e:"br"}," ",{p:[103,3,5043],t:7,e:"span",a:{"class":"highlight"},f:["Addiction Threshold:"]}," ",{p:[104,3,5099],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.addicD",p:[104,25,5121]}]}," ",{p:[105,3,5159],t:7,e:"br"}," ",{p:[106,3,5168],t:7,e:"br"}," ",{p:[107,3,5177],t:7,e:"ui-button",a:{action:"goScreen",params:'{"screen": "home"}'},f:["Back"]}]}]}],x:{r:["data.screen"],s:'_0=="home"'}}]},e.exports=a.extend(r.exports)},{205:205}],241:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-button",a:{action:"toggle"},f:[{t:2,x:{r:["data.recollection"],s:'_0?"Recital":"Recollection"'},p:[2,30,43]}]}," ",{p:[3,3,107],t:7,e:"ui-button",a:{action:"component"},f:["Target Component: ",{t:3,r:"data.target_comp",p:[3,51,155]}]}]}," ",{t:4,f:[{p:[6,3,235],t:7,e:"ui-display",f:[{t:3,r:"data.rec_text",p:[7,3,251]}," ",{t:4,f:[{p:[9,4,317],t:7,e:"br"},{p:[9,8,321],t:7,e:"ui-button",a:{action:"rec_category",params:['{"category": "',{t:2,r:"name",p:[9,63,376]},'"}']},f:[{t:3,r:"name",p:[9,75,388]}," - ",{t:3,r:"desc",p:[9,88,401]}]}],n:52,r:"data.recollection_categories",p:[8,3,274]}," ",{t:3,r:"data.rec_section",p:[11,3,440]}," ",{t:3,r:"data.rec_binds",p:[12,3,466]}]}],n:50,r:"data.recollection",p:[5,1,206]},{t:4,n:51,f:[{p:[15,2,517],t:7,e:"ui-display",a:{title:"Components (with Global Cache)",button:0},f:[{p:[16,4,580],t:7,e:"ui-section",f:[{t:3,r:"data.components",p:[17,6,599]}]}]}," ",{p:[20,2,657],t:7,e:"ui-display",f:[{p:[21,3,673],t:7,e:"ui-section",f:[{p:[22,4,690],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Driver"?"selected":null'},p:[22,22,708]}],action:"select",params:'{"category": "Driver"}'},f:["Driver"]}," ",{p:[23,4,831],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Script"?"selected":null'},p:[23,22,849]}],action:"select",params:'{"category": "Script"}'},f:["Scripts"]}," ",{p:[24,4,973],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Application"?"selected":null'},p:[24,22,991]}],action:"select",params:'{"category": "Application"}'},f:["Applications"]}," ",{p:[25,4,1130],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Judgement"?"selected":null'},p:[25,22,1148]}],action:"select",params:'{"category": "Judgement"}'},f:["Judgement"]}," ",{p:[26,4,1279],t:7,e:"br"},{t:3,r:"data.tier_info",p:[26,8,1283]}]},{p:[27,16,1320],t:7,e:"hr"}," ",{p:[28,3,1328],t:7,e:"ui-section",f:[{t:4,f:[{p:[30,4,1373],t:7,e:"div",f:[{p:[30,9,1378],t:7,e:"ui-button",a:{tooltip:[{t:3,r:"tip",p:[30,29,1398]}],"tooltip-side":"right",action:"recite",params:['{"category": "',{t:2,r:"type",p:[30,99,1468]},'"}']},f:["Recite",{t:3,r:"required",p:[30,117,1486]}]}," ",{t:4,f:[{t:4,f:[{p:[33,6,1562],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[33,53,1609]},'"}']},f:["Unbind ",{t:3,r:"bound",p:[33,72,1628]}]}],n:50,r:"bound",p:[32,5,1542]},{t:4,n:51,f:[{p:[35,6,1672],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[35,53,1719]},'"}']},f:["Quickbind"]}],r:"bound"}],n:50,r:"quickbind",p:[31,6,1519]}," ",{t:3,r:"name",p:[38,6,1786]}," ",{t:3,r:"descname",p:[38,17,1797]}," ",{t:3,r:"invokers",p:[38,32,1812]}]}],n:52,r:"data.scripture",p:[29,3,1344]}]}]}],r:"data.recollection"}]},e.exports=a.extend(r.exports)},{205:205}],242:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Codex Gigas"},f:[{p:[2,2,35],t:7,e:"ui-section",f:[{t:2,r:"data.name",p:[3,3,51]}]}," ",{p:[5,5,86],t:7,e:"ui-section",a:{label:"Prefix"},f:[{p:[6,3,117],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[6,22,136]}],action:"Dark "},f:["Dark"]}," ",{p:[7,3,221],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[7,22,240]}],action:"Hellish "},f:["Hellish"]}," ",{p:[8,3,331],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[8,22,350]}],action:"Fallen "},f:["Fallen"]}," ",{p:[9,3,439],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[9,22,458]}],action:"Fiery "},f:["Fiery"]}," ",{p:[10,3,545],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[10,22,564]}],action:"Sinful "},f:["Sinful"]}," ",{p:[11,3,653],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[11,22,672]}],action:"Blood "},f:["Blood"]}," ",{p:[12,3,759],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[12,22,778]}],action:"Fluffy "},f:["Fluffy"]}]}," ",{p:[14,5,888],t:7,e:"ui-section",a:{label:"Title"},f:[{p:[15,3,918],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[15,22,937]}],action:"Lord "},f:["Lord"]}," ",{p:[16,3,1022],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[16,22,1041]}],action:"Prelate "},f:["Prelate"]}," ",{p:[17,3,1132],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[17,22,1151]}],action:"Count "},f:["Count"]}," ",{p:[18,3,1238],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[18,22,1257]}],action:"Viscount "},f:["Viscount"]}," ",{p:[19,3,1350],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[19,22,1369]}],action:"Vizier "},f:["Vizier"]}," ",{p:[20,3,1458],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[20,22,1477]}],action:"Elder "},f:["Elder"]}," ",{p:[21,3,1564],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[21,22,1583]}],action:"Adept "},f:["Adept"]}]}," ",{p:[23,5,1691],t:7,e:"ui-section",a:{label:"Name"},f:[{p:[24,3,1720],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[24,22,1739]}],action:"hal"},f:["hal"]}," ",{p:[25,3,1821],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[25,22,1840]}],action:"ve" ++p:[13,5,605],t:7,e:"ui-section",a:{label:"Output Pressure"},f:[{p:[14,7,649],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[15,7,746],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,776]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}," ",{p:[16,7,906],t:7,e:"span",f:[{t:2,x:{r:["adata.pressure"],s:"Math.round(_0)"},p:[16,13,912]}," kPa"]}]}],r:"data.max_rate"}]}]},e.exports=a.extend(r.exports)},{205:205}],233:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],234:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Bluespace Artillery Control",button:0},f:[{t:4,f:[{p:[8,3,167],t:7,e:"ui-section",a:{label:"Target"},f:[{p:[9,5,200],t:7,e:"ui-button",a:{icon:"crosshairs",action:"recalibrate"},f:[{t:2,r:"data.target",p:[9,55,250]}]}]}," ",{p:[11,3,298],t:7,e:"ui-section",a:{label:"Controls"},f:[{t:4,f:[{p:[13,3,356],t:7,e:"ui-notice",f:[{p:[14,4,372],t:7,e:"span",f:["Bluespace Artillery firing protocols must be globally unlocked from two keycard authentication devices first!"]}]}],n:50,x:{r:["data.unlocked"],s:"!_0"},p:[12,2,330]},{t:4,n:51,f:[{p:[17,3,525],t:7,e:"ui-button",a:{icon:"warning",state:[{t:2,x:{r:["data.ready"],s:'_0?null:"disabled"'},p:[17,36,558]}],action:"fire"},f:["FIRE!"]}],x:{r:["data.unlocked"],s:"!_0"}}]}],n:50,r:"data.connected",p:[7,3,141]}," ",{t:4,f:[{p:[22,3,694],t:7,e:"ui-section",a:{label:"Maintenance"},f:[{p:[23,7,734],t:7,e:"ui-button",a:{icon:"wrench",action:"build"},f:["Complete Deployment."]}]}],n:50,x:{r:["data.connected"],s:"!_0"},p:[21,3,667]}]}]},e.exports=a.extend(r.exports)},{205:205}],235:[function(t,e,n){var a=t(205),r={exports:{}};r.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]}]}]}," ",{t:4,f:[{p:[15,3,573],t:7,e:"ui-section",a:{label:"Access"},f:[{p:[16,7,608],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.restricted"],s:'_0?"lock":"unlock"'},p:[16,24,625]}],style:[{t:2,x:{r:[],s:'"caution"'},p:[17,14,680]}],action:"restricted"},f:[{t:2,x:{r:["data.restricted"],s:'_0?"Restricted to Engineering":"Public"'},p:[18,27,722]}]}]}],n:50,r:"data.isPrototype",p:[14,3,544]}]}," ",{p:[22,1,839],t:7,e:"ui-display",a:{title:"Valve"},f:[{p:[23,3,869],t:7,e:"ui-section",a:{label:"Release Pressure"},f:[{p:[24,5,912],t:7,e:"ui-bar",a:{min:[{t:2,r:"data.minReleasePressure",p:[24,18,925]}],max:[{t:2,r:"data.maxReleasePressure",p:[24,52,959]}],value:[{t:2,r:"data.releasePressure",p:[25,14,1002]}]},f:[{t:2,x:{r:["adata.releasePressure"],s:"Math.round(_0)"},p:[25,40,1028]}," kPa"]}]}," ",{p:[27,3,1099],t:7,e:"ui-section",a:{label:"Pressure Regulator"},f:[{p:[28,5,1144],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.releasePressure","data.defaultReleasePressure"],s:'_0!=_1?null:"disabled"'},p:[28,38,1177]}],action:"pressure",params:'{"pressure": "reset"}'},f:["Reset"]}," ",{p:[30,5,1333],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.releasePressure","data.minReleasePressure"],s:'_0>_1?null:"disabled"'},p:[30,36,1364]}],action:"pressure",params:'{"pressure": "min"}'},f:["Min"]}," ",{p:[32,5,1511],t:7,e:"ui-button",a:{icon:"pencil",action:"pressure",params:'{"pressure": "input"}'},f:["Set"]}," ",{p:[33,5,1606],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.releasePressure","data.maxReleasePressure"],s:'_0<_1?null:"disabled"'},p:[33,35,1636]}],action:"pressure",params:'{"pressure": "max"}'},f:["Max"]}]}," ",{p:[36,3,1798],t:7,e:"ui-section",a:{label:"Valve"},f:[{p:[37,5,1830],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.valveOpen"],s:'_0?"unlock":"lock"'},p:[37,22,1847]}],style:[{t:2,x:{r:["data.valveOpen","data.hasHoldingTank"],s:'_0?_1?"caution":"danger":null'},p:[38,14,1901]}],action:"valve"},f:[{t:2,x:{r:["data.valveOpen"],s:'_0?"Open":"Closed"'},p:[39,22,1995]}]}]}]}," ",{t:4,f:[{p:[42,1,2090],t:7,e:"ui-display",a:{title:"Valve Toggle Timer"},f:[{t:4,f:[{p:[44,5,2155],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[45,7,2196],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.timer_is_not_default"],s:'_0?null:"disabled"'},p:[45,40,2229]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[47,7,2358],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.timer_is_not_min"],s:'_0?null:"disabled"'},p:[47,38,2389]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[49,7,2520],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:[],s:'"disabled"'},p:[49,39,2552]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[51,7,2637],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.timer_is_not_max"],s:'_0?null:"disabled"'},p:[51,37,2667]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[43,3,2133]}," ",{p:[55,3,2833],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[56,6,2866],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[56,39,2899]}],action:"toggle_timer"},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[57,30,2969]}]}," ",{p:[59,2,3017],t:7,e:"ui-section",a:{label:"Time until Valve Toggle"},f:[{p:[60,2,3064],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[60,8,3070]}]}]}]}]}],n:50,r:"data.isPrototype",p:[41,1,2062]},{p:{button:[{t:4,f:[{p:[69,7,3277],t:7,e:"ui-button",a:{icon:"eject",style:[{t:2,x:{r:["data.valveOpen"],s:'_0?"danger":null'},p:[69,38,3308]}],action:"eject"},f:["Eject"]}],n:50,r:"data.hasHoldingTank",p:[68,5,3242]}]},t:7,e:"ui-display",a:{title:"Holding Tank",button:0},f:[" ",{t:4,f:[{p:[73,3,3442],t:7,e:"ui-section",a:{label:"Label"},f:[{t:2,r:"data.holdingTank.name",p:[74,4,3473]}]}," ",{p:[76,3,3519],t:7,e:"ui-section",a:{label:"Pressure"},f:[{t:2,x:{r:["adata.holdingTank.tankPressure"],s:"Math.round(_0)"},p:[77,4,3553]}," kPa"]}],n:50,r:"data.hasHoldingTank",p:[72,3,3411]},{t:4,n:51,f:[{p:[80,3,3635],t:7,e:"ui-section",f:[{p:[81,4,3652],t:7,e:"span",a:{"class":"average"},f:["No Holding Tank"]}]}],r:"data.hasHoldingTank"}]}]},e.exports=a.extend(r.exports)},{205:205}],236:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tabs:function(){return Object.keys(this.get("data.supplies"))}}}}(r),r.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:{state:[{t:2,x:{r:["data.away","data.docked"],s:'_0&&_1?null:"disabled"'},p:[29,17,744]}],action:"loan"},f:["Loan Shuttle"]}],n:50,x:{r:["data.loan_dispatched"],s:"!_0"},p:[27,7,677]},{t:4,n:51,f:[{p:[32,9,868],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:[40,7,1066],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.cart.length"],s:'_0?null:"disabled"'},p:[40,38,1097]}],action:"clear"},f:["Clear"]}]},t:7,e:"ui-display",a:{title:"Cart",button:0},f:[" ",{t:4,f:[{p:[43,7,1222],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[44,9,1263],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[44,31,1285]}]}," ",{p:[45,9,1307],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[45,30,1328]}]}," ",{p:[46,9,1354],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[46,30,1375]}," Credits"]}," ",{p:[47,9,1407],t:7,e:"div",a:{"class":"content"},f:[{p:[48,11,1440],t:7,e:"ui-button",a:{icon:"minus",action:"remove",params:['{"id": "',{t:2,r:"id",p:[48,67,1496]},'"}']}}]}]}],n:52,r:"data.cart",p:[42,5,1195]},{t:4,n:51,f:[{p:[52,7,1566],t:7,e:"span",f:["Nothing in Cart"]}],r:"data.cart"}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[37,1,972]},{p:{button:[{t:4,f:[{p:[59,7,1735],t:7,e:"ui-button",a:{icon:"close",state:[{t:2,x:{r:["data.requests.length"],s:'_0?null:"disabled"'},p:[59,38,1766]}],action:"denyall"},f:["Clear"]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[58,5,1702]}]},t:7,e:"ui-display",a:{title:"Requests",button:0},f:[" ",{t:4,f:[{p:[63,5,1908],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[64,7,1947],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[64,29,1969]}]}," ",{p:[65,7,1989],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"object",p:[65,28,2010]}]}," ",{p:[66,7,2034],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"cost",p:[66,28,2055]}," Credits"]}," ",{p:[67,7,2085],t:7,e:"div",a:{"class":"content"},f:["By ",{t:2,r:"orderer",p:[67,31,2109]}]}," ",{p:[68,7,2134],t:7,e:"div",a:{"class":"content"},f:["Comment: ",{t:2,r:"reason",p:[68,37,2164]}]}," ",{t:4,f:[{p:[70,9,2223],t:7,e:"div",a:{"class":"content"},f:[{p:[71,11,2256],t:7,e:"ui-button",a:{icon:"check",action:"approve",params:['{"id": "',{t:2,r:"id",p:[71,68,2313]},'"}']}}," ",{p:[72,11,2336],t:7,e:"ui-button",a:{icon:"close",action:"deny",params:['{"id": "',{t:2,r:"id",p:[72,65,2390]},'"}']}}]}],n:50,x:{r:["data.requestonly"],s:"!_0"},p:[69,7,2188]}]}],n:52,r:"data.requests",p:[62,3,1879]},{t:4,n:51,f:[{p:[77,7,2473],t:7,e:"span",f:["No Requests"]}],r:"data.requests"}]}," ",{p:[80,1,2529],t:7,e:"ui-tabs",a:{tabs:[{t:2,r:"tabs",p:[80,16,2544]}]},f:[{t:4,f:[{p:[82,5,2587],t:7,e:"tab",a:{name:[{t:2,r:"name",p:[82,16,2598]}]},f:[{t:4,f:[{p:[84,9,2641],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[84,28,2660]}],candystripe:0,right:0},f:[{p:[85,11,2700],t:7,e:"ui-button",a:{action:"add",params:['{"id": "',{t:2,r:"id",p:[85,51,2740]},'"}']},f:[{t:2,r:"cost",p:[85,61,2750]}," Credits"]}]}],n:52,r:"packs",p:[83,7,2616]}]}],n:52,r:"data.supplies",p:[81,3,2558]}]}]},e.exports=a.extend(r.exports)},{205:205}],237:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Cellular Emporium",button:0},f:[{p:[2,3,49],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.can_readapt"],s:'_0?null:"disabled"'},p:[2,36,82]}],action:"readapt"},f:["Readapt"]}," ",{p:[4,3,169],t:7,e:"ui-section",a:{label:"Genetic Points Remaining",right:0},f:[{t:2,r:"data.genetic_points_remaining",p:[5,5,226]}]}]}," ",{p:[8,1,293],t:7,e:"ui-display",f:[{t:4,f:[{p:[10,3,335],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[10,22,354]}],candystripe:0,right:0},f:[{p:[11,5,388],t:7,e:"span",f:[{t:2,r:"desc",p:[11,11,394]}]}," ",{p:[12,5,415],t:7,e:"span",f:[{t:2,r:"helptext",p:[12,11,421]}]}," ",{p:[13,5,446],t:7,e:"span",f:["Cost: ",{t:2,r:"dna_cost",p:[13,17,458]}]}," ",{p:[14,5,483],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["owned","can_purchase"],s:'_0?"selected":_1?null:"disabled"'},p:[15,14,508]}],action:"evolve",params:['{"name": "',{t:2,r:"name",p:[17,25,615]},'"}']},f:[{t:2,x:{r:["owned"],s:'_0?"Evolved":"Evolve"'},p:[18,7,635]}]}]}],n:52,r:"data.abilities",p:[9,1,307]},{t:4,f:[{p:[23,3,738],t:7,e:"span",a:{"class":"warning"},f:["No abilities availible."]}],n:51,r:"data.abilities",p:[22,1,715]}]}]},e.exports=a.extend(r.exports)},{205:205}],238:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],239:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],240:[function(t,e,n){var a=t(205),r={exports:{}};r.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 40µ)"]}," ",{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",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[72,65,3595]}]},f:["Create Bottle (max 30µ)"]}," ",{p:[73,4,3681],t:7,e:"br"}," ",{p:[74,4,3691],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 1}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[74,65,3752]}]},f:["Dispense Buffer to Bottles"]}]}],n:50,x:{r:["data.condi"],s:"!_0"},p:[51,2,2438]},{t:4,n:51,f:[{p:[79,3,3874],t:7,e:"ui-display",a:{title:"Condiments bottles and packs"},f:[{p:[80,4,3929],t:7,e:"ui-button",a:{action:"createPill",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[80,63,3988]}]},f:["Create Pack (max 10µ)"]}," ",{p:[81,4,4072],t:7,e:"br"}," ",{p:[82,4,4082],t:7,e:"br"}," ",{p:[83,4,4092],t:7,e:"ui-button",a:{action:"createBottle",params:'{"many": 0}',state:[{t:2,x:{r:["data.bufferContents"],s:'_0?null:"disabled"'},p:[83,65,4153]}]},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:[87,2,4301],t:7,e:"ui-display",a:{title:[{t:2,r:"data.analyzeVars.name",p:[87,20,4319]}]},f:[{p:[88,3,4350],t:7,e:"span",a:{"class":"highlight"},f:["Description:"]}," ",{p:[89,3,4398],t:7,e:"span",a:{"class":"content",style:"float:center"},f:[{t:2,r:"data.analyzeVars.description",p:[89,46,4441]}]}," ",{p:[90,3,4484],t:7,e:"br"}," ",{p:[91,3,4493],t:7,e:"span",a:{"class":"highlight"},f:["Color:"]}," ",{p:[92,3,4535],t:7,e:"span",a:{style:["color: ",{t:2,r:"data.analyzeVars.color",p:[92,23,4555]},"; background-color: ",{t:2,r:"data.analyzeVars.color",p:[92,69,4601]}]},f:[{t:2,r:"data.analyzeVars.color",p:[92,97,4629]}]}," ",{p:[93,3,4666],t:7,e:"br"}," ",{p:[94,3,4675],t:7,e:"span",a:{"class":"highlight"},f:["State:"]}," ",{p:[95,3,4717],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.state",p:[95,25,4739]}]}," ",{p:[96,3,4776],t:7,e:"br"}," ",{p:[97,3,4785],t:7,e:"span",a:{"class":"highlight"},f:["Metabolization Rate:"]}," ",{p:[98,3,4841],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.metaRate",p:[98,25,4863]},"µ/minute"]}," ",{p:[99,3,4911],t:7,e:"br"}," ",{p:[100,3,4920],t:7,e:"span",a:{"class":"highlight"},f:["Overdose Threshold:"]}," ",{p:[101,3,4975],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.overD",p:[101,25,4997]}]}," ",{p:[102,3,5034],t:7,e:"br"}," ",{p:[103,3,5043],t:7,e:"span",a:{"class":"highlight"},f:["Addiction Threshold:"]}," ",{p:[104,3,5099],t:7,e:"span",a:{"class":"content"},f:[{t:2,r:"data.analyzeVars.addicD",p:[104,25,5121]}]}," ",{p:[105,3,5159],t:7,e:"br"}," ",{p:[106,3,5168],t:7,e:"br"}," ",{p:[107,3,5177],t:7,e:"ui-button",a:{action:"goScreen",params:'{"screen": "home"}'},f:["Back"]}]}]}],x:{r:["data.screen"],s:'_0=="home"'}}]},e.exports=a.extend(r.exports)},{205:205}],241:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,3,16],t:7,e:"ui-button",a:{action:"toggle"},f:[{t:2,x:{r:["data.recollection"],s:'_0?"Recital":"Recollection"'},p:[2,30,43]}]}," ",{p:[3,3,107],t:7,e:"ui-button",a:{action:"component"},f:["Target Component: ",{t:3,r:"data.target_comp",p:[3,51,155]}]}]}," ",{t:4,f:[{p:[6,3,235],t:7,e:"ui-display",f:[{t:3,r:"data.rec_text",p:[7,3,251]}," ",{t:4,f:[{p:[9,4,317],t:7,e:"br"},{p:[9,8,321],t:7,e:"ui-button",a:{action:"rec_category",params:['{"category": "',{t:2,r:"name",p:[9,63,376]},'"}']},f:[{t:3,r:"name",p:[9,75,388]}," - ",{t:3,r:"desc",p:[9,88,401]}]}],n:52,r:"data.recollection_categories",p:[8,3,274]}," ",{t:3,r:"data.rec_section",p:[11,3,440]}," ",{t:3,r:"data.rec_binds",p:[12,3,466]}]}],n:50,r:"data.recollection",p:[5,1,206]},{t:4,n:51,f:[{p:[15,2,517],t:7,e:"ui-display",a:{title:"Components (with Global Cache)",button:0},f:[{p:[16,4,580],t:7,e:"ui-section",f:[{t:3,r:"data.components",p:[17,6,599]}]}]}," ",{p:[20,2,657],t:7,e:"ui-display",f:[{p:[21,3,673],t:7,e:"ui-section",f:[{p:[22,4,690],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Driver"?"selected":null'},p:[22,22,708]}],action:"select",params:'{"category": "Driver"}'},f:["Driver"]}," ",{p:[23,4,831],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Script"?"selected":null'},p:[23,22,849]}],action:"select",params:'{"category": "Script"}'},f:["Scripts"]}," ",{p:[24,4,973],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Application"?"selected":null'},p:[24,22,991]}],action:"select",params:'{"category": "Application"}'},f:["Applications"]}," ",{p:[25,4,1130],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.selected"],s:'_0=="Judgement"?"selected":null'},p:[25,22,1148]}],action:"select",params:'{"category": "Judgement"}'},f:["Judgement"]}," ",{p:[26,4,1279],t:7,e:"br"},{t:3,r:"data.tier_info",p:[26,8,1283]}]},{p:[27,16,1320],t:7,e:"hr"}," ",{p:[28,3,1328],t:7,e:"ui-section",f:[{t:4,f:[{p:[30,4,1373],t:7,e:"div",f:[{p:[30,9,1378],t:7,e:"ui-button",a:{tooltip:[{t:3,r:"tip",p:[30,29,1398]}],"tooltip-side":"right",action:"recite",params:['{"category": "',{t:2,r:"type",p:[30,99,1468]},'"}']},f:["Recite",{t:3,r:"required",p:[30,117,1486]}]}," ",{t:4,f:[{t:4,f:[{p:[33,6,1562],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[33,53,1609]},'"}']},f:["Unbind ",{t:3,r:"bound",p:[33,72,1628]}]}],n:50,r:"bound",p:[32,5,1542]},{t:4,n:51,f:[{p:[35,6,1672],t:7,e:"ui-button",a:{action:"bind",params:['{"category": "',{t:2,r:"type",p:[35,53,1719]},'"}']},f:["Quickbind"]}],r:"bound"}],n:50,r:"quickbind",p:[31,6,1519]}," ",{t:3,r:"name",p:[38,6,1786]}," ",{t:3,r:"descname",p:[38,17,1797]}," ",{t:3,r:"invokers",p:[38,32,1812]}]}],n:52,r:"data.scripture",p:[29,3,1344]}]}]}],r:"data.recollection"}]},e.exports=a.extend(r.exports)},{205:205}],242:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Codex Gigas"},f:[{p:[2,2,35],t:7,e:"ui-section",f:[{t:2,r:"data.name",p:[3,3,51]}]}," ",{p:[5,5,86],t:7,e:"ui-section",a:{label:"Prefix"},f:[{p:[6,3,117],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[6,22,136]}],action:"Dark "},f:["Dark"]}," ",{p:[7,3,221],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[7,22,240]}],action:"Hellish "},f:["Hellish"]}," ",{p:[8,3,331],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[8,22,350]}],action:"Fallen "},f:["Fallen"]}," ",{p:[9,3,439],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[9,22,458]}],action:"Fiery "},f:["Fiery"]}," ",{p:[10,3,545],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[10,22,564]}],action:"Sinful "},f:["Sinful"]}," ",{p:[11,3,653],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[11,22,672]}],action:"Blood "},f:["Blood"]}," ",{p:[12,3,759],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==1?null:"disabled"'},p:[12,22,778]}],action:"Fluffy "},f:["Fluffy"]}]}," ",{p:[14,5,888],t:7,e:"ui-section",a:{label:"Title"},f:[{p:[15,3,918],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[15,22,937]}],action:"Lord "},f:["Lord"]}," ",{p:[16,3,1022],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[16,22,1041]}],action:"Prelate "},f:["Prelate"]}," ",{p:[17,3,1132],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[17,22,1151]}],action:"Count "},f:["Count"]}," ",{p:[18,3,1238],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[18,22,1257]}],action:"Viscount "},f:["Viscount"]}," ",{p:[19,3,1350],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[19,22,1369]}],action:"Vizier "},f:["Vizier"]}," ",{p:[20,3,1458],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[20,22,1477]}],action:"Elder "},f:["Elder"]}," ",{p:[21,3,1564],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=2?null:"disabled"'},p:[21,22,1583]}],action:"Adept "},f:["Adept"]}]}," ",{p:[23,5,1691],t:7,e:"ui-section",a:{label:"Name"},f:[{p:[24,3,1720],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[24,22,1739]}],action:"hal"},f:["hal"]}," ",{p:[25,3,1821],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[25,22,1840]}],action:"ve" + },f:["ve"]}," ",{p:[26,3,1920],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[26,22,1939]}],action:"odr"},f:["odr"]}," ",{p:[27,3,2021],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[27,22,2040]}],action:"neit"},f:["neit"]}," ",{p:[28,3,2124],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[28,22,2143]}],action:"ci"},f:["ci"]}," ",{p:[29,3,2223],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[29,22,2242]}],action:"quon"},f:["quon"]}," ",{p:[30,3,2326],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[30,22,2345]}],action:"mya"},f:["mya"]}," ",{p:[31,3,2427],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[31,22,2446]}],action:"folth"},f:["folth"]}," ",{p:[32,3,2532],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[32,22,2551]}],action:"wren"},f:["wren"]}," ",{p:[33,3,2635],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[33,22,2654]}],action:"geyr"},f:["geyr"]}," ",{p:[34,3,2738],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[34,22,2757]}],action:"hil"},f:["hil"]}," ",{p:[35,3,2839],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[35,22,2858]}],action:"niet"},f:["niet"]}," ",{p:[36,3,2942],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[36,22,2961]}],action:"twou"},f:["twou"]}," ",{p:[37,3,3045],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[37,22,3064]}],action:"phi"},f:["phi"]}," ",{p:[38,3,3146],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0<=4?null:"disabled"'},p:[38,22,3165]}],action:"coa"},f:["coa"]}]}," ",{p:[40,5,3268],t:7,e:"ui-section",a:{label:"suffix"},f:[{p:[41,3,3299],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[41,22,3318]}],action:" the Red"},f:["the Red"]}," ",{p:[42,3,3409],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[42,22,3428]}],action:" the Soulless"},f:["the Soulless"]}," ",{p:[43,3,3529],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[43,22,3548]}],action:" the Master"},f:["the Master"]}," ",{p:[44,3,3645],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[44,22,3664]}],action:", the Lord of all things"},f:["the Lord of all things"]}," ",{p:[45,3,3786],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0==4?null:"disabled"'},p:[45,22,3805]}],action:", Jr."},f:["jr"]}]}," ",{p:[47,5,3909],t:7,e:"ui-section",a:{label:"submit"},f:[{p:[48,3,3941],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.currentSection"],s:'_0>=4?null:"disabled"'},p:[48,21,3959]}],action:"search"},f:["search"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],243:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[2,1,2],t:7,e:"ui-button",a:{icon:"circle",action:"clean_order"},f:["Clear Order"]},{p:[2,70,71],t:7,e:"br"},{p:[2,74,75],t:7,e:"br"}," ",{p:[3,1,81],t:7,e:"i",f:["Your new computer device you always dreamed of is just four steps away..."]},{p:[3,81,161],t:7,e:"hr"}," ",{t:4,f:[" ",{p:[5,1,223],t:7,e:"div",a:{"class":"item"},f:[{p:[6,2,244],t:7,e:"h2",f:["Step 1: Select your device type"]}," ",{p:[7,2,287],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "1"}'},f:["Laptop"]}," ",{p:[8,2,377],t:7,e:"ui-button",a:{icon:"calc",action:"pick_device",params:'{"pick" : "2"}'},f:["LTablet"]}]}],n:50,x:{r:["data.state"],s:"_0==0"},p:[4,1,167]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.state"],s:"_0==1"},f:[{p:[11,1,502],t:7,e:"div",a:{"class":"item"},f:[{p:[12,2,523],t:7,e:"h2",f:["Step 2: Personalise your device"]}," ",{p:[13,2,566],t:7,e:"table",f:[{p:[14,3,577],t:7,e:"tr",f:[{p:[15,4,586],t:7,e:"td",f:[{p:[15,8,590],t:7,e:"b",f:["Current Price:"]}]},{p:[16,4,616],t:7,e:"td",f:[{t:2,r:"data.totalprice",p:[16,8,620]},"C"]}]}," ",{p:[18,3,653],t:7,e:"tr",f:[{p:[19,4,663],t:7,e:"td",f:[{p:[19,8,667],t:7,e:"b",f:["Battery:"]}]},{p:[20,4,687],t:7,e:"td",f:[{p:[20,8,691],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "1"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==1?"selected":null'},p:[20,73,756]}]},f:["Standard"]}]},{p:[21,4,827],t:7,e:"td",f:[{p:[21,8,831],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "2"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==2?"selected":null'},p:[21,73,896]}]},f:["Upgraded"]}]},{p:[22,4,967],t:7,e:"td",f:[{p:[22,8,971],t:7,e:"ui-button",a:{action:"hw_battery",params:'{"battery" : "3"}',state:[{t:2,x:{r:["data.hw_battery"],s:'_0==3?"selected":null'},p:[22,73,1036]}]},f:["Advanced"]}]}]}," ",{p:[24,3,1115],t:7,e:"tr",f:[{p:[25,4,1124],t:7,e:"td",f:[{p:[25,8,1128],t:7,e:"b",f:["Hard Drive:"]}]},{p:[26,4,1151],t:7,e:"td",f:[{p:[26,8,1155],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "1"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==1?"selected":null'},p:[26,67,1214]}]},f:["Standard"]}]},{p:[27,4,1282],t:7,e:"td",f:[{p:[27,8,1286],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "2"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==2?"selected":null'},p:[27,67,1345]}]},f:["Upgraded"]}]},{p:[28,4,1413],t:7,e:"td",f:[{p:[28,8,1417],t:7,e:"ui-button",a:{action:"hw_disk",params:'{"disk" : "3"}',state:[{t:2,x:{r:["data.hw_disk"],s:'_0==3?"selected":null'},p:[28,67,1476]}]},f:["Advanced"]}]}]}," ",{p:[30,3,1552],t:7,e:"tr",f:[{p:[31,4,1561],t:7,e:"td",f:[{p:[31,8,1565],t:7,e:"b",f:["Network Card:"]}]},{p:[32,4,1590],t:7,e:"td",f:[{p:[32,8,1594],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "0"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==0?"selected":null'},p:[32,73,1659]}]},f:["None"]}]},{p:[33,4,1726],t:7,e:"td",f:[{p:[33,8,1730],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "1"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==1?"selected":null'},p:[33,73,1795]}]},f:["Standard"]}]},{p:[34,4,1866],t:7,e:"td",f:[{p:[34,8,1870],t:7,e:"ui-button",a:{action:"hw_netcard",params:'{"netcard" : "2"}',state:[{t:2,x:{r:["data.hw_netcard"],s:'_0==2?"selected":null'},p:[34,73,1935]}]},f:["Advanced"]}]}]}," ",{p:[36,3,2014],t:7,e:"tr",f:[{p:[37,4,2023],t:7,e:"td",f:[{p:[37,8,2027],t:7,e:"b",f:["Nano Printer:"]}]},{p:[38,4,2052],t:7,e:"td",f:[{p:[38,8,2056],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "0"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==0?"selected":null'},p:[38,73,2121]}]},f:["None"]}]},{p:[39,4,2190],t:7,e:"td",f:[{p:[39,8,2194],t:7,e:"ui-button",a:{action:"hw_nanoprint",params:'{"print" : "1"}',state:[{t:2,x:{r:["data.hw_nanoprint"],s:'_0==1?"selected":null'},p:[39,73,2259]}]},f:["Standard"]}]}]}," ",{p:[41,3,2340],t:7,e:"tr",f:[{p:[42,4,2349],t:7,e:"td",f:[{p:[42,8,2353],t:7,e:"b",f:["Card Reader:"]}]},{p:[43,4,2377],t:7,e:"td",f:[{p:[43,8,2381],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "0"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==0?"selected":null'},p:[43,67,2440]}]},f:["None"]}]},{p:[44,4,2504],t:7,e:"td",f:[{p:[44,8,2508],t:7,e:"ui-button",a:{action:"hw_card",params:'{"card" : "1"}',state:[{t:2,x:{r:["data.hw_card"],s:'_0==1?"selected":null'},p:[44,67,2567]}]},f:["Standard"]}]}]}]}," ",{t:4,f:[" ",{p:[49,4,2706],t:7,e:"table",f:[{p:[50,5,2719],t:7,e:"tr",f:[{p:[51,6,2730],t:7,e:"td",f:[{p:[51,10,2734],t:7,e:"b",f:["Processor Unit:"]}]},{p:[52,6,2763],t:7,e:"td",f:[{p:[52,10,2767],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "1"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==1?"selected":null'},p:[52,67,2824]}]},f:["Standard"]}]},{p:[53,6,2893],t:7,e:"td",f:[{p:[53,10,2897],t:7,e:"ui-button",a:{action:"hw_cpu",params:'{"cpu" : "2"}',state:[{t:2,x:{r:["data.hw_cpu"],s:'_0==2?"selected":null'},p:[53,67,2954]}]},f:["Advanced"]}]}]}," ",{p:[55,5,3033],t:7,e:"tr",f:[{p:[56,6,3044],t:7,e:"td",f:[{p:[56,10,3048],t:7,e:"b",f:["Tesla Relay:"]}]},{p:[57,6,3074],t:7,e:"td",f:[{p:[57,10,3078],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "0"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==0?"selected":null'},p:[57,71,3139]}]},f:["None"]}]},{p:[58,6,3206],t:7,e:"td",f:[{p:[58,10,3210],t:7,e:"ui-button",a:{action:"hw_tesla",params:'{"tesla" : "1"}',state:[{t:2,x:{r:["data.hw_tesla"],s:'_0==1?"selected":null'},p:[58,71,3271]}]},f:["Standard"]}]}]}]}],n:50,x:{r:["data.devtype"],s:"_0!=2"},p:[48,3,2659]}," ",{p:[62,3,3374],t:7,e:"table",f:[{p:[63,4,3386],t:7,e:"tr",f:[{p:[64,5,3396],t:7,e:"td",f:[{p:[64,9,3400],t:7,e:"b",f:["Confirm Order:"]}]},{p:[65,5,3427],t:7,e:"td",f:[{p:[65,9,3431],t:7,e:"ui-button",a:{action:"confirm_order"},f:["CONFIRM"]}]}]}]}," ",{p:[69,2,3512],t:7,e:"hr"}," ",{p:[70,2,3519],t:7,e:"b",f:["Battery"]}," allows your device to operate without external utility power source. Advanced batteries increase battery life.",{p:[70,127,3644],t:7,e:"br"}," ",{p:[71,2,3651],t:7,e:"b",f:["Hard Drive"]}," stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.",{p:[71,130,3779],t:7,e:"br"}," ",{p:[72,2,3786],t:7,e:"b",f:["Network Card"]}," allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts.",{p:[72,233,4017],t:7,e:"br"}," ",{p:[73,2,4024],t:7,e:"b",f:["Processor Unit"]}," is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.",{p:[73,208,4230],t:7,e:"br"}," ",{p:[74,2,4237],t:7,e:"b",f:["Tesla Relay"]}," is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source. This component is currently unavailable on tablet computers due to size restrictions.",{p:[74,246,4481],t:7,e:"br"}," ",{p:[75,2,4488],t:7,e:"b",f:["Nano Printer"]}," is device that allows for various paperwork manipulations, such as, scanning of documents or printing new ones. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.",{p:[75,241,4727],t:7,e:"br"}," ",{p:[76,2,4734],t:7,e:"b",f:["Card Reader"]}," adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards."]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&(_0==2)"},f:[" ",{p:[79,2,4981],t:7,e:"h2",f:["Step 3: Payment"]}," ",{p:[80,2,5008],t:7,e:"b",f:["Your device is now ready for fabrication.."]},{p:[80,51,5057],t:7,e:"br"}," ",{p:[81,2,5064],t:7,e:"i",f:["Please ensure the required amount of credits are in the machine, then press purchase."]},{p:[81,94,5156],t:7,e:"br"}," ",{p:[82,2,5163],t:7,e:"i",f:["Current credits: ",{p:[82,22,5183],t:7,e:"b",f:[{t:2,r:"data.credits",p:[82,25,5186]},"C"]}]},{p:[82,50,5211],t:7,e:"br"}," ",{p:[83,2,5218],t:7,e:"i",f:["Total price: ",{p:[83,18,5234],t:7,e:"b",f:[{t:2,r:"data.totalprice",p:[83,21,5237]},"C"]}]},{p:[83,49,5265],t:7,e:"br"},{p:[83,53,5269],t:7,e:"br"}," ",{p:[84,2,5276],t:7,e:"ui-button",a:{action:"purchase",state:[{t:2,x:{r:["data.credits","data.totalprice"],s:'_0>=_1?null:"disabled"'},p:[84,38,5312]}]},f:["PURCHASE"]}]},{t:4,n:50,x:{r:["data.state"],s:"(!(_0==1))&&((!(_0==2))&&(_0==3))"},f:[" ",{p:[87,2,5423],t:7,e:"h2",f:["Step 4: Thank you for your purchase"]},{p:[87,46,5467],t:7,e:"br"}," ",{p:[88,2,5474],t:7,e:"b",f:["Should you experience any issues with your new device, contact your local network admin for assistance."]}]}],x:{r:["data.state"],s:"_0==0"}}]},e.exports=a.extend(r.exports)},{205:205}],244:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],245:[function(t,e,n){var a=t(205),r={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"}}}}}(r),r.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=a.extend(r.exports)},{205:205}],246:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",a:{label:"State"},f:[{t:4,f:[{p:[4,4,76],t:7,e:"span",a:{"class":"good"},f:["Ready"]}],n:50,r:"data.full_pressure",p:[3,3,45]},{t:4,n:51,f:[{t:4,f:[{p:[7,5,153],t:7,e:"span",a:{"class":"bad"},f:["Power Disabled"]}],n:50,r:"data.panel_open",p:[6,4,124]},{t:4,n:51,f:[{t:4,f:[{p:[10,6,248],t:7,e:"span",a:{"class":"average"},f:["Pressurizing"]}],n:50,r:"data.pressure_charging",p:[9,5,211]},{t:4,n:51,f:[{p:[12,6,310],t:7,e:"span",a:{"class":"bad"},f:["Off"]}],r:"data.pressure_charging"}],r:"data.panel_open"}],r:"data.full_pressure"}]}," ",{p:[17,2,393],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[18,3,426],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.per",p:[18,36,459]}],state:"good"},f:[{t:2,r:"data.per",p:[18,63,486]},"%"]}]}," ",{p:[20,5,530],t:7,e:"ui-section",a:{label:"Handle"},f:[{p:[21,9,567],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.flush"],s:'_0?"toggle-on":"toggle-off"'},p:[22,10,589]}],state:[{t:2,x:{r:["data.isai","data.panel_open"],s:'_0||_1?"disabled":null'},p:[23,11,647]}],action:[{t:2,x:{r:["data.flush"],s:'_0?"handle-0":"handle-1"'},p:[24,12,714]}]},f:[{t:2,x:{r:["data.flush"],s:'_0?"Disengage":"Engage"'},p:[25,5,763]}]}]}," ",{p:[27,2,837],t:7,e:"ui-section",a:{label:"Eject"},f:[{p:[28,3,867],t:7,e:"ui-button",a:{icon:"sign-out",state:[{t:2,x:{r:["data.isai"],s:'_0?"disabled":null'},p:[28,37,901]}],action:"eject"},f:["Eject Contents"]},{p:[28,114,978],t:7,e:"br"}]}," ",{p:[30,2,1002],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[31,3,1032],t:7,e:"ui-button",a:{icon:"power-off",state:[{t:2,x:{r:["data.panel_open"],s:'_0?"disabled":null'},p:[31,38,1067]}],action:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"pump-0":"pump-1"'},p:[31,87,1116]}],style:[{t:2,x:{r:["data.pressure_charging"],s:'_0?"selected":null'},p:[31,145,1174]}]}},{p:[31,206,1235],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],247:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"DNA Vault Database"},f:[{p:[2,3,43],t:7,e:"ui-section",a:{label:"Human DNA"},f:[{p:[3,7,81],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.dna_max",p:[3,28,102]}],value:[{t:2,r:"data.dna",p:[3,53,127]}]},f:[{t:2,r:"data.dna",p:[3,67,141]},"/",{t:2,r:"data.dna_max",p:[3,80,154]}," Samples"]}]}," ",{p:[5,3,208],t:7,e:"ui-section",a:{label:"Plant Data"},f:[{p:[6,5,245],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.plants_max",p:[6,26,266]}],value:[{t:2,r:"data.plants",p:[6,54,294]}]},f:[{t:2,r:"data.plants",p:[6,71,311]},"/",{t:2,r:"data.plants_max",p:[6,87,327]}," Samples"]}]}," ",{p:[8,3,384],t:7,e:"ui-section",a:{label:"Animal Data"},f:[{p:[9,5,422],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.animals_max",p:[9,26,443]}],value:[{t:2,r:"data.animals",p:[9,55,472]}]},f:[{t:2,r:"data.animals",p:[9,73,490]},"/",{t:2,r:"data.animals_max",p:[9,90,507]}," Samples"]}]}]}," ",{t:4,f:[{p:[13,1,616],t:7,e:"ui-display",a:{title:"Personal Gene Therapy"},f:[{p:[14,3,663],t:7,e:"ui-section",f:[{p:[15,2,678],t:7,e:"span",f:["Applicable gene therapy treatments:"]}]}," ",{p:[17,3,747],t:7,e:"ui-section",f:[{p:[18,2,762],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceA",p:[18,47,807]},'"}']},f:[{t:2,r:"data.choiceA",p:[18,67,827]}]}," ",{p:[19,2,858],t:7,e:"ui-button",a:{action:"gene",params:['{"choice": "',{t:2,r:"data.choiceB",p:[19,47,903]},'"}']},f:[{t:2,r:"data.choiceB",p:[19,67,923]}]}]}]}],n:50,x:{r:["data.completed","data.used"],s:"_0&&!_1"},p:[12,1,578]}]},e.exports=a.extend(r.exports)},{205:205}],248:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,24],t:7,e:"ui-display",a:{title:[{t:2,r:"data.question",p:[2,21,42]}]},f:[{p:[3,5,66],t:7,e:"ui-section",f:[{t:4,f:[{p:[5,9,118],t:7,e:"ui-button",a:{action:"vote",params:['{"answer": "',{t:2,r:"answer",p:[6,45,174]},'"}'],style:[{t:2,x:{r:["selected"],s:'_0?"selected":null'},p:[7,18,206]}]},f:[{t:2,r:"answer",p:[7,53,241]}," (",{t:2,r:"amount",p:[7,65,253]},")"]}],n:52,r:"data.answers",p:[4,7,86]}]}]}],n:50,r:"data.shaking",p:[1,1,0]},{t:4,n:51,f:[{p:[13,3,353],t:7,e:"ui-notice",f:["The eightball is not currently being shaken."]}],r:"data.shaking"}]},e.exports=a.extend(r.exports)},{205:205}],249:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],250:[function(t,e,n){var a=t(205),r={exports:{}};r.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:"Message"},f:[{t:2,r:"data.hidden_message",p:[3,5,50]}]}," ",{p:[5,3,94],t:7,e:"ui-section",a:{label:"Created On"},f:[{t:2,r:"data.realdate",p:[6,5,131]}]}," ",{p:[8,3,169],t:7,e:"ui-section",a:{label:"Approval"},f:[{p:[9,5,204],t:7,e:"ui-button",a:{icon:"arrow-up",state:[{t:2,x:{r:["data.is_creator","data.has_liked"],s:'_0?"disabled":_1?"selected":null'},p:[11,14,252]}],action:"like"},f:[{t:2,r:"data.num_likes",p:[12,21,344]}]}," ",{p:[13,5,380],t:7,e:"ui-button",a:{icon:"circle",state:[{t:2,x:{r:["data.is_creator","data.has_liked","data.has_disliked"],s:'_0?"disabled":!_1&&!_2?"selected":null'},p:[15,14,426]}],action:"neutral"}}," ",{p:[17,5,562],t:7,e:"ui-button",a:{icon:"arrow-down",state:[{t:2,x:{r:["data.is_creator","data.has_disliked"],s:'_0?"disabled":_1?"selected":null'},p:[19,14,612]}],action:"dislike"},f:[{t:2,r:"data.num_dislikes",p:[20,24,710]}]}]}]}," ",{t:4,f:[{p:[24,3,805],t:7,e:"ui-display",a:{title:"Admin Panel"},f:[{p:[25,5,843],t:7,e:"ui-section",a:{label:"Creator Ckey"},f:[{t:2,r:"data.creator_key",p:[25,38,876]}]}," ",{p:[26,5,915],t:7,e:"ui-section",a:{label:"Creator Character Name"},f:[{t:2,r:"data.creator_name",p:[26,48,958]}]}," ",{p:[27,5,998],t:7,e:"ui-button",a:{icon:"remove",action:"delete",style:"danger"},f:["Delete"]}]}],n:50,r:"data.admin_mode",p:[23,1,778]}]},e.exports=a.extend(r.exports)},{205:205}],251:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],252:[function(t,e,n){var a=t(205),r={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"}}}}}(r),r.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=a.extend(r.exports)},{205:205}],253:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[2,1,31],t:7,e:"ui-section",a:{label:"Power"},f:[{p:[3,2,60],t:7,e:"ui-button",a:{icon:"power-off",style:[{t:2,x:{r:["data.power"],s:'_0?"selected":"danger"'},p:[3,37,95]}],action:"power"},f:[{t:2,x:{r:["data.power"],s:'_0?"Enabled":"Disabled"'},p:[3,92,150]}]}]}," ",{p:[5,1,218],t:7,e:"ui-section",a:{label:"Tag"},f:[{p:[6,2,245],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:[{t:2,r:"data.tag",p:[6,43,286]}]}]}," ",{p:[8,1,327],t:7,e:"ui-section",a:{label:"Scanning mode"},f:[{p:[9,2,364],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.updating"],s:'_0?"unlock":"lock"'},p:[9,18,380]}],style:[{t:2,x:{r:["data.updating"],s:'_0?null:"danger"'},p:[9,63,425]}],action:"updating",tooltip:"Toggle between automatic scanning or scan only when a button is pressed.","tooltip-side":"right"},f:[{t:2,x:{r:["data.updating"],s:'_0?"AUTO":"MANUAL"'},p:[9,221,583]}]}]}," ",{p:[11,1,649],t:7,e:"ui-section",a:{label:"Detection range"},f:[{p:[12,2,688],t:7,e:"ui-button",a:{icon:"refresh",style:[{t:2,x:{r:["data.globalmode"],s:'_0?null:"selected"'},p:[12,35,721]}],action:"globalmode",tooltip:"Local sector or whole region scanning.","tooltip-side":"right"},f:[{t:2,x:{r:["data.globalmode"],s:'_0?"MAXIMUM":"LOCAL"'},p:[12,165,851]}]}]}]}," ",{t:4,f:[{p:[16,2,957],t:7,e:"ui-display",a:{title:"Current Location"},f:[{p:[17,3,998],t:7,e:"span",f:[{t:2,r:"data.current",p:[17,9,1004]}]}]}," ",{p:[20,2,1048],t:7,e:"ui-display",a:{title:"Detected Signals"},f:[{t:4,f:[{p:[22,3,1114],t:7,e:"ui-section",a:{label:[{t:2,r:"entrytag",p:[22,21,1132]}]},f:[{p:[23,3,1149],t:7,e:"span",f:[{t:2,r:"area",p:[23,9,1155]}," (",{t:2,r:"coord",p:[23,19,1165]},")"]}," ",{t:4,f:[{p:[25,4,1209],t:7,e:"span",f:["Dist: ",{t:2,r:"dist",p:[25,16,1221]},"m Dir: ",{t:2,r:"degrees",p:[25,31,1236]},"° (",{t:2,r:"direction",p:[25,45,1250]},")"]}],n:50,r:"direction",p:[24,3,1187]}]}],n:52,r:"data.signals",p:[21,2,1088]}]}],n:50,r:"data.power",p:[15,1,936]}]},e.exports=a.extend(r.exports)},{205:205}],254:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Labor Camp Teleporter"},f:[{p:[2,2,45],t:7,e:"ui-section",a:{label:"Teleporter Status"},f:[{p:[3,3,87],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.teleporter"],s:'_0?"good":"bad"'},p:[3,16,100]}]},f:[{t:2,x:{r:["data.teleporter"],s:'_0?"Connected":"Not connected"'},p:[3,54,138]}]}]}," ",{t:4,f:[{p:[6,4,244],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[7,5,279],t:7,e:"span",f:[{t:2,r:"data.teleporter_location",p:[7,11,285]}]}]}," ",{p:[9,4,343],t:7,e:"ui-section",a:{label:"Locked status"},f:[{p:[10,5,383],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"lock":"unlock"'},p:[10,22,400]}],action:"teleporter_lock"},f:[{t:2,x:{r:["data.teleporter_lock"],s:'_0?"Locked":"Unlocked"'},p:[10,93,471]}]}," ",{p:[11,5,537],t:7,e:"ui-button",a:{action:"toggle_open"},f:[{t:2,x:{r:["data.teleporter_state_open"],s:'_0?"Open":"Closed"'},p:[11,37,569]}]}]}],n:50,r:"data.teleporter",p:[5,3,216]},{t:4,n:51,f:[{p:[14,4,666],t:7,e:"span",f:[{p:[14,10,672],t:7,e:"ui-button",a:{action:"scan_teleporter"},f:["Scan Teleporter"]}]}],r:"data.teleporter"}]}," ",{p:[17,1,770],t:7,e:"ui-display",a:{title:"Labor Camp Beacon"},f:[{p:[18,2,811],t:7,e:"ui-section",a:{label:"Beacon Status"},f:[{p:[19,3,849],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.beacon"],s:'_0?"good":"bad"'},p:[19,16,862]}]},f:[{t:2,x:{r:["data.beacon"],s:'_0?"Connected":"Not connected"'},p:[19,50,896]}]}]}," ",{t:4,f:[{p:[22,3,992],t:7,e:"ui-section",a:{label:"Location"},f:[{p:[23,4,1026],t:7,e:"span",f:[{t:2,r:"data.beacon_location",p:[23,10,1032]}]}]}],n:50,r:"data.beacon",p:[21,2,969]},{t:4,n:51,f:[{p:[26,4,1097],t:7,e:"span",f:[{p:[26,10,1103],t:7,e:"ui-button",a:{action:"scan_beacon"},f:["Scan Beacon"]}]}],r:"data.beacon"}]}," ",{p:[29,1,1193],t:7,e:"ui-display",a:{title:"Prisoner details"},f:[{p:[30,2,1233],t:7,e:"ui-section",a:{label:"Prisoner ID"},f:[{p:[31,3,1269],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[31,33,1299]}]}]}," ",{t:4,f:[{p:[34,2,1392],t:7,e:"ui-section",a:{label:"Set ID goal"},f:[{p:[35,4,1429],t:7,e:"ui-button",a:{action:"set_goal"},f:[{t:2,r:"data.goal",p:[35,33,1458]}]}]}],n:50,r:"data.id",p:[33,2,1374]}," ",{p:[38,2,1512],t:7,e:"ui-section",a:{label:"Occupant"},f:[{p:[39,3,1545],t:7,e:"span",f:[{t:2,x:{r:["data.prisoner.name"],s:'_0?_0:"No Occupant"'},p:[39,9,1551]}]}]}," ",{t:4,f:[{p:[42,3,1661],t:7,e:"ui-section",a:{label:"Criminal Status"},f:[{p:[43,4,1702],t:7,e:"span",f:[{t:2,r:"data.prisoner.crimstat",p:[43,10,1708]}]}]}],n:50,r:"data.prisoner",p:[41,2,1636]}]}," ",{p:[47,1,1785],t:7,e:"ui-display",f:[{p:[48,2,1800],t:7,e:"center",f:[{p:[48,10,1808],t:7,e:"ui-button",a:{action:"teleport",state:[{t:2,x:{r:["data.can_teleport"],s:'_0?null:"disabled"'},p:[48,45,1843]}]},f:["Process Prisoner"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],255:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"center",f:[{p:[2,10,23],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[2,40,53]}]}]}]}," ",{p:[4,1,135],t:7,e:"ui-display",a:{title:"Stored Items"},f:[{t:4,f:[{p:[6,3,194],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[6,22,213]}]},f:[{p:[7,4,228],t:7,e:"ui-button",a:{action:"release_items",params:['{"mobref":',{t:2, + r:"mob",p:[7,56,280]},"}"],state:[{t:2,x:{r:["data.can_reclaim"],s:'_0?null:"disabled"'},p:[7,72,296]}]},f:["Drop Items"]}]}],n:52,r:"data.mobs",p:[5,2,171]}]}]},e.exports=a.extend(r.exports)},{205:205}],256:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,70],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.emagged"],s:'_0?"un":null'},p:[3,20,87]},"lock"],state:[{t:2,x:{r:["data.can_toggle_safety"],s:'_0?null:"disabled"'},p:[3,63,130]}],action:"safety"},f:["Safeties: ",{p:[4,14,209],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.emagged"],s:'_0?"bad":"good"'},p:[4,27,222]}]},f:[{t:2,x:{r:["data.emagged"],s:'_0?"OFF":"ON"'},p:[4,62,257]}]}]}]},t:7,e:"ui-display",a:{title:"Default Programs",button:0},f:[" ",{t:4,f:[{p:[8,2,363],t:7,e:"ui-button",a:{action:"load_program",params:['{"type": ',{t:2,r:"type",p:[8,52,413]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[8,70,431]}]},f:[{t:2,r:"name",p:[9,5,483]}," "]},{p:[10,14,506],t:7,e:"br"}],n:52,r:"data.default_programs",p:[7,2,329]}]}," ",{t:4,f:[{p:[14,2,562],t:7,e:"ui-display",a:{title:"Dangerous Programs"},f:[{t:4,f:[{p:[16,4,638],t:7,e:"ui-button",a:{icon:"warning",action:"load_program",params:['{"type": ',{t:2,r:"type",p:[16,69,703]},"}"],style:[{t:2,x:{r:["data.program","type"],s:'_0==_1?"selected":null'},p:[16,87,721]}]},f:[{t:2,r:"name",p:[17,5,773]}," "]},{p:[18,16,798],t:7,e:"br"}],n:52,r:"data.emag_programs",p:[15,3,605]}]}],n:50,r:"data.emagged",p:[13,1,539]}]},e.exports=a.extend(r.exports)},{205:205}],257:[function(t,e,n){var a=t(205),r={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"}}}}}(r),r.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]}]}]}],n:50,r:"data.occupied",p:[19,3,439]}]}," ",{p:[25,1,680],t:7,e:"ui-display",a:{title:"Controls"},f:[{p:[26,2,712],t:7,e:"ui-section",a:{label:"Door"},f:[{p:[27,5,743],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.open"],s:'_0?"unlock":"lock"'},p:[27,22,760]}],action:"door"},f:[{t:2,x:{r:["data.open"],s:'_0?"Open":"Closed"'},p:[27,71,809]}]}]}," ",{p:[29,3,874],t:7,e:"ui-section",a:{label:"Uses"},f:[{t:2,r:"data.ready_implants",p:[30,5,905]}," ",{t:4,f:[{p:[32,7,969],t:7,e:"span",a:{"class":"fa fa-cog fa-spin"}}],n:50,r:"data.replenishing",p:[31,5,936]}]}," ",{p:[35,3,1036],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[36,7,1073],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.occupied","data.ready_implants","data.ready"],s:'_0&&_1>0&&_2?null:"disabled"'},p:[36,25,1091]}],action:"implant"},f:[{t:2,x:{r:["data.ready","data.special_name"],s:'_0?(_1?_1:"Implant"):"Recharging"'},p:[37,9,1198]}," "]},{p:[38,19,1302],t:7,e:"br"}]}]}]},e.exports=a.extend(r.exports)},{205:205}],258:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.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.isDead"],s:'_0?"disabled":null'},p:[22,38,510]}],action:"wipe"},f:[{t:2,x:{r:["data.wiping"],s:'_0?"Stop Wiping":"Wipe"'},p:[22,89,561]}," 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,672],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[27,9,709],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"bad":"good"'},p:[27,22,722]}]},f:[{t:2,x:{r:["data.isDead","data.isBraindead"],s:'_0||_1?"Offline":"Operational"'},p:[27,76,776]}]}]}," ",{p:[29,5,871],t:7,e:"ui-section",a:{label:"Software Integrity"},f:[{p:[30,7,918],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[30,40,951]}],state:[{t:2,r:"healthState",p:[30,64,975]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[30,81,992]},"%"]}]}," ",{p:[32,5,1055],t:7,e:"ui-section",a:{label:"Laws"},f:[{t:4,f:[{p:[34,9,1117],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[34,33,1141]}]},{p:[34,45,1153],t:7,e:"br"}],n:52,r:"data.laws",p:[33,7,1088]}]}," ",{p:[37,5,1200],t:7,e:"ui-section",a:{label:"Settings"},f:[{p:[38,7,1237],t:7,e:"ui-button",a:{icon:"signal",style:[{t:2,x:{r:["data.wireless"],s:'_0?"selected":null'},p:[38,39,1269]}],action:"wireless"},f:["Wireless Activity"]}," ",{p:[39,7,1363],t:7,e:"ui-button",a:{icon:"microphone",style:[{t:2,x:{r:["data.radio"],s:'_0?"selected":null'},p:[39,43,1399]}],action:"radio"},f:["Subspace Radio"]}]}],n:50,r:"data.name",p:[25,3,649]}]}]},e.exports=a.extend(r.exports)},{205:205}],259:[function(t,e,n){var a=t(205),r={exports:{}};r.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"]}," ",{p:[13,5,572],t:7,e:"ui-button",a:{icon:"warning",state:"null",action:"bsa_unlock"},f:["Bluespace Artillery Unlock"]}],r:"data.auth_required"}]}]}],r:"data.waiting"}]},e.exports=a.extend(r.exports)},{205:205}],260:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Ore values"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"ui-section",a:{label:[{t:2,r:"ore",p:[3,22,76]}]},f:[{p:[4,4,90],t:7,e:"span",f:[{t:2,r:"value",p:[4,10,96]}]}]}],n:52,r:"data.ores",p:[2,2,34]}]}," ",{p:[8,1,158],t:7,e:"ui-display",a:{title:"Points"},f:[{p:[9,2,188],t:7,e:"ui-section",a:{label:"ID"},f:[{p:[10,3,215],t:7,e:"ui-button",a:{action:"handle_id"},f:[{t:2,x:{r:["data.id","data.id_name"],s:'_0?_1:"-------------"'},p:[10,33,245]}]}]}," ",{t:4,f:[{p:[13,3,339],t:7,e:"ui-section",a:{label:"Points collected"},f:[{p:[14,4,381],t:7,e:"span",f:[{t:2,r:"data.points",p:[14,10,387]}]}]}," ",{p:[16,3,430],t:7,e:"ui-section",a:{label:"Goal"},f:[{p:[17,4,460],t:7,e:"span",f:[{t:2,r:"data.goal",p:[17,10,466]}]}]}," ",{p:[19,3,507],t:7,e:"ui-section",a:{label:"Unclaimed points"},f:[{p:[20,4,549],t:7,e:"span",f:[{t:2,r:"data.unclaimed_points",p:[20,10,555]}]}," ",{p:[21,4,592],t:7,e:"ui-button",a:{action:"claim_points",state:[{t:2,x:{r:["data.unclaimed_points"],s:'_0?null:"disabled"'},p:[21,43,631]}]},f:["Claim points"]}]}],n:50,r:"data.id",p:[12,2,320]}]}," ",{p:[25,1,745],t:7,e:"ui-display",f:[{p:[26,2,760],t:7,e:"center",f:[{p:[27,3,772],t:7,e:"ui-button",a:{action:"move_shuttle",state:[{t:2,x:{r:["data.can_go_home"],s:'_0?null:"disabled"'},p:[27,42,811]}]},f:["Move shuttle"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],261:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Known Languages"},f:[{t:4,f:[{p:[3,5,70],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[3,23,88]}]},f:[{p:[4,7,105],t:7,e:"span",f:[{t:2,r:"desc",p:[4,13,111]}]}," ",{p:[5,7,134],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[5,19,146]}]}," ",{t:4,f:[{p:[7,9,192],t:7,e:"span",f:["(gained from mob)"]}],n:50,r:"shadow",p:[6,7,168]}," ",{p:[9,7,245],t:7,e:"span",f:[{t:2,x:{r:["can_speak"],s:'_0?"Can Speak":"Cannot Speak"'},p:[9,13,251]}]}," ",{t:4,f:[{p:[11,9,342],t:7,e:"ui-button",a:{action:"select_default",params:['{"language_name":"',{t:2,r:"name",p:[13,37,425]},'"}'],style:[{t:2,x:{r:["is_default","can_speak"],s:'_0?"selected":_1?null:"disabled"'},p:[14,18,455]}]},f:[{t:2,x:{r:["is_default"],s:'_0?"Default Language":"Select as Default"'},p:[15,10,526]}]}],n:50,r:"data.is_living",p:[10,7,310]}," ",{t:4,f:[{t:4,f:[{p:[20,11,685],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[20,72,746]},'"}']},f:["Grant"]}],n:50,r:"shadow",p:[19,9,659]},{t:4,n:51,f:[{p:[22,11,805],t:7,e:"ui-button",a:{action:"remove_language",params:['{"language_name":"',{t:2,r:"name",p:[22,73,867]},'"}']},f:["Remove"]}],r:"shadow"}],n:50,r:"data.admin_mode",p:[18,7,626]}]}],n:52,r:"data.languages",p:[2,3,40]}]}," ",{t:4,f:[{t:4,f:[{p:[30,5,1033],t:7,e:"ui-button",a:{action:"toggle_omnitongue",style:[{t:2,x:{r:["data.omnitongue"],s:'_0?"selected":null'},p:[32,14,1092]}]},f:["Omnitongue ",{t:2,x:{r:["data.omnitongue"],s:'_0?"Enabled":"Disabled"'},p:[33,19,1152]}]}],n:50,r:"data.is_living",p:[29,3,1005]}," ",{p:[36,3,1231],t:7,e:"ui-display",a:{title:"Unknown Languages"},f:[{t:4,f:[{p:[38,7,1315],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[38,25,1333]}]},f:[{p:[39,9,1352],t:7,e:"span",f:[{t:2,r:"desc",p:[39,15,1358]}]}," ",{p:[40,9,1383],t:7,e:"span",f:["Key: ,",{t:2,r:"key",p:[40,21,1395]}]}," ",{p:[41,9,1419],t:7,e:"ui-button",a:{action:"grant_language",params:['{"language_name":"',{t:2,r:"name",p:[43,37,1502]},'"}']},f:["Grant"]}]}],n:52,r:"data.unknown_languages",p:[37,5,1275]}]}],n:50,r:"data.admin_mode",p:[28,1,978]}]},e.exports=a.extend(r.exports)},{205:205}],262:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Controls"},f:[{t:4,f:[{t:4,f:[{p:[4,4,84],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[5,5,118],t:7,e:"span",f:["Launchpad closed."]}]}],n:50,r:"data.pad_closed",p:[3,3,56]},{t:4,n:51,f:[{p:[8,4,183],t:7,e:"ui-section",a:{label:"Launchpad"},f:[{p:[9,4,218],t:7,e:"span",f:[{p:[9,10,224],t:7,e:"b",f:[{t:2,r:"data.pad_name",p:[9,13,227]}]}]},{p:[9,41,255],t:7,e:"br"}," ",{p:[10,4,264],t:7,e:"ui-button",a:{icon:"pencil",action:"rename"},f:["Rename"]}," ",{p:[11,4,328],t:7,e:"ui-button",a:{icon:"remove",style:"danger",action:"remove"},f:["Remove"]}]}," ",{p:[14,4,427],t:7,e:"ui-section",a:{label:"Set Target"},f:[{p:[15,4,463],t:7,e:"table",f:[{p:[16,4,475],t:7,e:"tr",f:[{p:[17,5,485],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[17,38,518],t:7,e:"ui-button",a:{action:"up-left"},f:["↖"]}]}," ",{p:[18,5,570],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[18,57,622],t:7,e:"ui-button",a:{action:"up"},f:["↑"]}]}," ",{p:[19,5,669],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[19,56,720],t:7,e:"ui-button",a:{action:"up-right"},f:["↗"]}]}]}," ",{p:[21,4,782],t:7,e:"tr",f:[{p:[22,5,792],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[22,38,825],t:7,e:"ui-button",a:{action:"left",style:"width:35px!important"},f:["←"]}]}," ",{p:[23,5,903],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[23,57,955],t:7,e:"ui-button",a:{action:"reset"},f:["R"]}]}," ",{p:[24,5,1005],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[24,56,1056],t:7,e:"ui-button",a:{action:"right"},f:["→"]}]}]}," ",{p:[26,4,1115],t:7,e:"tr",f:[{p:[27,5,1125],t:7,e:"td",a:{style:"width:25px!important"},f:[{p:[27,38,1158],t:7,e:"ui-button",a:{action:"down-left"},f:["↙"]}]}," ",{p:[28,5,1212],t:7,e:"td",a:{style:"width:25px!important; text-align:center"},f:[{p:[28,57,1264],t:7,e:"ui-button",a:{action:"down"},f:["↓"]}]}," ",{p:[29,5,1313],t:7,e:"td",a:{style:"width:25px!important; text-align:right"},f:[{p:[29,56,1364],t:7,e:"ui-button",a:{action:"down-right"},f:["↘"]}]}]}]}]}," ",{p:[33,4,1459],t:7,e:"ui-section",a:{label:"Current Target"},f:[{p:[34,5,1500],t:7,e:"span",f:[{t:2,r:"data.abs_y",p:[34,11,1506]}," ",{t:2,r:"data.north_south",p:[34,26,1521]}]},{p:[34,53,1548],t:7,e:"br"}," ",{p:[35,5,1558],t:7,e:"span",f:[{t:2,r:"data.abs_x",p:[35,11,1564]}," ",{t:2,r:"data.east_west",p:[35,26,1579]}]}]}," ",{p:[37,4,1627],t:7,e:"ui-section",a:{label:"Activate"},f:[{p:[38,5,1662],t:7,e:"ui-button",a:{action:"launch",tooltip:"Teleport everything on the pad to the target.","tooltip-side":"down"},f:["Launch"]}," ",{p:[39,5,1789],t:7,e:"ui-button",a:{action:"pull",tooltip:"Teleport everything from the target to the pad.","tooltip-side":"down"},f:["Pull"]}]}],r:"data.pad_closed"}],n:50,r:"data.has_pad",p:[2,2,32]},{t:4,n:51,f:[{p:[45,3,1956],t:7,e:"ui-section",a:{label:"Warning"},f:[{p:[46,4,1989],t:7,e:"span",f:["No launchpad found. Link the remote to a launchpad."]}]}],r:"data.has_pad"}]}]},e.exports=a.extend(r.exports)},{205:205}],263:[function(t,e,n){var a=t(205),r={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"}}}}(r),r.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=a.extend(r.exports)},{205:205}],264:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],265:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Relay"},f:[{t:4,f:[{p:[3,3,57],t:7,e:"h2",f:["NETWORK BUFFERS OVERLOADED"]}," ",{p:[4,3,96],t:7,e:"h3",f:["Overload Recovery Mode"]}," ",{p:[5,3,131],t:7,e:"i",f:["This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue."]}," ",{p:[6,3,484],t:7,e:"h3",f:["ADMINISTRATIVE OVERRIDE"]}," ",{p:[7,3,520],t:7,e:"b",f:["CAUTION - Data loss may occur"]}," ",{p:[8,3,562],t:7,e:"ui-button",a:{icon:"signal",action:"restart"},f:["Purge buffered traffic"]}],n:50,r:"data.dos_crashed",p:[2,2,29]},{t:4,n:51,f:[{p:[12,3,663],t:7,e:"ui-section",a:{label:"Relay status"},f:[{p:[13,4,701],t:7,e:"ui-button",a:{icon:"power-off",action:"toggle"},f:[{t:2,x:{r:["data.enabled"],s:'_0?"ENABLED":"DISABLED"'},p:[14,6,752]}]}]}," ",{p:[18,3,836],t:7,e:"ui-section",a:{label:"Network buffer status"},f:[{t:2,r:"data.dos_overload",p:[19,4,883]}," / ",{t:2,r:"data.dos_capacity",p:[19,28,907]}," GQ"]}],r:"data.dos_crashed"}]}]},e.exports=a.extend(r.exports)},{205:205}],266:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{healthState:function(){var t=this.get("data.health");return t>70?"good":t>50?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,320],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[18,3,363],t:7,e:"ui-notice",f:[{p:[19,5,380],t:7,e:"span",f:["Reconstruction in progress!"]}]}],n:50,r:"data.restoring",p:[17,1,337]},{p:[24,1,451],t:7,e:"ui-display",f:[{p:[26,1,467],t:7,e:"div",a:{"class":"item"},f:[{p:[27,3,489],t:7,e:"div",a:{"class":"itemLabel"},f:["Inserted AI:"]}," ",{p:[30,3,541],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[31,2,569],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",state:[{t:2,x:{r:["data.nocard"],s:'_0?"disabled":null'},p:[31,52,619]}]},f:[{t:2,x:{r:["data.name"],s:'_0?_0:"---"'},p:[31,89,656]}]}]}]}," ",{t:4,f:[{p:[36,2,744],t:7,e:"b",f:["ERROR: ",{t:2,r:"data.error",p:[36,12,754]}]}],n:50,r:"data.error",p:[35,1,723]},{t:4,n:51,f:[{p:[38,2,785],t:7,e:"h2",f:["System Status"]}," ",{p:[39,2,810],t:7,e:"div",a:{"class":"item"},f:[{p:[40,3,832],t:7,e:"div",a:{"class":"itemLabel"},f:["Current AI:"]}," ",{p:[43,3,885],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.name",p:[44,4,915]}]}," ",{p:[46,3,942],t:7,e:"div",a:{"class":"itemLabel"},f:["Status:"]}," ",{p:[49,3,991],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["Nonfunctional"],n:50,r:"data.isDead",p:[50,4,1021]},{t:4,n:51,f:["Functional"],r:"data.isDead"}]}," ",{p:[56,3,1114],t:7,e:"div",a:{"class":"itemLabel"},f:["System Integrity:"]}," ",{p:[59,3,1173],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[60,4,1203],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"data.health",p:[60,37,1236]}],state:[{t:2,r:"healthState",p:[61,11,1264]}]},f:[{t:2,x:{r:["adata.health"],s:"Math.round(_0)"},p:[61,28,1281]},"%"]}]}," ",{p:[63,3,1336],t:7,e:"div",a:{"class":"itemLabel"},f:["Active Laws:"]}," ",{p:[66,3,1390],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[67,4,1420],t:7,e:"table",f:[{t:4,f:[{p:[69,6,1462],t:7,e:"tr",f:[{p:[69,10,1466],t:7,e:"td",f:[{p:[69,14,1470],t:7,e:"span",a:{"class":"highlight"},f:[{t:2,r:".",p:[69,38,1494]}]}]}]}],n:52,r:"data.ai_laws",p:[68,5,1433]}]}]}," ",{p:[73,2,1547],t:7,e:"ui-section",a:{label:"Operations"},f:[{p:[74,3,1582],t:7,e:"ui-button",a:{icon:"plus",style:[{t:2,x:{r:["data.restoring"],s:'_0?"disabled":null'},p:[74,33,1612]}],action:"PRG_beginReconstruction"},f:["Begin Reconstruction"]}]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],267:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,1,91],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"home",params:'{"target" : "mod"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==1?"disabled":null'},p:[5,80,170]}]},f:["Access Modification"]}],n:50,r:"data.have_id_slot",p:[4,1,64]},{p:[7,1,253],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manage"}',state:[{t:2,x:{r:["data.mmode"],s:'_0==2?"disabled":null'},p:[7,90,342]}]},f:["Job Management"]}," ",{p:[8,1,411],t:7,e:"ui-button",a:{action:"PRG_switchm",icon:"folder-open",params:'{"target" : "manifest"}',state:[{t:2,x:{r:["data.mmode"],s:'!_0?"disabled":null'},p:[8,92,502]}]},f:["Crew Manifest"]}," ",{t:4,f:[{p:[10,1,593],t:7,e:"ui-button",a:{action:"PRG_print",icon:"print",state:[{t:2,x:{r:["data.has_id","data.mmode"],s:'!_1||_0&&_1==1?null:"disabled"'},p:[10,51,643]}]},f:["Print"]}],n:50,r:"data.have_printer",p:[9,1,566]},{t:4,f:[{p:[14,1,766],t:7,e:"div",a:{"class":"item"},f:[{p:[15,3,788],t:7,e:"h2",f:["Crew Manifest"]}," ",{p:[16,3,814],t:7,e:"br"},"Please use security record computer to modify entries.",{p:[16,61,872],t:7,e:"br"},{p:[16,65,876],t:7,e:"br"}]}," ",{t:4,f:[{p:[19,2,916],t:7,e:"div",a:{"class":"item"},f:[{t:2,r:"name",p:[20,2,937]}," - ",{t:2,r:"rank",p:[20,13,948]}]}],n:52,r:"data.manifest",p:[18,1,890]}],n:50,x:{r:["data.mmode"],s:"!_0"},p:[13,1,745]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.mmode"],s:"_0==2"},f:[{p:[25,1,1008],t:7,e:"div",a:{"class":"item"},f:[{p:[26,3,1030],t:7,e:"h2",f:["Job Management"]}]}," ",{p:[28,1,1063],t:7,e:"table",f:[{p:[29,1,1072],t:7,e:"tr",f:[{p:[29,5,1076],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,27,1098],t:7,e:"b",f:["Job"]}]},{p:[29,42,1113],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,64,1135],t:7,e:"b",f:["Slots"]}]},{p:[29,81,1152],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,103,1174],t:7,e:"b",f:["Open job"]}]},{p:[29,123,1194],t:7,e:"td",a:{style:"width:25%"},f:[{p:[29,145,1216],t:7,e:"b",f:["Close job"]}]}]}," ",{t:4,f:[{p:[32,2,1269],t:7,e:"tr",f:[{p:[32,6,1273],t:7,e:"td",f:[{t:2,r:"title",p:[32,10,1277]}]},{p:[32,24,1291],t:7,e:"td",f:[{t:2,r:"current",p:[32,28,1295]},"/",{t:2,r:"total",p:[32,40,1307]}]},{p:[32,54,1321],t:7,e:"td",f:[{p:[32,58,1325],t:7,e:"ui-button",a:{action:"PRG_open_job",params:['{"target" : "',{t:2,r:"title",p:[32,112,1379]},'"}'],state:[{t:2,x:{r:["status_open"],s:'_0?null:"disabled"'},p:[32,132,1399]}]},f:[{t:2,r:"desc_open",p:[32,169,1436]}]},{p:[32,194,1461],t:7,e:"br"}]},{p:[32,203,1470],t:7,e:"td",f:[{p:[32,207,1474],t:7,e:"ui-button",a:{action:"PRG_close_job",params:['{"target" : "',{t:2,r:"title",p:[32,262,1529]},'"}'],state:[{t:2,x:{r:["status_close"],s:'_0?null:"disabled"'},p:[32,282,1549]}]},f:[{t:2,r:"desc_close",p:[32,320,1587]}]}]}]}],n:52,r:"data.slots",p:[30,1,1244]}]}]},{t:4,n:50,x:{r:["data.mmode"],s:"!(_0==2)"},f:[" ",{p:[40,1,1665],t:7,e:"div",a:{"class":"item"},f:[{p:[41,3,1687],t:7,e:"h2",f:["Access Modification"]}]}," ",{t:4,f:[{p:[45,3,1751],t:7,e:"span",a:{"class":"alert"},f:[{p:[45,23,1771],t:7,e:"i",f:["Please insert the ID into the terminal to proceed."]}]},{p:[45,87,1835],t:7,e:"br"}],n:50,x:{r:["data.has_id"],s:"!_0"},p:[44,1,1727]},{p:[48,1,1852],t:7,e:"div",a:{"class":"item"},f:[{p:[49,3,1874],t:7,e:"div",a:{"class":"itemLabel"},f:["Target Identity:"]}," ",{p:[52,3,1930],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[53,2,1958],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "id"}'},f:[{t:2,r:"data.id_name",p:[53,72,2028]}]}]}]}," ",{p:[56,1,2076],t:7,e:"div",a:{"class":"item"},f:[{p:[57,3,2098],t:7,e:"div",a:{"class":"itemLabel"},f:["Auth Identity:"]}," ",{p:[60,3,2152],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[61,2,2180],t:7,e:"ui-button",a:{icon:"eject",action:"PRG_eject",params:'{"target" : "auth"}'},f:[{t:2,r:"data.auth_name",p:[61,74,2252]}]}]}]}," ",{p:[64,1,2302],t:7,e:"hr"}," ",{t:4,f:[{t:4,f:[{p:[68,2,2362],t:7,e:"div",a:{"class":"item"},f:[{p:[69,4,2385],t:7,e:"h2",f:["Details"]}]}," ",{t:4,f:[{p:[73,2,2436],t:7,e:"div",a:{"class":"item"},f:[{p:[74,4,2459],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[77,4,2518],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_owner",p:[78,3,2547]}]}]}," ",{p:[81,2,2587],t:7,e:"div",a:{"class":"item"},f:[{p:[82,4,2610],t:7,e:"div",a:{"class":"itemLabel"},f:["Rank:"]}," ",{p:[85,4,2658],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.id_rank",p:[86,3,2687]}]}]}," ",{p:[89,2,2726],t:7,e:"div",a:{"class":"item"},f:[{p:[90,4,2749],t:7,e:"div",a:{"class":"itemLabel"},f:["Demote:"]}," ",{p:[93,4,2799],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[94,3,2828],t:7,e:"ui-button",a:{action:"PRG_terminate",icon:"gear",state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Unassigned"?"disabled":null'},p:[94,56,2881]}]},f:["Demote ",{t:2,r:"data.id_owner",p:[94,117,2942]}]}]}]}],n:50,r:"data.minor",p:[72,2,2415]},{t:4,n:51,f:[{p:[99,2,3007],t:7,e:"div",a:{"class":"item"},f:[{p:[100,4,3030],t:7,e:"div",a:{"class":"itemLabel"},f:["Registered Name:"]}," ",{p:[103,4,3089],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[104,3,3118],t:7,e:"ui-button",a:{action:"PRG_edit",icon:"pencil",params:'{"name" : "1"}'},f:[{t:2,r:"data.id_owner",p:[104,70,3185]}]}]}]}," ",{p:[108,2,3239],t:7,e:"div",a:{"class":"item"},f:[{p:[109,4,3262],t:7,e:"h2",f:["Assignment"]}]}," ",{p:[111,3,3294],t:7,e:"ui-button",a:{action:"PRG_togglea",icon:"gear"},f:[{t:2,x:{r:["data.assignments"],s:'_0?"Hide assignments":"Show assignments"'},p:[111,47,3338]}]}," ",{p:[112,2,3415],t:7,e:"div",a:{"class":"item"},f:[{p:[113,4,3438],t:7,e:"span",a:{id:"allvalue.jobsslot"},f:[]}]}," ",{p:[117,2,3495],t:7,e:"div",a:{"class":"item"},f:[{t:4,f:[{p:[119,4,3547],t:7,e:"div",a:{id:"all-value.jobs"},f:[{p:[120,3,3576],t:7,e:"table",f:[{p:[121,5,3589],t:7,e:"tr",f:[{p:[122,4,3598],t:7,e:"th",f:["Command"]}," ",{p:[123,4,3619],t:7,e:"td",f:[{p:[124,6,3630],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Captain"}',state:[{t:2,x:{r:["data.id_rank"],s:'_0=="Captain"?"selected":null'},p:[124,83,3707]}]},f:["Captain"]}]}]}," ",{p:[127,5,3804],t:7,e:"tr",f:[{p:[128,4,3813],t:7,e:"th",f:["Special"]}," ",{p:[129,4,3834],t:7,e:"td",f:[{p:[130,6,3845],t:7,e:"ui-button",a:{action:"PRG_assign",params:'{"assign_target" : "Custom"}'},f:["Custom"]}]}]}," ",{p:[133,5,3959],t:7,e:"tr",f:[{p:[134,4,3968],t:7,e:"th",a:{style:"color: '#FFA500';"},f:["Engineering"]}," ",{p:[135,4,4019],t:7,e:"td",f:[{t:4,f:[{p:[137,5,4067],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[137,64,4126]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[137,82,4144]}]},f:[{t:2,r:"display_name",p:[137,127,4189]}]}],n:52,r:"data.engineering_jobs",p:[136,6,4030]}]}]}," ",{p:[141,5,4260],t:7,e:"tr",f:[{p:[142,4,4269],t:7,e:"th",a:{style:"color: '#008000';"},f:["Medical"]}," ",{p:[143,4,4316],t:7,e:"td",f:[{t:4,f:[{p:[145,5,4360],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[145,64,4419]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[145,82,4437]}]},f:[{t:2,r:"display_name",p:[145,127,4482]}]}],n:52,r:"data.medical_jobs",p:[144,6,4327]}]}]}," ",{p:[149,5,4553],t:7,e:"tr",f:[{p:[150,4,4562],t:7,e:"th",a:{style:"color: '#800080';"},f:["Science"]}," ",{p:[151,4,4609],t:7,e:"td",f:[{t:4,f:[{p:[153,5,4653],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[153,64,4712]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[153,82,4730]}]},f:[{t:2,r:"display_name",p:[153,127,4775]}]}],n:52,r:"data.science_jobs",p:[152,6,4620]}]}]}," ",{p:[157,5,4846],t:7,e:"tr",f:[{p:[158,4,4855],t:7,e:"th",a:{style:"color: '#DD0000';"},f:["Security"]}," ",{p:[159,4,4903],t:7,e:"td",f:[{t:4,f:[{p:[161,5,4948],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[161,64,5007]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[161,82,5025]}]},f:[{t:2,r:"display_name",p:[161,127,5070]}]}],n:52,r:"data.security_jobs",p:[160,6,4914]}]}]}," ",{p:[165,5,5141],t:7,e:"tr",f:[{p:[166,4,5150],t:7,e:"th",a:{style:"color: '#cc6600';" +-},f:["Cargo"]}," ",{p:[167,4,5195],t:7,e:"td",f:[{t:4,f:[{p:[169,5,5237],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[169,64,5296]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[169,82,5314]}]},f:[{t:2,r:"display_name",p:[169,127,5359]}]}],n:52,r:"data.cargo_jobs",p:[168,6,5206]}]}]}," ",{p:[173,5,5430],t:7,e:"tr",f:[{p:[174,4,5439],t:7,e:"th",a:{style:"color: '#808080';"},f:["Civilian"]}," ",{p:[175,4,5487],t:7,e:"td",f:[{t:4,f:[{p:[177,5,5532],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[177,64,5591]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[177,82,5609]}]},f:[{t:2,r:"display_name",p:[177,127,5654]}]}],n:52,r:"data.civilian_jobs",p:[176,6,5498]}]}]}," ",{t:4,f:[{p:[182,4,5757],t:7,e:"tr",f:[{p:[183,6,5768],t:7,e:"th",a:{style:"color: '#A52A2A';"},f:["Centcom"]}," ",{p:[184,6,5817],t:7,e:"td",f:[{t:4,f:[{p:[186,7,5862],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[186,66,5921]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[186,84,5939]}]},f:[{t:2,r:"display_name",p:[186,129,5984]}]}],n:52,r:"data.centcom_jobs",p:[185,5,5827]}]}]}],n:50,r:"data.centcom_access",p:[181,5,5725]}]}]}],n:50,r:"data.assignments",p:[118,4,3518]}]}],r:"data.minor"}," ",{t:4,f:[{p:[198,4,6153],t:7,e:"div",a:{"class":"item"},f:[{p:[199,3,6175],t:7,e:"h2",f:["Central Command"]}]}," ",{p:[201,4,6215],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[203,5,6296],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[204,5,6331],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[204,64,6390]},'", "allowed" : "',{t:2,r:"allowed",p:[204,87,6413]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[204,109,6435]}]},f:[{t:2,r:"desc",p:[204,140,6466]}]}]}],n:52,r:"data.all_centcom_access",p:[202,3,6257]}]}],n:50,r:"data.centcom_access",p:[197,2,6121]},{t:4,n:51,f:[{p:[209,4,6538],t:7,e:"div",a:{"class":"item"},f:[{p:[210,3,6560],t:7,e:"h2",f:[{t:2,r:"data.station_name",p:[210,7,6564]}]}]}," ",{p:[212,4,6606],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[214,5,6676],t:7,e:"div",a:{style:"float: left; width: 175px; min-height: 250px"},f:[{p:[215,4,6739],t:7,e:"div",a:{"class":"average"},f:[{p:[215,25,6760],t:7,e:"ui-button",a:{action:"PRG_regsel",state:[{t:2,x:{r:["selected"],s:'_0?"toggle":null'},p:[215,63,6798]}],params:['{"region" : "',{t:2,r:"regid",p:[215,116,6851]},'"}']},f:[{p:[215,129,6864],t:7,e:"b",f:[{t:2,r:"name",p:[215,132,6867]}]}]}]}," ",{p:[216,4,6902],t:7,e:"br"}," ",{t:4,f:[{p:[218,6,6938],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[219,5,6973],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[219,64,7032]},'", "allowed" : "',{t:2,r:"allowed",p:[219,87,7055]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[219,109,7077]}]},f:[{t:2,r:"desc",p:[219,140,7108]}]}]}],n:52,r:"accesses",p:[217,6,6913]}]}],n:52,r:"data.regions",p:[213,3,6648]}]}],r:"data.centcom_access"}],n:50,r:"data.has_id",p:[67,3,2340]}],n:50,r:"data.authenticated",p:[66,1,2310]}]}],x:{r:["data.mmode"],s:"!_0"}}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],268:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargeState:function(t){var e=this.get("data.battery.max");return t>e/2?"good":t>e/4?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,311],t:7,e:"ntosheader"}," ",{p:[17,1,328],t:7,e:"ui-display",f:[{p:[18,2,343],t:7,e:"i",f:["Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device."]},{p:[18,137,478],t:7,e:"hr"}," ",{p:[19,2,485],t:7,e:"ui-display",a:{title:"Power Supply"},f:[{p:[20,3,522],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"data.power_usage",p:[21,4,559]},"W"]}," ",{t:4,f:[{p:[25,4,630],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Active"]}," ",{p:[28,4,701],t:7,e:"ui-section",a:{label:"Battery Rating"},f:[{t:2,r:"data.battery.max",p:[29,5,742]}]}," ",{p:[31,4,785],t:7,e:"ui-section",a:{label:"Battery Charge"},f:[{p:[32,5,826],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.battery.max",p:[32,26,847]}],value:[{t:2,r:"adata.battery.charge",p:[32,56,877]}],state:[{t:2,x:{r:["chargeState","adata.battery.charge"],s:"_0(_1)"},p:[32,89,910]}]},f:[{t:2,x:{r:["adata.battery.charge"],s:"Math.round(_0)"},p:[32,128,949]},"/",{t:2,r:"adata.battery.max",p:[32,165,986]}]}]}],n:50,r:"data.battery",p:[24,3,605]},{t:4,n:51,f:[{p:[35,4,1051],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Not Available"]}],r:"data.battery"}]}," ",{p:[41,2,1156],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,3,1192],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,4,1231],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,25,1252]}],value:[{t:2,r:"adata.disk_used",p:[43,53,1280]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,87,1314]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,123,1350]},"GQ"]}]}]}," ",{p:[47,2,1419],t:7,e:"ui-display",a:{title:"Computer Components"},f:[{t:4,f:[{p:[49,4,1491],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[49,26,1513]}]},f:[{p:[50,5,1529],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"desc",p:[50,59,1583]}]}," ",{p:[52,5,1605],t:7,e:"ui-section",a:{label:"State"},f:[{p:[53,6,1638],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["critical"],s:'_0?"disabled":null'},p:[53,24,1656]}],action:"PC_toggle_component",params:['{"name": "',{t:2,r:"name",p:[53,105,1737]},'"}']},f:[{t:2,x:{r:["enabled"],s:'_0?"Enabled":"Disabled"'},p:[54,7,1757]}]}]}," ",{t:4,f:[{p:[59,6,1868],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"powerusage",p:[60,7,1908]},"W"]}],n:50,r:"powerusage",p:[58,5,1843]}]}," ",{p:[64,4,1985],t:7,e:"br"}],n:52,r:"data.hardware",p:[48,3,1463]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],269:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,3,103],t:7,e:"h2",f:["An error has occurred and this program can not continue."]}," Additional information: ",{t:2,r:"data.error",p:[8,27,196]},{p:[8,41,210],t:7,e:"br"}," ",{p:[9,3,218],t:7,e:"i",f:["Please try again. If the problem persists contact your system administrator for assistance."]}," ",{p:[10,3,320],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["Restart program"]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,f:[{p:[13,4,422],t:7,e:"h2",f:["Viewing file ",{t:2,r:"data.filename",p:[13,21,439]}]}," ",{p:[14,4,466],t:7,e:"div",a:{"class":"item"},f:[{p:[15,4,489],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["CLOSE"]}," ",{p:[16,4,545],t:7,e:"ui-button",a:{action:"PRG_edit"},f:["EDIT"]}," ",{p:[17,4,595],t:7,e:"ui-button",a:{action:"PRG_printfile"},f:["PRINT"]}," "]},{p:[18,10,657],t:7,e:"hr"}," ",{t:3,r:"data.filedata",p:[19,4,666]}],n:50,r:"data.filename",p:[12,3,396]},{t:4,n:51,f:[{p:[21,4,702],t:7,e:"h2",f:["Available files (local):"]}," ",{p:[22,4,740],t:7,e:"table",f:[{p:[23,5,753],t:7,e:"tr",f:[{p:[24,6,764],t:7,e:"th",f:["File name"]}," ",{p:[25,6,789],t:7,e:"th",f:["File type"]}," ",{p:[26,6,814],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[27,6,844],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[30,6,907],t:7,e:"tr",f:[{p:[31,7,919],t:7,e:"td",f:[{t:2,r:"name",p:[31,11,923]}]}," ",{p:[32,7,944],t:7,e:"td",f:[".",{t:2,r:"type",p:[32,12,949]}]}," ",{p:[33,7,970],t:7,e:"td",f:[{t:2,r:"size",p:[33,11,974]},"GQ"]}," ",{p:[34,7,997],t:7,e:"td",f:[{p:[35,8,1010],t:7,e:"ui-button",a:{action:"PRG_openfile",params:['{"name": "',{t:2,r:"name",p:[35,59,1061]},'"}']},f:["VIEW"]}," ",{p:[36,8,1098],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[36,26,1116]}],action:"PRG_deletefile",params:['{"name": "',{t:2,r:"name",p:[36,105,1195]},'"}']},f:["DELETE"]}," ",{p:[37,8,1234],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[37,26,1252]}],action:"PRG_rename",params:['{"name": "',{t:2,r:"name",p:[37,101,1327]},'"}']},f:["RENAME"]}," ",{p:[38,8,1366],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[38,26,1384]}],action:"PRG_clone",params:['{"name": "',{t:2,r:"name",p:[38,100,1458]},'"}']},f:["CLONE"]}," ",{t:4,f:[{p:[40,9,1531],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[40,27,1549]}],action:"PRG_copytousb",params:['{"name": "',{t:2,r:"name",p:[40,105,1627]},'"}']},f:["EXPORT"]}],n:50,r:"data.usbconnected",p:[39,8,1496]}]}]}],n:52,r:"data.files",p:[29,5,880]}]}," ",{t:4,f:[{p:[47,4,1761],t:7,e:"h2",f:["Available files (portable device):"]}," ",{p:[48,4,1809],t:7,e:"table",f:[{p:[49,5,1822],t:7,e:"tr",f:[{p:[50,6,1833],t:7,e:"th",f:["File name"]}," ",{p:[51,6,1858],t:7,e:"th",f:["File type"]}," ",{p:[52,6,1883],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[53,6,1913],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[56,6,1979],t:7,e:"tr",f:[{p:[57,7,1991],t:7,e:"td",f:[{t:2,r:"name",p:[57,11,1995]}]}," ",{p:[58,7,2016],t:7,e:"td",f:[".",{t:2,r:"type",p:[58,12,2021]}]}," ",{p:[59,7,2042],t:7,e:"td",f:[{t:2,r:"size",p:[59,11,2046]},"GQ"]}," ",{p:[60,7,2069],t:7,e:"td",f:[{p:[61,8,2082],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[61,26,2100]}],action:"PRG_usbdeletefile",params:['{"name": "',{t:2,r:"name",p:[61,108,2182]},'"}']},f:["DELETE"]}," ",{t:4,f:[{p:[63,9,2256],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[63,27,2274]}],action:"PRG_copyfromusb",params:['{"name": "',{t:2,r:"name",p:[63,107,2354]},'"}']},f:["IMPORT"]}],n:50,r:"data.usbconnected",p:[62,8,2221]}]}]}],n:52,r:"data.usbfiles",p:[55,5,1949]}]}],n:50,r:"data.usbconnected",p:[46,4,1731]}," ",{p:[70,4,2470],t:7,e:"ui-button",a:{action:"PRG_newtextfile"},f:["NEW DATA FILE"]}],r:"data.filename"}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],270:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["No program loaded. Please select program from list below."]}," ",{p:[6,2,146],t:7,e:"table",f:[{t:4,f:[{p:[8,4,185],t:7,e:"tr",f:[{p:[8,8,189],t:7,e:"td",f:[{p:[8,12,193],t:7,e:"ui-button",a:{action:"PC_runprogram",params:['{"name": "',{t:2,r:"name",p:[8,64,245]},'"}']},f:[{t:2,r:"desc",p:[9,5,263]}]}]},{p:[11,4,293],t:7,e:"td",f:[{p:[11,8,297],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["running"],s:'_0?null:"disabled"'},p:[11,26,315]}],icon:"close",action:"PC_killprogram",params:['{"name": "',{t:2,r:"name",p:[11,114,403]},'"}']}}]}]}],n:52,r:"data.programs",p:[7,3,157]}]}," ",{p:[14,2,454],t:7,e:"br"},{p:[14,6,458],t:7,e:"br"}," ",{t:4,f:[{p:[16,3,491],t:7,e:"ui-button",a:{action:"PC_toggle_light",style:[{t:2,x:{r:["data.light_on"],s:'_0?"selected":null'},p:[16,46,534]}]},f:["Toggle Flashlight"]},{p:[16,114,602],t:7,e:"br"}," ",{p:[17,3,610],t:7,e:"ui-button",a:{action:"PC_light_color"},f:["Change Flashlight Color ",{p:[17,62,669],t:7,e:"span",a:{style:["border:1px solid #161616; background-color: ",{t:2,r:"data.comp_light_color",p:[17,119,726]},";"]},f:["   "]}]}],n:50,r:"data.has_light",p:[15,2,465]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],271:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[6,3,105],t:7,e:"h1",f:["ADMINISTRATIVE MODE"]}],n:50,r:"data.adminmode",p:[5,2,79]}," ",{t:4,f:[{p:[10,3,170],t:7,e:"div",a:{"class":"itemLabel"},f:["Current channel:"]}," ",{p:[13,3,229],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.title",p:[14,4,259]}]}," ",{p:[16,3,287],t:7,e:"div",a:{"class":"itemLabel"},f:["Operator access:"]}," ",{p:[19,3,346],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:[{p:[21,5,406],t:7,e:"b",f:["Enabled"]}],n:50,r:"data.is_operator",p:[20,4,376]},{t:4,n:51,f:[{p:[23,5,439],t:7,e:"b",f:["Disabled"]}],r:"data.is_operator"}]}," ",{p:[26,3,480],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[29,3,532],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[30,4,562],t:7,e:"table",f:[{p:[31,5,575],t:7,e:"tr",f:[{p:[31,9,579],t:7,e:"td",f:[{p:[31,13,583],t:7,e:"ui-button",a:{action:"PRG_speak"},f:["Send message"]}]}]},{p:[32,5,643],t:7,e:"tr",f:[{p:[32,9,647],t:7,e:"td",f:[{p:[32,13,651],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[33,5,719],t:7,e:"tr",f:[{p:[33,9,723],t:7,e:"td",f:[{p:[33,13,727],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]},{p:[34,5,807],t:7,e:"tr",f:[{p:[34,9,811],t:7,e:"td",f:[{p:[34,13,815],t:7,e:"ui-button",a:{action:"PRG_leavechannel"},f:["Leave channel"]}]}]},{p:[35,5,883],t:7,e:"tr",f:[{p:[35,9,887],t:7,e:"td",f:[{p:[35,13,891],t:7,e:"ui-button",a:{action:"PRG_savelog"},f:["Save log to local drive"]}," ",{t:4,f:[{p:[37,6,995],t:7,e:"tr",f:[{p:[37,10,999],t:7,e:"td",f:[{p:[37,14,1003],t:7,e:"ui-button",a:{action:"PRG_renamechannel"},f:["Rename channel"]}]}]},{p:[38,6,1074],t:7,e:"tr",f:[{p:[38,10,1078],t:7,e:"td",f:[{p:[38,14,1082],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}]}]},{p:[39,6,1149],t:7,e:"tr",f:[{p:[39,10,1153],t:7,e:"td",f:[{p:[39,14,1157],t:7,e:"ui-button",a:{action:"PRG_deletechannel"},f:["Delete channel"]}]}]}],n:50,r:"data.is_operator",p:[36,5,964]}]}]}]}]}," ",{p:[43,3,1263],t:7,e:"b",f:["Chat Window"]}," ",{p:[44,4,1286],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[45,4,1342],t:7,e:"div",a:{"class":"item"},f:[{p:[46,5,1366],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"msg",p:[48,7,1450]},{p:[48,14,1457],t:7,e:"br"}],n:52,r:"data.messages",p:[47,6,1419]}]}]}]}," ",{p:[53,3,1516],t:7,e:"b",f:["Connected Users"]},{p:[53,25,1538],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"name",p:[55,4,1573]},{p:[55,12,1581],t:7,e:"br"}],n:52,r:"data.clients",p:[54,3,1546]}],n:50,r:"data.title",p:[9,2,148]},{t:4,n:51,f:[{p:[58,3,1613],t:7,e:"b",f:["Controls:"]}," ",{p:[59,3,1633],t:7,e:"table",f:[{p:[60,4,1645],t:7,e:"tr",f:[{p:[60,8,1649],t:7,e:"td",f:[{p:[60,12,1653],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[61,4,1720],t:7,e:"tr",f:[{p:[61,8,1724],t:7,e:"td",f:[{p:[61,12,1728],t:7,e:"ui-button",a:{action:"PRG_newchannel"},f:["New Channel"]}]}]},{p:[62,4,1791],t:7,e:"tr",f:[{p:[62,8,1795],t:7,e:"td",f:[{p:[62,12,1799],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]}]}," ",{p:[64,3,1889],t:7,e:"b",f:["Available channels:"]}," ",{p:[65,3,1919],t:7,e:"table",f:[{t:4,f:[{p:[67,4,1964],t:7,e:"tr",f:[{p:[67,8,1968],t:7,e:"td",f:[{p:[67,12,1972],t:7,e:"ui-button",a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[67,64,2024]},'"}']},f:[{t:2,r:"chan",p:[67,74,2034]}]},{p:[67,94,2054],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[66,3,1930]}]}],r:"data.title"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],272:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[6,19,117]},{p:[6,33,131],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[5,2,79]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[8,39,243]},"GQ/s",{p:[8,57,261],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[10,4,300]},{p:[10,12,308],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[9,3,269]}," ",{p:[12,3,329],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[14,55,443],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[16,24,494]}],n:50,r:"data.focus",p:[15,3,451]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[20,3,564],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[20,54,615],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[21,31,677],t:7,e:"br"}," ",{t:4,f:[{p:[23,4,711],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[23,61,768]},'"}']},f:[{t:2,r:"id",p:[23,71,778]}]}],n:52,r:"data.relays",p:[22,3,685]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],273:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[5,97,174],t:7,e:"hr"}," ",{t:4,f:[{p:[7,3,203],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[8,4,243],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[9,5,281]}]}," ",{p:[11,4,318],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[12,5,358],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[6,2,181]},{t:4,n:51,f:[{t:4,f:[{p:[19,4,516],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[20,5,559],t:7,e:"i",f:["Please wait..."]}," ",{p:[21,5,586],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[22,6,623]}]}," ",{p:[24,5,669],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[25,6,713]}]}," ",{p:[27,5,759],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadsize",p:[28,6,796]},"GQ"]}," ",{p:[30,5,844],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[31,6,885]}," GQ/s"]}," ",{p:[33,5,937],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[34,6,982],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[34,27,1003]}],value:[{t:2,r:"adata.downloadcompletion",p:[34,58,1034]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[34,101,1077]},"GQ / ",{t:2,r:"adata.downloadsize",p:[34,146,1122]},"GQ"]}]}]}],n:50,r:"data.downloadname",p:[18,3,486]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[41,4,1270],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,5,1308],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,6,1349],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,27,1370]}],value:[{t:2,r:"adata.disk_used",p:[43,55,1398]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,89,1432]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,125,1468]},"GQ"]}]}]}," ",{p:[47,4,1545],t:7,e:"ui-display",a:{title:"Primary Software Repository"},f:[{t:4,f:[{p:[49,6,1642],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[49,28,1664]}]},f:[{p:[50,7,1686],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[50,61,1740]}]}," ",{p:[52,7,1774],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[53,8,1813]}," (",{t:2,r:"size",p:[53,22,1827]}," GQ)"]}," ",{p:[55,7,1868],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[56,8,1911]}]}," ",{p:[58,7,1957],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[58,80,2030]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[62,6,2113],t:7,e:"br"}],n:52,r:"data.downloadable_programs",p:[48,5,1599]}]}," ",{t:4,f:[{p:[67,5,2194],t:7,e:"ui-display",a:{title:"UNKNOWN Software Repository"},f:[{p:[68,6,2249],t:7,e:"i",f:["Please note that Nanotrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[70,7,2395],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[70,29,2417]}]},f:[{p:[71,8,2440],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[71,62,2494]}]}," ",{p:[73,8,2530],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[74,9,2570]}," (",{t:2,r:"size",p:[74,23,2584]}," GQ)"]}," ",{p:[76,8,2627],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[77,9,2671]}]}," ",{p:[79,8,2719],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[79,81,2792]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[83,7,2879],t:7,e:"br"}],n:52,r:"data.hacked_programs",p:[69,6,2357]}]}],n:50,r:"data.hackedavailable",p:[66,4,2160]}],n:50,x:{r:["data.error"],s:"!_0"},p:[40,3,1246]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[39,2,1216]}," ",{p:[89,2,2954],t:7,e:"br"},{p:[89,6,2958],t:7,e:"br"},{p:[89,10,2962],t:7,e:"hr"},{p:[89,14,2966],t:7,e:"i",f:["NTOS v2.0.4b Copyright Nanotrasen 2557 - 2559"]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],274:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[6,2,81],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[8,3,129],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[9,4,173],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[9,7,176]}]}]}," ",{t:4,f:[{p:[12,4,250],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[13,6,291],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[13,9,294]}]}]}," ",{p:[15,4,366],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[17,4,401],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[21,4,500],t:7,e:"br"},{p:[21,8,504],t:7,e:"br"}," ",{p:[22,4,513],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[11,3,221]},{t:4,n:51,f:[{p:[24,4,650],t:7,e:"br"},{p:[24,8,654],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays"}]}," ",{p:[29,2,750],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[31,2,798],t:7,e:"table",f:[{p:[32,3,809],t:7,e:"tr",f:[{p:[33,4,818],t:7,e:"th",f:["PROTOCOL"]},{p:[34,4,835],t:7,e:"th",f:["STATUS"]},{p:[35,4,850],t:7,e:"th",f:["CONTROL"]}]},{p:[36,3,865],t:7,e:"tr",f:[" ",{p:[37,4,874],t:7,e:"td",f:["Software Downloads"]},{p:[38,4,901],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[38,8,905]}]},{p:[39,4,967],t:7,e:"td",f:[" ",{p:[39,9,972],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}'},f:["TOGGLE"]}]}]},{p:[40,3,1051],t:7,e:"tr",f:[" ",{p:[41,4,1060],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[42,4,1089],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[42,8,1093]}]},{p:[43,4,1149],t:7,e:"td",f:[{p:[43,8,1153],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[44,3,1232],t:7,e:"tr",f:[" ",{p:[45,4,1241],t:7,e:"td",f:["Communication Systems"]},{p:[46,4,1271],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[46,8,1275]}]},{p:[47,4,1334],t:7,e:"td",f:[{p:[47,8,1338],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[48,3,1417],t:7,e:"tr",f:[" ",{p:[49,4,1426],t:7,e:"td",f:["Remote System Control"]},{p:[50,4,1456],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[50,8,1460]}]},{p:[51,4,1519],t:7,e:"td",f:[{p:[51,8,1523],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[55,2,1630],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[58,4,1699],t:7,e:"ui-notice",f:[{p:[59,5,1716],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[61,5,1774],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[57,3,1673]}," ",{p:[64,3,1902],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[65,4,1954],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[65,7,1957]}]}]}," ",{p:[68,3,2029],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[69,4,2072],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[69,7,2075]}]}]}," ",{p:[72,3,2125],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[74,4,2176],t:7,e:"table",f:[{p:[75,4,2188],t:7,e:"tr",f:[{p:[75,8,2192],t:7,e:"td",f:[{p:[75,12,2196],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[76,4,2251],t:7,e:"tr",f:[{p:[76,8,2255],t:7,e:"td",f:[{p:[76,12,2259],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[77,4,2316],t:7,e:"tr",f:[{p:[77,8,2320],t:7,e:"td",f:[{p:[77,12,2324],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[78,4,2388],t:7,e:"tr",f:[{p:[78,8,2392],t:7,e:"td",f:[{p:[78,12,2396],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[81,3,2467],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[82,3,2506],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[83,3,2561],t:7,e:"div",a:{"class":"item"},f:[{p:[84,4,2584],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[86,6,2667]},{p:[86,15,2676],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[85,5,2636]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],275:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,2,102],t:7,e:"div",a:{"class":"item"},f:[{p:[8,3,124],t:7,e:"h2",f:["An error has occurred during operation..."]}," ",{p:[9,3,178],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[9,34,209]},{p:[9,48,223],t:7,e:"br"}," ",{p:[10,3,231],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[13,3,321],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[14,3,357],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[17,3,416],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[18,4,446]}]}," ",{p:[20,3,483],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[23,3,544],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[24,4,574]}," / ",{t:2,r:"data.download_size",p:[24,33,603]}," GQ"]}," ",{p:[26,3,642],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[29,3,700],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[30,4,730]},"GQ/s"]}," ",{p:[32,3,774],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[35,3,826],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[36,4,856],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[39,3,954],t:7,e:"h2",f:["Server enabled"]}," ",{p:[40,3,981],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[43,3,1042],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[44,4,1072]}]}," ",{p:[46,3,1109],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[49,3,1166],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[50,4,1196]}]}," ",{p:[52,3,1234],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[55,3,1293],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.upload_haspassword",p:[56,4,1323]},{t:4,n:51,f:["DISABLED"],r:"data.upload_haspassword"}]}," ",{p:[62,3,1420],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[65,3,1472],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[66,4,1502],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[67,4,1567],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[70,3,1668],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[71,3,1732],t:7,e:"table",f:[{p:[72,3,1743],t:7,e:"tr",f:[{p:[72,7,1747],t:7,e:"th",f:["File name"]},{p:[72,20,1760],t:7,e:"th",f:["File size"]},{p:[72,33,1773],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[74,4,1824],t:7,e:"tr",f:[{p:[74,8,1828],t:7,e:"td",f:[{t:2,r:"filename",p:[74,12,1832]}]},{p:[75,4,1849],t:7,e:"td",f:[{t:2,r:"size",p:[75,8,1853]},"GQ"]},{p:[76,4,1868],t:7,e:"td",f:[{p:[76,8,1872],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[76,59,1923]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[73,3,1789]}]}]}]}," ",{p:[79,3,1981],t:7,e:"hr"}," ",{p:[80,3,1989],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[81,3,2053],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[83,3,2116],t:7,e:"h2",f:["Available files:"]}," ",{p:[84,3,2145],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[84,55,2197],t:7,e:"tr",f:[{p:[84,59,2201],t:7,e:"th",f:["Server UID"]},{p:[84,73,2215],t:7,e:"th",f:["File Name"]},{p:[84,86,2228],t:7,e:"th",f:["File Size"]},{p:[84,99,2241],t:7,e:"th",f:["Password Protection"]},{p:[84,122,2264],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[86,5,2311],t:7,e:"tr",f:[{p:[86,9,2315],t:7,e:"td",f:[{t:2,r:"uid",p:[86,13,2319]}]},{p:[87,5,2332],t:7,e:"td",f:[{t:2,r:"filename",p:[87,9,2336]}]},{p:[88,5,2354],t:7,e:"td",f:[{t:2,r:"size",p:[88,9,2358]},"GQ ",{t:4,f:[{p:[90,6,2400],t:7,e:"td",f:["Enabled"]}],n:50,r:"haspassword",p:[89,5,2374]}," ",{t:4,f:[{p:[93,6,2457],t:7,e:"td",f:["Disabled"]}],n:50,x:{r:["haspassword"],s:"!_0"},p:[92,5,2430]}]},{p:[96,5,2494],t:7,e:"td",f:[{p:[96,9,2498],t:7,e:"ui-button",a:{action:"PRG_downloadfile",params:['{"id": "',{t:2,r:"uid",p:[96,62,2551]},'"}']},f:["Download"]}]}]}],n:52,r:"data.servers",p:[85,4,2283]}]}]}]}," ",{p:[99,3,2612],t:7,e:"hr"}," ",{p:[100,3,2620],t:7,e:"ui-button",a:{action:"PRG_uploadmenu"},f:["Send file"]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],276:[function(t,e,n){var a=t(205),r={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}})})}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[43,1,1082],t:7,e:"ntosheader"}," ",{p:[45,1,1099],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[47,5,1157],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData", ++},f:["Cargo"]}," ",{p:[167,4,5195],t:7,e:"td",f:[{t:4,f:[{p:[169,5,5237],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[169,64,5296]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[169,82,5314]}]},f:[{t:2,r:"display_name",p:[169,127,5359]}]}],n:52,r:"data.cargo_jobs",p:[168,6,5206]}]}]}," ",{p:[173,5,5430],t:7,e:"tr",f:[{p:[174,4,5439],t:7,e:"th",a:{style:"color: '#808080';"},f:["Civilian"]}," ",{p:[175,4,5487],t:7,e:"td",f:[{t:4,f:[{p:[177,5,5532],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[177,64,5591]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[177,82,5609]}]},f:[{t:2,r:"display_name",p:[177,127,5654]}]}],n:52,r:"data.civilian_jobs",p:[176,6,5498]}]}]}," ",{t:4,f:[{p:[182,4,5757],t:7,e:"tr",f:[{p:[183,6,5768],t:7,e:"th",a:{style:"color: '#A52A2A';"},f:["CentCom"]}," ",{p:[184,6,5817],t:7,e:"td",f:[{t:4,f:[{p:[186,7,5862],t:7,e:"ui-button",a:{action:"PRG_assign",params:['{"assign_target" : "',{t:2,r:"job",p:[186,66,5921]},'"}'],state:[{t:2,x:{r:["data.id_rank","job"],s:'_0==_1?"selected":null'},p:[186,84,5939]}]},f:[{t:2,r:"display_name",p:[186,129,5984]}]}],n:52,r:"data.centcom_jobs",p:[185,5,5827]}]}]}],n:50,r:"data.centcom_access",p:[181,5,5725]}]}]}],n:50,r:"data.assignments",p:[118,4,3518]}]}],r:"data.minor"}," ",{t:4,f:[{p:[198,4,6153],t:7,e:"div",a:{"class":"item"},f:[{p:[199,3,6175],t:7,e:"h2",f:["Central Command"]}]}," ",{p:[201,4,6215],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[203,5,6296],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[204,5,6331],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[204,64,6390]},'", "allowed" : "',{t:2,r:"allowed",p:[204,87,6413]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[204,109,6435]}]},f:[{t:2,r:"desc",p:[204,140,6466]}]}]}],n:52,r:"data.all_centcom_access",p:[202,3,6257]}]}],n:50,r:"data.centcom_access",p:[197,2,6121]},{t:4,n:51,f:[{p:[209,4,6538],t:7,e:"div",a:{"class":"item"},f:[{p:[210,3,6560],t:7,e:"h2",f:[{t:2,r:"data.station_name",p:[210,7,6564]}]}]}," ",{p:[212,4,6606],t:7,e:"div",a:{"class":"item",style:"width: 100%"},f:[{t:4,f:[{p:[214,5,6676],t:7,e:"div",a:{style:"float: left; width: 175px; min-height: 250px"},f:[{p:[215,4,6739],t:7,e:"div",a:{"class":"average"},f:[{p:[215,25,6760],t:7,e:"ui-button",a:{action:"PRG_regsel",state:[{t:2,x:{r:["selected"],s:'_0?"toggle":null'},p:[215,63,6798]}],params:['{"region" : "',{t:2,r:"regid",p:[215,116,6851]},'"}']},f:[{p:[215,129,6864],t:7,e:"b",f:[{t:2,r:"name",p:[215,132,6867]}]}]}]}," ",{p:[216,4,6902],t:7,e:"br"}," ",{t:4,f:[{p:[218,6,6938],t:7,e:"div",a:{"class":"itemContentWide"},f:[{p:[219,5,6973],t:7,e:"ui-button",a:{action:"PRG_access",params:['{"access_target" : "',{t:2,r:"ref",p:[219,64,7032]},'", "allowed" : "',{t:2,r:"allowed",p:[219,87,7055]},'"}'],state:[{t:2,x:{r:["allowed"],s:'_0?"toggle":null'},p:[219,109,7077]}]},f:[{t:2,r:"desc",p:[219,140,7108]}]}]}],n:52,r:"accesses",p:[217,6,6913]}]}],n:52,r:"data.regions",p:[213,3,6648]}]}],r:"data.centcom_access"}],n:50,r:"data.has_id",p:[67,3,2340]}],n:50,r:"data.authenticated",p:[66,1,2310]}]}],x:{r:["data.mmode"],s:"!_0"}}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],268:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{chargeState:function(t){var e=this.get("data.battery.max");return t>e/2?"good":t>e/4?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[15,1,311],t:7,e:"ntosheader"}," ",{p:[17,1,328],t:7,e:"ui-display",f:[{p:[18,2,343],t:7,e:"i",f:["Welcome to computer configuration utility. Please consult your system administrator if you have any questions about your device."]},{p:[18,137,478],t:7,e:"hr"}," ",{p:[19,2,485],t:7,e:"ui-display",a:{title:"Power Supply"},f:[{p:[20,3,522],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"data.power_usage",p:[21,4,559]},"W"]}," ",{t:4,f:[{p:[25,4,630],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Active"]}," ",{p:[28,4,701],t:7,e:"ui-section",a:{label:"Battery Rating"},f:[{t:2,r:"data.battery.max",p:[29,5,742]}]}," ",{p:[31,4,785],t:7,e:"ui-section",a:{label:"Battery Charge"},f:[{p:[32,5,826],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.battery.max",p:[32,26,847]}],value:[{t:2,r:"adata.battery.charge",p:[32,56,877]}],state:[{t:2,x:{r:["chargeState","adata.battery.charge"],s:"_0(_1)"},p:[32,89,910]}]},f:[{t:2,x:{r:["adata.battery.charge"],s:"Math.round(_0)"},p:[32,128,949]},"/",{t:2,r:"adata.battery.max",p:[32,165,986]}]}]}],n:50,r:"data.battery",p:[24,3,605]},{t:4,n:51,f:[{p:[35,4,1051],t:7,e:"ui-section",a:{label:"Battery Status"},f:["Not Available"]}],r:"data.battery"}]}," ",{p:[41,2,1156],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,3,1192],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,4,1231],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,25,1252]}],value:[{t:2,r:"adata.disk_used",p:[43,53,1280]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,87,1314]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,123,1350]},"GQ"]}]}]}," ",{p:[47,2,1419],t:7,e:"ui-display",a:{title:"Computer Components"},f:[{t:4,f:[{p:[49,4,1491],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"name",p:[49,26,1513]}]},f:[{p:[50,5,1529],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"desc",p:[50,59,1583]}]}," ",{p:[52,5,1605],t:7,e:"ui-section",a:{label:"State"},f:[{p:[53,6,1638],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["critical"],s:'_0?"disabled":null'},p:[53,24,1656]}],action:"PC_toggle_component",params:['{"name": "',{t:2,r:"name",p:[53,105,1737]},'"}']},f:[{t:2,x:{r:["enabled"],s:'_0?"Enabled":"Disabled"'},p:[54,7,1757]}]}]}," ",{t:4,f:[{p:[59,6,1868],t:7,e:"ui-section",a:{label:"Power Usage"},f:[{t:2,r:"powerusage",p:[60,7,1908]},"W"]}],n:50,r:"powerusage",p:[58,5,1843]}]}," ",{p:[64,4,1985],t:7,e:"br"}],n:52,r:"data.hardware",p:[48,3,1463]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],269:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,3,103],t:7,e:"h2",f:["An error has occurred and this program can not continue."]}," Additional information: ",{t:2,r:"data.error",p:[8,27,196]},{p:[8,41,210],t:7,e:"br"}," ",{p:[9,3,218],t:7,e:"i",f:["Please try again. If the problem persists contact your system administrator for assistance."]}," ",{p:[10,3,320],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["Restart program"]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,f:[{p:[13,4,422],t:7,e:"h2",f:["Viewing file ",{t:2,r:"data.filename",p:[13,21,439]}]}," ",{p:[14,4,466],t:7,e:"div",a:{"class":"item"},f:[{p:[15,4,489],t:7,e:"ui-button",a:{action:"PRG_closefile"},f:["CLOSE"]}," ",{p:[16,4,545],t:7,e:"ui-button",a:{action:"PRG_edit"},f:["EDIT"]}," ",{p:[17,4,595],t:7,e:"ui-button",a:{action:"PRG_printfile"},f:["PRINT"]}," "]},{p:[18,10,657],t:7,e:"hr"}," ",{t:3,r:"data.filedata",p:[19,4,666]}],n:50,r:"data.filename",p:[12,3,396]},{t:4,n:51,f:[{p:[21,4,702],t:7,e:"h2",f:["Available files (local):"]}," ",{p:[22,4,740],t:7,e:"table",f:[{p:[23,5,753],t:7,e:"tr",f:[{p:[24,6,764],t:7,e:"th",f:["File name"]}," ",{p:[25,6,789],t:7,e:"th",f:["File type"]}," ",{p:[26,6,814],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[27,6,844],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[30,6,907],t:7,e:"tr",f:[{p:[31,7,919],t:7,e:"td",f:[{t:2,r:"name",p:[31,11,923]}]}," ",{p:[32,7,944],t:7,e:"td",f:[".",{t:2,r:"type",p:[32,12,949]}]}," ",{p:[33,7,970],t:7,e:"td",f:[{t:2,r:"size",p:[33,11,974]},"GQ"]}," ",{p:[34,7,997],t:7,e:"td",f:[{p:[35,8,1010],t:7,e:"ui-button",a:{action:"PRG_openfile",params:['{"name": "',{t:2,r:"name",p:[35,59,1061]},'"}']},f:["VIEW"]}," ",{p:[36,8,1098],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[36,26,1116]}],action:"PRG_deletefile",params:['{"name": "',{t:2,r:"name",p:[36,105,1195]},'"}']},f:["DELETE"]}," ",{p:[37,8,1234],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[37,26,1252]}],action:"PRG_rename",params:['{"name": "',{t:2,r:"name",p:[37,101,1327]},'"}']},f:["RENAME"]}," ",{p:[38,8,1366],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[38,26,1384]}],action:"PRG_clone",params:['{"name": "',{t:2,r:"name",p:[38,100,1458]},'"}']},f:["CLONE"]}," ",{t:4,f:[{p:[40,9,1531],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[40,27,1549]}],action:"PRG_copytousb",params:['{"name": "',{t:2,r:"name",p:[40,105,1627]},'"}']},f:["EXPORT"]}],n:50,r:"data.usbconnected",p:[39,8,1496]}]}]}],n:52,r:"data.files",p:[29,5,880]}]}," ",{t:4,f:[{p:[47,4,1761],t:7,e:"h2",f:["Available files (portable device):"]}," ",{p:[48,4,1809],t:7,e:"table",f:[{p:[49,5,1822],t:7,e:"tr",f:[{p:[50,6,1833],t:7,e:"th",f:["File name"]}," ",{p:[51,6,1858],t:7,e:"th",f:["File type"]}," ",{p:[52,6,1883],t:7,e:"th",f:["File size (GQ)"]}," ",{p:[53,6,1913],t:7,e:"th",f:["Operations"]}]}," ",{t:4,f:[{p:[56,6,1979],t:7,e:"tr",f:[{p:[57,7,1991],t:7,e:"td",f:[{t:2,r:"name",p:[57,11,1995]}]}," ",{p:[58,7,2016],t:7,e:"td",f:[".",{t:2,r:"type",p:[58,12,2021]}]}," ",{p:[59,7,2042],t:7,e:"td",f:[{t:2,r:"size",p:[59,11,2046]},"GQ"]}," ",{p:[60,7,2069],t:7,e:"td",f:[{p:[61,8,2082],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[61,26,2100]}],action:"PRG_usbdeletefile",params:['{"name": "',{t:2,r:"name",p:[61,108,2182]},'"}']},f:["DELETE"]}," ",{t:4,f:[{p:[63,9,2256],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["undeletable"],s:'_0?"disabled":null'},p:[63,27,2274]}],action:"PRG_copyfromusb",params:['{"name": "',{t:2,r:"name",p:[63,107,2354]},'"}']},f:["IMPORT"]}],n:50,r:"data.usbconnected",p:[62,8,2221]}]}]}],n:52,r:"data.usbfiles",p:[55,5,1949]}]}],n:50,r:"data.usbconnected",p:[46,4,1731]}," ",{p:[70,4,2470],t:7,e:"ui-button",a:{action:"PRG_newtextfile"},f:["NEW DATA FILE"]}],r:"data.filename"}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],270:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["No program loaded. Please select program from list below."]}," ",{p:[6,2,146],t:7,e:"table",f:[{t:4,f:[{p:[8,4,185],t:7,e:"tr",f:[{p:[8,8,189],t:7,e:"td",f:[{p:[8,12,193],t:7,e:"ui-button",a:{action:"PC_runprogram",params:['{"name": "',{t:2,r:"name",p:[8,64,245]},'"}']},f:[{t:2,r:"desc",p:[9,5,263]}]}]},{p:[11,4,293],t:7,e:"td",f:[{p:[11,8,297],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["running"],s:'_0?null:"disabled"'},p:[11,26,315]}],icon:"close",action:"PC_killprogram",params:['{"name": "',{t:2,r:"name",p:[11,114,403]},'"}']}}]}]}],n:52,r:"data.programs",p:[7,3,157]}]}," ",{p:[14,2,454],t:7,e:"br"},{p:[14,6,458],t:7,e:"br"}," ",{t:4,f:[{p:[16,3,491],t:7,e:"ui-button",a:{action:"PC_toggle_light",style:[{t:2,x:{r:["data.light_on"],s:'_0?"selected":null'},p:[16,46,534]}]},f:["Toggle Flashlight"]},{p:[16,114,602],t:7,e:"br"}," ",{p:[17,3,610],t:7,e:"ui-button",a:{action:"PC_light_color"},f:["Change Flashlight Color ",{p:[17,62,669],t:7,e:"span",a:{style:["border:1px solid #161616; background-color: ",{t:2,r:"data.comp_light_color",p:[17,119,726]},";"]},f:["   "]}]}],n:50,r:"data.has_light",p:[15,2,465]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],271:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[6,3,105],t:7,e:"h1",f:["ADMINISTRATIVE MODE"]}],n:50,r:"data.adminmode",p:[5,2,79]}," ",{t:4,f:[{p:[10,3,170],t:7,e:"div",a:{"class":"itemLabel"},f:["Current channel:"]}," ",{p:[13,3,229],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.title",p:[14,4,259]}]}," ",{p:[16,3,287],t:7,e:"div",a:{"class":"itemLabel"},f:["Operator access:"]}," ",{p:[19,3,346],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:[{p:[21,5,406],t:7,e:"b",f:["Enabled"]}],n:50,r:"data.is_operator",p:[20,4,376]},{t:4,n:51,f:[{p:[23,5,439],t:7,e:"b",f:["Disabled"]}],r:"data.is_operator"}]}," ",{p:[26,3,480],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[29,3,532],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[30,4,562],t:7,e:"table",f:[{p:[31,5,575],t:7,e:"tr",f:[{p:[31,9,579],t:7,e:"td",f:[{p:[31,13,583],t:7,e:"ui-button",a:{action:"PRG_speak"},f:["Send message"]}]}]},{p:[32,5,643],t:7,e:"tr",f:[{p:[32,9,647],t:7,e:"td",f:[{p:[32,13,651],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[33,5,719],t:7,e:"tr",f:[{p:[33,9,723],t:7,e:"td",f:[{p:[33,13,727],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]},{p:[34,5,807],t:7,e:"tr",f:[{p:[34,9,811],t:7,e:"td",f:[{p:[34,13,815],t:7,e:"ui-button",a:{action:"PRG_leavechannel"},f:["Leave channel"]}]}]},{p:[35,5,883],t:7,e:"tr",f:[{p:[35,9,887],t:7,e:"td",f:[{p:[35,13,891],t:7,e:"ui-button",a:{action:"PRG_savelog"},f:["Save log to local drive"]}," ",{t:4,f:[{p:[37,6,995],t:7,e:"tr",f:[{p:[37,10,999],t:7,e:"td",f:[{p:[37,14,1003],t:7,e:"ui-button",a:{action:"PRG_renamechannel"},f:["Rename channel"]}]}]},{p:[38,6,1074],t:7,e:"tr",f:[{p:[38,10,1078],t:7,e:"td",f:[{p:[38,14,1082],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}]}]},{p:[39,6,1149],t:7,e:"tr",f:[{p:[39,10,1153],t:7,e:"td",f:[{p:[39,14,1157],t:7,e:"ui-button",a:{action:"PRG_deletechannel"},f:["Delete channel"]}]}]}],n:50,r:"data.is_operator",p:[36,5,964]}]}]}]}]}," ",{p:[43,3,1263],t:7,e:"b",f:["Chat Window"]}," ",{p:[44,4,1286],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[45,4,1342],t:7,e:"div",a:{"class":"item"},f:[{p:[46,5,1366],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"msg",p:[48,7,1450]},{p:[48,14,1457],t:7,e:"br"}],n:52,r:"data.messages",p:[47,6,1419]}]}]}]}," ",{p:[53,3,1516],t:7,e:"b",f:["Connected Users"]},{p:[53,25,1538],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"name",p:[55,4,1573]},{p:[55,12,1581],t:7,e:"br"}],n:52,r:"data.clients",p:[54,3,1546]}],n:50,r:"data.title",p:[9,2,148]},{t:4,n:51,f:[{p:[58,3,1613],t:7,e:"b",f:["Controls:"]}," ",{p:[59,3,1633],t:7,e:"table",f:[{p:[60,4,1645],t:7,e:"tr",f:[{p:[60,8,1649],t:7,e:"td",f:[{p:[60,12,1653],t:7,e:"ui-button",a:{action:"PRG_changename"},f:["Change nickname"]}]}]},{p:[61,4,1720],t:7,e:"tr",f:[{p:[61,8,1724],t:7,e:"td",f:[{p:[61,12,1728],t:7,e:"ui-button",a:{action:"PRG_newchannel"},f:["New Channel"]}]}]},{p:[62,4,1791],t:7,e:"tr",f:[{p:[62,8,1795],t:7,e:"td",f:[{p:[62,12,1799],t:7,e:"ui-button",a:{action:"PRG_toggleadmin"},f:["Toggle administration mode"]}]}]}]}," ",{p:[64,3,1889],t:7,e:"b",f:["Available channels:"]}," ",{p:[65,3,1919],t:7,e:"table",f:[{t:4,f:[{p:[67,4,1964],t:7,e:"tr",f:[{p:[67,8,1968],t:7,e:"td",f:[{p:[67,12,1972],t:7,e:"ui-button",a:{action:"PRG_joinchannel",params:['{"id": "',{t:2,r:"id",p:[67,64,2024]},'"}']},f:[{t:2,r:"chan",p:[67,74,2034]}]},{p:[67,94,2054],t:7,e:"br"}]}]}],n:52,r:"data.all_channels",p:[66,3,1930]}]}],r:"data.title"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],272:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:["##SYSTEM ERROR: ",{t:2,r:"data.error",p:[6,19,117]},{p:[6,33,131],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["RESET"]}],n:50,r:"data.error",p:[5,2,79]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.target"],s:"_0"},f:["##DoS traffic generator active. Tx: ",{t:2,r:"data.speed",p:[8,39,243]},"GQ/s",{p:[8,57,261],t:7,e:"br"}," ",{t:4,f:[{t:2,r:"nums",p:[10,4,300]},{p:[10,12,308],t:7,e:"br"}],n:52,r:"data.dos_strings",p:[9,3,269]}," ",{p:[12,3,329],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["ABORT"]}]},{t:4,n:50,x:{r:["data.target"],s:"!(_0)"},f:[" ##DoS traffic generator ready. Select target device.",{p:[14,55,443],t:7,e:"br"}," ",{t:4,f:["Targeted device ID: ",{t:2,r:"data.focus",p:[16,24,494]}],n:50,r:"data.focus",p:[15,3,451]},{t:4,n:51,f:["Targeted device ID: None"],r:"data.focus"}," ",{p:[20,3,564],t:7,e:"ui-button",a:{action:"PRG_execute"},f:["EXECUTE"]},{p:[20,54,615],t:7,e:"div",a:{style:"clear:both"}}," Detected devices on network:",{p:[21,31,677],t:7,e:"br"}," ",{t:4,f:[{p:[23,4,711],t:7,e:"ui-button",a:{action:"PRG_target_relay",params:['{"targid": "',{t:2,r:"id",p:[23,61,768]},'"}']},f:[{t:2,r:"id",p:[23,71,778]}]}],n:52,r:"data.relays",p:[22,3,685]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],273:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"i",f:["Welcome to software download utility. Please select which software you wish to download."]},{p:[5,97,174],t:7,e:"hr"}," ",{t:4,f:[{p:[7,3,203],t:7,e:"ui-display",a:{title:"Download Error"},f:[{p:[8,4,243],t:7,e:"ui-section",a:{label:"Information"},f:[{t:2,r:"data.error",p:[9,5,281]}]}," ",{p:[11,4,318],t:7,e:"ui-section",a:{label:"Reset Program"},f:[{p:[12,5,358],t:7,e:"ui-button",a:{icon:"times",action:"PRG_reseterror"},f:["RESET"]}]}]}],n:50,r:"data.error",p:[6,2,181]},{t:4,n:51,f:[{t:4,f:[{p:[19,4,516],t:7,e:"ui-display",a:{title:"Download Running"},f:[{p:[20,5,559],t:7,e:"i",f:["Please wait..."]}," ",{p:[21,5,586],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"data.downloadname",p:[22,6,623]}]}," ",{p:[24,5,669],t:7,e:"ui-section",a:{label:"File description"},f:[{t:2,r:"data.downloaddesc",p:[25,6,713]}]}," ",{p:[27,5,759],t:7,e:"ui-section",a:{label:"File size"},f:[{t:2,r:"data.downloadsize",p:[28,6,796]},"GQ"]}," ",{p:[30,5,844],t:7,e:"ui-section",a:{label:"Transfer Rate"},f:[{t:2,r:"data.downloadspeed",p:[31,6,885]}," GQ/s"]}," ",{p:[33,5,937],t:7,e:"ui-section",a:{label:"Download progress"},f:[{p:[34,6,982],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.downloadsize",p:[34,27,1003]}],value:[{t:2,r:"adata.downloadcompletion",p:[34,58,1034]}],state:"good"},f:[{t:2,x:{r:["adata.downloadcompletion"],s:"Math.round(_0)"},p:[34,101,1077]},"GQ / ",{t:2,r:"adata.downloadsize",p:[34,146,1122]},"GQ"]}]}]}],n:50,r:"data.downloadname",p:[18,3,486]}],r:"data.error"}," ",{t:4,f:[{t:4,f:[{p:[41,4,1270],t:7,e:"ui-display",a:{title:"File System"},f:[{p:[42,5,1308],t:7,e:"ui-section",a:{label:"Used Capacity"},f:[{p:[43,6,1349],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.disk_size",p:[43,27,1370]}],value:[{t:2,r:"adata.disk_used",p:[43,55,1398]}],state:"good"},f:[{t:2,x:{r:["adata.disk_used"],s:"Math.round(_0)"},p:[43,89,1432]},"GQ / ",{t:2,r:"adata.disk_size",p:[43,125,1468]},"GQ"]}]}]}," ",{p:[47,4,1545],t:7,e:"ui-display",a:{title:"Primary Software Repository"},f:[{t:4,f:[{p:[49,6,1642],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[49,28,1664]}]},f:[{p:[50,7,1686],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[50,61,1740]}]}," ",{p:[52,7,1774],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[53,8,1813]}," (",{t:2,r:"size",p:[53,22,1827]}," GQ)"]}," ",{p:[55,7,1868],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[56,8,1911]}]}," ",{p:[58,7,1957],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[58,80,2030]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[62,6,2113],t:7,e:"br"}],n:52,r:"data.downloadable_programs",p:[48,5,1599]}]}," ",{t:4,f:[{p:[67,5,2194],t:7,e:"ui-display",a:{title:"UNKNOWN Software Repository"},f:[{p:[68,6,2249],t:7,e:"i",f:["Please note that Nanotrasen does not recommend download of software from non-official servers."]}," ",{t:4,f:[{p:[70,7,2395],t:7,e:"ui-subdisplay",a:{title:[{t:2,r:"filedesc",p:[70,29,2417]}]},f:[{p:[71,8,2440],t:7,e:"div",a:{style:"display: table-caption; margin-left: 3px"},f:[{t:2,r:"fileinfo",p:[71,62,2494]}]}," ",{p:[73,8,2530],t:7,e:"ui-section",a:{label:"File name"},f:[{t:2,r:"filename",p:[74,9,2570]}," (",{t:2,r:"size",p:[74,23,2584]}," GQ)"]}," ",{p:[76,8,2627],t:7,e:"ui-section",a:{label:"Compatibility"},f:[{t:2,r:"compatibility",p:[77,9,2671]}]}," ",{p:[79,8,2719],t:7,e:"ui-button",a:{icon:"signal",action:"PRG_downloadfile",params:['{"filename": "',{t:2,r:"filename",p:[79,81,2792]},'"}']},f:["DOWNLOAD"]}]}," ",{p:[83,7,2879],t:7,e:"br"}],n:52,r:"data.hacked_programs",p:[69,6,2357]}]}],n:50,r:"data.hackedavailable",p:[66,4,2160]}],n:50,x:{r:["data.error"],s:"!_0"},p:[40,3,1246]}],n:50,x:{r:["data.downloadname"],s:"!_0"},p:[39,2,1216]}," ",{p:[89,2,2954],t:7,e:"br"},{p:[89,6,2958],t:7,e:"br"},{p:[89,10,2962],t:7,e:"hr"},{p:[89,14,2966],t:7,e:"i",f:["NTOS v2.0.4b Copyright Nanotrasen 2557 - 2559"]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],274:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[6,2,81],t:7,e:"ui-display",a:{title:"WIRELESS CONNECTIVITY"},f:[{p:[8,3,129],t:7,e:"ui-section",a:{label:"Active NTNetRelays"},f:[{p:[9,4,173],t:7,e:"b",f:[{t:2,r:"data.ntnetrelays",p:[9,7,176]}]}]}," ",{t:4,f:[{p:[12,4,250],t:7,e:"ui-section",a:{label:"System status"},f:[{p:[13,6,291],t:7,e:"b",f:[{t:2,x:{r:["data.ntnetstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[13,9,294]}]}]}," ",{p:[15,4,366],t:7,e:"ui-section",a:{label:"Control"},f:[{p:[17,4,401],t:7,e:"ui-button",a:{icon:"plus",action:"toggleWireless"},f:["TOGGLE"]}]}," ",{p:[21,4,500],t:7,e:"br"},{p:[21,8,504],t:7,e:"br"}," ",{p:[22,4,513],t:7,e:"i",f:["Caution - Disabling wireless transmitters when using wireless device may prevent you from re-enabling them again!"]}],n:50,r:"data.ntnetrelays",p:[11,3,221]},{t:4,n:51,f:[{p:[24,4,650],t:7,e:"br"},{p:[24,8,654],t:7,e:"p",f:["Wireless coverage unavailable, no relays are connected."]}],r:"data.ntnetrelays"}]}," ",{p:[29,2,750],t:7,e:"ui-display",a:{title:"FIREWALL CONFIGURATION"},f:[{p:[31,2,798],t:7,e:"table",f:[{p:[32,3,809],t:7,e:"tr",f:[{p:[33,4,818],t:7,e:"th",f:["PROTOCOL"]},{p:[34,4,835],t:7,e:"th",f:["STATUS"]},{p:[35,4,850],t:7,e:"th",f:["CONTROL"]}]},{p:[36,3,865],t:7,e:"tr",f:[" ",{p:[37,4,874],t:7,e:"td",f:["Software Downloads"]},{p:[38,4,901],t:7,e:"td",f:[{t:2,x:{r:["data.config_softwaredownload"],s:'_0?"ENABLED":"DISABLED"'},p:[38,8,905]}]},{p:[39,4,967],t:7,e:"td",f:[" ",{p:[39,9,972],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "1"}'},f:["TOGGLE"]}]}]},{p:[40,3,1051],t:7,e:"tr",f:[" ",{p:[41,4,1060],t:7,e:"td",f:["Peer to Peer Traffic"]},{p:[42,4,1089],t:7,e:"td",f:[{t:2,x:{r:["data.config_peertopeer"],s:'_0?"ENABLED":"DISABLED"'},p:[42,8,1093]}]},{p:[43,4,1149],t:7,e:"td",f:[{p:[43,8,1153],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "2"}'},f:["TOGGLE"]}]}]},{p:[44,3,1232],t:7,e:"tr",f:[" ",{p:[45,4,1241],t:7,e:"td",f:["Communication Systems"]},{p:[46,4,1271],t:7,e:"td",f:[{t:2,x:{r:["data.config_communication"],s:'_0?"ENABLED":"DISABLED"'},p:[46,8,1275]}]},{p:[47,4,1334],t:7,e:"td",f:[{p:[47,8,1338],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "3"}'},f:["TOGGLE"]}]}]},{p:[48,3,1417],t:7,e:"tr",f:[" ",{p:[49,4,1426],t:7,e:"td",f:["Remote System Control"]},{p:[50,4,1456],t:7,e:"td",f:[{t:2,x:{r:["data.config_systemcontrol"],s:'_0?"ENABLED":"DISABLED"'},p:[50,8,1460]}]},{p:[51,4,1519],t:7,e:"td",f:[{p:[51,8,1523],t:7,e:"ui-button",a:{action:"toggle_function",params:'{"id": "4"}'},f:["TOGGLE"]}]}]}]}]}," ",{p:[55,2,1630],t:7,e:"ui-display",a:{title:"SECURITY SYSTEMS"},f:[{t:4,f:[{p:[58,4,1699],t:7,e:"ui-notice",f:[{p:[59,5,1716],t:7,e:"h1",f:["NETWORK INCURSION DETECTED"]}]}," ",{p:[61,5,1774],t:7,e:"i",f:["An abnormal activity has been detected in the network. Please verify system logs for more information"]}],n:50,r:"data.idsalarm",p:[57,3,1673]}," ",{p:[64,3,1902],t:7,e:"ui-section",a:{label:"Intrusion Detection System"},f:[{p:[65,4,1954],t:7,e:"b",f:[{t:2,x:{r:["data.idsstatus"],s:'_0?"ENABLED":"DISABLED"'},p:[65,7,1957]}]}]}," ",{p:[68,3,2029],t:7,e:"ui-section",a:{label:"Maximal Log Count"},f:[{p:[69,4,2072],t:7,e:"b",f:[{t:2,r:"data.ntnetmaxlogs",p:[69,7,2075]}]}]}," ",{p:[72,3,2125],t:7,e:"ui-section",a:{label:"Controls"},f:[]}," ",{p:[74,4,2176],t:7,e:"table",f:[{p:[75,4,2188],t:7,e:"tr",f:[{p:[75,8,2192],t:7,e:"td",f:[{p:[75,12,2196],t:7,e:"ui-button",a:{action:"resetIDS"},f:["RESET IDS"]}]}]},{p:[76,4,2251],t:7,e:"tr",f:[{p:[76,8,2255],t:7,e:"td",f:[{p:[76,12,2259],t:7,e:"ui-button",a:{action:"toggleIDS"},f:["TOGGLE IDS"]}]}]},{p:[77,4,2316],t:7,e:"tr",f:[{p:[77,8,2320],t:7,e:"td",f:[{p:[77,12,2324],t:7,e:"ui-button",a:{action:"updatemaxlogs"},f:["SET LOG LIMIT"]}]}]},{p:[78,4,2388],t:7,e:"tr",f:[{p:[78,8,2392],t:7,e:"td",f:[{p:[78,12,2396],t:7,e:"ui-button",a:{action:"purgelogs"},f:["PURGE LOGS"]}]}]}]}," ",{p:[81,3,2467],t:7,e:"ui-subdisplay",a:{title:"System Logs"},f:[{p:[82,3,2506],t:7,e:"div",a:{"class":"statusDisplay",style:"overflow: auto;"},f:[{p:[83,3,2561],t:7,e:"div",a:{"class":"item"},f:[{p:[84,4,2584],t:7,e:"div",a:{"class":"itemContent",style:"width: 100%;"},f:[{t:4,f:[{t:2,r:"entry",p:[86,6,2667]},{p:[86,15,2676],t:7,e:"br"}],n:52,r:"data.ntnetlogs",p:[85,5,2636]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],275:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{t:4,f:[{p:[7,2,102],t:7,e:"div",a:{"class":"item"},f:[{p:[8,3,124],t:7,e:"h2",f:["An error has occurred during operation..."]}," ",{p:[9,3,178],t:7,e:"b",f:["Additional information:"]},{t:2,r:"data.error",p:[9,34,209]},{p:[9,48,223],t:7,e:"br"}," ",{p:[10,3,231],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Clear"]}]}],n:50,r:"data.error",p:[6,2,81]},{t:4,n:51,f:[{t:4,n:50,x:{r:["data.downloading"],s:"_0"},f:[{p:[13,3,321],t:7,e:"h2",f:["Download in progress..."]}," ",{p:[14,3,357],t:7,e:"div",a:{"class":"itemLabel"},f:["Downloaded file:"]}," ",{p:[17,3,416],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_name",p:[18,4,446]}]}," ",{p:[20,3,483],t:7,e:"div",a:{"class":"itemLabel"},f:["Download progress:"]}," ",{p:[23,3,544],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_progress",p:[24,4,574]}," / ",{t:2,r:"data.download_size",p:[24,33,603]}," GQ"]}," ",{p:[26,3,642],t:7,e:"div",a:{"class":"itemLabel"},f:["Transfer speed:"]}," ",{p:[29,3,700],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.download_netspeed",p:[30,4,730]},"GQ/s"]}," ",{p:[32,3,774],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[35,3,826],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[36,4,856],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Abort download"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading"],s:"(!(_0))&&(_1)"},f:[" ",{p:[39,3,954],t:7,e:"h2",f:["Server enabled"]}," ",{p:[40,3,981],t:7,e:"div",a:{"class":"itemLabel"},f:["Connected clients:"]}," ",{p:[43,3,1042],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_clients",p:[44,4,1072]}]}," ",{p:[46,3,1109],t:7,e:"div",a:{"class":"itemLabel"},f:["Provided file:"]}," ",{p:[49,3,1166],t:7,e:"div",a:{"class":"itemContent"},f:[{t:2,r:"data.upload_filename",p:[50,4,1196]}]}," ",{p:[52,3,1234],t:7,e:"div",a:{"class":"itemLabel"},f:["Server password:"]}," ",{p:[55,3,1293],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ENABLED"],n:50,r:"data.upload_haspassword",p:[56,4,1323]},{t:4,n:51,f:["DISABLED"],r:"data.upload_haspassword"}]}," ",{p:[62,3,1420],t:7,e:"div",a:{"class":"itemLabel"},f:["Commands:"]}," ",{p:[65,3,1472],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[66,4,1502],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[67,4,1567],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Exit server"]}]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(_2))"},f:[" ",{p:[70,3,1668],t:7,e:"h2",f:["File transfer server ready. Select file to upload:"]}," ",{p:[71,3,1732],t:7,e:"table",f:[{p:[72,3,1743],t:7,e:"tr",f:[{p:[72,7,1747],t:7,e:"th",f:["File name"]},{p:[72,20,1760],t:7,e:"th",f:["File size"]},{p:[72,33,1773],t:7,e:"th",f:["Controls ",{t:4,f:[{p:[74,4,1824],t:7,e:"tr",f:[{p:[74,8,1828],t:7,e:"td",f:[{t:2,r:"filename",p:[74,12,1832]}]},{p:[75,4,1849],t:7,e:"td",f:[{t:2,r:"size",p:[75,8,1853]},"GQ"]},{p:[76,4,1868],t:7,e:"td",f:[{p:[76,8,1872],t:7,e:"ui-button",a:{action:"PRG_uploadfile",params:['{"id": "',{t:2,r:"uid",p:[76,59,1923]},'"}']},f:["Select"]}]}]}],n:52,r:"data.upload_filelist",p:[73,3,1789]}]}]}]}," ",{p:[79,3,1981],t:7,e:"hr"}," ",{p:[80,3,1989],t:7,e:"ui-button",a:{action:"PRG_setpassword"},f:["Set password"]}," ",{p:[81,3,2053],t:7,e:"ui-button",a:{action:"PRG_reset"},f:["Return"]}]},{t:4,n:50,x:{r:["data.downloading","data.uploading","data.upload_filelist"],s:"(!(_0))&&((!(_1))&&(!(_2)))"},f:[" ",{p:[83,3,2116],t:7,e:"h2",f:["Available files:"]}," ",{p:[84,3,2145],t:7,e:"table",a:{border:"1",style:"border-collapse: collapse"},f:[{p:[84,55,2197],t:7,e:"tr",f:[{p:[84,59,2201],t:7,e:"th",f:["Server UID"]},{p:[84,73,2215],t:7,e:"th",f:["File Name"]},{p:[84,86,2228],t:7,e:"th",f:["File Size"]},{p:[84,99,2241],t:7,e:"th",f:["Password Protection"]},{p:[84,122,2264],t:7,e:"th",f:["Operations ",{t:4,f:[{p:[86,5,2311],t:7,e:"tr",f:[{p:[86,9,2315],t:7,e:"td",f:[{t:2,r:"uid",p:[86,13,2319]}]},{p:[87,5,2332],t:7,e:"td",f:[{t:2,r:"filename",p:[87,9,2336]}]},{p:[88,5,2354],t:7,e:"td",f:[{t:2,r:"size",p:[88,9,2358]},"GQ ",{t:4,f:[{p:[90,6,2400],t:7,e:"td",f:["Enabled"]}],n:50,r:"haspassword",p:[89,5,2374]}," ",{t:4,f:[{p:[93,6,2457],t:7,e:"td",f:["Disabled"]}],n:50,x:{r:["haspassword"],s:"!_0"},p:[92,5,2430]}]},{p:[96,5,2494],t:7,e:"td",f:[{p:[96,9,2498],t:7,e:"ui-button",a:{action:"PRG_downloadfile",params:['{"id": "',{t:2,r:"uid",p:[96,62,2551]},'"}']},f:["Download"]}]}]}],n:52,r:"data.servers",p:[85,4,2283]}]}]}]}," ",{p:[99,3,2612],t:7,e:"hr"}," ",{p:[100,3,2620],t:7,e:"ui-button",a:{action:"PRG_uploadmenu"},f:["Send file"]}]}],r:"data.error"}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],276:[function(t,e,n){var a=t(205),r={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}})})}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[43,1,1082],t:7,e:"ntosheader"}," ",{p:[45,1,1099],t:7,e:"ui-display",a:{title:"Network"},f:[{t:4,f:[{p:[47,5,1157],t:7,e:"ui-linegraph",a:{points:[{t:2,r:"graphData", + p:[47,27,1179]}],height:"500",legend:'["Available", "Load"]',colors:'["rgb(0, 102, 0)", "rgb(153, 0, 0)"]',xunit:"seconds ago",xfactor:[{t:2,r:"data.interval",p:[49,38,1331]}],yunit:"W",yfactor:"1",xinc:[{t:2,x:{r:["data.stored"],s:"_0/10"},p:[50,15,1387]}],yinc:"9"}}],n:50,r:"config.fancy",p:[46,3,1131]},{t:4,n:51,f:[{p:[52,5,1437],t:7,e:"ui-section",a:{label:"Available"},f:[{p:[53,7,1475],t:7,e:"span",f:[{t:2,r:"data.supply",p:[53,13,1481]}," W"]}]}," ",{p:[55,5,1530],t:7,e:"ui-section",a:{label:"Load"},f:[{p:[56,9,1565],t:7,e:"span",f:[{t:2,r:"data.demand",p:[56,15,1571]}," W"]}]}],r:"config.fancy"}]}," ",{p:[60,1,1642],t:7,e:"ui-display",a:{title:"Areas"},f:[{p:[61,3,1672],t:7,e:"ui-section",a:{nowrap:0},f:[{p:[62,5,1697],t:7,e:"div",a:{"class":"content"},f:["Area"]}," ",{p:[63,5,1734],t:7,e:"div",a:{"class":"content"},f:["Charge"]}," ",{p:[64,5,1773],t:7,e:"div",a:{"class":"content"},f:["Load"]}," ",{p:[65,5,1810],t:7,e:"div",a:{"class":"content"},f:["Status"]}," ",{p:[66,5,1849],t:7,e:"div",a:{"class":"content"},f:["Equipment"]}," ",{p:[67,5,1891],t:7,e:"div",a:{"class":"content"},f:["Lighting"]}," ",{p:[68,5,1932],t:7,e:"div",a:{"class":"content"},f:["Environment"]}]}," ",{t:4,f:[{p:[71,5,2017],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[71,24,2036]}],nowrap:0},f:[{p:[72,7,2061],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].charge)"},p:[72,28,2082]}," %"]}," ",{p:[73,7,2140],t:7,e:"div",a:{"class":"content"},f:[{t:2,x:{r:["@index","adata.areas"],s:"Math.round(_1[_0].load)"},p:[73,28,2161]}," W"]}," ",{p:[74,7,2217],t:7,e:"div",a:{"class":"content"},f:[{p:[74,28,2238],t:7,e:"span",a:{"class":[{t:2,x:{r:["chargingState","charging"],s:"_0(_1)"},p:[74,41,2251]}]},f:[{t:2,x:{r:["chargingMode","charging"],s:"_0(_1)"},p:[74,70,2280]}]}]}," ",{p:[75,7,2327],t:7,e:"div",a:{"class":"content"},f:[{p:[75,28,2348],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","eqp"],s:"_0(_1)"},p:[75,41,2361]}]},f:[{t:2,x:{r:["channelPower","eqp"],s:"_0(_1)"},p:[75,64,2384]}," [",{p:[75,87,2407],t:7,e:"span",f:[{t:2,x:{r:["channelMode","eqp"],s:"_0(_1)"},p:[75,93,2413]}]},"]"]}]}," ",{p:[76,7,2462],t:7,e:"div",a:{"class":"content"},f:[{p:[76,28,2483],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","lgt"],s:"_0(_1)"},p:[76,41,2496]}]},f:[{t:2,x:{r:["channelPower","lgt"],s:"_0(_1)"},p:[76,64,2519]}," [",{p:[76,87,2542],t:7,e:"span",f:[{t:2,x:{r:["channelMode","lgt"],s:"_0(_1)"},p:[76,93,2548]}]},"]"]}]}," ",{p:[77,7,2597],t:7,e:"div",a:{"class":"content"},f:[{p:[77,28,2618],t:7,e:"span",a:{"class":[{t:2,x:{r:["channelState","env"],s:"_0(_1)"},p:[77,41,2631]}]},f:[{t:2,x:{r:["channelPower","env"],s:"_0(_1)"},p:[77,64,2654]}," [",{p:[77,87,2677],t:7,e:"span",f:[{t:2,x:{r:["channelMode","env"],s:"_0(_1)"},p:[77,93,2683]}]},"]"]}]}]}],n:52,r:"data.areas",p:[70,3,1991]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],277:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{p:[4,1,64],t:7,e:"ui-display",f:[{p:[5,2,79],t:7,e:"div",a:{"class":"item"},f:[{p:[6,3,101],t:7,e:"div",a:{"class":"itemLabel"},f:["Payload status:"]}," ",{p:[9,3,158],t:7,e:"div",a:{"class":"itemContent"},f:[{t:4,f:["ARMED"],n:50,r:"data.armed",p:[10,4,188]},{t:4,n:51,f:["DISARMED"],r:"data.armed"}]}," ",{p:[16,3,270],t:7,e:"div",a:{"class":"itemLabel"},f:["Controls:"]}," ",{p:[19,3,321],t:7,e:"div",a:{"class":"itemContent"},f:[{p:[20,4,351],t:7,e:"table",f:[{p:[21,4,363],t:7,e:"tr",f:[{p:[21,8,367],t:7,e:"td",f:[{p:[21,12,371],t:7,e:"ui-button",a:{action:"PRG_obfuscate"},f:["OBFUSCATE PROGRAM NAME"]}]}]},{p:[22,4,444],t:7,e:"tr",f:[{p:[22,8,448],t:7,e:"td",f:[{p:[22,12,452],t:7,e:"ui-button",a:{action:"PRG_arm",state:[{t:2,x:{r:["data.armed"],s:'_0?"danger":null'},p:[22,47,487]}]},f:[{t:2,x:{r:["data.armed"],s:'_0?"DISARM":"ARM"'},p:[22,81,521]}]}," ",{p:[23,4,571],t:7,e:"ui-button",a:{icon:"radiation",state:[{t:2,x:{r:["data.armed"],s:'_0?null:"disabled"'},p:[23,39,606]}],action:"PRG_activate"},f:["ACTIVATE"]}]}]}]}]}]}]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],278:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[" ",{p:[2,1,47],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[5,3,95],t:7,e:"ui-display",a:{title:[{t:2,r:"class",p:[5,22,114]}," Alarms"]},f:[{p:[6,5,138],t:7,e:"ul",f:[{t:4,f:[{p:[8,9,171],t:7,e:"li",f:[{t:2,r:".",p:[8,13,175]}]}],n:52,r:".",p:[7,7,150]},{t:4,n:51,f:[{p:[10,9,211],t:7,e:"li",f:["System Nominal"]}],r:"."}]}]}],n:52,i:"class",r:"data.alarms",p:[4,1,64]}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],279:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{integState:function(t){var e=100;return t==e?"good":t>e/2?"average":"bad"},bigState:function(t,e,n){return charge>n?"bad":t>e?"average":"good"}}}}(r),r.exports.template={v:3,t:[" "," ",{p:[23,1,421],t:7,e:"ntosheader"}," ",{t:4,f:[{p:[27,2,462],t:7,e:"ui-button",a:{action:"PRG_clear"},f:["Back to Menu"]},{p:[27,56,516],t:7,e:"br"}," ",{p:[28,3,524],t:7,e:"ui-display",a:{title:"Supermatter Status:"},f:[{p:[29,3,568],t:7,e:"ui-section",a:{label:"Core Integrity"},f:[{p:[30,5,609],t:7,e:"ui-bar",a:{min:"0",max:"100",value:[{t:2,r:"adata.SM_integrity",p:[30,38,642]}],state:[{t:2,x:{r:["integState","adata.SM_integrity"],s:"_0(_1)"},p:[30,69,673]}]},f:[{t:2,r:"data.SM_integrity",p:[30,105,709]},"%"]}]}," ",{p:[32,3,761],t:7,e:"ui-section",a:{label:"Relative EER"},f:[{p:[33,5,800],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_power"],s:"_0(_1,150,300)"},p:[33,18,813]}]},f:[{t:2,r:"data.SM_power",p:[33,55,850]}," MeV/cm3"]}]}," ",{p:[35,3,903],t:7,e:"ui-section",a:{label:"Temperature"},f:[{p:[36,5,941],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambienttemp"],s:"_0(_1,4000,5000)"},p:[36,18,954]}]},f:[{t:2,r:"data.SM_ambienttemp",p:[36,63,999]}," K"]}]}," ",{p:[38,3,1052],t:7,e:"ui-section",a:{label:"Pressure"},f:[{p:[39,5,1087],t:7,e:"span",a:{"class":[{t:2,x:{r:["bigState","data.SM_ambientpressure"],s:"_0(_1,5000,10000)"},p:[39,18,1100]}]},f:[{t:2,r:"data.SM_ambientpressure",p:[39,68,1150]}," kPa"]}]}]}," ",{p:[42,3,1227],t:7,e:"hr"},{p:[42,7,1231],t:7,e:"br"}," ",{p:[43,3,1239],t:7,e:"ui-display",a:{title:"Gas Composition:"},f:[{t:4,f:[{p:[45,5,1307],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[45,24,1326]}]},f:[{t:2,r:"amount",p:[46,6,1343]}," %"]}],n:52,r:"data.gases",p:[44,4,1281]}]}],n:50,r:"data.active",p:[26,1,440]},{t:4,n:51,f:[{p:[51,2,1418],t:7,e:"ui-button",a:{action:"PRG_refresh"},f:["Refresh"]},{p:[51,53,1469],t:7,e:"br"}," ",{p:[52,2,1476],t:7,e:"ui-display",a:{title:"Detected Supermatters"},f:[{t:4,f:[{p:[54,3,1552],t:7,e:"ui-section",a:{label:"Area"},f:[{t:2,r:"area_name",p:[55,5,1583]}," - (#",{t:2,r:"uid",p:[55,23,1601]},")"]}," ",{p:[57,3,1630],t:7,e:"ui-section",a:{label:"Integrity"},f:[{t:2,r:"integrity",p:[58,5,1666]}," %"]}," ",{p:[60,3,1702],t:7,e:"ui-section",a:{label:"Options"},f:[{p:[61,5,1736],t:7,e:"ui-button",a:{action:"PRG_set",params:['{"target" : "',{t:2,r:"uid",p:[61,54,1785]},'"}']},f:["View Details"]}]}],n:52,r:"data.supermatters",p:[53,2,1521]}]}],r:"data.active"}]},r.exports.components=r.exports.components||{};var i={ntosheader:t(280)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,280:280}],280:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"div",a:{"class":"item",style:"float: left"},f:[{p:[2,2,41],t:7,e:"table",f:[{p:[2,9,48],t:7,e:"tr",f:[{t:4,f:[{p:[4,3,113],t:7,e:"td",f:[{p:[4,7,117],t:7,e:"img",a:{src:[{t:2,r:"data.PC_batteryicon",p:[4,17,127]}]}}]}],n:50,x:{r:["data.PC_batteryicon","data.PC_showbatteryicon"],s:"_0&&_1"},p:[3,2,55]}," ",{t:4,f:[{p:[7,3,226],t:7,e:"td",f:[{p:[7,7,230],t:7,e:"b",f:[{t:2,r:"data.PC_batterypercent",p:[7,10,233]}]}]}],n:50,x:{r:["data.PC_batterypercent","data.PC_showbatteryicon"],s:"_0&&_1"},p:[6,2,165]}," ",{t:4,f:[{p:[10,3,305],t:7,e:"td",f:[{p:[10,7,309],t:7,e:"img",a:{src:[{t:2,r:"data.PC_ntneticon",p:[10,17,319]}]}}]}],n:50,r:"data.PC_ntneticon",p:[9,2,276]}," ",{t:4,f:[{p:[13,3,386],t:7,e:"td",f:[{p:[13,7,390],t:7,e:"img",a:{src:[{t:2,r:"data.PC_apclinkicon",p:[13,17,400]}]}}]}],n:50,r:"data.PC_apclinkicon",p:[12,2,355]}," ",{t:4,f:[{p:[16,3,469],t:7,e:"td",f:[{p:[16,7,473],t:7,e:"b",f:[{t:2,r:"data.PC_stationtime",p:[16,10,476]}]}]}],n:50,r:"data.PC_stationtime",p:[15,2,438]}," ",{t:4,f:[{p:[19,3,552],t:7,e:"td",f:[{p:[19,7,556],t:7,e:"img",a:{src:[{t:2,r:"icon",p:[19,17,566]}]}}]}],n:52,r:"data.PC_programheaders",p:[18,2,516]}]}]}]}," ",{p:[23,1,609],t:7,e:"div",a:{style:"float: right; margin-top: 5px"},f:[{p:[24,2,655],t:7,e:"ui-button",a:{action:"PC_shutdown"},f:["Shutdown"]}," ",{t:4,f:[{p:[26,3,745],t:7,e:"ui-button",a:{action:"PC_exit"},f:["EXIT PROGRAM"]}," ",{p:[27,3,801],t:7,e:"ui-button",a:{action:"PC_minimize"},f:["Minimize Program"]}],n:50,r:"data.PC_showexitprogram",p:[25,2,710]}]}," ",{p:[30,1,881],t:7,e:"div",a:{style:"clear: both"}}]},e.exports=a.extend(r.exports)},{205:205}],281:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",a:{title:"Auth. Disk:"},f:[{t:4,f:[{p:[3,7,69],t:7,e:"ui-button",a:{icon:"eject",style:"selected",action:"eject_disk"},f:["++++++++++"]}],n:50,r:"data.disk_present",p:[2,3,36]},{t:4,n:51,f:[{p:[5,7,172],t:7,e:"ui-button",a:{icon:"plus",action:"insert_disk"},f:["----------"]}],r:"data.disk_present"}]}," ",{p:[8,1,266],t:7,e:"ui-display",a:{title:"Status"},f:[{p:[9,3,297],t:7,e:"span",f:[{t:2,r:"data.status1",p:[9,9,303]},"-",{t:2,r:"data.status2",p:[9,26,320]}]}]}," ",{p:[11,1,360],t:7,e:"ui-display",a:{title:"Timer"},f:[{p:[12,3,390],t:7,e:"ui-section",a:{label:"Time to Detonation"},f:[{p:[13,5,435],t:7,e:"span",f:[{t:2,x:{r:["data.timing","data.time_left","data.timer_set"],s:"_0?_1:_2"},p:[13,11,441]}]}]}," ",{t:4,f:[{p:[16,5,540],t:7,e:"ui-section",a:{label:"Adjust Timer"},f:[{p:[17,7,581],t:7,e:"ui-button",a:{icon:"refresh",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_default"],s:'_0&&_1&&_2?null:"disabled"'},p:[17,40,614]}],action:"timer",params:'{"change": "reset"}'},f:["Reset"]}," ",{p:[19,7,786],t:7,e:"ui-button",a:{icon:"minus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_min"],s:'_0&&_1&&_2?null:"disabled"'},p:[19,38,817]}],action:"timer",params:'{"change": "decrease"}'},f:["Decrease"]}," ",{p:[21,7,991],t:7,e:"ui-button",a:{icon:"pencil",state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[21,39,1023]}],action:"timer",params:'{"change": "input"}'},f:["Set"]}," ",{p:[22,7,1155],t:7,e:"ui-button",a:{icon:"plus",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.timer_is_not_max"],s:'_0&&_1&&_2?null:"disabled"'},p:[22,37,1185]}],action:"timer",params:'{"change": "increase"}'},f:["Increase"]}]}],n:51,r:"data.timing",p:[15,3,518]}," ",{p:[26,3,1394],t:7,e:"ui-section",a:{label:"Timer"},f:[{p:[27,5,1426],t:7,e:"ui-button",a:{icon:"clock-o",style:[{t:2,x:{r:["data.timing"],s:'_0?"danger":"caution"'},p:[27,38,1459]}],action:"toggle_timer",state:[{t:2,x:{r:["data.disk_present","data.code_approved","data.safety"],s:'_0&&_1&&!_2?null:"disabled"'},p:[29,14,1542]}]},f:[{t:2,x:{r:["data.timing"],s:'_0?"On":"Off"'},p:[30,7,1631]}]}]}]}," ",{p:[34,1,1713],t:7,e:"ui-display",a:{title:"Anchoring"},f:[{p:[35,3,1747],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[36,12,1770]}],icon:[{t:2,x:{r:["data.anchored"],s:'_0?"lock":"unlock"'},p:[37,11,1846]}],style:[{t:2,x:{r:["data.anchored"],s:'_0?null:"caution"'},p:[38,12,1897]}],action:"anchor"},f:[{t:2,x:{r:["data.anchored"],s:'_0?"Engaged":"Off"'},p:[39,21,1956]}]}]}," ",{p:[41,1,2022],t:7,e:"ui-display",a:{title:"Safety"},f:[{p:[42,3,2053],t:7,e:"ui-button",a:{state:[{t:2,x:{r:["data.disk_present","data.code_approved"],s:'_0&&_1?null:"disabled"'},p:[43,12,2076]}],icon:[{t:2,x:{r:["data.safety"],s:'_0?"lock":"unlock"'},p:[44,11,2152]}],action:"safety",style:[{t:2,x:{r:["data.safety"],s:'_0?"caution":"danger"'},p:[45,12,2217]}]},f:[{p:[46,7,2265],t:7,e:"span",f:[{t:2,x:{r:["data.safety"],s:'_0?"On":"Off"'},p:[46,13,2271]}]}]}]}," ",{p:[49,1,2341],t:7,e:"ui-display",a:{title:"Code"},f:[{p:[50,3,2370],t:7,e:"ui-section",a:{label:"Message"},f:[{t:2,r:"data.message",p:[50,31,2398]}]}," ",{p:[51,3,2431],t:7,e:"ui-section",a:{label:"Keypad"},f:[{p:[52,5,2464],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[52,39,2498]}],params:'{"digit":"1"}'},f:["1"]}," ",{p:[53,5,2583],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[53,39,2617]}],params:'{"digit":"2"}'},f:["2"]}," ",{p:[54,5,2702],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[54,39,2736]}],params:'{"digit":"3"}'},f:["3"]}," ",{p:[55,5,2821],t:7,e:"br"}," ",{p:[56,5,2831],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[56,39,2865]}],params:'{"digit":"4"}'},f:["4"]}," ",{p:[57,5,2950],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[57,39,2984]}],params:'{"digit":"5"}'},f:["5"]}," ",{p:[58,5,3069],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[58,39,3103]}],params:'{"digit":"6"}'},f:["6"]}," ",{p:[59,5,3188],t:7,e:"br"}," ",{p:[60,5,3198],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[60,39,3232]}],params:'{"digit":"7"}'},f:["7"]}," ",{p:[61,5,3317],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[61,39,3351]}],params:'{"digit":"8"}'},f:["8"]}," ",{p:[62,5,3436],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[62,39,3470]}],params:'{"digit":"9"}'},f:["9"]}," ",{p:[63,5,3555],t:7,e:"br"}," ",{p:[64,5,3565],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[64,39,3599]}],params:'{"digit":"R"}'},f:["R"]}," ",{p:[65,5,3684],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[65,39,3718]}],params:'{"digit":"0"}'},f:["0"]}," ",{p:[66,5,3803],t:7,e:"ui-button",a:{action:"keypad",state:[{t:2,x:{r:["data.disk_present"],s:'_0?null:"disabled"'},p:[66,39,3837]}],params:'{"digit":"E"}'},f:["E"]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],282:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:[1,1,0],t:7,e:"ui-display",f:[{p:[2,2,15],t:7,e:"ui-section",f:["This machine only accepts ore. Gibtonite and Slag are not accepted."]}," ",{p:[5,2,117],t:7,e:"ui-section",f:["Current unclaimed points: ",{t:2,r:"data.unclaimedPoints",p:[6,29,159]}," ",{t:4,f:[{p:[8,4,220],t:7,e:"ui-button",a:{action:"Claim"},f:["Claim Points"]}],n:50,r:"data.unclaimedPoints",p:[7,3,187]}]}," ",{p:[13,2,311],t:7,e:"ui-section",f:[{t:4,f:[{p:[15,4,350],t:7,e:"ui-button",a:{action:"Eject"},f:["Eject ID"]}," You have ",{t:2,r:"data.claimedPoints",p:[18,13,421]}," mining points collected."],n:50,r:"data.hasID",p:[14,3,327]},{t:4,n:51,f:[{p:[20,4,485],t:7,e:"ui-button",a:{action:"Insert"},f:["Insert ID"]}],r:"data.hasID"}]}]}," ",{p:[26,1,588],t:7,e:"ui-display",f:[{t:4,f:[{p:[28,3,627],t:7,e:"ui-section",f:[{p:[29,4,644],t:7,e:"ui-button",a:{action:"diskEject",icon:"eject"},f:["Eject Disk"]}]}," ",{t:4,f:[{p:[34,4,772],t:7,e:"ui-section",a:{"class":"candystripe"},f:[{p:[35,5,808],t:7,e:"ui-button",a:{action:"diskUpload",state:[{t:2,x:{r:["canupload"],s:'(_0)?null:"disabled"'},p:[35,42,845]}],icon:"upload",align:"right",params:['{ "design" : "',{t:2,r:"index",p:[35,129,932]},'" }']},f:["Upload"]}," File ",{t:2,r:"index",p:[38,10,988]},": ",{t:2,r:"name",p:[38,21,999]}]}],n:52,r:"data.diskDesigns",p:[33,3,741]}],n:50,r:"data.hasDisk",p:[27,2,603]},{t:4,n:51,f:[{p:[42,3,1053],t:7,e:"ui-section",f:[{p:[43,4,1070],t:7,e:"ui-button",a:{action:"diskInsert",icon:"floppy-o"},f:["Insert Disk"]}]}],r:"data.hasDisk"}]}," ",{p:[49,1,1195],t:7,e:"div",a:{"class":"display tabular"},f:[{p:[50,2,1227],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[51,4,1261],t:7,e:"section",a:{"class":"cell"},f:["Mineral"]}," ",{p:[54,4,1316],t:7,e:"section",a:{"class":"cell"},f:["Sheets"]}," ",{p:[57,4,1370],t:7,e:"section",a:{"class":"cell"},f:[]}," ",{p:[59,4,1412],t:7,e:"section",a:{"class":"cell"},f:[{p:[60,5,1440],t:7,e:"ui-button",a:{"class":"center mineral",grid:0,action:"Release",params:'{"id" : "all"}'},f:["Release All"]}]}," ",{p:[64,4,1576],t:7,e:"section",a:{"class":"cell"},f:["Ore Value"]}]}," ",{t:4,f:[{p:[69,3,1673],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[70,4,1707],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[71,5,1735]}]}," ",{p:[73,4,1763],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[74,5,1805]}]}," ",{p:[76,4,1835],t:7,e:"section",a:{"class":"cell"},f:[{p:[77,5,1863],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[77,18,1876]}],placeholder:"###","class":"number"}}]}," ",{p:[79,4,1941],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[80,5,1983],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Release",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[80,59,2037]}],params:['{ "id" : ',{t:2,r:"id",p:[80,114,2092]},', "sheets" : ',{t:2,r:"sheets",p:[80,133,2111]}," }"]},f:["Release"]}]}," ",{p:[84,4,2178],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"value",p:[85,5,2220]}]}]}],n:52,r:"data.materials",p:[68,2,1645]}," ",{t:4,f:[{p:[90,3,2298],t:7,e:"section",a:{"class":"candystripe"},f:[{p:[91,4,2332],t:7,e:"section",a:{"class":"cell"},f:[{t:2,r:"name",p:[92,5,2360]}]}," ",{p:[94,4,2388],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{t:2,r:"amount",p:[95,5,2430]}]}," ",{p:[97,4,2460],t:7,e:"section",a:{"class":"cell"},f:[{p:[98,5,2488],t:7,e:"input",a:{value:[{t:2,r:"sheets",p:[98,18,2501]}],placeholder:"###","class":"number"}}]}," ",{p:[100,4,2566],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[101,5,2608],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"Smelt",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[101,57,2660]}],params:['{ "id" : ',{t:2,r:"id",p:[101,113,2716]},', "sheets" : ',{t:2,r:"sheets",p:[101,132,2735]}," }"]},f:["Smelt"]}]}," ",{p:[105,4,2799],t:7,e:"section",a:{"class":"cell",align:"right"},f:[{p:[106,5,2841],t:7,e:"ui-button",a:{"class":"center",grid:0,action:"SmeltAll",state:[{t:2,x:{r:["amount"],s:'(_0>=1)?null:"disabled"'},p:[106,60,2896]}],params:['{ "id" : ',{t:2,r:"id",p:[106,116,2952]}," }"]},f:["Smelt All"]}]}]}],n:52,r:"data.alloys",p:[89,2,2273]}]}]},e.exports=a.extend(r.exports)},{205:205}],283:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{p:{button:[{p:[3,3,60],t:7,e:"ui-button",a:{icon:"remove",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[3,35,92]}],action:"empty_eject_beaker"},f:["Empty and eject"]}," ",{p:[6,3,201],t:7,e:"ui-button",a:{icon:"trash",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[6,34,232]}],action:"empty_beaker"},f:["Empty"]}," ",{p:[9,3,325],t:7,e:"ui-button",a:{icon:"eject",state:[{t:2,x:{r:["data.has_beaker"],s:'_0?null:"disabled"'},p:[9,34,356]}],action:"eject_beaker"},f:["Eject"]}]},t:7,e:"ui-display",a:{title:"Beaker",button:0},f:[" ",{t:4,f:[{p:[14,3,490],t:7,e:"ui-section",f:[{t:4,f:[{p:[16,5,538],t:7,e:"span",a:{"class":"bad"},f:["The beaker is empty!"]}],n:50,r:"data.beaker_empty",p:[15,4,507]},{t:4,n:51,f:[{p:[18,5,602],t:7,e:"ui-subdisplay",a:{title:"Blood"},f:[{t:4,f:[{p:[20,7,668],t:7,e:"ui-section",a:{label:"Blood DNA"},f:[{t:2,r:"data.blood.dna",p:[20,37,698]}]}," ",{p:[21,7,737],t:7,e:"ui-section",a:{label:"Blood type"},f:[{t:2,r:"data.blood.type",p:[21,38,768]}]}],n:50,r:"data.has_blood",p:[19,6,638]},{t:4,n:51,f:[{p:[23,7,823],t:7,e:"ui-section",f:[{p:[24,8,844],t:7,e:"span",a:{"class":"average"},f:["No blood sample detected."]}]}],r:"data.has_blood"}]}],r:"data.beaker_empty"}]}],n:50,r:"data.has_beaker",p:[13,2,463]},{t:4,n:51,f:[{p:[31,3,999],t:7,e:"ui-section",f:[{p:[32,4,1016],t:7,e:"span",a:{"class":"bad"},f:["No beaker loaded."]}]}],r:"data.has_beaker"}]}," ",{t:4,f:[{p:[37,2,1127],t:7,e:"ui-display",a:{title:"Diseases"},f:[{t:4,f:[{p:{button:[{t:4,f:[{p:[42,7,1277],t:7,e:"ui-button",a:{icon:"pencil",action:"rename_disease",state:[{t:2,x:{r:["can_rename"],s:'_0?"":"disabled"'},p:[42,63,1333]}],params:['{"index": ',{t:2,r:"index",p:[42,115,1385]},"}"]},f:["Name advanced disease"]}],n:50,r:"is_adv",p:[41,6,1255]}," ",{p:[46,6,1468],t:7,e:"ui-button",a:{icon:"flask",action:"create_culture_bottle",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[46,68,1530]}],params:['{"index": ',{t:2,r:"index",p:[46,123,1585]},"}"]},f:["Create virus culture bottle"]}]},t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[39,23,1206]}],button:0},f:[" ",{p:[50,5,1675],t:7,e:"ui-section",a:{label:"Disease agent"},f:[{t:2,r:"agent",p:[50,39,1709]}]}," ",{p:[51,5,1737],t:7,e:"ui-section",a:{label:"Description"},f:[{t:2,r:"description",p:[51,37,1769]}]}," ",{p:[52,5,1803],t:7,e:"ui-section",a:{label:"Spread"},f:[{t:2,r:"spread",p:[52,32,1830]}]}," ",{p:[53,5,1859],t:7,e:"ui-section",a:{label:"Possible cure"},f:[{t:2,r:"cure",p:[53,39,1893]}]}," ",{t:4,f:[{p:[55,6,1942],t:7,e:"ui-section",a:{label:"Resistance"},f:[{t:2,r:"resistance",p:[55,37,1973]}]}," ",{p:[56,6,2007],t:7,e:"ui-section",a:{label:"Stealth"},f:[{t:2,r:"stealth",p:[56,34,2035]}]}," ",{p:[57,6,2066],t:7,e:"ui-section",a:{label:"Stage speed"},f:[{t:2,r:"stage_speed",p:[57,38,2098]}]}," ",{p:[58,6,2133],t:7,e:"ui-section",a:{label:"Symptoms"},f:[{t:4,f:[{p:[60,8,2197],t:7,e:"span",f:[{t:2,r:"name",p:[60,14,2203]}]},{p:[60,29,2218],t:7,e:"br"}],n:52,r:"symptoms",p:[59,7,2170]}]}],n:50,r:"is_adv",p:[54,5,1921]}]}],n:52,r:"data.viruses",p:[38,3,1160]},{t:4,n:51,f:[{p:[66,4,2309],t:7,e:"ui-section",f:[{p:[67,5,2327],t:7,e:"span",a:{"class":"average"},f:["No detectable virus in the blood sample."]}]}],r:"data.viruses"}]}," ",{p:[71,2,2446],t:7,e:"ui-display",a:{title:"Antibodies"},f:[{t:4,f:[{p:[73,4,2512],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[73,23,2531]}]},f:[{p:[74,6,2548],t:7,e:"ui-button",a:{icon:"eyedropper",state:[{t:2,x:{r:["data.is_ready"],s:'_0?"":"disabled"'},p:[74,42,2584]}],action:"create_vaccine_bottle",params:['{"index": ',{t:2,r:"id",p:[74,128,2670]},"}"]},f:["Create vaccine bottle"]}]}],n:52,r:"data.resistances",p:[72,3,2481]},{t:4,n:51,f:[{p:[79,4,2762],t:7,e:"ui-section",f:[{p:[80,5,2780],t:7,e:"span",a:{"class":"average"},f:["No antibodies detected in the blood sample."]}]}],r:"data.resistances"}]}],n:50,r:"data.has_blood",p:[36,1,1102]}]},e.exports=a.extend(r.exports)},{205:205}],284:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(312);e.exports={data:{filter:"",tooltiptext:function(t,e,n){var a="";return t&&(a+="REQUIREMENTS: "+t+" "),e&&(a+="CATALYSTS: "+e+" "),n&&(a+="TOOLS: "+n),a}},oninit:function(){var t=this;this.on({hover:function(t){this.set("hovered",t.context.params)},unhover:function(t){this.set("hovered")}}),this.observe("filter",function(e,a,r){var i=null;i=t.get("data.display_compact")?t.findAll(".section"):t.findAll(".display:not(:first-child)"),(0,n.filterMulti)(i,t.get("filter").toLowerCase())},{init:!1})}}}(r),r.exports.template={v:3,t:[" ",{p:[48,1,1342],t:7,e:"ui-display",a:{title:[{t:2,r:"data.category",p:[48,20,1361]},{t:4,f:[" : ",{t:2,r:"data.subcategory",p:[48,64,1405]}],n:50,r:"data.subcategory",p:[48,37,1378]}]},f:[{t:4,f:[{p:[50,3,1459],t:7,e:"ui-section",f:["Crafting... ",{p:[51,16,1488],t:7,e:"i",a:{"class":"fa-spin fa fa-spinner"}}]}],n:50,r:"data.busy",p:[49,2,1438]},{t:4,n:51,f:[{p:[54,3,1557],t:7,e:"ui-section",f:[{p:[55,4,1574],t:7,e:"table",a:{style:"width:100%"},f:[{p:[56,5,1606],t:7,e:"tr",f:[{p:[57,6,1617],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[58,7,1659],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardCat"},f:[{t:2,r:"data.prev_cat",p:[59,8,1718]}]}]}," ",{p:[62,6,1774],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[63,7,1816],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardCat"},f:[{t:2,r:"data.next_cat",p:[64,7,1874]}]}]}," ",{p:[67,6,1930],t:7,e:"td",a:{style:"float:right!important"},f:[{t:4,f:[{p:[69,7,2014],t:7,e:"ui-button",a:{icon:"lock",action:"toggle_recipes"},f:["Showing Craftable Recipes"]}],n:50,r:"data.display_craftable_only",p:[68,6,1971]},{t:4,n:51,f:[{p:[73,7,2138],t:7,e:"ui-button",a:{icon:"unlock",action:"toggle_recipes"},f:["Showing All Recipes"]}],r:"data.display_craftable_only"}]}," ",{p:[78,6,2268],t:7,e:"td",a:{style:"float:right!important"},f:[{p:[79,7,2310],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.display_compact"],s:'_0?"check-square-o":"square-o"'},p:[79,24,2327]}],action:"toggle_compact"},f:["Compact"]}]}]}," ",{p:[84,5,2474],t:7,e:"tr",f:[{t:4,f:[{p:[86,6,2515],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[87,7,2557],t:7,e:"ui-button",a:{icon:"arrow-left",action:"backwardSubCat"},f:[{t:2,r:"data.prev_subcat",p:[88,8,2619]}]}]}," ",{p:[91,6,2678],t:7,e:"td",a:{style:"width:150px!important"},f:[{p:[92,7,2720],t:7,e:"ui-button",a:{icon:"arrow-right",action:"forwardSubCat"},f:[{t:2,r:"data.next_subcat",p:[93,8,2782]}]}]}],n:50,r:"data.subcategory",p:[85,5,2484]}]}]}," ",{t:4,f:[{t:4,f:[" ",{p:[101,6,2992],t:7,e:"ui-input",a:{value:[{t:2,r:"filter",p:[101,23,3009]}],placeholder:"Filter.."}}],n:51,r:"data.display_compact",p:[100,5,2902]}],n:50,r:"config.fancy",p:[99,4,2876]}]}," ",{t:4,f:[{p:[106,5,3144],t:7,e:"ui-display",f:[{t:4,f:[{p:[108,6,3193],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[108,25,3212]}]},f:[{p:[109,7,3230],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[109,27,3250]}],"tooltip-side":"right",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[109,135,3358]},'"}'],icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.can_craft",p:[107,5,3162]}," ",{t:4,f:[{t:4,f:[{p:[116,7,3567],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[116,26,3586]}]},f:[{p:[117,8,3605],t:7,e:"ui-button",a:{tooltip:[{t:2,x:{r:["tooltiptext","req_text","catalyst_text","tool_text"],s:"_0(_1,_2,_3)"},p:[117,28,3625]}],"tooltip-side":"right",state:"disabled",icon:"gears"},v:{hover:"hover",unhover:"unhover"},f:["Craft"]}]}],n:52,r:"data.cant_craft",p:[115,6,3534]}],n:51,r:"data.display_craftable_only",p:[114,5,3495]}]}],n:50,r:"data.display_compact",p:[105,4,3110]},{t:4,n:51,f:[{t:4,f:[{p:[126,6,3947],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[126,25,3966]}]},f:[{t:4,f:[{p:[128,8,4009],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[129,9,4052]}]}],n:50,r:"req_text",p:[127,7,3984]}," ",{t:4,f:[{p:[133,8,4139],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[134,9,4179]}]}],n:50,r:"catalyst_text",p:[132,7,4109]}," ",{t:4,f:[{p:[138,8,4267],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[139,9,4303]}]}],n:50,r:"tool_text",p:[137,7,4241]}," ",{p:[142,7,4361],t:7,e:"ui-section",f:[{p:[143,8,4382],t:7,e:"ui-button",a:{icon:"gears",action:"make",params:['{"recipe": "',{t:2,r:"ref",p:[143,66,4440]},'"}']},f:["Craft"]}]}]}],n:52,r:"data.can_craft",p:[125,5,3916]}," ",{t:4,f:[{t:4,f:[{p:[151,7,4621],t:7,e:"ui-display",a:{title:[{t:2,r:"name",p:[151,26,4640]}]},f:[{t:4,f:[{p:[153,9,4685],t:7,e:"ui-section",a:{label:"Requirements"},f:[{t:2,r:"req_text",p:[154,10,4729]}]}],n:50,r:"req_text",p:[152,8,4659]}," ",{t:4,f:[{p:[158,9,4820],t:7,e:"ui-section",a:{label:"Catalysts"},f:[{t:2,r:"catalyst_text",p:[159,10,4861]}]}],n:50,r:"catalyst_text",p:[157,8,4789]}," ",{t:4,f:[{p:[163,9,4953],t:7,e:"ui-section",a:{label:"Tools"},f:[{t:2,r:"tool_text",p:[164,10,4990]}]}],n:50,r:"tool_text",p:[162,8,4926]}]}],n:52,r:"data.cant_craft",p:[150,6,4588]}],n:51,r:"data.display_craftable_only",p:[149,5,4549]}],r:"data.display_compact"}],r:"data.busy"}]}]},e.exports=a.extend(r.exports)},{205:205,312:312}],285:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],286:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],287:[function(t,e,n){var a=t(205),r={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}})})}}}}(r),r.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=a.extend(r.exports)},{205:205}],288:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{readableFrequency:function(){return Math.round(this.get("adata.frequency"))/10}}}}(r),r.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=a.extend(r.exports)},{205:205}],289:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,23],t:7,e:"ui-notice",f:[{t:2,r:"data.notice",p:[3,5,40]}]}],n:50,r:"data.notice",p:[1,1,0]},{p:[6,1,82],t:7,e:"ui-display",a:{title:"Satellite Network Control",button:0},f:[{t:4,f:[{p:[8,4,168],t:7,e:"ui-section",a:{candystripe:0,nowrap:0},f:[{p:[9,9,209],t:7,e:"div",a:{"class":"content"},f:["#",{t:2,r:"id",p:[9,31,231]}]}," ",{p:[10,9,253],t:7,e:"div",a:{"class":"content"},f:[{t:2,r:"mode",p:[10,30,274]}]}," ",{p:[11,9,298],t:7,e:"div",a:{"class":"content"},f:[{p:[12,11,331],t:7,e:"ui-button",a:{action:"toggle",params:['{"id": "',{t:2,r:"id",p:[12,54,374]},'"}']},f:[{t:2,x:{r:["active"],s:'_0?"Deactivate":"Activate"'},p:[12,64,384]}]}]}]}],n:52,r:"data.satellites",p:[7,2,138]}]}," ",{t:4,f:[{p:[18,1,528],t:7,e:"ui-display",a:{title:"Station Shield Coverage"},f:[{p:[19,3,576],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"data.meteor_shield_coverage_max",p:[19,24,597]}],value:[{t:2,r:"data.meteor_shield_coverage",p:[19,68,641]}]},f:[{t:2,x:{r:["data.meteor_shield_coverage","data.meteor_shield_coverage_max"],s:"100*_0/_1"},p:[19,101,674]}," %"]}," ",{p:[20,1,758],t:7,e:"ui-display",f:[]}]}],n:50,r:"data.meteor_shield",p:[17,1,500]}]},e.exports=a.extend(r.exports)},{205:205}],290:[function(t,e,n){var a=t(205),r={exports:{}};r.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]}]}]}]},r.exports.components=r.exports.components||{};var i={modification:t(291),templates:t(293),status:t(292)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.exports)},{205:205,291:291,292:292,293:293}],291:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],292:[function(t,e,n){var a=t(205),r={exports:{}};r.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"]}," ",{p:[10,5,252],t:7,e:"ui-button",a:{action:"fast_travel",params:['{"id": "',{t:2,r:"id",p:[10,53,300]},'"}'],state:[{t:2,x:{r:["can_fast_travel"],s:'_0?null:"disabled"'},p:[10,70,317]}]},f:["Fast Travel"]}]}],n:52,r:"data.shuttles",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],293:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],294:[function(t,e,n){var a=t(205),r={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"}}}}}(r),r.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=a.extend(r.exports)},{205:205}],295:[function(t,e,n){var a=t(205),r={exports:{}};r.exports.template={v:3,t:[{t:4,f:[{p:[2,3,25],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[2,22,44]}],labelcolor:[{t:2,r:"htmlcolor",p:[2,44,66]}],candystripe:0,right:0},f:[{p:[3,5,105],t:7,e:"ui-section",a:{label:"Status"},f:[{p:[3,32,132],t:7,e:"span",a:{"class":[{t:2,x:{r:["status"],s:'_0=="Dead"?"bad bold":_0=="Unconscious"?"average bold":"good"'},p:[3,45,145]}]},f:[{t:2,r:"status",p:[3,132,232]}]}]}," ",{p:[4,5,268],t:7,e:"ui-section",a:{label:"Jelly"},f:[{t:2,r:"exoticblood",p:[4,31,294]}]}," ",{p:[5,5,328],t:7,e:"ui-section",a:{label:"Location"},f:[{t:2,r:"area",p:[5,34,357]}]}," ",{p:[7,5,386],t:7,e:"ui-button",a:{state:[{t:2,r:"swap_button_state",p:[8,14,411]}],action:"swap",params:['{"ref": "',{t:2,r:"ref",p:[9,38,472]},'"}']},f:[{t:2,x:{r:["is_current"],s:'_0?"You Are Here":"Swap"'},p:[10,7,491]}]}]}],n:52,r:"data.bodies",p:[1,1,0]}]},e.exports=a.extend(r.exports)},{205:205}],296:[function(t,e,n){var a=t(205),r={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"}}}}(r),r.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=a.extend(r.exports)},{205:205}],297:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],298:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],299:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],300:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],301:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],302:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={computed:{tankPressureState:function(){var t=this.get("data.tankPressure");return t>=200?"good":t>=100?"average":"bad"}}}}(r),r.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=a.extend(r.exports)},{205:205}],303:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],304:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{},oninit:function(){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")}})}}}(r),r.exports.template={v:3,t:[" ",{p:{button:[{t:4,f:[{p:[23,7,482],t:7,e:"ui-button",a:{icon:"lock",action:"lock"},f:["Lock"]}],n:50,r:"data.lockable",p:[22,5,453]}]},t:7,e:"ui-display",a:{title:"Uplink",button:0},f:[" ",{p:[26,3,568],t:7,e:"ui-section",a:{label:"Telecrystals",right:0},f:[{p:[27,5,613],t:7,e:"span",a:{"class":[{t:2,x:{r:["data.telecrystals"],s:'_0>0?"good":"bad"'},p:[27,18,626]}]},f:[{t:2,r:"data.telecrystals",p:[27,62,670]}," TC"]}]}]}," ",{t:4,f:[{p:[31,3,764],t:7,e:"ui-display",f:[{p:[32,2,779],t:7,e:"ui-button",a:{action:"select",params:['{"category": "',{t:2,r:"name",p:[32,51,828]},'"}']},f:[{t:2,r:"name",p:[32,63,840]}]}," ",{t:4,f:[{p:[34,4,883],t:7,e:"ui-section",a:{label:[{t:2,r:"name",p:[34,23,902]}],candystripe:0,right:0},f:[{p:[35,3,934],t:7,e:"ui-button",a:{tooltip:[{t:2,r:"name",p:[35,23,954]},": ",{t:2,r:"desc",p:[35,33,964]}],"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:[36,12,1006]}],action:"buy",params:['{"category": "',{t:2,r:"category",p:[37,40,1165]},'", "item": ',{t:2,r:"name",p:[37,63,1188]},', "cost": ',{t:2,r:"cost",p:[37,81,1206]},"}"]},v:{hover:"hover",unhover:"unhover"},f:[{t:2,r:"cost",p:[38,43,1260]}," TC"]}]}],n:52,r:"items",p:[33,2,863]}]}],n:52,r:"data.categories",p:[30,1,735]}]},e.exports=a.extend(r.exports)},{205:205}],305:[function(t,e,n){var a=t(205),r={exports:{}};!function(t){"use strict";t.exports={data:{healthState:function(t){var e=this.get("data.vr_avatar.maxhealth");return t>e/1.5?"good":t>e/3?"average":"bad"}}}}(r),r.exports.template={v:3,t:[" ",{p:[14,1,292],t:7,e:"ui-display",f:[{t:4,f:[{p:[16,3,333],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:[{p:[17,4,373],t:7,e:"ui-section",a:{label:"Name"},f:[{t:2,r:"data.vr_avatar.name",p:[18,5,404]}]}," ",{p:[20,4,450],t:7,e:"ui-section",a:{label:"Status"},f:[{t:2,r:"data.vr_avatar.status",p:[21,5,483]}]}," ",{p:[23,4,531],t:7,e:"ui-section",a:{label:"Health"},f:[{p:[24,5,564],t:7,e:"ui-bar",a:{min:"0",max:[{t:2,r:"adata.vr_avatar.maxhealth",p:[24,26,585]}],value:[{t:2,r:"adata.vr_avatar.health",p:[24,64,623]}],state:[{t:2,x:{r:["healthState","adata.vr_avatar.health"],s:"_0(_1)"},p:[24,99,658]}]},f:[{t:2,x:{r:["adata.vr_avatar.health"],s:"Math.round(_0)"},p:[24,140,699]},"/",{t:2,r:"adata.vr_avatar.maxhealth",p:[24,179,738]}]}]}]}],n:50,r:"data.vr_avatar",p:[15,2,307]},{t:4,n:51,f:[{p:[28,3,826],t:7,e:"ui-display",a:{title:"Virtual Avatar"},f:["No Virtual Avatar detected"]}],r:"data.vr_avatar"}," ",{p:[32,2,922],t:7,e:"ui-display",a:{title:"VR Commands"},f:[{p:[33,3,958],t:7,e:"ui-button",a:{icon:[{t:2,x:{r:["data.toggle_open"],s:'_0?"times":"plus"'},p:[33,20,975]}],action:"toggle_open"},f:[{t:2,x:{r:["data.toggle_open"],s:'_0?"Close":"Open"'},p:[34,4,1042]}," the VR Sleeper"]}," ",{t:4,f:[{p:[37,4,1144],t:7,e:"ui-button",a:{icon:"signal",action:"vr_connect"},f:["Connect to VR"]}],n:50,r:"data.isoccupant",p:[36,3,1116]}," ",{t:4,f:[{p:[42,4,1267],t:7,e:"ui-button",a:{icon:"ban",action:"delete_avatar"},f:["Delete Virtual Avatar"]}],n:50,r:"data.vr_avatar",p:[41,3,1240]}]}]}]},e.exports=a.extend(r.exports)},{205:205}],306:[function(t,e,n){var a=t(205),r={exports:{}};r.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=a.extend(r.exports)},{205:205}],307:[function(t,e,n){(function(e){"use strict";var n=t(205),a=e.interopRequireDefault(n);t(194),t(1),t(190),t(193);var r=t(308),i=e.interopRequireDefault(r),o=t(309),s=t(191),u=t(192),p=e.interopRequireDefault(u);a["default"].DEBUG=/minified/.test(function(){}),Object.assign(Math,t(313)),window.initialize=function(e){window.tgui||(window.tgui=new i["default"]({el:"#container",data:function(){var n=JSON.parse(e);return{constants:t(310),text:t(314),config:n.config,data:n.data,adata:n.data}}}))};var c=document.getElementById("data"),l=c.textContent,f=c.getAttribute("data-ref");"{}"!==l&&(window.initialize(l),c.remove()),(0,o.act)(f,"tgui:initialize"),(0,s.loadCSS)("font-awesome.min.css");var d=new p["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,308:308,309:309,310:310,313:313,314:314,"babel/external-helpers":"babel/external-helpers"}],308:[function(t,e,n){var a=t(205),r={exports:{}};!function(e){"use strict";var n=t(309),a=t(311);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),bsa:t(234),canister:t(235),cargo:t(236),cellular_emporium:t(237),chem_dispenser:t(238),chem_heater:t(239),chem_master:t(240),clockwork_slab:t(241),codex_gigas:t(242),computer_fabricator:t(243),crayon:t(244),cryo:t(245),disposal_unit:t(246),dna_vault:t(247),eightball:t(248),emergency_shuttle_console:t(249),engraved_message:t(250),error:t(251),firealarm:t(252),gps:t(253),gulag_console:t(254),gulag_item_reclaimer:t(255),holodeck:t(256),implantchair:t(257),intellicard:t(258),keycard_auth:t(259),labor_claim_console:t(260),language_menu:t(261),launchpad_remote:t(262),mech_bay_power_console:t(263),mulebot:t(264),ntnet_relay:t(265),ntos_ai_restorer:t(266),ntos_card:t(267),ntos_configuration:t(268),ntos_file_manager:t(269),ntos_main:t(270),ntos_net_chat:t(271),ntos_net_dos:t(272),ntos_net_downloader:t(273),ntos_net_monitor:t(274),ntos_net_transfer:t(275),ntos_power_monitor:t(276),ntos_revelation:t(277),ntos_station_alert:t(278),ntos_supermatter_monitor:t(279),ntosheader:t(280),nuclear_bomb:t(281),ore_redemption_machine:t(282),pandemic:t(283),personal_crafting:t(284),portable_pump:t(285),portable_scrubber:t(286),power_monitor:t(287),radio:t(288),sat_control:t(289),shuttle_manipulator:t(290),"shuttle_manipulator/modification":t(291),"shuttle_manipulator/status":t(292),"shuttle_manipulator/templates":t(293),sleeper:t(294),slime_swap_body:t(295),smes:t(296),solar_control:t(297),space_heater:t(298),station_alert:t(299),suit_storage_unit:t(300),tank_dispenser:t(301),tanks:t(302),thermomachine:t(303),uplink:t(304),vr_sleeper:t(305),wires:t(306)};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,a.lock)(window.screenLeft,window.screenTop),e=t.x,r=t.y;(0,n.winset)(this.get("config.window"),"pos",e+","+r)}(0,n.winset)("mapwindow.map","focus",!0)}}}(r),r.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"}]}," ",{t:4,f:[{p:[62,3,1990],t:7,e:"resize"}],n:50,r:"config.titlebar",p:[61,1,1963]}]},r.exports.components=r.exports.components||{};var i={warnings:t(218),titlebar:t(217),resize:t(212)};for(var o in i)i.hasOwnProperty(o)&&(r.exports.components[o]=i[o]);e.exports=a.extend(r.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,268:268,269:269,270:270,271:271,272:272,273:273,274:274,275:275,276:276,277:277,278:278,279:279,280:280,281:281,282:282,283:283,284:284,285:285,286:286,287:287,288:288,289:289,290:290,291:291,292:292,293:293,294:294,295:295,296:296,297:297,298:298,299:299,300:300,301:301,302:302,303:303,304:304,305:305,306:306,309:309,311:311}],309:[function(t,e,n){"use strict";function a(){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 r(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};window.location.href=a(Object.assign({src:t,action:e},n))}function i(t,e,n){var r;window.location.href=a((r={},r[t+"."+e]=n,r),"winset")}n.__esModule=!0,n.href=a,n.act=r,n.winset=i;var o=encodeURIComponent},{}],310:[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},{}],311:[function(t,e,n){"use strict";function a(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 r(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 r=a(e,n);e=r.x,n=r.y}(0,s.winset)(this.get("config.window"),"pos",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}function i(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,a=i(e,n);e=a.x,n=a.y,(0,s.winset)(this.get("config.window"),"size",e+","+n)}this.set({x:t.screenX,y:t.screenY})}}n.__esModule=!0,n.lock=a,n.drag=r,n.sane=i,n.resize=o;var s=t(309)},{309:309}],312:[function(t,e,n){"use strict";function a(t,e){for(var n=t,a=Array.isArray(n),i=0,n=a?n:n[Symbol.iterator]();;){var o;if(a){if(i>=n.length)break;o=n[i++]}else{if(i=n.next(),i.done)break;o=i.value}var s=o;s.textContent.toLowerCase().includes(e)?(s.style.display="",r(s,e)):s.style.display="none"}}function r(t,e){for(var n=t.queryAll("section"),a=t.query("header").textContent.toLowerCase().includes(e),r=n,i=Array.isArray(r),o=0,r=i?r:r[Symbol.iterator]();;){var s;if(i){if(o>=r.length)break;s=r[o++]}else{if(o=r.next(),o.done)break;s=o.value}var u=s;a||u.textContent.toLowerCase().includes(e)?u.style.display="":u.style.display="none"}}n.__esModule=!0,n.filterMulti=a,n.filter=r},{}],313:[function(t,e,n){"use strict";function a(t,e,n){return Math.max(t,Math.min(n,e))}function r(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return+(Math.round(t+"e"+e)+"e-"+e)}n.__esModule=!0,n.clamp=a,n.fixed=r},{}],314:[function(t,e,n){"use strict";function a(t){return t[0].toUpperCase()+t.slice(1).toLowerCase()}function r(t){return t.replace(/\w\S*/g,a)}function i(t,e){for(t=""+t;t.length1){for(var u=Array(o),p=0;o>p;p++)u[p]=arguments[p+3];n.children=u}return{$$typeof:t,type:e,key:void 0===a?null:""+a,ref:null,props:n,_owner:null}}}(),e.asyncIterator=function(t){if("function"==typeof Symbol){if(Symbol.asyncIterator){var e=t[Symbol.asyncIterator];if(null!=e)return e.call(t)}if(Symbol.iterator)return t[Symbol.iterator]()}throw new TypeError("Object is not async iterable")},e.asyncGenerator=function(){function t(t){this.value=t}function e(e){function n(t,e){return new Promise(function(n,r){var s={key:t,arg:e,resolve:n,reject:r,next:null};o?o=o.next=s:(i=o=s,a(t,e))})}function a(n,i){try{var o=e[n](i),s=o.value;s instanceof t?Promise.resolve(s.value).then(function(t){a("next",t)},function(t){a("throw",t)}):r(o.done?"return":"normal",o.value)}catch(u){r("throw",u)}}function r(t,e){switch(t){case"return":i.resolve({value:e,done:!0});break;case"throw":i.reject(e);break;default:i.resolve({value:e,done:!1})}i=i.next,i?a(i.key,i.arg):o=null}var i,o;this._invoke=n,"function"!=typeof e["return"]&&(this["return"]=void 0)}return"function"==typeof Symbol&&Symbol.asyncIterator&&(e.prototype[Symbol.asyncIterator]=function(){return this}),e.prototype.next=function(t){return this._invoke("next",t)},e.prototype["throw"]=function(t){return this._invoke("throw",t)},e.prototype["return"]=function(t){return this._invoke("return",t)},{wrap:function(t){return function(){return new e(t.apply(this,arguments))}},await:function(e){return new t(e)}}}(),e.asyncGeneratorDelegate=function(t,e){function n(n,a){return r=!0,a=new Promise(function(e){e(t[n](a))}),{done:!1,value:e(a)}}var a={},r=!1;return"function"==typeof Symbol&&Symbol.iterator&&(a[Symbol.iterator]=function(){return this}),a.next=function(t){return r?(r=!1,t):n("next",t)},"function"==typeof t["throw"]&&(a["throw"]=function(t){if(r)throw r=!1,t;return n("throw",t)}),"function"==typeof t["return"]&&(a["return"]=function(t){return n("return",t)}),a},e.asyncToGenerator=function(t){return function(){var e=t.apply(this,arguments);return new Promise(function(t,n){function a(r,i){try{var o=e[r](i),s=o.value}catch(u){return void n(u)}return o.done?void t(s):Promise.resolve(s).then(function(t){a("next",t)},function(t){a("throw",t)})}return a("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,a)&&(n[a]=t[a]);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 a(t,e,n,r){var i=Object.getOwnPropertyDescriptor(t,e);if(void 0===i){var o=Object.getPrototypeOf(t);null!==o&&a(o,e,n,r)}else if("value"in i&&i.writable)i.value=n;else{var s=i.set;void 0!==s&&s.call(r,n)}return n},e.slicedToArray=function(){function t(t,e){var n=[],a=!0,r=!1,i=void 0;try{for(var o,s=t[Symbol.iterator]();!(a=(o=s.next()).done)&&(n.push(o.value),!e||n.length!==e);a=!0);}catch(u){r=!0,i=u}finally{try{!a&&s["return"]&&s["return"]()}finally{if(r)throw i}}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,a=[],r=t[Symbol.iterator]();!(n=r.next()).done&&(a.push(n.value),!e||a.length!==e););return a}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 {{Math.floor(adata.points)}} - + {{data.message}} {{#if data.loan && !data.requestonly}} @@ -29,7 +29,7 @@ state='{{data.away && data.docked ? null : "disabled"}}' action='loan'>Loan Shuttle {{else}} - Loaned to Centcom + Loaned to CentCom {{/if}} {{/if}} diff --git a/tgui/src/interfaces/ntos_card.ract b/tgui/src/interfaces/ntos_card.ract index 582737a8a6..3d7cbba9b2 100644 --- a/tgui/src/interfaces/ntos_card.ract +++ b/tgui/src/interfaces/ntos_card.ract @@ -180,7 +180,7 @@

    CentcomCentCom {{#each data.centcom_jobs}} {{display_name}} diff --git a/tools/ColonCatcher/2015-10-25-colon_operator_log.txt b/tools/ColonCatcher/2015-10-25-colon_operator_log.txt deleted file mode 100644 index f8908a0fda..0000000000 --- a/tools/ColonCatcher/2015-10-25-colon_operator_log.txt +++ /dev/null @@ -1,434 +0,0 @@ -..code\world.dm Lines: 27, 28, 98?, 102?, 119?, 149?, 230? Total Colons: 7 -..code\ATMOSPHERICS\atmospherics.dm Lines: 213? Total Colons: 1 -..code\ATMOSPHERICS\components\binary_devices\dp_vent_pump.dm Lines: 137? Total Colons: 1 -..code\ATMOSPHERICS\components\binary_devices\passive_gate.dm Lines: 134?, 163? Total Colons: 2 -..code\ATMOSPHERICS\components\binary_devices\pump.dm Lines: 43?, 139?, 167? Total Colons: 3 -..code\ATMOSPHERICS\components\binary_devices\valve.dm Lines: 25?, 33?, 38? Total Colons: 3 -..code\ATMOSPHERICS\components\binary_devices\volume_pump.dm Lines: 42?, 136?, 163? Total Colons: 3 -..code\ATMOSPHERICS\components\trinary_devices\filter.dm Lines: 66?, 69?, 214? Total Colons: 3 -..code\ATMOSPHERICS\components\trinary_devices\mixer.dm Lines: 36?, 39?, 151? Total Colons: 3 -..code\ATMOSPHERICS\components\unary_devices\cryo.dm Lines: 152?, 187?, 189, 190, 312?, 313? Total Colons: 7 -..code\ATMOSPHERICS\components\unary_devices\Freezer.dm Lines: 82?, 205? Total Colons: 2 -..code\ATMOSPHERICS\components\unary_devices\vent_pump.dm Lines: 175?, 196?, 197?, 228? Total Colons: 4 -..code\ATMOSPHERICS\components\unary_devices\vent_scrubber.dm Lines: 140?, 141? Total Colons: 2 -..code\ATMOSPHERICS\pipes\manifold.dm Lines: 28? Total Colons: 1 -..code\ATMOSPHERICS\pipes\manifold4w.dm Lines: 19? Total Colons: 1 -..code\ATMOSPHERICS\pipes\pipes.dm Lines: 30?, 32?, 33?, 34?, 43? Total Colons: 5 -..code\ATMOSPHERICS\pipes\heat_exchange\manifold.dm Lines: 25?, 51? Total Colons: 2 -..code\controllers\subsystem\air.dm Lines: 100 Total Colons: 1 -..code\controllers\subsystem\bots.dm Lines: 18, 20 Total Colons: 2 -..code\controllers\subsystem\diseases.dm Lines: 18 Total Colons: 1 -..code\controllers\subsystem\events.dm Lines: 41, 199?, 200? Total Colons: 3 -..code\controllers\subsystem\jobs.dm Lines: 370? Total Colons: 1 -..code\controllers\subsystem\machines.dm Lines: 41, 42, 43 Total Colons: 3 -..code\controllers\subsystem\mobs.dm Lines: 20 Total Colons: 1 -..code\controllers\subsystem\objects.dm Lines: 37 Total Colons: 1 -..code\controllers\subsystem\shuttles.dm Lines: 251?, 253, 261?, 262?, 284, 285 Total Colons: 6 -..code\controllers\subsystem\ticker.dm Lines: 382?, 405? Total Colons: 4 -..code\controllers\subsystem\voting.dm Lines: 203?, 211? Total Colons: 2 -..code\controllers\subsystem\shuttles\emergency.dm Lines: 52?, 65? Total Colons: 4 -..code\controllers\subsystem\shuttles\supply.dm Lines: 97, 316?, 347?, 488?, 505? Total Colons: 10 -..code\datums\browser.dm Lines: 79? Total Colons: 1 -..code\datums\datacore.dm Lines: 91?, 127?, 132?, 137?, 142?, 147?, 152?, 157?, 163?, 169?, 259? Total Colons: 23 -..code\datums\datumvars.dm Lines: 57?, 93 Total Colons: 3 -..code\datums\material_container.dm Lines: 194? Total Colons: 1 -..code\datums\mind.dm Lines: 228?, 229?, 290?, 581?, 633, 634, 643, 648, 720?, 1243, 1244, 1245 Total Colons: 13 -..code\datums\mutations.dm Lines: 34?, 135?, 329? Total Colons: 3 -..code\datums\recipe.dm Lines: 52?, 114?, 115? Total Colons: 3 -..code\datums\diseases\_disease.dm Lines: 125? Total Colons: 1 -..code\datums\helper_datums\teleport.dm Lines: 63?, 64?, 74?, 75? Total Colons: 4 -..code\datums\helper_datums\topic_input.dm Lines: 23?, 27?, 31?, 35?, 42?, 46?, 50?, 56?, 60? Total Colons: 9 -..code\datums\spells\dumbfire.dm Lines: 43 Total Colons: 1 -..code\datums\spells\knock.dm Lines: 21 Total Colons: 1 -..code\datums\spells\projectile.dm Lines: 35 Total Colons: 1 -..code\datums\wires\airlock.dm Lines: 37?, 38?, 39?, 40?, 41?, 42?, 43? Total Colons: 7 -..code\datums\wires\alarm.dm Lines: 21? Total Colons: 3 -..code\datums\wires\apc.dm Lines: 13? Total Colons: 3 -..code\datums\wires\autolathe.dm Lines: 13? Total Colons: 3 -..code\datums\wires\particle_accelerator.dm Lines: 50? Total Colons: 1 -..code\datums\wires\pizza_bomb.dm Lines: 45?, 46? Total Colons: 2 -..code\datums\wires\robot.dm Lines: 16?, 17?, 18? Total Colons: 4 -..code\datums\wires\r_n_d.dm Lines: 48?, 49?, 50? Total Colons: 3 -..code\datums\wires\syndicatebomb.dm Lines: 46?, 75? Total Colons: 2 -..code\datums\wires\vending.dm Lines: 28?, 29?, 30?, 31? Total Colons: 4 -..code\datums\wires\wires.dm Lines: 119?, 121? Total Colons: 2 -..code\game\atoms.dm Lines: 297? Total Colons: 1 -..code\game\atoms_movable.dm Lines: 181?, 182?, 216? Total Colons: 3 -..code\game\communications.dm Lines: 288 Total Colons: 3 -..code\game\data_huds.dm Lines: 35? Total Colons: 1 -..code\game\dna.dm Lines: 231? Total Colons: 1 -..code\game\say.dm Lines: 45?, 49? Total Colons: 2 -..code\game\sound.dm Lines: 72? Total Colons: 1 -..code\game\gamemodes\antag_spawner.dm Lines: 103, 104 Total Colons: 3 -..code\game\gamemodes\objective.dm Lines: 84?, 112?, 139?, 172?, 201?, 433, 806 Total Colons: 7 -..code\game\gamemodes\abduction\abduction_gear.dm Lines: 159? Total Colons: 1 -..code\game\gamemodes\abduction\machinery\experiment.dm Lines: 41?, 107? Total Colons: 2 -..code\game\gamemodes\blob\blob_finish.dm Lines: 47? Total Colons: 1 -..code\game\gamemodes\blob\blob_report.dm Lines: 64, 70, 76, 85 Total Colons: 4 -..code\game\gamemodes\changeling\evolution_menu.dm Lines: 59? Total Colons: 3 -..code\game\gamemodes\changeling\powers\adrenaline.dm Lines: 12? Total Colons: 1 -..code\game\gamemodes\changeling\powers\mutations.dm Lines: 83? Total Colons: 1 -..code\game\gamemodes\cult\cult.dm Lines: 44? Total Colons: 1 -..code\game\gamemodes\cult\runes.dm Lines: 705?, 706? Total Colons: 2 -..code\game\gamemodes\gang\dominator.dm Lines: 101?, 187? Total Colons: 2 -..code\game\gamemodes\gang\gang.dm Lines: 261?, 266? Total Colons: 2 -..code\game\gamemodes\gang\gang_datum.dm Lines: 43?, 53?, 121? Total Colons: 3 -..code\game\gamemodes\gang\gang_pen.dm Lines: 59? Total Colons: 1 -..code\game\gamemodes\gang\recaller.dm Lines: 48?, 51? Total Colons: 4 -..code\game\gamemodes\malfunction\malfunction.dm Lines: 63, 64, 65, 185, 188, 189, 192, 204, 205, 216, 218, 219, 221, 233, 234 Total Colons: 15 -..code\game\gamemodes\meteor\meteors.dm Lines: 177? Total Colons: 2 -..code\game\gamemodes\nuclear\nuclearbomb.dm Lines: 197?, 212?, 215?, 217?, 220?, 222?, 265?, 359, 359?, 360, 365, 383? Total Colons: 25 -..code\game\gamemodes\revolution\revolution.dm Lines: 265?, 266?, 286? Total Colons: 3 -..code\game\gamemodes\shadowling\shadowling.dm Lines: 304? Total Colons: 1 -..code\game\gamemodes\traitor\traitor.dm Lines: 335? Total Colons: 1 -..code\game\gamemodes\wizard\artefact.dm Lines: 148? Total Colons: 1 -..code\game\gamemodes\wizard\rightandwrong.dm Lines: 9?, 10?, 11? Total Colons: 3 -..code\game\gamemodes\wizard\soulstone.dm Lines: 123, 195 Total Colons: 2 -..code\game\gamemodes\wizard\spellbook.dm Lines: 93?, 512?, 533? Total Colons: 3 -..code\game\gamemodes\wizard\wizard.dm Lines: 183?, 258, 261, 264, 278? Total Colons: 5 -..code\game\machinery\airlock_control.dm Lines: 59?, 60? Total Colons: 2 -..code\game\machinery\ai_slipper.dm Lines: 39?, 67, 77?, 93? Total Colons: 5 -..code\game\machinery\alarm.dm Lines: 134?, 135?, 730?, 742?, 895?, 934?, 1056?, 1071?, 1127?, 1128? Total Colons: 16 -..code\game\machinery\announcement_system.dm Lines: 45?, 47?, 136?, 137? Total Colons: 4 -..code\game\machinery\atmo_control.dm Lines: 273?, 284?, 396? Total Colons: 3 -..code\game\machinery\autolathe.dm Lines: 139?, 178?, 187?, 295?, 322?, 336?, 345? Total Colons: 10 -..code\game\machinery\Beacon.dm Lines: 31? Total Colons: 1 -..code\game\machinery\buttons.dm Lines: 22?, 23? Total Colons: 4 -..code\game\machinery\cell_charger.dm Lines: 15?, 31?, 64? Total Colons: 4 -..code\game\machinery\cloning.dm Lines: 88?, 92? Total Colons: 2 -..code\game\machinery\constructable_frame.dm Lines: 48?, 90?, 94?, 99?, 102?, 475? Total Colons: 8 -..code\game\machinery\deployable.dm Lines: 92 Total Colons: 1 -..code\game\machinery\dna_scanner.dm Lines: 44?, 48?, 57? Total Colons: 3 -..code\game\machinery\droneDispenser.dm Lines: 190? Total Colons: 1 -..code\game\machinery\iv_drip.dm Lines: 192?, 200?, 210? Total Colons: 3 -..code\game\machinery\lightswitch.dm Lines: 41? Total Colons: 1 -..code\game\machinery\machinery.dm Lines: 372?, 375? Total Colons: 2 -..code\game\machinery\magnet.dm Lines: 53?, 275?, 279? Total Colons: 3 -..code\game\machinery\navbeacon.dm Lines: 63?, 84?, 92?, 122?, 130? Total Colons: 6 -..code\game\machinery\newscaster.dm Lines: 205?, 206?, 291?, 304?, 311?, 318?, 319?, 372, 391?, 409?, 420?, 423, 424?, 430?, 431?, 436, 460?, 465?, 486, 614?, 724?, 727?, 922 Total Colons: 27 -..code\game\machinery\overview.dm Lines: 98, 167?, 243, 292? Total Colons: 4 -..code\game\machinery\portable_turret.dm Lines: 162?, 164?, 169?, 170?, 171?, 172?, 173?, 183?, 285?, 862?, 864?, 869?, 870?, 871?, 872?, 873?, 877?, 889?, 891?, 896?, 897?, 898?, 899?, 900?, 910?, 968?, 1049?, 1085, 1097?, 1098? Total Colons: 32 -..code\game\machinery\recharger.dm Lines: 19? Total Colons: 1 -..code\game\machinery\rechargestation.dm Lines: 122?, 124? Total Colons: 2 -..code\game\machinery\recycler.dm Lines: 43?, 44?, 45?, 84? Total Colons: 4 -..code\game\machinery\requests_console.dm Lines: 201?, 202?, 212?, 213? Total Colons: 4 -..code\game\machinery\robot_fabricator.dm Lines: 21, 23, 24, 25, 28 Total Colons: 5 -..code\game\machinery\shieldgen.dm Lines: 247?, 261?, 263?, 441? Total Colons: 4 -..code\game\machinery\Sleeper.dm Lines: 142?, 156?, 162? Total Colons: 4 -..code\game\machinery\slotmachine.dm Lines: 219?, 265?, 271? Total Colons: 3 -..code\game\machinery\spaceheater.dm Lines: 33?, 35?, 37?, 69?, 89?, 107? Total Colons: 9 -..code\game\machinery\status_display.dm Lines: 167 Total Colons: 4 -..code\game\machinery\suit_storage_unit.dm Lines: 199?, 200?, 212?, 215?, 218?, 221?, 227?, 231?, 232?, 519? Total Colons: 12 -..code\game\machinery\syndicatebeacon.dm Lines: 151? Total Colons: 1 -..code\game\machinery\syndicatebomb.dm Lines: 22?, 53?, 77?, 323?, 326? Total Colons: 6 -..code\game\machinery\teleporter.dm Lines: 69?, 442? Total Colons: 3 -..code\game\machinery\turrets.dm Lines: 542?, 578, 590?, 591? Total Colons: 6 -..code\game\machinery\vending.dm Lines: 248?, 323? Total Colons: 2 -..code\game\machinery\atmoalter\canister.dm Lines: 248, 289?, 290?, 291?, 292?, 295?, 297? Total Colons: 7 -..code\game\machinery\atmoalter\pump.dm Lines: 109? Total Colons: 3 -..code\game\machinery\atmoalter\scrubber.dm Lines: 127?, 203? Total Colons: 3 -..code\game\machinery\bots\bots.dm Lines: 244?, 337?, 338?, 340?, 416?, 481? Total Colons: 6 -..code\game\machinery\bots\cleanbot.dm Lines: 84?, 85?, 87?, 88?, 109? Total Colons: 6 -..code\game\machinery\bots\ed209bot.dm Lines: 107?, 109?, 115?, 116?, 117?, 118?, 119?, 120?, 155?, 258?, 456? Total Colons: 12 -..code\game\machinery\bots\floorbot.dm Lines: 104?, 105?, 107?, 109?, 110?, 111?, 112?, 113?, 114?, 115?, 116?, 147?, 360? Total Colons: 13 -..code\game\machinery\bots\medbot.dm Lines: 147?, 148?, 154?, 171?, 173?, 174?, 175?, 176?, 177?, 231?, 320?, 532? Total Colons: 12 -..code\game\machinery\bots\mulebot.dm Lines: 99?, 147?, 187?, 209?, 210?, 211?, 225?, 226?, 227?, 228?, 249?, 282?, 346?, 354?, 363?, 535? Total Colons: 17 -..code\game\machinery\bots\secbot.dm Lines: 97?, 99?, 104?, 105?, 106?, 107?, 108?, 109?, 142?, 222? Total Colons: 11 -..code\game\machinery\camera\camera.dm Lines: 141?, 151?, 152? Total Colons: 3 -..code\game\machinery\camera\tracking.dm Lines: 19?, 83? Total Colons: 2 -..code\game\machinery\computer\arcade.dm Lines: 860?, 862?, 863?, 871? Total Colons: 6 -..code\game\machinery\computer\camera.dm Lines: 56? Total Colons: 1 -..code\game\machinery\computer\camera_advanced.dm Lines: 154? Total Colons: 1 -..code\game\machinery\computer\card.dm Lines: 148?, 164?, 209?, 364?, 372?, 390? Total Colons: 6 -..code\game\machinery\computer\cloning.dm Lines: 146? Total Colons: 1 -..code\game\machinery\computer\communications.dm Lines: 106, 148?, 272?, 428?, 429?, 430, 453?, 468?, 531?, 532?, 533, 554? Total Colons: 12 -..code\game\machinery\computer\crew.dm Lines: 153?, 158?, 169? Total Colons: 3 -..code\game\machinery\computer\dna_console.dm Lines: 94?, 139?, 141?, 143?, 181? Total Colons: 5 -..code\game\machinery\computer\medical.dm Lines: 40?, 46, 153? Total Colons: 4 -..code\game\machinery\computer\message.dm Lines: 73?, 76?, 131?, 150? Total Colons: 4 -..code\game\machinery\computer\Operating.dm Lines: 50? Total Colons: 1 -..code\game\machinery\computer\pod.dm Lines: 56? Total Colons: 2 -..code\game\machinery\computer\robot.dm Lines: 65?, 107?, 109?, 110?, 112?, 114? Total Colons: 6 -..code\game\machinery\computer\security.dm Lines: 49?, 62, 117, 130, 275, 285 Total Colons: 7 -..code\game\machinery\computer\shuttle.dm Lines: 24, 25, 28, 30, 33, 34, 47, 48, 60 Total Colons: 9 -..code\game\machinery\computer\station_alert.dm Lines: 73? Total Colons: 1 -..code\game\machinery\doors\airlock.dm Lines: 790?, 791?, 800?, 801?, 809?, 877, 888 Total Colons: 7 -..code\game\machinery\doors\airlock_electronics.dm Lines: 81 Total Colons: 1 -..code\game\machinery\doors\brigdoors.dm Lines: 123?, 158?, 247 Total Colons: 7 -..code\game\machinery\doors\firedoor.dm Lines: 49?, 69 Total Colons: 2 -..code\game\machinery\doors\windowdoor.dm Lines: 188?, 200, 276? Total Colons: 3 -..code\game\machinery\embedded_controller\access_controller.dm Lines: 295?, 297? Total Colons: 2 -..code\game\machinery\embedded_controller\airlock_controller.dm Lines: 258?, 259?, 260?, 261? Total Colons: 4 -..code\game\machinery\pipe\construction.dm Lines: 134?, 162? Total Colons: 2 -..code\game\machinery\telecomms\machine_interactions.dm Lines: 57?, 64?, 159?, 160?, 161?, 184?, 220? Total Colons: 7 -..code\game\mecha\mecha.dm Lines: 561?, 582?, 838?, 843?, 935?, 936?, 937?, 986?, 987? Total Colons: 11 -..code\game\mecha\mecha_control_console.dm Lines: 72? Total Colons: 1 -..code\game\mecha\mecha_topic.dm Lines: 33?, 34?, 36?, 40?, 90?, 164?, 168?, 190?, 197? Total Colons: 21 -..code\game\mecha\mecha_wreckage.dm Lines: 25?, 42? Total Colons: 2 -..code\game\mecha\mech_fabricator.dm Lines: 120?, 132?, 237? Total Colons: 6 -..code\game\mecha\combat\combat.dm Lines: 65?, 67? Total Colons: 3 -..code\game\mecha\combat\durand.dm Lines: 38?, 50? Total Colons: 2 -..code\game\mecha\combat\gygax.dm Lines: 69?, 74?, 105? Total Colons: 3 -..code\game\mecha\combat\honker.dm Lines: 32?, 33?, 35? Total Colons: 14 -..code\game\mecha\combat\marauder.dm Lines: 70?, 158?, 160? Total Colons: 5 -..code\game\mecha\combat\phazon.dm Lines: 39?, 97?, 98? Total Colons: 3 -..code\game\mecha\equipment\mecha_equipment.dm Lines: 57? Total Colons: 3 -..code\game\mecha\equipment\tools\medical_tools.dm Lines: 96, 96?, 129?, 249?, 333?, 366, 370?, 371? Total Colons: 20 -..code\game\mecha\equipment\tools\mining_tools.dm Lines: 40, 51 Total Colons: 2 -..code\game\mecha\equipment\tools\other_tools.dm Lines: 132?, 160?, 182?, 222?, 328?, 406, 406?, 446? Total Colons: 10 -..code\game\mecha\equipment\tools\work_tools.dm Lines: 329?, 350?, 351?, 368, 368? Total Colons: 7 -..code\game\mecha\equipment\weapons\weapons.dm Lines: 208? Total Colons: 1 -..code\game\mecha\working\ripley.dm Lines: 53?, 55? Total Colons: 2 -..code\game\objects\explosion.dm Lines: 11?, 12?, 68? Total Colons: 5 -..code\game\objects\items.dm Lines: 213? Total Colons: 1 -..code\game\objects\items\candle.dm Lines: 23? Total Colons: 1 -..code\game\objects\items\crayons.dm Lines: 117, 171?, 172?, 173?, 210? Total Colons: 5 -..code\game\objects\items\toys.dm Lines: 133?, 187?, 234?, 452?, 471? Total Colons: 6 -..code\game\objects\items\devices\aicard.dm Lines: 83?, 85?, 129?, 138? Total Colons: 4 -..code\game\objects\items\devices\flashlight.dm Lines: 60? Total Colons: 2 -..code\game\objects\items\devices\geiger_counter.dm Lines: 93? Total Colons: 1 -..code\game\objects\items\devices\paicard.dm Lines: 40?, 41? Total Colons: 2 -..code\game\objects\items\devices\scanners.dm Lines: 123?, 137?, 139?, 141?, 143?, 147?, 149, 164?, 212?, 396? Total Colons: 11 -..code\game\objects\items\devices\taperecorder.dm Lines: 28?, 97, 117, 142 Total Colons: 4 -..code\game\objects\items\devices\transfer_valve.dm Lines: 69?, 102 Total Colons: 6 -..code\game\objects\items\devices\PDA\cart.dm Lines: 241, 245, 275, 292?, 293?, 294, 348?, 424, 435, 473?, 499?, 533?, 546?, 557?, 585, 594, 601, 605, 606, 609, 610, 611, 612, 631, 642?, 649?, 702?, 703?, 705?, 706?, 707?, 708?, 709?, 711, 712, 713, 716, 717, 718 Total Colons: 44 -..code\game\objects\items\devices\PDA\PDA.dm Lines: 298?, 299?, 330?, 356?, 358?, 360?, 364?, 378?, 382?, 383?, 388, 390, 392, 618, 619, 631, 632, 692, 693, 918, 1010?, 1036, 1039, 1131?, 1143? Total Colons: 25 -..code\game\objects\items\devices\radio\electropack.dm Lines: 129? Total Colons: 1 -..code\game\objects\items\devices\radio\radio.dm Lines: 136?, 137, 137?, 138, 138?, 139, 140, 141, 143, 144, 146, 147?, 148, 148?, 149, 150, 151, 153, 154, 155 Total Colons: 22 -..code\game\objects\items\robot\robot_parts.dm Lines: 137, 143, 150, 258?, 259?, 261?, 262?, 263?, 264? Total Colons: 11 -..code\game\objects\items\robot\robot_upgrades.dm Lines: 250? Total Colons: 1 -..code\game\objects\items\stacks\sheets\glass.dm Lines: 303? Total Colons: 1 -..code\game\objects\items\weapons\AI_modules.dm Lines: 37?, 72?, 73?, 74? Total Colons: 4 -..code\game\objects\items\weapons\cards_ids.dm Lines: 115?, 118?, 148? Total Colons: 6 -..code\game\objects\items\weapons\cigs_lighters.dm Lines: 479?, 496? Total Colons: 2 -..code\game\objects\items\weapons\cosmetics.dm Lines: 36?, 54? Total Colons: 2 -..code\game\objects\items\weapons\defib.dm Lines: 470?, 485?, 487?, 489?, 491?, 508?, 527?, 530? Total Colons: 8 -..code\game\objects\items\weapons\explosives.dm Lines: 57? Total Colons: 1 -..code\game\objects\items\weapons\extinguisher.dm Lines: 45?, 46? Total Colons: 2 -..code\game\objects\items\weapons\flamethrower.dm Lines: 90?, 128? Total Colons: 2 -..code\game\objects\items\weapons\handcuffs.dm Lines: 208? Total Colons: 1 -..code\game\objects\items\weapons\RCD.dm Lines: 500, 505 Total Colons: 4 -..code\game\objects\items\weapons\singularityhammer.dm Lines: 42 Total Colons: 1 -..code\game\objects\items\weapons\stunbaton.dm Lines: 94? Total Colons: 1 -..code\game\objects\items\weapons\grenades\chem_grenade.dm Lines: 60? Total Colons: 1 -..code\game\objects\items\weapons\grenades\grenade.dm Lines: 49? Total Colons: 1 -..code\game\objects\items\weapons\implants\implantchair.dm Lines: 46?, 47?, 49? Total Colons: 5 -..code\game\objects\items\weapons\implants\implantpad.dm Lines: 56 Total Colons: 1 -..code\game\objects\items\weapons\storage\book.dm Lines: 180 Total Colons: 1 -..code\game\objects\items\weapons\storage\fancy.dm Lines: 39? Total Colons: 1 -..code\game\objects\items\weapons\storage\secure.dm Lines: 32?, 39?, 84? Total Colons: 3 -..code\game\objects\items\weapons\storage\storage.dm Lines: 177? Total Colons: 1 -..code\game\objects\items\weapons\tanks\jetpack.dm Lines: 26?, 44?, 151? Total Colons: 3 -..code\game\objects\items\weapons\tanks\tanks.dm Lines: 121?, 122? Total Colons: 2 -..code\game\objects\items\weapons\tanks\watertank.dm Lines: 177?, 178? Total Colons: 2 -..code\game\objects\structures\ai_core.dm Lines: 212?, 213? Total Colons: 2 -..code\game\objects\structures\displaycase.dm Lines: 119?, 128?, 130? Total Colons: 3 -..code\game\objects\structures\fireaxe.dm Lines: 129? Total Colons: 1 -..code\game\objects\structures\grille.dm Lines: 148?, 149? Total Colons: 2 -..code\game\objects\structures\musician.dm Lines: 50?, 130?, 132? Total Colons: 3 -..code\game\objects\structures\safe.dm Lines: 78?, 98?, 104?, 188? Total Colons: 4 -..code\game\objects\structures\tank_dispenser.dm Lines: 43?, 44? Total Colons: 2 -..code\game\objects\structures\watercloset.dm Lines: 51?, 54? Total Colons: 3 -..code\game\objects\structures\windoor_assembly.dm Lines: 50? Total Colons: 1 -..code\game\objects\structures\window.dm Lines: 197?, 199?, 201?, 206?, 207?, 211?, 215?, 218?, 222?, 223?, 425? Total Colons: 11 -..code\game\objects\structures\beds_chairs\bed.dm Lines: 129? Total Colons: 1 -..code\game\objects\structures\crates_lockers\closets.dm Lines: 66?, 234?, 241?, 243?, 392? Total Colons: 6 -..code\game\objects\structures\transit_tubes\station.dm Lines: 130? Total Colons: 1 -..code\game\objects\structures\transit_tubes\transit_tube_construction.dm Lines: 41?, 43? Total Colons: 2 -..code\game\turfs\turf.dm Lines: 137, 248?, 250? Total Colons: 4 -..code\game\turfs\space\space.dm Lines: 114?, 125? Total Colons: 2 -..code\game\verbs\ooc.dm Lines: 44?, 53?, 55?, 57?, 69? Total Colons: 6 -..code\LINDA\LINDA_turf_tile.dm Lines: 458?, 463? Total Colons: 2 -..code\modules\admin\admin.dm Lines: 30?, 62?, 63?, 64?, 65?, 66?, 67?, 122, 129, 141, 192?, 205?, 212?, 246, 262?, 277?, 288?, 292, 293?, 300?, 301?, 306, 334?, 352, 415?, 442?, 550?, 551?, 676?, 677?, 696? Total Colons: 35 -..code\modules\admin\admin_verbs.dm Lines: 441?, 442? Total Colons: 2 -..code\modules\admin\create_poll.dm Lines: 25?, 26?, 94?, 95? Total Colons: 4 -..code\modules\admin\newbanjob.dm Lines: 216? Total Colons: 2 -..code\modules\admin\player_panel.dm Lines: 111?, 113?, 119?, 123?, 129?, 155?, 160?, 166?, 181?, 186?, 195?, 207?, 219?, 228?, 240?, 249?, 258?, 269?, 284?, 297? Total Colons: 36 -..code\modules\admin\sql_notes.dm Lines: 153 Total Colons: 2 -..code\modules\admin\topic.dm Lines: 299?, 310?, 341?, 348?, 349?, 447?, 986?, 1559?, 1561?, 1589?, 1796?, 1797?, 1798?, 1800?, 1982?, 2093?, 2096?, 2101?, 2102? Total Colons: 21 -..code\modules\admin\DB ban\functions.dm Lines: 93, 94, 95, 127?, 131?, 304, 305, 306, 441? Total Colons: 20 -..code\modules\admin\verbs\adminjump.dm Lines: 91, 127 Total Colons: 2 -..code\modules\admin\verbs\deadsay.dm Lines: 24? Total Colons: 1 -..code\modules\admin\verbs\debug.dm Lines: 82?, 86?, 89?, 112?, 116?, 289, 306, 498, 501 Total Colons: 9 -..code\modules\admin\verbs\diagnostics.dm Lines: 15?, 81 Total Colons: 5 -..code\modules\admin\verbs\massmodvar.dm Lines: 132 Total Colons: 1 -..code\modules\admin\verbs\modifyvariables.dm Lines: 542 Total Colons: 1 -..code\modules\admin\verbs\one_click_antag.dm Lines: 333?, 478?, 481?, 484?, 487?, 490?, 493?, 496?, 517? Total Colons: 9 -..code\modules\admin\verbs\panicbunker.dm Lines: 10?, 11? Total Colons: 2 -..code\modules\admin\verbs\randomverbs.dm Lines: 38?, 114?, 116?, 117?, 189?, 212?, 409?, 448?, 721?, 722?, 799, 804, 810, 816, 822, 828, 834, 840, 846, 852, 858, 864, 870, 876, 882, 888, 894, 900 Total Colons: 28 -..code\modules\assembly\bomb.dm Lines: 44 Total Colons: 1 -..code\modules\assembly\doorcontrol.dm Lines: 62? Total Colons: 1 -..code\modules\assembly\health.dm Lines: 77? Total Colons: 1 -..code\modules\assembly\infrared.dm Lines: 24?, 110? Total Colons: 3 -..code\modules\assembly\mousetrap.dm Lines: 30?, 127? Total Colons: 2 -..code\modules\assembly\proximity.dm Lines: 26?, 109?, 110? Total Colons: 3 -..code\modules\assembly\signaler.dm Lines: 142? Total Colons: 1 -..code\modules\assembly\timer.dm Lines: 75? Total Colons: 1 -..code\modules\assembly\voice.dm Lines: 32? Total Colons: 1 -..code\modules\awaymissions\maploader\reader.dm Lines: 262? Total Colons: 1 -..code\modules\awaymissions\maploader\swapmaps.dm Lines: 152, 153, 154, 161?, 162?, 163?, 343?, 356?, 362?, 385? Total Colons: 19 -..code\modules\client\client procs.dm Lines: 36, 36?, 177? Total Colons: 3 -..code\modules\client\preferences.dm Lines: 129?, 130?, 151?, 161?, 166?, 186?, 335?, 336?, 337?, 338?, 339?, 340?, 341?, 342?, 343?, 349?, 350?, 353?, 356?, 397?, 523? Total Colons: 21 -..code\modules\client\preferences_toggles.dm Lines: 7?, 16?, 25?, 34?, 43?, 54?, 64?, 74?, 83?, 92?, 113?, 122?, 172?, 226?, 235?, 259? Total Colons: 16 -..code\modules\clothing\clothing.dm Lines: 357? Total Colons: 1 -..code\modules\clothing\glasses\engine_goggles.dm Lines: 83?, 108? Total Colons: 2 -..code\modules\clothing\head\helmet.dm Lines: 240? Total Colons: 1 -..code\modules\clothing\head\soft_caps.dm Lines: 45? Total Colons: 1 -..code\modules\clothing\masks\gasmask.dm Lines: 66? Total Colons: 1 -..code\modules\clothing\masks\miscellaneous.dm Lines: 56? Total Colons: 1 -..code\modules\clothing\shoes\bananashoes.dm Lines: 59?, 65? Total Colons: 3 -..code\modules\clothing\shoes\magboots.dm Lines: 32?, 41? Total Colons: 2 -..code\modules\clothing\spacesuits\chronosuit.dm Lines: 146, 151, 152, 153, 158, 172, 175, 176, 177 Total Colons: 9 -..code\modules\crafting\table.dm Lines: 15, 59, 113, 126, 143, 167 Total Colons: 6 -..code\modules\detectivework\detective_work.dm Lines: 16? Total Colons: 1 -..code\modules\events\event.dm Lines: 37 Total Colons: 2 -..code\modules\events\shuttle_loan.dm Lines: 195, 196 Total Colons: 2 -..code\modules\flufftext\Hallucination.dm Lines: 47?, 49?, 51? Total Colons: 3 -..code\modules\food&drinks\food\customizables.dm Lines: 37? Total Colons: 1 -..code\modules\food&drinks\kitchen machinery\gibber.dm Lines: 165? Total Colons: 1 -..code\modules\food&drinks\kitchen machinery\monkeyrecycler.dm Lines: 72? Total Colons: 1 -..code\modules\food&drinks\kitchen machinery\processor.dm Lines: 198? Total Colons: 1 -..code\modules\games\cards.dm Lines: 177?, 211?, 225? Total Colons: 3 -..code\modules\holiday\easter.dm Lines: 77? Total Colons: 1 -..code\modules\html_interface\html_interface.dm Lines: 292? Total Colons: 1 -..code\modules\hydroponics\grown.dm Lines: 704 Total Colons: 1 -..code\modules\hydroponics\growninedible.dm Lines: 71, 194? Total Colons: 2 -..code\modules\hydroponics\hydroponics.dm Lines: 642?, 836? Total Colons: 2 -..code\modules\hydroponics\seeds.dm Lines: 1377?, 1378? Total Colons: 2 -..code\modules\library\lib_items.dm Lines: 186? Total Colons: 1 -..code\modules\library\lib_machines.dm Lines: 519 Total Colons: 1 -..code\modules\lighting\lighting_system.dm Lines: 254 Total Colons: 1 -..code\modules\mob\inventory.dm Lines: 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 170 Total Colons: 22 -..code\modules\mob\login.dm Lines: 6? Total Colons: 1 -..code\modules\mob\mob.dm Lines: 329?, 599?, 690, 756? Total Colons: 5 -..code\modules\mob\mob_helpers.dm Lines: 485? Total Colons: 2 -..code\modules\mob\transform_procs.dm Lines: 295 Total Colons: 1 -..code\modules\mob\dead\observer\observer.dm Lines: 285? Total Colons: 1 -..code\modules\mob\living\living.dm Lines: 181?, 359?, 402 Total Colons: 3 -..code\modules\mob\living\say.dm Lines: 116? Total Colons: 1 -..code\modules\mob\living\carbon\carbon.dm Lines: 114, 286?, 288?, 291?, 310?, 311?, 322?, 323?, 566? Total Colons: 12 -..code\modules\mob\living\carbon\life.dm Lines: 468? Total Colons: 1 -..code\modules\mob\living\carbon\alien\humanoid\emote.dm Lines: 60? Total Colons: 1 -..code\modules\mob\living\carbon\alien\humanoid\humanoid.dm Lines: 93? Total Colons: 2 -..code\modules\mob\living\carbon\alien\humanoid\caste\hunter.dm Lines: 43?, 46? Total Colons: 2 -..code\modules\mob\living\carbon\alien\larva\emote.dm Lines: 79? Total Colons: 1 -..code\modules\mob\living\carbon\brain\MMI.dm Lines: 131?, 132? Total Colons: 2 -..code\modules\mob\living\carbon\human\examine.dm Lines: 48?, 55?, 62?, 69?, 76?, 83?, 90?, 97?, 115?, 122?, 129?, 136? Total Colons: 12 -..code\modules\mob\living\carbon\human\human.dm Lines: 87?, 96?, 192?, 194?, 196?, 200?, 205?, 210?, 215?, 219?, 221?, 223?, 231?, 236?, 241?, 248?, 250?, 252?, 253?, 254?, 324?, 325?, 341?, 563?, 734? Total Colons: 26 -..code\modules\mob\living\carbon\human\human_attackalien.dm Lines: 10? Total Colons: 1 -..code\modules\mob\living\carbon\human\inventory.dm Lines: 223?, 234?, 238?, 246?, 250?, 254? Total Colons: 6 -..code\modules\mob\living\carbon\human\species.dm Lines: 115?, 117?, 126?, 329?, 673? Total Colons: 5 -..code\modules\mob\living\carbon\human\update_icons.dm Lines: 112?, 186?, 479? Total Colons: 4 -..code\modules\mob\living\carbon\human\whisper.dm Lines: 43? Total Colons: 1 -..code\modules\mob\living\carbon\monkey\emote.dm Lines: 60? Total Colons: 1 -..code\modules\mob\living\silicon\silicon.dm Lines: 129, 324? Total Colons: 2 -..code\modules\mob\living\silicon\ai\ai.dm Lines: 255?, 280?, 281?, 341?, 530?, 532?, 585?, 593? Total Colons: 9 -..code\modules\mob\living\silicon\ai\life.dm Lines: 73, 75, 78, 80, 96, 97, 121, 145, 150, 166 Total Colons: 10 -..code\modules\mob\living\silicon\ai\say.dm Lines: 15? Total Colons: 2 -..code\modules\mob\living\silicon\ai\freelook\eye.dm Lines: 106? Total Colons: 1 -..code\modules\mob\living\silicon\pai\pai.dm Lines: 161, 181 Total Colons: 2 -..code\modules\mob\living\silicon\pai\software.dm Lines: 220?, 277?, 279?, 281?, 317?, 410?, 415?, 422?, 434, 434?, 435, 436, 436?, 437, 437?, 438, 438?, 439, 439?, 440, 442, 443, 444, 445, 446, 550, 557? Total Colons: 29 -..code\modules\mob\living\silicon\robot\examine.dm Lines: 29?, 31? Total Colons: 2 -..code\modules\mob\living\silicon\robot\inventory.dm Lines: 54, 62, 70 Total Colons: 3 -..code\modules\mob\living\silicon\robot\laws.dm Lines: 47? Total Colons: 1 -..code\modules\mob\living\silicon\robot\life.dm Lines: 173, 175, 177 Total Colons: 3 -..code\modules\mob\living\silicon\robot\robot.dm Lines: 259?, 393?, 492?, 545?, 806?, 1034? Total Colons: 8 -..code\modules\mob\living\simple_animal\parrot.dm Lines: 412?, 414? Total Colons: 2 -..code\modules\mob\living\simple_animal\worm.dm Lines: 74? Total Colons: 1 -..code\modules\mob\living\simple_animal\friendly\drone\interaction.dm Lines: 103? Total Colons: 2 -..code\modules\mob\living\simple_animal\friendly\drone\verbs.dm Lines: 25? Total Colons: 1 -..code\modules\mob\living\simple_animal\friendly\drone\_drone.dm Lines: 123?, 130?, 137?, 144? Total Colons: 4 -..code\modules\mob\living\simple_animal\hostile\hostile.dm Lines: 255, 256 Total Colons: 4 -..code\modules\mob\living\simple_animal\morph\morph.dm Lines: 183? Total Colons: 1 -..code\modules\mob\living\simple_animal\slime\death.dm Lines: 15? Total Colons: 1 -..code\modules\mob\living\simple_animal\slime\life.dm Lines: 190? Total Colons: 1 -..code\modules\mob\living\simple_animal\slime\powers.dm Lines: 75? Total Colons: 1 -..code\modules\mob\living\simple_animal\slime\slime.dm Lines: 79?, 80?, 90? Total Colons: 3 -..code\modules\mob\new_player\new_player.dm Lines: 27, 29, 44?, 69?, 73? Total Colons: 5 -..code\modules\mob\new_player\poll.dm Lines: 12?, 29?, 478? Total Colons: 3 -..code\modules\nano\JSON Reader.dm Lines: 71 Total Colons: 2 -..code\modules\nano\nanoui.dm Lines: 304? Total Colons: 1 -..code\modules\ninja\admin_ninja_verbs.dm Lines: 30, 32 Total Colons: 2 -..code\modules\ninja\ninja_event.dm Lines: 141? Total Colons: 1 -..code\modules\ninja\suit\gloves.dm Lines: 80?, 87? Total Colons: 2 -..code\modules\ninja\suit\mask.dm Lines: 116?, 129?, 132?, 139? Total Colons: 4 -..code\modules\ninja\suit\ninjaDrainAct.dm Lines: 128?, 159? Total Colons: 2 -..code\modules\ninja\suit\suit.dm Lines: 75?, 79?, 116?, 172? Total Colons: 4 -..code\modules\ninja\suit\suit_attackby.dm Lines: 10?, 12?, 19? Total Colons: 3 -..code\modules\ninja\suit\suit_initialisation.dm Lines: 84 Total Colons: 1 -..code\modules\ninja\suit\n_suit_verbs\energy_net_nets.dm Lines: 64, 65, 112?, 131 Total Colons: 4 -..code\modules\ninja\suit\n_suit_verbs\ninja_stars.dm Lines: 12? Total Colons: 1 -..code\modules\paperwork\filingcabinet.dm Lines: 57? Total Colons: 1 -..code\modules\paperwork\folders.dm Lines: 43? Total Colons: 1 -..code\modules\paperwork\paper.dm Lines: 86? Total Colons: 1 -..code\modules\paperwork\paperbin.dm Lines: 97? Total Colons: 1 -..code\modules\paperwork\photocopier.dm Lines: 123?, 264?, 268? Total Colons: 5 -..code\modules\paperwork\photography.dm Lines: 66?, 67?, 79?, 183, 184, 189, 190, 217, 217?, 219, 219? Total Colons: 14 -..code\modules\power\apc.dm Lines: 128?, 129?, 133, 148, 199?, 201?, 202?, 262?, 454?, 469?, 474, 647, 647?, 664?, 671?, 715?, 838, 839, 840, 1184, 1221? Total Colons: 25 -..code\modules\power\cable.dm Lines: 108?, 293?, 564? Total Colons: 3 -..code\modules\power\generator.dm Lines: 117? Total Colons: 2 -..code\modules\power\gravitygenerator.dm Lines: 230?, 250?, 258?, 264?, 279?, 280?, 287? Total Colons: 7 -..code\modules\power\lighting.dm Lines: 261?, 440? Total Colons: 2 -..code\modules\power\port_gen.dm Lines: 89?, 273? Total Colons: 2 -..code\modules\power\smes.dm Lines: 57, 419? Total Colons: 4 -..code\modules\power\solar.dm Lines: 388?, 391? Total Colons: 2 -..code\modules\power\turbine.dm Lines: 308?, 365?, 367?, 369? Total Colons: 5 -..code\modules\power\antimatter\control.dm Lines: 267? Total Colons: 1 -..code\modules\power\antimatter\shielding.dm Lines: 119 Total Colons: 1 -..code\modules\power\singularity\collector.dm Lines: 44?, 45?, 46?, 98? Total Colons: 6 -..code\modules\power\singularity\emitter.dm Lines: 252? Total Colons: 1 -..code\modules\power\singularity\singularity.dm Lines: 117?, 236? Total Colons: 2 -..code\modules\power\singularity\particle_accelerator\particle.dm Lines: 42 Total Colons: 1 -..code\modules\power\singularity\particle_accelerator\particle_accelerator.dm Lines: 364 Total Colons: 1 -..code\modules\power\singularity\particle_accelerator\particle_control.dm Lines: 215?, 216?, 217? Total Colons: 6 -..code\modules\procedural mapping\mapGenerator.dm Lines: 153? Total Colons: 1 -..code\modules\projectiles\ammunition.dm Lines: 29?, 30?, 155? Total Colons: 3 -..code\modules\projectiles\gun.dm Lines: 108?, 110?, 310? Total Colons: 3 -..code\modules\projectiles\ammunition\magazines.dm Lines: 173? Total Colons: 1 -..code\modules\projectiles\guns\magic\wand.dm Lines: 25? Total Colons: 1 -..code\modules\projectiles\guns\projectile\automatic.dm Lines: 28?, 109?, 127?, 160?, 165?, 250? Total Colons: 11 -..code\modules\projectiles\guns\projectile\launchers.dm Lines: 49? Total Colons: 1 -..code\modules\projectiles\guns\projectile\pistol.dm Lines: 15?, 36? Total Colons: 3 -..code\modules\projectiles\guns\projectile\shotgun.dm Lines: 30?, 63?, 114?, 282? Total Colons: 4 -..code\modules\projectiles\guns\projectile\toy.dm Lines: 33? Total Colons: 1 -..code\modules\reagents\Chemistry-Machinery.dm Lines: 85?, 89, 90, 97, 330?, 350?, 367?, 368?, 512?, 551?, 665?, 705?, 708?, 788, 867?, 910?, 1248?, 1286?, 1508?, 1510?, 1511?, 1512? Total Colons: 24 -..code\modules\reagents\Chemistry-Recipes.dm Lines: 46? Total Colons: 1 -..code\modules\reagents\reagent_containers.dm Lines: 64? Total Colons: 1 -..code\modules\reagents\Chemistry-Reagents\Consumable-Reagents\Food-Reagents.dm Lines: 331 Total Colons: 2 -..code\modules\reagents\reagent_containers\spray.dm Lines: 97?, 98?, 99?, 177? Total Colons: 4 -..code\modules\recycling\disposal-construction.dm Lines: 86?, 91? Total Colons: 2 -..code\modules\recycling\disposal-structures.dm Lines: 240? Total Colons: 1 -..code\modules\recycling\disposal-unit.dm Lines: 82? Total Colons: 1 -..code\modules\recycling\sortingmachinery.dm Lines: 217? Total Colons: 1 -..code\modules\research\experimentor.dm Lines: 253? Total Colons: 1 -..code\modules\research\message_server.dm Lines: 130? Total Colons: 2 -..code\modules\shuttle\shuttle.dm Lines: 266?, 270?, 515?, 522?, 547?, 564? Total Colons: 8 -..code\modules\surgery\organs\augments_internal.dm Lines: 33?, 76?, 77?, 94? Total Colons: 4 -..code\modules\telesci\telesci_computer.dm Lines: 46?, 122?, 269? Total Colons: 4 -..code\modules\tooltip\tooltip.dm Lines: 90? Total Colons: 1 -..code\modules\vehicles\VehicleBase.dm Lines: 101?, 103?, 105?, 107? Total Colons: 4 -..code\modules\vehicles\VehicleClickInteractions.dm Lines: 128?, 157?, 186?, 214?, 252?, 254?, 257?, 259?, 262?, 264?, 267?, 269?, 272?, 274? Total Colons: 14 -..code\modules\vehicles\VehicleDefense.dm Lines: 31? Total Colons: 1 -..code\orphaned procs\dbcore.dm Lines: 79? Total Colons: 5 -..code\orphaned procs\statistics.dm Lines: 63, 64, 98, 99 Total Colons: 4 -..code\_onclick\other_mobs.dm Lines: 89 Total Colons: 1 -..code\_onclick\hud\action.dm Lines: 184? Total Colons: 1 -..code\_onclick\hud\alien.dm Lines: 90? Total Colons: 1 -..code\_onclick\hud\alien_larva.dm Lines: 16? Total Colons: 1 -..code\_onclick\hud\human.dm Lines: 59? Total Colons: 1 -..code\_onclick\hud\monkey.dm Lines: 17? Total Colons: 1 -..code\__DATASTRUCTURES\priority_queue.dm Lines: 33? Total Colons: 1 -..code\__DATASTRUCTURES\stacks.dm Lines: 29? Total Colons: 1 -..code\__HELPERS\game.dm Lines: 216? Total Colons: 1 -..code\__HELPERS\icons.dm Lines: 216?, 233?, 386?, 389?, 392?, 425?, 439?, 456?, 526?, 557?, 559?, 601?, 607?, 635?, 636?, 637?, 638?, 715, 752, 757, 762, 763, 764, 765, 774, 786, 787, 809?, 828?, 839? Total Colons: 38 -..code\__HELPERS\icon_smoothing.dm Lines: 176?, 178? Total Colons: 2 -..code\__HELPERS\lists.dm Lines: 201?, 206?, 214? Total Colons: 3 -..code\__HELPERS\maths.dm Lines: 13?, 18?, 35?, 39? Total Colons: 4 -..code\__HELPERS\mobs.dm Lines: 137?, 139?, 140? Total Colons: 11 -..code\__HELPERS\names.dm Lines: 63?, 174? Total Colons: 3 -..code\__HELPERS\sanitize_values.dm Lines: 34? Total Colons: 1 -..code\__HELPERS\text.dm Lines: 157?, 350? Total Colons: 2 -..code\__HELPERS\type2type.dm Lines: 68?, 143?, 381? Total Colons: 5 -..code\__HELPERS\unsorted.dm Lines: 41?, 573, 904, 991? Total Colons: 4 -..code\__HELPERS\sorts\__main.dm Lines: 2?, 57?, 391, 491, 585? Total Colons: 5 -433/1564 files have colons in them \ No newline at end of file diff --git a/tools/SQLAlertEmail/email_config.ps1 b/tools/SQLAlertEmail/email_config.ps1 new file mode 100644 index 0000000000..53865eb15f --- /dev/null +++ b/tools/SQLAlertEmail/email_config.ps1 @@ -0,0 +1,11 @@ +$Path = '..\..\data\logs\' #Server directory up to the year folder, this can be a relative or absolute path; remember the trailing \ +$StringToMatch = 'SQL:' +$From = 'admin@server.com' +[string[]]$To = 'email@address.com', 'a_different@address.org' #Email will be sent to each address listed here, you can have as many as you want +$Subject = 'SS13 server SQL error' +$Body = 'A SQL error was found in the following files:' #This parameter is optional, set it as '' if you want it gone +#SMTP server details; If you don't have one you can use the defaults provided here for Gmail's, provided you have a Google account +$SMTPServer = 'smtp.gmail.com' +$SMTPPort = '587' +$Account = "username" #SMTP server account name, excluding the domain address (this part: @domain.com) +$Password = 'password' #SMTP server password, if you're using Gmail's and have 2-factor authentication you'll have to use an App Password (Google for how) \ No newline at end of file diff --git a/tools/SQLAlertEmail/email_script.ps1 b/tools/SQLAlertEmail/email_script.ps1 new file mode 100644 index 0000000000..1ffa8d1b44 --- /dev/null +++ b/tools/SQLAlertEmail/email_script.ps1 @@ -0,0 +1,23 @@ +<# +This is a script designed to parse through your server logs and locate any SQL errors reported. +If found an email is sent to addresses specified in the configuration file: email_config.ps1. +A SMTP server is required, if you don't have one the defaults for Gmail's can be used. + +Suggested use is to schedule this task to be executed daily at server-time midnight so all the day's logs are checked. +You will likely find it helpful to set the configuration file to be untracked by git. +#> +. .\email_config.ps1 +$Date = Get-Date -format "yyyy\\MM\\dd" +$Matches = Get-ChildItem "$Path$Date" -recurse -include *.log | Select-String "$StringToMatch" -List | Select Path, Line + +$email = New-Object System.Net.Mail.MailMessage +$email.From = $From +foreach($i in $To) {$email.To.Add($i)} +$email.Subject = $Subject +$MatchList = foreach($m in $Matches) {"`t$m`n"} +$email.Body = $Body+"`n"+$MatchList + +$smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort); +$smtp.Credentials = New-Object System.Net.NetworkCredential($Account, $Password); +$smtp.EnableSSL = $true +$smtp.Send($email); \ No newline at end of file diff --git a/tools/github_webhook_processor.php b/tools/github_webhook_processor.php index d73970f04b..4ccdafa3f3 100644 --- a/tools/github_webhook_processor.php +++ b/tools/github_webhook_processor.php @@ -162,10 +162,10 @@ function tag_pr($payload, $opened) { $tags[] = $tag; //only maintners should be able to remove these - if(strpos($title, '[DNM]') !== FALSE) + if(strpos($lowertitle, '[dnm]') !== FALSE) $tags[] = 'Do Not Merge'; - if(strpos($title, '[WIP]') !== FALSE) + if(strpos($lowertitle, '[wip]') !== FALSE) $tags[] = 'Work In Progress'; $url = $payload['pull_request']['base']['repo']['url'] . '/issues/' . $payload['pull_request']['number'] . '/labels';