diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index cc17a9975c7..0e5b5ad3208 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -58,6 +58,9 @@ actual development.
be a new proc that they both can use.
- No magic numbers/strings. If you have a number or text that is important and used in
your code, make a `#DEFINE` statement with a name that clearly indicates it's use.
+ - `if(condition)` must be used over `if (condition)` or any other variation.
+ - The same applies for `while` and `for` loops, they must have no space between the
+ keyword and condition brackets. `while(condition)`, `for(condition)`
- If you want to output a message to a player's chat
(this includes text sent to `world`), use `to_chat(mob/client/world, "message")`.
Do not use `mob/client/world << "message"`.
diff --git a/.gitignore b/.gitignore
index 47ad360a40e..02f0c8cf790 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,7 +7,7 @@
#ignore any files in config/, except those in subdirectories.
/config/*
-!/config/*/*
+!config/**/*/
#ignore other, specific files and folers
data/
diff --git a/README.md b/README.md
index ff8ab8f6d80..6f8195ab8ea 100644
--- a/README.md
+++ b/README.md
@@ -120,8 +120,11 @@ including addons and modifications you have made.
See [this](https://www.gnu.org/licenses/why-affero-gpl.html) for more information.
-Any files located in the `Paradise/icons/goonstation` and `Paradise/sound/goonstation`
-folders, and any of their subdirectories, are licensed under the
+Any files located in the
+`Paradise/goon`,
+`Paradise/icons/goonstation`, or
+`Paradise/sound/goonstation`
+directories, or any subdirectories of mentioned directories are licensed under the
Creative Commons 3.0 BY-NC-SA license
(https://creativecommons.org/licenses/by-nc-sa/3.0)
diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql
index badefaf8999..dd54aea2e92 100644
--- a/SQL/paradise_schema.sql
+++ b/SQL/paradise_schema.sql
@@ -82,6 +82,7 @@ CREATE TABLE `characters` (
`speciesprefs` int(1) NOT NULL,
`socks` mediumtext NOT NULL,
`body_accessory` mediumtext NOT NULL,
+ `gear` mediumtext NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18747 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql
index 4f184355e5e..453554f5c69 100644
--- a/SQL/paradise_schema_prefixed.sql
+++ b/SQL/paradise_schema_prefixed.sql
@@ -82,6 +82,7 @@ CREATE TABLE `SS13_characters` (
`speciesprefs` int(1) NOT NULL,
`socks` mediumtext NOT NULL,
`body_accessory` mediumtext NOT NULL,
+ `gear` mediumtext NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18747 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
index bb50f35b41d..02ea1f45638 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
@@ -38,7 +38,7 @@
"aaL" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/syndicate)
"aaM" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
"aaN" = (/obj/structure/closet/syndicate/suits,/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
-"aaO" = (/obj/structure/table,/obj/item/weapon/c4{pixel_x = 2; pixel_y = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
+"aaO" = (/obj/structure/table,/obj/item/weapon/grenade/plastic/c4{pixel_x = 2; pixel_y = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"aaP" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"aaQ" = (/obj/machinery/atmospherics/unary/tank/air{dir = 1},/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate)
"aaR" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1331; id_tag = "synd_pump"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
@@ -71,13 +71,13 @@
"abs" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access_txt = "150"},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"abt" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/crowbar/red,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"abu" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless,/area/solar/auxport)
-"abv" = (/obj/machinery/sleeper/upgraded,/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
-"abw" = (/obj/machinery/sleep_console{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
+"abv" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/obj/machinery/sleeper/syndie{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
+"abw" = (/obj/machinery/sleeper/syndie{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"abx" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"aby" = (/obj/machinery/door/window{dir = 8; name = "Tool Storage"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"abz" = (/obj/structure/closet/crate/internals,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"abA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk,/area/solar/auxport)
-"abB" = (/obj/machinery/sleeper/upgraded,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
+"abB" = (/obj/machinery/sleeper{dir = 4; name = "Prisoner Sleeper"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitered"},/area/security/brig)
"abC" = (/obj/structure/table,/obj/item/weapon/gun/syringe,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"abD" = (/obj/structure/table,/obj/item/weapon/reagent_containers/syringe/charcoal,/obj/item/weapon/reagent_containers/syringe/charcoal{pixel_y = 2},/obj/item/weapon/reagent_containers/syringe/charcoal{pixel_y = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"abE" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
@@ -111,9 +111,9 @@
"acg" = (/turf/simulated/wall/r_wall,/area/security/prison)
"ach" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/prison)
"aci" = (/obj/machinery/seed_extractor,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
-"acj" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/flora/kirbyplants{icon_state = "applebush"; layer = 4.1; tag = "icon-applebush"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
+"acj" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "applebush"; layer = 4.1; tag = "icon-applebush"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"ack" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/security/prison)
-"acl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/flora/kirbyplants{layer = 4.1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
+"acl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/twohanded/required/kirbyplants{layer = 4.1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"acm" = (/obj/machinery/biogenerator,/obj/machinery/light/small{dir = 4},/obj/machinery/camera{c_tag = "Prison Hydroponics"; network = list("SS13","Prison")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"acn" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/prison)
"aco" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/ambrosiavulgarisseed,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
@@ -150,7 +150,7 @@
"acT" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{tag = "icon-warndark (NORTHEAST)"; icon_state = "warndark"; dir = 5},/area/prison/solitary{name = "Prisoner Education Chamber"})
"acU" = (/obj/item/weapon/soap/nanotrasen,/obj/item/weapon/bikehorn/rubberducky,/obj/machinery/shower{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison)
"acV" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison)
-"acW" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/flora/kirbyplants{tag = "icon-plant-13"; icon_state = "plant-13"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
+"acW" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/twohanded/required/kirbyplants{tag = "icon-plant-13"; icon_state = "plant-13"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"acX" = (/obj/structure/table,/obj/item/weapon/folder,/obj/item/weapon/paper/hydroponics,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"acY" = (/obj/structure/table,/obj/machinery/computer/library/public,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
"acZ" = (/obj/machinery/computer/arcade,/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison)
@@ -404,7 +404,7 @@
"ahN" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/sign/pods{pixel_y = 30},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison)
"ahO" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/flasher_button{id = "insaneflash"; pixel_y = 26},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison)
"ahP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/prison)
-"ahQ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/flora/kirbyplants{icon_state = "plant-16"; layer = 4.1; tag = "icon-plant-16"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'WARNING: Criminally Insane Inmates', describing the possible hazards of those contained within."; name = "WARNING: Criminally Insane Inmates"; pixel_y = 32},/turf/simulated/floor/plasteel,/area/security/prison)
+"ahQ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-16"; layer = 4.1; tag = "icon-plant-16"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'WARNING: Criminally Insane Inmates', describing the possible hazards of those contained within."; name = "WARNING: Criminally Insane Inmates"; pixel_y = 32},/turf/simulated/floor/plasteel,/area/security/prison)
"ahR" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/prison)
"ahS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/light/small{dir = 1},/obj/item/weapon/storage/secure/safe{name = "armory safe A"; pixel_x = 6; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"ahT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
@@ -435,7 +435,7 @@
"ais" = (/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"ait" = (/obj/item/weapon/skeleton/r_arm,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"aiu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/external{name = "Solar Maintenance"; req_access = null; req_access_txt = "10; 13"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
-"aiv" = (/obj/structure/flora/kirbyplants{icon_state = "applebush"; layer = 4.1; tag = "icon-applebush"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/security/prison)
+"aiv" = (/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "applebush"; layer = 4.1; tag = "icon-applebush"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/security/prison)
"aiw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison)
"aix" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison)
"aiy" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/prison)
@@ -490,7 +490,7 @@
"ajv" = (/obj/structure/rack,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/suit/space/vox/carapace,/obj/item/clothing/head/helmet/space/vox/carapace,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"ajw" = (/obj/structure/rack,/obj/item/weapon/gun/dartgun/vox/raider,/obj/item/weapon/gun/dartgun/vox/medical,/obj/item/weapon/dart_cartridge,/obj/item/weapon/dart_cartridge,/obj/item/weapon/dart_cartridge,/obj/item/weapon/dart_cartridge,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"ajx" = (/obj/machinery/sleeper/upgraded,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"ajy" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
+"ajy" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/security/brig)
"ajz" = (/obj/machinery/bodyscanner,/obj/machinery/light/spot,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"ajA" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"ajB" = (/turf/simulated/wall/r_wall,/area/maintenance/auxsolarport)
@@ -745,9 +745,9 @@
"aoq" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/fore)
"aor" = (/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/fore)
"aos" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/fore)
-"aot" = (/obj/machinery/sleeper{dir = 8; name = "Prisoner Sleeper"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitered"},/area/security/brig)
+"aot" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"})
"aou" = (/obj/structure/table,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/security/brig)
-"aov" = (/obj/machinery/sleep_console,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/security/brig)
+"aov" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "whitebluefull"},/area/medical/sleeper{name = "Sleepers"})
"aow" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralcorner"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"aox" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{dir = 4; icon_state = "neutralcorner"},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
"aoy" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/crew_quarters/fitness{name = "\improper Recreation Area"})
@@ -1050,7 +1050,7 @@
"auj" = (/obj/structure/stool{pixel_y = 8},/obj/machinery/camera/autoname{dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"auk" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"aul" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
-"aum" = (/obj/machinery/door/airlock/maintenance{icon = 'icons/obj/doors/Doorint.dmi'; name = "Brig Emergency Storage"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/brig)
+"aum" = (/obj/machinery/door/airlock/maintenance{icon = 'icons/obj/doors/doorint.dmi'; name = "Brig Emergency Storage"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/brig)
"aun" = (/obj/machinery/space_heater,/turf/simulated/floor/plasteel,/area/security/podbay)
"auo" = (/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/maintenance/starboard)
"aup" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space)
@@ -1121,10 +1121,10 @@
"avC" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/starboard)
"avD" = (/obj/structure/rack,/obj/item/weapon/book/manual/engineering_guide{pixel_x = 3; pixel_y = 4},/obj/effect/spawner/lootdrop/maintenance,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/starboard)
"avE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall/r_wall,/area/engine/gravitygenerator)
-"avF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/engine/gravitygenerator)
-"avG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/gravitygenerator)
-"avH" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/gravitygenerator)
-"avI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/power/terminal,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/gravitygenerator)
+"avF" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/engine/gravitygenerator)
+"avG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/gravitygenerator)
+"avH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/engine/gravitygenerator)
+"avI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/power/terminal,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/gravitygenerator)
"avJ" = (/obj/machinery/firealarm{dir = 4; pixel_x = 28},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/stool/bed/chair/office/light,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/gravitygenerator)
"avK" = (/obj/machinery/power/apc{dir = 8; name = "Fore Starboard Solar APC"; pixel_x = -25; pixel_y = 3},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/auxsolarstarboard)
"avL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/maintenance/auxsolarstarboard)
@@ -1193,7 +1193,7 @@
"awW" = (/obj/structure/dresser,/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/carpet,/area/crew_quarters/sleep)
"awX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/starboard)
"awY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/engine/gravitygenerator)
-"awZ" = (/obj/machinery/door/airlock/highsecurity{name = "Gravity Generator Room"; req_access_txt = "19;23"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/gravitygenerator)
+"awZ" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/hologram/holopad,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/gravitygenerator)
"axa" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/gravitygenerator)
"axb" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/table,/obj/item/weapon/paper/gravity_gen{layer = 3},/obj/item/weapon/pen/blue,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/gravitygenerator)
"axc" = (/obj/machinery/space_heater,/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/starboard)
@@ -1262,7 +1262,7 @@
"ayn" = (/obj/structure/closet,/obj/item/weapon/stock_parts/matter_bin,/turf/simulated/floor/plating,/area/maintenance/starboard)
"ayo" = (/obj/machinery/door/airlock/maintenance{name = "Storage Room"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboard)
"ayp" = (/obj/structure/closet/radiation,/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; dir = 1; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/engine/gravitygenerator)
-"ayq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/gravitygenerator)
+"ayq" = (/obj/machinery/door/airlock/highsecurity{name = "Gravity Generator Room"; req_access_txt = "19;23"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/gravitygenerator)
"ayr" = (/obj/machinery/camera{c_tag = "Gravity Generator Foyer"},/obj/structure/closet/radiation,/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; dir = 1; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 32},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/engine/gravitygenerator)
"ays" = (/obj/structure/closet/secure_closet/security,/obj/item/device/spacepod_equipment/weaponry/laser,/obj/machinery/power/apc{dir = 4; name = "Security Podbay APC"; pixel_x = 25},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"ayt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
@@ -1326,7 +1326,7 @@
"azz" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"azA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/starboard)
"azB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/maintenance/starboard)
-"azC" = (/obj/structure/flora/kirbyplants,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"azC" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"azD" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/multi_tile/three_tile_ver{id_tag = "mechpodbay"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop)
"azE" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"azF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/maintenance/starboard)
@@ -1648,7 +1648,7 @@
"aFJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel,/area/crew_quarters/sleep)
"aFK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/pods{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/sleep)
"aFL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/starboard)
-"aFM" = (/obj/effect/decal/cleanable/cobweb,/obj/structure/flora/kirbyplants{icon_state = "plant-20"; layer = 4.1; pixel_y = 3; tag = "icon-plant-20"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
+"aFM" = (/obj/effect/decal/cleanable/cobweb,/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-20"; layer = 4.1; pixel_y = 3; tag = "icon-plant-20"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
"aFN" = (/obj/item/clothing/head/helmet/space/rig/engineering,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
"aFO" = (/obj/structure/dispenser,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
"aFP" = (/obj/machinery/camera{c_tag = "Engineering - Storage"; dir = 2; network = list("SS13")},/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
@@ -1955,9 +1955,9 @@
"aLE" = (/obj/structure/table,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plasteel,/area/construction)
"aLF" = (/obj/structure/closet/toolcloset,/obj/machinery/light_construct{dir = 1},/turf/simulated/floor/plasteel,/area/construction)
"aLG" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/plasteel,/area/construction)
-"aLH" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/supply)
+"aLH" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/supply)
"aLI" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/supply)
-"aLJ" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/supply)
+"aLJ" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/supply)
"aLK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/spawner/window{useFull = 1; tag = "fullWin"},/turf/simulated/floor/plating,/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aLL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/mining{name = "Mining Office"; req_access_txt = "48"},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aLM" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/quartermaster/storage)
@@ -2058,7 +2058,7 @@
"aND" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/obj/machinery/requests_console{department = "Law office"; pixel_x = 0; pixel_y = 32},/obj/machinery/newscaster{pixel_x = -31; pixel_y = 0},/turf/simulated/floor/wood,/area/lawoffice)
"aNE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"aNF" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/briefcase{pixel_x = -3; pixel_y = 2},/obj/item/weapon/storage/secure/briefcase{pixel_x = 2; pixel_y = -2},/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/wood,/area/lawoffice)
-"aNG" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "Law Office APC"; pixel_y = 24},/obj/structure/flora/kirbyplants{icon_state = "plant-21"; layer = 4.1; tag = "icon-plant-21"},/turf/simulated/floor/wood,/area/lawoffice)
+"aNG" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "Law Office APC"; pixel_y = 24},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-21"; layer = 4.1; tag = "icon-plant-21"},/turf/simulated/floor/wood,/area/lawoffice)
"aNH" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/wood,/area/lawoffice)
"aNI" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/fore)
"aNJ" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light/small{dir = 8},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -32},/obj/effect/landmark{name = "blobstart"},/obj/machinery/door_control{id = "Toilet1"; name = "Lock Control"; normaldoorcontrol = 1; pixel_x = -25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/locker/locker_toilet{name = "\improper Restrooms"})
@@ -2191,7 +2191,7 @@
"aQg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
"aQh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/porta_turret,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"aQi" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/flasher{pixel_x = 0; pixel_y = 24; id = "AI"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
-"aQj" = (/obj/structure/sign/kiddieplaque{pixel_y = 32},/obj/structure/table,/obj/machinery/camera/motion{c_tag = "AI Upload Chamber - Fore"; network = list("SS13","RD","AIUpload")},/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
+"aQj" = (/obj/structure/sign/kiddieplaque{pixel_y = 32},/obj/structure/table,/obj/machinery/camera/motion{c_tag = "AI Upload Chamber - Fore"; network = list("SS13","RD","AIUpload")},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"aQk" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"aQl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/porta_turret,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai_upload)
"aQm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload)
@@ -2475,7 +2475,7 @@
"aVE" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom)
"aVF" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom)
"aVG" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom)
-"aVH" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/structure/flora/kirbyplants{icon_state = "plant-03"; layer = 4.1; tag = "icon-plant-03"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker)
+"aVH" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-03"; layer = 4.1; tag = "icon-plant-03"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker)
"aVI" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker)
"aVJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker)
"aVK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/crew_quarters/locker)
@@ -2665,10 +2665,10 @@
"aZm" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 5; health = 120; icon_state = "twindow"; reinf = 0},/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"})
"aZn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/engineering{name = "Arrivals Expansion Area"; req_access_txt = "32"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"})
"aZo" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
-"aZp" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/supply)
+"aZp" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/supply)
"aZq" = (/turf/simulated/shuttle/wall{icon_state = "swall15"; dir = 2},/area/shuttle/supply)
"aZr" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/shuttle/plating,/area/shuttle/supply)
-"aZs" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/supply)
+"aZs" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/supply)
"aZt" = (/turf/simulated/wall,/area/quartermaster/storage)
"aZu" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/camera{c_tag = "Cargo Bay - Port"; dir = 4; network = list("SS13")},/obj/machinery/conveyor{dir = 2; id = "QMLoad"; movedir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage)
"aZv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
@@ -2728,7 +2728,7 @@
"bax" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating/airless,/area/engine/engineering)
"bay" = (/obj/machinery/camera/emp_proof{c_tag = "Aft Arm - Far"; dir = 8; network = list("Singulo")},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"baz" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
-"baA" = (/obj/structure/flora/kirbyplants{icon_state = "plant-13"; layer = 4.1; tag = "icon-plant-13"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
+"baA" = (/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-13"; layer = 4.1; tag = "icon-plant-13"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"baB" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"baC" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"baD" = (/obj/structure/stool/bed/chair,/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
@@ -2766,7 +2766,7 @@
"bbj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload_foyer)
"bbk" = (/obj/machinery/door/airlock/highsecurity{name = "Secure Network Access"; req_access_txt = "19"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/turret_protected/ai_upload_foyer)
"bbl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/turret_protected/ai_upload_foyer)
-"bbm" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/flora/kirbyplants{icon_state = "applebush"; layer = 4.1; tag = "icon-applebush"},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 9},/area/hallway/primary/central)
+"bbm" = (/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "applebush"; layer = 4.1; tag = "icon-applebush"},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 9},/area/hallway/primary/central)
"bbn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/primary/central)
"bbo" = (/obj/structure/sign/double/map/left{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/primary/central)
"bbp" = (/obj/structure/sign/double/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = 32},/obj/machinery/camera{c_tag = "Central Primary Hallway - Fore"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/central)
@@ -2776,7 +2776,7 @@
"bbt" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/central)
"bbu" = (/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 21},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/primary/central)
"bbv" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/hallway/primary/central)
-"bbw" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/flora/kirbyplants{icon_state = "plant-16"; layer = 4.1; tag = "icon-plant-16"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "neutral"},/area/hallway/primary/central)
+"bbw" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-16"; layer = 4.1; tag = "icon-plant-16"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "neutral"},/area/hallway/primary/central)
"bbx" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/centcom{name = "Courtroom"; opacity = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/crew_quarters/courtroom)
"bby" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Crew Quarters Access"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
"bbz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Crew Quarters Access"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/crew_quarters/locker)
@@ -2904,7 +2904,7 @@
"bdR" = (/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/turf/simulated/floor/plating,/area/hallway/secondary/entry{name = "Arrivals"})
"bdS" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"bdT" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
-"bdU" = (/obj/structure/flora/kirbyplants{icon_state = "plant-05"; layer = 4.1; tag = "icon-plant-05"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
+"bdU" = (/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-05"; layer = 4.1; tag = "icon-plant-05"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"bdV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"bdW" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/entry{name = "Arrivals"})
"bdX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
@@ -3059,7 +3059,7 @@
"bgQ" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
"bgR" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/wall/r_wall,/area/turret_protected/ai)
"bgS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
-"bgT" = (/obj/structure/table,/obj/structure/flora/kirbyplants{icon_state = "plant-09"; name = "Photosynthetic Potted plant"; pixel_y = 10; tag = "icon-plant-09"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
+"bgT" = (/obj/structure/table,/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-09"; name = "Photosynthetic Potted plant"; pixel_y = 10; tag = "icon-plant-09"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
"bgU" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space)
"bgV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"bgW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
@@ -3131,12 +3131,12 @@
"bik" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/ai_slipper{icon_state = "motion0"},/obj/machinery/door/window{dir = 8; icon_state = "left"; name = "Tertiary AI Core Access"; pixel_x = 0; req_access_txt = "16"},/turf/simulated/floor/bluegrid,/area/turret_protected/ai)
"bil" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/ai)
"bim" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "MiniSat Exterior Starboard-Fore"; dir = 4; network = list("MiniSat")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
-"bin" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/shuttle/arrival/station)
+"bin" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/arrival/station)
"bio" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/arrival/station)
"bip" = (/obj/machinery/door/airlock/shuttle{name = "Arrivals Shuttle Airlock"},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"biq" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/shuttle/plating,/area/shuttle/arrival/station)
"bir" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/shuttle/arrival/station)
-"bis" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/shuttle/arrival/station)
+"bis" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/arrival/station)
"bit" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
"biu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/security/checkpoint2{name = "Customs"})
"biv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11},/obj/structure/table/reinforced,/obj/item/weapon/book/manual/security_space_law{pixel_x = -3; pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/checkpoint2{name = "Customs"})
@@ -3373,7 +3373,7 @@
"bmS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atm{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bmT" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "bridge blast"; layer = 2.9; name = "bridge blast door"},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/bridge)
"bmU" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/photo_album{pixel_y = -4},/obj/item/device/camera{pixel_y = 4},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (Captain)"; pixel_x = -28},/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
-"bmV" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/item/weapon/reagent_containers/food/drinks/flask{pixel_x = 8},/obj/item/weapon/razor{pixel_x = -4; pixel_y = 2},/obj/item/clothing/mask/cigarette/cigar,/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
+"bmV" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/table/woodentable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/item/weapon/reagent_containers/food/drinks/flask/gold,/obj/item/weapon/razor{pixel_x = -4; pixel_y = 2},/obj/item/clothing/mask/cigarette/cigar,/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"bmW" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"bmX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
"bmY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/carpet,/area/crew_quarters/captain{name = "\improper Captain's Quarters"})
@@ -3497,7 +3497,7 @@
"bpm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/small,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/engine/gravitygenerator)
"bpn" = (/turf/simulated/floor/plasteel,/area/engine/break_room)
"bpo" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 2},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/engine/gravitygenerator)
-"bpp" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/gravitygenerator)
+"bpp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/engine/gravitygenerator)
"bpq" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; dir = 1; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/maintenance/starboard)
"bpr" = (/obj/structure/lattice,/obj/structure/lattice,/turf/space,/area/space)
"bps" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 1; pixel_y = 1},/turf/space,/area/space)
@@ -3600,7 +3600,7 @@
"brl" = (/obj/machinery/power/port_gen/pacman,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 31},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/tcomeast{name = "\improper MiniSat East Wing"})
"brm" = (/obj/machinery/computer/security/telescreen{dir = 2; name = "MiniSat Camera Monitor"; network = list("MiniSat","tcomm"); pixel_x = 0; pixel_y = 29},/obj/machinery/computer/station_alert,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/tcomeast{name = "\improper MiniSat East Wing"})
"brn" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1; name = "Auxiliary MiniSat Distribution Port"},/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 31},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/tcomeast{name = "\improper MiniSat East Wing"})
-"bro" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/shuttle/arrival/station)
+"bro" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/arrival/station)
"brp" = (/obj/structure/closet/emcloset,/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"brq" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"brr" = (/obj/structure/sign/double/map/left{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-left-MS"; pixel_y = -32},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
@@ -3699,7 +3699,7 @@
"btg" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/turret_protected/tcomeast{name = "\improper MiniSat East Wing"})
"bth" = (/obj/machinery/door/airlock/shuttle{name = "Arrivals Shuttle Airlock"},/turf/simulated/shuttle/plating,/area/shuttle/arrival/station)
"bti" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"; dir = 2},/area/shuttle/arrival/station)
-"btj" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/shuttle/arrival/station)
+"btj" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/arrival/station)
"btk" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/camera{c_tag = "Arrivals - Station Entrance"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"btl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/secondary/entry{name = "Arrivals"})
"btm" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
@@ -4026,10 +4026,10 @@
"bzv" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"bzw" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"bzx" = (/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
-"bzy" = (/obj/structure/flora/kirbyplants{icon_state = "plant-18"; layer = 4.1; tag = "icon-plant-18"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
+"bzy" = (/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-18"; layer = 4.1; tag = "icon-plant-18"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"bzz" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"bzA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry{name = "Arrivals"})
-"bzB" = (/obj/structure/flora/kirbyplants{icon_state = "plant-10"; layer = 4.1; tag = "icon-plant-10"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/primary/port)
+"bzB" = (/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-10"; layer = 4.1; tag = "icon-plant-10"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/primary/port)
"bzC" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/primary/port)
"bzD" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/camera{c_tag = "Port Primary Hallway - Port"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hallway/primary/port)
"bzE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/hallway/primary/port)
@@ -4121,7 +4121,7 @@
"bBm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/rack,/obj/item/weapon/crowbar/red,/obj/item/weapon/wrench,/obj/item/clothing/head/welding,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/tcomeast{name = "\improper MiniSat East Wing"})
"bBn" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = -3; pixel_y = 3},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/toolbox/emergency{pixel_x = 3; pixel_y = -3},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/tcomeast{name = "\improper MiniSat East Wing"})
"bBo" = (/obj/machinery/recharge_station,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/turret_protected/tcomeast{name = "\improper MiniSat East Wing"})
-"bBp" = (/obj/structure/flora/kirbyplants{icon_state = "plant-20"; layer = 4.1; tag = "icon-plant-20"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
+"bBp" = (/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-20"; layer = 4.1; tag = "icon-plant-20"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"bBq" = (/obj/structure/stool/bed/chair,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"bBr" = (/obj/structure/stool/bed/chair,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"bBs" = (/turf/simulated/floor/plasteel{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/entry{name = "Arrivals"})
@@ -4166,7 +4166,7 @@
"bCf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"bCg" = (/obj/machinery/hologram/holopad,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"bCh" = (/obj/machinery/camera{c_tag = "Council Chamber"; dir = 2; network = list("SS13")},/obj/machinery/light{dir = 1},/obj/machinery/ai_status_display{pixel_y = 32},/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
-"bCi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/account_database,/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 250; oxygen = 0; temperature = 0},/area/bridge)
+"bCi" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/doorint.dmi'; name = "Starboard Emergency Storage"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboard)
"bCj" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/light_switch{pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"bCk" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -26; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"bCl" = (/obj/item/weapon/hand_labeler,/obj/item/stack/packageWrap,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/woodentable,/obj/item/device/eftpos,/turf/simulated/floor/wood,/area/crew_quarters/heads)
@@ -4441,7 +4441,7 @@
"bHu" = (/obj/structure/stool/bed/chair/comfy/black,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/wood,/area/library)
"bHv" = (/obj/machinery/vending/coffee,/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/wood,/area/library)
"bHw" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/wood,/area/library)
-"bHx" = (/obj/structure/flora/kirbyplants{tag = "icon-plant-22"; icon_state = "plant-22"},/turf/simulated/floor/wood,/area/library)
+"bHx" = (/obj/item/weapon/twohanded/required/kirbyplants{tag = "icon-plant-22"; icon_state = "plant-22"},/turf/simulated/floor/wood,/area/library)
"bHy" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/bridge/meeting_room{name = "\improper Command Hallway"})
"bHz" = (/obj/machinery/door/poddoor/shutters/preopen{id_tag = "hopqueue"; name = "HoP Queue Shutters"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "loadingarea"; tag = "loading"},/area/bridge/meeting_room{name = "\improper Command Hallway"})
"bHA" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/bridge/meeting_room{name = "\improper Command Hallway"})
@@ -4496,7 +4496,7 @@
"bIx" = (/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
"bIy" = (/obj/machinery/microwave{pixel_x = 0; pixel_y = 4},/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"})
"bIz" = (/obj/machinery/light/small,/obj/item/weapon/storage/box/donkpockets,/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"})
-"bIA" = (/obj/structure/flora/kirbyplants{tag = "icon-plant-21"; icon_state = "plant-21"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"})
+"bIA" = (/obj/item/weapon/twohanded/required/kirbyplants{tag = "icon-plant-21"; icon_state = "plant-21"},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"})
"bIB" = (/obj/structure/filingcabinet{pixel_x = 3},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"})
"bIC" = (/obj/machinery/light/small,/obj/item/weapon/folder,/obj/item/weapon/folder,/obj/machinery/camera{c_tag = "Telecoms - Control Room"; dir = 1; network = list("SS13","tcomm")},/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"})
"bID" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Telecoms Admin"; departmentType = 5; name = "Telecoms RC"; pixel_x = 0; pixel_y = -30},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/paper_bin{pixel_x = -1; pixel_y = 6},/obj/structure/table/woodentable,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/tcommsat/computer{name = "\improper Telecoms Control Room"})
@@ -4814,12 +4814,12 @@
"bOD" = (/obj/item/stack/sheet/rglass{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/device/flashlight,/obj/structure/closet/crate,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/teleporter{name = "\improper Teleporter Room"})
"bOE" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/teleporter{name = "\improper Teleporter Room"})
"bOF" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/closet/crate,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/teleporter{name = "\improper Teleporter Room"})
-"bOG" = (/obj/machinery/light{dir = 1},/obj/structure/flora/kirbyplants,/turf/simulated/floor/wood,/area/blueshield)
+"bOG" = (/obj/machinery/light{dir = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/blueshield)
"bOH" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/blueshield)
"bOI" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/wood,/area/blueshield)
"bOJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/wood,/area/blueshield)
"bOK" = (/obj/machinery/light{dir = 1},/obj/machinery/power/apc{dir = 4; name = "Blueshield Office APC"; pixel_x = 24; pixel_y = -3},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/blueshield)
-"bOL" = (/obj/machinery/light{dir = 1},/obj/structure/flora/kirbyplants,/turf/simulated/floor/wood,/area/ntrep)
+"bOL" = (/obj/machinery/light{dir = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/ntrep)
"bOM" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/ntrep)
"bON" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/wood,/area/ntrep)
"bOO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/wood,/area/ntrep)
@@ -4958,7 +4958,7 @@
"bRr" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/telecomms/processor/preset_four,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server)
"bRs" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/telecomms/bus/preset_four,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server)
"bRt" = (/obj/machinery/blackbox_recorder,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server)
-"bRu" = (/obj/structure/flora/kirbyplants{icon_state = "plant-06"; level = 4.1; tag = "icon-plant-06"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
+"bRu" = (/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-06"; level = 4.1; tag = "icon-plant-06"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"bRv" = (/obj/structure/stool/bed/chair,/obj/effect/landmark/start{name = "Civilian"},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"bRw" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"bRx" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
@@ -5049,12 +5049,12 @@
"bTe" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "MiniSat Exterior Aft-Starboard"; dir = 4; network = list("MiniSat")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
"bTf" = (/obj/structure/table/reinforced,/obj/item/device/flashlight,/obj/item/device/radio,/obj/machinery/camera{c_tag = "Engineering Equipment East"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"bTg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
-"bTh" = (/obj/machinery/door/airlock{icon = 'icons/obj/doors/Doorint.dmi'; name = "Starboard Emergency Storage"; req_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/starboard)
+"bTh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/account_database,/turf/simulated/floor/bluegrid,/area/bridge)
"bTi" = (/obj/item/stack/sheet/cardboard,/obj/item/device/flashlight,/obj/effect/decal/cleanable/cobweb2,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/maintenance/starboard)
"bTj" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"bTk" = (/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"bTl" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
-"bTm" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/sign/double/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = -32},/obj/structure/flora/kirbyplants{icon_state = "plant-03"; layer = 4.1; tag = "icon-plant-03"},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 6},/area/hallway/secondary/entry{name = "Arrivals"})
+"bTm" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/sign/double/map/right{desc = "A framed picture of the station. Clockwise from security at the top (red), you see engineering (yellow), science (purple), escape (red and white), medbay (green), arrivals (blue and white), and finally cargo (brown)."; icon_state = "map-right-MS"; pixel_y = -32},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-03"; layer = 4.1; tag = "icon-plant-03"},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 6},/area/hallway/secondary/entry{name = "Arrivals"})
"bTn" = (/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/wood,/area/security/vacantoffice)
"bTo" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/turf/simulated/floor/wood,/area/security/vacantoffice)
"bTp" = (/obj/structure/mirror{pixel_x = -28},/obj/item/weapon/lipstick/black,/obj/item/weapon/lipstick/jade{pixel_x = 2; pixel_y = 2},/obj/item/weapon/lipstick/purple{pixel_x = -2; pixel_y = -2},/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/fpmaint2{name = "Port Maintenance"})
@@ -5609,7 +5609,7 @@
"cdS" = (/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/fpmaint2{name = "Port Maintenance"})
"cdT" = (/turf/simulated/wall,/area/medical/medbay2{name = "Medbay Storage"})
"cdU" = (/turf/simulated/wall,/area/security/checkpoint/medical)
-"cdV" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/structure/flora/kirbyplants{icon_state = "applebush"; layer = 4.1; tag = "icon-applebush"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central)
+"cdV" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "applebush"; layer = 4.1; tag = "icon-applebush"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central)
"cdW" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central)
"cdX" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central)
"cdY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central)
@@ -5622,7 +5622,7 @@
"cef" = (/obj/machinery/camera{c_tag = "Central Primary Hallway - Aft-Starboard"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/central)
"ceg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/central)
"ceh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/central)
-"cei" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/flora/kirbyplants{icon_state = "plant-10"; layer = 4.1; tag = "icon-plant-10"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/central)
+"cei" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-10"; layer = 4.1; tag = "icon-plant-10"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/central)
"cej" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/obj/machinery/newscaster{pixel_y = -29},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/hallway/primary/central)
"cek" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "0"; req_one_access_txt = "12;7;35;8;47"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cel" = (/obj/effect/spawner/window{useFull = 1; tag = "fullWin"},/turf/simulated/floor/plating,/area/hallway/primary/central)
@@ -5971,7 +5971,7 @@
"ckQ" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/medbay{name = "Medbay Central"})
"ckR" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"},/area/medical/medbay{name = "Medbay Central"})
"ckS" = (/obj/effect/landmark/start{name = "Paramedic"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"},/area/medical/medbay{name = "Medbay Central"})
-"ckT" = (/obj/structure/flora/kirbyplants{tag = "icon-plant-11"; icon_state = "plant-11"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"},/area/medical/medbay{name = "Medbay Central"})
+"ckT" = (/obj/item/weapon/twohanded/required/kirbyplants{tag = "icon-plant-11"; icon_state = "plant-11"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteyellow"},/area/medical/medbay{name = "Medbay Central"})
"ckU" = (/obj/effect/spawner/window{useFull = 1; tag = "fullWin"},/turf/simulated/floor/plating,/area/medical/medbay{name = "Medbay Central"})
"ckV" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"ckW" = (/obj/machinery/autolathe{icon_state = "autolathe"; name = "public autolathe"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
@@ -5980,7 +5980,7 @@
"ckZ" = (/obj/structure/table,/obj/item/weapon/stock_parts/cell/potato,/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
"cla" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
"clb" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
-"clc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -30},/obj/structure/flora/kirbyplants{layer = 4.1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
+"clc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -30},/obj/item/weapon/twohanded/required/kirbyplants{layer = 4.1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
"cld" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
"cle" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
"clf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/checkpoint/science{name = "Security Post - Research Division"})
@@ -6016,7 +6016,7 @@
"clJ" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"clK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/aft{name = "Aft Maintenance"})
"clL" = (/obj/item/trash/pistachios,/obj/structure/closet,/obj/item/weapon/stock_parts/console_screen,/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"clM" = (/obj/structure/flora/kirbyplants{tag = "icon-plant-25"; icon_state = "plant-25"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"clM" = (/obj/item/weapon/twohanded/required/kirbyplants{tag = "icon-plant-25"; icon_state = "plant-25"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"clN" = (/obj/item/weapon/storage/box,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"clO" = (/obj/structure/closet/crate,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"clP" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
@@ -6303,11 +6303,9 @@
"crk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/surgery)
"crl" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/surgery)
"crm" = (/obj/item/weapon/cigbutt,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/sign/nosmoking_2{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/surgery)
-"crn" = (/obj/machinery/sleep_console{tag = "icon-console (EAST)"; icon_state = "console"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "whitebluefull"},/area/medical/sleeper{name = "Sleepers"})
-"cro" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11},/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"})
+"crn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"})
+"cro" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/sleeper,/turf/simulated/floor/plasteel{icon_state = "whitebluefull"},/area/medical/sleeper{name = "Sleepers"})
"crp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"})
-"crq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/sleeper,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteblue"},/area/medical/sleeper{name = "Sleepers"})
-"crr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/sleep_console,/turf/simulated/floor/plasteel{icon_state = "whitebluefull"},/area/medical/sleeper{name = "Sleepers"})
"crs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/effect/spawner/window{useFull = 1; tag = "fullWin"},/turf/simulated/floor/plating,/area/medical/sleeper{name = "Sleepers"})
"crt" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"})
"cru" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"})
@@ -6468,7 +6466,7 @@
"cut" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
"cuu" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurple"},/area/medical/research{name = "Research Division"})
"cuv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
-"cuw" = (/obj/structure/flora/kirbyplants{icon_state = "plant-10"; layer = 4.1; tag = "icon-plant-10"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
+"cuw" = (/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-10"; layer = 4.1; tag = "icon-plant-10"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurplecorner"},/area/medical/research{name = "Research Division"})
"cux" = (/obj/machinery/firealarm{dir = 8; pixel_x = -26; pixel_y = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitepurplecorner"},/area/toxins/explab)
"cuy" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
"cuz" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
@@ -6904,7 +6902,7 @@
"cCN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Research Division Hallway - Mech Bay"; dir = 4; network = list("SS13","RD")},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"cCO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"cCP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/research{name = "Research Division"})
-"cCQ" = (/obj/machinery/power/apc{dir = 2; name = "RD Office APC"; pixel_x = 0; pixel_y = -27},/obj/structure/cable/yellow,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/structure/flora/kirbyplants/dead,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
+"cCQ" = (/obj/machinery/power/apc{dir = 2; name = "RD Office APC"; pixel_x = 0; pixel_y = -27},/obj/structure/cable/yellow,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/weapon/twohanded/required/kirbyplants/dead,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"cCR" = (/obj/machinery/hologram/holopad,/obj/machinery/light,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
"cCS" = (/obj/structure/table,/obj/item/weapon/retractor,/obj/machinery/light{dir = 4},/obj/structure/window/reinforced/polarized{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/obj/item/weapon/hemostat,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cCT" = (/obj/structure/closet/secure_closet/RD,/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/crew_quarters/hor)
@@ -7380,7 +7378,7 @@
"cLV" = (/obj/structure/sign/securearea{pixel_x = 0; pixel_y = 32},/obj/machinery/shower{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/medical/virology)
"cLW" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/iv_drip{density = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"; tag = "icon-whitehall (WEST)"},/area/medical/medbay3{name = "Medbay Aft"})
"cLX" = (/obj/machinery/light/small{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreen"},/area/medical/medbay3{name = "Medbay Aft"})
-"cLY" = (/obj/structure/flora/kirbyplants{icon_state = "plant-21"; layer = 4.1; pixel_x = -3; pixel_y = 3; tag = "icon-plant-21"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/medbay3{name = "Medbay Aft"})
+"cLY" = (/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-21"; layer = 4.1; pixel_x = -3; pixel_y = 3; tag = "icon-plant-21"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/medbay3{name = "Medbay Aft"})
"cLZ" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"})
"cMa" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"})
"cMb" = (/obj/structure/table,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
@@ -7703,14 +7701,14 @@
"cSg" = (/obj/machinery/door/morgue{name = "Relic Closet"; req_access_txt = "22"},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/chapel/office)
"cSh" = (/obj/structure/table/woodentable,/obj/item/weapon/spellbook/oneuse/smoke{name = "mysterious old book of "},/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater{name = "flask of holy water"; pixel_x = -2; pixel_y = 2},/obj/item/weapon/nullrod{pixel_x = 4},/obj/item/organ/internal/heart,/obj/item/device/soulstone,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/chapel/office)
"cSi" = (/obj/machinery/door/airlock/maintenance{name = "Chapel Maintenance Access "; req_access_txt = "0"; req_one_access_txt = "12;27"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cSj" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/camera{c_tag = "Departure Lounge - Port Fore"; dir = 4; network = list("SS13")},/obj/structure/flora/kirbyplants{icon_state = "plant-24"; layer = 4.1; tag = "icon-plant-24"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
+"cSj" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/camera{c_tag = "Departure Lounge - Port Fore"; dir = 4; network = list("SS13")},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-24"; layer = 4.1; tag = "icon-plant-24"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cSk" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cSl" = (/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 2},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cSm" = (/turf/simulated/floor/plasteel{icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cSn" = (/turf/simulated/floor/plasteel{icon_state = "warningcorner"; dir = 1},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cSo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cSp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
-"cSq" = (/obj/machinery/light{dir = 4},/obj/machinery/camera{c_tag = "Departure Lounge - Starboard Fore"; dir = 8; network = list("SS13")},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/flora/kirbyplants{icon_state = "plant-14"; layer = 4.1; tag = "icon-plant-14"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
+"cSq" = (/obj/machinery/light{dir = 4},/obj/machinery/camera{c_tag = "Departure Lounge - Starboard Fore"; dir = 8; network = list("SS13")},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-14"; layer = 4.1; tag = "icon-plant-14"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cSr" = (/obj/machinery/power/apc{cell_type = 5000; dir = 2; name = "Aft Maintenance APC"; pixel_y = -24},/obj/structure/cable/yellow,/turf/simulated/floor/plating{icon_state = "warnplate"},/area/maintenance/aft{name = "Aft Maintenance"})
"cSs" = (/obj/machinery/door/poddoor/preopen{id_tag = "xeno_blastdoor"; name = "biohazard containment door"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"})
"cSt" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor/preopen{id_tag = "xeno_blastdoor"; name = "biohazard containment door"},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/medical/research{name = "Research Division"})
@@ -7900,14 +7898,14 @@
"cVV" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "chapel"},/area/chapel/main)
"cVW" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
"cVX" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
-"cVY" = (/obj/machinery/camera{c_tag = "Departure Lounge - Port Aft"; dir = 4; network = list("SS13")},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/structure/flora/kirbyplants{icon_state = "plant-04"; layer = 4.1; tag = "icon-plant-04"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
+"cVY" = (/obj/machinery/camera{c_tag = "Departure Lounge - Port Aft"; dir = 4; network = list("SS13")},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-04"; layer = 4.1; tag = "icon-plant-04"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cVZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cWa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cWb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cWc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/radio/beacon,/obj/machinery/embedded_controller/radio/airlock/docking_port_multi{id_tag = "escape_dock_north_airlock"; master_tag = "escape_dock"; pixel_y = 30; req_one_access_txt = "13"; tag_airpump = "escape_dock_north_pump"; tag_chamber_sensor = "escape_dock_north_sensor"; tag_exterior_door = "escape_dock_north_outer"; tag_interior_door = "escape_dock_north_inner"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cWd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (EAST)"; icon_state = "warningcorner"; dir = 4},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cWe" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=9.5-Escape2"; location = "9-Escape"},/mob/living/simple_animal/bot/secbot{auto_patrol = 1; health = 35; maxHealth = 35; name = "Inspector Johnson"},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
-"cWf" = (/obj/machinery/camera{c_tag = "Departure Lounge - Starboard Aft"; dir = 8; network = list("SS13")},/obj/machinery/light{dir = 4},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/structure/flora/kirbyplants{icon_state = "plant-16"; layer = 4.1; tag = "icon-plant-16"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
+"cWf" = (/obj/machinery/camera{c_tag = "Departure Lounge - Starboard Aft"; dir = 8; network = list("SS13")},/obj/machinery/light{dir = 4},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-16"; layer = 4.1; tag = "icon-plant-16"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/hallway/secondary/exit{name = "\improper Departure Lounge"})
"cWg" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -26; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cWh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/toxins/xenobiology{name = "\improper Secure Lab"})
"cWi" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -8171,7 +8169,6 @@
"dbg" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating/airless/catwalk,/area/solar/starboard)
"dbh" = (/obj/machinery/status_display,/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/escape)
"dbi" = (/obj/machinery/sleeper,/turf/simulated/shuttle/floor,/area/shuttle/escape)
-"dbj" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor,/area/shuttle/escape)
"dbk" = (/obj/machinery/optable,/turf/simulated/shuttle/floor,/area/shuttle/escape)
"dbl" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/obj/structure/cable/yellow,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "xenobio2"; name = "containment blast door"},/turf/simulated/floor/plating,/area/toxins/xenobiology{name = "\improper Secure Lab"})
"dbm" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio2"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/xenobiology{name = "\improper Secure Lab"})
@@ -8330,7 +8327,7 @@
"dej" = (/obj/structure/closet/secure_closet/psychiatrist,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/wood,/area/medical/psych)
"dek" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/carpet,/area/medical/psych)
"del" = (/obj/structure/stool/bed/chair/comfy/beige,/obj/machinery/door_control{id = "psychoffice"; name = "Privacy Shutters Control"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/carpet,/area/medical/psych)
-"dem" = (/obj/machinery/power/apc{dir = 4; name = "Psychiatrist APC"; pixel_x = 25},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/flora/kirbyplants{tag = "icon-plant-25"; icon_state = "plant-25"},/turf/simulated/floor/carpet,/area/medical/psych)
+"dem" = (/obj/machinery/power/apc{dir = 4; name = "Psychiatrist APC"; pixel_x = 25},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/item/weapon/twohanded/required/kirbyplants{tag = "icon-plant-25"; icon_state = "plant-25"},/turf/simulated/floor/carpet,/area/medical/psych)
"den" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"deo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/medical/psych)
"dep" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/carpet,/area/medical/psych)
@@ -8384,7 +8381,7 @@
"dfl" = (/obj/structure/spacepoddoor,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop)
"dfm" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 7; on = 1},/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop)
"dfn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
-"dfo" = (/obj/machinery/door_control{id = "mechpod"; name = "Mechanic's Inner Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "70"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/engine/gravitygenerator)
+"dfo" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/engine/gravitygenerator)
"dfp" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/turf/simulated/floor/plating,/area/engine/mechanic_workshop)
"dfq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/effect/landmark/start{name = "Mechanic"},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop)
"dfr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/main)
@@ -8409,6 +8406,7 @@
"dfK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop)
"dfL" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
"dfM" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/engineering)
+"dfN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/hallway/secondary/entry{name = "Arrivals"})
"dfO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6; level = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
"dfP" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
"dfQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry{name = "Arrivals"})
@@ -8521,8 +8519,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEaadaadaadaadaadaadabcaakaakaadaadaadaadaadaadaaMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdabeabfabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiabgabgabhabiabjaaiabkaakaakaaiablabmabnaboabpaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaaabqaaaabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaakaakaakaaIaakabraakaakaakabsaakaaIaakaaIabtaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabfabqabuabqabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiabvabwaakaakaakabxaakaakaakabyaakaakaakaakabzaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabeabdabfabfaaaaaaaaaabAaaaaaaaaaabfabeabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiabBabwaakabCabDaaiabEabFabEaaiabGabHaakaakaakaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaaaaaabqabqaaaaaaaaaabAabqabqaaaabqabqaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiabvaakaakaakaakabxaakaakaakabyaakaakaakaakabzaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabeabdabfabfaaaaaaaaaabAaaaaaaaaaabfabeabdabdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiabwaakaakabCabDaaiabEabFabEaaiabGabHaakaakaakaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabdaaaaaaabqabqaaaaaaaaaabAabqabqaaaabqabqaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaakaakabIaaiaadaaiaakabJabKaaiaadaaiaakaakaakaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqabLabLabLabLabLabqabMabqabLabLabLabLabLaaaabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiabNabOabPaaiaaaaaiabQabQabQaaiaaaaaiabRabSabTaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabqabUabVabVabVabVabWabXabYabZabZabZabZacaabqabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiabQabQabQaaiaaaaawacbaccacdaayaaaaaiabQabQabQaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabfabqaceaceaceaceaceabqabXabqaceaceaceaceaceabqabeabqabqabqabqabeabdabeabqabqabqaaaabqabqabqaaaabqabqabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8542,20 +8540,20 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaaaaaaaaaaaaabqaaaabqabqabAabqabqabqabqacAagmagnagoagpagqafTagradsagsagtaguagvagwacQagxadsagwacQaeaacQagyagzagAacgaaaabqabqagBagBagBagBagBaaaabqaaaaaaagCagCagDagEagFagCagCavObHcaDgbPLbPLbTgbTfaidabqaaaaaaaaaabqaaaaaaaaaaaaabqaaaaaaaaaaaaafbagGagHafHafHagIaaaabqaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabeaaaaaaaaaabqaaaaaaaaaadFaaaaaaaaaabqaaaaaaaaaabdaaaaaaafhafJagJagJagJagJagJagJaehagKaehagJagJagJagJagJagJafJafkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqabqaaaabqaaaabqagLagMagLabqaaaaaaacAagNagOagPacAagQafTagRagSacQafyacQagTafyacQagRagUafyacQaeBacQafyagVagRacgabqabqagBagBagWagXagYagBagBabqabqagCagCagZahaahbahcahdagCagCbTjaytbTlbTkdeGdeCaidabqabqabqafbafcafbafcafcafcafbafcafcafcafbafbahgafbahhahiahiahjahiahiahkaaaabqaaaaaaaaaaaaaaaaaaaaaaaaabfaaaadjadjadjadjadjabqahlabqadjadjadjadjadjabqabfaaaaaaahmahnahoahpahqahraehaglaeFaglaeFaglaehahsahtahuahvahnahwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaabqabqabqagLahxagLabqabqaaaacAacAacAacAacAahyahzahAahBahCahDahEahFahGahHahIahJahKahLahMahNahOahPahQahRabqagBagBahSahTahUahUahVagBagBabqagCahWahXahYahZaiaaibaicagCdeIdePalSalSalSalSaidaaaaaaabqafbaigafbaihaiiaijafbaikailaimafbainaioajbaiqairairairairairaiqabqabqabqabqabqaaaaaaaaaaaaaaaabfabqadCadDadDadDadDadEadFadGadHadHadHadHadIabqabfaaaaaaafKahnaeGaeGaeGaisaehaeGaeGaeGaeGaeGaehaeGaeGaitaeGahnafNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqabqagLagLaiuagLagLabqabqabqabqabqabqacnaivaiwaixaiyaizaiAaiBaiwaiCaiDaiEaiFaiGaiHaiwaiIaiJaiKaiLaiMabqagBaiNaiOaiPaiQaiRaiSaiTagBabqaiUaiVaiWaiXaiYaiZajaakcajcdeLdeKajdajeajfahfdeMajgajgajgafbajhajiajjajkajkajlajkajmajnajoajpajpajpaiqairairairairairaiqaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabfabqaegaegaegaegaegabqadFabqaegaegaegaegaegabqabeabqaaaaehajqajrajsajtajuaehajvaeGaeGaeGajwaehajxajyajzajAajqaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqabqabqagLagLaiuagLagLabqabqabqabqabqabqacnaivaiwaixaiyaizaiAaiBaiwaiCaiDaiEaiFaiGaiHaiwaiIaiJaiKaiLaiMabqagBaiNaiOaiPaiQaiRaiSaiTagBabqaiUaiVaiWaiXaiYaiZajaakcajcdeLdeKajdajeajfahfdeMajgajgajgafbajhajiajjajkajkajlajkajmajnajoajpajpajpaiqairairairairairaiqaaaaaaaaaaaaabqaaaaaaaaaaaaaaaabfabqaegaegaegaegaegabqadFabqaegaegaegaegaegabqabeabqaaaaehajqajrajsajtajuaehajvaeGaeGaeGajwaehajxaeGajzajAajqaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabqaaaaaaaaaaaaaaaabqajBajCajDajEajBaaaabqaaaaaaaaaabqacgacgajFajGajHacgajIajJajIacQacQacQacQajKajLajMajNajOajPajQacgabqagBajRaiOajSajTajUaiSajVagBabqajWajXajYajZakaakbajYanJajWdeLdeNajdakdajfaheajgajgakeakfafbafbafbakgakhakiakiakjakkaklakmakmaknakoaiqairairairairairakpafbafbafbaaaabqaaaaaaaaaaaaaaaabeaaaaaaaaaabqaaaaaaaaaadFaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaehakqakqaeFaeFaeFaehakraeGaeGaeGaksaehaeFaeFaeFakqakqaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaktaktakuakuakuakuakuajBakvakwakxajBakyakzakyakyaaaabqaaaacgacgaiMacgacgacgaiMacgacgakAakBakCakDakEakFakGakHakHakHagBagBagBakIakJakKakLakMakNakOagBabqagCakPakQakRakSakTakUakVagCdeOdeNajdakdajfaheakWajgakXakYakZalaafbalbakhakialcaldaldaldaleakmalfalgalhairairairairairalialjalkafcaaaabqabqabqabqabqabqabfabqabqabqabqabqaaaaaaadFaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaflallallafgaaaaaaaehalmaeGaeGaeGalnaehaaaaaaaflallallafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaloalpakualqalralsaltajBalualvalwajBalxalyalzakyakyabqaaaaaaaaaabqaaaaaaaaaabqabqalAalBalCalBalDalEalFalGakHalHalIalJagBagBagBalKalLagBagBagBagBagBalMagCagCalNalOalPalQalRagCagCdeQdePalTalUalVaheajgajgalWalWalXalYafbalZakhamaambamcamcamdameamfamgamhafcairairairairairafcamiamjafcaaaabqaaaabqaaaamkamkamkamkamkamkamkabqabqabqadFabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehamlaeGaeGaeGalnaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaktammaktamnamoampamqajBajBamramsajBamtamuamvamwakyabqabqabqabqabqabqabqabqamxamxamxakDakDakDakDamyamzamAakHamBamCamDagBamEamFamGamHamIamJamKamLagBamMamNamOamPamQamRamSamTamOamUdeRdePamWamXamYaheamZalWalWanaanLajgafbanbancandaneanfanfangameamjanhamhafcairairairairairafcanianjafcabqabqabqabqabqamkankanlanmannankamkabqaaaanoanpanoasTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehantanuaglantanuaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaakuanvanwanxanyanzanAanBanCanDanEakyanFanGanHanIakzabqaaaaaaabqaaaajgajgajgamxaotaovaouanKaphanManNanOanPakHanQamCanRagBanSanTanUanVanWanXanYanZaoaaobaocaodaoeaofaogaohaoiaojaokdeUdeTaonaooaopaheaoqaoraosapiapQajgapRaowakhaoxambaoyamcaozameaoAamgaoBaoCairairairairairaoDaoEaoFaoGaoHaoGaaaabqaaaamkaoIaoJankaoJaoKamkabqaaaaoLaoMaoLansaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehaoOaoPaeGaoQaoRaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaakuanvanwanxanyanzanAanBanCanDanEakyanFanGanHanIakzabqaaaaaaabqaaaajgajgajgamxabBajyaouanKaphanManNanOanPakHanQamCanRagBanSanTanUanVanWanXanYanZaoaaobaocaodaoeaofaogaohaoiaojaokdeUdeTaonaooaopaheaoqaoraosapiapQajgapRaowakhaoxambaoyamcaozameaoAamgaoBaoCairairairairairaoDaoEaoFaoGaoHaoGaaaabqaaaamkaoIaoJankaoJaoKamkabqaaaaoLaoMaoLansaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehaoOaoPaeGaoQaoRaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaktaoSaktaoTaoUaoVaoWaktaoXaoYaoZapaapbapcapdapeakyabqapfapfakzapfapfapgapgamxapSaqGaqFaqHapjapkaplapmapnapoappapqappaprapsapsaptapuapvapwapxapxapyapzapAapBapCapDapEapFapGapHapIdeYdeXapLapMapNaheapOapPalWarMarOajgaipaowakhajpapTapUapVapWapXapYamgapZaqaairairairairairaqbafbaqcaoGaqdaqeaefaefabqamkaqfaqgaqhaqiaqjamkabqanoaoLaqkaoLasTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehaqmaqnaeGaqoaqpaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaktaqqaqraqraqraqsaqtaktaquaqvaqwakyaqxaqyaqzaqAakyapfapfaqBaqCanEapfaqDaqEamxamxamxarParSarQaqIaqJaqKaqLakHaqMaqNaqOagBaqPaqQaqRaqSaqTaqUaqVaqWakHaqXaqYaqZapCaraarbarcardarearfargalSalSarhaheaheajgariajgarjajgajgafbarkarlajpajparmarnaroarparparqapZaqaairairairairairaqbarrarsaoGaqeaoGaoGaoHaoGamkartaruankarvarwamkabqaoLaoLaoMaoLasTaoGaoGaoGafdacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaflaeFarxaryarzaeFafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarBaaaaaaarAaaaarAaaaaaaabqabqabqaaaaaaaaaaaaaaaabqaaaabqaaaabqaaaaktarCarDarEarFarGarHaktanHaqvapdapfarIapdapdapdarJapfarKarUarTarNapfatAarWauHarRaumazcaCTarVaCVarXarYarZagBamIasaamIagBagBasbascasbagBasdaseasfasgashaqYasiasjapCaslasmasnasoarfaspasqasrassastasuastasvaswasxasyaszaszasAasBasCasCasDasEasFasGasGasGasHaqaairairairairairaqbasIasJaoGarsasKasLasMasNamkasOasPasQasRasSamkabqasTasUasVasWaxhauodgCblyavNavNblzaaaaaaaaaaaaaaaaaaaaaaaaaaaaflaeFaeFaeFafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAabqabqarAarAarAabqaaaarAarAataarAarAaaaabqapfapfakzapfabqaaaabqabqabqabqabqapfakzaktaktatbatcatdaktaktaktapdateaoZatfapbatgathapdatiapfaoXaElaEjapfapfatlatmatnatoamxamxamxakDakDatpatqatratsattatuatvatwatxatyaqUatzagBaqUanYaFCakHatBdfnatCatDatEatFatGatHatIarfatJatKatKamOamOamOamOatLafbafcatMafcafbatNatOatPatQatRatSatTatUatVatWatXatYatZatZatZatZatZauaaubayuaoGasJasJasJasJaudamkaueaufaugauhdfoamkabqasTaujaukaulaxhdgCdgCbnGblAblCblBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaupabqarAabqaupabqarAarAabqarAarAarAarAarAaaaaaaaaaapfauqaurapfausautautautautautauuapfarKauvapfauwauxaoXauyauzapfauAauBauCapfarIatjauDauEauFapfauGaNEaFEapfauIatmakeauJauKajgauLamxauMauNaqJatqapnauOauPauQauRauSauTauUauVauWauXaqUauYauZakHdfsdfravcavdaveavfavgavhavgaviavjavkavlavlavmavnamOatLafbavoavpavqavravravravravravsavtavuavvavvavvavvavvavwaoGavxavyavzaoGaoGasJaoGavAavBavCasJavDavEavFavGavHavIavJamkaoHasTavKavLavMaxhdgCdgCbnFavNavNbnHaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAabqarAabqarAarAarAataabqabqabqarAarAabqaaaabqabqakzavQavRavSavTavUavUavUavUavUavVavWavXavYavZawaawbavUawcavUawdaweawfajgajgajgajgajgajgajgajgajgajgawgajgawhajgajgajgajgajgajgamxawiawjaqJatqatratsawkawlawmawnawoawpawqawraqTawsawtawuasgawvdfvdfwawyawzawAawBawCawDawEawFatKawGawHawGawIamOawJawKawLawMavqavrawNawOawPawQawRawSawTavvawUawVawWavvaoGaoGasJaubavBasIaoGayvaoGavzasJawXasJaoGawYawZamkamkaxaaxbamkayxasTasTaxdaxeaxhaxhbnIaxhbnJbplaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAarAarAarAabqarAarAabqauparAarAabqabqabqabqapfapfaxiapfapfaxjaxkaxkaxkaxkaxkaxlapfapfapfapfaxmaxnaxoaxoaxoaxoaxpaxqajgaxraxsaxtaxuaxvaxwaxxaxyaxzaxAaxBaxCajgaxDaxEaxEaxEaxFamzaxGaxHaqJaxIaxJaxKaqTaxLagBagBaxMaxNaxOasgagBaxPaxMakHakHamOaxQaxRaxSaxQamOaxTaxUamOaxVatKatKaxWaxWaxWamOamOaxXafbdeeaxZdefavrayaaybayaawQaycaydayeayfaygayhayiavvayjaoGaykaylaymaynaoGasMaoGaoGaoGayoaoGaoGaypayqayramkamkamkamkazrasIazGazFbTiaxhdfCdgCdfEaxhaxhaxhabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqarAarAarAarAarAarAarAarAarAarAarAayyarAabqaupapfapfapfayzayAapfabqabqabqabqabqabqabqabqabqabqabqapfaqBayBapdaoXayCaoXayDayEayFayGayHayIajgajgajgayJayKayKayKayLajgajgayMayNayOayPayMamzamzakDayQayRapnaySaySayTayUaySayVaySayUaySayWaySayVayXayYayZayUazaazbaySaySaySayUaySaOPamxazdazeazeazeazeakDatLafbaxYavoavqavrazfazgazhavraziazjazkazlazmavvavvavvaznaoGasIazoawXasJaoGayvaoGazpaoGazqdfFazsbpmbppbpobqVbpqbqXbqWbqWbqWbqWdeSdgCdeVdgCdgCdgCaxgazHaxgaefaefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAabqabqarAarAarAabqaaaarAarAataarAarAaaaabqapfapfakzapfabqaaaabqabqabqabqabqapfakzaktaktatbatcatdaktaktaktapdateaoZatfapbatgathapdatiapfaoXaElaEjapfapfatlatmatnatoamxamxamxakDakDatpatqatratsattatuatvatwatxatyaqUatzagBaqUanYaFCakHatBdfnatCatDatEatFatGatHatIarfatJatKatKamOamOamOamOatLafbafcatMafcafbatNatOatPatQatRatSatTatUatVatWatXatYatZatZatZatZatZauaaubayuaoGasJasJasJasJaudamkaueaufaugauhavFamkabqasTaujaukaulaxhdgCdgCbnGblAblCblBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaupabqarAabqaupabqarAarAabqarAarAarAarAarAaaaaaaaaaapfauqaurapfausautautautautautauuapfarKauvapfauwauxaoXauyauzapfauAauBauCapfarIatjauDauEauFapfauGaNEaFEapfauIatmakeauJauKajgauLamxauMauNaqJatqapnauOauPauQauRauSauTauUauVauWauXaqUauYauZakHdfsdfravcavdaveavfavgavhavgaviavjavkavlavlavmavnamOatLafbavoavpavqavravravravravravsavtavuavvavvavvavvavvavwaoGavxavyavzaoGaoGasJaoGavAavBavCasJavDavEavHavGawZavIavJamkaoHasTavKavLavMaxhdgCdgCbnFavNavNbnHaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAabqarAabqarAarAarAataabqabqabqarAarAabqaaaabqabqakzavQavRavSavTavUavUavUavUavUavVavWavXavYavZawaawbavUawcavUawdaweawfajgajgajgajgajgajgajgajgajgajgawgajgawhajgajgajgajgajgajgamxawiawjaqJatqatratsawkawlawmawnawoawpawqawraqTawsawtawuasgawvdfvdfwawyawzawAawBawCawDawEawFatKawGawHawGawIamOawJawKawLawMavqavrawNawOawPawQawRawSawTavvawUawVawWavvaoGaoGasJaubavBasIaoGayvaoGavzasJawXasJaoGawYayqamkamkaxaaxbamkayxasTasTaxdaxeaxhaxhbnIaxhbnJbplaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAarAarAarAabqarAarAabqauparAarAabqabqabqabqapfapfaxiapfapfaxjaxkaxkaxkaxkaxkaxlapfapfapfapfaxmaxnaxoaxoaxoaxoaxpaxqajgaxraxsaxtaxuaxvaxwaxxaxyaxzaxAaxBaxCajgaxDaxEaxEaxEaxFamzaxGaxHaqJaxIaxJaxKaqTaxLagBagBaxMaxNaxOasgagBaxPaxMakHakHamOaxQaxRaxSaxQamOaxTaxUamOaxVatKatKaxWaxWaxWamOamOaxXafbdeeaxZdefavrayaaybayaawQaycaydayeayfaygayhayiavvayjaoGaykaylaymaynaoGasMaoGaoGaoGayoaoGaoGaypbppayramkamkamkamkazrasIazGazFbTiaxhdfCdgCdfEaxhaxhaxhabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqarAarAarAarAarAarAarAarAarAarAarAayyarAabqaupapfapfapfayzayAapfabqabqabqabqabqabqabqabqabqabqabqapfaqBayBapdaoXayCaoXayDayEayFayGayHayIajgajgajgayJayKayKayKayLajgajgayMayNayOayPayMamzamzakDayQayRapnaySaySayTayUaySayVaySayUaySayWaySayVayXayYayZayUazaazbaySaySaySayUaySaOPamxazdazeazeazeazeakDatLafbaxYavoavqavrazfazgazhavraziazjazkazlazmavvavvavvaznaoGasIazoawXasJaoGayvaoGazpaoGazqdfFazsbpmdfobpobqVbpqbqXbqWbqWbqWbqWdeSdgCdeVdgCdgCdgCaxgazHaxgaefaefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupabqarAataarAarAarAarAazIabqarAarAarAarAarAarAazJazKazJazLazMapfapfabqaaaaaaaaaaaaaaaaaaaaaaaaabqapfapfapfathaoXapdaoXazNazOazPazQazRazSajgaaaabqaaaaaaaaaaaaaaaabqaaaazTazUazVazWazXazYazeazZaAaaAbaAcaAdaAdaAeaAcaAdaAfaAgaAcaAhaAiaAdaAjaAkaAlaAdaAmaAnaAoaApaApaAqaAraAsaAtaAuaAvaAwaAxaAyaAzakDatLafbaxYaAAavqavraABaACaADaAEaAFaAGaAHavvaAIaAJaAKavvaALaoGaoGaoGayoaoGaoGasJaoGaucaoGaAMaxhaxhawYaANamkaxhaxhaxhaxhaxhaxhaxhaxhaxhayxaxhaxhaxhaxhaxhaAOaxhabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAarAarAarAarAarAarAarAarAarAabqarAarAarAabqapfapfapfaAPazSapdapfaaaaAQaARaASaARaATabqabqabqabqapfaAUapfaAVavUavUavUaAWaAXapfaAYaAZaBaajgaaaaBbaBbaBbaBbaBbaBbaBbaaaayMaBcaBdaBeayMamzamzakDaBfaBgaBhaBiaBjaBkaBhaBlaBjaBgaBmaBnaBoaBpaBqaBraBsaBtaBuaBvaBwaBxaByaBwaBzaBAaBBaBCaBDaBEaBFaBGaBHakDatLaBIaBIaBIaBIavraBJaPWaBLaBMaBNaBOayeaBPaBQaBRaBSavvaBTaBUaBVaBWaBXaBWaBYaBWaBZaBWdgEaCaaCbaCcaCdaCeaCfaCgaChaCgaCiaCjaCkaCjaClaxhaxhaxhaCiaCjaClaCmaCmaCgabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqarAarAarAarAarAarAarAaCnarAabqabqabqabqapfaoXazSarIakzaaaaCoaCpaCqaCpaCoaCraCraCraCsaCsaCsaCsaCtaCsaCsaCuaCuaCuaCuaCvaCuaCwajgabqaBbaCxaCyaCzaCAaCBaBbaaaayMaCCaCCaCDayMaaaaaaaCEaCFaCGaCHakDaCFaCIaCHakDaCFaCJaCHakDaCKamzaCLakDamzaCMaCNamzamzaCOaCOaCPaCQaCRaCOaCOaCSakDakDakDakDakDatLaBIaQdaCUaQvavravravravravraCWaCXaCYazlazmavvavvavvaoGaCZasIarrasJasIaDadgIaxhaxhaxhaxhaxhaDbaDcaDdaDeaDfdfMaDfaDhaDiaDjaDiaDkaCjaDlaCjaDmaDiaDjaDiaCmaDnaDoabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8586,11 +8584,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablOblPblQblRbkbblSblTblSblTblSblTblSbkbblUblVbccbgVblWbgXblXblYblZbmabmbbmcbgXbmdbmebmfbmgbmhbmibmjbmkbmlbmmbmnbmobmpbmqbmrbmsbmtbmubmvbmwbmxbmybmzbmAbiVbfIbmSbhqbmQbmCbmDbmEbhqbmFbmGbjeabqabqbmHboBbopbpVboHbqfbqdbqhbqgbqkbqjbqlbmTabqabqbhwbmUbmVbmWbmXbmYbmZbnabhwbhybnbbncbndbnebnfbnebngbnhbnibnebnebnebnjbnebnkbnlbnmbnnbnebnebnobnkbngbnjbnpbnqbnobnrbnsbntbnubnvbnwbnxbnybnzbnAbnBbnCbnDdfpdfmdftdfqdfxdfudfydeZaoNdflabqaaaaaaaaaaefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqaefblDblEbnKblEbnLaXOaaaaaaaaaaXLbnMbnNbdJbnObnPbnQbnRbnSbnTbdIbrQaXLaXLaXLaXLbnUaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiqbkbbkbbipbkbblSblTblSbnVblSblTblSbkbblUblVbccbnWbnXbnYbnZboabobbocbobbiubiubodboebhcbfwbofbogbohboibojbokbolbfwbombonbojbkCboobfwbrXboqborbosbotbiUbkIbfIbkJbhqboubovbowboxbhqboybozbjebkWboAbkWbsbboCboDboEboDboFboDboEboDboGbscbkWboAbkWbhwboIboIboIboJboKboLboMbhwboNboOboPboQboRboSboRboTboRboUboRboRboRboVboRboWboXboYboZboRboRbpabpbbpcboVbpdboVbpebpfbpgbntbphbpibpibpjbpkbpibpidfzdfBdfAdfGdfDdfIdfHdfKdfJdgddfLdgKazDabqaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbpraaaaaaaaaabqbjRbjRbjObpsaXIaXOaaaaaaaaaaXLaXLblHbdIbdIbdIbptbdIbdIbdIbdIbsebsdbsfaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablObpwbpxblRbkbblSblTblSblTblSblTblSbkbblUblVbccbpybpzbpAbpBbpCbpDbpDbpEbpFbpBbpGbpHbpIbfwbpJbpKbpLbpMbpNbpObpPbfwbpQbpRbpSbpTbpUbfwbsibpWbpXbpYbpZbfGbqabjnbqbbqcbqcbqcbqcbqcbhtbtPbqebhtbkWbtSbtRbtTboEboEboEboEbqiboEboEboEboEbtZbtYbubbkWbqmbqnbqobqpbqqbqrbqrbqsbhwbqtbqubqvbqwbqxbqybqxbqzbqxbqAbqxbqxbqBbqxbqxbqCbqDbqxbqEbqBbqFbqGbqCbqHbqxbqIbqJbqKbqLbqMbqNbqObqPbqQbqRbpnbqSbqSbqTdgMdgLdgOdgNdgPanqanqanqanqanqanqanqanqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaabqYbqZbrabrbbrcbrdbrebrfaXIaXLaXLaXLaXLaXLbrgbrhbrgbrgbribrjbribrkbrkbrlbrmbrnbudaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobiobjZbrpbkbbrqbkbbrrbrsbkbbrtbkbbkibrubccbgVbrvbrwbrxbrybrzbrAbrBbrCbrxbrDbrEbrFbfwbrGbhabrHbrIbfwbfwbfwbfwbfwbhabrJbrKbfwbfwbiUbrLbrMbiUbiUbzObehbfIbrObqcbrPbumbrRbqcbrSbrTbrUbrVbrWburbrYbrZbsabsabvWbwfbwebvWbvWbsabsabsgbshbwgbkWbhwboIboIboIbsjboIboIboIbhwbskbfIbslbZibsnbsobsnbsmbspbspbspbspbspbspaoGaoGbsqaoGaoGaoGbsrbThaoGaoGaoGbstaoGbsubsvbswbsxbsybszbsAbsBbqSbsCbsCbsDbqUbsEbjNbntbsFbsGbsHbsIbsJbsJbsKbsLabqaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaabqYbsMbsNaaaabqbsObsPbsQbsRbsSbsTbrgbsUbsVbsWbsXbsYbsZbrgbtabtbbtcbtdbtebtfbtfbtgaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobiobjZbrpbkbbrqbkbbrrbrsbkbbrtbkbbkibrubccbgVbrvbrwbrxbrybrzbrAbrBbrCbrxbrDbrEbrFbfwbrGbhabrHbrIbfwbfwbfwbfwbfwbhabrJbrKbfwbfwbiUbrLbrMbiUbiUbzObehbfIbrObqcbrPbumbrRbqcbrSbrTbrUbrVbrWburbrYbrZbsabsabvWbwfbwebvWbvWbsabsabsgbshbwgbkWbhwboIboIboIbsjboIboIboIbhwbskbfIbslbZibsnbsobsnbsmbspbspbspbspbspbspaoGaoGbsqaoGaoGaoGbsrbCiaoGaoGaoGbstaoGbsubsvbswbsxbsybszbsAbsBbqSbsCbsCbsDbqUbsEbjNbntbsFbsGbsHbsIbsJbsJbsKbsLabqaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaabqYbsMbsNaaaabqbsObsPbsQbsRbsSbsTbrgbsUbsVbsWbsXbsYbsZbrgbtabtbbtcbtdbtebtfbtfbtgaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobthbiobiqbiobiobiqbiobipbtibtjaWDbtkbtlbtmbfGbtnbtobtpbtobtqbfGbtrbtsbttbtubtvbtwbtxbtybtzbtwbtAbtBbtwbtvbtvbtCbtvbtDbtEbtFbtGbtHbtvbtIbtJbtKbkJbtLbtMbtNbtObqcbjebjebjebjebkWbwmbtQboEboEboEbtUboEbtVbtWbtXboEboEbwnbuabAkbucbhwbwobuebufbugbuhboIbuibhwbujbfIbukbuldedbunbuobsmbupbuqbwpbusbutbuubuvbuwbuxaoGbuybuzbuAbuBbuCaoGaxcbuDaoGbuEbuFbuGbnEbuHbuHbuHbuIbuJbqSbqSbuKbuLbuMbuNbuObuPbuQbuRbuSbuTbuTbuUbuVbuWbuWbuWbuXdgQbuWbuWbuWbuWbuWbuXbuWbuWbuWbuWbuWbuWbuXbuWbuYbuZbuTbuTbuTbvabvbbvcbvdbvdbvebvfbvgbvhbvibvjbvkbvlbvmbvnbvobvpbvqbvrbvsbvtbvubvvbbXbbXbvwaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqaaabccbdRbccbccbccbccbccbccbdRbccaaaaWDbvxbvybvzbfGbvAbvBbvCbvBbvDbfGbvEbvFbvGbvHbvHbvIbvJbvHbvHbvKbvLbvMbvNbvHbvHbvObvHbvHbvHbvPbvQbvRbvRbvSbvTbvUbvVbqcbyobvXbvYbqcbvZbwabwbbwcbwdboEbtQboEbypbywbwhbwibwjbwibwkbyJbyxbAbbyQbAkbwqbhwbwrbwsbwtbwubwvbhwbhwbhwbhybwwbwxbsmbwybwzbwAbsmbwBbwCbwDbwEbwFbwGbwHbwIbwJbwKbwLbwMbwNbwObwPbwQbwRbwSaoGbsubwTbwUbntbwVbwWbwXbwYbwZbxabxbbxcbxdbqUbxebxfbxgbxhbxiaWCaaaaaabxjbsNabqaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaabxkbxlbsLaaaabqaZhbxmbxnbxobxpbxqbxrbxsbxtbxubxvbxwbxxbxybxzbxAbxBbxCbxDbtfbxEbxFaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqbccabqaaaabqaaabccbxGbccbxHbxIbfebxJbccbxGbccbccaWDbgVbxKbxLbfGbxMbvBbxNbvBbxObfGbxPbxQbxRbxSbxTbxUbxVbxWbxXbxYbxZbyabxTbxTbxTbybbxTbycbydbxVbyebxTbxTbyfbygbyhbvVbqcbyibyjbykbylbymbynbymbymbwdbAjbAebyqbyqbyqbyrbysbytbyubyvbyqbyqbyqbBWbCcbkWbhwbyybyzbyAbyBbyCbhwbyDbyEbyFbyGbwxbsnbyHbyIbCdbsmbyKbyLbyMbyNbspbspaoGaoGbyOaoGaoGaoGbyPbCeaoGaoGbyRbySaoGbyTbwTbyUbntbjNbjNbjNbjNbyVbjNbjNbyWbyXbyYbntbntbyZbzabzbbzcaaabqYbzdaaaabqaaaaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaabxkbxlbsLabqbzebzfbzgbzhbzibzjbrgbzkbzlbzmbznbzobzpbrgbzqbzrbzsbrkbztbzubtfbtgaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabccbccbdQbccaWDbccbdRbccbzvbaBbzwbzxbccbdRbccbzybzzbzAbtlbtmbfGbzBbzCbtpbzCbzBbfGbzDbzEbzFbfGbzGbzHbzIbfGapfbzJapfbzKbzKbzLbzMbzNbzLbzKbzKbzKbzKbzKbzKdeDbzPbzQbzRbzSbzTbzUbzVbzWbzVbzXbzYbzZbAabCfbAcbAdbCibAdbAdbAfbAgbAhbyqbyqbAibyqbCkbAkbhwbAlbAmbAnbAobApbAqbhwbArbhtbAsbbrbAtbsmbsmbsmbsmbsmbAubAvbspbspbspbAwbAxbspbAybAzbAAaoGazpbABaoGbACbADbAEbAFbAGbAHbAIbAJbAKbALbAMbAKbANbAObjNbAPbAQbARbASbATbAUbAVbAWbAXbsJbAYbAZabqabqabqabqabqaaaabqaaaabqaaaabqaaaabqaaaaaaaaaaaaaaaaaaabqbpraaabxkbBabrbbBbbBcbrebpsaXIaXLbBdbBebBfbBgbBhbBibrgbrgbBjbBkbBlbrkbrkbBmbBnbBoaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabccbccbdQbccaWDbccbdRbccbzvbaBbzwbzxbccbdRbccbzybzzbzAbtlbtmbfGbzBbzCbtpbzCbzBbfGbzDbzEbzFbfGbzGbzHbzIbfGapfbzJapfbzKbzKbzLbzMbzNbzLbzKbzKbzKbzKbzKbzKdeDbzPbzQbzRbzSbzTbzUbzVbzWbzVbzXbzYbzZbAabCfbAcbAdbThbAdbAdbAfbAgbAhbyqbyqbAibyqbCkbAkbhwbAlbAmbAnbAobApbAqbhwbArbhtbAsbbrbAtbsmbsmbsmbsmbsmbAubAvbspbspbspbAwbAxbspbAybAzbAAaoGazpbABaoGbACbADbAEbAFbAGbAHbAIbAJbAKbALbAMbAKbANbAObjNbAPbAQbARbASbATbAUbAVbAWbAXbsJbAYbAZabqabqabqabqabqaaaabqaaaabqaaaabqaaaabqaaaaaaaaaaaaaaaaaaabqbpraaabxkbBabrbbBbbBcbrebpsaXIaXLbBdbBebBfbBgbBhbBibrgbrgbBjbBkbBlbrkbrkbBmbBnbBoaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabccbBpbaBbaCbBqbBrbaBbaBbBsbBtbchbBubBvbBvbBvbBwbBxbBybBzbBAbBBbBCbBDbBEbBFbBGbBBbBHbBIbBJbBKbBKbBLbBKbBKarKbBMbBNbzKbBObBPbBQbBRbBSbzKbBTbBUbzKbBTbBUbzKbzPbfIbkJbqcbBVbClbBXbqcbBYbBZbCabCbbwdbAkbDrbyqboEbDVbCgboEboEbAkbChbDWbCjbyqbEfbEgbhwbCmbCnbCobCpbCqbCrbCsbCtbhtbhybbrbhzbspbCubCvbCwbCxbCybCzbCAbspbCBbCCbCDbCEbCFbCGbCHaoGaoGaoGaoGaoGaoGbCIaoGbCJbCKbCLbCMbCNbCNbCNbCNbCNbCMbCMbCNbCObCPbCQbCRbCSbCTbCUbCVbCMbCMbCMabqaaaaaaaaaabqaaaabqaaaabqaaaabeaaaabeaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqarBbicaXIaXObCWaXLbCXbCYbCZbDabDbbDcbDdbDebDfbDgbDhbDibbXbbXbDjaXLaXLbnUaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabccbcdbcebcebDkbcebDlbDmbDnbDnbDobDnbDpbDqbEJbDsbDtbDubDvbDwbpBbDxbDybDzbDAbDBbDCbDDbDEbDFbDGbDHbDIbDJbBKbDKbDLanHbzKbDMbDNbBQbBRbBSbzKbDObDPbzKbDObDPbzKbDQbfIbkJbqcbqcbDRbqcbqcbqcbDSbDTbDUbqcbFJbtQbDXboEbwibwibDYbDZbEabEbbEcbEdbEebshbFUbEhbEibEjbEkbElbEmbEnbhwbEobhtbEpbbrbhzbspbEqbErbCybEsbCybEtbCybEubEvbCHbEwbExbEybEzbEAbEBbECbEDbEEbEFbEGbEHaoGbEIbwTbHCbCMbEKbELbEMbENbEObCMbEPbEQbERbESbETbEUbEVbEWbEXbEYbEZbFabCMabqabqabqabqabqabqabqaaaabeaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhbFdaXOaaaaXLbFebFfbFgbDabFhbFibFjbFkbFlbFmbFnbDaaXLaaaaaaaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqbccbccaWDbccbdQbccaWDbccbccbccaWDbccaWDaWDaWDbnWbnXapfbFoapfapfbFpbFqbFpbFrbFpbFpbFpbFpbBKbBKbFsbFtbBKbBKbBKbFuaoXbzKbFvbFwbBQbFxbzKbzKbFybzKbzKbFzbzKbzKbFAbfIbkJbFBbFCbFDbFEbFFbFGbFDbFDbFHbFIbAkbHDbAdbFKbFLbFMbFNbFObFPbFQbFRbFSbyqbFTbAkbhwbFVbFWbFXbFYbFZbGabhwbGbbhtbhybbrbhzbspbGcbGdbGebGdbGfbGgbGhbGibEvbCHbGjbGkbCHbEvbGlbGmbGnbGobGpbGqbEGbySaoGbGrbGsbGtbGubGvbGwbGxbGybGzbCMbGAbGBbGCbGDbETbGEbGFbGGbGHbGIbGJbGKbCMabqbGLbGLbGLbGLbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhbFdaXOaaaaXLbGMbGNbGObDabGPbGQbGRbGSbGTbGUbGVbDaaXLaaaaaaaUUbjPaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8602,7 +8600,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqbccbccaWDbccbdQbccaWDbccbccbccaWDbccaWDaWDaWDdfRbPMbPNbPObPPbPQbFpbPRbPSbOibPTbPUbPVbFpbBKbBKbBKbBKbBKbBKbBKbFuanHbzKbPWbPXbJabBRbFwbFwbPYbFwbPZbQabzKbQbbzPbfIbQcbMSbQdbQebQfbQgbQhbOBbQibQjbQkbQlbQmbQnbQobQobQobQpbQqbQrbQsbQtbQsbQubQvbQwbQxbQybQzbQAbQBbQCbQDbNhbQEbhtbQFbQGbQHbQIbQIbQIbQJbQKbQLbQMbQNbQIbQObQIbQPbQQbQRbQSbQTbEGbEGbQUbEGbEGbEGbNFbQVbQWbQXbQVbCMbCMbCMbCMbCMbQYbNObVpbRabRbbGGbRcbRdbRebRfbInbRgbRhbRibETabqbETbRjbRkbRlbGLabqaaabFcaaabFbaaabRmarBarBarBarBabearBarBarBaaaaaaaaaabqabearBarBarBarBarBaZhaXIaXOaaaaXMbRnbRobRpbOabRqbOabRrbRsbRtaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabccbRubzzbaCbRvbaCbaBbaBbRwbaBbzzbaBbRxbzzbaBdfSbRyapfbRzaoXatkbFpbRAbRBbHfbHfbHfbRCbFpbRDbREbRFbRGbRHbRIapfbFuauCbzKbRJbRKbJabRLbRMbRMbRNbFwbFwbRObzKbRPbzPbfIbOvbMSbRQbRRbRSbRTbRUbOBbRVbRWbRXbRYbMWbRZbSabSbbSabScbNdbSdbSebSfbSebSgbNhbShbSibSjbSkbSlbSmbSnbSobNhbSpbhtbSqbbrbOWbQIbVrbVsbStbSubSvbSwbSwbSxbSybQIbQIbQIbQIbQIbQIbQIbEGbSzbSAbSBbEGbSCbQVbSDbSEbSFbQVbSGbSHasMbSIbCMbSJbSKbSLbSMbSNbSObSPbSQbSRbSSbRgbSTbSUbMibMjbMkbSVbPEbSWbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcbicbSXbbXbbXbSYbpvbSZbTabOabTbbOabTcbTdbKjbSYbbXbbXbTeaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabccbcdbcebcebcebcedfUdfTdfWdfVdfYdfXdgadfZdgcdgbbTmapfbgYauyatkbFpbHhbTnbHfbHfbTnbTobFpbTparJarLbTqbPQbRHapfbFubTrbzKbTsbTtbTubTvbFwbTwbTxbTybTzbTAbzKbTBbzPbfIbTCbMSbTDbTEbTFbTGbOBbOBbTHbTIbTJbTKbMWbRZbSabSabSabTLbNdbSdbSebTMbTNbTObNhbTPbSibTQbTRbNhbTSbTTbTUbNhbTVbhtbTWbbrbTXbTYbUabUabUbbUcbUdbStbStbUebUfbQIbUgbUhbUibUhbUjbQIbUkbUlbUmbUnbEGbNFbQVbUobUpbUqbQVavBasJasJbUrbCMbSJbUsbUtbCNbCNbCNbUubGGbUvbGGbRgbUwbRibETabqbGLbGLbGLbGLbGLabqaaaabeaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhaXIaXOaaaaaaaXMbUxbOabOabOabUybUzbUAaXMaaaaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqbccbccbUBbUBbccbccdgeaWDdggdgRdggaWDaWDapfbUCapfapfapfbgYauCatkbFpbTobUDbUEbHfbUEbUFbFpbUGathapdatjbUHbXJapfbFuaoXbzKbzKbzLbUIbUJbzLbzKbzKbzKbzKbUKbzKbzKbULbjnbUMbMSbUNbUObUPbUQbURbOBbUSbUTbUUbUVbMWbUWbUXbUYbUZbVabNdbVbbSebVcbVdbVebNhbVfbSibVgbVhbVibVjbVkbVlbNhbVmbhtbVnbbrbOWbVobVtbVqbXcbYtbYsbVubVqbUebVvbQIbVwbVxbVybVzbUjbQIbVAbVBbVCbVDbVEbVFbQVbVGbVHbVIbQVbVJbVKbVLbVMbCMbVNbVObRabVPbCNbVQbSRbGGbSPbVRbVSbVTbPCbItbIubIvbVUbVVbVWbGLabqaaabFcaaabFbaaabFcaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhaXIaXOaaaaaaaXMbVXbVYbVZbOabWabWbbVXaXMaaaaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqbccbccbUBbUBbccbccdgeaWDdggdgRdggdfNaWDapfbUCapfapfapfbgYauCatkbFpbTobUDbUEbHfbUEbUFbFpbUGathapdatjbUHbXJapfbFuaoXbzKbzKbzLbUIbUJbzLbzKbzKbzKbzKbUKbzKbzKbULbjnbUMbMSbUNbUObUPbUQbURbOBbUSbUTbUUbUVbMWbUWbUXbUYbUZbVabNdbVbbSebVcbVdbVebNhbVfbSibVgbVhbVibVjbVkbVlbNhbVmbhtbVnbbrbOWbVobVtbVqbXcbYtbYsbVubVqbUebVvbQIbVwbVxbVybVzbUjbQIbVAbVBbVCbVDbVEbVFbQVbVGbVHbVIbQVbVJbVKbVLbVMbCMbVNbVObRabVPbCNbVQbSRbGGbSPbVRbVSbVTbPCbItbIubIvbVUbVVbVWbGLabqaaabFcaaabFbaaabFcaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhaXIaXOaaaaaaaXMbVXbVYbVZbOabWabWbbVXaXMaaaaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaabccbWcbfdbccdghdgjdgibBtdgkbBtdgldgmapfbWdbWebWfbWgbWhbWgbWibFpbFpbFpbFpbWjbFpbFpbFpbWkdeJdeHapdbWlbWmapfbWnbWobzKbWpbWqbWrbWsbWtbWubWvbzKbWwbWxbWybzKbzPbfIbWzbMSbQdbTEbWAbWBbQdbOBbWCbWDbWEbWFbMWbWGbWHbWIbWJbWKbWLbWMbWNbWObWPbWQbNhbWRbWSbWTbWUbWVbWWbWXbWYbWZbXabhtbXbbbrbOWbVobYubXdbXdbXebXfbXgbXhbXibXjbQIbXkbVxbXlbXmbXnbQIbXobXpbXqbXrbEGbNFbQVbQVbQVbQVbQVbXsasJasJbXtbCMbVNbVObRabXubXvbVQbXwbInbSPbXxbRgbXybRibETabqbETbXzbXAbXBbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhaXIaXOaaaaaaaXMbXCbKlbXDbXEbXFbKlbXGaXMaaaaaaaZhaXIaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqbccbUBbUBbccdgndgjbBtbBtdgobBtdgpdgqapfbXHavUavUavUbDLathatkaoXaqBayBanHbXIauyauCapfapfapfapfapfbXKapfapfbFuatjbzKbXLbXMbXNbXNbWsbXObXPbzKbXQbXRbXSbzKbDQbfIbXTbMSbQdbXUbXVbXWbXXbOBbXYbXZbYabMWbMWbYbbYcbYdbYebYfbNdbYgbSdbYhbYibYjbNhbYkbYlbYmbYnbSlbYobYobYpbNhbYqbhtbYrbbrbOWbQIbYvbYEbYwbStcbacbbbUcbYxbYybYzbYAbYBbYCbYDccrbQIbEGbEGbEGbEGbEGbYFaoGbYGbUraucasJchGchFbYIasJbCMbCMbYJbNRbVPbCNbYKbYLbGGbYMbVRbRgbYNbSUbMibMjbMkbYObVVbYPbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBbicbYQaXLaXLaXLbpubbXbbXbbXbcabbXbbXbbXbDjaXLaXLaXLbnUaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabredgrdgtdgsdgvdgudgxdgwdgyapfapfapfapfbWmbYRavUbYSbYTbYUbYVbYVdfibYWbYXbYVbYTbYVbYYbYVbYZbYVaPTbZaapdbzKbZbbZcbZdbZebHrbZfbZgbzKbzKbzKbzKbzKbZhbfIbOvdeEbMSbZjbZjbZjbMSbMSbMWbMWbZkbMWbMWbZlbZlbZlbZmbZlbZnbZnbZobZpbZnbZnbNhbNhbNhbNhbNhbNhbZqbZqbZqbNhbZrdeFbZsbbrbZtbZubZvbZvbZvbZwbZvbZvbZxbZybZvbZvbZvbZvbQIbZzbZAbZBbZCbZDbZEasJbZFbZGaoGbVLbZHbZIasJbYHckgasJarrbCMbZJbJWbZKbCNbCNbCNbZLbGGbZMbZNbRgbUwbRibETabqbGLbGLbGLbGLbGLabqabqbRmabqbPGabqabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhaXIaXOaaaaaaaaaaaaaaaaaabZOaaaaaaaaaaaaaaaaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8619,7 +8617,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaacmRaaaabqaaaaaaabqaaabZUcmSbZUchnchocjecmTcjecjecmUcmVcmVcmVcmWcmVcmVcmVcmXcmYcmZcnacnbcnccndcnecnfckEcdTcngcnhcnicdTcjxcnjcnkcjxcnlcnmcmgcnncnocnpcnqcnrcmgcnscntcnucmocnvcnwcnxcnycnxcnzcmocnAcnBcnCcnDcnCcfxcfxcnEbZUcmzcnFcnGcnHcnIcnJcmBcnKcnKcnKcnLcnMcnNcnKcmBcmCbZUcnOasIcnPcnQaoGcnRcnScfKcnTcnUcnVclAclBcnWcnXclAabqbGLcnYbETcnYbGLcnYbETcnYbGLcnZbETcoabGLabqaaaabqabqabqcobcjacocabqabqabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqarBaaacjcaaaabqaaaaaaabqaaabZUbZUbZUbZUbZUbZUbZUbZUbZUcodcoecoecofcogcogcogcogcohcogcogcogcoicojcokcolcomconcoocopcoqcorcoscotcoucovcowcoxcoycozcoAcoBcoCcoDcoEcmgcoFckVcmmcmpcoGcoHcoIcoJcoKcoLcmocoMcoNcoOcoPcmzcdNcjncrFcrvcmzcoRcoScoTcoUcoVcmBcnKcoWcoXcoYcnKcoZcpacmBcpbbZUbZUbZUbZUbZUaoGaoGaoGcfKcfKcfKcpcclAcpdcpecpfcpgabqbGLcphcpicpjbGLcpkcplcpmbGLcpncpocppbGLabqaaaabqaaabCMcpqcprcpscptaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaabeaaackrabqabqabqabqabqaaabZUcpucpvcpwcpxcpycpzcpAbZUcodcoecpBcpCcpDcpEcpFcoecpGcpHcpIcoecpJcpKcpLcpMcpNcpOcpPcpQcpRcpScpTcpUcpTcpScpTcpVcpWcpXcpYcpZcqacqbcrVcmicnsckVcrWcmocqdcqecqfcqgcqhcqicqjcqkcqlcqmcqncmzcqocqpcqqcsncmzcqscqtcqucqvcqwcmBcnKcnKcqxcnKcnKcqycqzcmBcmCbZUcqAcqBbZUcqCcqDcqEcqFcqGcqHaoGcsoclAclAcsRclAclAabqbGLcqKcqLcqMbGLcqNcqOcqPbGLcqQcqRcqSbGLabqabqabqabqcptcqTcqUcqVcqWabqabeabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaackrabqaaaaaaaaaabqaaacqXcqYcqZcracrbcpycrccrdbZUcodcoecrecrfcrgcrhcricrjcrkcrlcrmcoecrncrocrpcrqcrrcrscrtcructAcrwcrxcrycrycrycrzcrAcrBcrCcrDcpZcrEctBcrGcmgcrHckVcrIcmocrJcrKcrLcrMcrNcrOcmocrPcrQcrRcrScmzcrTcrUctSctEcmzcrXcrYcrZcsacsbcmBcmBcsccsdcsecsecmBcsfcmBcsgcshcsicsjbZUcskasJasJasJcdKcslbZUcsmcynclAcyqclAcspabqbGLcqKcsqcqKbGLcqNcsrcqNbGLcsscstcssbGLabqaaaabqaaacqWcqUcsucqUcjaaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaarBaaackrabqaaaaaaaaaabqaaacqXcqYcqZcracrbcpycrccrdbZUcodcoecrecrfcrgcrhcricrjcrkcrlcrmcoeaovaotcrpcrncrocrscrtcructAcrwcrxcrycrycrycrzcrAcrBcrCcrDcpZcrEctBcrGcmgcrHckVcrIcmocrJcrKcrLcrMcrNcrOcmocrPcrQcrRcrScmzcrTcrUctSctEcmzcrXcrYcrZcsacsbcmBcmBcsccsdcsecsecmBcsfcmBcsgcshcsicsjbZUcskasJasJasJcdKcslbZUcsmcynclAcyqclAcspabqbGLcqKcsqcqKbGLcqNcsrcqNbGLcsscstcssbGLabqaaaabqaaacqWcqUcsucqUcjaaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabeabqckrabqaaaaaaaaaabqaaacqXcsvcrccqZcswcpycsxbZUbZUcsycoecszcsAcszcsBcszcoecszcsCcszcoeckEcsDcsEcsFckEckEcsGcsHcsIcsJcsJcsKcsLcsMcsJcsJcsNcmgcsOcsPcsQcyCcmgcmgcsSckVcsTcmocmocsUcsVcsWcsXcsYcmocsZcnBcfwcfwcmzctacmzctbcmzcmzcfwctcctdcfwcfwctectfctgcthctictjctkctlcmBctmbZUctnctobZUctpcdKchschyctqctrbZUctscttctuctvctuarAabqbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLbGLabqabqabqabqcjacqUcqUcqUcqWabqbFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaaabqaaaaaaarBaaaclIaaaaaaaaaaaaabqaaacqXctwcqZcswctxcpyctyctzcdOcodcoeczqczpctCctDczJcoectFctGctHcoectIctJctKctLctMctNctOcgrctPcsJctQctRcABctTctUcsJccvcmgctVctWctXctYcmictZcuacubcuccudcuecufcugcuhcuicujcukculcumcuncuocupciccuqcurcusciccutcuucuvciccuwctecuxcuycuzcuAcuBcuCcuDcmBcmCbZUbZUcuEbZUcuFcuGchychycuHcuIcqXabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaaabqaaacjacqWcptbCMcptaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqaaaaaaabqaaaaaaabeaaacmRabqaaaaaaaaaabqaaacqXcqXcqZcpycpycqZcqZcuJcdOcodcoecuKcuLcuMcuNcuOcoecuPcuQcuRcuScuTcuUcuVcuWcuXcuYcuZcgrcgscsKcvacvbcvccvdcvecsJchscmgcvfcvgcvhcvicvjcvkcvlckVcvmcvncvocvpcvqcvrcvscvtcvucvvcvwcvxcvycvzcvAcvBcvCcvDcvEcvDcvFcvGcvHcvIcvJcvKcvLcvMcvNcvOcvPcvQcvRcvSbZUcvTcvUcvVcbvctqchychycvWcvXbZUcvYabqaaaaaaaaaabqaaaaaaaaaaaaaaaabqaaaaaaaaaabqaaaaaaaaaaaaabqaaaabqaaaaaaabqaaaabqaaaaaaabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8666,7 +8664,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadazcZBcZBdaAdaBdaCcZBcZTcYFdaDcZVcZEdaEcZeaaaaaaabqaaacVGcZrcZrcZrcZrdaFdaGdaHdaIdaFcZrcZrcZrcZrcVGaaacmzcicdaJcmzcTZcmzcmzcTZcmzaaaaaaabqabqcZAcZAcZAcZAcZAaaacYBabqcZAcZAcZAcZAcZAaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZedaKcZBcZTcYFcZUcZBdaLcZedaMdaNdaOdaPcZeaaaaaaabqaaacVGcZGcZHcZHdaQcZJdaRdaHdaSdaTdaUcZPcZPdancVGaaacmzcmzcmzcmzaaaaaaabqaaaaaaaaaaaaabqaaaabqaaaabqaaaabqaaacYBaaaabqaaaabqabqabqabqaupaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacYFcZUcZBcZTcYFcZUcZBdaVdaWdaXcYFdaYdaZdbaaaaaaaabqaaacVGcZPcZPcZPdbbdbccZZdbddabdbedbfcZPcZPcZPcVGaaaaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaabqaaacYAcYAcYAcYAcYAabqdbgabqcYAcYAcYAcYAcYAabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbhcZUcZBcZBcZBcZBcZBcZTcYFdbidbjcZBdbkcZeaaaabqabqabqcVGdancZPcZPdbldbmdaqdbndbodatdbpcZHcZHdavcVGaaaaaaabqaaaaaaabqaaaaaaaaaaaaaaaaaaarBabqcYXcYYcYYcYYcYYcYZcYBcZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbhcZUcZBcZBcZBcZBcZBcZTcYFdbidbicZBdbkcZeaaaabqabqabqcVGdancZPcZPdbldbmdaqdbndbodatdbpcZHcZHdavcVGaaaaaaabqaaaaaaabqaaaaaaaaaaaaaaaaaaarBabqcYXcYYcYYcYYcYYcYZcYBcZbcZccZccZccZccZdabqarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacYFcZUcZBcZTcYFcZUcZBcZBdaYcZBcZBcZBdbqcYFaaaabqaaacVGcVGcZrcZrcZrcZrdaFdbrdaHdbsdaFcZrcZrcZrcZrcVGcVGaaaabqabqabqabqaaaaaaaaaaaaaaaaaaabqabqcZAcZAcZAcZAcZAaaadbtaaacZAcZAcZAcZAcZAaaaarBabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacZmdaCcZBcZTcYFcZUcZBcZTcYFdbudbvdbwdbxcZeaaaabqaaacVGcZGcZHcZHdbycZJdbzdbAdaHdaScZMdbBdbCdbDcZPcZPcVGabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaaaaaaabqabqabqaaaaaacVJabqaaaaaaabqabqaaaaaaarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacYGcZBcZBdaAdaBdaCcZBdbFdaWcYEcYEdbGcYEdbaaaaabqaaacVGcZPcZPcZPdbHdbIdabdabdbJdabdabdbKdbLdbMcZPcZPcVGaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabearBarBarBaaaaaaaaacVJaaaaaaaaaarBarBarBauparBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm
index 288ac0f9044..0e4001575fc 100644
--- a/_maps/map_files/MetaStation/z2.dmm
+++ b/_maps/map_files/MetaStation/z2.dmm
@@ -401,7 +401,7 @@
"hK" = (/turf/unsimulated/floor/grass,/area/centcom/control)
"hL" = (/turf/unsimulated/floor{icon_state = "greencorner"; dir = 8},/area/centcom/control)
"hM" = (/turf/unsimulated/floor{icon_state = "greencorner"},/area/centcom/control)
-"hN" = (/obj/structure/flora/kirbyplants,/turf/unsimulated/floor{icon_state = "green"; dir = 9},/area/centcom/evac)
+"hN" = (/obj/item/weapon/twohanded/required/kirbyplants,/turf/unsimulated/floor{icon_state = "green"; dir = 9},/area/centcom/evac)
"hO" = (/obj/structure/stool/bed/chair,/turf/unsimulated/floor{dir = 1; icon_state = "green"},/area/centcom/evac)
"hP" = (/turf/unsimulated/floor{dir = 1; icon_state = "green"},/area/centcom/evac)
"hQ" = (/obj/structure/rack,/turf/unsimulated/floor{dir = 1; icon_state = "green"},/area/centcom/evac)
@@ -518,7 +518,7 @@
"lv" = (/turf/unsimulated/floor{icon_state = "neutral"; dir = 8},/area/tdome/tdomeobserve)
"lw" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdomeobserve)
"lx" = (/turf/unsimulated/floor{icon_state = "neutral"; dir = 4},/area/tdome/tdomeobserve)
-"ly" = (/obj/structure/flora/kirbyplants,/turf/unsimulated/floor{icon_state = "red"; dir = 10},/area/centcom/evac)
+"ly" = (/obj/item/weapon/twohanded/required/kirbyplants,/turf/unsimulated/floor{icon_state = "red"; dir = 10},/area/centcom/evac)
"lz" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/centcom/evac)
"lA" = (/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/centcom/evac)
"lB" = (/obj/structure/rack,/obj/item/toy/katana,/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/centcom/evac)
@@ -580,7 +580,7 @@
"nD" = (/obj/structure/extinguisher_cabinet{pixel_y = -28},/turf/unsimulated/floor{tag = "icon-darkbrown"; icon_state = "darkbrown"; dir = 2},/area/centcom/ferry)
"nE" = (/turf/unsimulated/floor{tag = "icon-darkred"; icon_state = "darkred"; dir = 2},/area/centcom/ferry)
"nF" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/emps,/obj/item/weapon/gun/energy/ionrifle,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
-"nG" = (/obj/structure/table/reinforced,/obj/item/weapon/c4,/obj/item/weapon/c4{pixel_x = 7},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
+"nG" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/plastic/c4,/obj/item/weapon/grenade/plastic/c4{pixel_x = 7},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/ferry)
"nH" = (/turf/unsimulated/floor{icon_state = "red"; dir = 10},/area/tdome/tdomeobserve)
"nI" = (/turf/unsimulated/floor{icon_state = "red"; dir = 2},/area/tdome/tdomeobserve)
"nJ" = (/turf/unsimulated/floor{icon_state = "green"},/area/tdome/tdomeobserve)
diff --git a/_maps/map_files/MetaStation/z5.dmm b/_maps/map_files/MetaStation/z5.dmm
index aaf53a80095..5b8760128df 100644
--- a/_maps/map_files/MetaStation/z5.dmm
+++ b/_maps/map_files/MetaStation/z5.dmm
@@ -478,8 +478,8 @@
"jj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
"jk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
"jl" = (/obj/effect/spawner/window/reinforced{useFull = 1; tag = "fullReinWin"},/turf/simulated/floor/plasteel,/area/research_outpost/med)
-"jm" = (/obj/machinery/sleeper{dir = 8},/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/research_outpost/med)
-"jn" = (/obj/machinery/sleep_console{dir = 8},/obj/machinery/light/small,/obj/machinery/camera{c_tag = "Research Outpost Medbay"; dir = 8; network = list("Research Outpost")},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/research_outpost/med)
+"jm" = (/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/research_outpost/med)
+"jn" = (/obj/machinery/light/small,/obj/machinery/camera{c_tag = "Research Outpost Medbay"; dir = 8; network = list("Research Outpost")},/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/research_outpost/med)
"jo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/tempstorage)
"jp" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/research_outpost/tempstorage)
"jq" = (/obj/machinery/conveyor{dir = 9; id = "anotempload"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/research_outpost/tempstorage)
@@ -938,7 +938,7 @@
"sb" = (/obj/machinery/light/small{dir = 4},/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/mine/laborcamp)
"sc" = (/obj/structure/closet/crate/internals,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
"sd" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "floorgrime"; temperature = 273.15},/area/mine/laborcamp)
-"se" = (/mob/living/simple_animal/bot/secbot/beepsky{desc = "Powered by tears and swet of laborer."; name = "Prison Ofitser"},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=2-NMine"; location = "1-Storage"},/turf/simulated/floor/plasteel{icon_state = "asteroidfloor"; temperature = 273.15},/area/mine/laborcamp)
+"se" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=2-NMine"; location = "1-Storage"},/mob/living/simple_animal/bot/secbot/beepsky{desc = "Powered by tears and swet of laborer."; name = "Prison Ofitser"},/turf/simulated/floor/plasteel{icon_state = "asteroidfloor"; temperature = 273.15},/area/mine/laborcamp)
"sf" = (/obj/structure/plasticflaps/mining,/turf/simulated/floor/plasteel{icon_state = "asteroidfloor"; temperature = 273.15},/area/mine/laborcamp)
"sg" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=3-SMine"; location = "2-NMine"},/turf/simulated/floor/plasteel{icon_state = "asteroidfloor"; temperature = 273.15},/area/mine/laborcamp)
"sh" = (/turf/simulated/floor/plating{icon_plating = "asteroidplating"; icon_state = "asteroidplating"; temperature = 273.15},/area/mine/explored)
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm
new file mode 100644
index 00000000000..0635ad2bcc7
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm
@@ -0,0 +1,124 @@
+"aa" = (/turf/space,/area/space)
+"ab" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"ac" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"ad" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"ae" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"af" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"ag" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"ah" = (/turf/simulated/mineral,/area/ruin/unpowered)
+"ai" = (/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered)
+"aj" = (/obj/structure/flora/rock,/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered)
+"ak" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"al" = (/obj/structure/flora/ausbushes/genericbush,/turf/unsimulated/floor/grass,/area/ruin/unpowered)
+"am" = (/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/poison/bees,/turf/unsimulated/floor/grass,/area/ruin/unpowered)
+"an" = (/mob/living/simple_animal/hostile/poison/bees,/turf/unsimulated/floor/grass,/area/ruin/unpowered)
+"ao" = (/obj/structure/flora/ausbushes/lavendergrass,/turf/unsimulated/floor/grass,/area/ruin/unpowered)
+"ap" = (/mob/living/simple_animal/hostile/asteroid/goldgrub{will_burrow = 0},/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered)
+"aq" = (/obj/structure/flora/ausbushes/grassybush,/turf/unsimulated/floor/grass,/area/ruin/unpowered)
+"ar" = (/obj/structure/flora/rock/pile,/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered)
+"as" = (/mob/living/simple_animal/hostile/asteroid/basilisk,/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered)
+"at" = (/turf/simulated/wall/r_wall,/area/ruin/unpowered)
+"au" = (/obj/structure/flora/ausbushes/leafybush,/mob/living/simple_animal/hostile/poison/bees,/turf/unsimulated/floor/grass,/area/ruin/unpowered)
+"av" = (/obj/structure/flora/ausbushes/brflowers,/turf/unsimulated/floor/grass,/area/ruin/unpowered)
+"aw" = (/obj/structure/flora/rock,/obj/machinery/light,/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered)
+"ax" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/clothing/mask/surgical,/obj/item/weapon/razor,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"ay" = (/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"az" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/syringes{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/box/beakers,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"aA" = (/obj/structure/flora/ausbushes/ywflowers,/turf/unsimulated/floor/grass,/area/ruin/unpowered)
+"aB" = (/obj/machinery/light,/mob/living/simple_animal/hostile/poison/bees,/turf/unsimulated/floor/grass,/area/ruin/unpowered)
+"aC" = (/obj/structure/flora/ausbushes/ppflowers,/turf/unsimulated/floor/grass,/area/ruin/unpowered)
+"aD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/machinery/door/airlock/highsecurity{name = "Bio Containment"; req_one_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"aE" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"aF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/ruin/unpowered)
+"aG" = (/obj/structure/table/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/item/weapon/gun/energy/floragun,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"aH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aI" = (/obj/structure/table/reinforced,/obj/machinery/computer/med_data/laptop,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"aJ" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"aK" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
+"aL" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"aM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/ruin/unpowered)
+"aN" = (/obj/structure/table/reinforced,/obj/item/weapon/folder,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"aO" = (/obj/structure/stool/bed/chair/office/light{dir = 8},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aP" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/bottle/liver_enhance_virion,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"aQ" = (/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space)
+"aR" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"aS" = (/obj/machinery/power/apc/worn_out{dir = 8; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/rack,/obj/item/weapon/melee/baton/cattleprod,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"aT" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/suit/space/rig/medical,/obj/item/weapon/tank/emergency_oxygen/double,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"aU" = (/obj/structure/rack,/obj/item/weapon/crowbar,/obj/item/weapon/shield/riot,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"aV" = (/obj/machinery/smartfridge/chemistry,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"aW" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/syringe,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"aX" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/chem_grenade/antiweed{pixel_x = 3; pixel_y = 5},/obj/item/weapon/grenade/chem_grenade/antiweed{pixel_x = 4},/obj/item/weapon/grenade/chem_grenade/antiweed{pixel_x = -3; pixel_y = -1},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"aY" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/temperature,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"aZ" = (/obj/structure/table/reinforced,/obj/item/weapon/minihoe,/obj/item/weapon/shovel,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"ba" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"bb" = (/obj/machinery/door/airlock/hatch{name = "Bio-Research Station"},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bd" = (/obj/machinery/power/terminal,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"be" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"bf" = (/obj/machinery/power/smes/magical{desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; name = "power storage unit"},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"bg" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"bh" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"bi" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/hypospray/autoinjector/stimpack,/obj/item/weapon/reagent_containers/glass/bottle/mutagen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"bj" = (/obj/structure/table/reinforced,/obj/item/weapon/surgicaldrill,/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/item/weapon/surgical_drapes,/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/item/weapon/circular_saw,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"bk" = (/obj/machinery/optable,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"bl" = (/obj/machinery/computer/operating,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"bm" = (/obj/structure/closet/wardrobe/toxins_white,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"bn" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/snacks/carrotfries,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"bo" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bp" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/green,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"bq" = (/obj/item/stack/cable_coil/cut,/obj/item/stack/tile/plasteel{pixel_x = 3; pixel_y = -4},/obj/item/weapon/wirecutters,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"br" = (/obj/structure/table/reinforced,/obj/machinery/microwave,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"bs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/shieldwallgen,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bt" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/shieldwallgen,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bu" = (/obj/structure/flora/ausbushes/sunnybush,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bv" = (/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bw" = (/obj/machinery/light{dir = 1},/mob/living/simple_animal/hostile/carp,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bx" = (/obj/structure/flora/ausbushes/palebush,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"by" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/ruin/unpowered)
+"bz" = (/obj/machinery/space_heater,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"bA" = (/obj/structure/table/reinforced,/obj/machinery/juicer,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"bB" = (/obj/structure/alien/weeds,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bC" = (/obj/structure/alien/weeds/node,/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bD" = (/obj/item/clothing/mask/facehugger{icon_state = "facehugger_dead"; stat = 2},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bE" = (/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bF" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/ruin/unpowered)
+"bG" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bH" = (/obj/structure/alien/resin/wall,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bI" = (/obj/structure/flora/ausbushes/reedbush,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bJ" = (/mob/living/simple_animal/crab{faction = list("carp")},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bK" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/space)
+"bL" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bM" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bN" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bO" = (/obj/item/weapon/shard,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bP" = (/obj/structure/lattice,/turf/space,/area/space)
+"bQ" = (/obj/machinery/shieldwallgen{active = 2; anchored = 1; power = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bR" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/disposaloutlet,/turf/simulated/floor/plating,/area/space)
+"bS" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable,/obj/machinery/shieldwallgen,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bT" = (/obj/structure/grille,/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bU" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"bV" = (/obj/machinery/shieldwallgen,/turf/space,/area/space)
+"bW" = (/obj/item/weapon/shard,/turf/space,/area/space)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+abacacacacadaaaaaaaaaaaaaeacacacacafaaaa
+agahahaiajakaaaaaaaaaaaaakalamanaoakaaaa
+agaiapahaiakaaaaaaaaaaaaakanamaqanakaaaa
+agaraiaiasakatagagagagatakanaoauavakaaaa
+agahaiawarakataxayayazatakaAaBamaCakaaaa
+abacaDacacaEaFaGaHaHaIaFaJacacaDacafaaaa
+aaaKaLatataMataNaOayaPatatatataLaQaaaaaa
+aaaKaRataSaTaUaVayayaWaXaYaZatbaaQaaaaaa
+aaaKaLbbaybcayayayayayayayaybbaLaQaaaaaa
+aaaKaLbbaybdayayayayayayayaybbaLaQaaaaaa
+aaaKaRatbebfbgbhayaybibjbkblatbaaQaaaaaa
+aaaKaLatataMatbmayaybnatatatataLaQaaaaaa
+abacaDacacboaFbpaHbqbraFbsacacaDacbtaaaa
+agbubvbwbxakbybzayaybAatakbBbCbDbBagaaaa
+agbvbvbvbEakbFatbGbGatatakbBbHbBbBagaaaa
+agbIbJbvbvakbKatbLbMataaakbDbHbvbvbNaaaa
+agbvbvbvbvakbKatbGbGataaakbHbvbObvbPaaaa
+abacacacacbQbRaaaaaaaaaabSacbTbUbPaabVaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWaaaaaaaa
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm
new file mode 100644
index 00000000000..5792bd58b23
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm
@@ -0,0 +1,26 @@
+"a" = (/turf/space,/area/space)
+"b" = (/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered)
+"c" = (/turf/simulated/mineral/random/high_chance,/area/ruin/unpowered)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaabaa
+aaaabbaaaaaaaaaaaaaa
+aaaabbbaaaaaaaaaaaaa
+aaaaaaaaabbcbaaaaaaa
+aaaaaaaaaabbaaaaaaaa
+aaaaaaaaaabaaaaaaaaa
+aaaaaaabaaaaaaaaaaaa
+aaaaabbcbaaaaabbbaaa
+aaaaabccbaaaaabcbaaa
+aaaaccccaaabbccbbaaa
+aaabcccbaaabbccaaaaa
+aaabccaaaaaabbaaaaaa
+aaabbbaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaabcaaaaaaa
+aaaabaaaaaabbaaaaaaa
+aaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm
new file mode 100644
index 00000000000..25ae8bbeac5
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm
@@ -0,0 +1,27 @@
+"a" = (/turf/space,/area/space)
+"b" = (/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered)
+"c" = (/turf/simulated/mineral,/area/ruin/unpowered)
+"d" = (/turf/simulated/mineral/random/high_chance,/area/ruin/unpowered)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaa
+aaaaabbbbaaaaaaaaaab
+aaabbbbbbbbaaaaabbaa
+aabbbbbcbbbbbbaaabaa
+abbbbbcccbbbbbaaaaaa
+abbbcccccccddbbaaaaa
+abbbcccccccddbbaaaaa
+abbbcccdddccdbbbbaaa
+aaabcccccdddcccbbaaa
+aabbbddcccddccdbbbba
+aabbbddcccddccccbbba
+aabbbddccdddccccbbba
+aabbbddcdddcccddbbba
+aaabbddcdcccccddbbba
+aaaabbbbdccccdddbbba
+aaaaaabbcccdcccbbbba
+aaabaabbbbbccccbbaaa
+baaaaaaabbbbbccbaaaa
+aaaaaaaaaaaabbbbaaaa
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm
new file mode 100644
index 00000000000..2188dbc63cd
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm
@@ -0,0 +1,29 @@
+"a" = (/turf/space,/area/space)
+"b" = (/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered)
+"c" = (/turf/simulated/mineral,/area/ruin/unpowered)
+"d" = (/turf/simulated/mineral/random/high_chance,/area/ruin/unpowered)
+"e" = (/obj/effect/decal/remains/human,/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered)
+"f" = (/obj/item/weapon/pickaxe/diamond,/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaa
+aabbbaaaaaaaaabaaaaa
+aabbbbabbbbaaaaaaaaa
+baabccbbbbbbbbbbaaba
+aabbccbccccdddcbbaaa
+aabccccccccdddcbbaaa
+aabcccdccbcccccccaaa
+aaabcccccbccccccccaa
+abbbcccbbbccccccddaa
+bbbcccbbbbbcdcccddaa
+cdddccbbebbccccccaaa
+cdddcbbfbbcccccccaaa
+ccccccbbbbcccccbbaaa
+cccccccbbccccccbbaba
+bcdddccccccccbbaaaaa
+acdddcccccddcbaaaaaa
+acdddccbccddbbaaaaaa
+aabbcbbbbcbbbaaaaaba
+aaaaaaabbbbbaabaaaaa
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm
new file mode 100644
index 00000000000..85d9cc75153
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm
@@ -0,0 +1,37 @@
+"a" = (/turf/space,/area/space)
+"b" = (/turf/simulated/mineral,/area/ruin/unpowered)
+"c" = (/turf/simulated/mineral/random/high_chance,/area/ruin/unpowered)
+"d" = (/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered)
+"e" = (/turf/simulated/mineral/clown,/area/ruin/unpowered)
+"f" = (/turf/simulated/floor/plating,/area/ruin/unpowered)
+"g" = (/obj/item/weapon/shard,/obj/item/weapon/paper{info = "Extraction was successful! The disguise was perfect, the clowns never knew what hit 'em! Once I get back to base with the bananium samples I'll be rich, I tell you! RICH!"},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"h" = (/obj/item/stack/sheet/mineral/bananium{amount = 15},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"i" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/ruin/unpowered)
+"j" = (/obj/item/weapon/shard,/turf/simulated/shuttle/floor,/area/ruin/unpowered)
+"k" = (/turf/simulated/shuttle/floor,/area/ruin/unpowered)
+"l" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/ruin/unpowered)
+"m" = (/obj/machinery/door/airlock/shuttle{name = "Escape Pod Airlock"},/turf/space,/area/ruin/unpowered)
+"n" = (/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/floor/plating,/area/ruin/unpowered)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaa
+aabbbaaaaaaaaaaaaaaa
+acccbbbbaaaaaaaaaaaa
+acccbbcbbbaaaaaabaaa
+abbbbbbbbbbaaaabbaaa
+abddbbbbbbcaaaabbbaa
+aadddbbbbbcaaaabbaaa
+aaadddddbaaaaabbbaaa
+aaaaadddbaaaaabbaaaa
+aaaaaaaaaaaaaabbaaaa
+aaaaaaaaaaaaccbbaaaa
+aaabaaaaaabbccbaaaaa
+aaabaaaaabbbebbaaaaa
+aabbbaaadbbeefbcaaaa
+aabbbaaaddbghfbcaaaa
+abbbbaaaddbijibbaaaa
+abbaaaaaaabikibaaaaa
+aaaaabaaaaalmnaaaaaa
+aaabaaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm b/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm
new file mode 100644
index 00000000000..46ecaecff24
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm
@@ -0,0 +1,47 @@
+"a" = (/turf/space,/area/space)
+"b" = (/turf/simulated/mineral,/area/ruin/unpowered)
+"c" = (/turf/simulated/mineral/random/high_chance,/area/ruin/unpowered)
+"d" = (/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabbbccccbaaaaaaaaaaaaaaaaa
+aaaaaaaaaabbbbbbbbccccbbbbbbaaaaaaaaaaaa
+aaaaaaaabbbbbbbbbbdddbbbbbbbbaaaaaaaaaaa
+aaaaaccccbbbbbbdddddddddcbbccaaaaaaaaaaa
+aaaaaccccbbbbccddddddddddbbccaaaaaaaaaaa
+aaabbccccbbbddddddaaaaaddddbbaaaaaaaaaaa
+aaabbbccbbcdddaaaaaaaaaadddbbbaaaaaaaaaa
+aaacbbbbbdddaaaaaabbbaaadddbbbaaaaaaaaaa
+aaacbbbbbddaaaaaaabbbaaaaaaabbaaaaaaaaaa
+aaaabbbbdddaaaaaaaabbaaaaaaabbaaaaaaabaa
+aaaaabbbddaaaaaaaaaaaaaaaaaabbaaaaaabcaa
+aaaaabbbddaaaaabaaaaaaaaaaabbaaaaaabccca
+aaaaabbbddddaaaaaaaaaaaaaaabbaaaaaabccca
+aaaaaaccbdddaaaaaaaaaaaaaaaaaaaaaaabccca
+aaaaaaccbdddaaaaaaabbaabaaaaaaaaadddbbba
+aaaaaaccbbcbaaaaabbbbaaaaaaaaaadddddbbaa
+aaaaaaaaaaaaaaaaabbcbaaaaaaaaaadddddbbaa
+aaaaaaaaaaaaaaaaabbcaaaaaaaadddddddbbbaa
+aaaaaaaaaaaaaaaaaabbaaaaaaaaddddbddbbbba
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaddddbddbbbba
+aaaaaaaaaaaaaaaaaaaaaaaaaaaabcbbbdddbcba
+aaaaaaaaaaaaabdddddbbbaaaaabbbbbbcdddcba
+aaaaaaaaabdddddddddddddaaaaabbbbbcdddbba
+aaaaaaabddddddbbbbbbdddaaaaaaabbbcddbbaa
+aaaaaabddddbcccccbbbddddbaaaaabbbbbbbbaa
+aaaaaabddbbbcccccbbbbccdcaaaaabbbbbbbbaa
+aaaaddddbbcccbbbbbbbbccdddaaaaabccbbaaaa
+aaaaddddbbccdddbbbdddccdddaaaaaaabbcaaaa
+aaaddddbbbccdddbdddddbbdddaaaaaaaaaaaaaa
+aaaddddcccccdcbbddddddddddaaaaaaaaaaaaaa
+abbdddbccccdddddddcbddddddaaaaaaaaaaaaaa
+accbbbbccccdddddddbbbbbbbcaaaaaaaaaaaaaa
+acccbbbccccddddddbbbbbbbbcaaaaaaaaaaaaaa
+acccbbbbbbbbbbbbbbccbbbbbbaaaaaaaaabbaaa
+aaccbbbbbbbbbbbbbbccbbbbbaaaaaaaaabbbaaa
+aabbbbbbccbbbbbbbbbbbbbbbaaaaaaaabbbbaaa
+aaabbbbbccbabbbbbccccbbbbaaaaaaaabbbaaaa
+aaabbbbbaaaaaaaabccccbbaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm
new file mode 100644
index 00000000000..82ed8ece1a7
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm
@@ -0,0 +1,179 @@
+"aa" = (/turf/space,/area/space)
+"ab" = (/turf/simulated/mineral/random/low_chance,/area/ruin/unpowered)
+"ac" = (/turf/simulated/wall/mineral/iron,/area/ruin/unpowered)
+"ad" = (/obj/structure/closet/cardboard,/obj/item/stack/sheet/mineral/silver,/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/silver,/obj/item/stack/sheet/mineral/silver,/obj/item/stack/sheet/mineral/gold,/obj/item/stack/sheet/mineral/gold,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"ae" = (/obj/structure/closet/cardboard,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"af" = (/obj/structure/closet/cardboard,/obj/item/stack/sheet/cardboard,/obj/item/stack/cable_coil,/obj/item/stack/sheet/wood,/obj/item/stack/packageWrap,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"ag" = (/obj/structure/closet/cardboard,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/drinkingglasses,/obj/item/weapon/storage/box/zipties,/obj/item/weapon/kitchen/knife/combat,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"ah" = (/obj/structure/closet/cardboard,/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/rods{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/rods{amount = 50},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"ai" = (/obj/structure/closet/cardboard,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/clothing/shoes/combat,/obj/item/clothing/shoes/combat,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aj" = (/obj/structure/closet/cardboard,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/shovel,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"ak" = (/obj/structure/closet/cardboard,/obj/item/device/flashlight/lantern,/obj/item/device/flashlight/lantern,/obj/item/device/flashlight/lantern,/obj/item/device/tape/random,/obj/item/device/tape/random,/obj/item/device/tape/random,/obj/item/weapon/storage/box/rxglasses,/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher,/obj/item/clothing/glasses/night,/obj/item/clothing/glasses/night,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"al" = (/obj/structure/closet/cardboard,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/matches,/obj/item/weapon/storage/box/bodybags,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"am" = (/obj/structure/closet/cardboard,/obj/item/weapon/kitchen/knife,/obj/item/weapon/kitchen/knife,/obj/item/weapon/hatchet,/obj/item/weapon/kitchen/rollingpin,/obj/item/weapon/minihoe,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"an" = (/obj/structure/closet/cardboard,/obj/item/weapon/defibrillator,/obj/item/weapon/storage/box/autoinjectors,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"ao" = (/obj/structure/closet/cardboard,/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/item/ammo_box/c9mm,/obj/item/ammo_box/c9mm,/obj/item/ammo_box/c9mm,/obj/item/ammo_box/c9mm,/obj/item/ammo_box/c9mm,/obj/item/ammo_box/c9mm,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"ap" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aq" = (/obj/machinery/iv_drip,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"ar" = (/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"as" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"at" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"au" = (/obj/machinery/door/airlock/highsecurity{name = "Bunker"},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"av" = (/obj/structure/toilet{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/ruin/unpowered)
+"aw" = (/obj/structure/mirror{pixel_x = 30},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/ruin/unpowered)
+"ax" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/flashlight,/obj/item/device/flashlight,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"ay" = (/obj/structure/table,/obj/item/weapon/gun/projectile/automatic/wt550{pixel_x = -3; pixel_y = 6},/obj/item/weapon/gun/projectile/automatic/wt550{pixel_x = 2; pixel_y = 0},/obj/structure/reagent_dispensers/peppertank{pixel_y = 30},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"az" = (/obj/structure/table,/obj/item/weapon/storage/backpack/duffel/security{pixel_y = 6},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aA" = (/obj/structure/table,/obj/item/device/radio{pixel_x = -4},/obj/item/device/radio,/obj/item/device/radio{pixel_x = 4},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aB" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/rods{amount = 50},/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aC" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/brute{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/firstaid/brute,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aD" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/firstaid/regular,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aE" = (/obj/structure/closet/crate/radiation,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aF" = (/obj/structure/closet/cardboard,/obj/item/weapon/reagent_containers/food/snacks/beans,/obj/item/weapon/reagent_containers/food/snacks/beans,/obj/item/weapon/reagent_containers/food/snacks/beans,/obj/item/weapon/reagent_containers/food/snacks/beans,/obj/item/weapon/reagent_containers/food/snacks/beans,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aG" = (/obj/structure/closet/cardboard,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aH" = (/obj/machinery/vending/clothing,/turf/simulated/floor/wood{tag = "icon-wood-broken"; icon_state = "wood-broken"},/area/ruin/unpowered)
+"aI" = (/turf/simulated/floor/wood{tag = "icon-wood-broken2"; icon_state = "wood-broken2"},/area/ruin/unpowered)
+"aJ" = (/obj/structure/stool/bed,/turf/simulated/floor/wood,/area/ruin/unpowered)
+"aK" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/ruin/unpowered)
+"aL" = (/obj/machinery/light/small{dir = 4; pixel_y = -8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/ruin/unpowered)
+"aM" = (/obj/structure/table,/obj/item/clothing/gloves/combat,/obj/item/clothing/gloves/combat,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aN" = (/obj/structure/table,/obj/item/device/mass_spectrometer/adv,/obj/item/device/mass_spectrometer/adv,/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aO" = (/obj/structure/closet/radiation,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aP" = (/obj/structure/closet/cardboard,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aQ" = (/obj/structure/closet/wardrobe/pink,/turf/simulated/floor/wood{tag = "icon-wood-broken2"; icon_state = "wood-broken2"},/area/ruin/unpowered)
+"aR" = (/turf/simulated/floor/wood,/area/ruin/unpowered)
+"aS" = (/obj/structure/stool/bed,/turf/simulated/floor/wood{tag = "icon-wood-broken"; icon_state = "wood-broken"},/area/ruin/unpowered)
+"aT" = (/obj/machinery/shower{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/ruin/unpowered)
+"aU" = (/obj/machinery/shower{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/ruin/unpowered)
+"aV" = (/obj/machinery/light/small{dir = 8},/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/firstaid/toxin,/obj/item/weapon/storage/pill_bottle/charcoal,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aW" = (/obj/structure/table,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/weapon/crowbar/red,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aX" = (/obj/machinery/suit_storage_unit,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"aY" = (/obj/structure/closet/wardrobe/pink,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/wood,/area/ruin/unpowered)
+"aZ" = (/turf/simulated/floor/wood{tag = "icon-wood-broken"; icon_state = "wood-broken"},/area/ruin/unpowered)
+"ba" = (/obj/structure/stool/bed,/turf/simulated/floor/wood{tag = "icon-wood-broken2"; icon_state = "wood-broken2"},/area/ruin/unpowered)
+"bb" = (/obj/machinery/shower{dir = 4},/obj/item/weapon/soap,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/ruin/unpowered)
+"bc" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bd" = (/obj/structure/closet/cardboard,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"be" = (/obj/machinery/door/airlock/highsecurity{name = "Bunker"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/ruin/unpowered)
+"bf" = (/obj/structure/closet/fireaxecabinet{tag = "icon-fireaxe0130"; icon_state = "fireaxe0130"; pixel_y = 28},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bg" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bh" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bi" = (/obj/machinery/light/small{dir = 4; pixel_y = -8},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bj" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 4},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bk" = (/obj/machinery/processor{name = "processor"},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bl" = (/obj/structure/table,/obj/item/weapon/storage/box/matches,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bm" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bn" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bo" = (/obj/machinery/portable_atmospherics/hydroponics{pixel_y = 9},/obj/machinery/light{dir = 1},/turf/simulated/floor/light,/area/ruin/unpowered)
+"bp" = (/obj/machinery/portable_atmospherics/hydroponics{pixel_y = 9},/turf/simulated/floor/light,/area/ruin/unpowered)
+"bq" = (/obj/machinery/blackbox_recorder,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"br" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bs" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/power/smes,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bt" = (/obj/machinery/telecomms/relay/preset/telecomms,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bu" = (/obj/machinery/light/small{dir = 1},/obj/structure/dispenser/oxygen,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bv" = (/obj/machinery/biogenerator,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bw" = (/obj/machinery/light,/obj/machinery/portable_atmospherics/hydroponics{pixel_y = 9},/turf/simulated/floor/light,/area/ruin/unpowered)
+"bx" = (/obj/machinery/autolathe,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"by" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bz" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bA" = (/obj/structure/table,/obj/machinery/microwave,/turf/simulated/floor/plasteel{tag = "icon-bar"; icon_state = "bar"},/area/ruin/unpowered)
+"bB" = (/turf/simulated/floor/plasteel{tag = "icon-bar"; icon_state = "bar"},/area/ruin/unpowered)
+"bC" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plasteel{tag = "icon-bar"; icon_state = "bar"},/area/ruin/unpowered)
+"bD" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/beans,/turf/simulated/floor/plasteel{tag = "icon-bar"; icon_state = "bar"},/area/ruin/unpowered)
+"bE" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-bar"; icon_state = "bar"},/area/ruin/unpowered)
+"bF" = (/obj/machinery/seed_extractor,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bG" = (/obj/machinery/power/apc{dir = 8; name = "Bunker APC"; keep_preset_name = 1; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bI" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bJ" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bK" = (/obj/structure/table,/obj/item/weapon/kitchen/knife,/turf/simulated/floor/plasteel{tag = "icon-bar"; icon_state = "bar"},/area/ruin/unpowered)
+"bL" = (/obj/structure/table,/turf/simulated/floor/plasteel{tag = "icon-bar"; icon_state = "bar"},/area/ruin/unpowered)
+"bM" = (/obj/structure/table,/obj/item/weapon/kitchen/utensil/fork,/turf/simulated/floor/plasteel{tag = "icon-bar"; icon_state = "bar"},/area/ruin/unpowered)
+"bN" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bO" = (/obj/machinery/space_heater,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bP" = (/obj/structure/stool/bed/chair/office/dark{tag = "icon-officechair_dark (EAST)"; icon_state = "officechair_dark"; dir = 4},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bQ" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bR" = (/obj/machinery/smartfridge,/turf/simulated/floor/plasteel{tag = "icon-bar"; icon_state = "bar"},/area/ruin/unpowered)
+"bS" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{tag = "icon-bar"; icon_state = "bar"},/area/ruin/unpowered)
+"bT" = (/obj/machinery/vending/hydroseeds{slogan_delay = 700},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bU" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bV" = (/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bW" = (/obj/structure/computerframe,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bX" = (/obj/structure/table/reinforced,/obj/machinery/computer/security/telescreen{dir = 1; name = "Bunker Entrance"; network = list("Bunker1"); pixel_x = 0; pixel_y = 2},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bY" = (/obj/structure/table/reinforced,/obj/machinery/door_control{id = "bunker1"; name = "Inner Doors"; pixel_y = 6},/obj/machinery/door_control{id = "bunker2"; name = "Outer Doors"; pixel_y = -4},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"bZ" = (/obj/machinery/door/poddoor{id_tag = "bunker1"; name = "Bunker Door"; tag = "inner"},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"ca" = (/turf/simulated/floor/plating,/area/ruin/unpowered)
+"cb" = (/obj/machinery/camera{network = list("Bunker1")},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"cc" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"cd" = (/obj/machinery/door/poddoor{id_tag = "bunker2"; name = "Bunker Door"; tag = "outer"},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"ce" = (/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababab
+aaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaababababab
+aaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababaa
+aaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaababababababababababababababababaaaa
+aaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaababababababababababababababababababaaaa
+aaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa
+aaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa
+aaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaa
+aaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa
+aaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa
+aaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa
+aaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+aaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+aaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+aaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+aaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+aaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+aaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+aaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa
+aaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa
+aaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa
+aaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa
+aaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa
+aaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+aaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+aaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+aaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa
+aaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaa
+aaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaa
+aaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaa
+aaabababababababababababababababababababababababababababababababababababababababacacacacacacacacababababababababababababababababababababababababababababababababababaaaaaa
+aaabababababababababababababababababababababababababababababababababababababababacadaeafagahaiacabababababababababababababababababababababababababababababababababaaaaaaaa
+aaabababababababababababababababababababababababababababababababababababababababacajakalamanaoacababababababababababababababababababababababababababababababababaaaaaaaaaa
+ababababababababababababababababababababababababababababababababababababababababacapaqararasatacababababababababababababababababababababababababababababababababaaaaaaaaaa
+ababababababababababababababababababababababababababababababacacacacacacacacacacacacacauacacacacacabababababababababababababababababababababababababababababababaaaaaaaaaa
+aaabababababababababababababababababababababababababacacacacacavawacaxayazaAaBaCaDacaEaraFaFaGaGacabababababababababababababababababababababababababababababababaaaaaaaaaa
+aaabababababababababababababababababababababababababacaHaIaJacaKaLacaMarararararaNacaOaraFaFaGaPacababababababababababababababababababababababababababababababababaaaaaaaa
+aaaaababababababababababababababababababababababababacaQaRaSacaTaUacaVarararararaWacaXaraFaFaGaGacababababababababababababababababababababababababababababababababaaaaaaaa
+aaaaaaabababababababababababababababababababababababacaYaZbaacbbaUacacbcbcaubcbcacacaXararbdbdbdacababababababababababababababababababababababababababababababababaaaaaaaa
+aaaaaaaaabababababababababababababababababababacacacacacauacacacbeacbfarararararauararararbdbdbdacabababababababababababababababababababababababababababababababababaaaaaa
+aaaaaaaaabababababababababababababababababababacbgaracarararbhararararararararbiacacacacacacacacacabababababababababababababababababababababababababababababababababaaaaaa
+aaaaaaaaabababababababababababababababababababacbjarauarararararararbkblbmbnararacbobpbpboacababababababababababababababababababababababababababababababababababababaaaaaa
+aaaaaaaaabababababababababababababababababababacacacacacacauacacararacacacacararauararararacabababababababababababababababababababababababababababababababababababababaaaa
+aaaaaaaaaaababababababababababababababababababacbqbrbsbtararbuacarararararararbvacbwbpbpbwacabababababababababababababababababababababababababababababababababababababaaaa
+aaaaaaaaaaaaabababababababababababababababababacbxarbyarararbzacbAbBbCbDbEararbFacacacacacacabababababababababababababababababababababababababababababababababababababaaaa
+aaaaaaaaaaaaabababababababababababababababababacbGbHbIarararbJacbKbBbLbMbEararbNacabababababababababababababababababababababababababababababababababababababababababababaa
+aaaaaaaaaaaaaaababababababababababababababababacbOararararbPbQacbRbSbBbBbBararbTacabababababababababababababababababababababababababababababababababababababababababababaa
+aaaaaaaaaaaaaaababababababababababababababababacbUarararbVarbWacacacacacacacacacacabababababababababababababababababababababababababababababababababababababababababababaa
+aaaaaaaaaaaaabababababababababababababababababacarararbXbWbYbQacababababababababababababababababababababababababababababababababababababababababababababababababababababaa
+aaaaaaaaaaaaabababababababababababababababababacbZbZacacacacacacababababababababababababababababababababababababababababababababababababababababababababababababababababaa
+aaaaaaaaaaaaabababababababababababababababababaccacacacbccacababababababababababababababababababababababababababababababababababababababababababababababababababababababaa
+aaaaaaaaaaaaaaababababababababababababababababaccacacacacaacababababababababababababababababababababababababababababababababababababababababababababababababababababababaa
+aaaaaaaaaaaaaaaaabababababababababababababababacacacaccdcdacababababababababababababababababababababababababababababababababababababababababababababababababababababababaa
+aaaaaaaaaaaaaaaaababababababababababababababababcecececececeabababababababababababababababababababababababababababababababababababababababababababababababababababababaaaa
+aaaaaaaaaaaaaaaaabababababababababababababababcececececececeabababababababababababababababababababababababababababababababababababababababababababababababababababababaaaa
+aaaaaaaaaaaaaaaaabababababababababababababababcecececececeabababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaa
+aaaaaaaaaaaaaaaaabababababababababababababababcecececececeabababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaa
+aaaaaaaaaaaaaaaaababababababababababababababcececececeababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaa
+aaaaaaaaaaaaaaaaababababababababababababababcececececeababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaa
+aaaaaaaaaaaaaaaaaaabababababababababababababcececececeabababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaababababababababababababababcececececeabababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaababababababababababababababcecececececeababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaabababababababababababababcececececeababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababcececececeababababababababaaaaaaababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababcececececeababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict1.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict1.dmm
new file mode 100644
index 00000000000..bbbb2f1e366
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict1.dmm
@@ -0,0 +1,61 @@
+"a" = (/turf/space,/area/space)
+"b" = (/obj/structure/lattice,/turf/space,/area/space)
+"c" = (/turf/simulated/wall,/area/ruin/unpowered)
+"d" = (/obj/structure/alien/weeds,/obj/structure/alien/resin/membrane,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"e" = (/obj/structure/girder,/obj/structure/alien/weeds,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"f" = (/obj/structure/alien/weeds,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"g" = (/obj/structure/alien/weeds,/obj/structure/glasstable_frame,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"h" = (/obj/structure/alien/weeds/node,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"i" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"j" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/obj/effect/decal/remains/human,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"k" = (/obj/structure/alien/resin/wall,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"l" = (/obj/structure/alien/resin/membrane,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"m" = (/obj/structure/alien/weeds,/obj/structure/table,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"n" = (/obj/structure/alien/weeds,/obj/effect/decal/remains/robot,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"o" = (/obj/structure/alien/weeds/node,/obj/structure/table,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"p" = (/obj/structure/girder,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"q" = (/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"r" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/obj/effect/decal/remains/xeno,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaabbbaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaabbbbaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabbbaabbbbbbbaaaaaaaaaaaaaaa
+aaaaaaaaaaabbbbbcccccdcccaaaaaaaaaaaaaaa
+aaaaaaaaaabbbbbefcghcfijcbbbbbaaaaaaaaaa
+aaaaaaaaabbbbkkffcffcfffccbbbbbaaaaaaaaa
+aaaaaaaaabbbkffhfcffcfhffcclbbbaaaaaaaaa
+aaaaaaaaaabkffiffcffcfffffmlbbbaaaaaaaaa
+aaaaaaaaaabcfffffffffffffnopbbaaaaaaaaaa
+aaaaaaaaaaaaecceccffcccecccpbaaaaaaaaaaa
+aaaaaaaaaaaaacmfjffffffifcaaaaaaaaaaaaaa
+aaaaaaaaaaabccmhfjffffhficaaaaaaaaaaaaaa
+aaaaaaaaaabbdffffffffiffkqbaaaaaaaaaaaaa
+aaaaaaaaaabbpcccccffccckqbbaaaaaaaaaaaaa
+aaaaaaaaaabbbbbchfffficqpbaaaaaaaaaaaaaa
+aaaaaaaaaabbbaacfffffgcbbbaaaaaaaaaaaaaa
+aaaaaaaaaabbaaacelfrfdhbbaaaaaaaaaaaaaaa
+aaaaaaaaaabaaaaabblddbbbbaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaabqbbbbbaaaaaaaaaaaaaaaa
+aaaaaaaaabaaaaaaaabbbaaaaaaaaaaaaaaaaaaa
+aaaaaaabbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaabaacbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aabbbcqqbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+abbqqqqqbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bpcqqqqqbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bpqqqqcbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+bpqqqqqbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+accccpbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaabbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm
new file mode 100644
index 00000000000..7979e6b5e9b
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm
@@ -0,0 +1,61 @@
+"a" = (/turf/space,/area/space)
+"b" = (/obj/structure/window/reinforced{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/turf/space,/area/space)
+"c" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/ruin/powered)
+"d" = (/obj/structure/window/reinforced{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/turf/space,/area/space)
+"e" = (/obj/structure/window/reinforced{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/obj/structure/window/reinforced{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/turf/simulated/floor/plating,/area/ruin/powered)
+"f" = (/turf/simulated/wall,/area/ruin/powered)
+"g" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/ruin/powered)
+"h" = (/obj/machinery/light/small{tag = "icon-bulb1 (NORTH)"; icon_state = "bulb1"; dir = 1},/turf/simulated/floor/plasteel,/area/ruin/powered)
+"i" = (/turf/simulated/floor/plasteel,/area/ruin/powered)
+"j" = (/obj/machinery/light/small{tag = "icon-bulb1 (EAST)"; icon_state = "bulb1"; dir = 4},/turf/simulated/floor/plasteel,/area/ruin/powered)
+"k" = (/obj/structure/window/reinforced,/turf/space,/area/space)
+"l" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/turf/simulated/floor/plating,/area/ruin/powered)
+"m" = (/obj/structure/stool/bed/chair{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/obj/effect/decal/remains/human,/turf/simulated/floor/plasteel,/area/ruin/powered)
+"n" = (/obj/structure/table,/obj/item/candle{pixel_y = 5},/obj/item/trash/plate{pixel_x = 10},/obj/item/trash/plate{pixel_x = -10},/turf/simulated/floor/plasteel,/area/ruin/powered)
+"o" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/obj/effect/decal/remains/human,/turf/simulated/floor/plasteel,/area/ruin/powered)
+"p" = (/obj/structure/window/reinforced{tag = "icon-rwindow (NORTH)"; icon_state = "rwindow"; dir = 1},/turf/space,/area/space)
+"q" = (/obj/machinery/light/small{tag = "icon-bulb1 (WEST)"; icon_state = "bulb1"; dir = 8},/turf/simulated/floor/plasteel,/area/ruin/powered)
+"r" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel,/area/ruin/powered)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaabcdaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaabedaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaabedaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaabedaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaafgcgfaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaafhiiiifaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaafiiiiiijfaaaaaaaaaaaaaaa
+aaaaaaaaaaaakkkkgiiiiiiigkkkkaaaaaaaaaaa
+aaaaaaaaaaaaclllciimnoiiclllcaaaaaaaaaaa
+aaaaaaaaaaaappppgiiiiiiigppppaaaaaaaaaaa
+aaaaaaaaaaaaaaaafqiiiiiifaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaafiiiirfaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaafgcgfaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaabedaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaabedaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaabedaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaabcdaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm
new file mode 100644
index 00000000000..7838d369fda
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm
@@ -0,0 +1,48 @@
+"a" = (/turf/space,/area/space)
+"b" = (/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"c" = (/turf/simulated/wall,/area/ruin/unpowered)
+"d" = (/obj/structure/lattice,/turf/space,/area/space)
+"e" = (/obj/structure/lattice,/obj/structure/lattice,/turf/space,/area/space)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaabbbbaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaabbbbbbbaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaabbbcbbbaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaadbbbcccbbbdaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaadbbcbcbcbbdaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaadbbbbcbcbbddaaaaaaaa
+aaaaaaaaaaaaaaaaaaadddbbbbbbbbdddaaaaaaa
+aaaaaaaaaaaaaaaaaaadddddbbbddddbddaaaaaa
+aaaaaaaaaaaaaaaaaadbddddddddddddddaaaaaa
+aaaaaaaaaaaaaaaaadddddddddddddddddaaaaaa
+aaaaaaaaaaaaaaaaddbbbbbddbdddbbbbdaaaaaa
+aaaaaaaaaaaaaaaadbbccbbbdddbbbbbbdaaaaaa
+aaaaaaaaaaaaaaaabbbcbbbbdddbbbbcbbaaaaaa
+aaaaaaaaaaaaaaabbbbcbbbbddbbbbbcbbaaaaaa
+aaaaaaaaaaaaaaabcccbbbddddbbbbcbbbaaaaaa
+aaaaaaaaaaaaaadbbbbcbbddddbbbccccbaaaaaa
+aaaaaaaaaaaaaadbbbbbbddbddbbbbcbbaaaaaaa
+aaaaaaaaaaaaadddbbbbbdddddbbbbcbbaaaaaaa
+aaaaaaaaaaaaaddddddddddaaddbbbbbaaaaaaaa
+aaaaaaaaaaaaadddaaaaaaaaaaddabbaaaaaaaaa
+aaaaaaaaaaaaddaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaabbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aacbbdddaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aacbbbdddddaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aacbbbddddaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aacbbbbbddeaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aacbbbbbbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaacbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaacccccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm
new file mode 100644
index 00000000000..4c278585ac7
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm
@@ -0,0 +1,63 @@
+"a" = (/turf/space,/area/space)
+"b" = (/turf/simulated/mineral,/area/ruin/unpowered)
+"c" = (/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered)
+"d" = (/turf/simulated/mineral/random/high_chance,/area/ruin/unpowered)
+"e" = (/turf/simulated/shuttle/wall,/area/ruin/unpowered)
+"f" = (/obj/machinery/door/airlock/shuttle,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"g" = (/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"h" = (/turf/simulated/floor/plasteel/airless{icon_plating = "plating"; icon_regular_floor = "shuttlefloor"; icon_state = "shuttlefloor"},/area/ruin/unpowered)
+"i" = (/obj/structure/stool/bed/chair,/obj/structure/window/reinforced{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/turf/simulated/floor/plasteel/airless{icon_plating = "plating"; icon_regular_floor = "shuttlefloor"; icon_state = "shuttlefloor"},/area/ruin/unpowered)
+"j" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel/airless{icon_plating = "plating"; icon_regular_floor = "shuttlefloor"; icon_state = "shuttlefloor"},/area/ruin/unpowered)
+"k" = (/obj/effect/spawner/lootdrop/crate_spawner,/turf/simulated/floor/plasteel/airless{icon_plating = "plating"; icon_regular_floor = "shuttlefloor"; icon_state = "shuttlefloor"},/area/ruin/unpowered)
+"l" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (WEST)"; icon_state = "propulsion"; dir = 8},/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"m" = (/obj/item/weapon/shard,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"n" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"o" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"p" = (/obj/structure/table,/turf/simulated/floor/plasteel/airless{icon_plating = "plating"; icon_regular_floor = "shuttlefloor"; icon_state = "shuttlefloor"},/area/ruin/unpowered)
+"q" = (/obj/item/weapon/shard,/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel/airless{icon_plating = "plating"; icon_regular_floor = "shuttlefloor"; icon_state = "shuttlefloor"},/area/ruin/unpowered)
+"r" = (/obj/structure/stool/bed/chair{dir = 1},/obj/structure/window/reinforced{tag = "icon-rwindow (WEST)"; icon_state = "rwindow"; dir = 8},/turf/simulated/floor/plasteel/airless{icon_plating = "plating"; icon_regular_floor = "shuttlefloor"; icon_state = "shuttlefloor"},/area/ruin/unpowered)
+"s" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"t" = (/obj/structure/girder,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaabbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaabbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaacccbbbbaaaaaaaaaaaaaaabaaaaaaaaaaaa
+aaaaacccbbbbaaaaaaaaaaaaaabbbaaaaaaaaaaa
+aaaaaaccbbaaaaaaaaaaaaaaaabbbaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabbdddddbbaaabbbbaaaaaaaaaaa
+aaaaaaaaaaabbbbddddbbbbbbbbbbbaaaaaaaaaa
+aaaaaaaaaaacbbbbbdbbbbbbbbbbbbbaaaaaaaaa
+aaaaaaaaccccbbbbbbbbbccbbdddbbbaaaaaaaaa
+aaaaaaaacccccbddbbccccccccccbccaaaaaaaaa
+aaaaaaaaaccccbddbbeeeefeeeeecccaaaaaaaaa
+aaaaaaaaacccccbbbgggghhijkelcccaaaaaaaaa
+aaaaaaaaacccccbbbgmnhhhhhhelcccaaaaaaaaa
+aaaaaaaaaccccbbbbopqhhhhhgelcccaaaaaaaaa
+aaaaaaaaaccccbbdbbghhhhrsgelcaaaaaaaaaaa
+aaaaaaaaaabccbbbbbeeeefetgeecaaaaaaaaaaa
+aaaaaabaaabbbbbbbccccccccccccaaaaaaaaaaa
+aaaaaaaaaabbbbbbbbbbcccccccccaaaaaaaaaaa
+aaabaaaaaaaabbbbbbbbbccccaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabdbbdddbccccaaaaaaaaaaaaaaa
+aaaaabbaaaaaaaaabdddbbbaaaaaaaaaaaaabaaa
+aaaabbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaabbaaaaaaaaaaaaaaaabbbaaaaaaaaaccbbaa
+aaaaaaaaaaaaaaaaaaaaadbbbbaaaaaaacccdbaa
+aaaaaaaaaaaaaaaaaaadbbbbccaaaaaaacbdbaaa
+aaaaaaaaaaaaaaaaaadbbbbcaaaaaaaaacbbbaaa
+aaaaaaaaaaaaaaaaaddbbcccaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaababbbbbcccaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaabbbbbccccaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaabbbbdcccaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaabbcccccaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaabccaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm b/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm
new file mode 100644
index 00000000000..b37590b3578
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm
@@ -0,0 +1,61 @@
+"a" = (/turf/space,/area/space)
+"b" = (/turf/simulated/mineral,/area/ruin/unpowered)
+"c" = (/turf/simulated/mineral,/area/space)
+"d" = (/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered)
+"e" = (/turf/simulated/wall,/area/ruin/unpowered)
+"f" = (/turf/simulated/wall/rust,/area/ruin/unpowered)
+"g" = (/turf/simulated/floor/plating,/area/ruin/unpowered)
+"h" = (/obj/structure/closet/crate,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"i" = (/obj/effect/spawner/lootdrop/crate_spawner,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"j" = (/obj/structure/barricade/wooden,/obj/structure/door_assembly,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"k" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"l" = (/obj/effect/decal/remains/human,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"m" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"n" = (/obj/structure/table,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"o" = (/obj/structure/barricade/wooden,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"p" = (/obj/structure/barricade/wooden,/obj/machinery/door/airlock/external,/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered)
+"q" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"r" = (/turf/simulated/floor/plating/airless/asteroid,/area/space)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbabbaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaacaaaabbbbaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbaaaaaa
+aaaaaaaaaaabbbbbaaaaaaaaaaaaaaaaaaaabaaa
+aaaaaaaabbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaabbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaa
+aaaaaadbbbbbbbbbbbbbbbaaaaaaaaaaaabaaaaa
+aaaaaadbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaa
+aaaaaddbbbbbbbbbeefbbeebbbbbbbaaaaaaaaaa
+aaaaaddbbbbbbbbgggeggghfibbbbbbbaaaaaaaa
+aaaaaddddbbbbbfiggjggghfhebbbbbbaaaaaaaa
+aaaaaddddbbbbbfigkfigggjgfbbbbbbbbaaaaaa
+aaaaaaaddbbbbbelgmfhggnffebbbbbbbbaaaaaa
+aaaaaaadddbbbbfghieiggggibbbbbbbbbbbaaaa
+aaaaaaaaddbbbbeffeeeejeeebbbbbbbbbbbaaaa
+aaaaaaaaddbbbbegggdggggdebbbbbbbbbbbaaaa
+aaaaaaaaddddbbegggigdgdobbbbbbbbbbbbaaaa
+aaabaaaaadddddbbebeffeepebbbbbbbbbbbaaaa
+aaaaaaaaaaadddbbbbbbbbeoebbbbbbbbbbbbaaa
+aaaaaaaaaaadddddddbbbbeqebbbbbbbbbbbbaaa
+aaaaaaaaaaaaadddddbbbbbdbbbbbbbbbbbbbaaa
+aaaaabaaaaaaadddddddddddddbbbbbbbbbbbaaa
+aaaaaaaaaaaaaaaaadddddddddbccbbbbbbbbaaa
+aaaaaaabbaaaaaaaaaddddddddbccbbbbbbbbaaa
+aaaaaaabbbbaaaaaaarrrrrrrrrccddbbbbbbaaa
+aaaaaaabbbbaaaaaaarrdddddddddddddbbbbbaa
+aaaaaaaaabbaaaaaaaaddddddddddddddbbbbbaa
+aaaaaaaaabbaaaaaaaaddddddddddddddbbbbbaa
+aaaaaaaaaaaaaaaaaaaddddddddddddddbbbbbaa
+aaaaaaaaaaaaaaaaabbdddddddddddddddbbbbaa
+abbaaaaaaaaaaaaaabbdddddddddddddddbbbbaa
+abbaaaaaaaaaaaaaabbbbdddddddddddbbbbbbaa
+abbbaaaaaaaaaaaaaabbbdddddddddddbbbbbaaa
+aaaaaaaaaaaaaaaaaabbbbbbbdddddbbbbbbbaaa
+aaaaaaaaaaaaaaaaaaaabbbbbbddddbbbbbbbaaa
+aaaaabaaaaaaaaaaaaaabbbbbbbbbbbbbbaaaaaa
+aaabaaaaaaaaaaaaaaaaaabbbbbbbbbaaaaaaaaa
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/emptyshell.dmm b/_maps/map_files/RandomRuins/SpaceRuins/emptyshell.dmm
new file mode 100644
index 00000000000..57b0a43add2
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/emptyshell.dmm
@@ -0,0 +1,28 @@
+"a" = (/turf/space,/area/space)
+"b" = (/obj/structure/lattice,/turf/space,/area/space)
+"c" = (/turf/simulated/wall/r_wall,/area/ruin/unpowered)
+"d" = (/turf/simulated/floor/plating,/area/ruin/unpowered)
+"e" = (/obj/effect/spawner/lootdrop/crate_spawner,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"f" = (/obj/item/ammo_box/magazine/sniper_rounds,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"g" = (/obj/item/stack/rods,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"h" = (/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"i" = (/obj/machinery/door/airlock,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"j" = (/obj/item/stack/cable_coil,/turf/simulated/floor/plating,/area/ruin/unpowered)
+
+(1,1,1) = {"
+aaaaaaaaabaaaaaaa
+aaabbaaababaabaaa
+aaabccccccccccaba
+aabccccccccccccaa
+abacccdeddfdcccba
+abaccddddddedccbb
+bbbdcdgddddddccbb
+aadhiddgdedddccaa
+aadhiddedddddccbb
+abbdcddddddgdccbb
+aaaccjdeddeddccbb
+aaacccdddddecccaa
+aaaccccccccccccba
+aabaccccccccccaaa
+aaaabbaaaaaaaaaaa
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/gasthelizards.dmm b/_maps/map_files/RandomRuins/SpaceRuins/gasthelizards.dmm
new file mode 100644
index 00000000000..b9256b7c62f
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/gasthelizards.dmm
@@ -0,0 +1,61 @@
+"a" = (/turf/space,/area/space)
+"b" = (/obj/structure/lattice,/turf/space,/area/space)
+"c" = (/turf/simulated/wall,/area/ruin/unpowered)
+"d" = (/obj/machinery/light{dir = 1},/obj/structure/stool/bed,/obj/effect/decal/remains/human,/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 8},/area/ruin/unpowered)
+"e" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 4},/area/ruin/unpowered)
+"f" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/light{dir = 1},/obj/structure/stool/bed,/obj/effect/decal/remains/human,/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 8},/area/ruin/unpowered)
+"g" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/light{dir = 1},/obj/structure/stool/bed,/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 8},/area/ruin/unpowered)
+"h" = (/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 4},/area/ruin/unpowered)
+"i" = (/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 8},/area/ruin/unpowered)
+"j" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/machinery/atmospherics/unary/outlet_injector,/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 4},/area/ruin/unpowered)
+"k" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 8},/area/ruin/unpowered)
+"l" = (/obj/machinery/atmospherics/unary/outlet_injector,/turf/simulated/floor/plasteel{icon_state = "warndark"; dir = 4},/area/ruin/unpowered)
+"m" = (/obj/structure/closet/crate/freezer,/obj/item/stack/sheet/animalhide/lizard,/obj/item/weapon/reagent_containers/food/snacks/lizardmeat,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"n" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/snacks/lizardmeat,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"o" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/snacks/lizardmeat,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"p" = (/obj/machinery/power/apc/worn_out{dir = 8; pixel_x = -24; pixel_y = 0; cell_type = 2500; operating = 1},/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/ruin/unpowered)
+"q" = (/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/ruin/unpowered)
+"r" = (/obj/machinery/door/window/brigdoor/northleft,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/ruin/unpowered)
+"s" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"t" = (/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"u" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"v" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"w" = (/obj/structure/kitchenspike,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"x" = (/obj/structure/table/reinforced,/obj/item/weapon/kitchen/knife/butcher,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"y" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"z" = (/obj/machinery/gibber,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"A" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/straight_jacket,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"B" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"C" = (/obj/machinery/door/airlock/security,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"D" = (/obj/item/weapon/reagent_containers/glass/bottle/morphine{pixel_x = -4; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/bottle/toxin{pixel_x = 6; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/morphine{pixel_x = 5; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/bottle/facid{name = "fluorosulfuric acid bottle"; pixel_x = -3; pixel_y = 6},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"E" = (/obj/structure/rack,/obj/item/weapon/melee/baton/cattleprod,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"F" = (/obj/structure/table,/obj/item/weapon/pen/red,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"G" = (/obj/structure/table,/obj/item/weapon/paper_bin,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"H" = (/obj/structure/table,/obj/item/weapon/storage/box/prisoner,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"I" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/machinery/light,/obj/structure/table,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"J" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/ruin/unpowered)
+"K" = (/obj/structure/table/reinforced,/obj/item/weapon/surgicaldrill,/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/item/weapon/surgical_drapes,/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/item/weapon/circular_saw,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"L" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"M" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/glass/bottle/mutagen,/obj/item/weapon/reagent_containers/glass/bottle/mutagen,/obj/item/weapon/razor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"N" = (/obj/machinery/suit_storage_unit/security,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"O" = (/obj/machinery/light,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"P" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"Q" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"R" = (/turf/simulated/floor/plating,/area/ruin/unpowered)
+
+(1,1,1) = {"
+aaaababababbaaaaaaa
+aaababbbbababbbbaaa
+aaabccccccccccbbbba
+abbbcdefegefhccccca
+abbbcijkjkjklcmnocb
+abcccprqrqrqrcssscb
+abctutttttttvcwsxca
+aacytttttttttczsAca
+bbcBtttttttttCssDcb
+abcEtttFGHIJJcKLMcb
+abcNOtPcccccccccccb
+aacccQccbbbbbbaabba
+aabbcRcbbaaaaaaabaa
+aaabcQcbaaaaaaaaaaa
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm b/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm
new file mode 100644
index 00000000000..a276d0aa296
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm
@@ -0,0 +1,44 @@
+"a" = (/turf/space,/area/space)
+"b" = (/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/ruin/powered)
+"c" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/ruin/powered)
+"d" = (/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/ruin/powered)
+"e" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/space,/area/ruin/powered)
+"f" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/turf/simulated/floor/plating,/area/ruin/powered)
+"g" = (/obj/structure/table/woodentable,/obj/item/clothing/under/shorts/black,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+"h" = (/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+"i" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+"j" = (/obj/structure/closet,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+"k" = (/obj/machinery/vending/assist,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+"l" = (/obj/structure/table/woodentable,/obj/item/clothing/shoes/sandal,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+"m" = (/obj/machinery/light{dir = 8},/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+"n" = (/obj/structure/table/woodentable,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+"o" = (/obj/structure/table/woodentable,/obj/machinery/computer/library/checkout,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+"p" = (/obj/structure/window/full/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area/ruin/powered)
+"q" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/ruin/powered)
+"r" = (/obj/structure/table,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+"s" = (/obj/machinery/door/poddoor{id_tag = "strange ship"; name = "Strange Ship Blast Door"},/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+"t" = (/obj/machinery/door/airlock/external,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+"u" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+"v" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+"w" = (/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+"x" = (/obj/machinery/door_control{name = "Strange Ship Door Control"; pixel_x = 6; pixel_y = 0; id = "strange ship"},/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/ruin/powered)
+"y" = (/obj/machinery/light,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+"z" = (/mob/living/simple_animal/bot/medbot,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+"A" = (/turf/simulated/shuttle/wall{dir = 2; icon_state = "diagonalWall3"},/area/ruin/powered)
+"B" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+"C" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/ruin/powered)
+"D" = (/obj/machinery/light,/obj/structure/stool/bed,/turf/simulated/shuttle/floor{tag = "icon-floor5"; icon_state = "floor5"},/area/ruin/powered)
+
+(1,1,1) = {"
+aabcccccdaaaa
+aefghijkcaaaa
+aeflhhhhccccd
+bccccmhhcmhjc
+cnophhhhqhhrc
+shhthhhhuhvwc
+xhypzhhhqhhnc
+Accccmhhcmhjc
+aefBhhhhccccC
+aefnnDhjcaaaa
+aaAcccccCaaaa
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm
new file mode 100644
index 00000000000..e36e1170233
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm
@@ -0,0 +1,62 @@
+"a" = (/turf/space,/area/space)
+"b" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"},/area/ruin/powered)
+"c" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/space,/area/ruin/powered)
+"d" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"},/area/ruin/powered)
+"e" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/ruin/powered)
+"f" = (/obj/structure/closet/crate/secure/loot,/turf/simulated/shuttle/floor,/area/ruin/powered)
+"g" = (/obj/structure/table,/obj/machinery/door_control{id = "mecha cargo"},/turf/simulated/shuttle/floor,/area/ruin/powered)
+"h" = (/obj/structure/table,/turf/simulated/shuttle/floor,/area/ruin/powered)
+"i" = (/obj/machinery/computer/shuttle,/turf/simulated/shuttle/floor,/area/ruin/powered)
+"j" = (/obj/effect/decal/cleanable/vomit,/turf/simulated/shuttle/floor,/area/ruin/powered)
+"k" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor,/area/ruin/powered)
+"l" = (/turf/simulated/shuttle/floor,/area/ruin/powered)
+"m" = (/obj/structure/stool/bed/chair/office/dark{tag = "icon-officechair_dark (NORTH)"; icon_state = "officechair_dark"; dir = 1},/turf/simulated/shuttle/floor,/area/ruin/powered)
+"n" = (/obj/machinery/computer/mecha,/turf/simulated/shuttle/floor,/area/ruin/powered)
+"o" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"},/area/ruin/powered)
+"p" = (/obj/machinery/door/airlock/hatch,/turf/simulated/shuttle/floor{tag = "icon-floor3"; icon_state = "floor3"},/area/ruin/powered)
+"q" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/ruin/powered)
+"r" = (/turf/simulated/shuttle/floor{tag = "icon-floor3"; icon_state = "floor3"},/area/ruin/powered)
+"s" = (/obj/effect/decal/mecha_wreckage/phazon,/turf/simulated/shuttle/floor{tag = "icon-floor2"; icon_state = "floor2"},/area/ruin/powered)
+"t" = (/turf/simulated/shuttle/floor{tag = "icon-floor2"; icon_state = "floor2"},/area/ruin/powered)
+"u" = (/obj/effect/decal/mecha_wreckage/ripley/firefighter,/turf/simulated/shuttle/floor{tag = "icon-floor2"; icon_state = "floor2"},/area/ruin/powered)
+"v" = (/obj/effect/decal/mecha_wreckage/ripley,/turf/simulated/shuttle/floor{tag = "icon-floor2"; icon_state = "floor2"},/area/ruin/powered)
+"w" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/shuttle/floor{tag = "icon-floor2"; icon_state = "floor2"},/area/ruin/powered)
+"x" = (/obj/effect/decal/cleanable/blood/gibs/robot/up,/turf/simulated/shuttle/floor{tag = "icon-floor2"; icon_state = "floor2"},/area/ruin/powered)
+"y" = (/obj/machinery/door/poddoor{id_tag = "mecha cargo"; name = "Cargo Bay Door"; tag = ""},/turf/space,/area/ruin/powered)
+"z" = (/obj/effect/decal/cleanable/blood/gibs/robot,/turf/simulated/shuttle/floor{tag = "icon-floor2"; icon_state = "floor2"},/area/ruin/powered)
+"A" = (/obj/effect/decal/mecha_wreckage/durand,/turf/simulated/shuttle/floor{tag = "icon-floor2"; icon_state = "floor2"},/area/ruin/powered)
+"B" = (/obj/item/stack/tile/plasteel{pixel_x = 7; pixel_y = 8},/turf/simulated/floor/plating/airless,/area/ruin/powered)
+"C" = (/turf/simulated/floor/plating/airless,/area/ruin/powered)
+"D" = (/obj/structure/lattice,/turf/space,/area/space)
+"E" = (/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/ruin/powered)
+"F" = (/obj/effect/decal/cleanable/blood/gibs/robot,/turf/simulated/floor/plating/airless,/area/ruin/powered)
+"G" = (/obj/item/stack/tile/plasteel{pixel_x = 7; pixel_y = 8},/obj/effect/decal/cleanable/blood/gibs/robot,/turf/simulated/shuttle/floor{tag = "icon-floor2"; icon_state = "floor2"},/area/ruin/powered)
+"H" = (/turf/unsimulated/floor/plating/airless{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/ruin/powered)
+"I" = (/turf/unsimulated/floor/plating/airless{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/ruin/powered)
+"J" = (/obj/effect/decal/mecha_wreckage/odysseus,/turf/simulated/shuttle/floor{tag = "icon-floor2"; icon_state = "floor2"},/area/ruin/powered)
+"K" = (/obj/item/stack/sheet/metal,/turf/space,/area/space)
+"L" = (/obj/effect/decal/mecha_wreckage/gygax,/turf/simulated/shuttle/floor{tag = "icon-floor3"; icon_state = "floor3"},/area/ruin/powered)
+"M" = (/turf/unsimulated/floor/plating/airless,/area/space)
+"N" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"},/area/ruin/powered)
+"O" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"},/area/ruin/powered)
+"P" = (/obj/item/stack/rods,/turf/space,/area/space)
+"Q" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"},/area/ruin/powered)
+"R" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/ruin/powered)
+
+(1,1,1) = {"
+abcccccda
+aeffghiea
+aejklmnea
+bopqqqqod
+errrrrrre
+esttutvte
+ewtxtvtty
+ezABtttty
+BCtAtCtty
+DECtFGtwy
+HCIBJJtty
+KDDCrCLre
+aMDKECqNO
+aPaaDabQd
+aaaaaaRRR
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm b/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm
new file mode 100644
index 00000000000..30445ea3b05
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm
@@ -0,0 +1,196 @@
+"aa" = (/turf/space,/area/space)
+"ab" = (/obj/structure/lattice,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/space,/area/space)
+"ac" = (/obj/structure/lattice,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/space,/area/space)
+"ad" = (/obj/structure/lattice,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/space,/area/space)
+"ae" = (/obj/structure/lattice,/obj/item/stack/cable_coil/cut{amount = 2; dir = 2; icon_state = "coil_red2"},/turf/space,/area/space)
+"af" = (/obj/structure/lattice,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/space,/area/space)
+"ag" = (/turf/simulated/wall,/area/ruin/onehalf/dorms_med)
+"ah" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/ruin/onehalf/dorms_med)
+"ai" = (/obj/structure/lattice,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/space,/area/space)
+"aj" = (/turf/unsimulated/floor/plating/airless,/area/ruin/onehalf/hallway)
+"ak" = (/turf/simulated/wall,/area/ruin/onehalf/hallway)
+"al" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-white"; icon_state = "white"},/area/ruin/onehalf/dorms_med)
+"am" = (/turf/simulated/floor/plasteel{tag = "icon-white"; icon_state = "white"},/area/ruin/onehalf/dorms_med)
+"an" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin{pixel_x = 3; pixel_y = 5},/obj/item/weapon/storage/firstaid/fire,/turf/simulated/floor/plasteel{tag = "icon-white"; icon_state = "white"},/area/ruin/onehalf/dorms_med)
+"ao" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/plasteel,/area/ruin/onehalf/dorms_med)
+"ap" = (/turf/simulated/floor/plasteel,/area/ruin/onehalf/dorms_med)
+"aq" = (/obj/machinery/door/airlock/external,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/ruin/onehalf/drone_bay)
+"ar" = (/turf/simulated/wall,/area/ruin/onehalf/drone_bay)
+"as" = (/obj/machinery/door/poddoor{id_tag = "bayext1"; name = "mining drone bay blast door"},/turf/simulated/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/ruin/onehalf/drone_bay)
+"at" = (/obj/machinery/door/poddoor{id_tag = "bayext2"; name = "mining drone bay blast door"},/turf/simulated/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/ruin/onehalf/drone_bay)
+"au" = (/obj/machinery/door/poddoor/preopen{id_tag = "bayext3"; name = "mining drone bay blast door"},/turf/simulated/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/ruin/onehalf/drone_bay)
+"av" = (/obj/machinery/door/poddoor{id_tag = "bayext4"; name = "mining drone bay blast door"},/turf/simulated/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/ruin/onehalf/drone_bay)
+"aw" = (/obj/structure/lattice,/turf/space,/area/space)
+"ax" = (/obj/structure/lattice,/turf/space,/area/ruin/onehalf/hallway)
+"ay" = (/obj/structure/glasstable_frame,/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/ruin/onehalf/hallway)
+"az" = (/obj/machinery/washing_machine,/turf/simulated/floor/plasteel/airless,/area/ruin/onehalf/hallway)
+"aA" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{tag = "icon-white"; icon_state = "white"},/area/ruin/onehalf/dorms_med)
+"aB" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/table,/obj/item/weapon/storage/firstaid/brute{pixel_x = 3; pixel_y = 6},/obj/item/weapon/storage/firstaid,/turf/simulated/floor/plasteel{tag = "icon-white"; icon_state = "white"},/area/ruin/onehalf/dorms_med)
+"aC" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel,/area/ruin/onehalf/dorms_med)
+"aD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/ruin/onehalf/drone_bay)
+"aE" = (/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plating/airless,/area/ruin/onehalf/drone_bay)
+"aF" = (/obj/structure/disposalpipe/trunk,/obj/item/weapon/ore/diamond,/turf/simulated/floor/plating/airless,/area/ruin/onehalf/drone_bay)
+"aG" = (/turf/simulated/floor/plating/airless{dir = 1; icon_state = "warnplate"},/area/ruin/onehalf/drone_bay)
+"aH" = (/obj/item/stack/rods,/turf/space,/area/ruin/onehalf/hallway)
+"aI" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/ruin/onehalf/hallway)
+"aJ" = (/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{tag = "icon-white"; icon_state = "white"},/area/ruin/onehalf/dorms_med)
+"aK" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-white"; icon_state = "white"},/area/ruin/onehalf/dorms_med)
+"aL" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable,/obj/machinery/power/apc{keep_preset_name = 1; name = "Hallway APC"; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/plasteel/airless,/area/ruin/onehalf/hallway)
+"aM" = (/obj/structure/disposalpipe/segment,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{id_tag = "bayint1"; name = "mining drone bay blast door"},/turf/simulated/floor/plating,/area/ruin/onehalf/drone_bay)
+"aN" = (/obj/machinery/door_control{id = "bayint1"; name = "Pod Bay 1 Internal"; pixel_x = -5; pixel_y = -6},/obj/machinery/door_control{id = "bayext1"; name = "Pod Bay 1 External"; pixel_x = -5; pixel_y = 6},/obj/machinery/door_control{id = "bayint2"; name = "Pod Bay 2 Internal"; pixel_x = 7; pixel_y = -6},/obj/machinery/door_control{id = "bayext2"; name = "Pod Bay 2 External"; pixel_x = 7; pixel_y = 6},/turf/simulated/wall,/area/ruin/onehalf/drone_bay)
+"aO" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{id_tag = "bayint2"; name = "mining drone bay blast door"},/turf/simulated/floor/plating,/area/ruin/onehalf/drone_bay)
+"aP" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{id_tag = "bayint3"; name = "mining drone bay blast door"},/turf/simulated/floor/plating,/area/ruin/onehalf/drone_bay)
+"aQ" = (/obj/machinery/door_control{id = "bayint3"; name = "Pod Bay 3 Internal"; pixel_x = -5; pixel_y = -6},/obj/machinery/door_control{id = "bayext3"; name = "Pod Bay 3 External"; pixel_x = -5; pixel_y = 6},/obj/machinery/door_control{id = "bayint4"; name = "Pod Bay 4 Internal"; pixel_x = 7; pixel_y = -6},/obj/machinery/door_control{id = "bayext4"; name = "Pod Bay 4 External"; pixel_x = 7; pixel_y = 6},/turf/simulated/wall,/area/ruin/onehalf/drone_bay)
+"aR" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{id_tag = "bayint4"; name = "mining drone bay blast door"},/turf/simulated/floor/plating,/area/ruin/onehalf/drone_bay)
+"aS" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/plating/airless,/area/ruin/onehalf/drone_bay)
+"aT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/ruin/onehalf/hallway)
+"aU" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged1"},/area/ruin/onehalf/hallway)
+"aV" = (/obj/machinery/door/airlock/glass_medical{name = "airlock"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-white"; icon_state = "white"},/area/ruin/onehalf/dorms_med)
+"aW" = (/obj/machinery/door/airlock,/turf/simulated/floor/plasteel,/area/ruin/onehalf/dorms_med)
+"aX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/ruin/onehalf/drone_bay)
+"aY" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/closet/crate/medical,/obj/item/clothing/accessory/stethoscope,/obj/item/device/healthanalyzer,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/power/apc{dir = 4; keep_preset_name = 1; name = "Crew Quarters APC"; pixel_x = 27},/turf/simulated/floor/plasteel{tag = "icon-white"; icon_state = "white"},/area/ruin/onehalf/dorms_med)
+"aZ" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ruin/onehalf/drone_bay)
+"ba" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ruin/onehalf/drone_bay)
+"bb" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/ruin/onehalf/drone_bay)
+"bc" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/ruin/onehalf/drone_bay)
+"bd" = (/obj/item/stack/sheet/metal,/turf/unsimulated/floor/plating/airless{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/ruin/onehalf/hallway)
+"be" = (/obj/structure/disposalpipe/broken{tag = "icon-pipe-b (EAST)"; icon_state = "pipe-b"; dir = 4},/obj/item/stack/cable_coil/cut{amount = 2; dir = 2; icon_state = "coil_red2"},/turf/unsimulated/floor/plating/airless,/area/ruin/onehalf/hallway)
+"bf" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/ruin/onehalf/hallway)
+"bg" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/ruin/onehalf/hallway)
+"bh" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel/airless,/area/ruin/onehalf/hallway)
+"bi" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (EAST)"; icon_state = "pipe-j1"; dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel/airless{icon_state = "damaged1"},/area/ruin/onehalf/hallway)
+"bj" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel/airless,/area/ruin/onehalf/hallway)
+"bk" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j1"; dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel/airless,/area/ruin/onehalf/hallway)
+"bl" = (/obj/machinery/door/airlock/glass{name = "glass airlock"},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel,/area/ruin/onehalf/drone_bay)
+"bm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/ruin/onehalf/drone_bay)
+"bn" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/ruin/onehalf/drone_bay)
+"bo" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/ruin/onehalf/drone_bay)
+"bp" = (/obj/machinery/door/airlock/maintenance_hatch{name = "maintenance hatch"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/ruin/onehalf/drone_bay)
+"bq" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel,/area/ruin/onehalf/drone_bay)
+"br" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-y"; dir = 1},/turf/simulated/floor/plasteel,/area/ruin/onehalf/drone_bay)
+"bs" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/plating,/area/ruin/onehalf/drone_bay)
+"bt" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/ruin/onehalf/drone_bay)
+"bu" = (/obj/structure/disposalpipe/broken{tag = "icon-pipe-b (EAST)"; icon_state = "pipe-b"; dir = 4},/turf/unsimulated/floor/plating/airless{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/ruin/onehalf/hallway)
+"bv" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/ruin/onehalf/hallway)
+"bw" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel/airless,/area/ruin/onehalf/hallway)
+"bx" = (/obj/structure/disposalpipe/segment,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel/airless{icon_state = "damaged1"},/area/ruin/onehalf/hallway)
+"by" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; keep_preset_name = 1; name = "Mining Drone Bay APC"; pixel_y = 26},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ruin/onehalf/drone_bay)
+"bz" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel/airless{icon_state = "damaged4"},/area/ruin/onehalf/hallway)
+"bA" = (/obj/structure/disposalpipe/segment,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel/airless,/area/ruin/onehalf/hallway)
+"bB" = (/obj/machinery/door/airlock/glass{name = "glass airlock"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/ruin/onehalf/drone_bay)
+"bC" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/ruin/onehalf/drone_bay)
+"bD" = (/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j1"},/turf/simulated/floor/plasteel,/area/ruin/onehalf/drone_bay)
+"bE" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel,/area/ruin/onehalf/drone_bay)
+"bF" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/ruin/onehalf/drone_bay)
+"bG" = (/turf/simulated/floor/plasteel,/area/ruin/onehalf/drone_bay)
+"bH" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel,/area/ruin/onehalf/drone_bay)
+"bI" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/ruin/onehalf/drone_bay)
+"bJ" = (/obj/structure/girder,/turf/unsimulated/floor/plating/airless,/area/ruin/onehalf/hallway)
+"bK" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel/airless{icon_state = "damaged4"},/area/ruin/onehalf/hallway)
+"bL" = (/obj/machinery/vending/coffee{name = "\improper Solar's Best Hot Drinks"},/turf/simulated/floor/plasteel/airless{icon_state = "damaged1"},/area/ruin/onehalf/hallway)
+"bM" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/ruin/onehalf/hallway)
+"bN" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor/plasteel/airless,/area/ruin/onehalf/hallway)
+"bO" = (/obj/structure/girder/reinforced,/obj/item/stack/sheet/plasteel,/turf/simulated/floor/plating/airless,/area/ruin/onehalf/hallway)
+"bP" = (/obj/structure/girder/reinforced,/turf/simulated/floor/plating/airless,/area/ruin/onehalf/hallway)
+"bQ" = (/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 1; keep_preset_name = 1; name = "Bridge APC"; pixel_y = 26},/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"bR" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/ruin/onehalf/hallway)
+"bS" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel/airless,/area/ruin/onehalf/hallway)
+"bT" = (/turf/simulated/wall/r_wall,/area/ruin/onehalf/bridge)
+"bU" = (/obj/item/stack/sheet/metal,/turf/space,/area/space)
+"bV" = (/turf/unsimulated/floor/plating/airless{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/ruin/onehalf/hallway)
+"bW" = (/obj/structure/girder/reinforced,/turf/unsimulated/floor/plating/airless,/area/ruin/onehalf/hallway)
+"bX" = (/turf/simulated/wall/r_wall,/area/ruin/onehalf/hallway)
+"bY" = (/turf/simulated/floor/plating/airless,/area/ruin/onehalf/hallway)
+"bZ" = (/turf/simulated/floor/plating/airless{icon_state = "platingdmg3"},/area/ruin/onehalf/hallway)
+"ca" = (/obj/structure/disposalpipe/segment,/obj/item/stack/rods,/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/ruin/onehalf/hallway)
+"cb" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/ruin/onehalf/hallway)
+"cc" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/machinery/door/poddoor/preopen{id_tag = "onehalf bridge"; name = "bridge blast door"},/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
+"cd" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"ce" = (/obj/structure/table,/obj/item/weapon/paper,/obj/item/weapon/pen,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"cf" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"cg" = (/obj/machinery/light{dir = 1; on = 1},/obj/structure/computerframe,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"ch" = (/obj/structure/computerframe,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"cj" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/table,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c500{pixel_y = 9},/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"ck" = (/obj/structure/girder/reinforced,/turf/unsimulated/floor/plating/airless,/area/space)
+"cl" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (NORTH)"; icon_state = "pipe-j1"; dir = 1},/obj/item/weapon/shard,/turf/simulated/floor/plating/airless{broken = 1; icon_state = "platingdmg1"},/area/ruin/onehalf/hallway)
+"cm" = (/obj/structure/lattice,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/stack/rods,/turf/space,/area/ruin/onehalf/hallway)
+"cn" = (/obj/structure/lattice,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/weapon/shard{tag = "icon-small"; icon_state = "small"},/turf/space,/area/space)
+"co" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/poddoor/preopen{id_tag = "onehalf bridge"; name = "bridge blast door"},/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
+"cp" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/table,/obj/item/weapon/paper_bin,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"cq" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"cr" = (/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"cs" = (/obj/structure/stool/bed/chair{tag = "icon-chair (NORTH)"; icon_state = "chair"; dir = 1},/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"ct" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/table,/obj/item/weapon/lighter/zippo,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"cu" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/poddoor/preopen{id_tag = "onehalf bridge"; name = "bridge blast door"},/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
+"cv" = (/obj/item/stack/rods,/turf/space,/area/space)
+"cw" = (/turf/unsimulated/floor/plating/airless,/area/space)
+"cx" = (/obj/structure/lattice,/obj/item/stack/sheet/plasteel,/turf/space,/area/space)
+"cy" = (/obj/structure/lattice,/obj/item/weapon/shard{tag = "icon-medium"; icon_state = "medium"},/turf/space,/area/ruin/onehalf/hallway)
+"cz" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel/airless{icon_state = "damaged1"},/area/ruin/onehalf/hallway)
+"cA" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"cB" = (/obj/item/stack/tile/plasteel{pixel_x = 7; pixel_y = 8},/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"cC" = (/obj/structure/cable,/obj/machinery/power/solar_control,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"cD" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor/preopen{id_tag = "onehalf bridge"; name = "bridge blast door"},/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
+"cE" = (/obj/item/stack/tile/wood,/turf/space,/area/space)
+"cF" = (/turf/space,/area/ruin/onehalf/hallway)
+"cG" = (/obj/structure/lattice,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/space,/area/ruin/onehalf/hallway)
+"cH" = (/obj/structure/lattice,/obj/structure/disposalpipe/broken{tag = "icon-pipe-b (NORTH)"; icon_state = "pipe-b"; dir = 1},/obj/structure/disposalpipe/broken{tag = "icon-pipe-b (WEST)"; icon_state = "pipe-b"; dir = 8},/turf/space,/area/ruin/onehalf/hallway)
+"cI" = (/obj/machinery/door/airlock/glass_command{name = "Bridge"},/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"cJ" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"cK" = (/obj/machinery/door/poddoor/preopen{id_tag = "onehalf bridge"; name = "bridge blast door"},/obj/machinery/door/airlock/glass_command{name = "Bridge"},/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"cL" = (/obj/item/weapon/crowbar,/obj/item/device/multitool,/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
+"cM" = (/obj/structure/safe/floor,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas/syndicate,/obj/item/clothing/suit/space/rig/syndi,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,/obj/item/weapon/folder/syndicate/blue,/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
+"cN" = (/obj/structure/stool/bed/chair/comfy/black{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"cO" = (/obj/structure/lattice,/obj/item/stack/cable_coil/cut{amount = 2; dir = 2; icon_state = "coil_red2"},/turf/space,/area/ruin/onehalf/hallway)
+"cP" = (/turf/simulated/floor/plating/airless{broken = 1; icon_state = "platingdmg2"},/area/ruin/onehalf/hallway)
+"cQ" = (/obj/machinery/light{dir = 8},/obj/machinery/vending/sovietsoda,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"cR" = (/obj/item/stack/sheet/plasteel,/turf/space,/area/space)
+"cS" = (/obj/structure/lattice,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/space,/area/ruin/onehalf/hallway)
+"cT" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/ruin/onehalf/hallway)
+"cU" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/ruin/onehalf/hallway)
+"cV" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"cW" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"cX" = (/obj/structure/table,/obj/machinery/door_control{id = "onehalf bridge"; name = "Bridge Lockdown"; pixel_x = 0; pixel_y = 5},/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"cY" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/structure/cable,/obj/machinery/door/poddoor/preopen{id_tag = "onehalf bridge"; name = "bridge blast door"},/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
+"cZ" = (/obj/structure/lattice,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/space,/area/space)
+"da" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/ruin/onehalf/hallway)
+"db" = (/obj/structure/table,/obj/item/device/flashlight,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"dc" = (/obj/structure/table,/obj/item/weapon/ore/bluespace_crystal,/obj/item/weapon/coin/plasma,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"dd" = (/obj/structure/closet/firecloset/full,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"de" = (/obj/machinery/light,/obj/structure/table,/obj/item/weapon/storage/firstaid,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"df" = (/obj/structure/lattice,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/space,/area/space)
+"dg" = (/obj/structure/girder/reinforced,/obj/item/stack/sheet/plasteel,/turf/simulated/floor/plating/airless,/area/space)
+"dh" = (/turf/simulated/floor/plating/airless{broken = 1; icon_state = "platingdmg2"},/area/space)
+"di" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless{broken = 1; icon_state = "platingdmg1"},/area/ruin/onehalf/hallway)
+"dj" = (/obj/structure/grille,/obj/item/weapon/shard,/turf/simulated/floor/plating,/area/ruin/onehalf/hallway)
+"dk" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id_tag = "onehalf bridge"; name = "bridge blast door"},/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
+"dl" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/poddoor/preopen{id_tag = "onehalf bridge"; name = "bridge blast door"},/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
+"dm" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/door/poddoor/preopen{id_tag = "onehalf bridge"; name = "bridge blast door"},/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
+"dn" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id_tag = "onehalf bridge"; name = "bridge blast door"},/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
+"do" = (/obj/structure/lattice,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/item/weapon/shard{tag = "icon-medium"; icon_state = "medium"},/turf/space,/area/space)
+"dp" = (/obj/structure/lattice,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/item/stack/rods,/turf/space,/area/space)
+"dq" = (/obj/structure/lattice,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/space,/area/space)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabacacacacacacacacacadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaeacafagagagagagagahagagaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaajakakakagalamanagaoapaoagaqarasaratarauaravaraaaaaaaaaaaa
+aaaaawaxaxayazagaAamaBagaCapaoagaDaraEaraFaraEaraEarawaraGaraaaa
+aaaaaaaHajaxaIagaJaKaYagaoapaoagaqaraMaNaOaraPaQaRaraaaraSaraaaa
+aaaaawajaxaTaUagagaVagagagaWagagaXbyaZbaaZbaaZbabbarararbcararaa
+aaaaawbdbebfbgbhbhbibgbgbjbhbkblbmbnbobnbobnbobnbobnbpbqbrbsbtaa
+aaaaaabubvbvbwbwbvbxbwbwaLbzbAbBbCbnbDbEbDbnbDbEbFbGarbHbGbIbtaa
+aaaaaabJajakbKbLbMbNbObPbXbRbSbTbTbTbTbTbTbTbTbTbTbTararbtararaa
+aaaaaaaabUbVbJakbWbXbYawbXbZcacbaacccdcecfcgchbQcjbTawaaaaaaaaaa
+aaaaaaaaaaaaaaaackaaaabUaxaxclcmcncocpcqcrcscrcrctcuadaaaaaaaaaa
+aaaaaaaaaaaaaacvcwcxaaaabYcyczbTbTbTcAcrcBcrcrcrcCcDaiaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaawcEaacFcGcHcIcJcKcrcBcLcMcrcNchcDaiaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaacvawbYcOcPbTbTbTcQcrcrcrcrcrchcDaiaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaacRcEaxcScTcUawcccVcqcrcWcrcrcXcYcZaaaaaaaaaa
+aaaaaaaaaaaaaaaaaacvaaaabXdaaIcUaaccdbdcddchchcrdebTdfaaaaaaaaaa
+aaaaaaaaaaaaaaaaaadgawdhbPdidjbTbTbTbTdkdldmdldnbTbTaiaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaacxdodpacacacacacdqacacacdqacacafaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
+
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm b/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm
new file mode 100644
index 00000000000..1bab41147dc
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm
@@ -0,0 +1,113 @@
+"aa" = (/turf/space,/area/space)
+"ab" = (/turf/simulated/mineral,/area/space)
+"ac" = (/turf/simulated/floor/plating/airless/asteroid,/area/space)
+"ad" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"ae" = (/turf/simulated/wall,/area/ruin/unpowered)
+"af" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/ruin/powered)
+"ag" = (/turf/simulated/floor/plating/airless/asteroid,/area/ruin/powered)
+"ah" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating/airless/asteroid,/area/ruin/powered)
+"ai" = (/turf/simulated/mineral,/area/ruin/powered)
+"aj" = (/turf/simulated/floor/plating/airless/asteroid,/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/ruin/powered)
+"ak" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/simulated/floor/plating,/area/ruin/powered)
+"al" = (/turf/simulated/floor/plating/airless/asteroid,/turf/simulated/shuttle/wall{dir = 2; icon_state = "swall_f10"; layer = 2},/area/ruin/powered)
+"am" = (/turf/simulated/wall,/area/ruin/powered{name = "Space Bar"})
+"an" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/ruin/powered)
+"ao" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/ruin/powered)
+"ap" = (/obj/structure/table,/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/wood,/area/ruin/powered{name = "Space Bar"})
+"aq" = (/obj/structure/table,/obj/machinery/vending/boozeomat,/turf/simulated/floor/wood,/area/ruin/powered{name = "Space Bar"})
+"ar" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/wood,/area/ruin/powered{name = "Space Bar"})
+"as" = (/turf/simulated/floor/wood,/area/ruin/powered{name = "Space Bar"})
+"at" = (/obj/structure/table,/obj/item/toy/figure/bartender,/turf/simulated/floor/wood,/area/ruin/powered{name = "Space Bar"})
+"au" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/simulated/floor/wood,/area/ruin/powered{name = "Space Bar"})
+"av" = (/obj/effect/decal/remains/human,/turf/simulated/floor/wood,/area/ruin/powered{name = "Space Bar"})
+"aw" = (/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/wood,/area/ruin/powered{name = "Space Bar"})
+"ax" = (/turf/simulated/shuttle/floor,/area/ruin/powered)
+"ay" = (/obj/machinery/door/airlock{name = "Bar Storage"; req_access_txt = "25"},/turf/simulated/floor/wood,/area/ruin/powered{name = "Space Bar"})
+"az" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/wood,/area/ruin/powered{name = "Space Bar"})
+"aA" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/ruin/powered)
+"aB" = (/obj/machinery/door/airlock/shuttle{name = "Escape Pod Airlock"},/turf/simulated/shuttle/floor,/area/ruin/powered)
+"aC" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/ruin/powered)
+"aD" = (/obj/machinery/door_control{name = "pod door cycle"; pixel_x = 6; id = "pod cycle"},/turf/simulated/wall,/area/ruin/powered{name = "Space Bar"})
+"aE" = (/obj/machinery/vending/boozeomat,/turf/simulated/wall,/area/ruin/powered{name = "Space Bar"})
+"aF" = (/obj/structure/closet/secure_closet/freezer/kitchen,/turf/simulated/floor/wood,/area/ruin/powered{name = "Space Bar"})
+"aG" = (/obj/machinery/light/small,/obj/structure/table,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/ruin/powered{name = "Space Bar"})
+"aH" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor/wood,/area/ruin/powered{name = "Space Bar"})
+"aI" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 10},/turf/simulated/floor/wood,/area/ruin/powered{name = "Space Bar"})
+"aJ" = (/turf/simulated/wall,/area/ruin/powered)
+"aK" = (/obj/structure/table,/turf/simulated/floor/wood,/area/ruin/powered{name = "Space Bar"})
+"aL" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/cans/beer,/obj/item/weapon/reagent_containers/glass/rag,/turf/simulated/floor/wood,/area/ruin/powered{name = "Space Bar"})
+"aM" = (/obj/machinery/door/airlock{name = "Bar Storage"; req_access_txt = "25"},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/ruin/powered{name = "Space Bar"})
+"aN" = (/obj/structure/stool,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"aO" = (/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"aP" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"aQ" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/floor/plating,/area/ruin/powered{name = "Space Bar"})
+"aR" = (/obj/structure/grille,/obj/structure/window/full/reinforced,/turf/simulated/wall,/area/ruin/powered{name = "Space Bar"})
+"aS" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/ruin/powered{name = "Space Bar"})
+"aT" = (/turf/simulated/floor/plating,/area/ruin/powered{name = "Space Bar"})
+"aU" = (/obj/structure/stool/bed/chair{tag = "icon-chair (EAST)"; icon_state = "chair"; dir = 4},/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"aV" = (/obj/structure/table/woodentable,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"aW" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"aX" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"aY" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"aZ" = (/obj/item/device/radio/beacon,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"ba" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"bb" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"bc" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"bd" = (/obj/machinery/vending/snack,/obj/machinery/light,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"be" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"bf" = (/obj/machinery/door/airlock{name = "Unisex Bathroom"},/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"bg" = (/obj/structure/urinal{pixel_x = -32},/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"bh" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 28},/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"bi" = (/obj/structure/table/woodentable,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"bj" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"bk" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"bl" = (/obj/machinery/door/airlock{name = "Toilet"},/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"bm" = (/obj/effect/glowshroom/single,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Space Bar"})
+"bn" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/ruin/powered)
+"bo" = (/turf/simulated/floor/plating,/area/ruin/powered)
+"bp" = (/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/ruin/powered)
+"bq" = (/obj/machinery/door/poddoor/preopen{id_tag = "pod cycle"; name = "airlock dock"},/turf/simulated/floor/plating,/area/ruin/powered)
+"br" = (/obj/machinery/door/poddoor{id_tag = "pod cycle"; name = "airlock dock"},/turf/simulated/floor/plating,/area/ruin/powered)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacababacacacacacaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaacacacacacadadaeadadacacacacacacacacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaacacacafafafagagagagagafafacacafafafafafafahacacacacaaaaaaaaaa
+aaaaaaaaaaaaaaaaacacacafagagagagagagaiaiagagafafagagagagagagagafafacacacaaaaaaaa
+aaaaaaaaaaaaaaacacacafagagagagagagaiaiaiaiagagagagagagagagagagagagafacacaaaaaaaa
+aaaaaaaaaaacacacacafagajakalagagaiaiaiamamamamamamamamamamamamagagafacacaaaaaaaa
+aaaaaaaaaaacacacafagaganaoanagagaiaiaiamapaqarasamatauavasawamagagafacacacaaaaaa
+aaaaaaaaacacafafagagaganaxanagagaiaiaiamasasasasayasasasasazamagagagafacacaaaaaa
+aaaaaaababacafagagagagaAaBaCagagagaiaiaDasasasasaEaFaGaHasaIamagagagafacacaaaaaa
+aaaaaaaaabacaJagagagagagagagagagagagagamaKaKaLaKamamamamaMamamagagagaJacaaaaaaaa
+aaaaaaaaabacafafagagagagagagagagagagagamaNaNaNaNaOaOaPaOaOaOamagagagafacabaaaaaa
+aaaaaaaaacacacacafagagagagagagagamaQaRamaOaOaOaOaOaOaOaOaOaOaQagagafacacababaaaa
+aaaaaaaaaaacacafagagagagagagagagaSaTaTaSaOaOaOaOaOaOaUaVaWaOaQagagafacabababaaaa
+aaaaaaaaaaacacafagagagagagagagagamaQaQamaXaOaUaVaWaOaOaOaOaOaQagagafacacaaaaaaaa
+aaaaaaaaacacafagagagagagagagagagagagagamaYaOaOaOaOaZaOaOaOaOaQagagafacacaaaaaaaa
+aaaaaaaaabacafagagagagagagagagagagagagamaVaOaOaObabbbcbdaOaOamagagafacacacaaaaaa
+aaaaaaababacafagagagagagagagagagagagagambeaOaOaOamamamamambfamaiagagafacacacaaaa
+aaaaaaaaabacafagagagagagagagagajakalagamaOaOaOaOambgaOaOaOaOamaiagagagafacabaaaa
+aaaaaaaaacacafagagagagagagagaganaoanagaQaOaOaOaYambgaOaOaObhamaiaiagagafacabaaaa
+aaaaaaaaacacacafagagagagagagaganaxanagagaQaOaObiamamambjaObhamaiaiagagafacabaaaa
+aaaaaaaaaaacacafagagagagagagagaAaBaCagagagaQaObeambkblaObmaOamaiaiagagafacacaaaa
+aaaaaaaaaaacaJaJaJaJagagagagagagagagagagagagaQamamamamamamamamaiaiagafacacacaaaa
+aaaaaaaaaaaabnbobobnagagagagagagagagagagaiaiagagagaiaiaiaiaiaiaiaiagafacacacaaaa
+aaaaaaaaaaaaaJaJaJaJagagagagagagagagagaiaiaiagagagagagaiaiaiaiaiaiafacacacaaaaaa
+aaaaaaaaaaaaacacaJagaJbpbpbpbpbpbpaJagagaiagagagagagagagagaiaiaiagafacacaaaaaaaa
+aaaaaaaaaaaaacabaJagaJbqbqbqbqbqbqaJagagagagagagagagagagagagagagafaJacabaaaaaaaa
+aaaaaaaaaaaaababaJaJaJboboboboboboaJaJaJaJafafafafafafafafafafaJacacacacaaaaaaaa
+aaaaaaaaaaaaababababaJboboboboboboaJacacacacacacacacacacacacacacacacacaaaaaaaaaa
+aaaaaaaaaaaaaaaaababaJboboboboboboaJacacacacacacacacabacacacacacacaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaJboboboboboboaJacacacacaaaaaaacacacababaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaJbrbrbrbrbrbraJacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaJaaaaaaaaaaaaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm b/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm
new file mode 100644
index 00000000000..87e1a46f41f
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm
@@ -0,0 +1,66 @@
+"a" = (/turf/space,/area/space)
+"b" = (/obj/structure/lattice,/turf/space,/area/space)
+"c" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"d" = (/turf/simulated/wall/r_wall,/area/ruin/unpowered)
+"e" = (/obj/structure/table/reinforced,/obj/item/weapon/stock_parts/cell/hyper,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"f" = (/obj/structure/computerframe,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"g" = (/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"h" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"i" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/ruin/unpowered)
+"j" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/ruin/unpowered)
+"k" = (/turf/simulated/floor/plating,/area/ruin/unpowered)
+"l" = (/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"m" = (/obj/structure/table/reinforced,/obj/item/weapon/folder,/obj/item/device/radio,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"n" = (/obj/structure/stool/bed/chair{tag = "icon-chair (WEST)"; icon_state = "chair"; dir = 8},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"o" = (/obj/machinery/porta_turret,/turf/simulated/floor/plating/airless,/area/ruin/unpowered)
+"p" = (/obj/structure/filingcabinet,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"q" = (/obj/machinery/light,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"r" = (/obj/structure/rack,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/ruin/unpowered)
+"s" = (/obj/item/weapon/rack_parts,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/ruin/unpowered)
+"t" = (/obj/item/weapon/rack_parts,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/ruin/unpowered)
+"u" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"v" = (/obj/machinery/door/airlock,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"w" = (/obj/machinery/power/apc{dir = 2; name = "Outpost APC"; keep_preset_name = 1; pixel_y = -24},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"x" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"y" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"z" = (/obj/structure/table/reinforced,/obj/item/clothing/head/ushanka,/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkredfull"},/area/ruin/unpowered)
+"A" = (/obj/structure/table/reinforced,/obj/structure/reagent_dispensers/peppertank{pixel_y = 32},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"B" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/machinery/light{dir = 1},/obj/item/device/radio,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"C" = (/obj/machinery/vending/clothing,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"D" = (/obj/structure/rack,/obj/item/ammo_box/c9mm,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/ruin/unpowered)
+"E" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"F" = (/obj/structure/rack,/obj/item/clothing/head/helmet/swat,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/ruin/unpowered)
+"G" = (/obj/structure/rack,/obj/item/weapon/crowbar/red,/obj/item/weapon/paper/crumpled,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/ruin/unpowered)
+"H" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"I" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 4},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"J" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"K" = (/obj/structure/rack,/obj/item/weapon/grenade/chem_grenade/teargas,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"L" = (/obj/structure/table/reinforced,/obj/item/weapon/paper/crumpled,/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkredfull"},/area/ruin/unpowered)
+"M" = (/obj/structure/table/reinforced,/obj/machinery/light,/obj/item/device/camera_bug,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"N" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"O" = (/obj/structure/table/reinforced,/obj/item/weapon/pen/blue,/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"P" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka{pixel_x = -4; pixel_y = 4},/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka{pixel_x = 3},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+"Q" = (/obj/structure/rack,/obj/item/weapon/storage/belt/military,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/ruin/unpowered)
+"R" = (/obj/structure/rack,/obj/item/clothing/head/helmet/riot,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/ruin/unpowered)
+"S" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/snacks/rawcutlet,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel,/area/ruin/unpowered)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaabbab
+aaaaabaabbaaaaabababbb
+aaaaababbacccccccccccc
+aaaaabbbbbcddddddddddd
+aaaaabaaaacdefffghijki
+aaalllllllcdmnggggikki
+aaloddddddcdpqgggwdddd
+aalddrstrdddddudvddkkc
+aaldsxxxxydzABgdgCdddc
+aaldrxrDxxuggggdgggEdc
+bbldFxrGxxuggHgdIggJdc
+abldrxxxxKdLMNOdPggJdc
+ablddrsQRdddddddSggJdc
+aaloddddddolllcddddddc
+abbllllllllbbacccccccc
+aabbbbbabbbbaabbbaaaba
+aaabaabaaaabaababaaabb
+aaaaaaaaaaaaaabaaaaaaa
+"}
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm b/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm
new file mode 100644
index 00000000000..c5c89f646d3
--- /dev/null
+++ b/_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm
@@ -0,0 +1,37 @@
+"a" = (/turf/space,/area/space)
+"b" = (/turf/simulated/mineral/random,/area/ruin/unpowered/no_grav/way_home)
+"c" = (/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered/no_grav/way_home)
+"d" = (/obj/structure/signpost{name = "salvation"},/turf/simulated/floor/plating/airless/asteroid,/area/ruin/unpowered/no_grav/way_home)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaabaaaaaaaaaaaaaaa
+aaaaaaaaaaaaabbbaaaaaaaaaaaaaa
+aaaaaaaaaabbbbbbbbbaaaaaaaaaaa
+aaaaaaaaaaabbbbbbbbaaaaaaaaaaa
+aaaaaaaaaabbbbbbbbaaaaaaaaaaaa
+aaaaaaaaabbbbbbbbbaaaaaaaaaaaa
+aaaaaaaaabbbbbbbbbbaaaaaaaaaaa
+aaaaaaaabbbbbbbbbbbbaaaaaaaaaa
+aaaaaaabbbbbbbbcbbbaaaaaaaaaaa
+aaaaaaabbbbbbbcccaaaaaaaaaaaaa
+aaaaaabbbbbbbbccaaaaaaaaaaaaaa
+aaaaaabbbbbbcccaaaaaaaaaaaaaaa
+aaaaaaabbbcccccaaaaaaaaaaaaaaa
+aaaaaaabbaacccccaaaaaaaaaaaaaa
+aaaaaaaaaaaaaccccaaaaaaaaaaaaa
+aaaaaaaaaaaaaccdccaaaaaaaaaaaa
+aaaaaaaaaaaaaccccccaaaaaaaaaaa
+aaaaaaaaaaaaaaccccccaaaaaaaaaa
+aaaaaaaaaaaaaacccbccaaaaaaaaaa
+aaaaaaaaaaaaaaaccbbccaaaaaaaaa
+aaaaaaaaaaaaaaacbbbbbaaaaaaaaa
+aaaaaaaaaaaaaaacbbbbbbaaaaaaaa
+aabbaaaaaaaaaaaabbbbbbbaaaaaaa
+aabbbaaaaaaaaaabbbbbbbbbaaaaaa
+aaabaaaaaaaaaabbaaabbbabaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/map_files/RandomZLevels/academy.dmm b/_maps/map_files/RandomZLevels/academy.dmm
index 5a371c50a06..500720c279f 100644
--- a/_maps/map_files/RandomZLevels/academy.dmm
+++ b/_maps/map_files/RandomZLevels/academy.dmm
@@ -341,6 +341,7 @@
"gC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
"gD" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
"gE" = (/obj/structure/table,/obj/item/weapon/paper{info = "Grade: B- Educator's Notes: Keep applying yourself, you're showing improvement."; name = "Summoning Midterm Exam"},/obj/item/weapon/gun/projectile/shotgun/toy/tommygun,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms)
+"gF" = (/obj/structure/window/reinforced,/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/trophy/gold_cup,/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaymission/academy/academyaft)
"gG" = (/obj/structure/table,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms)
"gH" = (/obj/structure/window/reinforced,/obj/item/ammo_casing,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/awaymission/academy/classrooms)
"gI" = (/mob/living/simple_animal/hostile/bear,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms)
@@ -482,7 +483,6 @@
"jo" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/awaymission/academy/academyaft)
"jp" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel/airless{tag = "icon-white (EAST)"; icon_state = "white"; dir = 4},/area/awaymission/academy/academyaft)
"jq" = (/obj/structure/grille,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/item/weapon/shard,/turf/simulated/floor/plating/airless,/area/awaymission/academy/academyaft)
-"jr" = (/obj/structure/window/reinforced,/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/golden_cup,/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaymission/academy/academyaft)
"js" = (/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/awaymission/academy/academyaft)
"jt" = (/obj/structure/cult/pylon,/turf/simulated/floor/plasteel{icon_state = "yellow"; dir = 10},/area/awaymission/academy/academyaft)
"ju" = (/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/awaymission/academy/academyaft)
@@ -633,7 +633,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaaaaaaaSaSaaaaaaaaaaaaaaaaaagZiViWiWiXgZaaaaaaiYhDiZjafLfCfDfDfDfDfDfDfDfDfDfLjbjcjdjeaaaaaagZiViWiWiXgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZjfjgjafLjhfBfBjifBfBjifBfBjjfLjbjkjlgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYhDjmjafLfCfDjnhlkxhlhljofDfDfLjbjpjdjqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZjrjsjafLfCfDjtjujujujujvfDfDfLjbjwjxgZjyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSaSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgFjsjafLfCfDjtjujujujujvfDfDfLjbjwjxgZjyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZjzjafLfCjAfDfDfDfDfDfDjAfDfLjbjzgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZjBfLjCetjDfDfDfDfDjEetjDfLjBgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagZgZfLjFjGgCgDfDfDfDfDjHfDfLgZgZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -672,3 +672,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
+
diff --git a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm
index e68167fea13..8f413b01937 100644
--- a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm
+++ b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm
@@ -20,7 +20,7 @@
"at" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
"au" = (/obj/machinery/light/small,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
"av" = (/turf/simulated/shuttle/wall{tag = "icon-swall7"; icon_state = "swall7"},/area/awaymission/BMPship/Fore)
-"aw" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/awaymission/BMPship/Aft)
+"aw" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/awaymission/BMPship/Fore)
"ax" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission/BMPship/Aft)
"ay" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"},/area/awaymission/BMPship/Aft)
"az" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"},/area/awaymission/BMPship/Aft)
@@ -28,7 +28,7 @@
"aB" = (/obj/machinery/door/airlock/silver{locked = 1},/turf/simulated/floor/plating{tag = "icon-panelscorched"; icon_state = "panelscorched"},/area/awaymission/BMPship/Aft)
"aC" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall4"},/area/awaymission/BMPship/Aft)
"aD" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/awaymission/BMPship/Aft)
-"aE" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/awaymission/BMPship/Aft)
+"aE" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Aft)
"aF" = (/turf/simulated/shuttle/wall,/area/awaymission/BMPship/Aft)
"aG" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft)
"aH" = (/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft)
@@ -101,7 +101,6 @@
"bW" = (/obj/machinery/light,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft)
"bX" = (/obj/machinery/door_control{id = "packerMed"; pixel_y = -24},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft)
"bY" = (/obj/machinery/sleeper{dir = 1},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft)
-"bZ" = (/obj/machinery/sleep_console,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft)
"ca" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"cb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/item/weapon/hand_labeler,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"cc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
@@ -116,7 +115,7 @@
"cl" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission/BMPship/Midship)
"cm" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"},/area/awaymission/BMPship/Midship)
"cn" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"},/area/awaymission/BMPship/Aft)
-"co" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "packerMed"},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft)
+"co" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/awaymission/BMPship/Aft)
"cp" = (/obj/machinery/door/poddoor/shutters{dir = 2; id_tag = "packerMed"},/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Aft)
"cq" = (/obj/structure/largecrate,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/awaymission/BMPship/Aft)
"cr" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
@@ -128,7 +127,7 @@
"cx" = (/obj/machinery/door_control{id = "packerCargo"; pixel_y = -24},/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"cy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"cz" = (/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/awaymission/BMPship/Aft)
-"cA" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/awaymission/BMPship/Fore)
+"cA" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Fore)
"cB" = (/turf/simulated/floor/plasteel{tag = "icon-carpet"; icon_state = "carpet"},/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/awaymission/BMPship/Fore)
"cC" = (/turf/simulated/floor/plasteel{tag = "icon-carpet"; icon_state = "carpet"},/area/awaymission/BMPship/Fore)
"cD" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc/noalarm{dir = 1; locked = 0; pixel_y = 24; req_access = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet"; icon_state = "carpet"},/area/awaymission/BMPship/Fore)
@@ -277,7 +276,7 @@
"fq" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
"fr" = (/obj/structure/rack,/obj/item/weapon/storage/belt/utility/full,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/awaymission/BMPship/Aft)
"fs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
-"ft" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/awaymission/BMPship/Aft)
+"ft" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/awaymission/BMPship/Aft)
"fu" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet15-7 (EAST)"; icon_state = "carpet15-7"; dir = 4},/area/awaymission/BMPship/Fore)
"fv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet15-13 (EAST)"; icon_state = "carpet15-13"; dir = 4},/area/awaymission/BMPship/Fore)
"fw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-carpet15-7 (EAST)"; icon_state = "carpet15-7"; dir = 4},/area/awaymission/BMPship/Fore)
@@ -317,7 +316,7 @@
"ge" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/awaymission/BMPship/Aft)
"gf" = (/obj/structure/mopbucket,/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
"gg" = (/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/kitchen/knife,/turf/simulated/shuttle/plating,/area/awaymission/BMPship/Aft)
-"gh" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/awaymission/BMPship/Fore)
+"gh" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission/BMPship/Fore)
"gi" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plasteel{tag = "icon-carpetside"; icon_state = "carpetside"},/area/awaymission/BMPship/Fore)
"gj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plasteel{tag = "icon-carpetside"; icon_state = "carpetside"},/area/awaymission/BMPship/Fore)
"gk" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area/awaymission/BMPship/Midship)
@@ -334,7 +333,7 @@
"gv" = (/obj/item/stack/cable_coil,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"gw" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
"gx" = (/obj/item/stack/sheet/mineral/uranium{amount = 50},/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
-"gy" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/space)
+"gy" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/space)
"gz" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/awaymission/BMPship/Fore)
"gA" = (/obj/structure/lattice,/turf/space,/area/awaymission/BMPship/Fore)
"gB" = (/turf/simulated/floor/plating/airless{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/awaymission/BMPship/Fore)
@@ -449,7 +448,7 @@
"iG" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
"iH" = (/obj/item/weapon/storage/box/matches,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
"iI" = (/obj/item/weapon/contraband/poster,/turf/simulated/floor/plating,/area/awaymission/BMPship/Fore)
-"iJ" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/awaymission/BMPship/Fore)
+"iJ" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/awaymission/BMPship/Fore)
"iK" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Fore)
"iL" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/engine,/area/awaymission/BMPship/Fore)
"iM" = (/turf/simulated/mineral/random/high_chance_clown,/area/awaymission)
@@ -503,25 +502,25 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafagagahagaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajakalamanaoaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapalalaqararaoaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaaaaaaaaaaaaaaaaaaaaaaaatakauamarararavaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasawaxaxaxaxaxaxaxaxaxayaxaxaxazaAaBaCazazaxaDaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaasaFaGaHaIaJaKaLaMaNaOaPaQaRaSaTaUaVaVaVaVaVaVaWaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafagagahagawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajakalamanaoawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapalalaqararaoawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaaaaaaaaaaaaaaaaaaaaaaaatakauamarararavawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaEaxaxaxaxaxaxaxaxaxayaxaxaxazaAaBaCazazaxaDcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasaaasaFaGaHaIaJaKaLaMaNaOaPaQaRaSaTaUaVaVaVaVaVaVaWcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafagagahagagagagagagagaiaaaaaaaaaaaaasaXaYaHaHaZaHaHaHbaaHaHbbbcbdbdbebdbdbfbgbhbdbibjaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkblbmbnbobpbqbpbqbpbrbsaaaaaaaaaaasbtaYaHbuaHaHaHaGaHbvaNaNbwbxbybdbzbdbdbAbBbCbDbdbjaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEbFbGbnbHararararararbIaaaaaaasawaFaHbuaYaHbuaHaHaHaZaHaHaHbJbcbKbdbdbdbdbLbMbNbdbdbOaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPbQbFbnarbRbRbSbRbRbTbUaaaaaaawbVbtbuaHbWbXaHaHaHbYbZbWbYbZaPbccacbcccccdccccccccbyceaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfcgchcicjckclclclclclcmclclclcmcnaxaxaxaxaAcococpaCaxaxaxaxbVcqcrcsctcrcrcucvcwcxcyczaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCcDcCcEcFcGcHcIcJcKcIcLcGcMcNcOcPcQcRcMcMcMcMcScTcUcScVcWaxaxaxaxaxaxaxaxayaAcXaCcnaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcYcZcYdacCcEcMdbcHdcdcdcdccLcMcMdddedededfcMcMcMcMdgdgcMdgcMdhdididjdkdldmdldnaPdodpdqdrazaxayaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCdsdtdsdudvcEcMcMcHdcdwdcdccLcMcMdxdydzdAdBcMcMcMcMcMcMcMcMcMaPdjdCdjbJdDdEdFdGaPdHdpdododIdJcWazaxaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEbFbGbnbHararararararbIaaaaaaasaEaFaHbuaYaHbuaHaHaHaZaHaHaHbJbcbKbdbdbdbdbLbMbNbdbdbOaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPbQbFbnarbRbRbSbRbRbTbUaaaaaaaEbVbtbuaHbWbXaHaHaHbYaHbWbYaHaPbccacbcccccdccccccccbyceaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfcgchcicjckclclclclclcmclclclcmcnaxaxaxaxaAcpcpcpaCaxaxaxaxbVcqcrcsctcrcrcucvcwcxcyczaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCcDcCcEcFcGcHcIcJcKcIcLcGcMcNcOcPcQcRcMcMcMcMcScTcUcScVcWaxaxaxaxaxaxaxaxayaAcXaCcncoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcYcZcYdacCcEcMdbcHdcdcdcdccLcMcMdddedededfcMcMcMcMdgdgcMdgcMdhdididjdkdldmdldnaPdodpdqdrazaxaycoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCdsdtdsdudvcEcMcMcHdcdwdcdccLcMcMdxdydzdAdBcMcMcMcMcMcMcMcMcMaPdjdCdjbJdDdEdFdGaPdHdpdododIdJcWazaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCdKdLdMdNdOcEcMcMdPdQdQdRdQdScMcMdTcMdUdVdVdVdVdVdVdVdVdVdWcMdhdjdXdjdraxaxaxaxbVdHdYdZeaebecbbedeeefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciegegegeheiejekelddemeneoeoeoeoeoeodWcMddcMepcMeqerererererererepcMaPdjesdjdjdjdjdjetaPeuevbdewbdexeyezeeefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeAeBeCegcYcZcYcZeDeEeoeFererererereGeHcMeIcMepeJeKeLeKeKeKeKeMeNeOePbbdjeseQeReReSdjdjaPeTeUbdeVeWeXbJezeeefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeYeZfaegfbdtdsdtfcdTcMcMerfdfefdfffgepfhepcMepcMfierererererererepfjfkflfmfnfofpfqdjdjaPfreUbdewbdfscWayaxftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeYeZfaegcYfufvfwfxddcMcMerfdfdfgfffgfyeofzeofAcMcMcMcMcMfBcMcMcMepcMfCdjesfDfofofEdjdjaPfFevfoewbdfGcWazaxaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeYeZfaegcYfufvfwfxddcMcMerfdfdfgfffgfyeofzeofAcMcMcMcMcMfBcMcMcMepcMfCdjesfDfofofEdjdjaPfFevfoewbdfGcWazaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafHfIfJegdsfKdsdtcCfLcMcMerfMfdfgfNfgepcMfOcMepcMcMfPcMcMcMcMcMcMfQdVfRfSfTfDfUfofEdjdjaPfFevfofVeWfWbbfXeeefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUegegegegfYegfZgadTemcMerfdfggbffgcepcMdTcMepcMeqerererererererepgdgeflfmfngffoggdjetaPeuevfobdbddJeyezeeefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaghahagaggigjagagaggkcMcMerfgfgfgglfgepgmddcMepgngogpgqgqgqgqeMeNeOgrbJdjesgsgtgtgudjdjaPdHeUbdgvbdgwbJgxeeefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -584,3 +583,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
+
diff --git a/_maps/map_files/RandomZLevels/centcomAway.dmm b/_maps/map_files/RandomZLevels/centcomAway.dmm
index fe4583e5be0..2cc70f5d3ee 100644
--- a/_maps/map_files/RandomZLevels/centcomAway.dmm
+++ b/_maps/map_files/RandomZLevels/centcomAway.dmm
@@ -145,7 +145,7 @@
"cO" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaymission/centcomAway/hangar)
"cP" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaymission/centcomAway/hangar)
"cQ" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar)
-"cR" = (/obj/machinery/sleep_console{icon_state = "console"; dir = 8},/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar)
+"cR" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/trophy/gold_cup,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/general)
"cS" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/awaymission/centcomAway/hangar)
"cT" = (/turf/simulated/shuttle/wall{icon_state = "swallc2"; dir = 2},/area/awaymission/centcomAway/hangar)
"cU" = (/turf/simulated/floor/plating,/area/awaymission/centcomAway/hangar)
@@ -251,7 +251,7 @@
"eQ" = (/obj/machinery/suit_storage_unit/standard_unit,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaymission/centcomAway/general)
"eR" = (/obj/machinery/autolathe,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellow"},/area/awaymission/centcomAway/general)
"eS" = (/obj/machinery/sleeper{icon_state = "sleeper-open"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/general)
-"eT" = (/obj/machinery/sleep_console{icon_state = "console"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/general)
+"eT" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/drinks/ice,/turf/simulated/floor/plasteel{tag = "icon-barber (WEST)"; icon_state = "barber"; dir = 8; heat_capacity = 1},/area/awaymission/centcomAway/thunderdome)
"eU" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/general)
"eV" = (/obj/structure/table/reinforced,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/general)
"eW" = (/obj/machinery/implantchair,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/general)
@@ -442,7 +442,7 @@
"iz" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/turf/simulated/floor/wood,/area/awaymission/centcomAway/courtroom)
"iA" = (/obj/structure/sign/vacuum,/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/hangar)
"iB" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/hangar)
-"iC" = (/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/general)
+"iC" = (/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/general)
"iD" = (/obj/machinery/door/airlock/centcom,/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
"iE" = (/obj/machinery/door/airlock/centcom{name = "Centcom Security"; opacity = 1; req_access_txt = "101"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
"iF" = (/obj/structure/closet/secure_closet/injection,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/courtroom)
@@ -596,7 +596,6 @@
"lx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
"ly" = (/obj/structure/table/woodentable,/obj/item/clothing/accessory/medal,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/general)
"lz" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/general)
-"lA" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/golden_cup,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/general)
"lB" = (/obj/structure/table/woodentable,/obj/item/clothing/accessory/medal/gold,/turf/simulated/floor/carpet,/area/awaymission/centcomAway/general)
"lC" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
"lD" = (/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/thunderdome)
@@ -624,7 +623,6 @@
"lZ" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/plasteel{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/awaymission/centcomAway/thunderdome)
"ma" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/awaymission/centcomAway/thunderdome)
"mb" = (/obj/structure/table,/obj/item/weapon/lipstick,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome)
-"mc" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/reagent_containers/food/drinks/ice,/turf/simulated/floor/plasteel{tag = "icon-barber (WEST)"; icon_state = "barber"; dir = 8; heat_capacity = 1},/area/awaymission/centcomAway/thunderdome)
"md" = (/obj/machinery/icecream_vat,/turf/simulated/floor/plasteel{tag = "icon-barber (WEST)"; icon_state = "barber"; dir = 8; heat_capacity = 1},/area/awaymission/centcomAway/thunderdome)
"me" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/thunderdome)
"mf" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{tag = "icon-redbluefull (WEST)"; icon_state = "redbluefull"; dir = 8},/area/awaymission/centcomAway/thunderdome)
@@ -740,7 +738,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbDbEbEbEbFbGbH
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbDbUbUbVbWbXbYbZcacbbYbXcccdbUbUbDbfbfbfaWagagakaFaGaHakaiaiaIcecfaiaiaiaiakakakaKcgakakakakakchciciaKcjckckataaclagagcmagcncococococococococococococoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbDbUbUcpcqcqbYcqcqcqbYcqcqcpbUbUbDbfbfbfaWagagakaQaGaGaRaiaiaIcraJaiaiaiaiaKcscscsctcucucucucucvcwcwcwcwcwcwaBaacxagagcyababbmbTbTbTbTbTbTbTbTbTbTbTbTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfczcdbUcAcqbYbYbYbYbYbYbYcqcAbUbVcBbfbfcCaWcDcEakakakakakaiaiaIaJaJaiaiaiaicFcscscGcGcGcscscscscicwcHcIcJcKcwaBaacxagagabaabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfczbJcLcMcNcOcPbYcQcRbYcScTbJcBbfbfcUcUcmagagagcVaiaiaiaiaiaIaJaJaiaiaiaiaKcscscscWcucucucucucXcwcwcwcwcwcwaBaacxagagabaabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfczbJcLcMcNcOcPbYcQcqbYcScTbJcBbfbfcUcUcmagagagcVaiaiaiaiaiaIaJaJaiaiaiaiaKcscscscWcucucucucucXcwcwcwcwcwcwaBaacxagagabaabmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbgbfbfbDcYcZdadbbYcqcqbYcSbDbfbfbfbfbfcUcmagagagcVaiaiaiaiaiaIaJaJaiaiaiaiakakakaKdcakakakakakchciciaKcjckckbbaaddagagcyababbmbTbTbTbTbTbTbTbTbTbTbTbTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbgcUbfbDdedfdfcPbYcSdgbYcScpdhbfbfdidicCaWaWcEakakakakakaiaiaiaiaiaiaiaiaIbhdjdkdldmakbObxbPakbQdndobBakakakacababagagcmagcmcococococococococococococoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbDdpdfdfdqbYcSdgbYbYbHbfbfbfbodrdsdtaWagakaFduaHakaiaiaiaiaiaiaiaiaIbhdjaxaxdmdvbwbxbyakdwbAdxbBakbCagagagagagagabababbmbTbTbTbTbTbTbTbTbTbTbTbTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -751,9 +749,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbDdEbYbY
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbDdEbYdEdYbYcqcqcqcqdYbfbfbfaWaWaWaWaWagakakdZeaakakakdZebeaakaiaiaiakdjaxayazaxaxaxecaBauedeeauakefegehakagagabaaaabmbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfcUbDdEbYdEbDbYeiejekbXbDbfbgbfbuaWbdagagagacelemeneneoenepeneqacereseraketeuevewexeyezeAbbauavavauakakakakakagagababababababaTaUaUaVababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfcUeBeCeCbJeDeEbIbJeCeCcBbfbfbfbfaWagageFeFeFeFeFeFeFeFeFeFeFeFeFeGeGeGeFeFeFeFeFeFeFeFeFeFeFeFeFakakeHeIbdagagageJagagagagagagagagagagabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfcUcUeBbKeKcSbYeLeMbFcBbfbfbfbfcUaWagageFeNeOeOeOePeFeNeQeReQePeFeGeGeGeFeSeTeUeVeWeFeXeYeZfafbeFagagagagagagagagagagagagagagagagagagagageIabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfcUcUeBbKeKcSbYeLeMbFcBbfbfbfbfcUaWagageFeNeOeOeOePeFeNeQeReQePeFeGeGeGeFeSeUeUeVeWeFeXeYeZfafbeFagagagagagagagagagagagagagagagagagagagageIabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfcUcUbDekcqfccqeKbDbfbfbfbfcUcUaWagageFeOeOfdeOeOfeeOeOeOeOeOeFfffgffeFeUeUeUeUfhfieUeUeUfhfieFagfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjagbdabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfcUbfbfcUbDfkflfmfnfobDbfbfbfbfcUcUaWagageFeOeOeOeOeOeFfpfqfrfrfseFfteOfueFeSeTeUeUeUfieUeUeUeUfieFagfjfvfwfxfjfyfyfyfjfyfyfyfyfyfyfyfyfjagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfcUbfbfcUbDfkflfmfnfobDbfbfbfbfcUcUaWagageFeOeOeOeOeOeFfpfqfrfrfseFfteOfueFeSeUeUeUeUfieUeUeUeUfieFagfjfvfwfxfjfyfyfyfjfyfyfyfyfyfyfyfyfjagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbfbfczfzfAfAfAfBcBbfbfbfbfbfcUaWagageFeOfCfDfCeOeFfEfFfGfHfIeFeOeOeOeFfGfHfJfKfLeFfMfNeUfOfPeFagfjfQfQfQfRfyfyfyfSfyfTfUfTfyfVfWfXfjagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbfbfbfbfbfbfbfbfbfbfbfcUbfbfbfbfaWagageFfpfYfZgagbeFeOgcgcgcgcgdeOeOeOgegfgfgfgfeOggeOgheUfhfieFagfjfjfjfjfjfyfyfyfjgigjfTgkgiglgmgmfjagagabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbobfbfbfbgbfbfbfbfbfbfbfbgbfbfbfbfbfbfbfaWagageFeFeFeFeFeFeFeOeOgngogogogogogogogogogpeOeOeFeFeFeFeFeFeFagfjgqfQfvfjfyfyfyfjgrgrgrgrgrglgmgmfjaggsabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -793,8 +791,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmbmeFjyjthgjsjsiElrlslsltksivgogojOiEjGjGjslueFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmeFeFeFeFeFeFeFeFeFeFlviclweFeFeFeFeFeFeFeFeFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmlxlyhkeGeGeGhklzlxbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmhylAhyeGeGeGhylAhybmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmkslAhyeGeGeGhylBksbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmhycRhyeGeGeGhycRhybmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmkscRhyeGeGeGhylBksbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmeFeFhylClxlChyeFeFbmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlDlDlDlElFlGlDaaaaaaaaksfDksfDksaaaaaaaalDlElFlGlDlDlDlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlHlIlIlDlDlDlDlDlDlDlDlDlDlJlDlJlDlDlDlDlDlDlDlDlDlDlKlLlMlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -803,7 +801,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlNlNlDlPlDlDlDlDlDlDlDlDlDlDlDlQlRlSlDlDlDlDlDlDlDlNlTlTlTlNlNlNlNlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlNlNlDlUlUlUlUlUlVlWlWlWlWlXlWlWlWlWlWlXlYlXlZmalDlNlLlLlLlNlNlNlNlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlNlNlDlUlUlUlUlUlVlWlWlWlWlWlWlWlWlWlWlWlWlWlWlWlDlNmblLlLlNlNlNlNlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlNlNlDmcmcmdmdlUlVlWlWlWlWlWlWlWlWlWlWlWlWlWlWlWlDlNmememelNlNlNlNlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlNlNlDeTeTmdmdlUlVlWlWlWlWlWlWlWlWlWlWlWlWlWlWlWlDlNmememelNlNlNlNlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlNlNlDlDlDlDlDlDlDmfmfmfmfmfmfmfmfmfmfmfmfmfmfmflDlDlDlDlDlDlNlNlNlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDmglNlNlDlDmhmhmhmhlDmimjmjmjmjmjmjmjmjmjmjmjmjmjmklDmhmhmhmhlDlNlNlNmllDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalDlDlDlDlDlDmglNlDlDlDmmmmmmmmlDmnmompmompmomqmrmsmtmumtmumtmvlDmmmmmmmmlDlDlDlNmllDlDlDlDlDlDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -832,3 +830,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
+
diff --git a/_maps/map_files/RandomZLevels/moonoutpost19.dmm b/_maps/map_files/RandomZLevels/moonoutpost19.dmm
index 71c30499550..a2ac44e94d5 100644
--- a/_maps/map_files/RandomZLevels/moonoutpost19.dmm
+++ b/_maps/map_files/RandomZLevels/moonoutpost19.dmm
@@ -483,7 +483,7 @@
"jo" = (/obj/effect/decal/cleanable/flour,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jp" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/effect/decal/cleanable/blood/oil{color = "black"},/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{has_gravity = 1; name = "MO19 Research"})
-"jr" = (/obj/structure/flora/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"jr" = (/obj/item/weapon/twohanded/required/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"js" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"jt" = (/obj/structure/stool/bed/chair,/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"ju" = (/obj/structure/table,/obj/item/weapon/newspaper,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
@@ -637,7 +637,7 @@
"mm" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel/withwallet,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mn" = (/obj/structure/closet/secure_closet{icon_state = "secure"; locked = 0; name = "kitchen Cabinet"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/flour,/obj/item/weapon/reagent_containers/food/condiment/sugar,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mo" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "meat fridge"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/obj/item/weapon/reagent_containers/food/snacks/meat/monkey,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"mp" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "refrigerator"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/storage/fancy/egg_box,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"mp" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "refrigerator"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/storage/fancy/egg_box,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "showroomfloor"; temperature = 273.15},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mq" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/shuttle/floor,/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"mr" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/small{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"ms" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
@@ -728,7 +728,7 @@
"nZ" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/generic,/turf/simulated/floor/plasteel{carbon_dioxide = 48.7; dir = 2; heat_capacity = 1e+006; icon_state = "neutralcorner"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"oa" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"ob" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
-"oc" = (/obj/structure/flora/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/turf/simulated/floor/plasteel{carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "neutral"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
+"oc" = (/obj/item/weapon/twohanded/required/kirbyplants{desc = "A plastic potted plant."; layer = 4.1; pixel_y = 3},/turf/simulated/floor/plasteel{carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_state = "neutral"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a1{has_gravity = 1; name = "MO19 Arrivals"})
"od" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating{carbon_dioxide = 48.7; heat_capacity = 1e+006; icon_plating = "asteroidplating"; icon_state = "asteroidplating"; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"oe" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating/airless/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"of" = (/obj/item/trash/candy,/turf/simulated/floor/plating/airless/asteroid{carbon_dioxide = 48.7; heat_capacity = 1e+006; nitrogen = 13.2; oxygen = 32.4; temperature = 251},/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
diff --git a/_maps/map_files/RandomZLevels/spacebattle.dmm b/_maps/map_files/RandomZLevels/spacebattle.dmm
index 9f278c80c36..f398c6134e5 100644
--- a/_maps/map_files/RandomZLevels/spacebattle.dmm
+++ b/_maps/map_files/RandomZLevels/spacebattle.dmm
@@ -91,11 +91,11 @@
"bM" = (/obj/structure/window/reinforced,/obj/structure/shuttle/engine/heater{tag = "icon-heater (NORTH)"; icon_state = "heater"; dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
"bN" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/cruiser)
"bO" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/cruiser)
-"bP" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/awaymission/spacebattle/cruiser)
+"bP" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/spacebattle/cruiser)
"bQ" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/awaymission/spacebattle/cruiser)
"bR" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"},/area/awaymission/spacebattle/cruiser)
"bS" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission/spacebattle/cruiser)
-"bT" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/awaymission/spacebattle/cruiser)
+"bT" = (/turf/space,/turf/simulated/shuttle/wall{dir = 3; icon_state = "swall_f10"; layer = 2; tag = "icon-swall_f10"},/area/awaymission/spacebattle/cruiser)
"bU" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l (EAST)"; icon_state = "burst_l"; dir = 4},/turf/space,/area/awaymission/spacebattle/cruiser)
"bV" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-engine"; icon_state = "engine"},/area/awaymission/spacebattle/cruiser)
"bW" = (/obj/machinery/computer/telecomms/monitor,/turf/simulated/floor/plasteel,/area/awaymission/spacebattle/cruiser)
@@ -170,7 +170,7 @@
"dn" = (/turf/simulated/floor/plasteel{tag = "icon-damaged4"; icon_state = "damaged4"},/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/awaymission/spacebattle/cruiser)
"do" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "spacebattlepod2"; name = "Front Hull Door"; opacity = 1; tag = "icon-pdoor0"},/turf/simulated/shuttle/plating,/area/awaymission/spacebattle/cruiser)
"dp" = (/turf/simulated/floor/plasteel{tag = "icon-damaged1"; icon_state = "damaged1"},/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/awaymission/spacebattle/cruiser)
-"dq" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/awaymission/spacebattle/cruiser)
+"dq" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission/spacebattle/cruiser)
"dr" = (/obj/effect/decal/cleanable/blood,/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission/spacebattle/cruiser)
"ds" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"},/area/awaymission/spacebattle/cruiser)
"dt" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"},/area/awaymission/spacebattle/cruiser)
@@ -266,7 +266,7 @@
"ff" = (/obj/machinery/door/poddoor{id_tag = "spacebattlestorage"; name = "Secure Storage"},/turf/simulated/floor/plasteel,/area/awaymission/spacebattle/cruiser)
"fg" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/awaymission/spacebattle/cruiser)
"fh" = (/obj/machinery/computer/security/telescreen,/turf/simulated/shuttle/wall,/area/awaymission/spacebattle/cruiser)
-"fi" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/awaymission/spacebattle/cruiser)
+"fi" = (/turf/space,/area/awaymission/spacebattle/cruiser)
"fj" = (/obj/machinery/door/airlock/external,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate4)
"fk" = (/obj/structure/closet/crate,/obj/item/clothing/glasses/material,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser)
"fl" = (/obj/structure/closet/crate,/obj/item/weapon/light/tube,/obj/item/weapon/light/tube,/obj/item/weapon/light/tube,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser)
@@ -407,7 +407,7 @@
"hQ" = (/obj/machinery/shower{tag = "icon-shower (WEST)"; icon_state = "shower"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/spacebattle/cruiser)
"hR" = (/obj/structure/toilet,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/spacebattle/cruiser)
"hS" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/fire,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/spacebattle/cruiser)
-"hT" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"},/area/awaymission/spacebattle/cruiser)
+"hT" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/awaymission/spacebattle/cruiser)
"hU" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/spacebattle/cruiser)
"hV" = (/turf/simulated/shuttle/wall{tag = "icon-swall1"; icon_state = "swall1"},/area/awaymission/spacebattle/cruiser)
"hW" = (/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/spacebattle/cruiser)
@@ -419,11 +419,9 @@
"ic" = (/obj/effect/landmark/corpse/engineer{mobname = "Carth Robinson"; name = "Carth Robinson"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/spacebattle/cruiser)
"id" = (/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/spacebattle/cruiser)
"ie" = (/obj/machinery/sleeper,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/spacebattle/cruiser)
-"if" = (/obj/machinery/sleep_console,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/spacebattle/cruiser)
"ig" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate7)
"ih" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission/spacebattle/cruiser)
"ii" = (/obj/machinery/sleeper,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/awaymission/spacebattle/cruiser)
-"ij" = (/obj/machinery/sleep_console,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/awaymission/spacebattle/cruiser)
"ik" = (/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/awaymission/spacebattle/cruiser)
"il" = (/obj/effect/landmark/corpse/engineer{mobname = "Cyrion"; name = "Cyrion"},/obj/item/weapon/flamethrower/full,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel,/area/awaymission/spacebattle/cruiser)
"im" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plasteel,/area/awaymission/spacebattle/cruiser)
@@ -615,13 +613,13 @@ abababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbUbVcdbZbZbZdedededfdfdgdgdhdhdhdididicbhOhPhQcbhRcbhRcbhRcbhRcbhRcbbZbZcbgFgFgFgFgFgFgFhScbbZbZcObSbSbSbSbSeGbSbSbSbScabSbSbSbSeGbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSeHcacacphTabababababababababababababababababababababababababdqdtbZbZbZbZbZbZbZbZbZbZbZbZcGcWcWababababababababababababababababababababababababababababhphehfhfhfhfhfhfhfgXgMabababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcdbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcbhPhPhPcbhUhVhUhVhUhVhUhVhUcbbZbZcbgFhvgFgFgFgFhWhXcbbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcYbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcbabababababababababababababababababababababababababababcbbZbZbZbZbZbZbZbZbZbZcYbZcVcWdbababababababababababababababababababababababababababababhphehfhfhfhfhfhfhfhghhabababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcdbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcbhYhPhZcbhPhPhPhPhPhPiahPhPcabZchcbgFgFgFgFgFibgRgFcbbZcYbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcbabababababababababababababababababababababababababababcbbZbZbZbZbZbZbZbZbZbZbZbZdacWcWababababababababababababababababababababababababababababhphehfhfhfhfhfhfhfhghqabababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcsbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcbhPhPhPgDichPhPhPhPhPidhPhPcabZbZcbieifgFieifgFieifcbbZbZcrbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbShTabababababababababababababababababababababababababababdqbSbSbSbSbSbSbSbSbSbSbSbSbSbSfiababababababababababababababababababababababababababababiggXgXgXgXgXgXgXgXgXhzabababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcsbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcbhPhPhPgDichPhPhPhPhPidhPhPcabZbZcbiegFgFiegFgFiegFcbbZbZcrbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbShTabababababababababababababababababababababababababababdqbSbSbSbSbSbSbSbSbSbSbSbSbSbShTababababababababababababababababababababababababababababiggXgXgXgXgXgXgXgXgXhzabababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcsbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcbhYhPhQhVhPhPhPhPhPhPiahPihcbbZbZcbgFgFgFgFgFgFgFgFcbbZbZcGcHcHcHcHcHcHcGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababgLhzababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcsbZbZbZbZbZbZbZcobZbZbZbZbZbZbZbZcbhPhPhPhUhPhPhPhPhPhPhPhPihcbbZbZcbiiijikiiijikiiijcbbZbZcGcHcHcHcHcHcHcGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcdbZbZbZbZbZbZbZbZbZilbZimcKcJbZcmcpbQbQbQbQbQbQbQbQbQbQbQbQbQeHbZbZcObSbSbSbSbSbSbSbSeHbZbZcpbQbQbQbQbQbQfiababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcsbZbZbZbZbZbZbZcobZbZbZbZbZbZbZbZcbhPhPhPhUhPhPhPhPhPhPhPhPihcbbZbZcbiiikikiiikikiiikcbbZbZcGcHcHcHcHcHcHcGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcdbZbZbZbZbZbZbZbZbZilbZimcKcJbZcmcpbQbQbQbQbQbQbQbQbQbQbQbQbQeHbZbZcObSbSbSbSbSbSbSbSeHbZbZcpbQbQbQbQbQbQhTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcdbZbZbZbZbZbZbZbZbZbZbZbZbZcKincKcabZbZbZbZimbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcbabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababiobVbWipbZbZbZbZbZbZimbZbZbZcIcIcKcmcKcabZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZchbZbZbZbZbZbZbZbZbZbZbZcbabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
-ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdqbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQeGbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbSbSbSbSbSbSbSbSbSbSbSfiabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
+ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdqbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQeGbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbSbSbSbSbSbSbSbSbSbSbShTabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab
@@ -730,3 +728,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
+
diff --git a/_maps/map_files/RandomZLevels/spacehotel.dmm b/_maps/map_files/RandomZLevels/spacehotel.dmm
index ce1e5a290e9..d3c520a6696 100644
--- a/_maps/map_files/RandomZLevels/spacehotel.dmm
+++ b/_maps/map_files/RandomZLevels/spacehotel.dmm
@@ -1,324 +1,718 @@
-"aa" = (/turf/space,/area/space)
-"ab" = (/turf/unsimulated/wall,/area/space)
-"ac" = (/turf/unsimulated/wall,/area/awaymission)
-"ad" = (/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/wall,/area/awaymission)
-"ae" = (/obj/machinery/power/terminal,/turf/simulated/floor/plating,/area/awaymission)
-"af" = (/obj/machinery/power/apc/noalarm{dir = 1; pixel_y = 32},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/awaymission)
-"ag" = (/mob/living/simple_animal/hostile/alien/queen,/turf/simulated/floor/carpet,/area/awaymission)
-"ah" = (/obj/item/stack/cable_coil/random,/obj/effect/decal/remains/human,/turf/simulated/floor/plating,/area/awaymission)
-"ai" = (/turf/simulated/floor/plating,/area/awaymission)
-"aj" = (/obj/machinery/power/smes/magical,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/awaymission)
-"ak" = (/obj/structure/toilet{dir = 1},/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/item/organ/internal/body_egg/alien_embryo,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"al" = (/obj/machinery/shower{dir = 8},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"am" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/awaymission)
-"an" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/awaymission)
-"ao" = (/turf/simulated/wall,/area/awaymission)
-"ap" = (/obj/machinery/door/airlock/highsecurity,/turf/simulated/floor/plating,/area/awaymission)
-"aq" = (/turf/unsimulated/beach/water,/area/awaymission)
-"ar" = (/obj/structure/window{dir = 4},/obj/machinery/shower,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/awaymission)
-"as" = (/obj/structure/rack,/obj/item/clothing/suit/apron,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/holidaypriest,/obj/item/clothing/suit/judgerobe,/obj/item/clothing/suit/storage/labcoat,/obj/item/clothing/suit/nun,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/suit/wizrobe/fake,/obj/item/clothing/suit/wizrobe/marisa/fake,/obj/effect/decal/cleanable/greenglow,/turf/simulated/floor/carpet,/area/awaymission)
-"at" = (/obj/structure/rack,/obj/item/clothing/head/collectable/police,/obj/item/clothing/head/nun_hood,/obj/item/clothing/head/mailman,/obj/item/clothing/head/nursehat,/obj/item/clothing/head/wizard/fake,/obj/item/clothing/head/powdered_wig,/obj/item/clothing/head/wizard/marisa/fake,/obj/machinery/camera{c_tag = "Gold Suite"; c_tag_order = 999; network = list("Hotel")},/obj/item/clothing/mask/gas/sexyclown,/turf/simulated/floor/carpet,/area/awaymission)
-"au" = (/obj/structure/rack,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/head/kitty,/obj/item/clothing/head/rabbitears,/obj/item/clothing/mask/muzzle,/obj/item/clothing/accessory/stethoscope,/turf/simulated/floor/carpet,/area/awaymission)
-"av" = (/obj/structure/dresser,/turf/simulated/floor/carpet,/area/awaymission)
-"aw" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/carpet,/area/awaymission)
-"ax" = (/obj/structure/rack,/obj/item/clothing/suit/apron,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/holidaypriest,/obj/item/clothing/suit/judgerobe,/obj/item/clothing/suit/storage/labcoat,/obj/item/clothing/suit/nun,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/suit/wizrobe/fake,/obj/item/clothing/suit/xenos,/obj/item/clothing/suit/wizrobe/marisa/fake,/turf/simulated/floor/carpet,/area/awaymission)
-"ay" = (/obj/structure/rack,/obj/item/clothing/head/collectable/police,/obj/item/clothing/head/nun_hood,/obj/item/clothing/head/mailman,/obj/item/clothing/head/nursehat,/obj/item/clothing/head/wizard/fake,/obj/item/clothing/head/powdered_wig,/obj/item/clothing/head/xenos,/obj/item/clothing/head/wizard/marisa/fake,/obj/machinery/camera{c_tag = "Silver Suite"; c_tag_order = 999; network = list("Hotel")},/obj/item/clothing/mask/gas/sexyclown,/turf/simulated/floor/carpet,/area/awaymission)
-"az" = (/turf/simulated/floor/wood,/area/awaymission)
-"aA" = (/obj/structure/toilet,/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Bathroom1"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"aB" = (/obj/structure/toilet,/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Bathroom2"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"aC" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"aD" = (/obj/structure/closet/secure_closet/personal,/obj/machinery/camera{c_tag = "Locker Room"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"aE" = (/obj/structure/toilet,/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Bathroom3"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"aF" = (/obj/structure/toilet,/obj/machinery/light/small{dir = 1},/obj/machinery/camera{c_tag = "Bathroom4"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"aG" = (/obj/structure/window{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/awaymission)
-"aH" = (/turf/simulated/floor/carpet,/area/awaymission)
-"aI" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/captain,/turf/simulated/floor/carpet,/area/awaymission)
-"aJ" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/hop,/turf/simulated/floor/carpet,/area/awaymission)
-"aK" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/wood,/area/awaymission)
-"aL" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/wood,/area/awaymission)
-"aM" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/wood,/area/awaymission)
-"aN" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"aO" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"aP" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"aQ" = (/obj/machinery/light{dir = 8},/obj/item/weapon/soap/deluxe,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/awaymission)
-"aR" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteblue"},/area/awaymission)
-"aS" = (/obj/structure/window{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"},/area/awaymission)
-"aT" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/wood,/area/awaymission)
-"aU" = (/obj/machinery/gateway/centeraway,/turf/simulated/floor/wood,/area/awaymission)
-"aV" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor/wood,/area/awaymission)
-"aW" = (/obj/machinery/door/airlock,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"aX" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"aY" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"aZ" = (/obj/machinery/door/window/eastleft,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"ba" = (/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission)
-"bb" = (/obj/machinery/door_control{id = "Gold Suite"; name = "Gold Suite Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaymission)
-"bc" = (/obj/machinery/door_control{id = "Silver Suite"; name = "Silver Suite Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet,/area/awaymission)
-"bd" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/wood,/area/awaymission)
-"be" = (/obj/machinery/gateway,/turf/simulated/floor/wood,/area/awaymission)
-"bf" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/wood,/area/awaymission)
-"bg" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"bh" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"bi" = (/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"bj" = (/obj/structure/mirror,/obj/structure/sink{icon_state = "sink"; dir = 4; pixel_x = -12; pixel_y = 2},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"bk" = (/obj/machinery/door/airlock/gold{id_tag = "Gold Suite"; name = "Gold Suite"},/turf/simulated/floor/carpet,/area/awaymission)
-"bl" = (/obj/machinery/door/airlock/silver{id_tag = "Silver Suite"; name = "Silver Suite"},/turf/simulated/floor/carpet,/area/awaymission)
-"bm" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/space)
-"bn" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet,/area/awaymission)
-"bo" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/space)
-"bp" = (/turf/simulated/floor/carpet{icon_state = "carpetsymbol"},/area/awaymission)
-"bq" = (/obj/machinery/light,/turf/simulated/floor/carpet,/area/awaymission)
-"br" = (/obj/structure/stool/bed/chair/comfy,/turf/simulated/floor/carpet,/area/awaymission)
-"bs" = (/turf/unsimulated/wall/fakeglass,/area/space)
-"bt" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/carpet,/area/awaymission)
-"bu" = (/obj/machinery/light{dir = 8},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/carpet,/area/awaymission)
-"bv" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet,/area/awaymission)
-"bw" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"},/area/awaymission)
-"bx" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/awaymission)
-"by" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitebluecorner"},/area/awaymission)
-"bz" = (/obj/machinery/door/airlock{id_tag = "Room301"; name = "Room301"},/turf/simulated/floor/plasteel,/area/awaymission)
-"bA" = (/obj/machinery/door/airlock{id_tag = "Room302"; name = "Room302"},/turf/simulated/floor/plasteel,/area/awaymission)
-"bB" = (/obj/machinery/door/airlock{id_tag = "Room303"; name = "Room303"},/turf/simulated/floor/plasteel,/area/awaymission)
-"bC" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"},/area/awaymission)
-"bD" = (/turf/simulated/shuttle/floor,/area/awaymission)
-"bE" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/awaymission)
-"bF" = (/obj/machinery/camera{c_tag = "Room 301"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission)
-"bG" = (/obj/machinery/door_control{name = "Room301 Bolt Control"; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; id = "Room301"; normaldoorcontrol = 1; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission)
-"bH" = (/obj/machinery/camera{c_tag = "Room 302"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission)
-"bI" = (/obj/machinery/door_control{id = "Room302"; name = "Room302 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission)
-"bJ" = (/obj/structure/dresser,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/turf/simulated/floor/carpet,/area/awaymission)
-"bK" = (/obj/machinery/camera{c_tag = "Room 303"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission)
-"bL" = (/obj/machinery/door_control{id = "Room303"; name = "Room303 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission)
-"bM" = (/obj/machinery/light{dir = 1},/turf/unsimulated/beach/water,/area/awaymission)
-"bN" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/awaymission)
-"bO" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet,/area/awaymission)
-"bP" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/turf/simulated/floor/carpet,/area/awaymission)
-"bQ" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/carpet,/area/awaymission)
-"bR" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/space)
-"bS" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission)
-"bT" = (/obj/structure/window,/turf/simulated/floor/carpet,/area/awaymission)
-"bU" = (/obj/machinery/door/window/southright,/turf/simulated/floor/carpet,/area/awaymission)
-"bV" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/awaymission)
-"bW" = (/obj/structure/mirror,/turf/simulated/wall,/area/awaymission)
-"bX" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"bY" = (/obj/machinery/shower{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"bZ" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/effect/decal/cleanable/vomit,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"ca" = (/obj/structure/toilet{dir = 1},/obj/effect/decal/cleanable/vomit,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"cb" = (/obj/machinery/light{dir = 8},/turf/unsimulated/beach/water,/area/awaymission)
-"cc" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/beach/water,/area/awaymission)
-"cd" = (/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet,/area/awaymission)
-"ce" = (/obj/machinery/door/airlock{id_tag = "Room201"; name = "Room201"},/turf/simulated/floor/plasteel,/area/awaymission)
-"cf" = (/obj/machinery/door/airlock{id_tag = "Room202"; name = "Room202"},/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/simulated/floor/plasteel,/area/awaymission)
-"cg" = (/obj/machinery/door/airlock{id_tag = "Room203"; name = "Room203"},/turf/simulated/floor/plasteel,/area/awaymission)
-"ch" = (/obj/machinery/camera{c_tag = "Room 201"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission)
-"ci" = (/obj/machinery/door_control{id = "Room201"; name = "Room201 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission)
-"cj" = (/obj/structure/dresser,/obj/item/weapon/lipstick/jade,/turf/simulated/floor/carpet,/area/awaymission)
-"ck" = (/obj/machinery/camera{c_tag = "Room 202"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission)
-"cl" = (/obj/machinery/door_control{id = "Room202"; name = "Room202 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission)
-"cm" = (/obj/machinery/camera{c_tag = "Room 203"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission)
-"cn" = (/obj/machinery/door_control{id = "Room203"; name = "Room203 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission)
-"co" = (/obj/structure/dresser,/obj/item/weapon/lipstick/purple,/turf/simulated/floor/carpet,/area/awaymission)
-"cp" = (/obj/machinery/light,/turf/unsimulated/beach/water,/area/awaymission)
-"cq" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/green,/turf/simulated/floor/carpet,/area/awaymission)
-"cr" = (/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/simulated/floor/carpet,/area/awaymission)
-"cs" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/simulated/floor/carpet,/area/awaymission)
-"ct" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/purple,/turf/simulated/floor/carpet,/area/awaymission)
-"cu" = (/obj/item/weapon/beach_ball,/turf/simulated/shuttle/floor,/area/awaymission)
-"cv" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/flour{desc = "Rather caked in there."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet,/area/awaymission)
-"cw" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/awaymission)
-"cx" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitebluecorner"},/area/awaymission)
-"cy" = (/obj/machinery/door/window/southright,/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/simulated/floor/carpet,/area/awaymission)
-"cz" = (/obj/structure/window,/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/simulated/floor/carpet,/area/awaymission)
-"cA" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/carpet,/area/awaymission)
-"cB" = (/obj/structure/table,/turf/simulated/floor/carpet,/area/awaymission)
-"cC" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission)
-"cD" = (/obj/structure/stool,/turf/simulated/floor/carpet,/area/awaymission)
-"cE" = (/obj/machinery/door/airlock{id_tag = "Room101"; name = "Room101"},/turf/simulated/floor/plasteel,/area/awaymission)
-"cF" = (/obj/machinery/door/airlock{id_tag = "Room102"; name = "Room102"},/turf/simulated/floor/plasteel,/area/awaymission)
-"cG" = (/obj/machinery/door/airlock{id_tag = "Room103"; name = "Room103"},/turf/simulated/floor/plasteel,/area/awaymission)
-"cH" = (/obj/machinery/camera{c_tag = "Room 101"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission)
-"cI" = (/obj/machinery/door_control{id = "Room101"; name = "Room101 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission)
-"cJ" = (/obj/structure/dresser,/obj/item/clothing/head/xenos,/turf/simulated/floor/carpet,/area/awaymission)
-"cK" = (/obj/machinery/camera{c_tag = "Room 102"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission)
-"cL" = (/obj/machinery/door_control{id = "Room102"; name = "Room102 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission)
-"cM" = (/obj/effect/decal/cleanable/blood/gibs/old,/turf/simulated/floor/carpet,/area/awaymission)
-"cN" = (/obj/machinery/camera{c_tag = "Room 103"; c_tag_order = 999; network = list("Hotel")},/turf/simulated/floor/carpet,/area/awaymission)
-"cO" = (/obj/machinery/door_control{id = "Room103"; name = "Room103 Bolt Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission)
-"cP" = (/turf/simulated/floor/plasteel,/area/awaymission)
-"cQ" = (/mob/living/simple_animal/hostile/retaliate/goat,/turf/simulated/floor/plasteel,/area/awaymission)
-"cS" = (/obj/structure/stool/bed/nest,/turf/simulated/floor/carpet,/area/awaymission)
-"cT" = (/obj/structure/stool/bed/alien,/obj/item/xenos_claw,/turf/simulated/floor/carpet,/area/awaymission)
-"cU" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/yellow,/turf/simulated/floor/carpet,/area/awaymission)
-"cV" = (/obj/machinery/light{dir = 8},/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission)
-"cW" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission)
-"cX" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/red,/turf/simulated/floor/carpet,/area/awaymission)
-"cY" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel,/area/awaymission)
-"cZ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/turf/simulated/floor/plasteel,/area/awaymission)
-"da" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/awaymission)
-"db" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/structure/table,/turf/simulated/floor/plasteel,/area/awaymission)
-"dc" = (/obj/effect/gibspawner/xeno,/turf/simulated/floor/carpet,/area/awaymission)
-"dd" = (/obj/effect/decal/remains/human,/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission)
-"de" = (/obj/structure/stool/bed/alien,/obj/item/clothing/suit/xenos,/turf/simulated/floor/carpet,/area/awaymission)
-"df" = (/obj/machinery/optable,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission)
-"dg" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/red,/obj/effect/decal/cleanable/blood/gibs/old,/turf/simulated/floor/carpet,/area/awaymission)
-"dh" = (/obj/machinery/vending/boozeomat,/turf/simulated/floor/plasteel,/area/awaymission)
-"di" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/turf/simulated/floor/plasteel,/area/awaymission)
-"dj" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/simulated/floor/plasteel,/area/awaymission)
-"dk" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/turf/simulated/floor/plasteel,/area/awaymission)
-"dl" = (/obj/machinery/atmospherics/pipe/simple{icon_state = "intact-b-f"; level = 1; name = "pipe"},/obj/structure/table,/obj/item/weapon/book/manual/chef_recipes,/turf/simulated/floor/plasteel,/area/awaymission)
-"dm" = (/obj/structure/window,/obj/structure/alien/weeds/node,/turf/simulated/floor/carpet,/area/awaymission)
-"dn" = (/obj/structure/window,/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/carpet,/area/awaymission)
-"do" = (/obj/machinery/door/window/southright,/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/simulated/floor/carpet,/area/awaymission)
-"dp" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick/black,/turf/simulated/floor/carpet,/area/awaymission)
-"dq" = (/obj/structure/window,/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/cleanable/blood/gibs/old,/turf/simulated/floor/carpet,/area/awaymission)
-"dr" = (/obj/structure/window,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission)
-"ds" = (/obj/machinery/door/window/southright,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/carpet,/area/awaymission)
-"dt" = (/obj/machinery/vending/dinnerware,/turf/simulated/floor/plasteel,/area/awaymission)
-"du" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"dw" = (/obj/machinery/door/window/eastleft,/obj/structure/alien/weeds,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/awaymission)
-"dy" = (/obj/machinery/light,/turf/simulated/floor/plasteel,/area/awaymission)
-"dz" = (/obj/machinery/processor,/turf/simulated/floor/plasteel,/area/awaymission)
-"dA" = (/obj/machinery/chem_master/condimaster,/turf/simulated/floor/plasteel,/area/awaymission)
-"dB" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/simulated/floor/plasteel,/area/awaymission)
-"dC" = (/obj/structure/table,/obj/machinery/microwave,/turf/simulated/floor/plasteel,/area/awaymission)
-"dD" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/simulated/floor/plasteel,/area/awaymission)
-"dE" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor/plasteel,/area/awaymission)
-"dF" = (/obj/structure/kitchenspike,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel,/area/awaymission)
-"dG" = (/obj/machinery/door/airlock,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/plasteel,/area/awaymission)
-"dH" = (/obj/item/weapon/bananapeel,/obj/item/toy/spinningtoy,/turf/simulated/floor/carpet,/area/awaymission)
-"dI" = (/obj/structure/barricade/wooden,/turf/simulated/floor/carpet,/area/awaymission)
-"dJ" = (/obj/item/target/syndicate,/turf/simulated/floor/carpet,/area/awaymission)
-"dK" = (/obj/item/trash/candy,/turf/simulated/floor/carpet,/area/awaymission)
-"dL" = (/obj/item/toy/spinningtoy,/turf/simulated/floor/carpet,/area/awaymission)
-"dM" = (/obj/item/weapon/gun/projectile/shotgun/toy/crossbow,/turf/simulated/floor/carpet,/area/awaymission)
-"dN" = (/obj/structure/barricade/wooden,/obj/structure/barricade/wooden,/turf/simulated/floor/carpet,/area/awaymission)
-"dO" = (/obj/machinery/door/airlock,/turf/simulated/floor/carpet,/area/awaymission)
-"dP" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/wall,/area/awaymission)
-"dQ" = (/obj/effect/decal/remains/human,/obj/item/clothing/head/soft/red,/turf/simulated/floor/carpet,/area/awaymission)
-"dR" = (/obj/item/toy/prize/honk,/turf/simulated/floor/carpet,/area/awaymission)
-"dS" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/carpet,/area/awaymission)
-"dT" = (/obj/machinery/vending/sovietsoda,/turf/simulated/floor/carpet,/area/awaymission)
-"dU" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; dir = 4; network = "Hotel"; use_power = 1},/turf/simulated/floor/carpet,/area/awaymission)
-"dV" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission)
-"dW" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; network = "Hotel"; use_power = 0},/turf/simulated/floor/carpet,/area/awaymission)
-"dX" = (/turf/simulated/wall/cult,/area/awaymission)
-"dY" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/engine/cult,/area/awaymission)
-"dZ" = (/obj/effect/decal/remains/human,/turf/simulated/floor/carpet,/area/awaymission)
-"ea" = (/obj/item/trash/candle,/obj/item/trash/candle,/obj/item/trash/candle,/turf/simulated/floor/carpet,/area/awaymission)
-"eb" = (/obj/machinery/vending/snack,/turf/simulated/floor/carpet,/area/awaymission)
-"ec" = (/obj/structure/stool/bed/chair{dir = 1},/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet,/area/awaymission)
-"ed" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/carpet,/area/awaymission)
-"ee" = (/turf/simulated/floor/engine/cult,/area/awaymission)
-"ef" = (/obj/effect/gibspawner/human,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/engine/cult,/area/awaymission)
-"eg" = (/obj/item/toy/sword,/turf/simulated/floor/carpet,/area/awaymission)
-"eh" = (/obj/machinery/vending/cola,/turf/simulated/floor/carpet,/area/awaymission)
-"ei" = (/obj/item/candle,/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/engine/cult,/area/awaymission)
-"ej" = (/obj/effect/rune,/obj/item/organ/brain,/turf/simulated/floor/engine/cult,/area/awaymission)
-"ek" = (/obj/item/candle,/turf/simulated/floor/engine/cult,/area/awaymission)
-"el" = (/obj/item/weapon/tome,/turf/simulated/floor/engine/cult,/area/awaymission)
-"em" = (/obj/effect/rune,/turf/simulated/floor/engine/cult,/area/awaymission)
-"en" = (/obj/structure/stool/bed/chair/comfy,/obj/item/device/soulstone,/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/remains/human,/turf/simulated/floor/engine/cult,/area/awaymission)
-"eo" = (/obj/effect/gibspawner/human,/turf/simulated/floor/engine/cult,/area/awaymission)
-"ep" = (/obj/item/trash/sosjerky,/turf/simulated/floor/carpet,/area/awaymission)
-"eq" = (/obj/structure/table/woodentable,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor/carpet,/area/awaymission)
-"er" = (/obj/item/latexballon,/obj/item/latexballon,/turf/simulated/floor/carpet,/area/awaymission)
-"es" = (/obj/structure/rack,/obj/item/key,/obj/item/key,/obj/item/key,/obj/item/key,/obj/item/key,/turf/simulated/floor/carpet,/area/awaymission)
-"et" = (/obj/structure/stool/bed/chair/comfy,/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet,/area/awaymission)
-"eu" = (/obj/structure/stool/bed/chair/comfy,/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/simulated/floor/carpet,/area/awaymission)
-"ev" = (/obj/item/weapon/restraints/legcuffs,/turf/simulated/floor/engine/cult,/area/awaymission)
-"ew" = (/obj/machinery/space_heater,/turf/simulated/floor/carpet,/area/awaymission)
-"ex" = (/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/awaymission)
-"ey" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; dir = 1; network = "Hotel"; use_power = 0},/turf/simulated/floor/carpet,/area/awaymission)
-"ez" = (/obj/item/weapon/melee/cultblade,/turf/simulated/floor/engine/cult,/area/awaymission)
-"eA" = (/obj/item/weapon/kitchen/knife/butcher{blood_DNA = 1e+009},/obj/effect/decal/cleanable/blood/old,/turf/simulated/floor/engine/cult,/area/awaymission)
-"eB" = (/obj/structure/table/woodentable,/obj/item/weapon/pen,/turf/simulated/floor/carpet,/area/awaymission)
-"eC" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/remains/human,/turf/simulated/floor/carpet{icon_state = "carpetnoconnect"},/area/awaymission)
-"eD" = (/obj/structure/table/woodentable,/obj/item/weapon/clipboard,/obj/item/weapon/paper,/turf/simulated/floor/carpet,/area/awaymission)
-"eE" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor/carpet,/area/awaymission)
-"eF" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/turf/simulated/floor/carpet,/area/awaymission)
-"eG" = (/turf/unsimulated/wall/fakeglass{dir = 10; icon_state = "fakewindows"},/area/space)
-"eH" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/space)
-"eI" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/space)
-"eJ" = (/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/turf/simulated/floor/plating,/area/awaymission)
-"eK" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/awaymission)
-"eL" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/awaymission)
-"eM" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/space)
-"eN" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/awaymission)
-"eO" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/plating,/area/awaymission)
-"eP" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/awaymission)
-"eQ" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/wall{icon_state = "swallc4"; dir = 2},/area/awaymission)
-"eR" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor,/area/awaymission)
-"eS" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/awaymission)
-"eT" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/floor,/area/awaymission)
-"eU" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/turf/simulated/floor/plating/airless,/area/awaymission)
-"eV" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space,/area/awaymission)
-"eW" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/floor,/area/awaymission)
-"eX" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor,/area/awaymission)
-"eY" = (/obj/structure/window/reinforced{dir = 4},/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/floor,/area/awaymission)
-"eZ" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/awaymission)
-"fa" = (/turf/simulated/shuttle/wall{icon_state = "swallc1"; dir = 2},/area/awaymission)
-"fb" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor,/area/awaymission)
-"fc" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/floor,/area/awaymission)
-"fd" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/awaymission)
+"aa" = (/turf/unsimulated/wall{icon = 'icons/turf/mining.dmi'; icon_state = "rock"},/area/awaymission{name = "Snowland"; requires_power = 0})
+"ab" = (/turf/unsimulated/wall/metal,/area/awaymission/undersea{requires_power = 0})
+"ac" = (/turf/unsimulated/wall{icon = 'icons/turf/mining.dmi'; icon_state = "rock"},/area/awaymission/beach)
+"ad" = (/turf/unsimulated/floor/lava/dense,/area/awaymission)
+"ae" = (/turf/unsimulated/wall/metal,/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"af" = (/turf/unsimulated/wall{dynamic_lighting = 0; icon = null},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"ag" = (/turf/template_noop,/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"ah" = (/turf/template_noop,/area/template_noop)
+"ai" = (/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0})
+"aj" = (/obj/machinery/light{dir = 1},/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0})
+"ak" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"al" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"am" = (/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"an" = (/obj/effect/view_portal{id = "mazeland_111"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"ao" = (/obj/effect/view_portal/visual{dir = 4; dist = 2; id = "mazeland_121"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"ap" = (/obj/effect/view_portal/visual{dir = 1; dist = 2; id = "mazeland_332"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"aq" = (/obj/effect/view_portal/visual{dir = 1; dist = 5; frustrum = 1; id = "mazeland_room"; radius = 0},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"ar" = (/obj/effect/view_portal/visual{dir = 1; dist = 2; id = "mazeland_331"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"as" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"at" = (/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"au" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"av" = (/obj/effect/view_portal{id = "mazeland_211"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"aw" = (/obj/effect/view_portal{id = "mazeland"},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"ax" = (/obj/effect/view_portal{id = "mazeland_411"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"ay" = (/mob/living/simple_animal/hostile/retaliate/carp,/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0})
+"az" = (/obj/effect/view_portal{id = "mazeland_112"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"aA" = (/obj/effect/view_portal/visual{dir = 4; dist = 2; id = "mazeland_122"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"aB" = (/obj/effect/view_portal{id = "mazeland_31"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"aC" = (/turf/unsimulated/wall/metal,/area/awaymission{name = "Snowland"; requires_power = 0})
+"aD" = (/turf/unsimulated/wall{dynamic_lighting = 0; icon = null},/area/awaymission{name = "Snowland"; requires_power = 0})
+"aE" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"aF" = (/obj/item/weapon/paper/hotel_scrap_5,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"aG" = (/mob/living/simple_animal/hostile/pirate,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"aH" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"aI" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"aJ" = (/obj/effect/view_portal/visual{dir = 1; dist = 3; id = "snowland_room"; radius = 3},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"aK" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/mob/living/simple_animal/hostile/bear,/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0})
+"aL" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"aM" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"aN" = (/obj/effect/view_portal/visual{dir = 8; dist = 2; id = "mazeland_111"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"aO" = (/obj/effect/view_portal{id = "mazeland_121"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"aP" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"aQ" = (/obj/effect/view_portal/visual{dir = 8; dist = 2; id = "mazeland_31"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"aR" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows"; opacity = 1},/area/awaymission{name = "Snowland"; requires_power = 0})
+"aS" = (/turf/unsimulated/wall/fakeglass{dir = 4; icon_state = "fakewindows"; opacity = 0},/area/awaymission{name = "Snowland"; requires_power = 0})
+"aT" = (/obj/effect/view_portal{id = "snowland"},/obj/effect/decal/snow/sand/surround{icon_state = "gravsnow_surround"; dir = 1},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"aU" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows"; opacity = 0},/area/awaymission{name = "Snowland"; requires_power = 0})
+"aV" = (/turf/unsimulated/wall/fakeglass{dir = 4; icon_state = "fakewindows"; opacity = 1},/area/awaymission{name = "Snowland"; requires_power = 0})
+"aW" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0})
+"aX" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0})
+"aY" = (/obj/machinery/light{dir = 8},/mob/living/simple_animal/hostile/retaliate/carp,/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0})
+"aZ" = (/obj/structure/ladder/dive_point/anchor{id = "weirddive"; layer = 4.5},/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0})
+"ba" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0})
+"bb" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 4},/obj/structure/closet/athletic_mixed,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"bc" = (/turf/unsimulated/wall{icon_state = "sandstone6"},/area/awaymission/beach)
+"bd" = (/turf/unsimulated/wall{icon_state = "sandstone12"},/area/awaymission/beach)
+"be" = (/turf/unsimulated/wall{icon_state = "sandstone10"},/area/awaymission/beach)
+"bf" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 8},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"bg" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"bh" = (/obj/effect/decal/snow/sand/edge{icon_state = "gravsnow_corner"; dir = 1},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/machinery/light{dir = 8},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"bi" = (/obj/effect/decal/snow/sand/edge{icon_state = "gravsnow_corner"; dir = 1},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"bj" = (/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"bk" = (/obj/effect/decal/snow/sand/edge{icon_state = "gravsnow_corner"; dir = 1},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"bl" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/obj/effect/decal/snow/clean/edge,/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0})
+"bm" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal/snow/clean/edge{icon_state = "snow_corner"; dir = 6},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0})
+"bn" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 4},/obj/item/clothing/shoes/sandal,/obj/item/clothing/shoes/sandal,/obj/item/clothing/shoes/sandal,/obj/structure/closet/crate,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"bo" = (/turf/unsimulated/wall{icon_state = "sandstone3"},/area/awaymission/beach)
+"bp" = (/turf/unsimulated/wall{dynamic_lighting = 0; icon = null},/area/awaymission/beach)
+"bq" = (/obj/item/weapon/beach_ball,/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"br" = (/obj/effect/view_portal/visual{dir = 8; dist = 2; id = "mazeland_212"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"bs" = (/obj/effect/view_portal{id = "mazeland_122"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"bt" = (/obj/effect/view_portal{id = "mazeland_212"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"bu" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"bv" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"bw" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"bx" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"by" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"bz" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 4},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"bA" = (/turf/unsimulated/wall{icon_state = "sandstone1"},/area/awaymission/beach)
+"bB" = (/obj/effect/view_portal/visual{dir = 1; dist = 3; id = "beach_room"; radius = 2},/turf/unsimulated/floor,/area/awaymission/beach)
+"bC" = (/mob/living/simple_animal/crab{faction = list("neutral","pirate")},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"bD" = (/turf/unsimulated/floor/lava,/area/awaymission)
+"bE" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/obj/structure/closet/crate/secure/loot,/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0})
+"bF" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0})
+"bG" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"bH" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"bI" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"bJ" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 1},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"bK" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 1},/obj/effect/view_portal{id = "beach"},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"bL" = (/obj/effect/decal/snow/sand/edge{dir = 9; icon_state = "gravsnow_corner"; name = "rough sand"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission)
+"bM" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 1},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission)
+"bN" = (/obj/effect/decal/snow/sand/edge{dir = 5; icon_state = "gravsnow_corner"; name = "rough sand"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission)
+"bO" = (/obj/effect/view_portal{id = "mazeland_213"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"bP" = (/obj/structure/toilet{pixel_y = 8},/obj/machinery/light,/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"bQ" = (/obj/effect/view_portal{id = "mazeland_413"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"bR" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/obj/effect/decal/snow/clean/edge{icon_state = "snow_corner"; dir = 6},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0})
+"bS" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"bT" = (/obj/structure/flora/bush,/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"bU" = (/obj/structure/flora/grass/green,/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"bV" = (/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission)
+"bW" = (/obj/effect/view_portal/visual{dir = 1; dist = 7; id = "mazeland_213"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"bX" = (/obj/effect/view_portal/visual{dir = 1; dist = 7; id = "mazeland_413"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"bY" = (/obj/effect/view_portal/visual{dist = 2; id = "mazeland_131"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"bZ" = (/obj/effect/view_portal{id = "mazeland_331"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"ca" = (/obj/effect/view_portal{id = "mazeland_332"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"cb" = (/obj/effect/view_portal/visual{dist = 2; id = "mazeland_132"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"cc" = (/obj/structure/window/reinforced/tinted,/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0})
+"cd" = (/obj/machinery/door/window/southright,/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0})
+"ce" = (/obj/structure/window/reinforced/tinted,/obj/machinery/light,/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0})
+"cf" = (/obj/effect/light_emitter{invisibility = 101; light_color = "#ffffc0"; light_power = 2},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission)
+"cg" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 4},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission)
+"ch" = (/obj/effect/view_portal{id = "mazeland_131"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"ci" = (/obj/effect/view_portal{id = "mazeland_132"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"cj" = (/obj/effect/view_portal/visual{dir = 2; dist = 7; id = "mazeland_411"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"ck" = (/obj/effect/view_portal/visual{dir = 2; dist = 7; id = "mazeland_211"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"cl" = (/turf/unsimulated/wall/metal,/area/awaymission/spacehotel)
+"cm" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"cn" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"co" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"cp" = (/obj/machinery/shower{dir = 8},/obj/structure/curtain/open/shower{anchored = 1; opacity = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; opacity = 1},/area/awaymission/spacehotel)
+"cq" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 8},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission)
+"cr" = (/obj/item/candle/eternal,/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission)
+"cs" = (/obj/structure/mirror{dir = 8; pixel_x = -28},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"ct" = (/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"cu" = (/obj/structure/mirror{dir = 4; pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 12; pixel_y = 2},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"cv" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/structure/closet/crate/secure/loot,/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0})
+"cw" = (/obj/structure/flora/tree/pine,/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"cx" = (/obj/effect/view_portal{id = "poolland"},/obj/machinery/light/small,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"cy" = (/turf/unsimulated/floor,/area/awaymission/undersea{requires_power = 0})
+"cz" = (/obj/effect/levelref{id = "lavaland"; name = "lavaland"},/obj/effect/light_emitter{invisibility = 101; light_color = "#ffffc0"; light_power = 2},/obj/effect/rune,/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission)
+"cA" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/mob/living/simple_animal/hostile/bear,/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0})
+"cB" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0})
+"cC" = (/obj/structure/flora/grass/both,/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"cD" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/sand,/area/awaymission/beach)
+"cE" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 10},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission)
+"cF" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0})
+"cG" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal/snow/clean/edge,/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0})
+"cH" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/beach/coastline,/area/awaymission/beach)
+"cI" = (/obj/effect/waterfall{dir = 1; water_frequency = 104},/turf/unsimulated/beach/coastline,/area/awaymission/beach)
+"cJ" = (/turf/unsimulated/beach/coastline,/area/awaymission/beach)
+"cK" = (/obj/effect/waterfall{dir = 1; water_frequency = 97},/turf/unsimulated/beach/coastline,/area/awaymission/beach)
+"cL" = (/obj/effect/waterfall{dir = 1; water_frequency = 94},/turf/unsimulated/beach/coastline,/area/awaymission/beach)
+"cM" = (/obj/effect/waterfall{dir = 1; water_frequency = 192},/turf/unsimulated/beach/coastline,/area/awaymission/beach)
+"cN" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/beach/coastline/dense,/area/awaymission/beach)
+"cO" = (/turf/unsimulated/floor/chasm,/area/awaymission)
+"cP" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 6},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission)
+"cQ" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal/snow/clean/edge{icon_state = "snow_corner"; dir = 6},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission{name = "Snowland"; requires_power = 0})
+"cR" = (/obj/machinery/poolcontroller/seacontroller,/turf/unsimulated/wall/metal,/area/awaymission/undersea{requires_power = 0})
+"cS" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/beach/water,/area/awaymission/beach)
+"cT" = (/turf/unsimulated/beach/water,/area/awaymission/beach)
+"cU" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/water/dense,/area/awaymission/beach)
+"cV" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission)
+"cW" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"cX" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"cY" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/water,/area/awaymission/beach)
+"cZ" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/water,/area/awaymission/beach)
+"da" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/beach/water,/area/awaymission/beach)
+"db" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/beach/water,/area/awaymission/beach)
+"dc" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/beach/water,/area/awaymission/beach)
+"dd" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 8},/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 4},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission)
+"de" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"df" = (/obj/item/weapon/mop,/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0})
+"dg" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/water,/area/awaymission/beach)
+"dh" = (/obj/effect/decal/snow/sand/edge,/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"di" = (/obj/structure/mopbucket,/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0})
+"dj" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 6},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"dk" = (/turf/unsimulated/floor/chasm,/area/awaymission{name = "Snowland"; requires_power = 0})
+"dl" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 10},/turf/unsimulated/floor/snow,/area/awaymission{name = "Snowland"; requires_power = 0})
+"dm" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/beach/water/edge_drop,/area/awaymission/beach)
+"dn" = (/turf/unsimulated/beach/water/drop,/area/awaymission/beach)
+"do" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/beach/water/edge_drop,/area/awaymission/beach)
+"dp" = (/obj/effect/light_emitter{invisibility = 101; light_color = "#ffffc0"; light_power = 2},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/floor/chasm,/area/awaymission{name = "Snowland"; requires_power = 0})
+"dq" = (/obj/effect/light_emitter{invisibility = 101; light_color = "#ffffc0"; light_power = 2},/turf/unsimulated/floor/chasm,/area/awaymission{name = "Snowland"; requires_power = 0})
+"dr" = (/obj/effect/light_emitter{invisibility = 101; light_color = "#ffffc0"; light_power = 2},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/floor/chasm,/area/awaymission{name = "Snowland"; requires_power = 0})
+"ds" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/water/deep/dense,/area/awaymission/beach)
+"dt" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/water/deep/dense,/area/awaymission/beach)
+"du" = (/turf/unsimulated/beach/water/deep/dense,/area/awaymission/beach)
+"dv" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/beach/water/deep/dense,/area/awaymission/beach)
+"dw" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/floor/chasm,/area/awaymission{name = "Snowland"; requires_power = 0})
+"dx" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/turf/unsimulated/floor/chasm,/area/awaymission{name = "Snowland"; requires_power = 0})
+"dy" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_n"},/turf/unsimulated/floor/chasm,/area/awaymission{name = "Snowland"; requires_power = 0})
+"dz" = (/obj/machinery/light{dir = 8},/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0})
+"dA" = (/obj/structure/ladder/dive_point/anchor{layer = 4.5},/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0})
+"dB" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/beach/water/deep/dense,/area/awaymission/beach)
+"dC" = (/turf/unsimulated/beach/water/drop/dense,/area/awaymission/beach)
+"dD" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_e"},/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_s"},/turf/unsimulated/beach/water/deep/dense,/area/awaymission/beach)
+"dE" = (/obj/effect/decal/snow/sand/edge{name = "rough sand"},/obj/effect/decal/snow/sand/edge{name = "rough sand"; icon_state = "gravsnow_corner"; dir = 1},/turf/unsimulated/floor{icon_state = "asteroid"; name = "cave"},/area/awaymission)
+"dF" = (/turf/unsimulated/floor/lava,/area/awaymission{name = "Snowland"; requires_power = 0})
+"dG" = (/obj/effect/decal{name = "rock"; icon = 'icons/turf/mining.dmi'; icon_state = "rock_side_w"},/turf/unsimulated/beach/water/drop/dense,/area/awaymission/beach)
+"dH" = (/turf/unsimulated/floor/lava/dense,/area/awaymission{name = "Snowland"; requires_power = 0})
+"dI" = (/obj/machinery/light,/turf/unsimulated/beach/water/deep/wood_floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor"; name = "Pool Floor"},/area/awaymission/undersea{requires_power = 0})
+"dJ" = (/turf/unsimulated/wall{icon_state = "sandstone2"},/area/awaymission)
+"dK" = (/obj/effect/view_portal/visual{dist = 3; id = "cultroom"},/turf/template_noop,/area/awaymission)
+"dL" = (/turf/unsimulated/wall{icon_state = "sandstone5"},/area/awaymission)
+"dM" = (/turf/unsimulated/wall{icon_state = "sandstone12"},/area/awaymission)
+"dN" = (/turf/unsimulated/wall{icon_state = "sandstone9"},/area/awaymission)
+"dO" = (/turf/space,/area/space)
+"dP" = (/obj/effect/view_portal{id = "turbinespace"},/turf/space,/area/space)
+"dQ" = (/turf/unsimulated/wall,/area/space)
+"dR" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows"; opacity = 0},/area/space)
+"dS" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/space)
+"dT" = (/turf/unsimulated/wall/fakeglass{dir = 4; icon_state = "fakewindows"; opacity = 0},/area/space)
+"dU" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows"; opacity = 0},/area/awaymission/spacehotel)
+"dV" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/awaymission/spacehotel)
+"dW" = (/turf/unsimulated/wall/fakeglass{dir = 4; icon_state = "fakewindows"; opacity = 0},/area/awaymission/spacehotel)
+"dX" = (/turf/template_noop,/area/awaymission/spacehotel)
+"dY" = (/obj/machinery/camera{c_tag = "Room 110"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"dZ" = (/obj/machinery/camera{c_tag = "Room 111"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"ea" = (/obj/machinery/camera{c_tag = "Room 112"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"eb" = (/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"ec" = (/obj/structure/toilet,/obj/machinery/light/small{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"ed" = (/obj/structure/closet/secure_closet/personal,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"ee" = (/obj/structure/closet/secure_closet/personal,/obj/machinery/camera{c_tag = "Room X"; c_tag_order = 999; network = list("Hotel")},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"ef" = (/obj/machinery/camera{c_tag = "Room 210"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"eg" = (/obj/machinery/camera{c_tag = "Room 211"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"eh" = (/obj/machinery/camera{c_tag = "Room 212"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"ei" = (/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"ej" = (/obj/machinery/light/small{dir = 8},/obj/item/weapon/paper/hotel_scrap_2,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"ek" = (/obj/machinery/light/small{dir = 4},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"el" = (/obj/machinery/light/small{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"em" = (/obj/effect/landmark/map_loader/hotel_room,/turf/template_noop,/area/awaymission/spacehotel)
+"en" = (/obj/machinery/door/airlock,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"eo" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"ep" = (/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"eq" = (/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"er" = (/obj/structure/mirror{pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 12; pixel_y = 2},/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"es" = (/obj/effect/decal/cleanable/flour{desc = "Probably."},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"et" = (/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour{desc = "Probably."},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"eu" = (/obj/machinery/light{dir = 1},/obj/structure/mirror{pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 12; pixel_y = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission/spacehotel)
+"ev" = (/obj/machinery/door/unpowered/hotel_door{icon = 'icons/obj/doors/Doorgold.dmi'; id = 110},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"ew" = (/obj/machinery/door/unpowered/hotel_door{icon = 'icons/obj/doors/Doorgold.dmi'; id = 111},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"ex" = (/obj/machinery/door/unpowered/hotel_door{icon = 'icons/obj/doors/Doorgold.dmi'; id = 112},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"ey" = (/obj/machinery/door/unpowered/hotel_door{icon = 'icons/obj/doors/Doorgold.dmi'; id = 210},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"ez" = (/obj/machinery/door/unpowered/hotel_door{icon = 'icons/obj/doors/Doorgold.dmi'; id = 211},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"eA" = (/obj/machinery/door/unpowered/hotel_door{icon = 'icons/obj/doors/Doorgold.dmi'; id = 212},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"eB" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/space)
+"eC" = (/obj/machinery/light{dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"eD" = (/obj/machinery/light,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"eE" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/space)
+"eF" = (/obj/structure/closet/crate/bin,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"eG" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"eH" = (/obj/machinery/light{dir = 8},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"eI" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"eJ" = (/obj/structure/stool/bed/chair/comfy,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"eK" = (/obj/structure/window/reinforced,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"eL" = (/turf/unsimulated/wall/fakeglass,/area/space)
+"eM" = (/turf/unsimulated/floor{dir = 2; icon_state = "whitebluecorner"},/area/awaymission/spacehotel)
+"eN" = (/turf/unsimulated/floor{dir = 2; icon_state = "whiteblue"},/area/awaymission/spacehotel)
+"eO" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor{dir = 8; icon_state = "whitebluecorner"},/area/awaymission/spacehotel)
+"eP" = (/obj/machinery/light{dir = 1},/obj/structure/window/reinforced,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"eQ" = (/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"eR" = (/turf/unsimulated/floor/upperlevel,/area/awaymission/upperlevel)
+"eS" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor/upperlevel,/area/awaymission/upperlevel)
+"eT" = (/obj/machinery/door/unpowered/hotel_door{id = 107},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"eU" = (/obj/machinery/door/unpowered/hotel_door{id = 108},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"eV" = (/obj/machinery/door/unpowered/hotel_door{id = 109},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"eW" = (/obj/effect/decal{icon = 'icons/turf/floors.dmi'; icon_state = "wood_siding13"; name = "wood siding"},/turf/unsimulated/floor/grass,/area/awaymission/spacehotel)
+"eX" = (/turf/unsimulated/floor{dir = 4; icon_state = "whiteblue"},/area/awaymission/spacehotel)
+"eY" = (/turf/simulated/shuttle/floor,/area/awaymission/spacehotel)
+"eZ" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/awaymission/spacehotel)
+"fa" = (/obj/machinery/door/unpowered/hotel_door{id = 207},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"fb" = (/obj/machinery/door/unpowered/hotel_door{id = 208},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"fc" = (/obj/machinery/door/unpowered/hotel_door{id = 209},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"fd" = (/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"fe" = (/obj/machinery/camera{c_tag = "Room 107"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"ff" = (/obj/machinery/camera{c_tag = "Room 108"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"fg" = (/obj/machinery/camera{c_tag = "Room 109"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"fh" = (/obj/effect/decal{icon = 'icons/turf/floors.dmi'; icon_state = "wood_siding12"; name = "wood siding"},/turf/unsimulated/floor/grass,/area/awaymission/spacehotel)
+"fi" = (/obj/structure/window/plasmabasic,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"fj" = (/turf/unsimulated/beach/water/drop,/area/awaymission/spacehotel)
+"fk" = (/obj/machinery/light{dir = 1},/turf/unsimulated/beach/water/drop,/area/awaymission/spacehotel)
+"fl" = (/turf/unsimulated/beach/water/deep,/area/awaymission/spacehotel)
+"fm" = (/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/awaymission/spacehotel)
+"fn" = (/obj/machinery/camera{c_tag = "Room 207"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"fo" = (/obj/machinery/camera{c_tag = "Room 208"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"fp" = (/obj/machinery/camera{c_tag = "Room 209"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"fq" = (/obj/structure/window/plasmabasic{icon_state = "plasmawindow"; dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"fr" = (/turf/unsimulated/beach/water{icon = 'icons/turf/floors.dmi'; icon_state = "light_on"},/area/awaymission/spacehotel)
+"fs" = (/obj/structure/window/plasmabasic{icon_state = "plasmawindow"; dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"ft" = (/turf/unsimulated/beach/water,/area/awaymission/spacehotel)
+"fu" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows3"},/area/space)
+"fv" = (/obj/effect/landmark/map_loader/hotel_room{dir = 1},/turf/template_noop,/area/awaymission/spacehotel)
+"fw" = (/mob/living/simple_animal/hostile/retaliate/carp,/turf/unsimulated/beach/water{icon = 'icons/turf/floors.dmi'; icon_state = "light_on"},/area/awaymission/spacehotel)
+"fx" = (/obj/effect/landmark{name = "awaystart"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"fy" = (/obj/structure/window/plasmabasic{icon_state = "plasmawindow"; dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"fz" = (/obj/structure/mirror,/turf/unsimulated/wall/metal,/area/awaymission/spacehotel)
+"fA" = (/obj/effect/decal{icon = 'icons/turf/floors.dmi'; icon_state = "wood_siding14"; name = "wood siding"},/turf/unsimulated/floor/grass,/area/awaymission/spacehotel)
+"fB" = (/obj/machinery/light{dir = 8},/turf/unsimulated/beach/water/drop,/area/awaymission/spacehotel)
+"fC" = (/obj/structure/ladder/dive_point/buoy,/obj/structure/ladder/dive_point/buoy{id = "weirddive"; invisibility = 101},/turf/unsimulated/beach/water/deep,/area/awaymission/spacehotel)
+"fD" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/beach/water/deep,/area/awaymission/spacehotel)
+"fE" = (/obj/machinery/light,/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"fF" = (/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"fG" = (/obj/structure/closet/crate/bin,/obj/item/weapon/paper/crumpled/hotel_scrap_1,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"fH" = (/obj/effect/landmark{name = "awaystart"},/turf/unsimulated/beach/water,/area/awaymission/spacehotel)
+"fI" = (/obj/machinery/door/unpowered/hotel_door{id = 104},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"fJ" = (/obj/machinery/door/unpowered/hotel_door{id = 105},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"fK" = (/obj/machinery/door/unpowered/hotel_door{id = 106},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"fL" = (/obj/machinery/door/unpowered/hotel_door{id = 204},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"fM" = (/obj/machinery/door/unpowered/hotel_door{id = 205},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"fN" = (/obj/machinery/door/unpowered/hotel_door{id = 206},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"fO" = (/obj/machinery/camera{c_tag = "Room 104"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"fP" = (/obj/machinery/camera{c_tag = "Room 105"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"fQ" = (/obj/machinery/camera{c_tag = "Room 106"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"fR" = (/obj/machinery/light,/turf/unsimulated/beach/water/drop,/area/awaymission/spacehotel)
+"fS" = (/obj/machinery/camera{c_tag = "Room 204"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"fT" = (/obj/machinery/camera{c_tag = "Room 205"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"fU" = (/obj/machinery/camera{c_tag = "Room 206"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"fV" = (/obj/item/weapon/beach_ball,/turf/simulated/shuttle/floor,/area/awaymission/spacehotel)
+"fW" = (/turf/unsimulated/wall/metal,/area/awaymission)
+"fX" = (/obj/effect/levelref{id = "hotel"; name = "hotel level 1"},/turf/unsimulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/awaymission/spacehotel)
+"fY" = (/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/awaymission/spacehotel)
+"fZ" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/awaymission/spacehotel)
+"ga" = (/obj/effect/levelref{id = "hotel"; name = "hotel level 2"},/turf/unsimulated/floor/upperlevel,/area/awaymission/upperlevel)
+"gb" = (/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 1},/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gc" = (/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 1},/obj/structure/stool/bed/chair/sofa/left{icon_state = "sofaend_left"; dir = 4},/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gd" = (/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 1},/obj/structure/table/woodentable,/obj/machinery/light{dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"ge" = (/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 1},/obj/structure/stool/bed/chair/sofa/right{icon_state = "sofaend_right"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gf" = (/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 1},/obj/structure/table/woodentable,/obj/machinery/light{dir = 1},/obj/item/weapon/paper/hotel_scrap_3,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gg" = (/obj/structure/stool/bed/chair{dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gh" = (/obj/structure/table,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gi" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gj" = (/obj/structure/stool/bed/chair/sofa{icon_state = "sofamiddle"; dir = 4},/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gk" = (/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gl" = (/obj/structure/stool/bed/chair/sofa{icon_state = "sofamiddle"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gm" = (/obj/structure/stool/bed/chair/sofa/right{icon_state = "sofaend_right"; dir = 4},/obj/structure/window/reinforced{icon_state = "rwindow"; dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gn" = (/obj/structure/stool/bed/chair/sofa/left{icon_state = "sofaend_left"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"go" = (/obj/machinery/light{dir = 8},/turf/template_noop,/area/awaymission/spacehotel)
+"gp" = (/obj/structure/stool,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gq" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/closet/crate/bin,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gr" = (/obj/effect/landmark/map_loader/random{template_list = "light_floor_1.dmm;light_floor_2.dmm;light_floor_3.dmm"},/turf/template_noop,/area/awaymission/spacehotel)
+"gs" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/template_noop,/area/awaymission/spacehotel)
+"gt" = (/obj/machinery/door/unpowered/hotel_door{id = 101},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gu" = (/obj/machinery/door/unpowered/hotel_door{id = 102},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gv" = (/obj/machinery/door/unpowered/hotel_door{id = 103},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gw" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"gx" = (/obj/machinery/door/unpowered/hotel_door{id = 201},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gy" = (/obj/machinery/door/unpowered/hotel_door{id = 202},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gz" = (/obj/machinery/door/unpowered/hotel_door{id = 203},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"gA" = (/obj/machinery/camera{c_tag = "Room 101"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"gB" = (/obj/machinery/camera{c_tag = "Room 102"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"gC" = (/obj/machinery/camera{c_tag = "Room 103"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"gD" = (/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"gE" = (/mob/living/carbon/human/interactive/away/hotel/chef,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"gF" = (/obj/machinery/camera{c_tag = "Room 201"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"gG" = (/obj/machinery/camera{c_tag = "Room 202"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"gH" = (/obj/machinery/camera{c_tag = "Room 203"; c_tag_order = 999; network = list("Hotel")},/turf/template_noop,/area/awaymission/spacehotel)
+"gI" = (/obj/structure/stool,/turf/template_noop,/area/awaymission/spacehotel)
+"gJ" = (/obj/structure/closet/crate/bin,/obj/item/weapon/paper/crumpled/hotel_scrap_6,/turf/template_noop,/area/awaymission/spacehotel)
+"gK" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 1},/area/awaymission/spacehotel)
+"gL" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/enzyme{layer = 5},/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"gM" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/dough,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"gN" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"gO" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/rawsticks,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"gP" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel)
+"gQ" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 1},/area/awaymission/spacehotel)
+"gR" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"gS" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker{pixel_x = 5},/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"gT" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/peppermill{pixel_x = 3},/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"gU" = (/obj/structure/table,/obj/item/weapon/kitchen/rollingpin,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"gV" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/salmonmeat,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"gW" = (/obj/structure/table,/obj/item/weapon/book/manual/chef_recipes,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"gX" = (/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel)
+"gY" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel)
+"gZ" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel)
+"ha" = (/mob/living/carbon/human/interactive/away/hotel/bartender,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel)
+"hb" = (/turf/unsimulated/wall/fakeglass,/area/awaymission/spacehotel)
+"hc" = (/obj/machinery/vending/dinnerware,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"hd" = (/obj/machinery/light,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"he" = (/obj/machinery/processor,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"hf" = (/obj/machinery/chem_master/condimaster,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"hg" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"hh" = (/obj/structure/table,/obj/machinery/microwave,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"hi" = (/obj/structure/closet/crate/bin,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"hj" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"hk" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"hl" = (/obj/structure/kitchenspike,/turf/unsimulated/floor{icon_state = "cafeteria"},/area/awaymission/spacehotel/kitchen)
+"hm" = (/obj/machinery/vending/boozeomat,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel)
+"hn" = (/obj/machinery/light,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel)
+"ho" = (/obj/structure/table,/obj/machinery/reagentgrinder,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel)
+"hp" = (/obj/structure/table,/obj/machinery/chem_dispenser/soda,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel)
+"hq" = (/obj/structure/table,/obj/machinery/chem_dispenser/beer,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel)
+"hr" = (/obj/machinery/light,/obj/structure/table,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel)
+"hs" = (/obj/structure/closet/crate/bin,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel)
+"ht" = (/obj/machinery/door/airlock{name = "Kitchen"; req_access_txt = "150"},/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor,/area/awaymission/spacehotel)
+"hu" = (/obj/machinery/door/airlock{name = "Kitchen"; req_access_txt = "150"},/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{icon_state = "whiteyellowfull"},/area/awaymission/spacehotel)
+"hv" = (/turf/unsimulated/floor,/area/awaymission/spacehotel)
+"hw" = (/turf/unsimulated/wall{dynamic_lighting = 0; icon = null},/area/awaymission/spacehotel)
+"hx" = (/obj/effect/view_portal/visual{dir = 8; dist = 0; id = "hotel_11"; radius = 0},/turf/unsimulated/floor,/area/awaymission/spacehotel)
+"hy" = (/obj/effect/view_portal{id = "hotel_21"},/turf/unsimulated/floor{icon_state = "ramptop"; dir = 4},/area/awaymission/spacehotel)
+"hz" = (/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "rampbottom"; dir = 4},/area/awaymission/spacehotel)
+"hA" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows3"},/area/awaymission/spacehotel)
+"hB" = (/turf/unsimulated/floor{icon_state = "whiteyellow"; dir = 1},/area/awaymission/spacehotel)
+"hC" = (/obj/machinery/light{dir = 1},/turf/unsimulated/floor{icon_state = "whiteyellow"; dir = 1},/area/awaymission/spacehotel)
+"hD" = (/turf/unsimulated/floor{icon_state = "whiteyellowcorner"; dir = 1},/area/awaymission/spacehotel)
+"hE" = (/turf/unsimulated/floor{icon_state = "white"},/area/awaymission/spacehotel)
+"hF" = (/turf/unsimulated/floor{icon_state = "whiteyellowcorner"; dir = 4},/area/awaymission/spacehotel)
+"hG" = (/obj/structure/ladder{height = 1; icon_state = "ladder10"; id = "service"},/turf/unsimulated/floor{icon_state = "whiteyellow"; dir = 5},/area/awaymission/spacehotel)
+"hH" = (/turf/unsimulated/floor{icon_state = "ramptop"; dir = 4},/area/awaymission/spacehotel)
+"hI" = (/obj/effect/view_portal{id = "hotel_11"},/turf/unsimulated/floor{icon_state = "rampbottom"; dir = 4},/area/awaymission/spacehotel)
+"hJ" = (/obj/effect/view_portal/visual{dir = 4; dist = 0; id = "hotel_21"; opacity = 0; radius = 0},/turf/unsimulated/floor,/area/awaymission/spacehotel)
+"hK" = (/obj/machinery/light{dir = 1},/turf/unsimulated/floor/upperlevel,/area/awaymission/upperlevel)
+"hL" = (/obj/machinery/light/built{icon_state = "tube1"; dir = 1},/turf/unsimulated/floor{icon_state = "whiteyellow"; dir = 1},/area/awaymission/spacehotel)
+"hM" = (/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{icon_state = "whiteyellow"; dir = 1},/area/awaymission/spacehotel)
+"hN" = (/obj/effect/decal/cleanable/blood/old,/obj/structure/ladder{height = 2; icon_state = "ladder01"; id = "service"},/turf/unsimulated/floor{icon_state = "whiteyellow"; dir = 5},/area/awaymission/spacehotel)
+"hO" = (/obj/effect/view_portal/visual{dir = 8; dist = 7; id = "hotel_12"; radius = 2},/turf/unsimulated/floor,/area/awaymission/spacehotel)
+"hP" = (/obj/effect/view_portal{id = "hotel_22"},/turf/unsimulated/floor{icon_state = "ramptop"; dir = 4},/area/awaymission/spacehotel)
+"hQ" = (/turf/unsimulated/floor{icon_state = "rampbottom"; dir = 4},/area/awaymission/spacehotel)
+"hR" = (/obj/machinery/door/airlock/glass{name = "Employees Only"; req_access_txt = "150"},/turf/unsimulated/floor{dir = 8; icon_state = "whitered"},/area/awaymission/spacehotel)
+"hS" = (/turf/unsimulated/floor{icon_state = "whiteyellow"; dir = 4},/area/awaymission/spacehotel)
+"hT" = (/obj/effect/view_portal{id = "hotel_12"},/turf/unsimulated/floor{icon_state = "rampbottom"; dir = 4},/area/awaymission/spacehotel)
+"hU" = (/obj/effect/view_portal/visual{dir = 4; dist = 0; id = "hotel_22"; opacity = 0; radius = 0},/turf/unsimulated/floor,/area/awaymission/spacehotel)
+"hV" = (/obj/machinery/door/airlock/glass{icon_state = "door_locked"; locked = 1; name = "Employees Only"; req_access_txt = "150"},/obj/item/tape/police{icon_state = "police_door"; layer = 3.2},/turf/unsimulated/floor{dir = 8; icon_state = "whitered"},/area/awaymission/spacehotel)
+"hW" = (/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{icon_state = "white"},/area/awaymission/spacehotel)
+"hX" = (/obj/effect/view_portal/visual{dir = 8; dist = 0; id = "hotel_13"; radius = 0},/turf/unsimulated/floor,/area/awaymission/spacehotel)
+"hY" = (/obj/effect/view_portal{id = "hotel_23"},/turf/unsimulated/floor{icon_state = "ramptop"; dir = 4},/area/awaymission/spacehotel)
+"hZ" = (/obj/machinery/light,/turf/unsimulated/floor{icon_state = "rampbottom"; dir = 4},/area/awaymission/spacehotel)
+"ia" = (/turf/unsimulated/floor{icon_state = "whiteyellow"},/area/awaymission/spacehotel)
+"ib" = (/turf/unsimulated/floor{icon_state = "whiteyellowcorner"; dir = 8},/area/awaymission/spacehotel)
+"ic" = (/turf/unsimulated/floor{icon_state = "whiteyellowcorner"},/area/awaymission/spacehotel)
+"id" = (/turf/unsimulated/floor{icon_state = "whiteyellow"; dir = 6},/area/awaymission/spacehotel)
+"ie" = (/turf/unsimulated/wall/fakeglass{dir = 1; icon_state = "fakewindows2"},/area/space)
+"if" = (/obj/effect/view_portal{id = "hotel_13"},/turf/unsimulated/floor{icon_state = "rampbottom"; dir = 4},/area/awaymission/spacehotel)
+"ig" = (/obj/effect/view_portal/visual{dir = 4; dist = 0; id = "hotel_23"; opacity = 0; radius = 0},/turf/unsimulated/floor,/area/awaymission/spacehotel)
+"ih" = (/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{icon_state = "whiteyellow"},/area/awaymission/spacehotel)
+"ii" = (/obj/machinery/door/airlock{name = "Supply"; req_access_txt = "150"},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel)
+"ij" = (/obj/machinery/door/airlock/glass{name = "Mail Room"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"ik" = (/obj/machinery/door/airlock{name = "Security"; req_access_txt = "150"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"il" = (/obj/machinery/door/airlock{name = "Electrical Room"; req_access_txt = "150"},/obj/structure/cable/heavyduty{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/unsimulated/floor,/area/awaymission/spacehotel)
+"im" = (/obj/machinery/door/airlock{name = "Employees Only"; req_access_txt = "150"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"in" = (/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/wall/metal,/area/awaymission/spacehotel)
+"io" = (/obj/effect/decal/cleanable/blood/old,/obj/structure/falsewall,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
+"ip" = (/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel)
+"iq" = (/obj/structure/closet/crate/secure/loot,/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel)
+"ir" = (/turf/unsimulated/floor{icon_state = "warning"; dir = 8},/area/awaymission/spacehotel)
+"is" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"it" = (/obj/machinery/vending/sovietsoda,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"iu" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; dir = 4; name = "Hotel Security Monitor"; network = list("Hotel"); use_power = 0},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"iv" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"iw" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; name = "Hotel Security Monitor"; network = list("Hotel"); use_power = 0},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"ix" = (/turf/unsimulated/floor/plating,/area/awaymission/spacehotel)
+"iy" = (/obj/item/stack/cable_coil/random,/turf/unsimulated/floor/plating,/area/awaymission/spacehotel)
+"iz" = (/obj/structure/cable/heavyduty{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel)
+"iA" = (/obj/machinery/computer/account_database,/turf/unsimulated/floor/plating,/area/awaymission/spacehotel)
+"iB" = (/turf/unsimulated/floor/wood,/area/awaymission/spacehotel)
+"iC" = (/obj/structure/window/basic{icon_state = "window"; dir = 8},/obj/structure/flora/ausbushes/fernybush,/turf/unsimulated/floor/grass,/area/awaymission/spacehotel)
+"iD" = (/turf/unsimulated/wall{icon = 'icons/turf/walls/cult_wall.dmi'; icon_state = "cult"; desc = "The patterns engraved on the wall seem to shift as you try to focus on them. You feel sick"},/area/awaymission/spacehotel)
+"iE" = (/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
+"iF" = (/obj/structure/closet/crate/plastic,/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel)
+"iG" = (/obj/machinery/vending/snack,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"iH" = (/obj/structure/stool/bed/chair{dir = 1},/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"iI" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"iJ" = (/obj/structure{desc = "It appears to be similar to a SMES."; icon = 'icons/obj/power.dmi'; icon_state = "smes"; name = "WaffeCo PSU"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel)
+"iK" = (/obj/structure{desc = "It appears to be some sort of generator."; icon = 'icons/obj/power.dmi'; icon_state = "teg"; name = "WaffeCo PGU"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel)
+"iL" = (/obj/machinery/power/supermatter_shard,/turf/unsimulated/floor/plating,/area/awaymission/spacehotel)
+"iM" = (/obj/machinery/gateway{dir = 9},/turf/unsimulated/floor{icon_state = "warning"; dir = 9},/area/awaymission/spacehotel)
+"iN" = (/obj/machinery/gateway{dir = 1},/turf/unsimulated/floor{icon_state = "warning"; dir = 1},/area/awaymission/spacehotel)
+"iO" = (/obj/machinery/gateway{dir = 5},/turf/unsimulated/floor{icon_state = "warning"; dir = 5},/area/awaymission/spacehotel)
+"iP" = (/obj/structure/window/basic{icon_state = "window"; dir = 8},/obj/structure/flora/grass/both,/turf/unsimulated/floor/grass,/area/awaymission/spacehotel)
+"iQ" = (/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
+"iR" = (/obj/effect/gibspawner/human,/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
+"iS" = (/obj/structure/table/reinforced,/obj/machinery/door/poddoor/shutters/preopen,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"iT" = (/obj/machinery/vending/cola,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"iU" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; dir = 4; name = "Hotel Security Monitor"; network = list("Hotel"); use_power = 0},/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"iV" = (/obj/machinery/light/small{dir = 8},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel)
+"iW" = (/obj/structure/cable/heavyduty{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/heavyduty{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel)
+"iX" = (/obj/structure/cable/heavyduty{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel)
+"iY" = (/obj/structure/cable/heavyduty{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/heavyduty{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/heavyduty{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel)
+"iZ" = (/obj/structure/cable/heavyduty{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/unsimulated/floor/plating{icon_state = "platingdmg1"},/area/awaymission/spacehotel)
+"ja" = (/obj/structure/cable/heavyduty{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/heavyduty{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel)
+"jb" = (/obj/machinery/light/small{dir = 4},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel)
+"jc" = (/obj/machinery/gateway{dir = 8},/turf/unsimulated/floor{icon_state = "warning"; dir = 8},/area/awaymission/spacehotel)
+"jd" = (/obj/machinery/gateway/centeraway{calibrated = 0},/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel)
+"je" = (/obj/machinery/gateway{dir = 4},/turf/unsimulated/floor{icon_state = "warning"; dir = 4},/area/awaymission/spacehotel)
+"jf" = (/obj/structure/window/basic{icon_state = "window"; dir = 8},/obj/structure/flora/rock,/obj/structure/flora/grass/brown,/turf/unsimulated/floor/grass,/area/awaymission/spacehotel)
+"jg" = (/obj/item/candle,/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
+"jh" = (/obj/effect/rune,/obj/item/organ/brain,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
+"ji" = (/obj/item/candle,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
+"jj" = (/obj/item/weapon/tome,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
+"jk" = (/obj/structure/closet/crate/critter,/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel)
+"jl" = (/obj/machinery/door/airlock/glass{name = "Lobby"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"jm" = (/obj/effect/spawner/snpc_squad{squad_type = /mob/living/carbon/human/interactive/away/hotel/guard},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"jn" = (/obj/structure{desc = "It appears to be similar to a SMES."; icon = 'icons/obj/power.dmi'; icon_state = "smes"; name = "WaffeCo PSU"},/turf/unsimulated/floor/plating{icon_state = "platingdmg1"},/area/awaymission/spacehotel)
+"jo" = (/obj/effect/decal/remains/human,/obj/item/clothing/head/soft/red,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"jp" = (/obj/item/toy/prize/honk,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"jq" = (/obj/item/toy/spinningtoy,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"jr" = (/obj/item/weapon/bananapeel,/obj/item/toy/spinningtoy,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"js" = (/obj/structure/barricade/wooden,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"jt" = (/obj/machinery/door/airlock/glass,/obj/item/tape/engineering{icon_state = "engineering_door"; layer = 3.2},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"ju" = (/obj/machinery/gateway{dir = 10},/turf/unsimulated/floor{icon_state = "warning"; dir = 10},/area/awaymission/spacehotel)
+"jv" = (/obj/machinery/gateway,/turf/unsimulated/floor{icon_state = "warning"},/area/awaymission/spacehotel)
+"jw" = (/obj/machinery/gateway{dir = 6},/turf/unsimulated/floor{icon_state = "warning"; dir = 6},/area/awaymission/spacehotel)
+"jx" = (/obj/structure/window/basic{icon_state = "window"; dir = 8},/obj/structure/flora/ausbushes/palebush,/turf/unsimulated/floor/grass,/area/awaymission/spacehotel)
+"jy" = (/obj/item/device/flashlight/lantern{on = 1},/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
+"jz" = (/obj/effect/rune,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
+"jA" = (/obj/structure/stool/bed/chair/comfy,/obj/item/device/soulstone,/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/remains/human,/obj/effect/view_portal{id = "cultroom"},/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
+"jB" = (/obj/effect/gibspawner/human,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
+"jC" = (/obj/machinery/atm{pixel_y = 32},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"jD" = (/obj/effect/decal/warning_stripes/white/hollow,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"jE" = (/obj/item/weapon/paper/pamphlet{pixel_x = -8; pixel_y = 4},/obj/structure/table/reinforced,/obj/item/weapon/paper/pamphlet/hotel{pixel_x = 8; pixel_y = 8},/obj/item/weapon/paper/pamphlet/hotel{pixel_x = 8; pixel_y = 4},/obj/item/weapon/paper/pamphlet/hotel{pixel_x = 8},/obj/item/weapon/paper/pamphlet/hotel{pixel_x = 8; pixel_y = -4},/obj/item/weapon/paper/pamphlet/hotel{pixel_x = 8; pixel_y = -8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception)
+"jF" = (/obj/item/latexballon,/obj/item/latexballon,/obj/structure/table/glass,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception)
+"jG" = (/obj/structure/rack,/obj/item/key,/obj/item/key,/obj/item/key,/obj/item/key,/obj/item/key,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception)
+"jH" = (/obj/structure/stool/bed/chair/comfy,/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"jI" = (/obj/structure/stool/bed/chair/comfy,/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"jJ" = (/obj/structure/cable/heavyduty{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel)
+"jK" = (/obj/structure/cable/heavyduty{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/heavyduty{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel)
+"jL" = (/obj/structure/cable/heavyduty{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel)
+"jM" = (/obj/effect/decal/remains/human,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"jN" = (/obj/item/trash/candle,/obj/item/trash/candle,/obj/item/trash/candle,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"jO" = (/obj/structure/window/basic{icon_state = "window"; dir = 8},/obj/structure/flora/bush,/turf/unsimulated/floor/grass,/area/awaymission/spacehotel)
+"jP" = (/obj/item/weapon/restraints/legcuffs,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
+"jQ" = (/obj/structure/closet/crate/secure/unknownchemicals,/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel)
+"jR" = (/obj/structure/closet/crate/bin,/obj/item/weapon/paper/crumpled/hotel_scrap_7,/turf/unsimulated/floor{icon_state = "floor"},/area/awaymission/spacehotel)
+"jS" = (/obj/structure/table/reinforced,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception)
+"jT" = (/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception)
+"jU" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; dir = 1; name = "Hotel Security Monitor"; network = list("Hotel"); use_power = 0},/obj/machinery/light,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"jV" = (/obj/structure/table,/obj/machinery/computer/security/telescreen{desc = "Not used to spy on hotel rooms."; dir = 1; name = "Hotel Security Monitor"; network = list("Hotel"); use_power = 0},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"jW" = (/obj/machinery/light/small,/turf/unsimulated/floor/plating,/area/awaymission/spacehotel)
+"jX" = (/obj/item/toy/sword,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"jY" = (/obj/item/target/syndicate,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"jZ" = (/obj/item/trash/sosjerky,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"ka" = (/obj/item/weapon/gun/projectile/shotgun/toy/crossbow,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"kb" = (/obj/machinery/space_heater,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"kc" = (/obj/machinery/door/airlock{name = "Supply Closet"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"kd" = (/obj/machinery/door/airlock/glass{name = "Gateway"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"ke" = (/obj/item/weapon/melee/cultblade,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
+"kf" = (/obj/item/weapon/kitchen/knife/butcher{blood_DNA = 1e+009},/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
+"kg" = (/obj/machinery/light{dir = 8},/obj/structure/stool/bed/chair/sofa/left{icon_state = "sofaend_left"; dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"kh" = (/obj/effect/hotel_controller,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"ki" = (/obj/item/weapon/pen,/obj/structure/table/reinforced,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception)
+"kj" = (/obj/structure/stool/bed/chair{dir = 8},/mob/living/carbon/human/interactive/away/hotel/concierge,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception)
+"kk" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception)
+"kl" = (/obj/structure/stool/bed/chair/sofa{icon_state = "sofamiddle"; dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"km" = (/obj/item/weapon/clipboard,/obj/item/weapon/paper,/obj/structure/table/reinforced,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception)
+"kn" = (/obj/structure/stool/bed/chair{dir = 8},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception)
+"ko" = (/obj/structure/filingcabinet/filingcabinet,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception)
+"kp" = (/obj/structure/filingcabinet/filingcabinet,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception)
+"kq" = (/obj/structure/stool/bed/chair/sofa/corner{dir = 4},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"kr" = (/obj/structure/stool/bed/chair/sofa{dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"ks" = (/obj/machinery/light,/obj/structure/stool/bed/chair/sofa/left{dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"kt" = (/obj/machinery/light,/obj/structure/stool/bed/chair/sofa/right{dir = 1},/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"ku" = (/obj/structure/stool/bed/chair/sofa/left{dir = 1},/obj/effect/decal/warning_stripes/white/hollow,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel)
+"kv" = (/obj/item/weapon/paper_bin,/obj/structure/table/glass,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception)
+"kw" = (/obj/structure/table/glass,/turf/unsimulated/floor/carpet,/area/awaymission/spacehotel/reception)
+"kx" = (/turf/unsimulated/wall/fakeglass{dir = 10; icon_state = "fakewindows"},/area/space)
+"ky" = (/turf/unsimulated/wall/fakeglass{dir = 4; icon_state = "fakewindows"; opacity = 1},/area/space)
+"kz" = (/obj/machinery/door/airlock/external{name = "Arrival Airlock"},/turf/unsimulated/floor/plating,/area/awaymission/spacehotel)
+"kA" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/space)
+"kB" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 6},/area/space)
+"kC" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/awaymission)
+"kD" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/awaymission)
+"kE" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/awaymission)
+"kF" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 8},/area/awaymission)
+"kG" = (/turf/unsimulated/wall/fakeglass{dir = 4; icon_state = "fakewindows"; opacity = 1},/area/awaymission)
+"kH" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/awaymission)
+"kI" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/plating,/area/awaymission)
+"kJ" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/awaymission)
+"kK" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/space)
+"kL" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/space)
+"kM" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/space)
+"kN" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows3"},/area/awaymission)
+"kO" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/wall{icon_state = "swallc4"; dir = 2},/area/awaymission)
+"kP" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor,/area/awaymission)
+"kQ" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/awaymission)
+"kR" = (/obj/structure/stool/bed/chair{dir = 8},/obj/item/weapon/paper/hotel_scrap_4,/turf/simulated/shuttle/floor,/area/awaymission)
+"kS" = (/turf/simulated/shuttle/floor,/area/awaymission)
+"kT" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/floor,/area/awaymission)
+"kU" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/turf/unsimulated/floor/plating/airless,/area/awaymission)
+"kV" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space,/area/awaymission)
+"kW" = (/turf/simulated/shuttle/wall{icon_state = "swallc4"; dir = 2},/area/space)
+"kX" = (/turf/simulated/shuttle/wall/interior,/area/space)
+"kY" = (/turf/simulated/shuttle/wall{icon_state = "swall3"},/area/space)
+"kZ" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space,/area/space)
+"la" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/floor,/area/awaymission)
+"lb" = (/obj/machinery/door/airlock/glass,/turf/simulated/shuttle/floor,/area/awaymission)
+"lc" = (/obj/structure/window/reinforced{dir = 4},/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/floor,/area/awaymission)
+"ld" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/awaymission)
+"le" = (/turf/simulated/shuttle/wall{icon_state = "swallc1"; dir = 2},/area/awaymission)
+"lf" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor,/area/awaymission)
+"lg" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/decal/cleanable/blood/old,/turf/simulated/shuttle/floor,/area/awaymission)
+"lh" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/space)
+"li" = (/turf/simulated/shuttle/wall{icon_state = "swallc1"; dir = 2},/area/space)
+"lj" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/awaymission)
+"lk" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/space)
+"ll" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"lm" = (/obj/structure/curtain/open/shower,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/awaymission{name = "Amazing Place"; requires_power = 0})
+"ln" = (/obj/item/weapon/paper/hotel_scrap_8,/turf/unsimulated/floor{name = "engraved floor"; icon_state = "cult"},/area/awaymission/spacehotel)
(1,1,1) = {"
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacadacacacacacacacacacacacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacaeaiahaiaiaiafaiaiaiaiaiaiacabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaabababababababababababababababababababacajamamamamamanaiaiaiaiaiaiacababababababababababababababababababaaaaaaaaaa
-aaaaaaabaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoapaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoabaaaaaaaaaa
-aaaaaaabaoaqaqarasatauavawaoaqaqaraxayauavawaoazazazazazazazazazazazazazaoaAaoaBaoaCaCaCaDaCaCaCaoaEaoaFaoaoabaaaaaaaaaa
-aaaaaaabaoaqaqaGaHaHaHaHaIaoaqaqaGaHaHaHaHaJaoaHazazazazaKaLaMazazazazaoaoaNaoaNaoaOaNaNaNaNaNaPaoaNaoaNaoaoabaaaaaaaaaa
-aaaaaaabaoaQaRaSaHaHaHaHaIaoaQaRaSaHaHaHaHaJaoaHaHazazazaTaUaVazazazaHaoaoaWaoaWaoaoaoaoaWaoaoaoaoaWaoaWaoaoabaaaaaaaaaa
-aaaaaaabaoaXaYaZaHaHbaaHbbaoaXaYaZaHaHbaaHbcaoaHaHaHazazbdbebfazazaHaHaobgaNaNaNaNaNbhaNaNaNbhaNaNbibiaNbjaoababaaaaaaaa
-aaaaaaabaoaoaoaobkbkaoaoaoaoaoaoaoblblaoaoaoaoaHaHaHaHazazazazazazaHaHaoaoaoaoaoaoaoaoaNaNaNaoaoaoaoaoaoaoaoaoabaaaaaaaa
-aaaaaaaabmaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHazazazazaHaHaHaHbnaHaHaHaHaHaHbnaHaHaHbnaHaHaHaHaHaHbnaoabaaaaaaaa
-aaaaaaaaboaHbpaHaHaHbpaHaHaHbpaHaHaHbpaHaHaHbpaHaHaHaHaHbqaHbqaHaHaHaHaHaHaHbraHaHbraHaHbraHaHbraHaHbraHaHaHaoabaaaaaaaa
-aaaaaaaabsaHaHaHaHaHbqaHaHaHaHaHbqaHaHaHaHaHaHaHaHaHaHbtaobuaobvaHaHaHbwbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbxbyaoabaaaaaaaa
-aaaaaaabaoaoaobzaoaoaoaoaobAaoaoaoaoaobBaoaoaoaHaHaHaHaHbnaHbnaHaHaHaHbCbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbEaoabaaaaaaaa
-aaaaaaabaoaHbFbGaHavaoaHbHbIaHbJaoaHbKbLaHavaoaHaHaHaHaHaHaHaHaHaHaHaHbCbDaqaqaqaqaqaqaqbMaqaqaqaqaqaqaqbDbNbmaaaaaaaaaa
-aaaaaaabaobvaHbaaHbOaobvaHaHaHbPaobvaHaHaHbQaoaHaHaHaHaHbpaHbpaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa
-aaaaaaaabRaHaHaHaHbSaoaHaHaHaHbPaoaHaHaHaHbQaoaHaHaHaHaHaHaHaHaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa
-aaaaaaabaobTbTbUbTbVaobTbTbUbTbVaobTbTbUbTbVaoaHaHaHaHaHaHaHaHaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa
-aaaaaaabbWbXaYaZbYaobWbXaYaZbYaobWbZcaaZbYaoaoaHaHaHaHaHbpaHbpaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa
-aaaaaaabaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaHaHaHaHaHaHaHaHaHaHaHaHbCbDcbaqaqaqaqaqaqaqaqaqaqaqaqaqccbDbNboaaaaaaaaaa
-aaaaaaaabmaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHbqaHbqaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa
-aaaaaaaaboaHbpaHaHaHbpaHaHaHbpaHaHaHbpaHaHaHbpaHaHaHaHbtaobuaobvaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa
-aaaaaaaabsaHaHaHaHaHbqaHaHcdcdaHbqaHaHaHaHaHaHaHaHaHaHaHbnaHbnaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa
-aaaaaaabaoaoaoceaoaoaoaoaocfaoaoaoaoaocgaoaoaoaHaHaHaHaHaHaHaHaHaHaHaHbCbDaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqbDbNboaaaaaaaaaa
-aaaaaaabaoaHchciaHcjaoaHckclaHavaoaHcmcnaHcoaoaHaHaHaHaHbpaHbpaHaHaHaHbCbDaqaqaqaqaqaqaqcpaqaqaqaqaqaqaqbDbNbsaaaaaaaaaa
-aaaaaaabaobvaHaHaHcqaocrcrcrcrcsaobvaHaHaHctaoaHaHaHaHaHaHaHaHaHaHaHaHbCbDbDbDcubDbDbDbDbDbDbDbDbDbDbDbDbDbEaoabaaaaaaaa
-aaaaaaaabRaHaHaHaHcqaoaHcrcrcrcvaoaHaHaHaHctaoaHaHaHaHaHaHaHaHaHaHaHaHcwaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRcxaoabaaaaaaaa
-aaaaaaabaobTbTbUbTbVaobTbTcyczbVaobTbTbUbTbVaoaHaHaHaHaHbpaHbpaHaHaHaobvaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHbmaaaaaaaaaa
-aaaaaaabbWbXaYaZbYaobWbXaYaZbYaobWbXaYaZbYaoaoaHaHaHaHaHaHaHaHaHaHaHaHaHcAcBcCcAcBcCcAcBcCcAcBcCcAcBcCcAcBcCboaaaaaaaaaa
-aaaaaaabaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaHaHaHaHaHaHaHaHaHaHaHaobvaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHboaaaaaaaaaa
-aaaaaaaabmaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHbqaHbqaHaHaHaHaHcAcBcCcAcBcCcAcBcCcAcBcCcAcBcCcAcBcCboaaaaaaaaaa
-aaaaaaaaboaHbpaHaHaHbpaHaHaHbpaHaHaHbpaHaHaHbpaHaHaHaHbtaobuaobvaHaHaobvaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHbsaaaaaaaaaa
-aaaaaaaabsaHaHaHaHaHbqaHaHaHaHaHbqaHaHaHaHaHaHaHaHaHaHaHbnaHbnaHaHaHaHaHcDcDcDcDcDcDcDcDcDcDcDcDcDcDcDcDcDbtaoabaaaaaaaa
-aaaaaaabaoaoaocEaoaoaoaoaocFaoaoaoaoaocGaoaoaoaHaHaHaHaHbpaHbpaHaHaHaHcBcBcBcBcBcBcBcBcBcBcBcBcBcBcBcBcBcBcBaoabaaaaaaaa
-aaaaaaabaoaHcHcIaHcJaoaHcKcLaHavaocMcNcOaHavaoaHaHaHaHaHaHaHaHaHaHaHaHcBcPcPcPcQcPcPcPcPcPcPcPcPcPcPcPcQcPcPaoabaaaaaaaa
-aaaaaaabaoaHaHagcScTaobvaHaHaHcUaocVcWcWaHcXaoaHaHaHaHaHaHaHaHaHaHaHaHaocYcPcZdadbdbcPcPcPcPcPdadadadadacPcYaoabaaaaaaaa
-aaaaaaaabRaHdcddcSdeaoaHaHaHaHcUaocWdfcWaHdgaoaHaHaHaHaHbpaHbpaHaHaHaHaodhcPdadidjdkcPcPcPcQcPdadadldadacPdhaoabaaaaaaaa
-aaaaaaabaodmdndodndpaobTbTbUbTbVaodqdrdsdrbVaoaHaHaHaHaHaHaHaHaHaHaHaHaodtcPcQcPcPcPcPcPcPcPcPcPcPcPcPcPcPdtaoabaaaaaaaa
-aaaaaaabbWduakdwalaobWbXaYaZbYaobWbXaYaZbYaoaoaHaHaHaHaHbqaHbqaHaHaHaHaocPdydzdAdBdCcQdycPdycPcPdDdEdFcPdycQaoabaaaaaaaa
-aaaaaaabaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaHaHaHaHbtaobuaobvaHaHaHaoaoaoaoaoaoaoaoaodGaoaoaoaoaoaoaoaoaoaoabaaaaaaaa
-aaaaaaabaoaHaHaHaHaHaHaHaHaHdHaHaHaHaHaHdIdIdIaHaHaHaHaHbnaHbnaHaHaHaHaHaHaHaHbnaHaHaHaHaHaHaHaHaHaHcWaHaHcWbmaaaaaaaaaa
-aaaaaaabaodJaHdKaHaHaHaHaHaHaHdHaHaHaHaHdIdIdIaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHcWcWcWcWaHboaaaaaaaaaa
-aaaaaaabaoaHaHaHaHaHaHdHaHaHaHaHaHdLaHaHaHdIdIdIaHaHaHaHbpaHbpaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHcWcWaHcWaHaHbsaaaaaaaaaa
-aaaaaaabaodMaHdJaHaHaHaHaHaHaHdLaHaHaHaHaHaHdNaoaHaHaHaHaHaHaHaHaHaHaHaoaoaoaodOaoaoaoaoaoaodPdPdPaoaoaoaoaoaoabaaaaaaaa
-aaaaaaabaodQdRaHaHaHaHdLaHaHaHaHaHaHdLaHaHaHaHaodSaHaHaHaHaHaHaHaHaHdTaodUdVaHaHaHdWdWdWaodXdXdYdXdXdXdXdXdXaoabaaaaaaaa
-aaaaaaabaoaodZeaaHdHaHaHaHdHaHaHdHaHaHaHaHaHaHaodSaHaHaHbpaHbpaHaHaHebaodUcCaHaHaHecededaodXeeefeedXdXdXdXeeaoabaaaaaaaa
-aaaaaaababaoegdJaHaHaHaHaHaHaHaHaHaHaHaHaHaHaHaodSaHaHaHaHaHaHaHaHaHehaodUdVaHaHaHaHaHaHaodXeeeeeiejekeeeeelaoabaaaaaaaa
-aaaaaaaaabaoaHaHaHaHaHdLaHaHaHaHaHdHaHaHaHdIdIaoaoaoaoaodOaodOaoaoaoaoaodUcCaHaHaHaHaHaHaoeeeeeeemenemeeeoeeaoabaaaaaaaa
-aaaaaaaaabaoaHepaHaHaHaHaHaHaHaHdHaHaHaHaHdIdIaoaHaHaHaHaHbnaHaHeqeresaobvaHaHbretbreuetaodXeeeeekemekeeeveeaoabaaaaaaaa
-aaaaaaaaabaoewewaHaHaHaHaHaHaHaHaHaHaHaHaHdIdIdOaHaHaHaHbpaHbpaHexaHaHdOaHaHaHeyeyeyeyeyaodXezeoeeeeeAeedXdXaoabaaaaaaaa
-aaaaaaaaabaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaobvaHaHaHaHaHaHaHeBeCaHdPaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoabaaaaaaaa
-aaaaaaaaabababababababababababababababababababbmaHaHaHaHaHaHaHaHeDcCeEaoababababababababababababababababababababaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboaHaHaHaHbpaHbpaHexaHeEaoabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboaHaHaHaHaHaHaHbqexeFexaoabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeGeHeHeIaoeJaoeJaoaoaoaoaoabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeJaoeJababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeKeLeMeHeIeNeOeNeOeNeMeHeIeNePaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeKbReQeReSeSeSbDbDbDbDbDeSeSeSeTeUeVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabReWeXbDbDbDbDbDeSeSeSbDbDbDbDeYeUeVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZbRfabDeSeWeSbDbDeRbDbDfbfceSeTeUeVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZeNeMeHeIeNeLeLeLeNeMeHeIeNfdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababacacacacacacacacacacacacacacacacacacacacacacacacacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeafaeafaeagagagagagaeafaeahahahahahahahahahahahahahahahahahahahahahahah
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaiaiaiajaiaiaiabacacacacacacacacacacacacacakalacacacacacacacacacacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeamamanaoafaeapaeaqaeagagagagagaearaeahahahahahahahahahahahahahahahahahahahahahahah
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaiaiaiaiaiaiaiabacacacacacacacacacacacakasatatasasasasalacacacacacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeauaeaeaeaeaeavaeawaeaeaeaeaeaeaeaxaeahahahahahahahahahahahahahahahahahahahahahahah
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaiaiaiaiayaiaiabacacacacacacacakasasasatatatatatatatatatasasalacacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeamamazaAafaeamaeamamaBaAafaeamamamaeahahahahahahahahahahahahahahahahahahahahahahah
+aaaaaaaaaaaaaaaaaCaDaDaDaDaDaCaaaaaaaaaaaaaaaaabaiaiaiaiaiaiaiabacaEasasasasasatatatatatatatatataFatataGatataHacacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaIaeaeaeaeaeaeaeaPaeamaeahahahahahahahahahahahahahahahahahahahahahahah
+aaaaaaaaaaaaaaaaaCaDaDaJaDaDaCaaaaaaaaaKaaaaaaabaiaiaiaiaiaiaiabacacaLatatatatatatataMaMaMatatatatatatatatatatalacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeafaNaOamamaeaPamamaeafaQamamamaeauaeahahahahahahahahahahahahahahahahahahahahahahah
+aaaaaaaaaaaaaaaaaCaRaSaTaUaVaCaaaaaaaWaXaaaaaaabaYaiaiaiaiaZbaabacacaLatatatatatatbbbcbdbebfatatatatatatatatatbgacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaPaeamaeauaeaeaeaeaeaeaeamaeahahahahahahahahahahahahahahahahahahahahahahah
+aaaaaaaaaaaaaaaaaabhbibjbibkaaaaaablbmaaaaaaaaabaiaiaiaiaiaiaiabacacaLatatatatatatbnbobpbobfatatatatbqatatataHacacadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeafbrbsamamaeamaeamambtaAafaellaeamaeahahahahahahahahahahahahahahahahahahahahahahah
+aaaaaaaaaaaaaaaabubjbjbjbjbjbvaaaabwbxaaaaaaaaabaiaiaiaiaiaiaiabacacbyatatatatatatbzbAbBbAbfatbCatatatatatataHacacadadadadadadadadbDbDbDbDbDbDbDbDbDbDbDbDbDadadadadadadadadaeaeaeaeaeaeaeamaeaeaeaeaeaeaelmamamaeahahahahahahahahahahahahahahahahahahahahahahah
+aabEbFaabGbHbHbHbjbjbjbjbjbjbjbHbHbjbjbIaaaaaaabaiaiaiaiaiaiaiabacacacaLatatatatatatbJbKbJatatatatatatatatataHacacadadadadadadadadbDbDbDbLbMbMbNbDbDbDbDbDbDadadadadadadadadaeagaeafaeafaebOaeambPamaeagaeaeaebQaeahahahahahahahahahahahahahahahahahahahahahahah
+aaaabRbSbjbjbTbjbjbUbjbjbjbjbjbjbTbjbjbjbvaaaaabaiaiaiaiaiaiaiabacacacaLatatbCatatatatatatatatatatatatatatataHacacadadadadadadadadbDbDbLbVbVbVbVbMbMbMbNbDbDadadadadadadadadaeagaebWaebXaebYaebZaecaaeagagagaecbaeahahahahahahahahahahahahahahahahahahahahahahah
+aaaaaaaabwbjbjbjbjbjbjbjbjbjbjbjbjbjbjbUbxaaaaabcccccdceaiaiaiabacacacaLatatatatatatatatatatatatatatatatatataHacacadadadadadadadadbDbLbVbVcfbVbVbVcfbVcgbDbDadadadadadadadadaeagaechaeciaeafaecjaeckaeagagagaeafaeahahahahahahahahahahahahahahahahahahahahahahah
+aaaaaaaabwbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbxaaaaclcmcncocpclabababacacacaLatatatatatatatatatbqatatatatatatatataHacacadadadadadadadadbDcqbVbVbVbVcrbVbVbVcgbDbDadadadadadadadadaeagaecsctcuaeagaeafaeafaeagagagagagagahahahahahahahahahahahahahahahahahahahahahahah
+aaaacvaabwbjbjcwbjbjbjbUbjbjbjbjbjbjbjbjbxaaaaclclclclcxclcycycyacacakatatatatatatatatatatatatatatatatatatatatalacadadadadadadadadbDcqbVbVbVcrczcrbVbVbVbNbDadadadadadadadadaeagaeaeaeaeaeagagagagagagagagagagagagahahahahahahahahahahahahahahahahahahahahahahah
+aacAcBaabwbjbjbjbjbjbjbjbjcCbjbjcwbjbjbjbxaaaacycycyclclclcycycyacacbycDatatatatatatatatatatatatatatatatatatatbgacadadadadadadadadbDcEbVbVbVbVcrbVbVbVbVcgbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+aacFcGaabwbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbxaaaacycycycycycycycycyacacacaccHcIcJcJcJcJcJcKcJcJcLcJcJcKcJcMcJcJcNacacadadadadadadadadbDcOcqbVcfbVbVbVcfbVbVcPbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+aacQbjbHbjbjbjbjbjcwbjbjbjbjbjbjbjbjbjbjbjbvaaabcRabababababababacacacaccScTcTcTcTcTcTcTcTcTcTcTcTcTcTcTcTcTcUacacadadadadadadadadbDbDcEcVbVbVbVbVbVcVcPcObDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+aacWcXbjbjbjbjbjbjbjbjbjbjbjbUbjbjbjbjcCbjbxaaabababababababababacacacaccYcTcTcTcTcTcTcTcTcTcTcTcTcTcTcTcZdaacacacadadadadadadadadbDbDcOcOcEcVbVcVcPcOcObDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+aaaaaacWbjbjcwbjbjbjbjbjbjbjbjbjbjcwbjbjbjbxaaabaiaiaiajaiaiaiabacacacacacdbcZcTcTcTcTcTcTcTcTcTcTcTcTdcacacacacacadadadadadadadadbDbDbDbDcOcOddcOcObDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+aaaaaaaabwbjcCbjbjbjbUbjbjbjbjbjbjbjcXcXcXdeaaabaiaiaidfaiaiaiabacacacacacacaccScTcTcTcTcTcTcTcTcTcTcTdgacacacacacadadadadadadadadbDbDbDbDbDbDddbDbDbDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+aaaaaaaacWcXcXcXcXbjdhdhbjcXcXcXcXdeaaaaaaaaaaabaidiaiaiaiaiaiabacacacacacacaccYcZcTcTcTcTcTcTcTcTcZdaacacacacacacadadadadadadadadbDbDbDbDbDbLcPbDbDbDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+aaaaaaaaaaaaaaaaaadjdkdkdlaaaaaaaaaaaaaaaaaaaaabaiaiaiaiaiaiaiabacacacacacacacacacdmdndndndndndndoacacacacacacacacadadadadadadadadbDbDbDbDbDddcObDbDbDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+aaaaaaaaaaaaaaaaaadpdqdqdraaaaaaaaaaaaaaaaaaaaabaiaiaiaiaiaiaiabacacacacacacacacacdsdtdudududududvacacacacacacacacadadadadadadadadbDbDbDbDbDddbDbDbDbDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+dwdwdwdxaaaaaadydwdkdkdkdkdwdwdwdxaaaaaaaaaaaaabdzaiaiaiaidAbaabacacacacacacacacacacacdBdududCdtdDacacacacacacacacadadadadadadadadbDbDbDbDbDcEdEbNbDbDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+dkdkdkdkdwdwdwdkdkdkdFdFdkdkdkdkdkdwdwdwdwdwdwabaiaiaiaiaiaiaiabacacacacacacacacacacacdsdCdudvacacacacacacacacacacadadadadadadadadbDbDbDbDbDcOcOddbDbDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+dkdkdkdkdkdkdkdkdkdFdFdFdFdkdkdkdkdkdkdkdkdkdkabaiaiaiaiaiaiaiabacacacacacacacacacacacacdGdudDacacacacacacacacacacadadadadadadadadbDbDbDbDbDbDbLcPbDbDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+dHdHdHdHdkdkdkdFdFdFdFdFdFdFdFdFdFdkdkdkdkdkdkabaiaiaiaiaiaiaiabacacacacacacacacacacacacdBdvacacacacacacacacacacacadadadadadadadadadadadadbDbDddcObDbDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+dHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHabaiaiaiaiaiaiaiabacacacacacacacacacacacacdBdvacacacacacacacacacacacadadadadadadadadadadadadbDbDddbDbDbDbDbDbDadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+dHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHabaiaiaidIaiaiaiabacacacacacacacacacacacacdBdvacacacacacacacacacacacadadadadadadadadadadadadaddJdKdJadadadadadadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+dHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHabababababababababahahahahahahahahahahahahahahahahahahahahahahahahahadadadadadadadadadadadadaddLdMdNadadadadadadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+dHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahadadadadadadadadadadadadadcOcOcOadadadadadadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+dHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahadadadadadadadadadadadadadadadadadadadadadadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+dHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahadadadadadadadadadadadadadadadadadadadadadadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+dHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahadadadadadadadadadadadadadadadadadadadadadadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+dHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHdHahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahadadadadadadadadadadadadadadadadadadadadadadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahadadadadadadadadadadadadadadadadadadadadadadadadadadadadadahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahah
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdPdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdQdQdQdQdQdOdOdOdQdQdQdQdQdQdQdOdOdOdQdQdQdQdQdQdQdOdOdOdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdOdOdOdOdOdOdOdOdOdQdQdQdQdQdOdOdOdQdQdQdQdQdQdQdOdOdOdQdQdQdQdQdQdQdOdOdOdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdOdOdOdOdOdOdO
+dOdOdOdOdOdOdQclclclcldRdSdTclclclclclclcldRdSdTclclclclclclcldRdSdTclclclclclclclclclclclclclclclclclclclclclclclcldQdOdOdOdOdOdOdOdOdOdQclclclcldRdSdTclclclclclclcldRdSdTclclclclclclcldUdVdWclclclclclclclclclclclclclclclclclclclclclclclcldQdOdOdOdOdOdOdO
+dOdOdOdOdOdOdQcldXdXdXdXdYdXdXdXdXcldXdXdXdXdZdXdXdXdXcldXdXdXdXeadXdXdXdXclebebcleccleccledededeeedededclecclecclcldQdOdOdOdOdOdOdOdOdOdQcldXdXdXdXefdXdXdXdXcldXdXdXdXegdXdXdXdXcldXdXdXdXehdXdXdXdXclebebcleccleccledededeeedededclecclecclcldQdOdOdOdOdOdOdO
+dOdOdOdOdOdOdQcldXdXdXdXdXdXdXdXdXcldXdXdXdXdXdXdXdXdXcldXdXdXdXdXdXdXdXdXclebclcleicleiclejeieieieieiekcleicleiclcldQdOdOdOdOdOdOdOdOdOdQcldXdXdXdXdXdXdXdXdXcldXdXdXdXdXdXdXdXdXcldXdXdXdXdXdXdXdXdXclebclcleicleicleleieieieieiekcleicleiclcldQdOdOdOdOdOdOdO
+dOdOdOdOdOdOdQcldXdXdXdXemdXdXdXdXcldXdXdXdXemdXdXdXdXcldXdXdXdXemdXdXdXdXclebclclenclenclclclclenclclclclenclenclcldQdOdOdOdOdOdOdOdOdOdQcldXdXdXdXemdXdXdXdXcldXdXdXdXemdXdXdXdXcldXdXdXdXemdXdXdXdXclebclclenclenclclclclenclclclclenclenclcldQdOdOdOdOdOdOdO
+dOdOdOdOdOdOdQcldXdXdXdXdXdXdXdXdXcldXdXdXdXdXdXdXdXdXcldXdXdXdXdXdXdXdXdXclebcleoeieieieieiepeieieiepeieieqeqeiercldQdQdOdOdOdOdOdOdOdOdQcldXdXdXdXdXdXdXdXdXcldXdXdXdXdXdXdXdXdXcldXdXdXdXdXdXdXdXdXclebcleoeieieseteiepeieieiepeieieieieieucldQdQdOdOdOdOdOdO
+dOdOdOdOdOdOdQclclclclclevclclclclclclclclclewclclclclclclclclclexclclclclclclclclclclclclclcleieieiclclclclclclclclcldQdOdOdOdOdOdOdOdOdQclclclclcleyclclclclclclclclclezclclclclclclclclcleAclclclclclclclclclclclclclcleieieiclclclclclclclclcldQdOdOdOdOdOdO
+dOdOdOdOdOdOdOeBebebebebebeCebebebebebeCebebebebebebebebebebebeDebeDebebebebebeCebebebebebebeCebebebeCebebebebebebeCcldQdOdOdOdOdOdOdOdOdOeBebebebebebebebebebebebebebebebebebebebebebebebeDebeDebebebebebeCebebebebebebeCebebebeCebebebebebebeCcldQdOdOdOdOdOdO
+dOdOdOdOdOdOdOeEeFebebebebebebebebebebebebebebebebebebebebebeGcleHcleIebebebebebebebeJebebeJebebeJebebeJebebeJebebebcldQdOdOdOdOdOdOdOdOdOeEeFebebebebebebebebebebebebebebebebebebebebebeGcleHcleIebebebebeKeKeKeKeKeKeKeKeKeKeKeKeKeKeKeKeKeKeKcldQdOdOdOdOdOdO
+dOdOdOdOdOdOdOeLebebebebebeDebebebebebeDebebebebebebebebebebebeCebeCebebebebebeMeNeNeNeNeNeNeNeNeNeNeNeNeNeNeNeNeNeOcldQdOdOdOdOdOdOdOdOdOeLebebebebebeDebebebebebeDebebebebebebebebebebebePeKePebebebebeQeReReReReReReReReReReReReReReReReReReScldQdOdOdOdOdOdO
+dOdOdOdOdOdOdQclclcleTclclclclcleUclclclclcleVclclclebebeWebebebebebebebeWebebeXeYeYeYeYeYeYeYeYeYeYeYeYeYeYeYeYeYeZcldQdOdOdOdOdOdOdOdOdQclclclfaclclclclclfbclclclclclfcclclclebebeWebeQeReReRfdebeWebeQeReReReReReReReReReReReReReReReReReReScldQdOdOdOdOdOdO
+dOdOdOdOdOdOdQcldXfedXdXdXcldXffdXdXdXcldXfgdXdXdXclebebfhebebfififiebebfhebebeXeYfjfjfjfjfjfjfjfkflflflflflflfleYfmeBdOdOdOdOdOdOdOdOdOdQcldXfndXdXdXcldXfodXdXdXcldXfpdXdXdXclebebfhebeQeReReRfdebfhebeQeReReReReReReReReReReReReReReReReReReReBdOdOdOdOdOdOdO
+dOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebfqfrfrfrfsebfhebebeXeYfjftftftftftftfjflflflflflflfleYfmeEdOdOdOdOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebeQeReReRfdebfhebeQeReReReReReReReReReReReReReReReReReReReEdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOfudXdXfvdXdXcldXdXfvdXdXcldXdXfvdXdXclebebfhebfqfrfwfrfsebfhebebeXeYfjftftftftftftfjflflflflflflfleYfmeEdOdOdOdOdOdOdOdOdOdOfudXdXfvdXdXcldXdXfvdXdXcldXdXfvdXdXclebebfhebeQeReReRfdebfhebeQeReReReReReReReReReReReReReReReReReReReEdOdOdOdOdOdOdO
+dOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebfqfrfrfrfsebfhebebeXeYfjftftftftftftfjflflflflflflfleYfmeEdOdOdOdOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebeQeReReRfdebfhebeQeReReReReReReReReReReReReReReReReReReReEdOdOdOdOdOdOdO
+dOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebfxfhebebfyfyfyebebfhebebeXeYfjftftftftftftfjflflflflflflfleYfmeEdOdOdOdOdOdOdOdOdOdQfzdXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebeQeReReRfdebfhebeQeReReReReReReReReReReReReReReReReReReReEdOdOdOdOdOdOdO
+dOdOdOdOdOdOdQclclclclclclclclclclclclclclclclclclclebebfAebebebebebebebfAebebeXeYfBftftftftftftfjflflflflflfCfDeYfmeEdOdOdOdOdOdOdOdOdOdQclclclclclclclclclclclclclclclclclclclebebfAebeQeReReRfdebfAebeQeReReReReReReReReReReReReReReReReReReReEdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOeBebebebebebebebebebebebebebebebebebebebebebebebeDebeDebebebebebeXeYfjftftftftftftfjflflflflflflfleYfmeEdOdOdOdOdOdOdOdOdOdOeBebebebebebebebebebebebebebebebebebebebebebebebfEfFfEebebebebeQeReReReReReReReReReReReReReReReReReReReEdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOeEfGebebebebebebebebebebebebebebebebebebebebebeGcleHcleIebebebebeXeYfjftftftfHftftfjflflflflflflfleYfmeEdOdOdOdOdOdOdOdOdOdOeEeFebebebebebebebebebebebebebebebebebebebebebeGcleHcleIebebebeQeReReReReReReReReReReReReReReReReReReReEdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOeLebebebebebeDebebebebebeDebebebebebebebebebebebeCebeCebebebebebeXeYfjftftftftftftfjflflflflflflfleYfmeEdOdOdOdOdOdOdOdOdOdOeLebebebebebeDebebebebebeDebebebebebebebebebebebePeKePebebebebeQeReReReReReReReReReReReReReReReReReReReEdOdOdOdOdOdOdO
+dOdOdOdOdOdOdQclclclfIclclclclclfJclclclclclfKclclclebebeWebebebebebebebeWebebeXeYfjftftftftftftfjflflflflflflfleYfmeEdOdOdOdOdOdOdOdOdOdQclclclfLclclclclclfMclclclclclfNclclclebebeWebeQeReReRfdebeWebeQeReReReReReReReReReReReReReReReReReReReEdOdOdOdOdOdOdO
+dOdOdOdOdOdOdQcldXfOdXdXdXcldXfPdXdXdXcldXfQdXdXdXclebebfhebebfififiebebfhebebeXeYfjfjfjfjfjfjfjfRflflflflflflfleYfmeLdOdOdOdOdOdOdOdOdOdQcldXfSdXdXdXcldXfTdXdXdXcldXfUdXdXdXclebebfhebeQeReReRfdebfhebeQeReReReReReReReReReReReReReReReReReReReLdOdOdOdOdOdOdO
+dOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebfqfrfrfrfsebfhebebeXeYeYeYfVeYeYeYeYeYeYeYeYeYeYeYeYeYeZfWdQdOdOdOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebeQeReReRfdebfhebeQeReReReReReReReReReReReReReReReReReReScldQdOdOdOdOdOdO
+dOdOdOdOdOdOdOfudXdXfvdXdXcldXdXfvdXdXcldXdXfvdXdXclebebfhebfqfrfwfrfsebfhebebfXfYfYfYfYfYfYfYfYfYfYfYfYfYfYfYfYfYfZfWdQdOdOdOdOdOdOdOdOdOfudXdXfvdXdXcldXdXfvdXdXcldXdXfvdXdXclebebfhebeQeReReRfdebfhebeQgaeReReReReReReReReReReReReReReReReReScldQdOdOdOdOdOdO
+dOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebfqfrfrfrfsebfhebcleIebebebebebebebebebebebebebebebebebebeBdOdOdOdOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebeQeReReRfdebfhebclgbgcgdgegcgdgegcgdgegcgdgegcgfgegcgdgeeBdOdOdOdOdOdOdO
+dOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebebfyfyfyebebfhebebebggghgiggghgiggghgiggghgiggghgiggghgieEdOdOdOdOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebeQeReReRfdebfhebebebgjgkglgjgkglgjgkglgjgkglgjgkglgjgkgleEdOdOdOdOdOdOdO
+dOdOdOdOdOdOdQclclclclclclclclclclclclclclclclclclclebebfAebebebebebebebfAebcleIebebebebebebebebebebebebebebebebebebeEdOdOdOdOdOdOdOdOdOdQclclclclclclclclclclclclclclclclclclclebebfAebeQeReReRfdebfAebcleIgmgkgngmgkgngmgkgngmgkgngmgkgngmgkgneEdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOeBebebebebebebebebebebebebebebebebebebebebebebebeDebeDebebebebebebggghgiggghgiggghgiggghgiggghgiggghgieEdOdOdOdOdOdOdOdOdOdOeBebebebebebebebebebebebebebebebebebebebebebebebfEfFfEebebebebebdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXeEdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOeEeFebebebebebebebebebebebebebebebebebebebebebeGcleHcleIebebebcleIebebebebebebebebebebebebebebebebebebeLdOdOdOdOdOdOdOdOdOdOeEeFebebebebebebebebebebebebebebebebebebebebebeGcleHcleIebebebclgodXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXeLdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOeLebebebebebeDebebebebebeDebebebebebebebebebebebeCebeCebebebebebebgpgpgpgpgpgpgpgpgpgpgpgpgpgpgpgpgpgqcldQdOdOdOdOdOdOdOdOdOeLebebebebebeDebebebebebeDebebebebebebebebebebebePeKePebebebebebdXdXdXdXdXdXdXdXdXgrdXdXdXdXdXdXdXdXgscldQdOdOdOdOdOdO
+dOdOdOdOdOdOdQclclclgtclclclclclguclclclclclgvclclclebebeWebebebebebebebeWebebgwgwgwgwgwgwgwgwgwgwgwgwgwgwgwgwgwgwgwcldQdOdOdOdOdOdOdOdOdQclclclgxclclclclclgyclclclclclgzclclclebebeWebeQeReReRfdebeWebclgodXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXdXcldQdOdOdOdOdOdO
+dOdOdOdOdOdOdQcldXgAdXdXdXcldXgBdXdXdXcldXgCdXdXdXclebebfhebebfififiebebfhebebgwgDgDgDgDgEgDgDgDgDgDgDgDgDgDgDgDgDgDcldQdOdOdOdOdOdOdOdOdQcldXgFdXdXdXcldXgGdXdXdXcldXgHdXdXdXclebebfhebeQeReReRfdebfhebebdXgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgIgJcldQdOdOdOdOdOdO
+dOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebfqfrfrfrfsebfhebebgKgDgDgLgMgNgMgDgDgDgDgDgMgNgOgNgNgDgDcldQdOdOdOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebeQeReReRfdebfhebebgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPgPcldQdOdOdOdOdOdO
+dOdOdOdOdOdOdOfudXdXfvdXdXcldXdXfvdXdXcldXdXfvdXdXclebebfhebfqfrfwfrfsebfhebebgQgDgDgRgSgTgUgDgDgDgDgDgVgNgWgNgNgDgDcldQdOdOdOdOdOdOdOdOdOfudXdXfvdXdXcldXdXfvdXdXcldXdXfvdXdXclebebfhebeQeReReRfdebfhebebgPgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgXgYcldQdOdOdOdOdOdO
+dOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhfxfqfrfrfrfsebfhebebgQgDgDgDgDgDgDgDgDgDgDgDgDgDgDgDgDgDgDcldQdOdOdOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebeQeReReRfdebfhebebgKgZgXgXgXgXgXhagXgXgXgXgXgXgXgXgXgXgZcldQdOdOdOdOdOdO
+dOdOdOdOdOdOdQcldXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebebfyfyfyebebfhebebhbhchdhehfhghhgDhdgDhdgDhihjhkhlgDhdhccldQdOdOdOdOdOdOdOdOdQfzdXdXdXdXdXcldXdXdXdXdXcldXdXdXdXdXclebebfhebeQeReReRfdebfhebebhbhmhngXgXhohphqhrgXhrhqhpgYgYhsgXhnhmcldQdOdOdOdOdOdO
+dOdOdOdOdOdOdQclclclclclclclclclclclclclclclclclclclebebfAebebebebebebebfAebebclclclclclclclclclhtclclclclclclclclclcldQdOdOdOdOdOdOdOdOdQclclclclclclclclclclclclclclclclclclclebebfAebeQeReReRfdebfAebebclclclclclclclclclhuclclclclclclclclclcldQdOdOdOdOdOdO
+dOdOdOdOdOdOdOeBhvhvhvhvhvhvhwhxhyhzebebebeCebebebeCebebebebebeDebeDebebebebebhAhBhBhBhBhChBhBhDhEhFhBhBhChBhBhBhChGeBdOdOdOdOdOdOdOdOdOdOeBebeCebebebeChHhIhJhKeReReRhKeReReRhKfdebebebebfEfFfEebebebebebhAhBhBhBhBhLhBhBhDhEhFhBhBhLhBhMhBhLhNeBdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOeEhvhvhvhvhvhvhwhOhPhQebebebebebebebebebebebebeGcleHcleIebebebebhRhEhEhEhEhEhEhEhEhEhEhEhEhEhEhEhEhEhSeEdOdOdOdOdOdOdOdOdOdOeEebebebebebebhHhThUeReReReReReReReReRfdebebebeGcleHcleIebebebebhVhEhEhEhEhEhEhEhEhEhEhEhEhEhWhWhWhWhSeEdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOeLhvhvhvhvhvhvhwhXhYhZebebebeDebebebeDebebebebebeCebeCebebebebebhAiaiaibhEiciaiaiaiaiaiaiaiaiaiaiaiaideLdOdOdOdOdOdOdOdOdOdOieebebebebebebhHifigeReReReReReReReReRfdebebebebeCebeCebebebebebhAiaiaibhEiciaiaiaiaiaiaiaihihiaihiaideLdOdOdOdOdOdOdO
+dOdOdOdOdOdOdQclclclclclclclclclclclcliiclclclijclclebebebebebebebebebebebebebclclclclikclclclclclclclclclilclclclclcldQdOdOdOdOdOdOdOdOdOieebebebebebebfFfFfFfFfFfFfFfFfFfFfFfFebebebebebebebebebebebebebclclclclimclclclclclclinioinclclclclclcldQdOdOdOdOdOdO
+dOdOdOdOdOdOdQclipipipipipipipipiqipipipirclebebebclisebebebebebebebebebebebitcliuivebebebiwiwiwclixixiyixizixixixiAcldQdOdOdOdOdOdOdOdOdOieebebebebebebebebebebebebebebebebebebebebebebebebebebebebebebitclebiBiBiBiBiBebiCcliDiDiEiDiDiDiDiDiDcldQdOdOdOdOdOdO
+dOdOdOdOdOdOdQclipipiFipipipiqipipipipipircleIebebclisebebebebebebebebebebebiGcliugiebebebiHiIiIcliJiKiJiLiziLiJiKiJcldQdOdOdOdOdOdOdOdOdOeLebeDebebebeDebebebeDebebebeDebebebeDebebebebebebebebebebebebiGclebiBiMiNiOiBebiPcliDlniRiQiDiDiDiDiQcldQdOdOdOdOdOdO
+dOdOdOdOdOdOdOfuipipipipiqipipipipipipipiriSebebebclisebebebebebebebebebebebiTcliUivebebebebebeGcliViWiXiXiYiXiZjajbcldQdOdOdOdOdOdOdOdOdQclclclclclclclclclclclclclclclclclclclisisisebebebebebebebebebiTcleIiBjcjdjeiBeGjfcliDiQiQjgjhjiiQiQjjcldQdOdOdOdOdOdO
+dOdOdOdOdOdOdQclipjkipipipipipipipipipipiriSebebebclclclclclcljlcljlclclclclclcliugiebebebebebjmcliJiKjniLiziLiJiKiJcldQdOdOdOdOdOdOdOdOdQcljojpebebebebjqebebebebebjrebebjsjsclclclclclcljtcljtclclclclclclebiBjujvjwiBebjxcliQjyiQjzjAjziQjBiQcldQdOdOdOdOdOdO
+dOdOdOdOdOdOdQclipipipipiFipipiqipipipipircleIebebijebebjCebeCebebebeCjDjEjFjGclebebebeJjHeJjIjHclixjJiXiXjKiXiXjLixcldQdOdOdOdOdOdOdOdOdQclebjMjNebebjqebebebebebjrebebebjsjsclebebebebeCebebebeCebebebebclebiBiBiBiBiBebjOcliDiQiQjijzjijyjPiQcldQdOdOdOdOdOdO
+dOdOdOdOdOdOdQcljQipipipipipipipipipipjRirclebebebijebebebebebebebebebjDjSjTjTikebebebjUjVjVjVjVcliJiKiJiLjWiLiJiKiJcldQdOdOdOdOdOdOdOdOdQclebjXjYjZkaebjYebebjqebebkbkbebjsjskcebebebebebebebebebebebebebkdebebebeDebebebiCcliDkejBiQiQkfiQiDiDcldQdOdOdOdOdOdO
+dOdOdOdOdOdOdQclclclclclclclclclclclclclclclclclclclkgebebfxfxfxebkhebjDkikjkkinclclclclclclclclclclclclclclclclclclcldQdOdOdOdOdOdOdOdOdQclclclclclclclclclclclclclclclclclclcleIebebebebebebebebebebebebinclclclclclclclclclclclclclclclclclclcldQdOdOdOdOdOdO
+dOdOdOdOdOdOdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQclklebebfxfxfxebebebjDkmknkocldQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdOdOdOdOdOdOdOdOdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQclebebebebebebebebebebebebebcldQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdQdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOeBklebebebebebebebebjDjSjTkpeBdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOeBebebebebebebebebebebebebebeBdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOeEkqkrkrkrksebebebktkujSkvkwiedOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOeEebebebebeDebebebeDebebebebiedOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOkxdSdSdSkyclkzclkzclkAdSdSdSkBdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOkxdSdSdSkyclclclclclkAdSdSdSkBdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdQkzclkzdQdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdQdQdQdQdQdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOkCkDkEkFkGkHkIkHkIkHkEkFkGkHkJdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOkKkLkLkLkLkLkLkLkLkLkLkLkLkLkMdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOkCkNkOkPkQkRkQkSkSkSkSkSkQkQkQkTkUkVdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOkKkLkWkXkXkXkXkXkXkXkXkXkXkXkXkXkYkZdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOkNlalbkSkSkSkSkSkQkQkQkSkSkSkSlckUkVdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOkYkXkXkXkXkXkXkXkXkXkXkXkXkXkXkXkYkZdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOldkNlekSkQlakQkSkSkPkSkSlflgkQkTkUkVdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOlhkLlikXkXkXkXkXkXkXkXkXkXkXkXkXkYkZdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOldkHkEkFkGkHkDkDkDkHkEkFkGkHljdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOlhkLkLkLkLkLkLkLkLkLkLkLkLkLlkdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
+dOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdOdO
"}
+
diff --git a/_maps/map_files/RandomZLevels/stationCollision.dmm b/_maps/map_files/RandomZLevels/stationCollision.dmm
index 4934529dbf1..dce6e0a6499 100644
--- a/_maps/map_files/RandomZLevels/stationCollision.dmm
+++ b/_maps/map_files/RandomZLevels/stationCollision.dmm
@@ -295,7 +295,7 @@
"fI" = (/turf/simulated/wall/cult,/area/awaymission/midblock)
"fJ" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/midblock)
"fK" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/midblock)
-"fL" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/awaymission/arrivalblock)
+"fL" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/arrivalblock)
"fM" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/awaymission/arrivalblock)
"fN" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/awaymission/arrivalblock)
"fO" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/awaymission/arrivalblock)
@@ -383,6 +383,7 @@
"hs" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel,/area/awaymission/arrivalblock)
"ht" = (/obj/structure/stool/bed/chair{dir = 1},/obj/effect/decal/remains/human,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/awaymission/arrivalblock)
"hu" = (/turf/simulated/floor/plasteel,/area/awaymission/arrivalblock)
+"hv" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission/arrivalblock)
"hw" = (/obj/structure/window/reinforced,/turf/simulated/floor/plasteel,/area/awaymission/arrivalblock)
"hx" = (/obj/machinery/door/window/southleft{name = "Windoor"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/awaymission/arrivalblock)
"hy" = (/obj/item/ammo_casing/c10mm{pixel_x = 2; pixel_y = 5},/obj/item/ammo_casing/c10mm{pixel_x = -4; pixel_y = -5},/obj/item/ammo_casing/c10mm,/turf/simulated/floor/plasteel/airless,/area/awaymission/midblock)
@@ -404,6 +405,7 @@
"hO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
"hP" = (/obj/effect/decal/remains/human,/obj/item/weapon/kitchen/knife/butcher,/obj/item/weapon/kitchen/knife,/obj/item/clothing/head/chefhat,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
"hQ" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
+"hR" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/awaymission/arrivalblock)
"hS" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/midblock)
"hT" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/midblock)
"hU" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/midblock)
@@ -541,7 +543,6 @@
"kz" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l"; icon_state = "propulsion_l"},/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l"; icon_state = "burst_l"},/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l"; icon_state = "propulsion_l"},/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/plating,/area/awaymission/arrivalblock)
"kA" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (NORTH)"; icon_state = "propulsion_l"; dir = 1},/obj/structure/window/reinforced,/turf/space,/area/awaymission/arrivalblock)
"kB" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r (NORTH)"; icon_state = "propulsion_r"; dir = 1},/obj/structure/window/reinforced,/turf/space,/area/awaymission/arrivalblock)
-"kC" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/awaymission/arrivalblock)
"kD" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/plasteel,/area/awaymission/arrivalblock)
"kE" = (/obj/machinery/vending/hydroseeds,/turf/simulated/floor/plasteel,/area/awaymission/arrivalblock)
"kF" = (/obj/structure/sink/kitchen{pixel_y = 32},/turf/simulated/floor/plasteel,/area/awaymission/arrivalblock)
@@ -580,10 +581,8 @@
"lm" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/southblock)
"ln" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/southblock)
"lo" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/turf/simulated/floor/plating,/area/awaymission/southblock)
-"lp" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/awaymission/arrivalblock)
"lq" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/awaymission/arrivalblock)
"lr" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/awaymission/arrivalblock)
-"ls" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/awaymission/arrivalblock)
"lt" = (/obj/structure/closet/crate/hydroponics,/turf/simulated/floor/plasteel,/area/awaymission/arrivalblock)
"lu" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel,/area/awaymission/arrivalblock)
"lv" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel,/area/awaymission/arrivalblock)
@@ -617,7 +616,6 @@
"lX" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/southblock)
"lY" = (/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/awaymission/southblock)
"lZ" = (/obj/machinery/sleeper{dir = 1},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/awaymission/southblock)
-"ma" = (/obj/machinery/sleep_console,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/southblock)
"mb" = (/turf/simulated/floor/plasteel{icon_state = "warning"},/area/awaymission/southblock)
"mc" = (/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"},/area/awaymission/southblock)
"md" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/light/small,/turf/simulated/floor/plasteel,/area/awaymission/gateroom)
@@ -680,12 +678,13 @@ aafZgbgbgbgbgbfZhEiDilgzgzgzgzgzgzjogzgzgzjpjpiYiYjqiYiYiYiYjriYiYiYjsjtjujujuju
aafZgcgcgbgcgcfZhVhuhqjyjzjAiljBhujChuhuhuhuhuiYjDjEjFiYjGjHjHjIjJiYjKjEjujLjMjNjOjPjujQjQjRjRjSjQjTaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aafZgbgbgbgbgbfZjUjViDhqhWhujWjyhujXhuhuhuhuhuiYjYjZkaiYkbkckdkekfiYjKkgjujLkhkikjjPjujQjQjQjQjQkkjTaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aafZklklklklklfZgzkmknkokmkngzgzgzgzgzjpgzgzgziYiYiYiYiYiYiYkpiYjriYjKjEjukqkrksktkujukvjQkwjQjQjQjTaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aagakxkykykykzgaaafLkAgRkBkCaagzkDkEkFhukGjzhuiYkfjHkfiYkHjHjHkIkfiYjKjEjukJkKkLkKkMjujQkkjQkNjQjQjTaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aagakxkykykykzgaaafLkAgRkBfQaagzkDkEkFhukGjzhuiYkfjHkfiYkHjHjHkIkfiYjKjEjukJkKkLkKkMjujQkkjQkNjQjQjTaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaafZkOkPkQfZaagzhuhujzhuhujzhuiYkRjKkSiYkRjKjKjKkTiYjKjEjukUkVkWkVkXjujQjQjSjQjQkkjTaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaafZkOgbkQfZaagzhujzhujzhuhuhuiYkfkdkfkpkRjKkYkZlaiYjKjEjulbkVkWkVlcjukkjQjQldkwjQjTaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaafZkOgckQfZaagzlehulfhulghuhuiYiYiYiYiYlhjKlijKljiYjKjEjulkkVkWkVlljujujujujulmlnloaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaalplqlrlqlsaagzlthuluhulvjzhuiYlwlxlyiYkRjKlijKlziYjKlAjujujulBjujujulClDlEjuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaahvlqlrlqhRaagzlthuluhulvjzhuiYlwlxlyiYkRjKlijKlziYjKlAjujujulBjujujulClDlEjuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaagzltlFlGlHhuhuhuiYlIkfkfkpkRjKlJjKlKiYlLlMlNlOlOlPlOlQlRlSlTlUjuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaagzgzgzgzgzgzgzgziYlVlWlXiYkfkdlYlZmaiYjKjKjKmbmbmbmbmcjulCmdmejuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaagzgzgzgzgzgzgzgziYlVlWlXiYkfkdlYlZkfiYjKjKjKmbmbmbmbmcjulCmdmejuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYjujujujujuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
+
diff --git a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm
index 9bae9a8215c..bf249399535 100644
--- a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm
+++ b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm
@@ -169,7 +169,7 @@
"dm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dn" = (/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"do" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dp" = (/obj/structure/flora/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "greencorner"; tag = "icon-greencorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dp" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 2; heat_capacity = 1e+006; icon_state = "greencorner"; tag = "icon-greencorner"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dr" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"ds" = (/obj/machinery/vending/hydroseeds{slogan_delay = 700},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
@@ -304,7 +304,7 @@
"fR" = (/obj/structure/table/woodentable,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fS" = (/obj/machinery/light/small,/obj/machinery/alarm/monitor{dir = 1; frequency = 1439; locked = 0; pixel_y = -23; req_access = null},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/dresser,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fT" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"fU" = (/obj/structure/flora/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"fU" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fV" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/camera{c_tag = "Central Hallway"; dir = 1; network = list("UO45")},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fW" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"fX" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "dark"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
@@ -452,7 +452,7 @@
"iJ" = (/obj/machinery/door/firedoor,/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "bar"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"iK" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"iL" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
-"iM" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "refrigerator"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/reagent_containers/food/drinks/milk,/obj/item/weapon/storage/fancy/egg_box,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"iM" = (/obj/structure/closet/secure_closet{icon_broken = "fridgebroken"; icon_closed = "fridge"; icon_locked = "fridge1"; icon_off = "fridgeoff"; icon_opened = "fridgeopen"; icon_state = "fridge"; locked = 0; name = "refrigerator"; req_access_txt = "201"},/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/reagent_containers/food/condiment/milk,/obj/item/weapon/storage/fancy/egg_box,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"iN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"iO" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/obj/structure/sign/biohazard{pixel_x = -32},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"iP" = (/obj/structure/table,/obj/item/device/radio/off,/obj/item/device/radio/off,/turf/simulated/floor/plasteel{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
@@ -526,7 +526,7 @@
"kf" = (/obj/machinery/suit_storage_unit/engine,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "vault"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"kg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
"kh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaycontent/a6{has_gravity = 1; name = "UO45 Gateway"})
-"ki" = (/obj/structure/flora/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"ki" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "white"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"kj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{tag = "icon-whitepurplecorner (EAST)"; icon_state = "whitepurplecorner"; dir = 4; heat_capacity = 1e+006},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"kk" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "whitepurple"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"kl" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "whitepurplecorner"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
@@ -665,7 +665,7 @@
"mO" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"mP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"mQ" = (/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"mR" = (/obj/effect/decal/cleanable/dirt,/obj/structure/flora/kirbyplants{layer = 5},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"mR" = (/obj/effect/decal/cleanable/dirt,/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"mS" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/machinery/newscaster{pixel_x = -30},/turf/simulated/floor/plasteel{dir = 9; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"mT" = (/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"mU" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
@@ -790,7 +790,7 @@
"pj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door_control{desc = "A remote control-switch whichs locks the research division down in the event of a biohazard leak or contamination."; id = "UO45_biohazard"; name = "Biohazard Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "201"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"pk" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "201"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/item/weapon/restraints/handcuffs,/obj/item/device/flash,/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"pl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"pm" = (/obj/structure/flora/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
+"pm" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"pn" = (/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"po" = (/obj/machinery/light/small{dir = 4},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"pp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock{id_tag = "awaydorm4"; name = "Dorm 4"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
@@ -893,7 +893,7 @@
"ri" = (/obj/machinery/light/small{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"rj" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"rk" = (/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
-"rl" = (/obj/structure/flora/kirbyplants{layer = 5},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+"rl" = (/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "yellow"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"rm" = (/obj/machinery/firealarm{dir = 2; pixel_x = 0; pixel_y = 24},/obj/structure/dispenser{pixel_x = -1},/turf/simulated/floor/plasteel{dir = 9; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"rn" = (/obj/machinery/light/small{dir = 1},/obj/structure/table,/obj/item/weapon/tank/emergency_oxygen{pixel_x = -8; pixel_y = 0},/obj/item/weapon/tank/emergency_oxygen{pixel_x = -8; pixel_y = 0},/obj/item/clothing/mask/breath{pixel_x = 4; pixel_y = 0},/obj/item/clothing/mask/breath{pixel_x = 4; pixel_y = 0},/obj/machinery/newscaster{pixel_y = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"ro" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/table,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
@@ -1149,7 +1149,7 @@
"we" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/carpet{heat_capacity = 1e+006},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"wf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"wg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{burnt = 1; dir = 8; heat_capacity = 1e+006; icon_state = "floorscorched1"; tag = "icon-floorscorched1 (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
-"wh" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/flora/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
+"wh" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/twohanded/required/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"wi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "floorgrime"; tag = "icon-floorgrime (WEST)"},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"wj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; tag = "icon-manifold-r-f (EAST)"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"wk" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating/airless/asteroid{carbon_dioxide = 173.4; heat_capacity = 1e+006; name = "Cave Floor"; nitrogen = 135.1; oxygen = 0; temperature = 363.9; toxins = 229.8},/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
diff --git a/_maps/map_files/RandomZLevels/wildwest.dmm b/_maps/map_files/RandomZLevels/wildwest.dmm
index 4cc4825b777..ae596b4b18b 100644
--- a/_maps/map_files/RandomZLevels/wildwest.dmm
+++ b/_maps/map_files/RandomZLevels/wildwest.dmm
@@ -43,7 +43,7 @@
"aQ" = (/obj/item/weapon/paper{info = "meat grinder requires sacri"},/turf/simulated/floor/engine/cult,/area/awaymission/wwvault)
"aR" = (/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
"aS" = (/obj/effect/landmark/corpse/syndicatecommando,/turf/simulated/floor/engine/cult,/area/awaymission/wwvault)
-"aT" = (/turf/simulated/mineral,/area/awaymission/wwrefine)
+"aT" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/simulated/mineral,/area/awaymission/wwrefine)
"aU" = (/turf/simulated/wall/mineral/sandstone,/area/awaymission/wwrefine)
"aV" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/simulated/wall/mineral/sandstone,/area/awaymission/wwmines)
"aW" = (/obj/effect/decal/cleanable/blood/gibs/body{tag = "icon-gibup1"; icon_state = "gibup1"},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
@@ -311,6 +311,8 @@
"fY" = (/obj/machinery/washing_machine,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"fZ" = (/obj/effect/decal/cleanable/blood/gibs/body{tag = "icon-gibup1"; icon_state = "gibup1"},/obj/structure/stool/bed/chair/wood/normal,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/awaymission/wwmines)
"ga" = (/obj/item/weapon/hatchet,/turf/simulated/floor/wood,/area/awaymission/wwmines)
+"gb" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/wwrefine)
+"gc" = (/turf/space,/turf/simulated/shuttle/wall{dir = 3; icon_state = "swall_f10"; layer = 2; tag = "icon-swall_f10"},/area/awaymission/wwrefine)
"gd" = (/obj/effect/landmark/corpse/syndicatecommando{mobname = "Syndicate Commando"},/turf/simulated/floor/grass,/area/awaymission/wwgov)
"ge" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
"gf" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/grille,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
@@ -321,19 +323,17 @@
"gk" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/grass,/area/awaymission/wwgov)
"gl" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{tag = "icon-fwindow (EAST)"; icon_state = "fwindow"; dir = 4},/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/grille,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
"gm" = (/obj/effect/decal/cleanable/blood,/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/simulated/mineral,/area/awaymission/wwmines)
-"gn" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"},/area/awaymission/wwrefine)
+"gn" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/awaymission/wwrefine)
"go" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"},/area/awaymission/wwrefine)
"gp" = (/turf/simulated/shuttle/wall{tag = "icon-swall8"; icon_state = "swall8"},/area/awaymission/wwrefine)
"gq" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle{tag = "icon-floor2"; icon_state = "floor2"},/area/awaymission/wwrefine)
"gr" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall4"},/area/awaymission/wwrefine)
-"gs" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"},/area/awaymission/wwrefine)
+"gs" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/awaymission/wwrefine)
"gt" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/awaymission/wwrefine)
"gu" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle{tag = "icon-floor2"; icon_state = "floor2"},/area/awaymission/wwrefine)
"gv" = (/turf/simulated/shuttle{tag = "icon-floor2"; icon_state = "floor2"},/area/awaymission/wwrefine)
-"gw" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"},/area/awaymission/wwrefine)
"gx" = (/turf/simulated/shuttle/wall{tag = "icon-swallc1"; icon_state = "swallc1"},/area/awaymission/wwrefine)
"gy" = (/turf/simulated/shuttle/wall{tag = "icon-swallc2"; icon_state = "swallc2"},/area/awaymission/wwrefine)
-"gz" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"},/area/awaymission/wwrefine)
"gA" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
"gB" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/space/syndicate/black/orange,/obj/item/clothing/head/helmet/space/syndicate/black/orange,/obj/item/clothing/mask/gas/syndicate,/obj/item/weapon/tank/oxygen,/turf/simulated/shuttle{tag = "icon-floor2"; icon_state = "floor2"},/area/awaymission/wwrefine)
"gC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/simulated/shuttle{tag = "icon-floor2"; icon_state = "floor2"},/area/awaymission/wwrefine)
@@ -570,71 +570,71 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababaFaFababababababacaaaaacacaaaaaaaaaGaGaGaGaGaGaGaGaNaLaOaOaOaOaPaOaOaOaLaNaNaGaLaOaOaLaLaLaNaGaLaLaLaIaIaIaLaLaLaLaGaGaGaGaGaGaGaGaGaGaLaLaLaLaLaLaNaNaLaLaLaNaNaNaNaNaLaLaLaLaLaNaLaLaLaLaNaNaNaGaGaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaacaaacaaacaaaaabaQacabaaaaacacaaacaaaaaaaaaaaaaaaGaGaGaGaGaGaGaNaLaLaLaRaRaRaRaRaRaRaRaOaOaOaOaOaRaRaRaPaLaLaLaLaRaLaLaRaLaLaRaRaLaLaLaLaLaLaLaLaLaLaLaLaRaLaLaRaLaLaLaLaRaLaNaLaLaLaLaLaRaRaRaLaLaLaRaRaLaNaNaNaNaNaGaGaNaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaacacacacacaaaaabaSacabaaaaacacaaacacaaaaaaaaaaaaaGaGaGaGaGaGaGaLaLaPaOaOaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaRaRaLaRaRaLaRaRaRaRaRaRaLaRaRaRaLaLaLaRaRaRaRaRaRaRaRaRaRaRaRaLaLaLaLaLaLaNaGaNaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaaaacacacacaaaaabacacabaaacacacaaaaacacaaaaaaaaaGaGaGaGaGaGaGaGaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaNaNaNaNaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaaaacacacaaaaabacacabaaacaaacaaaaaaacacacaGaGaGaGaGaGaGaTaTaUaVaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaLaLaLaLaIaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaacacacacacacacaaaaaaaaaaaaaaaaaaaGaGaGaGaGaUaUaUaUaUaUaUaRaRaRaRaRaRaRaRaRaWaRaRaRaRaRaRaRaRaRaRaRaRaRaRaXaRaRaWaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaYaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaLaRaRaRaIaNaGaGaaaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaGaGaGaGaUaZbababababbaRaRaRaRaRaXaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaXaRaRaRaRaRaRaRaRaRaRaRaRaRaRaWaRaRaRaRaRaRaRaRaRaRaRaXaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaNaNaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaaaaaaaaaaaaaaaaaaaaaaaGaGaGaUbabababababbaRaRaRaRaRaRaRbcaRaRaRaRaRaRaRaRaRaRaRbdaRaRaRaRaRaRaRaRaRaRaRaRaXaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaLaNaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaGaGbeaUbabababaaUaUaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaWaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbdaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaNaNaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaGaGaGbebabfbababaaUaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbgaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaNaNaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaGaGaUaUbababababaaUaLaRaRaRaRaRbhbhbhbhbhbhbhbhbhbhbibhbhbhbhbhbhbhbhbhbhbhbjbhbhbhbhbhbhbhbhbhbhbhbhbhbibhbhbhbhbhbhbhbhbhbhbhbhbkbkbhbhbhbhbhbhbhbhbhbhaRbdaRaRaRaRaRaRaRaRaRaRaRaLaNaNaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaGaGaGaUbfbabablbabmaUaLaRaRaRaRaRbjbhbhbhbhbhbhbhbhbhbibkbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbkbhbhbhbhbhbhbhbhbhbhbhbhbhbhbnbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhaRaRaWaRaRaRaRaRaRaRaRaRaLaLaNaNaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaUbabababababaaUaLaRaRaXaRaRbhbhbhbnbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbkbhaRaRaRaRaRaRaXaRaRaRaRaRaLaLaLaNaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaUbababobababfaUaLaRaRaRaRaRbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbkbhbhbhbhbhbhbibhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaabpbpbpbpbpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaUaUbabababfbabaaUaLaRaRaRaRaRbhbhbhbhaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbqbhbhbhaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbhbhbhbhaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaabpbpbpaaaaaaaabpbpbpbpbpbpbpbpbpbpaabpaabpbpbpbpaaaaaabpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaUbrbabababababaaUaLaRaRaRaRaRbkbhbhbhaRbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsaRbhbhbhbhaRbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsaRbhbhbhbhaRaRaRaRaRaRaRaRaRaRaRaRaRaLaLaGaGaGaGaGaaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaabpbtbububububububtbtbtbtbtbububtbtbtbubtbtbtbtbubububububtbtbtbtbtaabpaabpbpaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaUbababababababaaUaLaRaRaRaRaRbhbhbhbhaRbsbvbwbwbxbwbwbwbsbybzeSbzbBbsaRbhbhbCbhaRbsbDbDbDfQbDbDbDgEbBbBbEcebFbGbBgFbhbhbhbhgGbwbwbHgHbJbwbKbsaRbhbhbhbhaRaRaRaRaRaRaRaRaRaRaRaRaRaLaNaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaabpbLbMbNbObObObObObObObObObObObObObObObObObObObObObObObObObObObObPbMbQaaaaaabpbpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaUbabababfbababaaUaLaRaRaRaRaRbhbhbhbhaRbsgIbRbwbwbwbSgJbsbhbhbhbhbhbsaRbhbhbhbhaRbsbDbDbDbDbDbDbDbhbhbhbhbhbhbhbhbhbhbhbhbhbhbwbwbwbwbwbwbwbsaRbhbhbhbhaRaXaRaRaRaRaRaRaRaRaRaRaRaLaLaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaabpbTbUbVbVbVbVbVbVbVbVbVbWbVbVbVbVbVbVbVbVbVbVbWbVbVbVbVbVbVbVbVbVbXbQaaaaaaaabpbpaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaUbfbababababfbaaUaLaRaWaRaRbdbhbhbhbhaRbsbwbwbwbwbwbwbwbsbhbhbhbhbhbsaRbhbkbhbhaRbsbDbDbDbDbDbDbDbBbBbBbBbBbBbBbAbBbYbBbBbBbZbwbwbwbwcabwbwbsaRbhbhbhbhaRaRaRaRaRaRaRaXaRaRaRaRaRaRaLaNaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaabpbTcbbVbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbVccbQaaaaaaaaaabpbpaaaaaaaaaaaaaaaaaaaaaaaGaGaGaUbababababababaaUaLaRaRaRaRaRbhbhbkbhaRbsgIbRcdbwbwbSgJbsbsbsbsbscfbsaRbhbnbhbhaRbsgKcgbDbDchcgbDbBcicicicicicicicibhbhbhbhbBbwbwbwbwbwbwgJbsaRbhbhbCbhaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaNaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaabpbTcbbVbMcjcjcjcjcjcjbMckclgLclclckgMclckckgLckclbMcmcngNcncpbMbVcccqaaaaaaaaaaaabpcrbpaaaaaaaaaaaaaaaaaaaGaGaGaUbababababababmaUaLaRaRaRaRaRbibhbhbhaRbsbwbwbwbwbwbwbwcfbhbhbhbhbhbsaRbhbhbhbhaRbsbDbDbDcsbDbDbDbBbhbhbhbhbhbhbhbhbhbhbhbhbBbwbwbwbwbwbwbwbsaRbhbhbhbhaRaRaRaRaRaRaRaRaRaRaRaLaLaRaLaIaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaabpbTcbbVbMckckckclckckbMckctctctctcuctcuckcvcvclckbMcncncncncnbMbWcccqaaaaaaaaaabpbpbpbpbpbpaaaaaaaaaaaaaaaGaGaGaUbabmbabmbababaaUaLaRaRaRaRaRbhbhbhbhaRbsbsbsbsbsbsbsbsbsbhbhbhbhgObsaRbhcwbhbhaRbsbDbDbDbDbDbDbDbBbhbhbhbhgPbhbhgPbhbhbhbhbBbwbwbwbwbwbwbwbsaRbhbhbhbhaRaRcxaRaRaRaRaRaRaRaRaLaLaLaLaIaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabpbpbLcbbVbMgQczckckckgRbMgScuctctctctctctcAckckckgRbMgTcncBcCgUbMbVcccqbpbpaabpbpbpaaaaaabpbpbpbpaaaaaaaaaGaGaGaGaUbababababababaaUaLaRaRaRaRaRbhbhbhbhaRbscDbhgVbhbhbhgVbhbhbhbhbhbhbsaRbhbhbhbhaRbsbBbBbBbBbBbBbBbBbhbhbhgWbsgXgObsgXbhbhbhbBbBbBcEcFbBbBbBbsaRbkbhbnbhaRaRaRaRaRaRaRaRaRaRaRaRaLaLaLaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabpaabTcbbVbMcGcHckckcIckcJckctctctctcKctctcAckckckckbMcncncncncnbMbWccbQaacrbpbpaaaaaaaaaaaaaaaabpbpbpaaaaaGaGaGaGaUbfbabababababaaUaLaRaRaRaRaRbhbibhbhaRbscDbhbhbsbsbhbhbsbsbhbhbsbsbsaRbhbhbhbhaRbsbhcicicicicicibhbhbhbhbhgVbhbhgVbhbhbhbhbhcicicicicicibhbsaRbhbhbhbhaRaRaRaRaRaRaRaRaWaRaRaRaRaRaLaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabpaabTcLbVbMcyczckckckckbMckctctctctctctctcMckckckckcJcncncncncnbMbVcNbQaabpaaaaaaaaaaaaaaaaaaaaaaaabpaaaGaGaGaGaGaUbabfbacObababaaUaLaRaYaRaRaXbhbhbhbhaRbscDbCbhcDbsbhbhbsbhbhbhbhbhbsaRbhbhbhbhaRbsbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbsaRbhbhbhbhaRaRaRaXaRaRaRaRaRaRaRaRaRaRaLaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabpaabLbMbVbMckckckckckckbMckctctcPctctctctcMckckckckbMcncQcRcScnbMbVbMbQaabpaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaUbababababababaaUaLaRaRaRaRaRbhbhbhbhaRbscDbhbhcDbsbhbhbsgYbhbhbhgZbsaRbhbhbhbkaRbscVbBcWbhcVbBcWbhcVbBcWbhcVbBcWbhcVbBcWbhcVbBcWbhcVbBcWbhbsaRbhbhbhbhaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaacrbpbLcXbVbMgSckcIckclgRbMgSctctctctctctctcMckckckgRbMhacncYcngUbMbVcZbQaabpbpaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaUbababababfbabaaUaLaRaRaRaRaRbhbhbkbhaRbscDbhgPcDbsbhbhbscTbhbhbhcUbsaRbkbhbhbhaRbsbhhbbhbhbhbhhbbhbhbhbhhbbhbhbhbhhbbhbhbhbhhbbhbhbhbhhbbhbsaRbhbhbhbhaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaabpbpaabTcbbVbMckckckckckclbMckcuctdactctctctckckckckckbMcncncncncnbMbVccbQbpbpbpbpaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaUaUbabababababadbaUaLaRaRaRaRaRbhbhbhbhaRbsbsbsbsbsbscfcfbsbsdcdcbsbsbsaRbhbhbjbhaRbsbsbsbsdcdcdcbsbsbsbsbsbsbsdddebsbsbsbsbsbsbsdcdcdcbsbsbsbsaRcwbhbkbhaRaRaRaYaRaRaRaRaRaRaRaRaRaLaLaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaabpaaaadfcbbVbMckdgclckckckbMckckhcckckckhccIckckhcckckbMdhdhhddjdjbMbVcccqbpaaaabpbpbpbpaaaaaaaGaGaGaGaGaGaGaGaGaUaUbfbmbabababmbabaaUaLaRaRaRaRaRbhbhbhbhaRaRaRaRaRaRhedkaRheaRaRaRaRaRaRaRbhbhbhbhaRaRaRaRheaRaRaRheaRaRaRaRaRheaXdkheaRaRaRaRaRheaRaRaRheaRaRaRaRbhbhbhbhaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaabpaaaadfcbbVbMbMbMbMbMbMbMbMbMbMbMcJcJbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbVcccqaaaaaaaaaaaabpbpbpaGaGaGaGaGaGaGaGaGaGaUaZbabababababababfaUaLaRaRaRaRaRbhbhbibhbhbhbhbhbhbhbhdlbkbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhdmbhbhbhbhbhdlbhbhbhbkbhbhbhbhbhbhbhbhbhbhbhbjbhbhbhaRaRaRaRdnaRaRaRaRaRaRaRaRaLaLaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaabpaaaadfcbbVbVbVbVbVbVbVdobVbVbVhfbVbVhfbVbVbVbVbVbVbVbVbVbVbVbVbVbVdocccqbpaaaaaaaaaaaaaaaGaGaGaUaUaUaUaUaUaUaUaUbabababababfbaaUaUaUaLaRaRaRaRaRbhbhdpbhbhbhbhbhbhbhbhdlbhbhbhbhbhbhbhbhbhbhbhbhcwbhbhbhbhbhbhbhbhbhbhbhbibhbhbhbhdlbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhaRaRaRaRaRaRaRaXaRaRaRaRaRaLaLaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaabpaaaadfcbbVdobVbVbVbVbVbVbVbVbVbVbVdqbVbVbVbVbVbVdobVbVbVdrbVbVbVbVbVccbQbpaaaaaaaaaaaaaaaGaGaGaUaZbabmbababfbabababababababmbaaUaNaLaLaRaRaRaRaRbibhbhbhbhbhbhbhbhbhbhbhbhbhbhbibhbhbhbhbhbhbhbhbhbhbhbhbhbkbhbhbhbhbhbhbhbhbhbhbhdlbhbhbhbhbjbhbhcwbhbkbhbhbhbhbhbhbhbkbhaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaabpaaaadfcbbVbVbVbMbMbMbVbVbVbVbVbVbVbWbVbVbVbVbVbVdqbVdrbVbVbVbVbWbVbVccbQbpaaaaaaaaaaaaaGaGaGaGaUbababababababababmbababfbaaUaUaUaLaLaRaRaWaRaRaRbqbhbhbhbhbhbhbnbhbhbhbhbhbhbhdlbhbkbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhdlbhbhbhbhbhbhbhbhbhbhbhbhbhbhbnbhbhbhbhaRaRaRaRhgaRaRhgaRaRaRaRaRaLaLaGaGaaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaabpaaaadfcbbVbVbVbMdsbMbVbVbVdrbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVdtbVbVbVccbQbpbpaaaaaaaaaaaGaGaGaGaUbabfbababablbabababababaaUaUaNaNaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRhgdkaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbhbhdpbhbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsdcdcbsbsbsbsbsaLaLaNaGaGaGaGaaaaaaaaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaabpbpaadfcbdrbVbVbMdubMbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVdobVbVdrbVbVbWbVccbQbpbpbpaaaaaGaGaGaGaGaGaUbabababababababababfbabaaUaNaNaLaLaRaRaRaRaRaRaRaWaRaRaRaRaRaRbsbsbsbsbsbsbsbscfbsbsbsbsbsbsbsaRaRbsbsbsbsbsbsbsbsbsbsbsbsbsaRbjbhbhbhbsbhbhbhgVbhbhgVbibhbhbsdvhhdvdvdvbhdvbsbhbhgVbhbhbhgVbhbhbsaNaNaNaGaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabpbpdfcLbVbVbVbVbVhfbVbVbVbVbVbVbVbVbVbVbVdwbVbVbVbVbVbVbVbVbVbVbVbVcNbQbpaabpbpbpaGaGaGaGaGaGaUbmbabababfbabababaaUaUaUaUaNaNaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbsbwhibwbwhibwbsbhbshjbwbwbwbwbsaRaRbsbhdygVdybhdybhdygVdybhbsaRbhbhbhbhbsbhbDdzbDdAdBbDbDbDbhdCbhbhbhbhbhbhbhbsdDcwdEbhbjbhdFdGbhdHaNaNaNaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaabpdfbMdIdJdJdJdJdJdJdJdJdJdJdKdLdLdIdJdJdJdJdJdJdJdJdJdJdJdJdJdJdKbMbQbpaaaabpaGaGaGaGaGaGaGaUbababababababmbabaaUaNaNaNaLaLaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbsdMbwbwbwbwdNbsbhbsdxbwbwbwbwbsaRaRbsbhbhbhbhbhbhbhbhbhbhbhbsaRbkbhbhbhbsbhbDdOdPdQdRdSdTbDbhbsbhbhbhbhdGbhbhbsbBbhdEbhbhbhdFbhbhbsaNaNaNaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabpbpaadUdUdUdUdUdUdUdUdUdUdUdVdWdXdYdZdUdUdUdUdUdUdVdUdUdUdUdUdUdVdUdUbpcraaaabpbpbpaGaGaGaGaGaUbbbbaUaUaUaUbabmaUaUaNaNaLaLaRaRaRaRaXaRaRaRaRaReaaRaRaXaRaRaRbsdMbxebbwbwdNbsgObsecbwebbwbwbsaRaRbsbhdybhdybhdybhedbhdybhbsaRbhbhbhbhbsgXbDeedQbDbDdQefdzgObsdvbhbhbhbhbhbhbsdDbhdEbhbhcwdFbhbhdHaNaNaNaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabpbpaaaaaaaaaaaaaaaaaabpbpbpbpdfeheibQaaaaaaaaaaaabpbpbpbpbpbpbpbpbpbpbpbpbpaaaaaacraGaGejejejejekekejejejaUaUaUaUaNaNaNaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbsdMbwbwelbwdNbsbhbsdxbwbwbxbwbsaRaRbsgXbhbibhbhbhbhbhbhbhgObsaRbhbhbhbhbsbhbDdOdSbDbDdSdTembhbsdvdvbhbhbhhkbhdCbhbhbhdGbhbhdFbhbhbsaNaNaNaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaabpbpbpaaaaaaaaaaaabpbpaaaaaadfeneobQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpbpbpbpbpejejejepeqerekekekekejejejejaNaNaLaLaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbsdMhlbwbwhldNbsbhbshjbwbwbwbwbsaRaRbsbhbhbhbhbhbCbhbhbhbhbhcfaRbhbhbnbhbsbhbDeedRbDbDdRefbDbhbsbsbsbsbsbsbsbsbsbhesesesesbhdFbhbhdHaNaNaNaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpbpbpbpbpbpbpbpaaaaaaaadfdXetbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejekekekekekekekekekekekekejaNaNaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaXaRaRaRaRbsbsbsbwbwbsbsbscfbsbsbwbwbsbsbsaWaRbsbheubhdybhdybhevbhdybhbshmbhbhbhbhbshnbDdOdQbDbDewexbDgObsbyhobybybyhobybsbhdDhpbBdDbhgPbhbhbsaNaNaNaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfeheybQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaezekekekekekekekekekekekekejaNaNaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbsbhbhbhbhbhbhbhbhbhbhbhbhbhbhbsdkaRbsgXbhbhbhbhbhbhbhbhbhgObsaRbhdpbhbhbsbhbDeedSdQdPdRefeAbhbsbhbhbhbhbhbhbhbsbsbsbsbsbseBbsbsbsbsaNaNaNaGaGaGaGaaaaaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfeCdYbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeDeEeFeGekekekekekekekekekekekekejaNaNaLaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbsbhbheHbhbsbsbsbsbsbsbhbhbhbhbsdkaWbsbhdybhevbhdybhdybhdybhbsaRbhbhbhbhbsbhbDbDbDeIeJeKbDbDbhdCbhcwbhbhbjbhbhdCeLhqeMeNeOeOePhreLbsaNaNaNaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfdXeQbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeRekekeRekekekekekekekekekekekekejaNaNaNaLaRaRaRaRaXaRaRaRaRaRaRaNaNaRaRaRaRaRaRbsgXbhbhbhbhhshshshsbhbhbhbhgObsdkaRbsbhbhbhbhbhbhbhbhbhbhbhbsaRbhbhbhbhbsbhbhbhgPbhbhgPbhbhbhbsbhbhbhbhbhbhbhbseLeLeLeTeUeVeLeLeLbsaNaNaNaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfendYbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeDeEeEeWekekekekekekekekekekekekejaNaNaNaLaRaRaRaRaRaRaRaRaRaRaRaNaNaNaRaRaRaRaRbsbhbhbhgPdpbibhbhbhbhgPbhbhbhbsdkaRbsbhbhgPbhbhbhbhbhgPbhbhbsaRbhbhbhbhbsbsbsbsbseXeXbsbsbsbsbsbsbsbsbsbsbsbsbseLeLeYeLeLeVeLeLhtbsaNaNaNaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfdXeibQaaaaaaaaaaaaaaaaaaaaaabpbpaaaaaaaaaaaaaaaaaaaaeZekekekekekekekekekekekekejaNaNaNaLaRaRaRaRaRaRaRaRbdaRaRaRaNaNaNaRaRaRaRbsfabsfabsfabsfabsbsfabsfabsfbbsaRaXfcbsbsbseBbsbsbsbsbsbsbsbsaRbhbhcwbhfdfebhgVbBbhbhbsbhbhgVbhbhbsbhbhgVbhbhbsffeLfgeLffeLfgeLeLbsaNaNaNaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaabtbtbtbtbtbtbtbtbtbtbtbtbtbtfhdLdLfibtbtbtbtbtbtaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaafjekekekekekekekekekekekekejaNaNaLaLaRaRaRaRaRaRaRaRaRaRaRaRaRaNaNaNaRaRaRbsbsbsbsbsbsbsbsbsbsbsfcbsbsbsbsaRaRfkaRaWaRaRaRaRflaRaWaRaRaRaRbhbhbhgObshubhbhbBfmbhbsbhfnbBfmbhbsbhfobBfpbhbseLeLeLfqeLeLeLfqeLbsaNaNaNaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabTfrfsfsfsfsfsfsfsfsfsfsfsfsfsfsftftfsfsfsfsfsfsfufvbpbpbpbpbpaaaaaaaaaaaaaaaaaaaaaaejekekekekekekfwekekekekekejaNaLaLaPaRaRaRaRaRaRaRaRaRaRaRaRaRaRaNaNaNaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaReaaWfxfcbsbsbsbsbseBbsbsbsbsbsbsaRbjbhbhfycfbhbhbhbBbhbhbsbhbhegbhbCbsbjbhbhbhbhbsdcdcdcbsdCbseLfzeLbsaNaNaNaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabTfAftftftftftftftftftftftftftftftftftftftftftftfBfvbpbpbpbpaaaaaaaaaaaaaaaaaaaaaaaafCekekekekekekekekekekekekejaNaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaNaNaRaRaRaRaRaRbsbsbsbsbsbsbsbsbsbsbsbsfcdkbsfDbhbhbhbhgVbhbhbhbhbhbsaRbhfEbhbhcfbhbhbhbBfmgObsbhfnbBfmbjbsbhfobBfpbhbsbhbhbhbhbhdceLeLhtbsaNaNaNaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabTfAftftftftftftftftftftftftftftftftftftftftfFfFfGfHfIfIbpbpbpaaaaaaaaaaaaaaaaaaaaaaeZekekekekekekfJekekekekekejaNaLaRaRaRaRaRaRaRaRaRaRaPaRaNaNaNaNaNaNaNaRaRaRaRaRaRbsfKbhbhbhbhgVbhbhbhbhbhbsdkeBbhbhbhbhdpcwbhbhbhbhbhddaRbhbjbhgObshubjbhbBbhbhbsgXbhbBbhgObsgXcwfLbhgObsbsbsbsbhbhdceLfMeLbsaNaNaNaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabTfAftftftftftftftftftftftftftftftftftftftftfNftfNfIfIfIbpbpaaaaaaaaaaaaaaaaaaaaaaaafjekekekekekekekekekekekekejaNaLaRaRaRaRaRaRaNaNaNaNaNaNaNaNaNaNaNaNaNaRaRaRaRaRaRbsbhbhbhbhbjbhfObhbjdGbhbsflbsbhbhdGbhbhbhbhbhbhcwbhbshmbhfPbhbhbsfebhbhbBbhbhbsbhfnbBfmbhbsbhfobBfpbhbshvbhbshnbhdceLeLeLbsaNaNaNaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabTfAftftfSftftftftftftftftftftftftftftftftftfsfsfTfHfIbpbpaaaaaaaaaaaaaaaaaaaaaaaaaaejekekekekekekekekekekekekejaLaLaRaRaRaRaLaLaLaLaLaLaLaLaLaLaLaLaLfUaLaLaRaRaRaRaRbsbhbhbhbhbhfPfVdpbhfWbhcfaRbsgXbhbhbhbhbhfRbhbhbhgObsdnbhbhbhbheBfXbhbhbBfmgObsbhbhbhbhbhbsbhbhbhbhbhbsfYbhcfbhbhdceLfZeLbsaNaNaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabTfAftftftftftftftftftftftftftftftftftftftftftftfBfvbpbpaaaaaaaaaaaaaaaaaaaaaaaaaaaafCekekekekekekekekekekekekejaLaPaRaRaLaLaLaLaRaRaRaRaRaRaRaRdnaRaRaRaLaLaLaRaRaRaRbsgXdpbhbhbhbhbhbhgabhgOeBhmbsbhbhbhbhbhbhdpbhbhdGbheBaRbhbhbhbhbsfebhbhbBbhbhbsbsbscfbseBbsbsbscfbsbsbsbseBbsbhbhdceLeLhtbsaNaNaNaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabTfAftftftftftftftftftftftftftftftftftftftftftftfBbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZekekekekekekekekekekekekejaLaLaLaLaLaLaRaRaRaRaRaRaRaRaRaRaRaRaReaaRaLaLaLaRaRaRbsbhbhbjbhbnbhbhdpbhbhbhbsaWbsbhbhcwbhbhbhbibhbhbhbhbsaRaRaRaRaRbsgXbhcwbBbBbhbsbhbhbjbhbhcwbhbhbhbhbhbhbhbhbhbjbhbseLfMeLbsaNaNaNaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabTfAftftftftftftftftftftftftftftftftftftftftftftfBbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafjekekekekekekekekekekekekejaGaNaNaLaLaRaRaRaRaRaLaLaLfUaRaRaRaRaRaRaRaRaRaLaLaRaRbsbhbhbhbhbhbhbhbhdGbhbhbsaRbsbhbhbhgPbhbhgPbhbhbhbhfcaRaXaRaRaRbsbhbhgPbhbhcwcfbhbhgPbhdGbhbhbhgPbhbhfPcwbhgPbhbhbseLeLeLbsaNaNaNaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabTfAftftftftftftftftftftftftgdftftftftftftftftftfBbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejgeeEeWeRgfggezgeeEghejejejaGaNaNaLaRaRaRaRaRaRaLaLaLaLaLaLaLaRaRaReaaRaRaRaLaLaLbsbsbsbsbsfcaRbsbsbsbsbsbsaRbsbsbsbseBdcdcbsbsbsbsbsbsaRaRaRaRaRbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsaNaNaNaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaabTfAftftftftftftftftftftftftftftftftftftftftftftfBbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZekeZaaaaaaaaaaaGaGaGaGaNaLaLaRaRaRaRaRaRaRaRaRaRaLaLaLaLaLaLaRaRaRaRaRfUaLaLaRaRaRaRaRaRfcbsbsaRaRaRaRaRaRaRaRheaRaRheaRaRaRaRaRaRaRaRaRaRaLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaaaacacacacaaaaabacacabaaacacacaaaaacacaaaaaaaaaGaGaGaGaGaGaIaIaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaNaNaNaNaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaaaacacacaaaaabacacabaaacaaacaaaaaaacacacaGaGaGaIaIaIaIaTaTaUaVaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaLaLaLaLaIaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaacacacacacacacaaaaaaaaaaaaaaaaaaaGaGaGaGaIaUaUaUaUaUaUaUaRaRaRaRaRaRaRaRaRaWaRaRaRaRaRaRaRaRaRaRaRaRaRaRaXaRaRaWaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaYaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaLaRaRaRaIaNaGaGaaaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaGaGaGaIaUaZbababababbaRaRaRaRaRaXaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaXaRaRaRaRaRaRaRaRaRaRaRaRaRaRaWaRaRaRaRaRaRaRaRaRaRaRaXaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaNaNaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacaaaaaaaaaaaaaaaaaaaaaaaGaIaIaUbabababababbaRaRaRaRaRaRaRbcaRaRaRaRaRaRaRaRaRaRaRbdaRaRaRaRaRaRaRaRaRaRaRaRaXaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaLaNaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaGaIbeaUbabababaaUaUaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaWaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbdaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaNaNaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaGaIaIbebabfbababaaUaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbgaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaNaNaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaGaIaUaUbababababaaUaLaRaRaRaRaRbhbhbhbhbhbhbhbhbhbhbibhbhbhbhbhbhbhbhbhbhbhbjbhbhbhbhbhbhbhbhbhbhbhbhbhbibhbhbhbhbhbhbhbhbhbhbhbhbkbkbhbhbhbhbhbhbhbhbhbhaRbdaRaRaRaRaRaRaRaRaRaRaRaLaNaNaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaGaGaIaUbfbabablbabmaUaLaRaRaRaRaRbjbhbhbhbhbhbhbhbhbhbibkbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbkbhbhbhbhbhbhbhbhbhbhbhbhbhbhbnbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhaRaRaWaRaRaRaRaRaRaRaRaRaLaLaNaNaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaIaUbabababababaaUaLaRaRaXaRaRbhbhbhbnbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbkbhaRaRaRaRaRaRaXaRaRaRaRaRaLaLaLaNaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaIaIaUbababobababfaUaLaRaRaRaRaRbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbkbhbhbhbhbhbhbibhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaabpbpbpbpbpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaIaUaUbabababfbabaaUaLaRaRaRaRaRbhbhbhbhaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbqbhbhbhaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbhbhbhbhaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaabpbpbpaaaaaaaabpbpbpbpbpbpbpbpbpbpaabpaabpbpbpbpaaaaaabpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaIaUbrbabababababaaUaLaRaRaRaRaRbkbhbhbhaRbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsaRbhbhbhbhaRbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsaRbhbhbhbhaRaRaRaRaRaRaRaRaRaRaRaRaRaLaLaGaGaGaGaGaaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaabpbtbububububububtbtbtbtbtbububtbtbtbubtbtbtbtbubububububtbtbtbtbtaabpaabpbpaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaIaUbababababababaaUaLaRaRaRaRaRbhbhbhbhaRbsbvbwbwbxbwbwbwbsbybzeSbzbBbsaRbhbhbCbhaRbsbDbDbDfQbDbDbDgEbBbBbEcebFbGbBgFbhbhbhbhgGbwbwbHgHbJbwbKbsaRbhbhbhbhaRaRaRaRaRaRaRaRaRaRaRaRaRaLaNaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaabpbLbMbNbObObObObObObObObObObObObObObObObObObObObObObObObObObObObPbMbQaaaaaabpbpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaIaUbabababfbababaaUaLaRaRaRaRaRbhbhbhbhaRbsgIbRbwbwbwbSgJbsbhbhbhbhbhbsaRbhbhbhbhaRbsbDbDbDbDbDbDbDbhbhbhbhbhbhbhbhbhbhbhbhbhbhbwbwbwbwbwbwbwbsaRbhbhbhbhaRaXaRaRaRaRaRaRaRaRaRaRaRaLaLaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaabpbTbUbVbVbVbVbVbVbVbVbVbWbVbVbVbVbVbVbVbVbVbVbWbVbVbVbVbVbVbVbVbVbXbQaaaaaaaabpbpaaaaaaaaaaaaaaaaaaaaaaaaaGaGaIaUbfbababababfbaaUaLaRaWaRaRbdbhbhbhbhaRbsbwbwbwbwbwbwbwbsbhbhbhbhbhbsaRbhbkbhbhaRbsbDbDbDbDbDbDbDbBbBbBbBbBbBbBbAbBbYbBbBbBbZbwbwbwbwcabwbwbsaRbhbhbhbhaRaRaRaRaRaRaRaXaRaRaRaRaRaRaLaNaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaabpbTcbbVbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbVccbQaaaaaaaaaabpbpaaaaaaaaaaaaaaaaaaaaaaaGaGaIaUbababababababaaUaLaRaRaRaRaRbhbhbkbhaRbsgIbRcdbwbwbSgJbsbsbsbsbscfbsaRbhbnbhbhaRbsgKcgbDbDchcgbDbBcicicicicicicicibhbhbhbhbBbwbwbwbwbwbwgJbsaRbhbhbCbhaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaNaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaabpbTcbbVbMcjcjcjcjcjcjbMckclgLclclckgMclckckgLckclbMcmcngNcncpbMbVcccqaaaaaaaaaaaabpcrbpaaaaaaaaaaaaaaaaaaaGaGaIaUbababababababmaUaLaRaRaRaRaRbibhbhbhaRbsbwbwbwbwbwbwbwcfbhbhbhbhbhbsaRbhbhbhbhaRbsbDbDbDcsbDbDbDbBbhbhbhbhbhbhbhbhbhbhbhbhbBbwbwbwbwbwbwbwbsaRbhbhbhbhaRaRaRaRaRaRaRaRaRaRaRaLaLaRaLaIaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaabpbTcbbVbMckckckclckckbMckctctctctcuctcuckcvcvclckbMcncncncncnbMbWcccqaaaaaaaaaabpbpbpbpbpbpaaaaaaaaaaaaaaaGaGaIaUbabmbabmbababaaUaLaRaRaRaRaRbhbhbhbhaRbsbsbsbsbsbsbsbsbsbhbhbhbhgObsaRbhcwbhbhaRbsbDbDbDbDbDbDbDbBbhbhbhbhgPbhbhgPbhbhbhbhbBbwbwbwbwbwbwbwbsaRbhbhbhbhaRaRcxaRaRaRaRaRaRaRaRaLaLaLaLaIaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaabpbpbLcbbVbMgQczckckckgRbMgScuctctctctctctcAckckckgRbMgTcncBcCgUbMbVcccqbpbpaabpbpbpaaaaaabpbpbpbpaaaaaaaaaGaGaGaIaUbababababababaaUaLaRaRaRaRaRbhbhbhbhaRbscDbhgVbhbhbhgVbhbhbhbhbhbhbsaRbhbhbhbhaRbsbBbBbBbBbBbBbBbBbhbhbhgWbsgXgObsgXbhbhbhbBbBbBcEcFbBbBbBbsaRbkbhbnbhaRaRaRaRaRaRaRaRaRaRaRaRaLaLaLaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaabpaabTcbbVbMcGcHckckcIckcJckctctctctcKctctcAckckckckbMcncncncncnbMbWccbQaacrbpbpaaaaaaaaaaaaaaaabpbpbpaaaaaGaGaGaIaUbfbabababababaaUaLaRaRaRaRaRbhbibhbhaRbscDbhbhbsbsbhbhbsbsbhbhbsbsbsaRbhbhbhbhaRbsbhcicicicicicibhbhbhbhbhgVbhbhgVbhbhbhbhbhcicicicicicibhbsaRbhbhbhbhaRaRaRaRaRaRaRaRaWaRaRaRaRaRaLaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaabpaabTcLbVbMcyczckckckckbMckctctctctctctctcMckckckckcJcncncncncnbMbVcNbQaabpaaaaaaaaaaaaaaaaaaaaaaaabpaaaGaGaGaGaIaUbabfbacObababaaUaLaRaYaRaRaXbhbhbhbhaRbscDbCbhcDbsbhbhbsbhbhbhbhbhbsaRbhbhbhbhaRbsbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbsaRbhbhbhbhaRaRaRaXaRaRaRaRaRaRaRaRaRaRaLaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaabpaabLbMbVbMckckckckckckbMckctctcPctctctctcMckckckckbMcncQcRcScnbMbVbMbQaabpaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaIaUbababababababaaUaLaRaRaRaRaRbhbhbhbhaRbscDbhbhcDbsbhbhbsgYbhbhbhgZbsaRbhbhbhbkaRbscVbBcWbhcVbBcWbhcVbBcWbhcVbBcWbhcVbBcWbhcVbBcWbhcVbBcWbhbsaRbhbhbhbhaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaacrbpbLcXbVbMgSckcIckclgRbMgSctctctctctctctcMckckckgRbMhacncYcngUbMbVcZbQaabpbpaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaIaIaUbababababfbabaaUaLaRaRaRaRaRbhbhbkbhaRbscDbhgPcDbsbhbhbscTbhbhbhcUbsaRbkbhbhbhaRbsbhhbbhbhbhbhhbbhbhbhbhhbbhbhbhbhhbbhbhbhbhhbbhbhbhbhhbbhbsaRbhbhbhbhaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaabpbpaabTcbbVbMckckckckckclbMckcuctdactctctctckckckckckbMcncncncncnbMbVccbQbpbpbpbpaaaaaaaaaaaaaaaaaGaGaGaGaGaGaIaIaUaUbabababababadbaUaLaRaRaRaRaRbhbhbhbhaRbsbsbsbsbsbscfcfbsbsdcdcbsbsbsaRbhbhbjbhaRbsbsbsbsdcdcdcbsbsbsbsbsbsbsdddebsbsbsbsbsbsbsdcdcdcbsbsbsbsaRcwbhbkbhaRaRaRaYaRaRaRaRaRaRaRaRaRaLaLaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaabpaaaadfcbbVbMckdgclckckckbMckckhcckckckhccIckckhcckckbMdhdhhddjdjbMbVcccqbpaaaabpbpbpbpaaaaaaaGaGaGaGaGaGaGaGaIaUaUbfbmbabababmbabaaUaLaRaRaRaRaRbhbhbhbhaRaRaRaRaRaRhedkaRheaRaRaRaRaRaRaRbhbhbhbhaRaRaRaRheaRaRaRheaRaRaRaRaRheaXdkheaRaRaRaRaRheaRaRaRheaRaRaRaRbhbhbhbhaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaabpaaaadfcbbVbMbMbMbMbMbMbMbMbMbMbMcJcJbMbMbMbMbMbMbMbMbMbMbMbMbMbMbMbVcccqaaaaaaaaaaaabpbpbpaGaIaIaIaIaIaIaIaIaIaUaZbabababababababfaUaLaRaRaRaRaRbhbhbibhbhbhbhbhbhbhbhdlbkbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhdmbhbhbhbhbhdlbhbhbhbkbhbhbhbhbhbhbhbhbhbhbhbjbhbhbhaRaRaRaRdnaRaRaRaRaRaRaRaRaLaLaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaabpaaaadfcbbVbVbVbVbVbVbVdobVbVbVhfbVbVhfbVbVbVbVbVbVbVbVbVbVbVbVbVbVdocccqbpaaaaaaaaaaaaaaaGaGaIaUaUaUaUaUaUaUaUaUbabababababfbaaUaUaUaLaRaRaRaRaRbhbhdpbhbhbhbhbhbhbhbhdlbhbhbhbhbhbhbhbhbhbhbhbhcwbhbhbhbhbhbhbhbhbhbhbhbibhbhbhbhdlbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhaRaRaRaRaRaRaRaXaRaRaRaRaRaLaLaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaabpaaaadfcbbVdobVbVbVbVbVbVbVbVbVbVbVdqbVbVbVbVbVbVdobVbVbVdrbVbVbVbVbVccbQbpaaaaaaaaaaaaaaaGaGaIaUaZbabmbababfbabababababababmbaaUaNaLaLaRaRaRaRaRbibhbhbhbhbhbhbhbhbhbhbhbhbhbhbibhbhbhbhbhbhbhbhbhbhbhbhbhbkbhbhbhbhbhbhbhbhbhbhbhdlbhbhbhbhbjbhbhcwbhbkbhbhbhbhbhbhbhbkbhaRaRaRaRaRaRaRaRaRaRaRaRaRaRaLaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaabpaaaadfcbbVbVbVbMbMbMbVbVbVbVbVbVbVbWbVbVbVbVbVbVdqbVdrbVbVbVbVbWbVbVccbQbpaaaaaaaaaaaaaGaGaGaIaUbababababababababmbababfbaaUaUaUaLaLaRaRaWaRaRaRbqbhbhbhbhbhbhbnbhbhbhbhbhbhbhdlbhbkbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhbhdlbhbhbhbhbhbhbhbhbhbhbhbhbhbhbnbhbhbhbhaRaRaRaRhgaRaRhgaRaRaRaRaRaLaLaGaGaaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaabpaaaadfcbbVbVbVbMdsbMbVbVbVdrbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVdtbVbVbVccbQbpbpaaaaaaaaaaaGaGaGaIaUbabfbababablbabababababaaUaUaNaNaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRhgdkaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbhbhdpbhbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsdcdcbsbsbsbsbsaLaLaNaGaGaGaGaaaaaaaaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaabpbpaadfcbdrbVbVbMdubMbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVbVdobVbVdrbVbVbWbVccbQbpbpbpaaaaaGaGaGaGaGaIaUbabababababababababfbabaaUaNaNaLaLaRaRaRaRaRaRaRaWaRaRaRaRaRaRbsbsbsbsbsbsbsbscfbsbsbsbsbsbsbsaRaRbsbsbsbsbsbsbsbsbsbsbsbsbsaRbjbhbhbhbsbhbhbhgVbhbhgVbibhbhbsdvhhdvdvdvbhdvbsbhbhgVbhbhbhgVbhbhbsaLaNaNaGaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaabpbpdfcLbVbVbVbVbVhfbVbVbVbVbVbVbVbVbVbVbVdwbVbVbVbVbVbVbVbVbVbVbVbVcNbQbpaabpbpbpaGaGaGaGaGaIaUbmbabababfbabababaaUaUaUaUaNaNaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbsbwhibwbwhibwbsbhbshjbwbwbwbwbsaRaRbsbhdygVdybhdybhdygVdybhbsaRbhbhbhbhbsbhbDdzbDdAdBbDbDbDbhdCbhbhbhbhbhbhbhbsdDcwdEbhbjbhdFdGbhdHaLaNaNaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaabpdfbMdIdJdJdJdJdJdJdJdJdJdJdKdLdLdIdJdJdJdJdJdJdJdJdJdJdJdJdJdJdKbMbQbpaaaabpaGaGaGaGaGaGaIaUbababababababmbabaaUaNaNaNaLaLaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbsdMbwbwbwbwdNbsbhbsdxbwbwbwbwbsaRaRbsbhbhbhbhbhbhbhbhbhbhbhbsaRbkbhbhbhbsbhbDdOdPdQdRdSdTbDbhbsbhbhbhbhdGbhbhbsbBbhdEbhbhbhdFbhbhbsaLaNaNaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaabpbpaadUdUdUdUdUdUdUdUdUdUdUdVdWdXdYdZdUdUdUdUdUdUdVdUdUdUdUdUdUdVdUdUbpcraaaabpbpbpaGaIaIaIaIaUbbbbaUaUaUaUbabmaUaUaNaNaLaLaRaRaRaRaXaRaRaRaRaReaaRaRaXaRaRaRbsdMbxebbwbwdNbsgObsecbwebbwbwbsaRaRbsbhdybhdybhdybhedbhdybhbsaRbhbhbhbhbsgXbDeedQbDbDdQefdzgObsdvbhbhbhbhbhbhbsdDbhdEbhbhcwdFbhbhdHaLaNaNaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaabpbpaaaaaaaaaaaaaaaaaabpbpbpbpdfeheibQaaaaaaaaaaaabpbpbpbpbpbpbpbpbpbpbpbpbpaaaaaacraIaIejejejejekekejejejaUaUaUaUaNaNaNaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbsdMbwbwelbwdNbsbhbsdxbwbwbxbwbsaRaRbsgXbhbibhbhbhbhbhbhbhgObsaRbhbhbhbhbsbhbDdOdSbDbDdSdTembhbsdvdvbhbhbhhkbhdCbhbhbhdGbhbhdFbhbhbsaLaNaNaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaabpbpbpaaaaaaaaaaaabpbpaaaaaadfeneobQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpbpbpbpbpejejejepeqerekekekekejejejejaNaNaLaLaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbsdMhlbwbwhldNbsbhbshjbwbwbwbwbsaRaRbsbhbhbhbhbhbCbhbhbhbhbhcfaRbhbhbnbhbsbhbDeedRbDbDdRefbDbhbsbsbsbsbsbsbsbsbsbhesesesesbhdFbhbhdHaLaNaNaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpbpbpbpbpbpbpbpaaaaaaaadfdXetbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejekekekekekekekekekekekekejaNaNaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaXaRaRaRaRbsbsbsbwbwbsbsbscfbsbsbwbwbsbsbsaWaRbsbheubhdybhdybhevbhdybhbshmbhbhbhbhbshnbDdOdQbDbDewexbDgObsbyhobybybyhobybsbhdDhpbBdDbhgPbhbhbsaLaNaNaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfeheybQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaezekekekekekekekekekekekekejaNaNaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbsbhbhbhbhbhbhbhbhbhbhbhbhbhbhbsdkaRbsgXbhbhbhbhbhbhbhbhbhgObsaRbhdpbhbhbsbhbDeedSdQdPdRefeAbhbsbhbhbhbhbhbhbhbsbsbsbsbsbseBbsbsbsbsaLaNaNaGaGaGaGaaaaaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfeCdYbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeDeEeFeGekekekekekekekekekekekekejaNaNaLaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRbsbhbheHbhbsbsbsbsbsbsbhbhbhbhbsdkaWbsbhdybhevbhdybhdybhdybhbsaRbhbhbhbhbsbhbDbDbDeIeJeKbDbDbhdCbhcwbhbhbjbhbhdCeLhqeMeNeOeOePhreLbsaLaNaNaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfdXeQbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeRekekeRekekekekekekekekekekekekejaNaNaNaLaRaRaRaRaXaRaRaRaRaRaRaNaNaRaRaRaRaRaRbsgXbhbhbhbhhshshshsbhbhbhbhgObsdkaRbsbhbhbhbhbhbhbhbhbhbhbhbsaRbhbhbhbhbsbhbhbhgPbhbhgPbhbhbhbsbhbhbhbhbhbhbhbseLeLeLeTeUeVeLeLeLbsaLaNaNaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfendYbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeDeEeEeWekekekekekekekekekekekekejaNaNaNaLaRaRaRaRaRaRaRaRaRaRaRaNaNaNaRaRaRaRaRbsbhbhbhgPdpbibhbhbhbhgPbhbhbhbsdkaRbsbhbhgPbhbhbhbhbhgPbhbhbsaRbhbhbhbhbsbsbsbsbseXeXbsbsbsbsbsbsbsbsbsbsbsbsbseLeLeYeLeLeVeLeLhtbsaLaNaNaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfdXeibQaaaaaaaaaaaaaaaaaaaaaabpbpaaaaaaaaaaaaaaaaaaaaeZekekekekekekekekekekekekejaNaNaNaLaRaRaRaRaRaRaRaRbdaRaRaRaNaNaNaRaRaRaRbsfabsfabsfabsfabsbsfabsfabsfbbsaRaXfcbsbsbseBbsbsbsbsbsbsbsbsaRbhbhcwbhfdfebhgVbBbhbhbsbhbhgVbhbhbsbhbhgVbhbhbsffeLfgeLffeLfgeLeLbsaLaNaNaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaabtbtbtbtbtbtbtbtbtbtbtbtbtbtfhdLdLfibtbtbtbtbtbtaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaafjekekekekekekekekekekekekejaNaNaLaLaRaRaRaRaRaRaRaRaRaRaRaRaRaNaNaNaRaRaRbsbsbsbsbsbsbsbsbsbsbsfcbsbsbsbsaRaRfkaRaWaRaRaRaRflaRaWaRaRaRaRbhbhbhgObshubhbhbBfmbhbsbhfnbBfmbhbsbhfobBfpbhbseLeLeLfqeLeLeLfqeLbsaLaNaNaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaabTfrfsfsfsfsfsfsfsfsfsfsfsfsfsfsftftfsfsfsfsfsfsfufvbpbpbpbpbpaaaaaaaaaaaaaaaaaaaaaaejekekekekekekfwekekekekekejaNaLaLaPaRaRaRaRaRaRaRaRaRaRaRaRaRaRaNaNaNaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaReaaWfxfcbsbsbsbsbseBbsbsbsbsbsbsaRbjbhbhfycfbhbhbhbBbhbhbsbhbhegbhbCbsbjbhbhbhbhbsdcdcdcbsdCbseLfzeLbsaLaNaNaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaabTfAftftftftftftftftftftftftftftftftftftftftftftfBfvbpbpbpbpaaaaaaaaaaaaaaaaaaaaaaaafCekekekekekekekekekekekekejaNaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaRaNaNaRaRaRaRaRaRbsbsbsbsbsbsbsbsbsbsbsbsfcdkbsfDbhbhbhbhgVbhbhbhbhbhbsaRbhfEbhbhcfbhbhbhbBfmgObsbhfnbBfmbjbsbhfobBfpbhbsbhbhbhbhbhdceLeLhtbsaLaNaNaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaabTfAftftftftftftftftftftftftftftftftftftftftfFfFfGfHfIfIbpbpbpaaaaaaaaaaaaaaaaaaaaaaeZekekekekekekfJekekekekekejaNaLaRaRaRaRaRaRaRaRaRaRaPaRaNaNaNaNaNaNaNaRaRaRaRaRaRbsfKbhbhbhbhgVbhbhbhbhbhbsdkeBbhbhbhbhdpcwbhbhbhbhbhddaRbhbjbhgObshubjbhbBbhbhbsgXbhbBbhgObsgXcwfLbhgObsbsbsbsbhbhdceLfMeLbsaLaNaNaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaabTfAftftftftftftftftftftftftftftftftftftftftfNftfNfIfIfIbpbpaaaaaaaaaaaaaaaaaaaaaaaafjekekekekekekekekekekekekejaNaLaRaRaRaRaRaRaNaNaNaNaNaNaNaNaNaNaNaNaNaRaRaRaRaRaRbsbhbhbhbhbjbhfObhbjdGbhbsflbsbhbhdGbhbhbhbhbhbhcwbhbshmbhfPbhbhbsfebhbhbBbhbhbsbhfnbBfmbhbsbhfobBfpbhbshvbhbshnbhdceLeLeLbsaLaNaNaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaabTfAftftfSftftftftftftftftftftftftftftftftftfsfsfTfHfIbpbpaaaaaaaaaaaaaaaaaaaaaaaaaaejekekekekekekekekekekekekejaLaLaRaRaRaRaLaLaLaLaLaLaLaLaLaLaLaLaLfUaLaLaRaRaRaRaRbsbhbhbhbhbhfPfVdpbhfWbhcfaRbsgXbhbhbhbhbhfRbhbhbhgObsdnbhbhbhbheBfXbhbhbBfmgObsbhbhbhbhbhbsbhbhbhbhbhbsfYbhcfbhbhdceLfZeLbsaLaNaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaabTfAftftftftftftftftftftftftftftftftftftftftftftfBfvbpbpaaaaaaaaaaaaaaaaaaaaaaaaaaaafCekekekekekekekekekekekekejaLaPaRaRaLaLaLaLaRaRaRaRaRaRaRaRdnaRaRaRaLaLaLaRaRaRaRbsgXdpbhbhbhbhbhbhgabhgOeBhmbsbhbhbhbhbhbhdpbhbhdGbheBaRbhbhbhbhbsfebhbhbBbhbhbsbsbscfbseBbsbsbscfbsbsbsbseBbsbhbhdceLeLhtbsaLaNaNaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaabTfAftftftftftftftftftftftftftftftftftftftftftftfBbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZekekekekekekekekekekekekejaLaLaLaLaLaLaRaRaRaRaRaRaRaRaRaRaRaRaReaaRaLaLaLaRaRaRbsbhbhbjbhbnbhbhdpbhbhbhbsaWbsbhbhcwbhbhbhbibhbhbhbhbsaRaRaRaRaRbsgXbhcwbBbBbhbsbhbhbjbhbhcwbhbhbhbhbhbhbhbhbhbjbhbseLfMeLbsaLaNaNaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaabTfAftftftftftftftftftftftftftftftftftftftftftftfBbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafjekekekekekekekekekekekekejaGaNaNaLaLaRaRaRaRaRaLaLaLfUaRaRaRaRaRaRaRaRaRaLaLaRaRbsbhbhbhbhbhbhbhbhdGbhbhbsaRbsbhbhbhgPbhbhgPbhbhbhbhfcaRaXaRaRaRbsbhbhgPbhbhcwcfbhbhgPbhdGbhbhbhgPbhbhfPcwbhgPbhbhbseLeLeLbsaLaNaNaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaabTfAftftftftftftftftftftftftgdftftftftftftftftftfBbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaejgeeEeWeRgfggezgeeEghejejejaGaNaNaLaRaRaRaRaRaRaLaLaLaLaLaLaLaRaRaReaaRaRaRaLaLaLbsbsbsbsbsfcaRbsbsbsbsbsbsaRbsbsbsbseBdcdcbsbsbsbsbsbsaRaRaRaRaRbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsaLaNaNaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaabTfAftftftftftftftftftftftftftftftftftftftftftftfBbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZekeZaaaaaaaaaaaGaGaGaGaNaLaLaRaRaRaRaRaRaRaRaRaRaLaLaLaLaLaLaRaRaRaRaRfUaLaLaRaRaRaRaRaRfcbsbsaRaRaRaRaRaRaRaRheaRaRheaRaRaRaRaRaRaRaRaRaRaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaLaNaNaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaabTfAftftftftftftftfSftftftftftftftftftftftftftftfBbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZekeZaaaaaaaaaGaGaGaGaGaNaLaRaRaRaRaRaRaRaRaRaRaRaRaRaRfUaLaLaLaRaRaReaaRaRaLaRaReaaRaLaLaLaLaLaLaLaLaRaRaLaLaLaLaLaRaRaLaLaRaRaLaRaRaRaRaLaLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaGaGaGaGaGaGaGaGaaaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaabTgigjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgjgkbQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagleRglaaaaaaaaaGaGaGaGaNaNaLaLaLaLaLaLaRaRaRaRaRaRaRaRaRaRaLaLaLaLaLaRaRaRaRgmaRaWaRaRfUaNaNaNaNaNaNaLaLaLaLaNaNaNaLaLaLaLaLaLaLaLaRaLaLaLaLaLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaGaGaGaGaGaGaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaadUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagngogpgqgrgogsaaaaaaaGaGaGaNaNaNaLaLaLaLaLaLfUaLaLaRaRaRaRaRaRaRaRaLaLaLaLaRaRaWeaaRaRaRaRaLaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaNaNaNaNaLaLaLaGaGaGaNaNaNaNaNaNaNaNaNaNaNaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaadUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUdUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagbgogpgqgrgogcaaaaaaaGaGaGaNaNaNaLaLaLaLaLaLfUaLaLaRaRaRaRaRaRaRaRaLaLaLaLaRaRaWeaaRaRaRaRaLaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaNaNaNaNaLaLaLaGaGaGaNaNaNaNaNaNaNaNaNaNaNaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagtgugugvgugugtaaaaaaaGaGaGaNaNaLaLaRaRaRaRaLaLaNaLaLaRaRaRaRaRaRaRaRaLaNaLaLaRaRaReaaRgmaLaLaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaaaGaGaGaaaaaaaaaGaGaGaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagtgugugvgugugtaaaaaaaaaGaGaGaLaLaRaRaRaRaRaRaLaLaNaLaLaLaRaRaRaRaRaRaLaLaLaLaLaRaWaRaRaLaGaaaaaaaaaGaGaGaGaGaaaGaaaaaaaGaGaGaGaaaGaGaGaGaGaGaGaaaaaaaGaGaGaGaGaGaGaGaGaGaGaGaaaaaaaGaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagtgugugvgugugtaaaaaaaaaGaGaGaLaRaRaRaRaRaRaRaRaLaLaLaNaLaLaRaRaRaRaRaRaRaRaLaLaLgmaRaRaLaGaaaaaaaaaaaGaGaGaaaaaaaaaaaaaaaGaGaaaaaaaGaGaGaaaaaaaaaaaaaGaGaGaGaGaaaaaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaaaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwgxgvgvgvgygzaaaaaaaGaGaGaLaLaRaRaRaRaRaRaRaRaRaRaLaLaLaLaLaRaRaRaRaRaRaRaRaRaLaLaRaRaLaGaaaaaaaaaaaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagngxgvgvgvgygsaaaaaaaGaGaGaLaLaRaRaRaRaRaRaRaRaRaRaLaLaLaLaLaRaRaRaRaRaRaRaRaRaLaLaRaRaLaGaaaaaaaaaaaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagtgvgvgvgtaaaaaaaaaGaGaGaLaRaRaRaRaRaRaRaRaRaRaRaLfUaRaRaLaLaLaLaLaLfUaLaRaRaLaLaLaLaLaGaaaaaaaaaaaaaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagtgvgugvgtaaaaaaaaaGaGaGaLaRaRaRaRaRaRaRgAgAaRaRaRaLaRaRaRaLaLaLaLaLaLaLaLaRaRaLaNaNaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagtgBgBgBgtaaaaaaaaaGaGaGaLaRaLaLaRaRaRaRgAgAaRaRaRaRaRaRaRaRaRaRaRaRaRaLaLaRaRfUaLaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwgogCgogzaaaaaaaaaGaGaGaLaLaLaRaRaRaRaRgAgAaRaRaRaRaRgDaRaRaRaRaRaRaRaRaRaRaRaRaLaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagngogCgogsaaaaaaaaaGaGaGaLaLaLaRaRaRaRaRgAgAaRaRaRaRaRgDaRaRaRaRaRaRaRaRaRaRaRaRaLaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaNaNaNaLaLaLaLaLaLaLaLaLaLfUaLaLaLaRaRaRaRaRaRaRaRaRaRaRaRaLaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaNaNaNaNaNaGaGaGaGaGaLaLaLaLaLfUaLaLaLaLaLaLaLaLaNaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 6a8fb071c95..c4b556ae056 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -10,108 +10,108 @@
"aaj" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 2},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
"aak" = (/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "syndieshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/shuttle/window{tag = "icon-window5_end (NORTH)"; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
"aal" = (/turf/simulated/wall/r_wall,/area/security/permabrig)
-"aam" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/security/permabrig)
+"aam" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/wall/r_wall,/area/security/permabrig)
"aan" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/security/permabrig)
"aao" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/security/permabrig)
-"aap" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/security/permabrig)
+"aap" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/permabrig)
"aaq" = (/obj/structure/stool/bed,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aar" = (/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aas" = (/obj/machinery/camera{c_tag = "Prison Bedroom"; dir = 2; network = list("Prison","SS13")},/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plasteel,/area/security/permabrig)
+"aar" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aas" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/appleseed,/obj/item/seeds/appleseed,/obj/item/seeds/appleseed,/turf/simulated/floor/grass,/area/security/permabrig)
"aat" = (/turf/simulated/wall,/area/security/permabrig)
-"aau" = (/obj/item/clothing/suit/ianshirt,/obj/machinery/computer/arcade,/turf/simulated/floor/plasteel,/area/security/permabrig)
+"aau" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/orangeseed,/obj/item/seeds/orangeseed,/obj/item/seeds/orangeseed,/turf/simulated/floor/grass,/area/security/permabrig)
"aav" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aaw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aax" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aaw" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/cornseed,/obj/item/seeds/cornseed,/obj/item/seeds/cornseed,/turf/simulated/floor/grass,/area/security/permabrig)
+"aax" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aay" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aaz" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/security/permabrig)
-"aaA" = (/obj/machinery/light/small{dir = 1},/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/security/permabrig)
-"aaB" = (/obj/structure/table,/obj/structure/bedsheetbin,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/security/permabrig)
-"aaC" = (/obj/structure/stool/bed,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/security/permabrig)
+"aaz" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/obj/item/seeds/riceseed,/obj/item/seeds/riceseed,/obj/item/seeds/riceseed,/turf/simulated/floor/grass,/area/security/permabrig)
+"aaA" = (/obj/machinery/portable_atmospherics/hydroponics/soil,/turf/simulated/floor/grass,/area/security/permabrig)
+"aaB" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/permabrig)
+"aaC" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aaD" = (/turf/simulated/floor/plasteel,/area/security/permabrig)
-"aaE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aaF" = (/obj/machinery/door/airlock/glass{name = "Bedroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel,/area/security/permabrig)
+"aaE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/permabrig)
+"aaF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_pump,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aaG" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aaH" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aaI" = (/obj/machinery/washing_machine,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/security/permabrig)
+"aaH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aaI" = (/obj/machinery/biogenerator,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"aaJ" = (/turf/space,/obj/machinery/gun_turret,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
-"aaK" = (/obj/machinery/newscaster{pixel_y = -28},/obj/structure/table,/obj/item/weapon/pen{layer = 4},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aaL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/security/permabrig)
-"aaM" = (/obj/structure/table,/obj/item/weapon/dice,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/item/device/radio/intercom/locked/prison{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/security/permabrig)
-"aaN" = (/obj/structure/stool,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aaO" = (/obj/structure/table,/obj/item/weapon/dice/d20,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aaP" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aaQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/security/permabrig)
-"aaR" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen{layer = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/security/permabrig)
-"aaS" = (/obj/item/weapon/cigbutt,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aaT" = (/obj/machinery/light/small{dir = 1},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
-"aaU" = (/obj/item/weapon/soap/nanotrasen,/obj/structure/sink{pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
-"aaV" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; tag = "icon-shower (WEST)"},/obj/structure/curtain/open/shower,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
-"aaW" = (/obj/machinery/portable_atmospherics/scrubber/huge/stationary,/obj/machinery/atmospherics/pipe/simple/visible{dir = 6; level = 1},/turf/simulated/floor/plating,/area/security/permabrig)
-"aaX" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/vending/sustenance,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aaY" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aaZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"aba" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"abb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"abc" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"abd" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"abe" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aaK" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/permabrig)
+"aaL" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/camera{c_tag = "Prison Garden"; dir = 4; network = list("SS13")},/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aaM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aaN" = (/obj/item/weapon/reagent_containers/glass/bucket,/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aaO" = (/obj/machinery/seed_extractor,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aaP" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; tag = "icon-shower (EAST)"},/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
+"aaQ" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
+"aaR" = (/obj/structure/mirror{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
+"aaS" = (/obj/machinery/portable_atmospherics/scrubber/huge/stationary,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aaT" = (/obj/structure/table/glass,/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/fertilizer/ez,/obj/item/weapon/reagent_containers/glass/fertilizer/ez,/obj/item/weapon/reagent_containers/glass/fertilizer/ez,/obj/item/weapon/plantspray/pests,/obj/item/weapon/plantspray/pests,/obj/item/weapon/plantspray/pests,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aaU" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/structure/table/glass,/obj/item/weapon/minihoe,/obj/item/device/analyzer/plant_analyzer,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aaV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aaW" = (/obj/item/weapon/soap/nanotrasen,/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
+"aaX" = (/obj/machinery/atmospherics/unary/vent_scrubber,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
+"aaY" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
+"aaZ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall/r_wall,/area/security/permabrig)
+"aba" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/glass{name = "Prison Garden"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abb" = (/obj/machinery/door/airlock/glass{name = "Prison Garden"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abc" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/security/permabrig)
+"abd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/security/permabrig)
+"abe" = (/obj/machinery/door/airlock{name = "Bathroom"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"abf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"abg" = (/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Washroom"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
+"abg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"abh" = (/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
-"abi" = (/obj/machinery/portable_atmospherics/scrubber/huge/stationary,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/security/permabrig)
-"abj" = (/obj/machinery/vending/sustenance,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abi" = (/obj/machinery/computer/arcade,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abj" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/table,/obj/machinery/kitchen_machine/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"abk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"abl" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"abm" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abl" = (/obj/machinery/newscaster{pixel_y = 32},/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abm" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"abn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"abo" = (/obj/machinery/camera{c_tag = "Prison Recreation Room"; dir = 1; network = list("Prison","SS13"); pixel_x = 22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"abp" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"abq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"abr" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/power/treadmill,/obj/machinery/treadmill_monitor{on = 1; pixel_x = 32; redeem_immediately = 1},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"abs" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/security/permabrig)
+"abo" = (/obj/machinery/portable_atmospherics/scrubber/huge/stationary,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abp" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/device/radio/intercom/locked/prison{pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abq" = (/obj/machinery/light_switch{pixel_y = 25},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig)
+"abr" = (/obj/machinery/computer/library/public,/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abs" = (/obj/machinery/washing_machine,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig)
"abt" = (/obj/machinery/door/airlock{name = "Toilet"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
"abu" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/security/permabrig)
"abv" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
-"abw" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"abw" = (/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/security/permabrig)
"abx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/security/permabrig)
-"aby" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/security/permabrig)
-"abz" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
+"aby" = (/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/security/permabrig)
+"abz" = (/obj/structure/holohoop,/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/security/permabrig)
"abA" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/vox)
-"abB" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/security/permabrig)
-"abC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
-"abD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/flasher{id = "permaflash"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
-"abE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/wall,/area/security/permabrig)
-"abF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall/r_wall,/area/security/permabrig)
-"abG" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/permabrig)
-"abH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
-"abI" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
-"abJ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"abB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/stool,/obj/item/device/radio/intercom/locked/prison{pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abC" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abD" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 4; frequency = 1443; id = "air_in"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abF" = (/obj/structure/stool,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abG" = (/obj/structure/table,/obj/item/weapon/dice/d20,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abI" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abJ" = (/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"abK" = (/obj/structure/lattice{layer = 2.4},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space)
"abL" = (/obj/structure/grille,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space)
-"abM" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent{filled = 0.2},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/security/permabrig)
-"abN" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating,/area/security/permabrig)
-"abO" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; network = list("Prison"); pixel_x = 0; pixel_y = 30},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating,/area/security/permabrig)
-"abP" = (/obj/machinery/computer/area_atmos/area,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/security/permabrig)
-"abQ" = (/obj/machinery/camera{c_tag = "Prison Air Control"; dir = 6; network = list("Prison","SS13")},/obj/machinery/flasher_button{id = "permaflash"; pixel_x = 0; pixel_y = 27},/obj/machinery/hologram/holopad,/turf/simulated/floor/plating,/area/security/permabrig)
-"abR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/permabrig)
-"abS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/permabrig)
-"abT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/security/permabrig)
-"abU" = (/obj/machinery/camera{c_tag = "Prison Solitary Confinement"; dir = 6; network = list("Prison","SS13")},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating,/area/security/permabrig)
-"abV" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/table,/obj/item/weapon/paper,/obj/machinery/light/small{dir = 1},/obj/item/weapon/pen,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/security/permabrig)
+"abM" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig)
+"abN" = (/obj/structure/table,/obj/structure/bedsheetbin,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig)
+"abO" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/security/permabrig)
+"abP" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/security/permabrig)
+"abQ" = (/turf/simulated/floor/holofloor,/area/security/permabrig)
+"abR" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/obj/machinery/gameboard,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abS" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abT" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"abW" = (/obj/structure/grille,/obj/structure/sign/securearea,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space)
-"abX" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/machinery/light/small{dir = 8},/obj/item/weapon/screwdriver,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plating,/area/security/permabrig)
-"abY" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/turf/simulated/floor/plating,/area/security/permabrig)
-"abZ" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plating,/area/security/permabrig)
-"aca" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plating,/area/security/permabrig)
-"acb" = (/turf/simulated/floor/plating,/area/security/permabrig)
-"acc" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
+"abX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"abZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"aca" = (/obj/structure/stool,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"acb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"acc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"acd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
-"ace" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Solitary Confinement"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/permabrig)
-"acf" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/security/permabrig)
+"ace" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"acf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"acg" = (/turf/simulated/wall/r_wall,/area/security/execution{name = "\improper Prisoner Transfer Center"})
"ach" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
"aci" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
-"acj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/security/permabrig)
+"acj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/security/permabrig)
"ack" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plating,/area/security/permabrig)
"acl" = (/obj/structure/stool/bed,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/security/permabrig)
"acm" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "Brig Secure Armory Exterior North"; dir = 4; network = list("SS13")},/turf/space,/area/security/permabrig)
@@ -133,14 +133,14 @@
"acC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
"acD" = (/obj/item/clothing/mask/muzzle/gag,/turf/simulated/floor/plating,/area/security/permabrig)
"acE" = (/turf/simulated/wall/r_wall,/area/security/securearmoury)
-"acF" = (/obj/structure/grille,/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/turf/space,/area/space)
+"acF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/wall/r_wall,/area/security/permabrig)
"acG" = (/obj/structure/grille,/turf/space,/area/space)
"acH" = (/obj/structure/closet/secure_closet/hos,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"acI" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Security's Desk"; departmentType = 5; name = "Head of Security Requests Console"; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"acJ" = (/obj/machinery/computer/secure_data,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"acK" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/red,/obj/item/weapon/folder/red,/obj/item/weapon/cartridge/detective,/obj/item/device/megaphone,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"acL" = (/obj/machinery/photocopier,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"acM" = (/obj/structure/flora/kirbyplants,/obj/machinery/newscaster/security_unit{pixel_y = 33},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"acM" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/newscaster/security_unit{pixel_y = 33},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"acN" = (/obj/machinery/light/small,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/closet/secure_closet/injection,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
"acO" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
"acP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/execution{name = "\improper Prisoner Transfer Center"})
@@ -176,11 +176,11 @@
"adt" = (/turf/simulated/floor/engine,/area/security/podbay)
"adu" = (/obj/structure/spacepoddoor{luminosity = 3},/turf/simulated/floor/engine,/area/security/podbay)
"adv" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/engine/vacuum,/area/security/podbay)
-"adw" = (/turf/simulated/wall/r_wall,/area/security/interrogationobs)
-"adx" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/pen,/obj/machinery/light/small{dir = 8},/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/interrogationobs)
-"ady" = (/obj/machinery/camera{c_tag = "Brig Interrogation Observation"; network = list("SS13")},/obj/machinery/computer/security/telescreen{layer = 4; name = "Observation Screen"; desc = "Used for observing the brig's interrogation room."; network = list("Interrogation"); pixel_x = 0; pixel_y = 32},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/interrogationobs)
-"adz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/computer/security/telescreen{layer = 4; name = "Observation Screen"; desc = "Used for observing the brig's interrogation room."; network = list("Interrogation"); pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/interrogationobs)
-"adA" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/closet/secure_closet{name = "electropack storage"; req_access_txt = "63"},/obj/item/device/radio/electropack,/obj/item/device/assembly/signaler{code = 2; frequency = 1449},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/interrogationobs)
+"adw" = (/turf/simulated/wall/r_wall,/area/security/prisonlockers)
+"adx" = (/obj/structure/closet/secure_closet/brig,/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"ady" = (/obj/item/device/radio/intercom/department/security{pixel_x = -28},/obj/structure/closet/secure_closet/brig,/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"adz" = (/obj/machinery/light{dir = 8},/obj/structure/closet/secure_closet/brig,/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"adA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/security/hos)
"adB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
"adC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
"adD" = (/obj/effect/decal/warning_stripes/northwest,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
@@ -197,10 +197,10 @@
"adO" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"adP" = (/obj/structure/rack,/obj/item/weapon/tank/oxygen,/obj/item/clothing/suit/space/rig/security,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/security,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/clothing/shoes/magboots,/obj/item/weapon/tank/jetpack/oxygen,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/security/podbay)
"adQ" = (/turf/simulated/wall/r_wall,/area/security/evidence)
-"adR" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/stack/medical/bruise_pack{pixel_x = 10; pixel_y = 2},/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/interrogationobs)
-"adS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/interrogationobs)
-"adT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/interrogationobs)
-"adU" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/interrogationobs)
+"adR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/camera{c_tag = "Brig Prison Hallway"; dir = 4; network = list("Prison","SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
+"adS" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/security/permabrig)
+"adT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Interrogation"; req_access = null; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/interrogation)
+"adU" = (/obj/machinery/camera{c_tag = "Prisoner Lockers"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
"adV" = (/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
"adW" = (/obj/structure/rack,/obj/machinery/light{dir = 8},/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/gun/energy/gun{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
"adX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/warning_stripes/southwest,/obj/structure/rack,/obj/item/key/security,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
@@ -210,20 +210,20 @@
"aeb" = (/obj/structure/rack,/obj/item/clothing/suit/armor/riot,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/window/reinforced{dir = 4},/obj/item/clothing/suit/armor/riot,/obj/item/clothing/suit/armor/riot,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
"aec" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "Head of Security APC"; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"aed" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/carpet,/area/security/hos)
-"aee" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/carpet,/area/security/hos)
-"aef" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/mob/living/simple_animal/hostile/retaliate/araneus,/turf/simulated/floor/carpet,/area/security/hos)
-"aeg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"aeh" = (/obj/structure/table/woodentable,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/device/radio,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"aee" = (/mob/living/simple_animal/hostile/retaliate/araneus,/turf/simulated/floor/carpet,/area/security/hos)
+"aef" = (/obj/structure/table/woodentable,/obj/item/device/radio,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"aeg" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/securehallway)
+"aeh" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"aei" = (/obj/machinery/space_heater,/obj/machinery/light_switch{pixel_x = -25},/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/security/podbay)
"aej" = (/obj/spacepod/sec{req_access_txt = "71"},/turf/simulated/floor/engine,/area/security/podbay)
-"aek" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/item/weapon/folder/red,/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"ael" = (/obj/structure/filingcabinet/filingcabinet,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"aem" = (/obj/structure/closet{name = "Evidence Closet"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "Evidence Storage APC"; pixel_x = 0; pixel_y = 25},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"aen" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/security/interrogationobs)
-"aeo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/interrogationobs)
-"aep" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/security/interrogationobs)
-"aeq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/security/interrogationobs)
-"aer" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/camera{c_tag = "Brig Prison Hallway"; dir = 4; network = list("Prison","SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
+"aek" = (/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"ael" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prisoner Lockers"; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonlockers)
+"aem" = (/obj/machinery/power/apc{dir = 1; name = "Prisoner Lockers APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"aen" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/permabrig)
+"aeo" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/permabrig)
+"aep" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/security/securehallway)
+"aeq" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"aer" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonlockers)
"aes" = (/obj/structure/lattice,/obj/machinery/camera{c_tag = "Brig Secure Armory Exterior South"; dir = 8; network = list("SS13")},/turf/space,/area/security/permabrig)
"aet" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/weapon/gun/energy/gun/advtaser{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/energy/gun/advtaser{pixel_x = 0; pixel_y = 0},/obj/item/weapon/gun/energy/gun/advtaser{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
"aeu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/southeast,/obj/vehicle/secway,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
@@ -233,13 +233,13 @@
"aey" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/decal/warning_stripes/blue/hollow,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/security/podbay)
"aez" = (/obj/structure/spacepoddoor{luminosity = 3},/obj/machinery/door/poddoor/multi_tile/four_tile_ver{id_tag = "secpodbay"; layer = 3.1; req_access_txt = "71"},/turf/simulated/floor/engine,/area/security/podbay)
"aeA" = (/turf/simulated/wall/r_wall,/area/security/range)
-"aeB" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"aeC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"aeD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"aeE" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Evidence Storage"; req_access = null; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"aeF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/interrogationobs)
-"aeG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/security/interrogationobs)
-"aeH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Interrogation Observation APC"; pixel_x = 26; pixel_y = 0},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/security/interrogationobs)
+"aeB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/closet/secure_closet/brig,/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"aeC" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
+"aeD" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/security/securehallway)
+"aeE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/interrogation)
+"aeF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/northwestcorner,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
+"aeG" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonlockers)
+"aeH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/obj/structure/closet/secure_closet/brig,/turf/simulated/floor/plasteel,/area/security/prisonlockers)
"aeI" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Head of Security's Office"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"aeJ" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Armory APC"; pixel_x = -24; pixel_y = 0},/obj/machinery/camera/motion{c_tag = "Secure Armory"; dir = 4; network = list("SS13")},/obj/machinery/light_switch{pixel_x = -25; pixel_y = -10},/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
"aeK" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
@@ -259,10 +259,10 @@
"aeY" = (/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plasteel,/area/security/range)
"aeZ" = (/obj/effect/decal/warning_stripes/northwest,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
"afa" = (/obj/effect/decal/warning_stripes/northeast,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
-"afb" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"afc" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"afd" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"afe" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Interrogation Observation"; req_access = null; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/interrogationobs)
+"afb" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/securehallway)
+"afc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
+"afd" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/interrogation)
+"afe" = (/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"aff" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
"afg" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
"afh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
@@ -285,36 +285,36 @@
"afy" = (/turf/simulated/floor/plasteel,/area/security/range)
"afz" = (/obj/machinery/magnetic_module,/obj/structure/target_stake,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
"afA" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
-"afB" = (/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"afC" = (/obj/structure/closet{name = "Evidence Closet"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/camera{c_tag = "Brig Evidence Storage"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"afD" = (/obj/structure/closet{name = "Evidence Closet"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
-"afE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/security/evidence)
-"afF" = (/obj/structure/closet/secure_closet/brig,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"afG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"afH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/power/apc{dir = 1; name = "Prisoner Lockers APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"afI" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass_security{name = "Prisoner Lockers"; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonlockers)
-"afJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/permabrig)
+"afB" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonlockers)
+"afC" = (/turf/simulated/floor/plasteel,/area/security/securehallway)
+"afD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/securehallway)
+"afE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
+"afF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/wall,/area/security/prisonlockers)
+"afG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/securehallway)
+"afH" = (/turf/simulated/wall,/area/security/interrogationhallway)
+"afI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
+"afJ" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/vending/security,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"afK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/permabrig)
"afL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/permabrig)
-"afM" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/permabrig)
+"afM" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Armory"; req_access_txt = "3"},/turf/simulated/floor/plasteel,/area/security/armoury)
"afN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plating,/area/maintenance/genetics)
"afO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/door/window/brigdoor{dir = 2; name = "Secure Armory"; req_access_txt = "3"},/obj/machinery/door/window/brigdoor{dir = 1; name = "Secure Armory"; req_access_txt = "3"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
"afP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/securearmoury)
"afQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/securearmoury)
-"afR" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
-"afS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/securehallway)
-"afT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
-"afU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
-"afV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
+"afR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
+"afS" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/securehallway)
+"afT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/securehallway)
+"afU" = (/obj/machinery/door/airlock/multi_tile/glass{req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/main)
+"afV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/securehallway)
"afW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/camera{c_tag = "Brig North Hallway"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
"afX" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
"afY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
-"afZ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
+"afZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall,/area/security/main)
"aga" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
"agb" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
-"agc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/securehallway)
-"agd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/wall,/area/security/podbay)
-"age" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/table/reinforced,/obj/item/clothing/suit/jacket/pilot,/obj/item/clothing/head/beret/sec,/obj/machinery/light_switch{pixel_x = -25},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/device/spacepod_key{id = 100000},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"agc" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/table/reinforced,/obj/item/clothing/suit/jacket/pilot,/obj/item/clothing/head/beret/sec,/obj/machinery/light_switch{pixel_x = -25},/obj/item/device/spacepod_key{id = 100000},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"agd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/wall,/area/security/podbay)
+"age" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/securehallway)
"agf" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"agg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"agh" = (/obj/structure/closet/secure_closet/security,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Security Podbay APC"; pixel_x = 25},/obj/item/device/spacepod_equipment/weaponry/laser,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
@@ -323,158 +323,158 @@
"agk" = (/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plasteel,/area/security/range)
"agl" = (/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
"agm" = (/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
-"agn" = (/obj/structure/closet/secure_closet/brig,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"ago" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"agp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"agn" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/deployable/barrier,/obj/machinery/light_switch{pixel_x = -25},/obj/effect/decal/warning_stripes/red/hollow,/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Armory APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
+"ago" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/securehallway)
+"agp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/security/seceqstorage)
"agq" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/prisonlockers)
"agr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
"ags" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/permabrig)
"agt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/permabrig)
-"agu" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
+"agu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/security/seceqstorage)
"agv" = (/turf/simulated/wall,/area/security/armoury)
"agw" = (/obj/machinery/deployable/barrier,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"agx" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/securehallway)
+"agx" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"agy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/warning_stripes/north,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"agz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/deployable/barrier,/obj/effect/decal/warning_stripes/northeastcorner,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"agA" = (/obj/structure/closet/bombcloset,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/security/armoury)
-"agB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/vending/security,/obj/effect/decal/warning_stripes/northwestcorner,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"agC" = (/turf/simulated/wall,/area/security/securehallway)
-"agD" = (/obj/structure/closet/l3closet/security,/turf/simulated/floor/plasteel,/area/security/armoury)
-"agE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/securehallway)
-"agF" = (/turf/simulated/floor/plasteel,/area/security/securehallway)
-"agG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/securehallway)
-"agH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/securehallway)
-"agI" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/security/securehallway)
-"agJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/securehallway)
-"agK" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/securehallway)
-"agL" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"agA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall,/area/security/main)
+"agB" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"agC" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/main)
+"agD" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/main)
+"agE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
+"agF" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"agG" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/main)
+"agH" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/main)
+"agI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 100; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
+"agJ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
+"agK" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Armory"; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
+"agL" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Pods"; req_access_txt = "71"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"agM" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"agN" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Security Pod Pilot"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"agO" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/obj/machinery/camera{c_tag = "Brig Pod Pilot's Office"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"agP" = (/obj/structure/sign/nosmoking_2,/turf/simulated/wall/r_wall,/area/security/podbay)
"agQ" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
"agR" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk2"; icon_state = "catwalk2"},/area/solar/auxstarboard)
-"agS" = (/turf/simulated/wall/r_wall,/area/security/interrogation)
-"agT" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/power/apc{dir = 1; name = "Interrogation APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/security/interrogation)
-"agU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/security/interrogation)
-"agV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/security/interrogation)
-"agW" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Interrogation"; req_access = null; req_access_txt = "63"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/interrogation)
-"agX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/security/prisonlockers)
-"agY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"agZ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"agS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/interrogation)
+"agT" = (/obj/item/weapon/restraints/handcuffs/pinkcuffs,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/security/prisonlockers)
+"agU" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/interrogationhallway)
+"agV" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/armoury)
+"agW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
+"agX" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
+"agY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall,/area/security/seceqstorage)
+"agZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/seceqstorage)
"aha" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/prisonlockers)
"ahb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
-"ahc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/permabrig)
-"ahd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/permabrig)
-"ahe" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Prison Wing APC"; pixel_x = 26; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
-"ahf" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/deployable/barrier,/obj/machinery/light_switch{pixel_x = -25},/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"ahg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/securehallway)
+"ahc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/security/permabrig)
+"ahd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/light{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/security/permabrig)
+"ahe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/security/permabrig)
+"ahf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/permabrig)
+"ahg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access_txt = "1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
"ahh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"ahi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/deployable/barrier,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"ahj" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"ahk" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Armory"; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/armoury)
+"ahk" = (/obj/structure/closet/secure_closet/security,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/seceqstorage)
"ahl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/securehallway)
"ahm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"ahn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/securehallway)
-"aho" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/power/apc{name = "Security Secure Hallway APC"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/securehallway)
+"ahn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/permabrig)
+"aho" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/main)
"ahp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/securehallway)
-"ahq" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/securehallway)
-"ahr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/securehallway)
-"ahs" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/securehallway)
-"aht" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/securehallway)
-"ahu" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/securehallway)
+"ahq" = (/obj/machinery/light{dir = 4},/obj/structure/rack,/obj/item/weapon/storage/box/teargas,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
+"ahr" = (/obj/structure/sink{pixel_y = 18},/obj/structure/mirror{pixel_y = 32},/obj/item/device/radio/intercom/department/security{pixel_x = 28; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/seceqstorage)
+"ahs" = (/obj/structure/disposalpipe/segment,/obj/structure/table,/obj/item/device/taperecorder{pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
+"aht" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/security/main)
+"ahu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/main)
"ahv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/security/podbay)
-"ahw" = (/obj/structure/flora/kirbyplants,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
+"ahw" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"ahx" = (/obj/structure/table/reinforced,/obj/item/device/flashlight,/obj/item/device/radio{pixel_y = 6},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"ahy" = (/obj/machinery/light,/obj/structure/table/reinforced,/obj/item/weapon/folder/red,/obj/item/weapon/pen,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"ahz" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/security_space_law,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/podbay)
"ahA" = (/turf/simulated/wall/r_wall,/area/security/main)
"ahB" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard)
-"ahC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/security/interrogation)
-"ahD" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/security/interrogation)
-"ahE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/security/interrogation)
-"ahF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/security/interrogation)
-"ahG" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Brig Prison Lockers"; dir = 4; network = list("SS13")},/obj/machinery/light_switch{pixel_x = -25},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"ahH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"ahI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"ahC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/interrogation)
+"ahD" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/door_control{id = "Interrogation"; name = "Interrogation Privacy Shutter"; pixel_x = -28; pixel_y = -3; range = 20; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/interrogation)
+"ahE" = (/turf/simulated/wall,/area/security/processing)
+"ahF" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/requests_console{department = "Security"; departmentType = 5; name = "Security Requests Console"; pixel_x = -30; pixel_y = 30},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/seceqstorage)
+"ahG" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/seceqstorage)
+"ahH" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/interrogationhallway)
+"ahI" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/door/airlock/security{name = "Warden's office"; req_access = null; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"ahJ" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/door/airlock/glass_security{name = "Prisoner Lockers"; req_access_txt = "63"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"ahK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
-"ahL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/permabrig)
-"ahM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/permabrig)
-"ahN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 100; on = 1; pressure_checks = 1},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
-"ahO" = (/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Armory APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"ahP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/securehallway)
+"ahK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
+"ahL" = (/obj/machinery/vending/cigarette,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/main)
+"ahM" = (/obj/structure/table,/obj/item/ashtray/bronze{pixel_x = 2; pixel_y = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/item/weapon/storage/fancy/cigarettes/cigpack_robust,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
+"ahN" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/permabrig)
+"ahO" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/security/armoury)
+"ahP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
"ahQ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/landmark{name = "blobstart"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"ahR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"ahS" = (/turf/simulated/floor/plasteel,/area/security/armoury)
-"ahT" = (/obj/machinery/light{dir = 4},/obj/structure/rack,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/storage/box/teargas,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
+"ahT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/permabrig)
"ahU" = (/turf/simulated/wall,/area/security/main)
-"ahV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/security/main)
-"ahW" = (/obj/machinery/door/airlock/multi_tile/glass{req_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/security/securehallway)
-"ahX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/security/securehallway)
-"ahY" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/securehallway)
+"ahV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/seceqstorage)
+"ahW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"ahX" = (/obj/structure/stool,/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/seceqstorage)
+"ahY" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/seceqstorage)
"ahZ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/securehallway)
-"aia" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/securehallway)
-"aib" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/securehallway)
-"aic" = (/obj/machinery/door/airlock/multi_tile/glass{req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/securehallway)
-"aid" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/securehallway)
+"aia" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/main)
+"aib" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
+"aic" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/main)
+"aid" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
"aie" = (/turf/simulated/floor/plasteel,/area/shuttle/gamma/station)
-"aif" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/security/interrogation)
-"aig" = (/obj/structure/table/reinforced{tag = "icon-table"; icon_state = "table"},/obj/item/device/flashlight/lamp,/obj/item/device/taperecorder{pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/security/interrogation)
-"aih" = (/obj/machinery/camera{c_tag = "Brig Interrogation"; dir = 9; network = list("Interrogation","SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/security/interrogation)
-"aii" = (/obj/structure/closet/secure_closet/brig,/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"aij" = (/obj/structure/closet/secure_closet/brig,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/security/prisonlockers)
-"aik" = (/obj/structure/closet/secure_closet/brig,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel,/area/security/prisonlockers)
+"aif" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/seceqstorage)
+"aig" = (/obj/machinery/power/apc{dir = 1; name = "Interrogation APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/interrogation)
+"aih" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/security/armoury)
+"aii" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"aij" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/light{dir = 8},/obj/structure/closet/secure_closet/security,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/seceqstorage)
+"aik" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/securehallway)
"ail" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/security/prisonlockers)
-"aim" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/permabrig)
-"ain" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
-"aio" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
-"aip" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/permabrig)
+"aim" = (/obj/machinery/camera{c_tag = "Brig Armory"; dir = 4; network = list("SS13")},/obj/machinery/flasher/portable,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
+"ain" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Interrogation"; name = "Interrogation Privacy Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/security/interrogation)
+"aio" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/sign/securearea,/turf/simulated/floor/plating,/area/security/seceqstorage)
+"aip" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
"aiq" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/flasher/portable,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"air" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/armoury)
"ais" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/flasher/portable,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"ait" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 100; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"aiu" = (/obj/structure/rack,/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/lockbox/loyalty,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"aiv" = (/obj/structure/closet/wardrobe/red,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/main)
-"aiw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
-"aix" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
-"aiy" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
-"aiz" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/main)
-"aiA" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/main)
-"aiB" = (/obj/structure/table/reinforced,/obj/item/device/radio,/obj/item/weapon/crowbar,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
+"aiv" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Interrogation"; name = "Interrogation Privacy Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/security/interrogation)
+"aiw" = (/obj/machinery/hologram/holopad,/obj/machinery/camera{c_tag = "Brig Interrogation"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/interrogation)
+"aix" = (/obj/structure/disposalpipe/segment,/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
+"aiy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
+"aiz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall,/area/security/interrogationhallway)
+"aiA" = (/obj/structure/table/reinforced{tag = "icon-table"; icon_state = "table"},/obj/item/device/flashlight/lamp,/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/interrogation)
+"aiB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Interrogation"; req_access = null; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/interrogation)
"aiC" = (/turf/simulated/floor/plasteel,/area/security/main)
-"aiD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/main)
-"aiE" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/security/main)
-"aiF" = (/obj/structure/table,/obj/item/weapon/folder/red,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/main)
-"aiG" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel,/area/security/main)
-"aiH" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Security Officer"},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/main)
+"aiD" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
+"aiE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table/reinforced,/obj/item/weapon/folder/red{pixel_y = 3},/turf/simulated/floor/plasteel,/area/security/main)
+"aiF" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/paper/armory,/obj/machinery/requests_console{department = "Warden"; departmentType = 7; name = "Warden's Requests Console"; pixel_x = 30; pixel_y = 30},/obj/item/device/megaphone,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"aiG" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
+"aiH" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/red{pixel_y = 3},/turf/simulated/floor/plasteel,/area/security/main)
"aiI" = (/turf/simulated/floor/plating/airless,/obj/structure/cable,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard)
"aiJ" = (/obj/machinery/camera{c_tag = "Brig Firing Range West"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
"aiK" = (/obj/machinery/camera{c_tag = "Brig Firing Range East"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
-"aiL" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/security/interrogation)
-"aiM" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/security/interrogation)
-"aiN" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/security/interrogation)
+"aiL" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
+"aiM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"aiN" = (/obj/structure/stool,/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/seceqstorage)
"aiO" = (/turf/simulated/wall,/area/security/prisonlockers)
-"aiP" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
-"aiQ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/permabrig)
-"aiR" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/permabrig)
+"aiP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera{c_tag = "Brig Security Equipment Lockers"; dir = 4; network = list("SS13")},/obj/structure/sign/poster/legit{pixel_x = -32; pixel_y = 0},/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/seceqstorage)
+"aiQ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/interrogationhallway)
+"aiR" = (/turf/simulated/wall,/area/security/seceqstorage)
"aiS" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
-"aiT" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/camera{c_tag = "Brig Armory"; dir = 4; network = list("SS13")},/obj/machinery/flasher/portable,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
+"aiT" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/seceqstorage)
"aiU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/flasher/portable,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"aiV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/armoury)
"aiW" = (/obj/structure/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/box/handcuffs,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"aiX" = (/obj/structure/rack,/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
"aiY" = (/obj/structure/table,/obj/effect/decal/warning_stripes/red/hollow,/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/lock_buster,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/armoury)
-"aiZ" = (/obj/machinery/recharger/wallcharger{pixel_x = -25; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
-"aja" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/main)
-"ajb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel,/area/security/main)
-"ajc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/main)
-"ajd" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
-"aje" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/main)
-"ajf" = (/obj/structure/table/reinforced,/obj/item/device/assembly/timer,/obj/item/device/megaphone,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
-"ajg" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
-"ajh" = (/obj/structure/table,/obj/item/weapon/folder/red,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/main)
-"aji" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Security Officer"},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 32},/turf/simulated/floor/plasteel,/area/security/main)
+"aiZ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/interrogationhallway)
+"aja" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/security/seceqstorage)
+"ajb" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/obj/machinery/sleeper/syndie{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
+"ajc" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/obj/machinery/camera{c_tag = "Brig Medbay"; dir = 2; network = list("SS13")},/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/security/medbay)
+"ajd" = (/obj/structure/table/reinforced{tag = "icon-table"; icon_state = "table"},/obj/machinery/door/window/brigdoor/southleft{dir = 4; req_access_txt = "63"},/obj/machinery/door/window/brigdoor{dir = 8; name = "Warden's Desk"; req_access_txt = "3"},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"aje" = (/obj/machinery/sleeper/syndie{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
+"ajf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"ajg" = (/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/seceqstorage)
+"ajh" = (/obj/structure/stool/bed/chair/comfy/black,/obj/effect/landmark/start{name = "Head of Security"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
+"aji" = (/obj/structure/table/reinforced,/obj/item/weapon/folder/red{pixel_y = 3},/obj/item/weapon/book/manual/security_space_law/black,/turf/simulated/floor/plasteel,/area/security/main)
"ajj" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space)
"ajk" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/auxstarboard)
"ajl" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard)
@@ -487,25 +487,25 @@
"ajs" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/laser/practice,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/item/weapon/paper/firingrange,/turf/simulated/floor/plasteel,/area/security/range)
"ajt" = (/turf/simulated/wall/r_wall,/area/security/medbay)
"aju" = (/turf/simulated/wall,/area/security/medbay)
-"ajv" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_y = 3},/obj/machinery/camera{c_tag = "Brig Prisoner Processing"; dir = 2; network = list("SS13")},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/processing)
-"ajw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/processing)
-"ajx" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/processing)
-"ajy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/processing)
-"ajz" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/processing)
-"ajA" = (/turf/simulated/wall/r_wall,/area/security/warden)
+"ajv" = (/obj/machinery/camera{c_tag = "Brig Briefing Room East"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
+"ajw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
+"ajx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/security/interrogationhallway)
+"ajy" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/obj/machinery/requests_console{department = "Brig Medbay"; departmentType = 3; name = "Brig Medbay Requests Console"; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/security/medbay)
+"ajz" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/interrogationhallway)
+"ajA" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/obj/machinery/light{dir = 1},/obj/structure/reagent_dispensers/peppertank{pixel_y = 30},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/security/medbay)
"ajB" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/warden)
"ajC" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/warden)
-"ajD" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/door/airlock/glass_security{name = "Armory"; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"ajD" = (/obj/effect/landmark{name = "revenantspawn"},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/security/medbay)
"ajE" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/security/warden)
"ajF" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/warden)
"ajG" = (/turf/simulated/wall,/area/security/warden)
-"ajH" = (/obj/machinery/recharger/wallcharger{pixel_x = -25; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/camera{c_tag = "Brig Security Equipment"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
-"ajI" = (/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor/plasteel,/area/security/main)
-"ajJ" = (/obj/structure/table,/obj/item/device/eftpos,/turf/simulated/floor/plasteel,/area/security/main)
-"ajK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/main)
-"ajL" = (/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
+"ajH" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/interrogationhallway)
+"ajI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"ajJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/interrogation)
+"ajK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
+"ajL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/interrogationhallway)
"ajM" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/main)
-"ajN" = (/obj/machinery/camera{c_tag = "Brig Briefing Room"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel,/area/security/main)
+"ajN" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/warden)
"ajO" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/security/main)
"ajP" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard)
"ajQ" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxport)
@@ -515,33 +515,33 @@
"ajU" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/range)
"ajV" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/range)
"ajW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/range)
-"ajX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/hologram/holopad,/obj/machinery/requests_console{department = "Security"; departmentType = 3; name = "Security Requests Console"; pixel_x = -30; pixel_y = -30},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
-"ajY" = (/obj/machinery/sleeper{dir = 8; name = "Prisoner Sleeper"},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/security/medbay)
-"ajZ" = (/obj/machinery/sleep_console{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-whiteblue"; icon_state = "whiteblue"},/area/security/medbay)
-"aka" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/obj/machinery/camera{c_tag = "Brig Medbay"; dir = 2; network = list("SS13")},/obj/machinery/alarm{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"akb" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
+"ajX" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/security/main)
+"ajY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/folder/red{pixel_y = 3},/obj/item/ashtray/bronze{pixel_x = -1; pixel_y = 1},/obj/item/device/megaphone,/turf/simulated/floor/plasteel,/area/security/main)
+"ajZ" = (/obj/structure/disposalpipe/segment,/obj/item/roller,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/security/medbay)
+"aka" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access_txt = "1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"akb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/table/reinforced,/obj/item/weapon/book/manual/sop_security,/turf/simulated/floor/plasteel,/area/security/main)
"akc" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/table/reinforced,/obj/machinery/syndicatebomb/training,/obj/machinery/requests_console{department = "Security"; departmentType = 3; name = "Security Requests Console"; pixel_x = 30},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/range)
-"akd" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"ake" = (/obj/structure/table,/obj/item/device/camera{name = "detectives camera"; desc = "A one use - polaroid camera. 30 photos left."; pixel_x = 0; pixel_y = 0; pictures_left = 30},/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/processing)
-"akf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/processing)
-"akg" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor/plasteel,/area/security/processing)
-"akh" = (/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/processing)
-"aki" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/processing)
-"akj" = (/obj/machinery/photocopier,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/newscaster/security_unit{pixel_x = -32; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
+"akd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
+"ake" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/security/main)
+"akf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/security/main)
+"akg" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/main)
+"akh" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/main)
+"aki" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/security/seceqstorage)
+"akj" = (/obj/machinery/photocopier,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/newscaster/security_unit{pixel_x = -32; pixel_y = 32},/obj/machinery/power/apc{dir = 1; name = "Starboard Hall East APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"akk" = (/obj/structure/filingcabinet/chestdrawer,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/camera{c_tag = "Brig Warden's Office"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"akl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"akm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/secure_closet/warden,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"akn" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/obj/machinery/requests_console{department = "Brig Medbay"; departmentType = 3; name = "Brig Medbay Requests Console"; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"ako" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/closet/redcorp,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/main)
-"akp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/main)
-"akq" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/security/main)
-"akr" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
-"aks" = (/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access_txt = "1"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/security/main)
-"akt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/security/main)
-"aku" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/effect/landmark/start{name = "Head of Security"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
-"akv" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
-"akw" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/security/main)
-"akx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/security/main)
+"akn" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/power/apc{dir = 1; name = "Starboard Hall East APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/seceqstorage)
+"ako" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Interrogation Hallway APC"; pixel_x = -24; pixel_y = 0},/obj/machinery/camera{c_tag = "Interrogation Hallway"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/interrogationhallway)
+"akp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/reinforced,/obj/item/weapon/book/manual/sop_legal,/turf/simulated/floor/plasteel,/area/security/main)
+"akq" = (/obj/structure/reagent_dispensers/peppertank{pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/seceqstorage)
+"akr" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/interrogationhallway)
+"aks" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"akt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/obj/structure/sign/goldenplaque{pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/seceqstorage)
+"aku" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"akv" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/interrogationhallway)
+"akw" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/recharger/wallcharger{pixel_y = 25},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/recharger/wallcharger{pixel_y = 35},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/seceqstorage)
+"akx" = (/obj/item/weapon/storage/box/masks{pixel_x = 6; pixel_y = 2},/obj/item/weapon/storage/box/gloves,/obj/structure/table/glass,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/security/medbay)
"aky" = (/obj/machinery/hologram/holopad,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plasteel,/area/bridge)
"akz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/security/main)
"akA" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/hatch/gamma{locked = 1; req_access_txt = "1"; use_power = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/main)
@@ -561,29 +561,29 @@
"akO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
"akP" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 100; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
"akQ" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"akR" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"akS" = (/obj/structure/table,/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/item/weapon/storage/box/evidence,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/processing)
-"akT" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/processing)
-"akU" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/security/processing)
-"akV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/processing)
+"akR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/interrogationhallway)
+"akS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/main)
+"akT" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/seceqstorage)
+"akU" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/stool/bed/chair{dir = 1},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
+"akV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle)
"akW" = (/obj/structure/table/reinforced{tag = "icon-table_vertical"; icon_state = "table_vertical"},/obj/machinery/door/window/brigdoor{dir = 4; name = "Warden's Desk"; req_access_txt = "3"},/obj/machinery/door/window/westright{name = "Reception Door"; req_access = null; req_access_txt = "0"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/security/warden)
"akX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"akY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"akZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"ala" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"alb" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 100; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"alc" = (/obj/structure/table/reinforced{tag = "icon-table_vertical"; icon_state = "table_vertical"},/obj/machinery/door/window/brigdoor{dir = 8; name = "Warden's Desk"; req_access_txt = "3"},/obj/machinery/door/window/eastleft,/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/security/warden)
-"ald" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
-"ale" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/main)
-"alf" = (/obj/structure/table,/obj/machinery/media/receiver/boombox,/turf/simulated/floor/plasteel,/area/security/main)
-"alg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/main)
-"alh" = (/obj/structure/closet/secure_closet/security,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
-"ali" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/main)
-"alj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/disposalpipe/segment,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel,/area/security/main)
-"alk" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 7},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
-"all" = (/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/book/manual/security_space_law,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
-"alm" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/security/main)
-"aln" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel,/area/security/main)
+"alc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/stool/bed/chair{dir = 1},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
+"ald" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/main)
+"ale" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/stool/bed/chair{dir = 1},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/main)
+"alf" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
+"alg" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"alh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/item/device/radio/intercom/department/security{pixel_x = -28},/obj/machinery/camera{c_tag = "Brig Briefing Room West"; dir = 4; network = list("SS13")},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
+"ali" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/device/radio,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/seceqstorage)
+"alj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"alk" = (/obj/machinery/door/window/eastright{dir = 1; name = "Security Delivery"; req_access_txt = "1"},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/main)
+"all" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"alm" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/security/medbay)
+"aln" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "Prisoner Processing APC"; pixel_x = 0; pixel_y = 25},/obj/machinery/camera{c_tag = "Brig Labor Camp Airlock North"; network = list("SS13")},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table,/obj/item/weapon/storage/box/prisoner,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle)
"alo" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxstarboard)
"alp" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/solar{id = "auxsolareast"; name = "Port Auxiliary Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/auxport)
"alq" = (/turf/simulated/floor/plating/airless,/obj/structure/cable,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxport)
@@ -596,24 +596,24 @@
"alx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/landmark/start{name = "Brig Physician"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
"aly" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
"alz" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"alA" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/processing)
-"alB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/processing)
-"alC" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 100; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel,/area/security/processing)
-"alD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/processing)
-"alE" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/processing)
+"alA" = (/turf/simulated/wall,/area/security/brig)
+"alB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/disposalpipe/segment,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
+"alC" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"alD" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "Brig"; name = "Interrogation Hallway"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/interrogationhallway)
+"alE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/interrogationhallway)
"alF" = (/obj/machinery/computer/secure_data,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"alG" = (/obj/structure/stool/bed/chair/office/dark,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/landmark/start{name = "Warden"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"alH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"alI" = (/obj/structure/table,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"alJ" = (/obj/structure/table,/obj/item/weapon/clipboard,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/paper/armory,/obj/machinery/requests_console{department = "Warden"; departmentType = 7; name = "Warden's Requests Console"; pixel_x = 30; pixel_y = 30},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"alK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/main)
-"alL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/main)
-"alM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/main)
-"alN" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/main)
-"alO" = (/obj/structure/table/reinforced,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flash,/obj/machinery/light{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
-"alP" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/main)
-"alQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/security/main)
-"alR" = (/obj/structure/closet/secure_closet/security,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel,/area/security/main)
+"alJ" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/security/main)
+"alK" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/range)
+"alL" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/main)
+"alM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment{name = "Sorting Office"},/turf/simulated/floor/plasteel,/area/security/main)
+"alN" = (/obj/machinery/light/small{dir = 8},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/interrogationhallway)
+"alO" = (/obj/structure/disposalpipe/segment{name = "Sorting Office"},/turf/simulated/wall,/area/security/main)
+"alP" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 1; location = "Security"},/obj/structure/plasticflaps{opacity = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"alQ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "Brig"; name = "Interrogation Hallway"; req_access_txt = "63"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/interrogationhallway)
+"alR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
"alS" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk4"; icon_state = "catwalk4"},/area/solar/auxport)
"alT" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/auxport)
"alU" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/auxport)
@@ -627,37 +627,37 @@
"amc" = (/turf/simulated/wall/r_wall,/area/space)
"amd" = (/turf/simulated/wall,/area/security/range)
"ame" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_security{name = "Firing Range"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/range)
-"amf" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/security/range)
+"amf" = (/obj/structure/closet/secure_closet/brigdoc,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHWEST)"; icon_state = "whiteblue"; dir = 10},/area/security/medbay)
"amg" = (/obj/machinery/door/firedoor{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass_security{name = "Firing Range"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/range)
-"amh" = (/obj/structure/closet/secure_closet/brigdoc,/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
+"amh" = (/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/reagent_containers/syringe/charcoal,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/security/medbay)
"ami" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
"amj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"amk" = (/obj/item/clothing/accessory/stethoscope,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/glasses/hud/health,/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/security/medbay)
-"aml" = (/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/adv,/obj/item/weapon/reagent_containers/syringe/charcoal,/obj/item/weapon/reagent_containers/glass/bottle/epinephrine,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"amm" = (/obj/machinery/computer/med_data/laptop,/obj/structure/table/glass,/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/security/medbay)
-"amn" = (/obj/item/weapon/storage/box/masks{pixel_x = 6; pixel_y = 2},/obj/item/weapon/storage/box/gloves,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 6; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/security/medbay)
-"amo" = (/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Prisoner Processing APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/processing)
-"amp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/processing)
-"amq" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/processing)
-"amr" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/processing)
+"amk" = (/obj/item/clothing/accessory/stethoscope,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/glasses/hud/health,/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whitebluecorner (WEST)"; icon_state = "whitebluecorner"; dir = 8},/area/security/medbay)
+"aml" = (/obj/machinery/computer/med_data/laptop,/obj/structure/table/glass,/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = -28},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/security/medbay)
+"amm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/interrogationhallway)
+"amn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/interrogationhallway)
+"amo" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
+"amp" = (/obj/item/device/radio/intercom/department/security{pixel_x = -28},/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/camera{c_tag = "Brig Interrogation Observation"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/interrogationhallway)
+"amq" = (/obj/structure/rack,/obj/item/weapon/reagent_containers/spray/pepper{pixel_x = -2; pixel_y = -2},/obj/item/weapon/reagent_containers/spray/pepper{pixel_x = -4; pixel_y = -4},/obj/item/weapon/reagent_containers/spray/pepper{pixel_y = -4},/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/seceqstorage)
+"amr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
"ams" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"amt" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/crowbar,/obj/item/device/radio,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
"amu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/armoury)
"amv" = (/obj/machinery/computer/prisoner,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"amw" = (/obj/structure/table,/obj/item/weapon/book/manual/sop_legal,/turf/simulated/floor/plasteel,/area/security/main)
-"amx" = (/obj/machinery/vending/security,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/main)
+"amw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/security/brig)
+"amx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
"amy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
"amz" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
-"amA" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
-"amB" = (/obj/structure/reagent_dispensers/peppertank{pixel_y = -30},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
-"amC" = (/obj/structure/closet/secure_closet/security,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/main)
-"amD" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/main)
-"amE" = (/obj/structure/table/reinforced,/obj/structure/table/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{name = "Security Office APC"; pixel_y = -24},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/item/stack/medical/advanced/bruise_pack,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/main)
-"amF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = -32; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/security/main)
-"amG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/security/main)
-"amH" = (/obj/structure/stool/bed/chair{dir = 8},/obj/effect/landmark/start{name = "Security Officer"},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel,/area/security/main)
-"amI" = (/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel,/area/security/main)
-"amJ" = (/obj/machinery/door/window/eastright{dir = 1; name = "Security Delivery"; req_access_txt = "1"},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/security/main)
+"amA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
+"amB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
+"amC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
+"amD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"amE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light{dir = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
+"amF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
+"amG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/security/brig)
+"amH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j2s"; sortType = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
+"amI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/brig)
+"amJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig)
"amK" = (/turf/simulated/wall/r_wall,/area/maintenance/fsmaint)
"amL" = (/obj/structure/cable,/obj/machinery/power/solar{id = "auxsolareast"; name = "Port Auxiliary Solar Array"},/turf/simulated/floor/plasteel/airless{icon_state = "solarpanel"},/area/solar/auxport)
"amM" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxport)
@@ -671,25 +671,25 @@
"amU" = (/obj/machinery/computer/secure_data,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/prisonershuttle)
"amV" = (/obj/machinery/computer/prisoner{req_access = null; req_access_txt = "2"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle)
"amW" = (/obj/machinery/computer/shuttle/labor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle)
-"amX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "Prisoner Processing APC"; pixel_x = 0; pixel_y = 25},/obj/machinery/camera{c_tag = "Brig Labor Camp Airlock North"; network = list("SS13")},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle)
-"amY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle)
+"amX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/reinforced,/obj/item/stack/medical/advanced/bruise_pack,/obj/machinery/vending/wallmed1{dir = 2; name = "Emergency NanoMed"; pixel_x = -27; pixel_y = 0; req_access_txt = "0"},/obj/machinery/camera{c_tag = "Brig Security Equipment South"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/seceqstorage)
+"amY" = (/obj/machinery/light,/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/obj/structure/rack,/obj/item/weapon/restraints/handcuffs{pixel_y = -4},/obj/item/weapon/restraints/handcuffs,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/seceqstorage)
"amZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
"ana" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle)
"anb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
"anc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/item/device/radio/intercom/department/security{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/prisonershuttle)
"and" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Brig Medical Bay"; req_access_txt = "0"; req_one_access_txt = "63"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
"ane" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Brig Medical Bay"; req_access_txt = "0"; req_one_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/security/medbay)
-"anf" = (/obj/structure/sign/securearea,/turf/simulated/wall,/area/security/processing)
-"ang" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "Brig"; name = "Brig"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/processing)
-"anh" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/processing)
-"ani" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "Brig"; name = "Brig"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/processing)
+"anf" = (/obj/structure/disposalpipe/segment{name = "Sorting Office"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/brig)
+"ang" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prisoner Processing"; req_access_txt = "1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
+"anh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/security/courtroomdandp)
+"ani" = (/turf/simulated/wall,/area/security/courtroomdandp)
"anj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Warden's Office"; req_access_txt = "3"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/warden)
-"ank" = (/obj/structure/sign/securearea,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/security/main)
-"anl" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Equipment Storage"; req_access_txt = "1"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/main)
-"anm" = (/obj/structure/sign/securearea,/turf/simulated/wall,/area/security/main)
+"ank" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
+"anl" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/rack,/obj/item/device/flash,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/seceqstorage)
+"anm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
"ann" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/security/main)
-"ano" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/security/main)
-"anp" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/main)
+"ano" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
+"anp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
"anq" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table,/mob/living/simple_animal/bot/floorbot{on = 0},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"anr" = (/obj/machinery/light/small{dir = 1},/obj/structure/closet/emcloset,/obj/machinery/camera{c_tag = "Security Pod"; dir = 2; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"ans" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/pod_3)
@@ -720,31 +720,31 @@
"anR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig)
"anS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
"anT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"anU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"anV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"anW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig)
-"anX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"anY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig)
-"anZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/camera{c_tag = "Brig Main Hall"; dir = 2; network = list("SS13")},/obj/machinery/hologram/holopad,/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"aoa" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"aob" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"aoc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig)
-"aod" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"aoe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"aof" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"aog" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"aoh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig)
+"anU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig)
+"anV" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/brig)
+"anW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/security/courtroomdandp)
+"anX" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/security/lobby)
+"anY" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/lobby)
+"anZ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/security/lobby)
+"aoa" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_security{id_tag = "Brig"; name = "Prisoner Processing"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/processing)
+"aob" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "Brig"; name = "Prisoner Processing"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/processing)
+"aoc" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/seceqstorage)
+"aod" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/lobby)
+"aoe" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/lobby)
+"aof" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/courtroomdandp)
+"aog" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/courtroomdandp)
+"aoh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/courtroomdandp)
"aoi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
"aoj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
"aok" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
"aol" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
"aom" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"aon" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j2s"; sortType = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
-"aoo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig)
-"aop" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/security/brig)
-"aoq" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/brig)
+"aon" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/item/flag/nt,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/courtroomdandp)
+"aoo" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/lobby)
+"aop" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = null; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/lobby)
+"aoq" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/courtroomdandp)
"aor" = (/obj/machinery/door/airlock/maintenance{name = "Security Maintenance"; req_access_txt = "63"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aos" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aos" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby)
"aot" = (/obj/machinery/door/airlock/external{name = "Escape Pod"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"aou" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/shuttle/floor,/area/shuttle/pod_3)
"aov" = (/turf/simulated/floor/plating,/area/maintenance/fsmaint)
@@ -753,20 +753,20 @@
"aoy" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/pod_3)
"aoz" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/pod_3)
"aoA" = (/turf/simulated/shuttle/wall,/area/shuttle/siberia)
-"aoB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/prisonershuttle)
+"aoB" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
"aoC" = (/turf/simulated/shuttle/floor,/area/shuttle/siberia)
"aoD" = (/obj/machinery/mineral/labor_claim_console{machinedir = 1; pixel_x = 30; pixel_y = 0},/turf/simulated/shuttle/floor,/area/shuttle/siberia)
"aoE" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/siberia)
"aoF" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/flasher{id = "gulagshuttleflasher"; pixel_x = 25},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/shuttle/floor,/area/shuttle/siberia)
"aoG" = (/obj/structure/closet/crate,/turf/simulated/shuttle/floor,/area/shuttle/siberia)
-"aoH" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/table,/obj/item/weapon/storage/box/prisoner,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
-"aoI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
-"aoJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
-"aoK" = (/obj/machinery/light,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
+"aoH" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/lobby)
+"aoI" = (/obj/machinery/light_switch{pixel_x = -25},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/table,/turf/simulated/floor/plasteel,/area/security/processing)
+"aoJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/security/processing)
+"aoK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel,/area/security/processing)
"aoL" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
-"aoM" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
-"aoN" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
-"aoO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
+"aoM" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "Prisoner Processing APC"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing)
+"aoN" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{name = "Security Office APC"; pixel_y = -24},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/main)
+"aoO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/security/courtroomdandp)
"aoP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
"aoQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
"aoR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/brig)
@@ -787,7 +787,7 @@
"apg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
"aph" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
"api" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/brig)
-"apj" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/brig)
+"apj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/door_timer/cell_3{dir = 8; id = "Cell 6"; layer = 4; name = "Cell 6"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
"apk" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/security/brig)
"apl" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"apm" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
@@ -799,12 +799,12 @@
"aps" = (/turf/space,/turf/simulated/shuttle/wall{dir = 8; icon_state = "diagonalWall3"},/area/shuttle/syndicate_elite)
"apt" = (/obj/machinery/door/airlock/shuttle{id_tag = "s_docking_airlock"; name = "Labor Shuttle Airlock"; req_access_txt = "2"},/obj/docking_port/mobile{dir = 8; dwidth = 2; height = 5; id = "laborcamp"; name = "labor camp shuttle"; rebuildable = 1; width = 9},/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 5; id = "laborcamp_home"; name = "fore bay 1"; width = 9},/turf/simulated/shuttle/floor,/area/shuttle/siberia)
"apu" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/security/prisonershuttle)
-"apv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
+"apv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_timer/cell_1{dir = 4; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
"apw" = (/turf/simulated/wall/r_wall,/area/security/prisonershuttle)
-"apx" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/prisonershuttle)
-"apy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Prisoner Processing"; req_access_txt = "1"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
-"apz" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable,/turf/simulated/floor/plating,/area/security/prisonershuttle)
-"apA" = (/turf/simulated/wall,/area/security/prisonershuttle)
+"apx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/machinery/door_timer/cell_3{dir = 8; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
+"apy" = (/turf/simulated/floor/plasteel,/area/security/lobby)
+"apz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/table,/obj/item/weapon/book/manual/security_space_law,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
+"apA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/security/courtroomdandp)
"apB" = (/turf/simulated/wall,/area/security/prison/cell_block/B)
"apC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigWest"; name = "Brig"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
"apD" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigWest"; name = "Brig"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
@@ -812,15 +812,15 @@
"apF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/security/prison/cell_block/A)
"apG" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigEast"; name = "Brig"; req_access_txt = "63"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
"apH" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "BrigEast"; name = "Brig"; req_access_txt = "63"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"apI" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/lobby)
-"apJ" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/lobby)
-"apK" = (/turf/simulated/wall,/area/security/brig)
-"apL" = (/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 1; icon_state = "rightsecure"; name = "Secure Door"; req_access_txt = "63"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/brig)
-"apM" = (/obj/machinery/door/window/brigdoor{dir = 1; req_access_txt = "63"},/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/brig)
-"apN" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; name = "Brig"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/lobby)
-"apO" = (/turf/simulated/wall,/area/security/prison/cell_block/C)
-"apP" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "Temporary Detainment"; name = "Temporary Detainment"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"apQ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "Temporary Detainment"; name = "Temporary Detainment"; req_access_txt = "2"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
+"apI" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/stool/bed/chair,/obj/machinery/power/apc{dir = 4; name = "Courtroom Prosecution and Defense"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/courtroomdandp)
+"apJ" = (/obj/structure/stool/bed/chair,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plasteel,/area/security/courtroomdandp)
+"apK" = (/obj/machinery/computer/secure_data,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/lobby)
+"apL" = (/obj/item/device/radio/intercom/department/security{pixel_x = 28; pixel_y = 5},/obj/item/device/radio/intercom{pixel_x = 28; pixel_y = -10},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby)
+"apM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/security/lobby)
+"apN" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/security/lobby)
+"apO" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel,/area/security/processing)
+"apP" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/security/processing)
+"apQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/security/processing)
"apR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/security/detectives_office)
"apS" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/detectives_office)
"apT" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/detectives_office)
@@ -836,44 +836,44 @@
"aqd" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/shuttle/siberia)
"aqe" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/siberia)
"aqf" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/siberia)
-"aqg" = (/obj/structure/closet/emcloset,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/item/device/radio/intercom/department/security{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/prisonershuttle)
-"aqh" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle)
-"aqi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
-"aqj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle)
-"aqk" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle)
-"aql" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/prisonershuttle)
-"aqm" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/prisonershuttle)
+"aqg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing)
+"aqh" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"aqi" = (/obj/machinery/light{dir = 1},/obj/machinery/power/apc{dir = 1; name = "Detective APC"; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table/woodentable,/obj/item/weapon/storage/photo_album{pixel_y = -10},/obj/item/device/camera_film,/obj/item/device/camera_film,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"aqj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/newscaster{pixel_y = 30},/obj/machinery/camera{c_tag = "Brig Main Hall 2"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
+"aqk" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced,/obj/item/weapon/folder{pixel_x = -4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/courtroomdandp)
+"aql" = (/turf/simulated/wall/r_wall,/area/security/courtroomdandp)
+"aqm" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/obj/machinery/door/window/brigdoor/southleft{req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/courtroomdandp)
"aqn" = (/obj/structure/closet/secure_closet/brig{id = "Cell 6"; name = "Cell 6 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 6"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/B)
"aqo" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B)
"aqp" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/prison/cell_block/B)
-"aqq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
+"aqq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5; level = 1},/obj/structure/table/woodentable,/obj/structure/window/reinforced,/obj/item/weapon/folder{pixel_x = -4},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/courtroomdandp)
"aqr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
"aqs" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
"aqt" = (/obj/structure/closet/secure_closet/brig{id = "Cell 3"; name = "Cell 3 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 3"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A)
"aqu" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
"aqv" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"aqw" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"aqx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
+"aqw" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table/woodentable,/obj/structure/window/reinforced,/obj/item/weapon/folder/red,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/courtroomdandp)
+"aqx" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced,/obj/item/weapon/folder/red,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/courtroomdandp)
"aqy" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
"aqz" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
"aqA" = (/obj/structure/closet/secure_closet/brig{id = "Cell 1"; name = "Cell 1 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 1"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A)
-"aqB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/lobby)
-"aqC" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/lobby)
-"aqD" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/brig)
-"aqE" = (/obj/machinery/computer/station_alert/security,/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/brig)
-"aqF" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/brig)
-"aqG" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/security/brig)
-"aqH" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/lobby)
-"aqI" = (/obj/structure/table,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"aqJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"aqK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"aqL" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
+"aqB" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/security/lobby)
+"aqC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B)
+"aqD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
+"aqE" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/security/processing)
+"aqF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall,/area/security/processing)
+"aqG" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/security/lobby)
+"aqH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/stool/bed/chair/office/dark,/obj/machinery/door_control{desc = "A remote control switch for the brig foyer."; id = "BrigFoyer"; name = "Brig Foyer Doors"; normaldoorcontrol = 1; pixel_x = -5; pixel_y = -35; range = 10; req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/lobby)
+"aqI" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/processing)
+"aqJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing)
+"aqK" = (/obj/structure/table,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel,/area/security/processing)
+"aqL" = (/turf/simulated/wall/r_wall,/area/crew_quarters/courtroom)
"aqM" = (/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Brig Detective's Office"; dir = 2; network = list("SS13")},/obj/structure/bookcase,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
"aqN" = (/obj/structure/closet/secure_closet/detective,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
"aqO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/briefcase,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"aqP" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"aqP" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/courtroom)
"aqQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"aqR" = (/obj/machinery/light{dir = 1},/obj/machinery/power/apc{dir = 1; name = "Detective APC"; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table/woodentable,/obj/item/weapon/storage/photo_album{pixel_y = -10},/obj/item/device/camera_film,/obj/item/device/camera_film,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"aqR" = (/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
"aqS" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"aqT" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"aqU" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
@@ -882,21 +882,21 @@
"aqX" = (/obj/effect/decal/cleanable/cobweb2,/obj/machinery/atmospherics/unary/portables_connector{layer = 2},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"aqY" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "security_airlock"; pixel_x = -25; req_access_txt = "13"; tag_airpump = "security_pump"; tag_chamber_sensor = "security_sensor"; tag_exterior_door = "security_outer"; tag_interior_door = "security_inner"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"aqZ" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space)
-"ara" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/shuttle/abandoned)
+"ara" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/abandoned)
"arb" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/shuttle/abandoned)
-"arc" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/shuttle/abandoned)
+"arc" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/abandoned)
"ard" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"are" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f9"; icon_state = "swall_f9"},/area/shuttle/abandoned)
"arf" = (/obj/machinery/sleeper{dir = 8},/obj/machinery/light{dir = 1},/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"arg" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f5"; icon_state = "swall_f5"},/area/shuttle/abandoned)
-"arh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
-"ari" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
-"arj" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prisonershuttle)
+"arh" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"ari" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby)
+"arj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/lobby)
"ark" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/B)
"arl" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B)
"arm" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 8; id = "Cell 6"; name = "Cell 6"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
"arn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"aro" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
+"aro" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/lobby)
"arp" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
"arq" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A)
"arr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
@@ -906,20 +906,20 @@
"arv" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 1"; name = "Cell 1"; req_access_txt = "2"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
"arw" = (/obj/machinery/light/small{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A)
"arx" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"ary" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
-"arz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby)
-"arA" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/security/brig)
-"arB" = (/obj/machinery/computer/secure_data,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/brig)
-"arC" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/brig)
-"arD" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/brig)
-"arE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
-"arF" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby)
-"arG" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison/cell_block/C)
-"arH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"arI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"arJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"arK" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Prison Cell Block C APC"; pixel_x = 25},/obj/machinery/camera{c_tag = "Brig Temporary Detainment"; dir = 8; pixel_x = 0; pixel_y = -22; network = list("SS13")},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"arL" = (/obj/machinery/light_switch{pixel_x = -25; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"ary" = (/turf/simulated/floor/plasteel,/area/security/processing)
+"arz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B)
+"arA" = (/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
+"arB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
+"arC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing)
+"arD" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/processing)
+"arE" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/security/lobby)
+"arF" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/table/reinforced{tag = "icon-table"; icon_state = "table"},/obj/machinery/door/window/brigdoor/southleft{req_access_txt = "63"},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/security/lobby)
+"arG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/security/processing)
+"arH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/hologram/holopad,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel,/area/security/processing)
+"arI" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/courtroom)
+"arJ" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"arK" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"arL" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/machinery/door/window/westright{dir = 1; name = "Judge Committee"; req_access = null; req_access_txt = "63"},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom)
"arM" = (/turf/simulated/floor/carpet,/area/security/detectives_office)
"arN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/security/detectives_office)
"arO" = (/obj/structure/table/woodentable,/obj/machinery/requests_console{name = "Detective Requests Console"; pixel_x = 30},/obj/item/device/camera{name = "detectives camera"; desc = "A one use - polaroid camera. 30 photos left."; pixel_x = 0; pixel_y = 0; pictures_left = 30},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
@@ -930,35 +930,35 @@
"arT" = (/turf/simulated/floor/plating/airless,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk13"; icon_state = "catwalk13"},/area/solar/auxstarboard)
"arU" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk6"; icon_state = "catwalk6"},/area/solar/auxstarboard)
"arV" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk13"; icon_state = "catwalk13"},/area/solar/auxstarboard)
-"arW" = (/obj/machinery/sleep_console{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
-"arX" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/prisonershuttle)
-"arY" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
-"arZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
-"asa" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/security/prisonershuttle)
-"asb" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prisonershuttle)
+"arW" = (/obj/machinery/sleeper/upgraded{dir = 4},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
+"arX" = (/obj/structure/table/woodentable,/obj/item/weapon/folder/red,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom)
+"arY" = (/obj/structure/stool/bed/chair,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/processing)
+"arZ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Prisoner Cell Block B APC"; pixel_x = -24; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
+"asa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/power/apc{dir = 4; name = "Prison Cell Block A APC"; pixel_x = 26; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
+"asb" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
"asc" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 6"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/B)
"asd" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/treadmill_monitor{id = "Cell 6"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B)
"ase" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/prison/cell_block/B)
-"asf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
+"asf" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/lobby)
"asg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
"ash" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
"asi" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 3"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A)
"asj" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/treadmill_monitor{id = "Cell 3"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
"ask" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"asl" = (/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
+"asl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{dir = 8},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Security Lobby APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/flag/nt,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
"asm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
"asn" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
"aso" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/power/treadmill{dir = 8},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/treadmill_monitor{id = "Cell 1"; pixel_y = -32},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
"asp" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 1"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A)
-"asq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
-"asr" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/brig)
-"ass" = (/obj/machinery/computer/security{network = list("SS13","Research Outpost","Mining Outpost")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/brig)
-"ast" = (/obj/machinery/door_control{desc = "A remote control switch for the brig foyer."; id = "BrigFoyer"; name = "Brig Foyer Doors"; normaldoorcontrol = 1; pixel_x = -5; pixel_y = -35; range = 10},/obj/machinery/door_control{desc = "A remote control switch for the brig doors leading to cells 1-4."; id = "BrigEast"; name = "Brig Cells 1-4 Hallway Doors"; normaldoorcontrol = 1; pixel_x = 5; pixel_y = -25; range = 10},/obj/machinery/door_control{desc = "A remote control switch for the brig doors leading to cells 5 and 6."; id = "BrigWest"; name = "Brig Cells 5-6 Hallway Doors"; normaldoorcontrol = 1; pixel_x = -5; pixel_y = -25; range = 20},/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/item/device/radio/intercom/department/security{pixel_x = 28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redfull"; tag = "icon-redfull (NORTHWEST)"},/area/security/brig)
-"asu" = (/obj/structure/sign/poster/legit{pixel_x = 32},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby)
-"asv" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/lobby)
-"asw" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison/cell_block/C)
-"asx" = (/obj/machinery/door/window/brigdoor{dir = 2; name = "Secure Door"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"asy" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison/cell_block/C)
+"asq" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing)
+"asr" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/security/processing)
+"ass" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/courtroom)
+"ast" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"asu" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/lobby)
+"asv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/security/main)
+"asw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/camera{c_tag = "Brig Main Hall 1"; dir = 2; network = list("SS13")},/obj/machinery/hologram/holopad,/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
+"asx" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/folder/blue{pixel_x = 5},/obj/item/device/megaphone,/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom)
+"asy" = (/obj/structure/table,/obj/item/weapon/storage/box/evidence,/obj/item/weapon/storage/box/evidence,/obj/item/weapon/storage/box/evidence,/turf/simulated/floor/plasteel,/area/security/processing)
"asz" = (/obj/item/weapon/storage/secure/safe{pixel_x = -23},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
"asA" = (/obj/structure/stool,/turf/simulated/floor/carpet,/area/security/detectives_office)
"asB" = (/obj/structure/table/woodentable,/obj/structure/noticeboard{pixel_x = 30; pixel_y = 0},/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/restraints/handcuffs,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
@@ -978,28 +978,28 @@
"asP" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_r (WEST)"; icon_state = "burst_r"; dir = 8},/turf/space,/area/shuttle/abandoned)
"asQ" = (/obj/machinery/computer/med_data,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"asR" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area/shuttle/abandoned)
-"asS" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prisonershuttle)
-"asT" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prisonershuttle)
+"asS" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/security/evidence)
+"asT" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/security/processing)
"asU" = (/turf/simulated/wall/r_wall,/area/security/prison/cell_block/B)
-"asV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/door_timer/cell_3{dir = 8; id = "Cell 6"; name = "Cell 6"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
+"asV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/security/evidence)
"asW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"asX" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/obj/machinery/door_timer/cell_3{dir = 8; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"asY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_timer/cell_1{dir = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
+"asX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/evidence)
+"asY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/camera{c_tag = "Labor Shuttle Dock"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/prisonershuttle)
"asZ" = (/turf/simulated/wall/r_wall,/area/security/prison/cell_block/A)
-"ata" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable,/obj/machinery/light{dir = 8},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Security Lobby APC"; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
-"atb" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby)
-"atc" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/brig)
-"atd" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/brig)
-"ate" = (/obj/structure/table,/obj/machinery/door/firedoor,/obj/machinery/door/window/brigdoor{dir = 2; name = "Secure Door"; req_access_txt = "63"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plasteel,/area/security/brig)
-"atf" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/structure/sign/securearea,/turf/simulated/floor/plating,/area/security/brig)
-"atg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
-"ath" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby)
-"ati" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"atj" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/light{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"atk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"atl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"atm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/security/prison/cell_block/C)
-"atn" = (/obj/machinery/newscaster{pixel_x = -28; pixel_y = 1},/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{on = 0; pixel_x = -3; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/flask/detflask,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"ata" = (/obj/machinery/light_switch{pixel_y = -24},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"atb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door_timer/cell_5{dir = 8; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
+"atc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/door_timer/cell_2{dir = 4; layer = 4; pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
+"atd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door_timer/cell_4{dir = 8; layer = 4; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
+"ate" = (/obj/structure/disposalpipe/segment{name = "Sorting Office"},/obj/structure/reagent_dispensers/peppertank{pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
+"atf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
+"atg" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/glass_security{name = "Equipment Storage"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/seceqstorage)
+"ath" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/security/lobby)
+"ati" = (/obj/machinery/camera{c_tag = "Brig Lobby"; dir = 8; pixel_x = 0; pixel_y = -22; network = list("SS13")},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby)
+"atj" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"atk" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"atl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; initialize_directions = 10; level = 1},/obj/structure/window/reinforced{dir = 1; layer = 2.9},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"atm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/door/window/westright{dir = 8; name = "Witness Stand"},/obj/structure/window/reinforced{dir = 1; layer = 2.9},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"atn" = (/obj/machinery/newscaster{pixel_x = -28; pixel_y = 1},/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{on = 0; pixel_x = -3; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/flask/detflask,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
"ato" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/table/woodentable,/turf/simulated/floor/carpet,/area/security/detectives_office)
"atp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/table/woodentable,/obj/machinery/media/receiver/boombox,/turf/simulated/floor/carpet,/area/security/detectives_office)
"atq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/security/detectives_office)
@@ -1026,7 +1026,7 @@
"atL" = (/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/wood,/area/maintenance/abandonedbar)
"atM" = (/obj/structure/table/woodentable,/obj/item/trash/candle,/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
"atN" = (/obj/item/stack/rods,/turf/space,/area/space)
-"atO" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prisonershuttle)
+"atO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/carpet,/area/security/detectives_office)
"atP" = (/obj/structure/closet/secure_closet/brig{id = "Cell 5"; name = "Cell 5 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 5"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/B)
"atQ" = (/obj/structure/closet/secure_closet/brig{id = "Cell 4"; name = "Cell 4 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 4"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A)
"atR" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall,/area/security/prison/cell_block/B)
@@ -1035,19 +1035,19 @@
"atU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B)
"atV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
"atW" = (/obj/structure/closet/secure_closet/brig{id = "Cell 2"; name = "Cell 2 Locker"},/obj/machinery/camera{c_tag = "Brig Cell 2"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A)
-"atX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
-"atY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/security/lobby)
-"atZ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/lobby)
-"aua" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/lobby)
-"aub" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/lobby)
-"auc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/security/lobby)
-"aud" = (/obj/machinery/camera{c_tag = "Brig Lobby"; dir = 8; pixel_x = 0; pixel_y = -22; network = list("SS13")},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby)
-"aue" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"auf" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"aug" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"auh" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"aui" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/computer/security/wooden_tv{network = list("SS13","Research Outpost","Mining Outpost")},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"auj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/landmark/start{name = "Detective"},/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/simulated/floor/carpet,/area/security/detectives_office)
+"atX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"atY" = (/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/apc{dir = 4; name = "Courtroom APC"; pixel_x = 26; pixel_y = 0},/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom)
+"atZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/folder{pixel_x = -4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom)
+"aua" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor/plasteel,/area/security/processing)
+"aub" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/processing)
+"auc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B)
+"aud" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
+"aue" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/landmark/start{name = "Detective"},/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/carpet,/area/security/detectives_office)
+"auf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/security/brig)
+"aug" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
+"auh" = (/obj/structure/reagent_dispensers/water_cooler,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby)
+"aui" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/computer/security/wooden_tv{network = list("SS13","Research Outpost","Mining Outpost")},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"auj" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
"auk" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/table/woodentable,/obj/item/ashtray/bronze,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/turf/simulated/floor/carpet,/area/security/detectives_office)
"aul" = (/obj/structure/table/woodentable,/obj/item/clothing/glasses/sunglasses,/obj/item/device/radio/intercom/department/security{pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
"aum" = (/obj/effect/decal/cleanable/generic,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
@@ -1060,13 +1060,13 @@
"aut" = (/obj/item/trash/liquidfood,/turf/simulated/floor/wood,/area/maintenance/abandonedbar)
"auu" = (/obj/structure/sink/kitchen{pixel_y = 25},/obj/machinery/light_construct/small{dir = 4},/turf/simulated/floor/wood{broken = 1; icon_state = "wood-broken"},/area/maintenance/abandonedbar)
"auv" = (/turf/simulated/floor/plating/airless,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_tool_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = -25; req_access_txt = "13"},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/auxport)
-"auw" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prisonershuttle)
-"aux" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prisonershuttle)
-"auy" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
+"auw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/security/brig)
+"aux" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/security/processing)
+"auy" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/closet/redcorp,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
"auz" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 8; id = "Cell 5"; name = "Cell 5"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"auA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
+"auA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
"auB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"auC" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
+"auC" = (/obj/effect/decal/cleanable/cobweb{dir = 2},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
"auD" = (/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/A)
"auE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
"auF" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 8; id = "Cell 4"; name = "Cell 4"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
@@ -1075,22 +1075,22 @@
"auI" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/window/brigdoor{dir = 4; id = "Cell 2"; name = "Cell 2"; req_access_txt = "2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
"auJ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
"auK" = (/obj/machinery/light/small{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A)
-"auL" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"auM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/lobby)
+"auL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{id_tag = "Brig"; name = "Interrogation Hallway"; req_access_txt = "63"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/interrogationhallway)
+"auM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/window{dir = 2},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
"auN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/security/lobby)
-"auO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/security/lobby)
-"auP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel,/area/security/lobby)
-"auQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/lobby)
-"auR" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/security/prison/cell_block/C)
-"auS" = (/obj/structure/stool/bed/chair{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"auT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"auU" = (/obj/machinery/door/airlock{name = "Toilet"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
-"auV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/window/basic,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"auW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/window/southright,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"auO" = (/turf/simulated/wall/r_wall,/area/hallway/primary/fore)
+"auP" = (/obj/structure/table/woodentable,/obj/item/device/flash,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/window/basic,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"auQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
+"auR" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Courtroom"; req_access_txt = "63"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"auS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
+"auT" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/closet{name = "Evidence Closet"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"auU" = (/obj/machinery/light_switch{pixel_x = -25},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"auV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/security/evidence)
+"auW" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
"auX" = (/obj/structure/window/basic,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"auY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/window/basic,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"auZ" = (/obj/machinery/door/window/southright,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
-"ava" = (/obj/structure/window/basic,/obj/structure/table/woodentable,/obj/item/device/flash,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/security/detectives_office)
+"auY" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"auZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
+"ava" = (/obj/structure/cable,/obj/item/device/radio/intercom{pixel_x = 28},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
"avb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"avc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"avd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
@@ -1111,30 +1111,30 @@
"avs" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/bottle/patron,/obj/item/weapon/storage/fancy/cigarettes/cigpack_shadyjims,/turf/simulated/floor/plating,/area/maintenance/abandonedbar)
"avt" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"avu" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_tool_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
-"avv" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/prisonershuttle)
-"avw" = (/obj/machinery/door_control{id = "laborexit"; name = "Exit Door"; normaldoorcontrol = 1; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/prisonershuttle)
-"avx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
+"avv" = (/obj/item/device/radio/intercom{pixel_x = -28},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
+"avw" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/lobby)
+"avx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/lobby)
"avy" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plating,/area/security/prison/cell_block/B)
-"avz" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/door_timer/cell_5,/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"avA" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable,/obj/machinery/power/apc{name = "Prison Cell Block B APC"; pixel_y = -24},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
+"avz" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/lobby)
+"avA" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/lobby)
"avB" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"avC" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_x = -28; pixel_y = -22},/obj/machinery/door_timer/cell_4{pixel_y = -30},/obj/item/device/radio/intercom{pixel_x = -28},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
-"avD" = (/obj/structure/cable,/obj/machinery/door_timer/cell_2{pixel_x = 0; pixel_y = -30},/obj/machinery/power/apc{dir = 2; name = "Prison Cell Block A APC"; pixel_x = 24; pixel_y = -24},/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
+"avC" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/light_switch{pixel_x = 26},/turf/simulated/floor/plasteel{dir = 6; icon_state = "red"},/area/security/lobby)
+"avD" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
"avE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
-"avF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/lobby)
-"avG" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/lobby)
+"avF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"avG" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
"avH" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/lobby)
-"avI" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/lobby)
+"avI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
"avJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/B)
-"avK" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/security/prison/cell_block/C)
-"avL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/closet{name = "Evidence Closet"},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/security/detectives_office)
-"avM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/security/detectives_office)
-"avN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table,/obj/structure/table,/obj/item/weapon/folder/red{pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/security/detectives_office)
-"avO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/security/detectives_office)
-"avP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/security/detectives_office)
-"avQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/security/detectives_office)
-"avR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Detective Maintenance"; req_access_txt = "4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"avS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"avK" = (/obj/structure/closet{name = "Evidence Closet"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"avL" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"avM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/security/detectives_office)
+"avN" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/wall/r_wall,/area/security/evidence)
+"avO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 1},/area/security/detectives_office)
+"avP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"avQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Detective Maintenance"; req_access_txt = "4"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
+"avR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/brig)
+"avS" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Courtroom"},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/clownoffice)
"avT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall,/area/crew_quarters/mrchangs)
"avU" = (/turf/simulated/wall,/area/crew_quarters/mrchangs)
"avV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/civilian/barber)
@@ -1155,25 +1155,25 @@
"awk" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "solar_tool_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_tool_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "solar_tool_pump"; tag_exterior_door = "solar_tool_outer"; frequency = 1379; id_tag = "solar_tool_airlock"; tag_interior_door = "solar_tool_inner"; pixel_x = 25; req_access_txt = "13"; tag_chamber_sensor = "solar_tool_sensor"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"awl" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; initialize_directions = 10},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"awm" = (/turf/simulated/wall,/area/clownoffice)
-"awn" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/door/airlock/security{id_tag = "laborexit"; name = "Labor Shuttle"; req_access_txt = "1"},/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
+"awn" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
"awo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/wall/r_wall,/area/security/prison/cell_block/B)
-"awp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/security/prison/cell_block/B)
-"awq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/security/prison/cell_block/B)
+"awp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"awq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel,/area/security/brig)
"awr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/security/prison/cell_block/A)
"aws" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/wall/r_wall,/area/security/prison/cell_block/A)
"awt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/wall/r_wall,/area/security/prison/cell_block/A)
-"awu" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/lobby)
-"awv" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/security/lobby)
-"aww" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Lobby"; req_access_txt = "0"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/security/lobby)
+"awu" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/prison/cell_block/B)
+"awv" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/security/prison/cell_block/B)
+"aww" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable,/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
"awx" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/ai_monitored/storage/eva)
-"awy" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/lobby)
-"awz" = (/turf/simulated/wall/r_wall,/area/security/prison/cell_block/C)
-"awA" = (/obj/structure/closet{name = "Evidence Closet"},/obj/machinery/light_switch{pixel_x = -25},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"awB" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"awC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"awD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
+"awy" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plating,/area/security/prison/cell_block/A)
+"awz" = (/obj/structure/disposalpipe/segment,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/lobby)
+"awA" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/security/lobby)
+"awB" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor,/area/security/lobby)
+"awC" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Lobby"; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/security/lobby)
+"awD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Courtroom Prosecution and Defense"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/courtroomdandp)
"awE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/security/detectives_office)
-"awF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"awF" = (/obj/machinery/camera{c_tag = "Brig Prisoner Processing"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = -22},/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/security/processing)
"awG" = (/obj/machinery/alarm{pixel_y = 23},/obj/structure/chickenstatue,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"awH" = (/obj/machinery/vending/chinese,/obj/machinery/light{dir = 1},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"awI" = (/obj/machinery/camera{c_tag = "Mr. Chang's"; dir = 2; network = list("SS13")},/obj/structure/chickenstatue,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
@@ -1195,16 +1195,16 @@
"awY" = (/turf/simulated/wall/r_wall,/area/maintenance/abandonedbar)
"awZ" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_tool_inner"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"axa" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
-"axb" = (/obj/structure/table/woodentable,/obj/item/seeds/bananaseed,/turf/simulated/floor/wood,/area/clownoffice)
-"axc" = (/obj/structure/table/woodentable,/obj/item/weapon/stamp/clown,/turf/simulated/floor/wood,/area/clownoffice)
-"axd" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/clownoffice)
-"axe" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/wood,/area/clownoffice)
-"axf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/wood,/area/clownoffice)
-"axg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/clown{name = "Clown's Office"; req_access_txt = "46"},/turf/simulated/floor/plasteel,/area/clownoffice)
+"axb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
+"axc" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"axd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table,/obj/item/weapon/folder/red{pixel_y = 3},/obj/item/weapon/hand_labeler,/obj/item/weapon/storage/box/evidence,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
+"axe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
+"axf" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"axg" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
"axh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
-"axi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"axj" = (/obj/machinery/camera{c_tag = "Fore Primary Hallway West"; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
-"axk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"axi" = (/obj/machinery/light,/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"axj" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/machinery/camera{c_tag = "Courtroom Judge Committee"; dir = 8; network = list("Toxins","Research","SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/crew_quarters/courtroom)
+"axk" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
"axl" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
"axm" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
"axn" = (/obj/machinery/camera{c_tag = "Fore Primary Hallway North"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
@@ -1212,20 +1212,20 @@
"axp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
"axq" = (/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
"axr" = (/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
-"axs" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
-"axt" = (/obj/structure/table,/obj/item/weapon/book/manual/security_space_law{pixel_x = -3; pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
+"axs" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"axt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/brig)
"axu" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
-"axv" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
-"axw" = (/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
-"axx" = (/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
-"axy" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"axz" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"axA" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"axB" = (/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
+"axv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/vending/coffee,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"axw" = (/obj/structure/table/woodentable,/obj/item/weapon/stamp/clown,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/wood,/area/clownoffice)
+"axx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"axy" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel,/area/security/prisonershuttle)
+"axz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"axA" = (/obj/structure/sign/poster/legit{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
+"axB" = (/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 4},/area/hallway/primary/fore)
"axC" = (/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
"axD" = (/obj/machinery/computer/med_data,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
"axE" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/security/detectives_office)
-"axF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"axF" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/clownoffice)
"axG" = (/obj/structure/stool/bed/chair/wood/wings,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"axH" = (/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"axI" = (/obj/structure/stool/bed/chair/wood/wings,/obj/machinery/power/apc{dir = 4; name = "Chinese Restaurant APC"; pixel_x = 27; pixel_y = 2},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
@@ -1242,31 +1242,31 @@
"axT" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_tool_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "13"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"axU" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air{filled = 0.05},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"axV" = (/turf/simulated/wall,/area/maintenance/fpmaint2)
-"axW" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Clown"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 8; name = "Clown Office APC"; pixel_x = -24},/turf/simulated/floor/wood,/area/clownoffice)
-"axX" = (/obj/structure/table/woodentable,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/device/flashlight/lamp/bananalamp,/turf/simulated/floor/wood,/area/clownoffice)
-"axY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/wood,/area/clownoffice)
-"axZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/wood,/area/clownoffice)
-"aya" = (/obj/item/flag/clown,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/wood,/area/clownoffice)
-"ayb" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/clownoffice)
-"ayc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"axW" = (/obj/item/flag/clown,/turf/simulated/floor/wood,/area/clownoffice)
+"axX" = (/obj/machinery/photocopier,/obj/structure/sign/poster/legit{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
+"axY" = (/obj/structure/clownstatue,/turf/simulated/floor/wood,/area/clownoffice)
+"axZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/wood,/area/clownoffice)
+"aya" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/clownoffice)
+"ayb" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/bananalamp,/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/wood,/area/clownoffice)
+"ayc" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Clown"},/turf/simulated/floor/wood,/area/clownoffice)
"ayd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aye" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"ayf" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"ayg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"ayh" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"ayi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"ayj" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 1; location = "Security"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"ayk" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aye" = (/turf/simulated/floor/wood,/area/clownoffice)
+"ayf" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/clownoffice)
+"ayg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"ayh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"ayi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"ayj" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"ayk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonershuttle)
"ayl" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
"aym" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
"ayn" = (/obj/machinery/atm{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"ayo" = (/obj/structure/table,/obj/item/weapon/storage/box/evidence,/obj/machinery/light,/obj/machinery/camera{c_tag = "Brig Detective's Office Evidence Processing"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"ayp" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"ayq" = (/obj/machinery/photocopier,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
+"ayo" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"ayp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"ayq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
"ayr" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
"ays" = (/obj/effect/decal/cleanable/dirt,/obj/item/device/radio/intercom/department/security{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
"ayt" = (/obj/machinery/light,/obj/machinery/computer/secure_data,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/detectives_office)
-"ayu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"ayu" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (EAST)"; icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
"ayv" = (/obj/structure/table/woodentable,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"ayw" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"ayx" = (/obj/structure/table/woodentable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
@@ -1287,23 +1287,23 @@
"ayM" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"ayN" = (/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"ayO" = (/obj/structure/stool/bed,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plating,/area/maintenance/fpmaint2)
-"ayP" = (/obj/machinery/camera{c_tag = "Clown's Office"; dir = 4; network = list("SS13")},/turf/simulated/floor/wood,/area/clownoffice)
-"ayQ" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/clownoffice)
-"ayR" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/turf/simulated/floor/wood,/area/clownoffice)
-"ayS" = (/obj/structure/rack,/obj/item/clothing/under/rank/clown,/obj/item/weapon/storage/backpack/clown,/obj/item/clothing/mask/gas/clown_hat,/obj/item/clothing/shoes/clown_shoes,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/wood,/area/clownoffice)
-"ayT" = (/obj/machinery/light,/obj/structure/clownstatue,/turf/simulated/floor/wood,/area/clownoffice)
-"ayU" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"ayV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"ayW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"ayP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"ayQ" = (/obj/machinery/hologram/holopad,/obj/structure/disposalpipe/segment{dir = 4},/mob/living/simple_animal/bot/secbot/beepsky{name = "Officer Beepsky"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"ayR" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"ayS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/wood,/area/clownoffice)
+"ayT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/wood,/area/clownoffice)
+"ayU" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"ayV" = (/obj/machinery/power/apc{dir = 8; name = "Clown Office APC"; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera{c_tag = "Engineering Equipment West"; dir = 4; network = list("SS13")},/turf/simulated/floor/wood,/area/clownoffice)
+"ayW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/alarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/clownoffice)
"ayX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"ayY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"ayY" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/courtroomdandp)
"ayZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
-"aza" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"aza" = (/obj/structure/rack,/obj/item/clothing/under/rank/clown,/obj/item/weapon/storage/backpack/clown,/obj/item/clothing/mask/gas/clown_hat,/obj/item/clothing/shoes/clown_shoes,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/wood,/area/clownoffice)
"azb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
"azc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light,/obj/machinery/alarm{dir = 1; pixel_y = -25},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"azd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"azd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/wall/r_wall,/area/security/prisonershuttle)
"aze" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
-"azf" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"azf" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/wall/r_wall,/area/security/prisonershuttle)
"azg" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
"azh" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=EVA"; location = "Security"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
"azi" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/hallway/primary/fore)
@@ -1380,7 +1380,7 @@
"aAB" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "magistrate"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/magistrateoffice)
"aAC" = (/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
"aAD" = (/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 32},/obj/structure/closet/lawcloset,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
-"aAE" = (/obj/structure/table,/obj/item/weapon/book/manual/sop_security,/turf/simulated/floor/plasteel,/area/security/main)
+"aAE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/lobby)
"aAF" = (/obj/machinery/photocopier,/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = 27},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
"aAG" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
"aAH" = (/obj/machinery/vending/coffee,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{tag = "icon-cult"; icon_state = "cult"; dir = 2},/area/lawoffice)
@@ -1395,7 +1395,7 @@
"aAQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"aAR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"aAS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aAT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"aAT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/security/lobby)
"aAU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"aAV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
"aAW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/mrchangs)
@@ -2022,7 +2022,7 @@
"aMT" = (/obj/machinery/camera{c_tag = "Bar Storage"; network = list("SS13")},/obj/structure/table/woodentable,/obj/machinery/reagentgrinder,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aMU" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/shaker,/obj/item/weapon/gun/projectile/revolver/doublebarrel,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/obj/item/weapon/storage/fancy/candle_box/eternal,/obj/item/weapon/storage/fancy/candle_box/eternal,/obj/item/weapon/storage/fancy/candle_box/eternal,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aMV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
-"aMW" = (/obj/effect/spawner/window/reinforced,/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
+"aMW" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"aMX" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"aMY" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"aMZ" = (/obj/machinery/atmospherics/binary/valve,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
@@ -2033,13 +2033,13 @@
"aNe" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "maint1"; name = "Blast Door"; opacity = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aNf" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/maintenance/fsmaint2)
"aNg" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/maintenance/fsmaint2)
-"aNh" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/arrival/station)
+"aNh" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/abandoned)
"aNi" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/arrival/station)
"aNj" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"aNk" = (/obj/structure/window/full/shuttle{icon_state = "window4"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/arrival/station)
"aNl" = (/obj/structure/window/full/shuttle{icon_state = "window8"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/arrival/station)
"aNm" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/arrival/station)
-"aNn" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/arrival/station)
+"aNn" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/abandoned)
"aNo" = (/obj/machinery/camera{c_tag = "Arrivals East"; dir = 8; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry)
"aNp" = (/obj/structure/closet/secure_closet/security,/obj/machinery/light{dir = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/checkpoint2)
"aNq" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/checkpoint2)
@@ -2105,7 +2105,7 @@
"aOy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/maintenance/fsmaint2)
"aOz" = (/obj/machinery/mass_driver{dir = 4; id_tag = "chapelgun"},/obj/machinery/door/window{dir = 8; name = "Mass Driver"; req_access_txt = "22"},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/maintenance/fsmaint2)
"aOA" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/maintenance/fsmaint2)
-"aOB" = (/obj/machinery/door/poddoor{id_tag = "chapelgun"; name = "Chapel Launcher Door"; protected = 0},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
+"aOB" = (/obj/machinery/door/poddoor{id_tag = "chapelgun"; name = "Chapel Launcher Door"; protected = 0},/obj/structure/fans/tiny,/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aOC" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"aOD" = (/turf/simulated/shuttle/wall{icon_state = "swall11"; dir = 2},/area/shuttle/arrival/station)
"aOE" = (/obj/effect/landmark{name = "HONKsquad"},/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
@@ -2132,7 +2132,7 @@
"aOZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
"aPa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock{name = "Garden"; req_access_txt = "0"},/turf/simulated/floor/plating,/area/hallway/secondary/construction{name = "\improper Garden"})
"aPb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/storage/primary)
-"aPc" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/storage/primary)
+"aPc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/security/brig)
"aPd" = (/turf/simulated/floor/plasteel,/area/storage/primary)
"aPe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/storage/primary)
"aPf" = (/obj/machinery/lapvend,/turf/simulated/floor/plasteel,/area/storage/primary)
@@ -2302,7 +2302,7 @@
"aSn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
"aSo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/table/glass,/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/weapon/plantspray/pests,/obj/item/weapon/reagent_containers/glass/fertilizer/ez,/obj/item/weapon/reagent_containers/glass/fertilizer/rh,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 4},/area/hallway/secondary/construction{name = "\improper Garden"})
"aSp" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor/plasteel,/area/storage/primary)
-"aSq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/storage/primary)
+"aSq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Evidence Storage"; req_access = null; req_access_txt = "4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
"aSr" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/plasteel,/area/storage/primary)
"aSs" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/stool,/turf/simulated/floor/plasteel,/area/crew_quarters/fitness)
"aSt" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/storage/primary)
@@ -2334,7 +2334,7 @@
"aST" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/sign/securearea{desc = "Under the painting a plaque reads: 'While the meat grinder may not have spared you, fear not. Not one part of you has gone to waste... You were delicious.'"; icon_state = "monkey_painting"; name = "Mr. Deempisi portrait"; pixel_x = -28; pixel_y = 4},/obj/structure/reagent_dispensers/beerkeg,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aSU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aSV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/door/window/southleft{tag = "icon-left (WEST)"; name = "Bar Delivery"; icon_state = "left"; dir = 8; req_access_txt = "25"; base_state = "left"},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/plasteel,/area/crew_quarters/bar)
-"aSW" = (/obj/machinery/hologram/holopad,/mob/living/simple_animal/bot/secbot/beepsky{name = "Officer Beepsky"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"aSW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/security/lobby)
"aSX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aSY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
"aSZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/fsmaint2)
@@ -2392,7 +2392,7 @@
"aTZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
"aUa" = (/obj/machinery/atm{pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
"aUb" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/device/analyzer,/turf/simulated/floor/plasteel,/area/storage/primary)
-"aUc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/storage/primary)
+"aUc" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/security/lobby)
"aUd" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/storage/primary)
"aUe" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plasteel,/area/storage/primary)
"aUf" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/clothing/gloves/color/fyellow,/turf/simulated/floor/plasteel,/area/storage/primary)
@@ -2416,7 +2416,7 @@
"aUx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/camera{c_tag = "EVA Southeast"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel,/area/ai_monitored/storage/eva)
"aUy" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aUz" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"aUA" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/hallway/primary/central/north)
+"aUA" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/hallway/primary/central/north)
"aUB" = (/obj/machinery/light{dir = 1},/obj/machinery/camera{c_tag = "Central Hallway North"; dir = 2; network = list("SS13")},/obj/machinery/alarm{pixel_y = 23},/obj/item/flag/nt,/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/hallway/primary/central/north)
"aUC" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "bluecorner"},/area/hallway/primary/central/north)
"aUD" = (/turf/simulated/floor/plasteel,/area/hallway/primary/central/north)
@@ -2466,7 +2466,7 @@
"aVv" = (/obj/structure/closet/coffin,/obj/machinery/door/window/eastleft{dir = 8; name = "Coffin Storage"; req_access_txt = "22"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
"aVw" = (/obj/item/weapon/storage/bible,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 4; icon_state = "chapel"},/area/chapel/main)
"aVx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel,/area/escapepodbay)
-"aVy" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/arrival/station)
+"aVy" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/trade/sol)
"aVz" = (/turf/simulated/shuttle/wall{icon_state = "swall13"; dir = 2},/area/shuttle/arrival/station)
"aVA" = (/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"aVB" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
@@ -2480,7 +2480,7 @@
"aVJ" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/construction{name = "\improper Garden"})
"aVK" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Garden"},/turf/simulated/floor/plasteel,/area/hallway/secondary/construction{name = "\improper Garden"})
"aVL" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/storage/primary)
-"aVM" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/storage/primary)
+"aVM" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/clown{name = "Clown's Office"; req_access_txt = "46"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/wood,/area/clownoffice)
"aVN" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/storage/primary)
"aVO" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/storage/primary)
"aVP" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/firedoor{dir = 2},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/hallway/primary/port)
@@ -2553,7 +2553,7 @@
"aXe" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/engine,/area/escapepodbay)
"aXf" = (/obj/machinery/light,/turf/simulated/floor/engine,/area/escapepodbay)
"aXg" = (/obj/structure/spacepoddoor{luminosity = 3},/obj/machinery/door/poddoor/multi_tile/four_tile_ver{id_tag = "escapepodbay"; layer = 3.1; req_one_access_txt = "13"},/turf/simulated/floor/engine,/area/escapepodbay)
-"aXh" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/arrival/station)
+"aXh" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/trade/sol)
"aXi" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/hallway/secondary/entry)
"aXj" = (/obj/structure/stool/bed/chair/comfy/beige,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry)
"aXk" = (/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/hallway/secondary/entry)
@@ -2565,7 +2565,7 @@
"aXq" = (/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"aXr" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"aXs" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"aXt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"aXt" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary)
"aXu" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"aXv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"aXw" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/port)
@@ -2662,7 +2662,7 @@
"aZj" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"aZk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"aZl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
-"aZm" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"aZm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary)
"aZn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"aZo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
"aZp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
@@ -2695,7 +2695,7 @@
"aZQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
"aZR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
"aZS" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=EVA2"; location = "Dorm"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
-"aZT" = (/obj/machinery/camera{c_tag = "Bar East"; network = list("SS13")},/obj/machinery/newscaster{pixel_y = 32},/obj/structure/flora/kirbyplants,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"aZT" = (/obj/machinery/camera{c_tag = "Bar East"; network = list("SS13")},/obj/machinery/newscaster{pixel_y = 32},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aZU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
"aZV" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Civilian"},/turf/simulated/floor/plasteel,/area/storage/primary)
"aZW" = (/obj/machinery/door/window{dir = 4; name = "Bar Door"; req_access_txt = "25"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/crew_quarters/bar)
@@ -3411,8 +3411,8 @@
"bnE" = (/obj/machinery/computer/arcade,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bnF" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bnG" = (/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bnH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
-"bnI" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/gameboard,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"bnH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/security/permabrig)
+"bnI" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/security/permabrig)
"bnJ" = (/obj/machinery/light,/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (EAST)"; icon_state = "wooden_chair_wings"; dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bnK" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/machinery/vending/dinnerware,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bnL" = (/obj/machinery/icemachine,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
@@ -3432,7 +3432,7 @@
"bnZ" = (/obj/structure/stool/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/wood,/area/library)
"boa" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/wood,/area/library)
"bob" = (/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/machinery/light/small,/turf/simulated/floor/wood,/area/library)
-"boc" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/flora/kirbyplants,/turf/simulated/floor/wood,/area/library)
+"boc" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/library)
"bod" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"boe" = (/turf/simulated/floor/carpet{icon_state = "carpetsymbol"},/area/chapel/main)
"bof" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
@@ -3485,13 +3485,13 @@
"bpa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/carpet,/area/crew_quarters/captain)
"bpb" = (/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/carpet,/area/crew_quarters/captain)
"bpc" = (/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Captain's Office APC"; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/wood,/area/crew_quarters/captain)
-"bpd" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/flora/kirbyplants,/turf/simulated/floor/wood,/area/crew_quarters/captain)
+"bpd" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"bpe" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/hallway/primary/central/ne)
"bpf" = (/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/hallway/primary/central/ne)
"bpg" = (/obj/structure/sign/directions/evac{dir = 4},/obj/structure/sign/directions/medical{dir = 4; pixel_y = 7},/obj/structure/sign/directions/science{dir = 4},/turf/simulated/wall,/area/crew_quarters/bar)
"bph" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Diner"},/turf/simulated/floor/plasteel,/area/crew_quarters/bar)
"bpi" = (/obj/structure/sign/barsign,/turf/simulated/wall,/area/crew_quarters/bar)
-"bpj" = (/obj/machinery/atm{pixel_x = 32; pixel_y = 0},/obj/structure/flora/kirbyplants,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"bpj" = (/obj/machinery/atm{pixel_x = 32; pixel_y = 0},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bpk" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west)
"bpl" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west)
"bpm" = (/obj/machinery/camera{c_tag = "Starboard Primary Hallway 2"; dir = 2; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west)
@@ -3517,7 +3517,7 @@
"bpG" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/office)
"bpH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bpI" = (/turf/simulated/floor/plasteel,/area/quartermaster/office)
-"bpJ" = (/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west)
+"bpJ" = (/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitecorner"},/area/hallway/primary/starboard/west)
"bpK" = (/obj/structure/table,/obj/machinery/requests_console{department = "Cargo Bay"; name = "Cargo Requests Console"; departmentType = 2; pixel_y = 30},/obj/item/stack/tape_roll,/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/obj/item/device/destTagger{pixel_x = 4; pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 1},/area/quartermaster/office)
"bpL" = (/obj/structure/table,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/stack/packageWrap,/obj/item/weapon/rcs,/turf/simulated/floor/plasteel{icon_state = "arrival"; dir = 5},/area/quartermaster/office)
"bpM" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 8; icon_state = "browncorner"},/area/hallway/primary/central/west)
@@ -3755,7 +3755,7 @@
"buk" = (/turf/simulated/wall/r_wall,/area/medical/morgue)
"bul" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"bum" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/hallway/primary/starboard/east)
-"bun" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
+"bun" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/east)
"buo" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/starboard/east)
"bup" = (/turf/simulated/wall/r_wall,/area/assembly/robotics)
"buq" = (/turf/simulated/floor/plasteel{dir = 10; icon_state = "purple"},/area/hallway/primary/starboard/east)
@@ -3830,7 +3830,7 @@
"bvH" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/reception)
"bvI" = (/obj/machinery/camera{c_tag = "Medbay Lobby East"; network = list("SS13")},/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
"bvJ" = (/obj/structure/stool,/obj/structure/closet/walllocker/emerglocker/north,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/reception)
-"bvK" = (/obj/machinery/newscaster{pixel_x = 30},/obj/machinery/alarm{pixel_y = 26},/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/reception)
+"bvK" = (/obj/machinery/newscaster{pixel_x = 30},/obj/machinery/alarm{pixel_y = 26},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/reception)
"bvL" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/obj/machinery/bodyscanner,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
"bvM" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/body_scanconsole,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
"bvN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera{c_tag = "Medbay Examination Room"; network = list("SS13")},/obj/structure/stool,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/medical/exam_room)
@@ -3941,9 +3941,9 @@
"bxO" = (/turf/simulated/wall,/area/medical/research{name = "Research Division"})
"bxP" = (/obj/machinery/door/airlock/research{name = "Research Division Access"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bxQ" = (/obj/structure/sign/securearea,/turf/simulated/wall,/area/medical/research{name = "Research Division"})
-"bxR" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/clothing/glasses/welding,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/toxins/lab)
+"bxR" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/sheet/metal{amount = 50},/obj/item/clothing/glasses/welding,/obj/machinery/door_control{id = "rdlab"; name = "Research and Development Lab Shutters Control"; pixel_x = -24; pixel_y = 0; req_access_txt = "47"},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/toxins/lab)
"bxS" = (/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/toxins/lab)
-"bxT" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/disk/tech_disk,/obj/item/weapon/disk/tech_disk,/obj/item/weapon/disk/design_disk,/obj/item/weapon/disk/design_disk,/obj/item/weapon/reagent_containers/dropper,/obj/machinery/door_control{id = "rdlab"; name = "Research and Development Lab Shutters Control"; pixel_x = 24; pixel_y = 24; req_access_txt = "47"},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/toxins/lab)
+"bxT" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/disk/tech_disk,/obj/item/weapon/disk/tech_disk,/obj/item/weapon/disk/design_disk,/obj/item/weapon/disk/design_disk,/obj/item/weapon/reagent_containers/dropper,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/toxins/lab)
"bxU" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"bxV" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"bxW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
@@ -4020,7 +4020,7 @@
"bzp" = (/obj/machinery/optable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/medical/morgue)
"bzq" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/medical/morgue)
"bzr" = (/obj/structure/morgue{tag = "icon-morgue1 (WEST)"; icon_state = "morgue1"; dir = 8},/obj/machinery/light/small{dir = 4},/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel,/area/medical/morgue)
-"bzs" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"bzs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/light{dir = 1; on = 1},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"bzt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/assembly/chargebay)
"bzu" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/bluegrid,/area/assembly/chargebay)
"bzv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/bluegrid,/area/assembly/chargebay)
@@ -4243,7 +4243,7 @@
"bDE" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 0},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"bDF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
"bDG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
-"bDH" = (/obj/machinery/door/poddoor{id_tag = "trash"; name = "disposal bay door"; protected = 0},/turf/simulated/floor/plating/airless,/area/maintenance/disposal)
+"bDH" = (/obj/machinery/door/poddoor{id_tag = "trash"; name = "disposal bay door"; protected = 0},/obj/structure/fans/tiny,/turf/simulated/floor/plating,/area/maintenance/disposal)
"bDI" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/storage)
"bDJ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bDK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
@@ -4359,7 +4359,7 @@
"bFQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/space,/area/space)
"bFR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/closet/secure_closet/captains,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
"bFS" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 4},/obj/machinery/camera{c_tag = "Captain's Quarters"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
-"bFT" = (/obj/structure/table/woodentable,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/item/weapon/storage/box/matches,/obj/item/weapon/reagent_containers/food/drinks/flask{pixel_x = 8},/obj/item/clothing/mask/cigarette/cigar,/obj/item/weapon/razor{pixel_x = -4; pixel_y = 2},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
+"bFT" = (/obj/structure/table/woodentable,/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/item/weapon/storage/box/matches,/obj/item/weapon/reagent_containers/food/drinks/flask/gold,/obj/item/clothing/mask/cigarette/cigar,/obj/item/weapon/razor{pixel_x = -4; pixel_y = 2},/turf/simulated/floor/carpet,/area/crew_quarters/captain/bedroom)
"bFU" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 1; icon_state = "left"; name = "Shower"; req_access_txt = "0"},/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/obj/item/weapon/soap/deluxe,/obj/item/weapon/bikehorn/rubberducky,/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/crew_quarters/captain/bedroom)
"bFV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/crew_quarters/captain)
"bFW" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/poster/legit{pixel_x = -32},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
@@ -4670,7 +4670,7 @@
"bLP" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/effect/landmark/start{name = "Head of Personnel"},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
"bLQ" = (/obj/structure/table,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/folder/yellow,/obj/item/device/eftpos,/obj/item/weapon/book/manual/sop_supply,/turf/simulated/floor/plasteel,/area/quartermaster/office)
"bLR" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
-"bLS" = (/obj/machinery/computer/guestpass,/obj/structure/table,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
+"bLS" = (/obj/machinery/computer/guestpass{pixel_y = 30},/obj/machinery/photocopier,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/lab)
"bLT" = (/obj/machinery/computer/message_monitor,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server)
"bLU" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = "0"},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server)
"bLV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/server)
@@ -4708,8 +4708,8 @@
"bMB" = (/obj/machinery/cell_charger,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 0; pixel_y = 0},/obj/machinery/camera{c_tag = "Medbay Cryogenics"; network = list("SS13")},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
"bMC" = (/obj/machinery/camera{c_tag = "Medbay Cloning"; network = list("SS13")},/obj/structure/closet/wardrobe/medic_white,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
"bMD" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
-"bME" = (/obj/machinery/disposal,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
-"bMF" = (/obj/machinery/light{dir = 8},/obj/structure/closet/secure_closet/medical1,/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/medical/genetics)
+"bME" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"bMF" = (/obj/machinery/light{dir = 8},/obj/structure/closet/secure_closet/medical1,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTHWEST)"; icon_state = "whitepurple"; dir = 9},/area/medical/genetics)
"bMG" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/camera{c_tag = "Research Genetics North"; network = list("Research","SS13")},/obj/machinery/power/apc{dir = 1; name = "Genetics APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/medical/genetics)
"bMH" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
"bMI" = (/obj/item/device/flashlight/pen,/obj/item/device/flashlight/pen,/obj/item/weapon/hand_labeler,/obj/structure/closet/walllocker/emerglocker/north,/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (NORTH)"; icon_state = "whitepurple"; dir = 1},/area/medical/genetics)
@@ -4760,7 +4760,7 @@
"bNB" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/hallway/primary/central/sw)
"bNC" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "hopqueue"; name = "Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/hallway/primary/central/sw)
"bND" = (/obj/structure/filingcabinet/chestdrawer,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/crew_quarters/heads)
-"bNE" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Personnel's Desk"; departmentType = 5; name = "Head of Personnel Requests Console"; pixel_y = -30},/obj/machinery/camera{c_tag = "Head of Personnel's Office"; dir = 1; network = list("SS13")},/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
+"bNE" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Personnel's Desk"; departmentType = 5; name = "Head of Personnel Requests Console"; pixel_y = -30},/obj/machinery/camera{c_tag = "Head of Personnel's Office"; dir = 1; network = list("SS13")},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
"bNF" = (/obj/structure/table,/obj/machinery/photocopier/faxmachine{department = "Head of Personnel's Office"},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
"bNG" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/crew_quarters/heads)
"bNH" = (/obj/machinery/blackbox_recorder,/turf/simulated/floor/bluegrid,/area/server)
@@ -4816,7 +4816,7 @@
"bOF" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/crew_quarters/hor)
"bOG" = (/obj/machinery/door_control{id = "Biohazard"; name = "Biohazard Shutter Control"; pixel_x = -4; pixel_y = 6; req_access_txt = "47"},/obj/item/weapon/folder/white{pixel_x = 4},/obj/item/weapon/stamp/rd{pixel_x = 5; pixel_y = -2},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bOH" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the RD's goons from the safety of his office."; name = "Research Monitor"; network = list("Research","Research Outpost","RD"); pixel_x = 0; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
-"bOI" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/machinery/requests_console{department = "Security"; departmentType = 3; name = "Security Requests Console"; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 2; icon_state = "redcorner"},/area/security/main)
+"bOI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
"bOJ" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/rack,/obj/item/weapon/circuitboard/aicore{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor)
"bOK" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/crew_quarters/hor)
"bOL" = (/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor)
@@ -4864,7 +4864,7 @@
"bPB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
"bPC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
"bPD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
-"bPE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics Cloning"; req_access_txt = "0"; req_one_access_txt = "5;9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"bPE" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/genetics)
"bPF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
"bPG" = (/obj/effect/landmark/start{name = "Geneticist"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
"bPH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
@@ -4872,7 +4872,7 @@
"bPJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/medical/genetics)
"bPK" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
"bPL" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
-"bPM" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
+"bPM" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
"bPN" = (/turf/simulated/wall/r_wall,/area/toxins/server_coldroom)
"bPO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/toxins/server_coldroom)
"bPP" = (/turf/simulated/wall/r_wall,/area/toxins/server)
@@ -4953,9 +4953,9 @@
"bRm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall,/area/medical/genetics_cloning)
"bRn" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable,/obj/item/roller,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
"bRo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
-"bRp" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
-"bRq" = (/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28},/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/stokcubes,/obj/item/weapon/storage/box/neaeracubes,/obj/structure/table/glass,/obj/item/weapon/storage/box/wolpincubes,/obj/item/weapon/storage/box/farwacubes,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/medical/genetics)
-"bRr" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/roller,/obj/item/weapon/storage/box/disks,/obj/structure/table/glass,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
+"bRp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = "GeneticsDoor"; name = "Genetics Cloning"; req_access_txt = "0"; req_one_access_txt = "5;9"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"bRq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"bRr" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/crew_quarters/hor)
"bRs" = (/obj/machinery/r_n_d/server/robotics,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
"bRt" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
"bRu" = (/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 1; name = "Server Coldroom APC"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
@@ -4974,7 +4974,7 @@
"bRH" = (/obj/machinery/computer/mecha,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bRI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/rack,/obj/item/device/taperecorder{pixel_x = -3},/obj/item/device/paicard{pixel_x = 4},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/crew_quarters/hor)
"bRJ" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/crew_quarters/hor)
-"bRK" = (/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/crew_quarters/hor)
+"bRK" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bRL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"bRM" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/machinery/requests_console{department = "Cargo Bay"; name = "Cargo Requests Console"; departmentType = 2; pixel_x = -30; pixel_y = 0},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
"bRN" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Shaft Miner"},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
@@ -5004,7 +5004,7 @@
"bSl" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/central/se)
"bSm" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -25; pixel_y = 0; req_access_txt = "0"},/obj/machinery/light{dir = 8},/obj/structure/stool/bed,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitered"},/area/medical/sleeper)
"bSn" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
-"bSo" = (/obj/machinery/sleep_console{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/sleeper)
+"bSo" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHWEST)"; icon_state = "whiteblue"; dir = 9},/area/security/medbay)
"bSp" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 4; icon_state = "shutter0"; id_tag = "acute1"; name = "Acute 1 Privacy Shutters"; opacity = 0},/turf/simulated/floor/plasteel{tag = "icon-whitebluefull"; icon_state = "whitebluefull"},/area/medical/sleeper)
"bSq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay2)
"bSr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay2)
@@ -5021,9 +5021,9 @@
"bSC" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/cryo)
"bSD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/genetics_cloning)
"bSE" = (/obj/machinery/clonepod/biomass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
-"bSF" = (/obj/machinery/computer/cloning,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
+"bSF" = (/turf/simulated/floor/plasteel{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/medical/genetics)
"bSG" = (/obj/machinery/dna_scannernew,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
-"bSH" = (/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/medical/genetics)
+"bSH" = (/obj/machinery/computer/cloning,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics_cloning)
"bSI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
"bSJ" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
"bSK" = (/obj/structure/stool/bed/chair/office/dark,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
@@ -5045,7 +5045,7 @@
"bTa" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bTb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bTc" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
-"bTd" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/photocopier,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
+"bTd" = (/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
"bTe" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/turf/simulated/floor/plating/airless,/area/toxins/mixing)
"bTf" = (/obj/structure/table,/turf/simulated/shuttle/floor,/area/shuttle/mining)
"bTg" = (/turf/simulated/shuttle/wall{icon_state = "swall3"; dir = 2},/area/shuttle/mining)
@@ -5114,12 +5114,12 @@
"bUr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bUs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"bUt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/crew_quarters/hor)
-"bUu" = (/obj/machinery/power/apc{dir = 8; name = "RD Office APC"; pixel_x = -25},/obj/structure/cable,/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
+"bUu" = (/obj/machinery/power/apc{dir = 8; name = "RD Office APC"; pixel_x = -25},/obj/structure/cable,/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bUv" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/photocopier/faxmachine{department = "Research Director's Office"},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bUw" = (/obj/item/weapon/cartridge/signal/toxins,/obj/item/weapon/cartridge/signal/toxins{pixel_x = -4; pixel_y = 2},/obj/item/weapon/cartridge/signal/toxins{pixel_x = 4; pixel_y = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/camera{c_tag = "Research Director's Office"; dir = 1; network = list("Research","SS13")},/obj/item/clothing/glasses/welding/superior,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bUx" = (/obj/structure/closet/secure_closet/RD,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bUy" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
-"bUz" = (/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
+"bUz" = (/obj/item/weapon/storage/box/beakers,/obj/item/weapon/storage/box/syringes,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/structure/table/glass,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
"bUA" = (/turf/simulated/wall/r_wall,/area/toxins/mixing)
"bUB" = (/obj/machinery/atmospherics/pipe/simple/insulated,/turf/simulated/wall/r_wall,/area/toxins/mixing)
"bUC" = (/turf/simulated/wall/r_wall{desc = "A specially coated wall that resists temperatures for Science"; max_temperature = 1e+009; name = "Coated Reinforced Wall"},/area/toxins/mixing)
@@ -5186,7 +5186,7 @@
"bVL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
"bVM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
"bVN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/genetics)
-"bVO" = (/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
+"bVO" = (/obj/machinery/photocopier,/turf/simulated/floor/plasteel{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bVP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/wall/r_wall,/area/toxins/server_coldroom)
"bVQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/toxins/server_coldroom)
"bVR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/toxins/server)
@@ -5222,7 +5222,7 @@
"bWv" = (/obj/structure/table,/obj/item/weapon/coin/silver,/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"bWw" = (/obj/structure/table,/obj/item/weapon/cartridge/quartermaster{pixel_x = 6; pixel_y = 5},/obj/item/weapon/cartridge/quartermaster,/obj/item/weapon/cartridge/quartermaster{pixel_x = -4; pixel_y = 7},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel,/area/quartermaster/qm)
"bWx" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"bWy" = (/obj/machinery/light{dir = 1},/obj/structure/flora/kirbyplants,/turf/simulated/floor/wood,/area/blueshield)
+"bWy" = (/obj/machinery/light{dir = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/blueshield)
"bWz" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/blueshield)
"bWA" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/wood,/area/blueshield)
"bWB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/wood,/area/blueshield)
@@ -5238,7 +5238,7 @@
"bWL" = (/obj/structure/closet/jcloset,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/janitor)
"bWM" = (/obj/structure/closet/l3closet/janitor,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor/plasteel,/area/janitor)
"bWN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/newscaster{pixel_y = 30},/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plasteel,/area/janitor)
-"bWO" = (/obj/vehicle/janicart,/turf/simulated/floor/plasteel,/area/janitor)
+"bWO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/vehicle/janicart,/turf/simulated/floor/plasteel,/area/janitor)
"bWP" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/janitor)
"bWQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/reagent_dispensers/spacecleanertank{pixel_y = 30},/turf/simulated/floor/plasteel,/area/janitor)
"bWR" = (/obj/machinery/door/window/westleft{name = "Janitoral Delivery"; req_access_txt = "26"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/janitor)
@@ -5277,7 +5277,7 @@
"bXy" = (/obj/machinery/light,/obj/machinery/camera{c_tag = "Research Genetics South"; dir = 1; network = list("Research","SS13")},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/genetics)
"bXz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/genetics)
"bXA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitepurple"},/area/medical/genetics)
-"bXB" = (/obj/machinery/light,/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (SOUTHEAST)"; icon_state = "whitepurple"; dir = 6},/area/medical/genetics)
+"bXB" = (/obj/item/roller,/obj/item/weapon/storage/box/disks,/obj/structure/table/glass,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (EAST)"; icon_state = "whitepurple"; dir = 4},/area/medical/genetics)
"bXC" = (/obj/machinery/power/apc{dir = 1; name = "Telescience Pad APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
"bXD" = (/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/engine,/area/toxins/explab_chamber)
"bXE" = (/turf/simulated/floor/engine,/area/toxins/explab_chamber)
@@ -5458,8 +5458,8 @@
"caX" = (/obj/machinery/computer/shuttle/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"caY" = (/obj/machinery/mineral/equipment_vendor,/turf/simulated/floor/plasteel{dir = 10; icon_state = "brown"},/area/quartermaster/miningdock)
"caZ" = (/obj/structure/closet/secure_closet/miner,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/miningdock)
-"cba" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"cbb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"cba" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"cbb" = (/obj/effect/decal/cleanable/dirt,/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cbc" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cbd" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cbe" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/apmaint)
@@ -5536,8 +5536,8 @@
"ccx" = (/obj/structure/table,/obj/item/weapon/storage/box/syndidonkpockets,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"ccy" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"ccz" = (/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
-"ccA" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/apmaint)
-"ccB" = (/obj/structure/reagent_dispensers/watertank,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"ccA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"ccB" = (/obj/structure/stool/bed,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"ccC" = (/obj/machinery/power/apc{dir = 2; name = "Cargo Maintenance APC"; pixel_y = -24},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"ccD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"ccE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; name = "HoP Office"; sortType = 15},/turf/simulated/floor/plating,/area/maintenance/apmaint)
@@ -5582,7 +5582,7 @@
"cdr" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/medical/medbreak)
"cds" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/medical/medbreak)
"cdt" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/wall,/area/medical/medbreak)
-"cdu" = (/obj/structure/flora/kirbyplants,/obj/machinery/door_control{id = "psychoffice"; name = "Privacy Shutters Control"; pixel_x = -25; pixel_y = 0},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/medical/psych)
+"cdu" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/door_control{id = "psychoffice"; name = "Privacy Shutters Control"; pixel_x = -25; pixel_y = 0},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/medical/psych)
"cdv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/wood,/area/medical/psych)
"cdw" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/wood,/area/medical/psych)
"cdx" = (/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/wood,/area/medical/psych)
@@ -5760,7 +5760,7 @@
"cgN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
"cgO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
"cgP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (NORTHEAST)"; icon_state = "whiteblue"; dir = 5},/area/medical/medbay2)
-"cgQ" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"cgQ" = (/obj/structure/stool/bed/chair/office/dark,/obj/item/device/radio/intercom{dir = 0; name = "station intercom (General)"; pixel_x = -28; pixel_y = -28},/turf/simulated/floor/plasteel{tag = "icon-whitepurple (WEST)"; icon_state = "whitepurple"; dir = 8},/area/medical/genetics)
"cgR" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
"cgS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
"cgT" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
@@ -5847,7 +5847,7 @@
"ciw" = (/obj/machinery/mass_driver{dir = 4; id_tag = "toxinsdriver"},/turf/simulated/floor/plating,/area/toxins/mixing)
"cix" = (/turf/simulated/floor/plating,/area/toxins/mixing)
"ciy" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/toxins/mixing)
-"ciz" = (/obj/machinery/door/poddoor{id_tag = "toxinsdriver"; name = "Toxins Launcher Bay Door"; protected = 0},/turf/simulated/floor/plating,/area/toxins/mixing)
+"ciz" = (/obj/machinery/door/poddoor{id_tag = "toxinsdriver"; name = "Toxins Launcher Bay Door"; protected = 0},/obj/structure/fans/tiny,/turf/simulated/floor/plating,/area/toxins/mixing)
"ciA" = (/obj/machinery/door/poddoor{id_tag = "toxinsdriver"; name = "Toxins Launcher Bay Door"; protected = 0},/turf/simulated/floor/plating/airless,/area/toxins/test_area)
"ciB" = (/obj/item/device/radio/beacon,/obj/effect/decal/warning_stripes/red/hollow,/turf/simulated/floor/plasteel/airless,/area/toxins/test_area)
"ciC" = (/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/toxins/test_area)
@@ -5978,7 +5978,7 @@
"ckX" = (/obj/machinery/light/small{dir = 1},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"ckY" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"ckZ" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance{lootcount = 3; name = "3maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cla" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/turf/simulated/floor/plating/airless,/area/space)
+"cla" = (/obj/structure/table/glass,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/maintenance/apmaint)
"clb" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating/airless,/area/space)
"clc" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cld" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/closet/emcloset,/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/maintenance/incinerator)
@@ -5994,7 +5994,7 @@
"cln" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/storage/tech)
"clo" = (/obj/structure/table,/obj/item/device/aicard,/obj/item/weapon/aiModule/reset,/turf/simulated/floor/plating,/area/storage/tech)
"clp" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/rdconsole{pixel_x = -4},/obj/item/weapon/circuitboard/rdserver{pixel_x = 4; pixel_y = -2},/obj/item/weapon/circuitboard/destructive_analyzer,/obj/item/weapon/circuitboard/protolathe{pixel_x = -2; pixel_y = 3},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/weapon/circuitboard/circuit_imprinter{pixel_x = -4; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech)
-"clq" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/autolathe{pixel_x = 3; pixel_y = -3},/obj/item/weapon/circuitboard/bodyscanner,/obj/item/weapon/circuitboard/bodyscanner_console,/obj/item/weapon/circuitboard/sleeper{pixel_x = 3},/obj/item/weapon/circuitboard/sleep_console{pixel_x = 3},/turf/simulated/floor/plating,/area/storage/tech)
+"clq" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/security/medbay)
"clr" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/message_monitor{pixel_y = -5},/obj/item/weapon/circuitboard/arcade/battle,/obj/item/weapon/circuitboard/arcade/orion_trail{pixel_x = -4; pixel_y = 2},/turf/simulated/floor/plating,/area/storage/tech)
"cls" = (/obj/item/device/radio/intercom{pixel_x = 28},/turf/simulated/floor/plating,/area/storage/tech)
"clt" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
@@ -6006,18 +6006,18 @@
"clz" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"clA" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"clB" = (/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
-"clC" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = 23},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -25; pixel_y = 0; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"clD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"clE" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"clF" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"clC" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = 23},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -28; pixel_y = 0; req_access_txt = "0"},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"clD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"clE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"clF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"clG" = (/obj/machinery/power/apc{dir = 1; name = "Recovery Ward APC"; pixel_y = 26},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/camera{c_tag = "Medbay Recovery Ward West"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"clH" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"clI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"clI" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"clJ" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"clK" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"clL" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"clM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"clN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/med_data,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"clK" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"clL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 1; on = 1},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"clM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"clN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0; req_access_txt = "0"},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"clO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/medical/ward)
"clP" = (/obj/machinery/light,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"; tag = "icon-whitebluecorner"},/area/medical/medbay2)
"clQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/medbay2)
@@ -6078,7 +6078,7 @@
"cmT" = (/obj/machinery/computer/general_air_control{frequency = 1443; level = 3; name = "Distribution and Waste Monitor"; sensors = list("mair_in_meter" = "Mixed Air In", "air_sensor" = "Mixed Air Supply Tank", "mair_out_meter" = "Mixed Air Out", "dloop_atm_meter" = "Distribution Loop", "wloop_atm_meter" = "Waste Loop")},/turf/simulated/floor/plasteel,/area/engine/controlroom)
"cmU" = (/obj/machinery/computer/atmos_alert,/turf/simulated/floor/plasteel{dir = 6; icon_state = "caution"},/area/engine/controlroom)
"cmV" = (/obj/machinery/camera{c_tag = "Engineering Construction Area"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
-"cmW" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cmW" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"cmX" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"cmY" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"cmZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
@@ -6089,7 +6089,7 @@
"cne" = (/obj/machinery/camera{c_tag = "Research Shuttle Dock"; dir = 2; network = list("SS13","Research")},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "cmo"},/area/medical/research_shuttle_dock)
"cnf" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/genetics)
"cng" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "Science Maintenance APC"; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"cnh" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"cnh" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"cni" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{tag = "icon-whiteblue (SOUTHEAST)"; icon_state = "whiteblue"; dir = 6},/area/medical/medbay2)
"cnj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/sign/nosmoking_2,/turf/simulated/wall/r_wall,/area/medical/biostorage)
"cnk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/medical/virology)
@@ -6143,14 +6143,14 @@
"cog" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"coh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"coi" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"coj" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"coj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"cok" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"col" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"com" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"con" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"coo" = (/obj/structure/stool/bed/chair/comfy/black,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"con" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"coo" = (/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"cop" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
-"coq" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Medbay Recovery Ward East"; dir = 8; network = list("SS13"); pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"coq" = (/obj/structure/stool/bed/chair/comfy/black,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"cor" = (/turf/simulated/wall/r_wall,/area/medical/ward)
"cos" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"cot" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitered"},/area/medical/medbay2)
@@ -6272,7 +6272,7 @@
"cqF" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"cqG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"cqH" = (/obj/structure/table,/obj/item/weapon/storage/box/gloves,/obj/item/weapon/storage/box/masks,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"},/obj/machinery/light_switch{pixel_x = -5; pixel_y = 27},/obj/machinery/holosign_switch{id = "surgery1"; pixel_x = 5; pixel_y = 27},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"cqI" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 1 North"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"cqI" = (/obj/structure/stool/bed/chair/comfy/black,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
"cqJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cqK" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cqL" = (/obj/machinery/bodyscanner,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
@@ -6317,11 +6317,11 @@
"cry" = (/obj/structure/table,/obj/item/device/multitool,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"crz" = (/obj/structure/table,/obj/item/weapon/wirecutters,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
"crA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction)
-"crB" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"crC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"crD" = (/obj/machinery/door_control{id = "surgeryobs1"; name = "Privacy Shutters Control"; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"crE" = (/obj/machinery/door_control{id = "surgeryobs2"; name = "Privacy Shutters Control"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"crF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"crB" = (/obj/machinery/light,/obj/structure/table,/obj/item/toy/cards/deck,/obj/structure/disposalpipe/junction{tag = "icon-pipe-j2 (EAST)"; icon_state = "pipe-j2"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"crC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Medbay Recovery Ward East"; dir = 8; network = list("SS13"); pixel_y = -22},/obj/structure/closet/wardrobe/pjs,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/ward)
+"crD" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs1"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/surgery)
+"crE" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "surgeryobs2"; name = "Privacy Shutters"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/medical/surgery)
+"crF" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 1 North"; network = list("SS13")},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"crG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"crH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"crI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
@@ -6362,7 +6362,7 @@
"csr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"css" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"cst" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"csu" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"csu" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"csv" = (/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"csw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"csx" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
@@ -6383,16 +6383,16 @@
"csM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/wall/r_wall,/area/atmos/control)
"csN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/atmos/control)
"csO" = (/turf/simulated/wall/r_wall,/area/atmos/control)
-"csP" = (/obj/machinery/iv_drip,/obj/machinery/light{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"csP" = (/obj/machinery/body_scanconsole,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"csQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"csR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"csS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"csT" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"csU" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"csV" = (/obj/machinery/light{dir = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"csU" = (/obj/machinery/bodyscanner,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"csV" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 2 North"; network = list("SS13")},/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"csW" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; external_pressure_bound = 101; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"csX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"csY" = (/obj/machinery/iv_drip,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"csY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"csZ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Isolation A"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/medical/patient_a)
"cta" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"ctb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitered"},/area/medical/patient_a)
@@ -6454,8 +6454,8 @@
"cuf" = (/obj/machinery/computer/operating,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cug" = (/obj/machinery/optable,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cuh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"cui" = (/obj/structure/table,/obj/item/weapon/circular_saw,/obj/item/weapon/FixOVein,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"cuj" = (/obj/structure/table,/obj/item/weapon/circular_saw,/obj/item/weapon/FixOVein,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"cui" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"cuj" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cuk" = (/obj/machinery/computer/operating,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cul" = (/obj/structure/closet/crate/freezer,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cum" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint)
@@ -6489,7 +6489,7 @@
"cuO" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"cuP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"cuQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cuR" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cuR" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cuS" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/assembly/assembly_line)
"cuT" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"cuU" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
@@ -6512,8 +6512,8 @@
"cvl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cvm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/wall,/area/medical/surgery)
"cvn" = (/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"cvo" = (/obj/structure/table,/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"cvp" = (/obj/structure/table,/obj/item/weapon/retractor,/obj/item/weapon/cautery,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"cvo" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"cvp" = (/obj/machinery/door_control{id = "surgeryobs1"; name = "Privacy Shutters Control"; pixel_x = 25; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cvq" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cvr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cvs" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave{pixel_x = -3; pixel_y = 6},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
@@ -6531,7 +6531,7 @@
"cvE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "solar_xeno_pump"; tag_exterior_door = "solar_xeno_outer"; frequency = 1379; id_tag = "solar_xeno_airlock"; tag_interior_door = "solar_xeno_inner"; pixel_x = 25; req_access_txt = "13"; tag_chamber_sensor = "solar_xeno_sensor"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "solar_xeno_sensor"; pixel_x = 25; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "solar_xeno_pump"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"cvF" = (/obj/structure/rack{dir = 1},/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/electrical,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/radio{pixel_y = 6},/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
"cvG" = (/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
-"cvH" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
+"cvH" = (/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
"cvI" = (/obj/structure/table/woodentable,/obj/structure/disposalpipe/segment,/obj/item/weapon/book/manual/sop_general,/turf/simulated/floor/wood,/area/library)
"cvJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/aft)
"cvK" = (/turf/simulated/wall,/area/assembly/assembly_line)
@@ -6558,11 +6558,11 @@
"cwf" = (/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cwg" = (/obj/machinery/power/apc{dir = 2; name = "Surgery APC"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cwh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"cwi" = (/obj/structure/table,/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/advanced/bruise_pack,/obj/machinery/camera{c_tag = "Medbay Surgery 1 South"; dir = 1; network = list("SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"cwj" = (/obj/structure/table,/obj/item/weapon/bonegel,/obj/item/weapon/bonesetter,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"cwk" = (/obj/structure/table,/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"cwl" = (/obj/structure/table,/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
-"cwm" = (/obj/structure/table,/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/advanced/bruise_pack,/obj/machinery/camera{c_tag = "Medbay Surgery 2 South"; dir = 1; network = list("SS13"); pixel_x = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"cwi" = (/obj/machinery/door_control{id = "surgeryobs2"; name = "Privacy Shutters Control"; pixel_x = -25; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"cwj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"cwk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"cwl" = (/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"cwm" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 12; pixel_y = 2},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cwn" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/airlock/maintenance{name = "Medbay Maintenance"; req_access_txt = "5"},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cwo" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"cwp" = (/turf/space,/area/maintenance/asmaint)
@@ -6589,7 +6589,7 @@
"cwK" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/turf/simulated/floor/engine,/area/toxins/test_chamber)
"cwL" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/toxins/test_chamber)
"cwM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "solar_xeno_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
-"cwN" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/space)
+"cwN" = (/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cwO" = (/obj/structure/table,/obj/item/pod_parts/core,/obj/item/weapon/circuitboard/mecha/pod,/obj/item/clothing/glasses/welding{pixel_y = 12},/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
"cwP" = (/obj/machinery/door_control{id = "mechpod"; name = "Mechanic's Inner Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "70"},/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/sheet/mineral/plasma{amount = 30},/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
"cwQ" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/spod_part_fabricator,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/engine/mechanic_workshop)
@@ -6599,7 +6599,7 @@
"cwU" = (/turf/simulated/wall,/area/engine/mechanic_workshop)
"cwV" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft)
"cwW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
-"cwX" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating/airless,/area/assembly/assembly_line)
+"cwX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/plasteel,/area/security/lobby)
"cwY" = (/obj/item/weapon/table_parts,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
"cwZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
"cxa" = (/obj/item/weapon/camera_assembly,/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
@@ -6767,7 +6767,7 @@
"cAg" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/engine,/area/toxins/test_chamber)
"cAh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cAi" = (/obj/machinery/embedded_controller/radio/airlock/access_controller{tag_exterior_door = "xeno_airlock_exterior"; id_tag = "xeno_airlock_control"; tag_interior_door = "xeno_airlock_interior"; name = "Xenobiology Access Console"; pixel_x = 8; pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light_switch{pixel_x = -6; pixel_y = 26},/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitegreencorner"},/area/toxins/xenobiology)
-"cAj" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/turf/simulated/floor/plating/airless,/area/maintenance/incinerator)
+"cAj" = (/obj/structure/stool/bed/chair/office/dark,/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cAk" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/port)
"cAl" = (/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
"cAm" = (/obj/machinery/atmospherics/unary/vent_pump{on = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/assembly/assembly_line)
@@ -6783,9 +6783,9 @@
"cAw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/wall,/area/engine/break_room)
"cAx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/engine/break_room)
"cAy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cAz" = (/obj/machinery/power/apc{dir = 4; name = "Centcomm Rep APC"; pixel_x = 24; pixel_y = -3},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/flora/kirbyplants,/turf/simulated/floor/wood,/area/ntrep)
+"cAz" = (/obj/machinery/power/apc{dir = 4; name = "Centcomm Rep APC"; pixel_x = 24; pixel_y = -3},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/wood,/area/ntrep)
"cAA" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/stool/bed/chair/comfy/black{dir = 8},/turf/simulated/floor/plasteel,/area/engine/break_room)
-"cAB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel,/area/engine/break_room)
+"cAB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel,/area/engine/break_room)
"cAC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/wall/r_wall,/area/atmos/control)
"cAD" = (/obj/machinery/door/airlock/atmos{name = "Atmospherics"; req_access_txt = "24"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel,/area/atmos/control)
"cAE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/wall/r_wall,/area/atmos/control)
@@ -6828,7 +6828,7 @@
"cBp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"cBq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"cBr" = (/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cBs" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cBs" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"cBt" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall,/area/engine/break_room)
"cBu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light,/obj/structure/table,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1; level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/t_scanner,/turf/simulated/floor/plasteel,/area/engine/break_room)
"cBv" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/break_room)
@@ -6855,8 +6855,8 @@
"cBQ" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cBR" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cBS" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
-"cBT" = (/obj/structure/flora/kirbyplants,/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/medical/patients_rooms)
-"cBU" = (/obj/structure/flora/kirbyplants,/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/medical/patients_rooms)
+"cBT" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/medical/patients_rooms)
+"cBU" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/medical/patients_rooms)
"cBV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cBW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/medical/virology)
"cBX" = (/obj/structure/stool/bed,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (NORTHWEST)"; icon_state = "whitegreen"; dir = 9},/area/medical/virology)
@@ -6962,11 +6962,11 @@
"cDT" = (/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos)
"cDU" = (/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (EAST)"; icon_state = "whitegreen"; dir = 4},/area/medical/virology)
"cDV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/virology)
-"cDW" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (SOUTHWEST)"; icon_state = "whitegreen"; dir = 10},/area/medical/virology)
+"cDW" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (SOUTHWEST)"; icon_state = "whitegreen"; dir = 10},/area/medical/virology)
"cDX" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Virologist"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cDY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreencorner"},/area/medical/virology)
"cDZ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/medical/virology)
-"cEa" = (/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (SOUTHEAST)"; icon_state = "whitegreen"; dir = 6},/area/medical/virology)
+"cEa" = (/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{tag = "icon-whitegreen (SOUTHEAST)"; icon_state = "whitegreen"; dir = 6},/area/medical/virology)
"cEb" = (/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitegreencorner"},/area/medical/virology)
"cEc" = (/obj/machinery/light_switch{pixel_x = -4; pixel_y = 24},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/embedded_controller/radio/airlock/access_controller{id_tag = "viro_lab_airlock_control"; name = "Virology Lab Access Console"; pixel_x = 6; pixel_y = 24; req_one_access_txt = "39"; tag_exterior_door = "viro_lab_airlock_exterior"; tag_interior_door = "viro_lab_airlock_interior"},/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreencorner"},/area/medical/virology)
"cEd" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
@@ -6987,8 +6987,8 @@
"cEs" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/portsolar)
"cEt" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/portsolar)
"cEu" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/machinery/power/smes{charge = 0},/turf/simulated/floor/plating,/area/maintenance/portsolar)
-"cEv" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/portsolar)
-"cEw" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cEv" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/maintenance/apmaint)
+"cEw" = (/obj/machinery/shower{tag = "icon-shower (WEST)"; icon_state = "shower"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/maintenance/apmaint)
"cEx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
"cEy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
"cEz" = (/obj/machinery/optable{name = "Robotics Operating Table"},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/assembly_line)
@@ -7105,7 +7105,7 @@
"cGG" = (/obj/machinery/power/solar_control{id = "portsolar"; name = "Aft Port Solar Control"; track = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/portsolar)
"cGH" = (/turf/simulated/floor/plating,/area/maintenance/portsolar)
"cGI" = (/obj/machinery/power/apc{cell_type = 2500; dir = 1; name = "Engineering Shuttle Access APC"; pixel_x = 0; pixel_y = 25; shock_proof = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
-"cGJ" = (/obj/structure/closet/wardrobe/black,/obj/machinery/camera{c_tag = "Aft Port Solar Access"; dir = 1; network = list("SS13")},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/aft)
+"cGJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/apmaint)
"cGK" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
"cGL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
"cGM" = (/obj/machinery/computer/security/engineering,/obj/machinery/light_switch{pixel_x = -27},/turf/simulated/floor/plasteel,/area/engine/engineering)
@@ -7209,7 +7209,7 @@
"cIG" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/item/weapon/reagent_containers/blood/random,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cIH" = (/obj/machinery/alarm{pixel_y = 25},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cII" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology)
-"cIJ" = (/obj/structure/flora/kirbyplants,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
+"cIJ" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/virology)
"cIK" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1},/turf/simulated/floor/plating/airless,/area/toxins/test_chamber)
"cIL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/binary/valve/digital{color = ""; dir = 4; name = "Gas Mix Outlet Valve"},/turf/simulated/floor/plasteel,/area/atmos/distribution)
"cIM" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/plasteel{dir = 5; icon_state = "green"},/area/atmos/distribution)
@@ -7452,7 +7452,7 @@
"cNp" = (/obj/machinery/floodlight,/turf/simulated/floor/plating,/area/storage/secure)
"cNq" = (/obj/machinery/floodlight,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/storage/secure)
"cNr" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/machinery/alarm{pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/storage/secure)
-"cNs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
+"cNs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 2; icon_state = "barber"},/area/civilian/barber)
"cNt" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/storage/secure)
"cNu" = (/obj/machinery/camera{c_tag = "Engineering West"; dir = 4; network = list("SS13")},/obj/structure/dispenser,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"cNv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/engine/engineering)
@@ -8191,7 +8191,7 @@
"dbA" = (/turf/simulated/wall,/area/medical/patient_b)
"dbB" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/medical/patients_rooms)
"dbC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
-"dbD" = (/obj/structure/flora/kirbyplants,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/medical/patients_rooms)
+"dbD" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/medical/patients_rooms)
"dbE" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/medical/patients_rooms)
"dbF" = (/turf/simulated/wall/r_wall,/area/medical/patient_c)
"dbG" = (/obj/structure/stool/bed,/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitered"},/area/medical/patient_c)
@@ -8216,7 +8216,7 @@
"dbZ" = (/obj/machinery/iv_drip,/obj/machinery/light,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{dir = 10; icon_state = "whitered"},/area/medical/patient_c)
"dca" = (/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/obj/machinery/door_control{id = "medprivacyc"; name = "Privacy Shutters"; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 6; icon_state = "whitered"},/area/medical/patient_c)
"dcb" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "bluecorner"},/area/medical/patients_rooms)
-"dcc" = (/obj/machinery/light,/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel{dir = 10; icon_state = "blue"},/area/medical/patients_rooms)
+"dcc" = (/obj/machinery/light,/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 10; icon_state = "blue"},/area/medical/patients_rooms)
"dcd" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1},/turf/simulated/floor/plating/airless,/area/maintenance/turbine)
"dce" = (/obj/machinery/light_switch{pixel_x = -24; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
"dcf" = (/obj/machinery/power/apc{dir = 4; cell_type = 15000; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
@@ -8315,9 +8315,9 @@
"ddU" = (/obj/machinery/newscaster{pixel_y = -32},/turf/simulated/floor/plasteel{dir = 2; icon_state = "escape"},/area/hallway/secondary/exit)
"ddV" = (/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/machinery/light,/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"ddW" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/structure/closet/emcloset,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
-"ddX" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
+"ddX" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"ddY" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
-"ddZ" = (/obj/machinery/sleep_console{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
+"ddZ" = (/obj/machinery/sleeper/upgraded{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
"dea" = (/obj/structure/stool/bed/roller,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"deb" = (/turf/simulated/shuttle/floor4,/area/shuttle/escape)
"dec" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor4,/area/shuttle/escape)
@@ -8325,7 +8325,7 @@
"dee" = (/obj/structure/stool/bed/roller,/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0; req_access_txt = "0"},/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"def" = (/obj/machinery/status_display{pixel_x = -30; pixel_y = 0},/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
"deg" = (/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
-"deh" = (/obj/structure/table,/obj/item/weapon/reagent_containers/blood/AMinus,/obj/item/weapon/reagent_containers/blood/APlus,/obj/item/weapon/reagent_containers/blood/BMinus,/obj/item/weapon/reagent_containers/blood/BPlus,/obj/item/weapon/reagent_containers/blood/OPlus,/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/machinery/camera{c_tag = "Medbay Surgery 2 North"; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"deh" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
"dei" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dej" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/bodybag/cryobag{pixel_x = 5},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape)
"dek" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor4,/area/shuttle/escape)
@@ -8337,8 +8337,8 @@
"deq" = (/obj/structure/table,/obj/item/stack/cable_coil,/obj/item/weapon/crowbar/red,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"der" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/shuttle/escape)
"des" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/shuttle/supply)
-"det" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/shuttle/supply)
-"deu" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/shuttle/supply)
+"det" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/arrival/station)
+"deu" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/arrival/station)
"dev" = (/turf/simulated/shuttle/floor,/area/shuttle/supply)
"dew" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"; dir = 2},/area/shuttle/supply)
"dex" = (/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/supply)
@@ -8358,9 +8358,9 @@
"deL" = (/turf/simulated/shuttle/floor,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f6"; icon_state = "swall_f6"},/area/shuttle/supply)
"deM" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area/shuttle/supply)
"deN" = (/turf/simulated/shuttle/wall{tag = "icon-swall15"; icon_state = "swall15"; dir = 2},/area/shuttle/supply)
-"deO" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/shuttle/supply)
+"deO" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/arrival/station)
"deP" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/shuttle/supply)
-"deQ" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/shuttle/supply)
+"deQ" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/arrival/station)
"deR" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_l"; icon_state = "burst_l"},/turf/space,/area/shuttle/supply)
"deS" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/shuttle/supply)
"deT" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-burst_r"; icon_state = "burst_r"},/turf/space,/area/shuttle/supply)
@@ -8408,8 +8408,8 @@
"dfJ" = (/obj/machinery/door/unpowered/shuttle,/obj/docking_port/mobile{dir = 8; dwidth = 10; height = 35; id = "whiteship"; name = "NT Medical Ship"; roundstart_move = "whiteship_away"; width = 21},/obj/docking_port/stationary{dir = 8; dwidth = 10; height = 35; id = "whiteship_home"; name = "north of SS13"; width = 21},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"dfK" = (/obj/effect/decal/remains/human,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"dfL" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
-"dfM" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/shuttle/abandoned)
-"dfN" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/shuttle/abandoned)
+"dfM" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/shuttle/supply)
+"dfN" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/shuttle/supply)
"dfO" = (/obj/structure/window/full/shuttle{icon_state = "15"},/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/abandoned)
"dfP" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"dfQ" = (/obj/item/weapon/shard,/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
@@ -8489,8 +8489,8 @@
"dhm" = (/obj/structure/rack,/obj/item/weapon/tank/nitrogen,/obj/item/weapon/tank/nitrogen,/obj/item/weapon/tank/nitrogen,/obj/item/weapon/tank/nitrogen,/obj/item/weapon/tank/nitrogen,/obj/item/weapon/tank/nitrogen,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"dhn" = (/obj/structure/rack,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/suit/space/vox/carapace,/obj/item/clothing/head/helmet/space/vox/carapace,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"dho" = (/obj/structure/rack,/obj/item/weapon/gun/dartgun/vox/raider,/obj/item/weapon/gun/dartgun/vox/medical,/obj/item/weapon/dart_cartridge,/obj/item/weapon/dart_cartridge,/obj/item/weapon/dart_cartridge,/obj/item/weapon/dart_cartridge,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"dhp" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"dhq" = (/obj/machinery/sleeper/upgraded,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
+"dhp" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/autolathe{pixel_x = 3; pixel_y = -3},/obj/item/weapon/circuitboard/bodyscanner,/obj/item/weapon/circuitboard/bodyscanner_console,/obj/item/weapon/circuitboard/sleeper{pixel_x = 3},/turf/simulated/floor/plating,/area/storage/tech)
+"dhq" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/security/permabrig)
"dhr" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"dhs" = (/obj/machinery/bodyscanner,/obj/machinery/light/spot,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"dht" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/vox)
@@ -8525,7 +8525,7 @@
"dhW" = (/obj/machinery/door/airlock/external{frequency = 1331; icon_state = "door_locked"; id_tag = "synd_outer"; locked = 0; name = "Ship External Access"; req_access = null; req_access_txt = "150"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "smindicate"; name = "Outer Airlock"; opacity = 0},/obj/machinery/door_control{id = "smindicate"; name = "External Door Control"; pixel_x = -26; pixel_y = -2; req_access_txt = "150"},/obj/docking_port/mobile{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate"; name = "syndicate infiltrator"; roundstart_move = "syndicate_away"; width = 18},/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_nw"; name = "northwest of station"; width = 18},/turf/simulated/shuttle/plating,/area/shuttle/syndicate)
"dhX" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/shuttle/syndicate)
"dhY" = (/obj/structure/closet/syndicate/suits,/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
-"dhZ" = (/obj/structure/table,/obj/item/weapon/c4{pixel_x = 2; pixel_y = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
+"dhZ" = (/obj/structure/table,/obj/item/weapon/grenade/plastic/c4{pixel_x = 2; pixel_y = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"dia" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"dib" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1331; id_tag = "synd_pump"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"dic" = (/obj/machinery/atmospherics/unary/tank/air{dir = 1},/turf/simulated/shuttle/wall{dir = 4; icon_state = "wall3"},/area/shuttle/syndicate)
@@ -8555,12 +8555,12 @@
"diA" = (/obj/machinery/door/window/westright{name = "Tool Storage"; req_access_txt = "150"},/obj/machinery/light/spot{tag = "icon-tube1 (NORTH)"; icon_state = "tube1"; dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"diB" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/crowbar/red,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"diC" = (/obj/machinery/door/airlock/hatch{frequency = 1331; icon_state = "door_locked"; id_tag = "vox_northeast_lock"; locked = 1; req_access_txt = "152"; req_one_access = null; req_one_access_txt = "0"},/obj/docking_port/mobile{dir = 2; dwidth = 2; height = 18; id = "skipjack"; name = "Vox Skipjack"; roundstart_move = "skipjack_away"; width = 19},/obj/docking_port/stationary{dir = 2; dwidth = 2; height = 18; id = "skipjack_ne"; name = "northeast of SS13"; width = 19},/turf/simulated/shuttle/plating/vox,/area/shuttle/vox)
-"diD" = (/obj/machinery/sleeper/upgraded,/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
-"diE" = (/obj/machinery/sleep_console{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
+"diD" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"diE" = (/obj/machinery/camera{c_tag = "Prison West"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber,/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"diF" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Infirmary"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"diG" = (/obj/machinery/door/window{dir = 8; name = "Tool Storage"; req_access_txt = "150"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"diH" = (/obj/structure/closet/crate/internals,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
-"diI" = (/obj/machinery/sleeper/upgraded,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
+"diI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"diJ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/syringe/charcoal,/obj/item/weapon/reagent_containers/syringe/charcoal{pixel_y = 2},/obj/item/weapon/reagent_containers/syringe/charcoal{pixel_y = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"diK" = (/obj/structure/table,/obj/item/weapon/gun/syringe,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
"diL" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/syndicate)
@@ -8665,8 +8665,8 @@
"dkG" = (/obj/machinery/body_scanconsole,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
"dkH" = (/obj/structure/window/plasmareinforced{color = "#FF0000"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
"dkI" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
-"dkJ" = (/obj/machinery/sleep_console{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
-"dkK" = (/obj/machinery/sleeper/upgraded,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
+"dkJ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dkK" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
"dkL" = (/obj/machinery/chem_master,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
"dkM" = (/obj/machinery/chem_dispenser,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration)
"dkN" = (/obj/machinery/door/airlock/centcom{id_tag = "adminshuttle"; name = "Holding Cell"; opacity = 1; req_access_txt = "104"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration)
@@ -8721,7 +8721,7 @@
"dlK" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"},/turf/simulated/floor/plasteel,/area/hydroponics)
"dlL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
"dlM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
-"dlN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 101.325; on = 1; pressure_checks = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
+"dlN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
"dlO" = (/obj/machinery/light{dir = 8},/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/hydroponics)
"dlP" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 5"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/prison/cell_block/B)
"dlQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow,/obj/machinery/treadmill_monitor{id = "Cell 5"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/B)
@@ -8729,7 +8729,7 @@
"dlS" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/power/treadmill{dir = 4},/obj/structure/cable/yellow,/obj/machinery/treadmill_monitor{id = "Cell 4"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prison/cell_block/A)
"dlT" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/power/treadmill{dir = 8},/obj/structure/cable/yellow,/obj/machinery/treadmill_monitor{id = "Cell 2"; pixel_y = -32},/turf/simulated/floor/plasteel,/area/security/prison/cell_block/A)
"dlU" = (/obj/structure/stool/bed,/obj/machinery/flasher{id = "Cell 2"; pass_flags = 0; pixel_x = 0; pixel_y = -26},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/prison/cell_block/A)
-"dlV" = (/obj/machinery/power/treadmill{dir = 4},/obj/machinery/treadmill_monitor{on = 1; pixel_y = -32; redeem_immediately = 1},/obj/structure/cable/yellow,/turf/simulated/floor/plasteel,/area/security/prison/cell_block/C)
+"dlV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/clownoffice)
"dlW" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"dlX" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/folder/yellow,/obj/item/weapon/pen,/obj/item/weapon/book/manual/sop_engineering,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
"dlY" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = -2; pixel_y = 4},/obj/item/weapon/book/manual/sop_engineering,/turf/simulated/floor/plasteel,/area/engine/break_room)
@@ -8742,7 +8742,7 @@
"dmf" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass_engineering{name = "Mechanic Workshop"; req_access_txt = "70"; req_one_access_txt = "0"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
"dmg" = (/obj/item/device/radio/intercom{pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small,/obj/structure/stool/bed/chair/wood/wings{tag = "icon-wooden_chair_wings (WEST)"; icon_state = "wooden_chair_wings"; dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"dmh" = (/obj/machinery/camera{c_tag = "Bar South"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/gameboard,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"dmi" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/trade/sol)
+"dmi" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"; dir = 2},/area/shuttle/supply)
"dmj" = (/turf/simulated/shuttle/wall{icon_state = "swall14"; dir = 2},/area/shuttle/trade/sol)
"dmk" = (/obj/machinery/door/airlock/external{frequency = 1450; icon_state = "door_locked"; id_tag = "trade_sol_outer"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "160"},/turf/simulated/shuttle/plating,/area/shuttle/trade/sol)
"dml" = (/obj/structure/window/full/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/trade/sol)
@@ -8767,7 +8767,7 @@
"dmE" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1450; master_tag = "trade_sol"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "160"},/turf/simulated/shuttle/floor,/area/shuttle/trade/sol)
"dmF" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/spot,/turf/simulated/shuttle/floor,/area/shuttle/trade/sol)
"dmG" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/trade/sol)
-"dmH" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/trade/sol)
+"dmH" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/shuttle/supply)
"dmI" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/shuttle/trade/sol)
"dmJ" = (/obj/docking_port/stationary{dir = 8; dwidth = 2; height = 11; id = "trade_dock"; name = "port bay 4 at Cyberiad"; width = 5},/turf/space,/area/space)
"dmK" = (/obj/machinery/door/airlock/external{id_tag = "trade_dock"},/turf/simulated/floor/plating,/area/hallway/secondary/entry)
@@ -8796,6 +8796,209 @@
"dnh" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/quartermaster/office)
"dni" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "brown"},/area/quartermaster/office)
"dnj" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j1s"; sortType = 13},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"dnk" = (/obj/structure/girder,/turf/simulated/floor/plating/airless,/area/space)
+"dnl" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Alternate Construction Area"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dnm" = (/obj/structure/table,/obj/item/device/flashlight/lamp,/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dnn" = (/obj/structure/curtain/open/shower,/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/maintenance/apmaint)
+"dno" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dnp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dnq" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dnr" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dns" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dnt" = (/turf/simulated/wall,/area/maintenance/consarea)
+"dnu" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dnv" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dnw" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dnx" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dny" = (/obj/structure/sign/poster{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dnz" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dnA" = (/turf/simulated/floor/plasteel,/area/maintenance/consarea)
+"dnB" = (/obj/structure/table,/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/maintenance/consarea)
+"dnC" = (/turf/simulated/floor/plating,/area/maintenance/consarea)
+"dnD" = (/obj/item/weapon/screwdriver,/turf/simulated/floor/plating,/area/maintenance/consarea)
+"dnE" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 4},/turf/simulated/floor/plating/airless,/area/maintenance/incinerator)
+"dnF" = (/obj/item/weapon/crowbar,/turf/simulated/floor/plating,/area/maintenance/consarea)
+"dnG" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/consarea)
+"dnH" = (/obj/item/stack/sheet/metal{amount = 10},/turf/simulated/floor/plating,/area/maintenance/consarea)
+"dnI" = (/obj/structure/girder,/turf/simulated/floor/plating,/area/maintenance/consarea)
+"dnJ" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dnK" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dnL" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/consarea)
+"dnM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dnN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Alternate Construction Area"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/consarea)
+"dnO" = (/obj/item/stack/sheet/glass{amount = 10},/turf/simulated/floor/plating,/area/maintenance/consarea)
+"dnP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/consarea)
+"dnQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/aft)
+"dnR" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dnS" = (/obj/item/weapon/table_parts,/turf/simulated/floor/plasteel,/area/maintenance/consarea)
+"dnT" = (/obj/item/stack/rods{amount = 8},/turf/simulated/floor/plating,/area/maintenance/consarea)
+"dnU" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/maintenance/consarea)
+"dnV" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "Alternate Construction Area APC"; pixel_x = 25},/turf/simulated/floor/plating,/area/maintenance/consarea)
+"dnW" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engine/mechanic_workshop)
+"dnX" = (/obj/machinery/door/airlock/maintenance{name = "Mechanic Workshop Maintenance"; req_access = null; req_access_txt = "70"},/turf/simulated/floor/plating,/area/maintenance/aft)
+"dnY" = (/turf/simulated/wall/r_wall,/area/maintenance/consarea)
+"dnZ" = (/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"doa" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dob" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/multi_tile/three_tile_ver{id_tag = "mechpodbayouter"; layer = 3.1; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"doc" = (/obj/machinery/light,/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"dod" = (/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "mechpodbayouter"; name = "Pod Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"doe" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"dof" = (/obj/structure/grille,/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/engine/mechanic_workshop)
+"dog" = (/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/engine/mechanic_workshop)
+"doh" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/aft)
+"doi" = (/turf/simulated/wall,/area/maintenance/aft)
+"doj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft)
+"dok" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft)
+"dol" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft)
+"dom" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/explab)
+"don" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft)
+"doo" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/aft)
+"dop" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft)
+"doq" = (/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/aft)
+"dor" = (/obj/effect/spawner/window/reinforced,/turf/simulated/wall,/area/maintenance/aft)
+"dos" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plating,/area/maintenance/aft)
+"dot" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/aft)
+"dou" = (/obj/machinery/power/apc{dir = 8; name = "Aft Maintenance APC"; pixel_x = -24},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/aft)
+"dov" = (/obj/structure/closet/wardrobe/black,/obj/machinery/camera{c_tag = "Aft Port Solar Access"; dir = 1; network = list("SS13")},/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating,/area/maintenance/aft)
+"dow" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"dox" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"doy" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/obj/item/stack/sheet/metal{amount = 2},/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"doz" = (/obj/item/weapon/table_parts,/turf/simulated/floor/plating,/area/maintenance/apmaint)
+"doA" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/apmaint)
+"doB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/warning_stripes/yellow,/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"doC" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/maintenance/aft)
+"doD" = (/obj/item/stack/sheet/metal{amount = 10},/turf/simulated/floor/plating,/area/space)
+"doE" = (/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/stokcubes,/obj/item/weapon/storage/box/neaeracubes,/obj/structure/table/glass,/obj/item/weapon/storage/box/wolpincubes,/obj/item/weapon/storage/box/farwacubes,/turf/simulated/floor/plasteel{tag = "icon-whitepurple (SOUTHEAST)"; icon_state = "whitepurple"; dir = 6},/area/medical/genetics)
+"doF" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/fore)
+"doG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/crew_quarters/courtroom)
+"doH" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/vending/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/seceqstorage)
+"doI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/sortjunction{dir = 1; icon_state = "pipe-j2s"; sortType = 7},/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/main)
+"doJ" = (/turf/simulated/wall,/area/crew_quarters/courtroom)
+"doK" = (/obj/item/device/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/obj/machinery/camera{c_tag = "Courtroom"; dir = 1; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/crew_quarters/courtroom)
+"doL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall,/area/crew_quarters/courtroom)
+"doM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
+"doN" = (/obj/machinery/light_switch{pixel_y = -25},/obj/structure/closet/wardrobe/red,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/main)
+"doO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/seceqstorage)
+"doP" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/security/seceqstorage)
+"doQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/vending/snack,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"doR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/wall,/area/mimeoffice)
+"doS" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_security{name = "Security Office"; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/main)
+"doT" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/security{name = "Evidence Storage"; req_access = null; req_access_txt = "63"},/turf/simulated/floor/plasteel,/area/security/evidence)
+"doU" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"doV" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/hallway/primary/fore)
+"doW" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"doX" = (/obj/item/toy/prize/honk,/turf/simulated/floor/plating,/area/space)
+"doY" = (/obj/item/weapon/pen,/obj/structure/closet{name = "Evidence Closet"},/obj/structure/cable,/obj/machinery/power/apc{dir = 4; cell_type = 15000; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"doZ" = (/obj/machinery/camera{c_tag = "Fore Primary Hallway Courtroom"; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "redcorner"; dir = 1},/area/hallway/primary/fore)
+"dpa" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"dpb" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"dpc" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/fore)
+"dpd" = (/turf/simulated/wall/r_wall,/area/clownoffice)
+"dpe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light,/turf/simulated/floor/wood,/area/clownoffice)
+"dpf" = (/obj/structure/table,/obj/item/weapon/storage/box/evidence,/obj/machinery/camera{c_tag = "Brig Evidence Storage"; dir = 1; network = list("SS13")},/obj/item/weapon/hand_labeler,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_x = 0; pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/evidence)
+"dpg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary)
+"dph" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary)
+"dpi" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/storage/primary)
+"dpj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"dpk" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel,/area/hallway/primary/port)
+"dpl" = (/obj/machinery/camera{c_tag = "Fore Primary Hallway West"; dir = 4; network = list("SS13")},/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore)
+"dpm" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/quartermaster/miningdock)
+"dpn" = (/obj/structure/closet/wardrobe/miner,/turf/simulated/floor/plasteel{dir = 2; icon_state = "brown"},/area/quartermaster/miningdock)
+"dpo" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpp" = (/obj/machinery/atmospherics/unary/vent_scrubber,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpq" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpr" = (/obj/machinery/camera{c_tag = "Prison East"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dps" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpu" = (/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpv" = (/obj/machinery/door/airlock/glass{name = "Prison Basketball Court"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpw" = (/obj/machinery/atmospherics/unary/vent_scrubber,/turf/simulated/floor/holofloor,/area/security/permabrig)
+"dpx" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8; frequency = 1441; id = "co2_in"; pixel_y = 1},/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/security/permabrig)
+"dpy" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/holofloor,/area/security/permabrig)
+"dpz" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/security/permabrig)
+"dpA" = (/obj/machinery/vending/sustenance,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5; level = 1},/turf/simulated/wall/r_wall,/area/security/permabrig)
+"dpC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpF" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Lockdown 1"; name = "Prison Lockdown Door"; opacity = 0},/obj/machinery/door/airlock/glass{name = "Cell Door"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Lockdown 2"; name = "Prison Lockdown Door"; opacity = 0},/obj/machinery/door/airlock/glass{name = "Cell Door"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpH" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Lockdown 2"; name = "Prison Lockdown Door"; opacity = 0},/obj/machinery/door/airlock/glass{name = "Cell Door"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpI" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Lockdown 3"; name = "Prison Lockdown Door"; opacity = 0},/obj/machinery/door/airlock/glass{name = "Cell Door"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpJ" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Lockdown 3"; name = "Prison Lockdown Door"; opacity = 0},/obj/machinery/door/airlock/glass{name = "Cell Door"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpK" = (/obj/machinery/camera{c_tag = "Prison Basketball Court"; dir = 4; network = list("SS13")},/turf/simulated/floor/holofloor{dir = 8; icon_state = "red"},/area/security/permabrig)
+"dpL" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/structure/cable,/turf/simulated/floor/plating,/area/security/permabrig)
+"dpM" = (/obj/machinery/vending/sustenance,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/security/permabrig)
+"dpP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/flasher{id = "permaflash1"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpQ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/wall/r_wall,/area/security/permabrig)
+"dpS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/flasher{id = "permaflash2"; pixel_x = 28; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpT" = (/obj/machinery/flasher{id = "permaflash3"; pixel_x = 28; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dpU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/item/clothing/mask/gas/clown_hat,/turf/simulated/floor/plating,/area/space)
+"dpV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/plating,/area/space)
+"dpW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/security/permabrig)
+"dpX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/holofloor{dir = 10; icon_state = "red"},/area/security/permabrig)
+"dpY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/security/permabrig)
+"dpZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor/holofloor{dir = 2; icon_state = "red"},/area/security/permabrig)
+"dqa" = (/turf/simulated/floor/holofloor{dir = 6; icon_state = "red"},/area/security/permabrig)
+"dqb" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"dqc" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dqd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/permabrig)
+"dqe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/permabrig)
+"dqf" = (/obj/machinery/door/airlock/glass_security{name = "Prison 1"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dqg" = (/obj/machinery/door/airlock/glass_security{name = "Prison 2"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dqh" = (/obj/machinery/door/airlock/glass_security{name = "Prison 3"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dqi" = (/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space)
+"dqj" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"dqk" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent{filled = 0.2},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 9},/area/security/permabrig)
+"dql" = (/obj/machinery/computer/area_atmos/area,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"dqm" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; network = list("Prison"); pixel_x = 0; pixel_y = 30},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"dqn" = (/obj/machinery/camera{c_tag = "Prison Air Control"; dir = 6; network = list("Prison","SS13")},/obj/machinery/portable_atmospherics/scrubber/huge/stationary,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"dqo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/light_switch{pixel_y = 25},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"dqp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dqq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"dqr" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"dqs" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; layer = 2.4; on = 1},/obj/machinery/door_control{id = "Prison Lockdown 1"; name = "Cell 1 Lockdown"; pixel_x = -3; pixel_y = 24; range = 5; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"dqt" = (/obj/machinery/door_control{id = "Prison Lockdown 2"; name = "Cell 2 Lockdown"; pixel_x = -3; pixel_y = 24; range = 5; req_access_txt = "2"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/permabrig)
+"dqu" = (/obj/machinery/door_control{id = "Prison Lockdown 3"; name = "Cell 3 Lockdown"; pixel_x = 24; pixel_y = 3; range = 5; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/permabrig)
+"dqv" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 5},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
+"dqw" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/weapon/screwdriver,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/permabrig)
+"dqx" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
+"dqy" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
+"dqz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dqA" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
+"dqB" = (/obj/machinery/power/apc{name = "Prison Wing APC"; pixel_y = -24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
+"dqC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/permabrig)
+"dqD" = (/obj/machinery/flasher_button{id = "permaflash1"; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
+"dqE" = (/obj/machinery/light,/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
+"dqF" = (/obj/machinery/camera{c_tag = "Prison South"; dir = 1; network = list("SS13")},/obj/machinery/flasher_button{id = "permaflash2"; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/permabrig)
+"dqG" = (/obj/machinery/flasher_button{id = "permaflash3"; pixel_x = 0; pixel_y = -27},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 6},/area/security/permabrig)
+"dqH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
+"dqI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
+"dqJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
+"dqK" = (/obj/machinery/door/firedoor,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Solitary Confinement"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/permabrig)
+"dqL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
+"dqM" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating,/area/security/permabrig)
+"dqN" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/camera{c_tag = "Prison Solitary Confinement"; dir = 6; network = list("Prison","SS13")},/turf/simulated/floor/plating,/area/security/permabrig)
+"dqO" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/security/permabrig)
+"dqP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/security/permabrig)
+"dqQ" = (/obj/effect/decal/cleanable/cobweb2,/obj/structure/table,/obj/item/weapon/paper,/obj/machinery/light/small{dir = 1},/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/security/permabrig)
+"dqR" = (/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = -32},/turf/simulated/floor/plasteel/airless{icon_state = "circuit"},/area/space)
+"dqS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/security/permabrig)
+"dqT" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
+"dqU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/security/permabrig)
+"dqV" = (/obj/machinery/iv_drip,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"dqW" = (/obj/item/weapon/circular_saw,/obj/item/weapon/FixOVein,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"dqX" = (/obj/item/weapon/circular_saw,/obj/item/weapon/FixOVein,/obj/item/device/radio/intercom{frequency = 1459; name = "station intercom (General)"; pixel_x = -28},/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"dqY" = (/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"dqZ" = (/obj/item/weapon/retractor,/obj/item/weapon/cautery,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"dra" = (/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/advanced/bruise_pack,/obj/machinery/camera{c_tag = "Medbay Surgery 1 South"; dir = 1; network = list("SS13"); pixel_x = 0},/obj/machinery/light,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"drb" = (/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"drc" = (/obj/item/weapon/bonegel,/obj/item/weapon/bonesetter,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"drd" = (/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
+"dre" = (/obj/item/weapon/surgicaldrill,/obj/item/stack/medical/advanced/bruise_pack,/obj/machinery/camera{c_tag = "Medbay Surgery 2 South"; dir = 1; network = list("SS13"); pixel_x = 0},/obj/machinery/light,/obj/structure/table/glass,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/surgery)
(1,1,1) = {"
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
@@ -8818,7 +9021,7 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaraaaeaaeaaeaaearbarcbikbikbikbikbikbikbikaraarcbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaraaaeareardardarfarWargasOarbarcbikbikbikbikaraasOasPbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaraaaeareardardarfardargasOarbarcbikbikbikbikaraasOasPbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaraasRasQardardardardardardcUJargcUKarcbikbikaraddsdeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaracUKasOdeWardardardarddeXardardarddeYcUKarcaraddsdeZdeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaadbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaracUKaredfaargaaearbdfcdfbdfdaaeaaedfeasOasOasOasRdffdeZdeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
@@ -8829,75 +9032,75 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfvdfydfaardardarddfzardarddfhdfAdfBdftdfhardarddfCardardardardargcUKaaecUKareardardarddfDardardardargasRbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfvdfFdfEardardarddfrardarddfhardardarddfhardarddfGardardardardarddfHdfIdfHardardardardardardardardarddfJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfvdfidfiardardarddfzardarddfhdfKdfwarddfhardarddfCardardardarddfscUKaaecUKdeWardardardardardarddfLdfsasRbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfvardardardardarddfhardardargaaeaaedfrareardarddfhdfxardarddfscUKdfMbikdfNasOaaeaaeaaeaaeaaeaaeaaeasOdfMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfOardardardarddfPdeYdeWardardardardardardardarddfharddfsarbasOdfMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfhdfRdfQdfSarddfscUKasOaaeaaearbdeWardardardarddeYaaecUKdfMdfobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdeYdeWdfadfTdfscUKaredfVdfUdfWargasRardarddfkdfXdfldeZdfYaaeasPbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfNasOaaedfZasOareardardardardarddfhardarddfsarbasRdffdgadeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgbardardardardardardarddgcdfKdfscUKdfMdfNdgedgddeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgfarddggardardardardarddeYarbcUKdfMbikbikdfNdgedeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaagaafaajaaiaaiaaiaakaafaaJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfNaaearbdeWarddghdgidfscUKasOdfMbikbikbikbikdfNarbdfnbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlbmOcaVbZycaXcaWccwccwbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfNasOaaeaaeaaeasOdfMbikbikbikbikbikbikbikdfNdfMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlccxcaVcaVccycaVcaVcczbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcyacSKcaVcaVcTOcaVcTWbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVGaafaafaafddwaafaafaafdelbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldeqcaVdgkbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhNcaVdhObFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdhPaafaafaafaafbFldhNcaVdhOdhQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikaalaalaalaalaalaalaalaamaanaaoaapaalaalaalaalbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVdhSbFldhNcaVdhObFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaaqaaraasaataauaaybnHbnIaavaayaazaaAaaBaalbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVayLdhTbFldhNcaVdhObFlaafdhWdhVdhXbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaaCaaDaaEaaFaayaayaawaaGaaHaayaazaazaaIaalbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhYcaVcaVdhZbFldiacaVcczdicdibdibdibbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaaqaayaaKaaLaaMaayaaNaaOaavaaPaataataalaalbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVcaVdidcaVcaVdiedigdifdifdihbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdiibikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaataataataaQaaRaaSaawaaGaaHaaxaaTaaUaaVaalbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVcaVdijcaVcaVcaVaVUdikdikdimbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaaWaaXaaYaaZabaabbabcabdabeabfabgabhabhaalbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdhPaafaafaafaafaafaafdincaVcaVaafaafaafaafaafaafdhXbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabiabjabkablabmabnaboabpabqabraatabsabtaalbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdiobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldipdipdiqdisdirbFlditcaVcaVbFldiudiwdivdiydixbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikaalabuaalabvabwabxabxaalaalabyaaoaalaalabzaalbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcaVcaVcaVayLcaVdizcaVcaVcaVdiAcaVayLcaVayLdiBbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabBaatabCabDabEabFbikbikbikbikbikaalabGaalbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikabAcQScJadgjbikbikbikabAbikbikbikdgjbikbikbikabAdiCdgldgjbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiDdiEcaVcaVcaVdiFcaVcaVcaVdiGcaVcaVcaVcaVdiHbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabBaatabCabHaalbikbikbikbikbikbikaalaalaalbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgodgndgmbikbikabAdgmdgpdgrdgqdgmdgjbikbikdgmdgsdgtdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiIdiEcaVdiKdiJbFldiLdiMdiLbFlaWldiOcaVcaVcaVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikaalaalaalaalabuaatabIabJaalaalaalaalbikbikbikabKabLabLabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgvdgudgmbikabAdgwdgydgxdgAdgzdgydgwdgjbikdgmdgBdgCdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcaVcaVdiPbFlaafbFlcaVdiRdiQbFlaafbFlcaVcaVcaVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabMabNabOabPabQabRabSabTabUabVaalbikbikbikbikabKabLabWabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgEdgDdgFbikdgHdgGdgydgydgIdgydgydgGdgJbikdgLdgKdgMdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiSdiUdiTbFlbikbFldiVdiVdiVbFlbikbFldiWdiYdiXbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabXabYabZacaacbaccacdaceacfacfaalbikbikbikbikbikabKabLabLabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwbikbikdgOdgGdgydgPdgQdgydgydgGdgRbikbikdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiVdiVdiVbFlbikcVGdiZdjbdjadelbikbFldiVdiVdiVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacgacgacgacgacgachaciacjackaclaalacmbikbikbikbikbikabKabLabLabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwdgwdgwdgwdgwdgwdgwdgSdgwdgwdgwdgwdgwdgwdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacnacoacpacqacracsacdaalaalaalaalbikbikbikbikbikbikbikabKabLabLabKactactactacuacvactactactabKabKabKabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgHdgNdgTdgTdgTdgTdgTdgTdgmdgUdgmdgTdgTdgTdgTdgTdgTdgNdgJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacwacxacyaczacAacBacCaalacDacEacEacEacEacEbikbikbikbikbikabKacFacGactacHacIacJacKacLacMactabLabLabLabLabLabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgVdgXdgWdgZanqdhadgmdgSdgwdgSdgwdgSdgmdhcdhbdhedhddgXdhfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikacgacNacOacPacQacRacSacCaalacEacEacUacTacVacEacEacEbikbikbikbikabKacGactacWacXacYacXacXacZactadaadaadaadaadaadaabLadbbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgOdgXdgydgydgydhgdgmdgydgydgydgydgydgmdgydgydhhdgydgXdgRbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacgacgacgacgacgadcaddacEacEadeadgadfadiadhacEacEbikbikbikbikbikabKactadjadkadladmadnadoactadpadqadradsadtaduadvbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhjdhidhldhkdhmdgmdhndgydgydgydhodgmdhqdhpdhsdhrdhjdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikadwadxadyadzadAadwadBadCacEadEadDadGadFadIadHadJacEbikbikbikbikbikbikactadKadLadMadNacXadOactadPadtadtadtadtaduadvbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhtdhtdgwdgwdgwdgmdhudgydgydgydhvdgmdgwdgwdgwdhtdhtdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikadQadQadQadQadQadRadSadTadUadwachacdacEadWadVadYadFaeaadZaebacEbikbikbikbikbikaesactaecaedaeeaefaegaehactaeiadtaejadtadtaduadvbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdhwdhwdgFbikbikdgmdhxdgydgydgydhydgmbikbikdgLdhwdhwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikadQaekaelaemadQaenaeoaepaepaeqaeracCacEaetadVadYadFaeaadZaevacEbikbikbikbikbikbikactaeIadLaewadNacXaexactaeyadtadtadtadtaezadvbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhzdgydgydgydhydgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAaeAaeAaeAaeAaeAaeAaeAaeAbikadQaeBaeCaeDaeEaeFaeGaeFaeHaeqacSacCacEacEaeJaeLaeKafhaeMacEacEbikbikbikbikbikbikactaeNaeOaePacXaeQaeRactaeSaeTaeUaeUaeVadaabLabWbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhBdhAdgSdhBdhAdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAaeWaeXaeYaeAaeZaeXafaaeAbikadQafbafcafdadQadwafeadwadwadwaffafgaalacEafiadXafjaeuaflacEafmafmafmafmafmafmafmactafnafoafpafqafractactafsaftafuafuafwadabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxafxafxacGacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhDdhCdgydhEdhFdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafzafAaeAafyafzafAaeAbikadQafBafCafDafEafFafGafHafIafJafKafLafMacEacEafPafOafQacEacEafmafSafRafUafTagxafVafWafXafYafZagaagaagbagcagdageagfaggaghadabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikafxbikaabbikagibikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhHdhGdgydhIdhJdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAagjafAagkaeAaglafAagmaeAbikadQadQadQadQadQagnagoagpagqagragsagtaguagvagwagzagyagBagAagDagCahgagEagFagFagFagGagHagIagJagFagFagFagFagKafuagLagMagNagOagPbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabagRaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdgwdhKdhMdhLdgwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafAafyafAaeAafAafyafAaeAbikagSagTagUagVagWagXagYagZahaahbahcahdaheagvahfahiahhahmahjahjahkahlahPahnahnahnahoahpahqahrahsahnahnahtahuahvahwahxahyahzadaahAahAahAahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQagQafxbikahBbikafxagQagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdgwdgwdgwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafAafyaeAafyafAafyaeAbikagSahCahDahEahFahGahHahIahJahKahLahMahNagvahOahRahQairahSahTahUahVahWahXahYahZahUaiaaibaicaidahYahZahUahUahAadaadaadaadaadaaieaieaieahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabaabaabahBaabaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxacGacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafyafAaeAafyafyafAaeAbikagSaifaigaihagSaiiaijaikailaimainaioaipagvaiqaisahhamuaitaiuahUaivaiwaixaiyaizaiAaiBaiCaiDaiEaiFaiGbOIaiHahAaieaieaieaieaieaieaieaieahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQbikbikbikaiIbikbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafAafyaiJaeAafAafyaiKaeAbikagSaiLaiMaiNagSaiOaiOaiOaiOaiPaiQaiRaiSagvaiTaiUaiVaiWaiXaiYahUaiZajaajbajcajdajeajfajgaiDaiEajhaiGajhajiahAaieaieaieaieaieaieaieaieahAagQagQajjaabagQagQagQagQagQagQagQagQagQagQagQagQagQagQaabaabajkajlajmaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmidmddmkdmjdmldmddmddmmdmddmddmnbikbikbikbikbikbikbikbikbikafxaabajnaabafxbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaeAajoajpajqajrajoajpajqajsajtajuajuajuajuajuajuajuajuajvajwajxajyajzajAajBajCajDajEajFajGahUajHajIajJajKajdajeajKajgajLaiEaiCaiCajMajNajOaieaieaieaieaieaieaieaieahAaabaabaabaabaabaabbikaabbikaabaabaabaabaabaabaabaabbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmpdmodmrdmqdmtdmsdmsdmsdmvdmudmwbikbikbikacGacGacGafxafxaabaabbikajQbikaabaabafxafxacGacGacGbikbikbikbikbikbikbikbikbikbikbikbikaeAajRajSajTafyajUajVajWakcajtajYajZakaakbaknakdakdajuakeakfakgakhakiajBakjakkaklakmalJajFakoakpamwakqajKakraksaktakuakvakwakxakxakzaiCakAaieaieaieaieaieaieaieaieahAaabakBakCakCakCakDakCakCakCakCakDakCakCakCakCakEaabbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmxdmodmzdmydmsdmAdmAdmAdmAdmAdmBbikbikbikacGbikbikaabbikaabbikbikajQbikbikaabbikaabbikbikacGbikbikbikbikbikbikbikbikbikbikbikbikaeAakFafyakGakHakIakJakKakLajtakMakNakOakOakPakQakRajuakSakTakUakVakiakWakXakYakZalaalbalcaldaleaAEalfalgalhalialjalkallalmaiCaiCaiCalnajOaieaieaieaieaieaieaieaieahAaabaloaabaabaabaloaabbikbikaabaloaabaabbikbikaloaabbikaabaabajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmCdmodmEdmDdmAdmAdmAdmAdmGdmFdmwbikbikbikacGaabalpalpalpalpalpbikalqbikalpalpalpalpalpaabacGbikbikbikbikbikbikbikbikbikbikbikbikaeAalralsakGafyaltakJalualvajtalwalxalyalzakQakQakRajualAalBalCalDalEajBalFalGaklalHalIajFajXalKalLalLalMajdalNalOalPalQaiCaiFaiGaiCalRahAahAahAahAahAahAahAahAahAahAaabaloaabbikajkajlajmbikbikajkajlajmbikbikajkajlajmaabaabbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmHdmddmddmddmldmddmddmmdmddmddmIbikbikbikacGbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikamaalZaowanxambbikbikbikamcaeAaeAaeAamdamdameamfamgamdajuamhamiamjamkamlammamnajuamoampamqakVamrajGamsamtaXNamvaYjajGamxamyamzamAamBamCamDamEamFamGaiCajhamHamIamJahAamKamKamKamKamKbikbikbikbikaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGaabamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikamOamNamQamPamOamRamSamSamTamUamVamWamXamYamZanaanbancajuajuandaneajuajuajuajuajuanfanganhanianfajGajBajCanjajEajFajGankanlanmannahUahUahUahUannanoanpanmahUahAayjahAanrantansansanubikbikbikbikbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikbikbikaabbikbikbikanvbikbikbikaabbikbikbikaabbikbikbikaEEanwanzanyanBanAanDanCanAanGanGanHanIanJanKanLanManNanOanPanQanRanSanTanSanSanUanVanWanXanYanSanZaoaaobaocaodaoeaofaogaohanSaoiaojaokaolaomaonaooaopaoqaoraosaplaotaovaEHaouaoyaoxbikbikbikbikbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGaabalpalpalpalpalpbikamMbikalpalpalpalpalpaabacGbikbikbikamOanEaoAanFamOamRamSamSamSaoBaoHaoIaoJaoKaoLaoMaoNaoOaoPaoQaoRaoSaoTaoUaoVaoWaoXaoYaoWaoZapaaoTapbapcapdaoTaoTapdaoXapcapeaoTaoTapbapcaoVapfapgaphapiapjapkaplapmapnaovaozansansapobikaacapqaacbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikaabaabajkajPajmaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsdmMdmLdmOdmNbikbikbikbikbikbikajjbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikamOaoCaoCaoDamObikbikbikapwapwapxapyapzapAapAapAapBapBapBapBapCapDapEapEapEapFapGapHapFapEapEapEapIapJapKapLapMapKapNapJapOapOapOapPapQapOapRapSapTapUapVapWapXapmapnapYapYamKapZapZapZamKaqaamKaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmaabaabbikaabaiIaabbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmQdmQdmQdmPbikbikbikbikbikbikacGaqbamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikaEEaoEaoCaoFamOamRamSamSamSaqgaqhaqiaqjaqkaqlaqmapBaqnaqoaqpaqqaqraqsaqtaquaqvaqwaqxaqyaqzaqAaqsaqBaqCaqDaqEaqFaqGaqHaqCapOaqIaqJaqKaqLapOaqMaqNaqOaqPaqQaqRapXapmaqSaqTaqUaqVaqWaqWaqXamKaqYamKaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikaabaloaabbikbikaqZbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmRdmRdmRdmPbikbikbikbikbikbikacGbikbikbikaabbikbikbikanvbikbikbikaabbikbikbikacGbikbikbikamOaoGaoCaoCaptanAapuanCanAapvanLarharianGanGarjapBarkarlarmarnaroarparqarrarsartaruarvarrarwarxaryarzarAarBarCarDarEarFarGarHarIarJarKapOarLarMarMarNarMarOapXapmaovaovaovaovarPaovarQarRarSamKakBarTakEbikbikaiIaabaabaabaabaiIaabaabaabaabaiIaabaabaabaabarUarVakEaabbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmTdmSdmUdmPbikbikbikbikbikbikacGaabalpalpalpalpalpbikamMbikalpalpalpalpalpaabacGbikbikbikamOaqcaqcaqcamOamRamSamSamSarXarYaoMarZasaanGasbapBascasdaseasfasgashasiasjaskaslasmasnasoaspashasqarFasrassastasrarEasuapOarGaswasxasyapOaszasAarMarNarMasBapXasCasDasEasFasEasGasHamKamKapnamKaloasIasJakCakCarTakCakCakCakCarTakCakCakCakCarTakCakCakCasKasLasIaloaabbikagQaabbikbikbikbikbikbikbikbikbikbikaabbikaabbikasMasMasNasNasNasNasNasNasMasMaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmVdmSdmUdmPbikbikbikbikbikbikacGbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikaqeaqdaqdaqdaqfbikbikbikapwapwapwapwapwasSanGasTasUapBatRapBasVasWapEapEatSapEasXasYapEatSapEasZataatbatcatdateatfatgathapOatiatjatkatlatmatnatoatpatqarMatrapXatsattatuatvatwatxatyatzatAatBamKatCarTatDaabaabbikaabbikbikbikbikbikbikbikbikaabaabaabaabaabatEatFatDaabaabaabaabaabbikbikbikbikbikbikbikbikbikaabbikaabasMasMatGatHatIatJatKatLatMatIasMasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmVdmSdmUdmPbikbikbikbikbikbikaabatNamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapwatOanGasTasUatPatUatTauyatVaqsatQauJauEavxauTavEavBatWaqsatXatYatZauaaubaubaucaudapOaueaufaugauhapOauiaujaukarNarMaulapXatsarPattattattaumaovaunauoaupamKbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikaabaabaabaabauqaabaabbikbikaabaabaabbikbikbikbikbikbikbikbikasMasMasMasMauratJausatJausautatJatJatJauuasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmSdmSdmSdmWbikbikbikbikbikbikacGbikbikaabbikaabbikbikauvbikbikaabbikaabbikbikacGbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikapwauwanGauxasUarkavJauzauAauBauCauDdlLauFauGauHauIdlMauKauLauMauNauNauOauNauNauPauQauRauSdlNapOauUapOauVauWauXauYauZavaapXatsavbavcavcavcavdaveavfavgavhamKbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabbikbikbikaabaabaabaviaabaabbikbikaabbikaabaabbikbikbikbikbikbikbikasMavjavkavlavmavnavoavpatJatJavqavratJavsasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmXdmSdmSdmYbikbikbikbikbikbikacGacGacGaabaabaabaabavtavuavtaabaabaabaabacGacGacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapwavvanGavwasUdlPdlQavyavzavAashdlRdlSashavCavDashdlTdlUashavFavGavHavGavGavHavGavIapOatidlVapOavKapOavLavMavNavOavPavQavRavSavTavUavUavUavVavWavXavYavYavYbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikaabaabavZawaavZaabaabbikaabbikbikaabaabbikbikbikbikbikbikasMawbawcawdaweawfawgatJatJatJawhawiatJawjasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmZdmSdnadmPbikaahbikbikbikbikaabbikaabbikbikaabbikavtawkawlbikbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikawmawmawmawmawmawmapwapwawnapwasUasUasUawoawpawqawrawrawsawrawsawrawrawtasZasZasvawvawwawuawvawwawuawyawzawzawzawzawzapOawAawBawCawCawDawCawEawFavUawGawHawIavVawJawKawLawMavWbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikaabbikavZawNavZbikaabbikaabbikbikbikaabaabbikbikbikbikbikasMawOawPavlawQawRawSawTatJawUawVawWawXasMawYaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdnbdnddncdnddnebikbikbikbikbikbikaabbikaabbikbikaabavtavtawZaxaavtbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikawmaxbaxcaxdaxeaxfaxgaxhaxiaxhaxjaxhaxhaxkaxlaxlaxlaxlaxlaxmaxnaxoaxlaxlaxlaxlaxpaxlaxlaxlaxlaxqaxraxsaxtaxuaxvaxwaxxapWaxyaxzaxAaxBaxCaxDaxEaxFavUaxGaxHaxIavVaxKaxLaxJaAZavWbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikaabavZavZaxMavZavZaabbikaabbikbikbikbikaabaabbikbikbikbikasMaxNaxOavlasMavlavlaxPaxQasMasMasMasMasMasMaabaabbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdnbdnfdnebikbikbikbikbikbikaabaabbikaabbikbikaabaxRaxSaxTaxUaxRaxVaxVbikbikaabbikbikbikbikbikbikbikbikbikbikawmaxWaxXaxYaxZayaaybaycaydayeayfaxqaxqaygaxqaxqaxqaxqaxqayhaxqaxqaxqaxqaxqaxqayiaxqaxqaxqaxqaSWaxqaykaxqaylaxqaymaynapWayoaypayqayraysaytaxEayuavUayvaywayxayyayzayAayBawMavWbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikaabayCayDayEayFayCaabbikaabbikbikaabbikbikaabaabbikbikayGasMavlasMavlayHayIayHayJayHayHayHayKayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaxVaxVaxVaxVaxVaabaabaxRazsayMayNaxRayOaxVbikbikaabbikbikbikbikbikbikbikbikbikbikawmayPayQayRaySayTawmayUayVayWayXayYayZazaazbazcayXayXayXazdayXayXayXayXayXayXazeazfazgazgazgazhaziazjaziazkazlazmaznapWazoazoazoazoazoazoaxEaxFavUazpaxHazqavVcscazraxJcvYavWbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikbikaabayCaFCaztazuayCaabbikaabbikbikaabbikbikayGazvayGazvayGayKayHayHayHayHayHayHayHayHayHazwazxayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikazyazzazybikbikbikaxVaxVaxVaxVazAazBazCaxVbikbikaxRazDazEazFazGazHaxVbikbikaabbikbikbikbikbikbikbikbikbikbikawmawmawmawmawmawmawmazIazIazJazKazKazLazMazNazOazPazPazOazQazOazRazRazRazRazRazRazSazRazRazTazUazVazWazIazXazIazYazIazIaqVazZaovaovaovaovaAaaxFavUaAbaxHaAcavVaAdayAayBawMavWbikbikbikbikbikbikbikbikaabaabbikbikbikbikazyaAeazybikaabayCaAfaAgaAhayCaAiaAiaAiaAiaAiazvazvazvayGaAjayHazwazxayJayHayJayJayJayGaAkayGayGayGayGayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikaAlaAmaAlbikbikaabaxVaAnaAoaApazHaAqazHaxVaAlaAlaxRaxRaAraAsazGazHaxVaxVaAlaAlaAlaxVaxVbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikazJaAtaAuaAvazMaAwazOaAxaAyaAzaAAaABaACaADbfTaAFaAGaAHaAIaAJaAKaALaxqaxraAMaANaAOaAPaAQaAPaAPaAPaARaAPaAPaAPaAPaASaATaAUaAVaAWaAXaAYcNsaBaaUadcuavWaabaBbaBcaBcaBcaBcaBcaBdaabaabbikbikbikbikazvaBeazvbikaAiayCayCaBfaBgayCaBhayHayHayHayJaBiayHaBjayGayHayHayHaBkayJayHayGaBlaBmayGayHaBnayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikappaBpaBobikaBqaBsaBraabaabaAlazHaAlbikbikaabaxVaBuaBvaBwaBxaByaBzaxVaBAazHaBBaBCaBDaBEaBEaBEaBEaBEaBEaBEaBEaBFaxVbikaBGbikbikbikbikbikbikbikbikbikbikbikbikbikbikaBHaBIaBJaBKazMaAwazOaBLafvaBNaAAaABaBOaBPaBPaBPaBPaBPaAIbjlaAKaxlaxqaxrazIaBQaBRaBSaBTaBSaBSaBUaBVaBWaBWaBWaBWaBWaBWaBXaBYaBZaCaaCbaCcaCdaCeavWavWaCfaCgaChaChaChaChaChaCgaCfaabbikbikbikbikazvaCiaCjbikaAiaCkaClaCmaCnayHayHayHayJayHayJaCoayHayHayGayHaCpaCqaCoaAkayHayGaCraCsayGayHaCtayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaCuaBtaCvaBtaCuaCwaCxaCwaCuaabaAlaCzaCAbikbikaxVaxVaxVaxVaxVaCBaCCaCDaCEaCFaCGaCGaCHaCIaCIaCJaCKaxVazHaxVaxVaxVaCLaxVbikaabbikbikbikbikbikbikaabaabaabaabaabaabaabaabaCMaCNaCOaBKazMaAwazOaCPaCQaCRaAAaCSaCTaBPaCUaBPaCVaCVaAIaBPaAKaxlaxqaCWazIaCXaBRaCYaCZaDaaDbaDcaDdaDeaDfaDgaDhaDiaDjaDkaDlaDmaDnaDoaDpaDqaDraDsaDtaCfaCgaChaChaChaChaChaCgaCfaabaabaabaabazvazvaDuaDvazvaAiaDwayHaDxayHayKayHayGayGaDyayGayGaDzayJayJaCoaDAaDBayHayGayHaDCaDCaDCaDCaDCaDCaDCaDCaDCaDDaDDaDDaDDaacaDDaDDaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaDEaBtaCyaBtaDEaCwaDFaCwaDEaxVaAlaDHaDIaAlaAlaxVazHazHazHazHazHazHazHaCBaCLaxVaxVaxVaxVaxVaDJaxVaxVazHaDKaxVaDLaCLaxVaxVaxVbikbikbikbikbikaDMaDMaDMaDMaDMaDMaDMaDMaabaCMaDNaDOaDPaDQaDRaDSaDTaDUaDVaDWaABaDXaBPaDYaDZaEaaEbaEcaEdaAKaxlaxqaxrazIatsaEeaEfaCZaDaaDbaEgaEhaEhaEhaEhaEhaEhaEhaEhaEhaEhaEiaEjaEkaElaEmaEnaEoaEpaCgaChaChaChaChaChaCgaCfaCfaCfbikbikazvayHaEqaEraBhaEsaDAaCoaDxayHaEtayIaEuaAkayHayHayHayHaEvayHayHaDAaEwayHaDzayHaDCaExaEyaEzaDCaEAaEBaECaDCaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaDEaDGcUCaEDaDEaEFddzaEGaEJaEKazHaELaEMaENaDKaEOazHaxVaxVaxVaxVaxVaxVaxVaCLaxVaEPaEQaERaxVaESaETaEUazHaEOaxVaENaEVaBEaBFaEWbikbikbikbikbikaEXaEYaEZaFaaFbaFcaFdaDMaabaCMaFeaFfaFgaCMaFhazOaFiaFjaFkaFlaABaFnaBPaFoaFpaFqaFraFsaFtaFuaFvaydaFwaFxaFyaFzaFAaCZaDaaDbaFBaEhaHTaHTaHTaEhaEhaFDaFEaFEaFFaEiaFGaFHaFIaFIaFJaFKaFLaFMaChaChaChaChaChaFNaFOaFPaFQbikbikazvayHayHaFRayHaEsaFSayHaFTaFUaFUaFUaFUaFVaFUaFWayHayHayHayHayHayHayHayHayJayIaDCaFXaFYaFYaDCaFZaGaaGbaDCbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfvardardardardarddfhardardargaaeaaedfrareardarddfhdfxardarddfscUKaNhbikaNnasOaaeaaeaaeaaeaaeaaeaaeasOaNhbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfOardardardarddfPdeYdeWardardardardardardardarddfharddfsarbasOaNhbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfhdfRdfQdfSarddfscUKasOaaeaaearbdeWardardardarddeYaaecUKaNhdfobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdeYdeWdfadfTdfscUKaredfVdfUdfWargasRardarddfkdfXdfldeZdfYaaeasPbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNnasOaaedfZasOareardardardardarddfhardarddfsarbasRdffdgadeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikaabbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikdgbardardardardardardarddgcdfKdfscUKaNhaNndgedgddeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgfarddggardardardardarddeYarbcUKaNhbikbikaNndgedeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaagaafaajaaiaaiaaiaakaafaaJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaapaamaaoaalaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNnaaearbdeWarddghdgidfscUKasOaNhbikbikbikbikaNnarbdfnbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlbmOcaVbZycaXcaWccwccwbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaalaasaaraauaalaalaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNnasOaaeaaeaaeasOaNhbikbikbikbikbikbikbikaNnaNhbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlccxcaVcaVccycaVcaVcczbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaawaayaaxaayaazaalbikbikaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcyacSKcaVcaVcTOcaVcTWbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaaBaaAaayaaxaayaaAaaBbikbikbikaabaabaabbikbikaabbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVGaafaafaafddwaafaafaafdelbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaaEaaCaaHaaFaaHaaIaaKbikbikbikaalaalaalaalaalaabaabbikbikbikbikaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldeqcaVdgkbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaabaabaalaaLaaNaaMaayaaOaalbikbikaabaalaaPaaRaaQaalaalaalbikbikaabaabaabaacbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhNcaVdhObFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikaalaaSaaTaaMaaVaaUaalbikaabaabaalaaWabhaaXabtaaYaalbikaabaabaacaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdhPaafaafaafaafbFldhNcaVdhOdhQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaalaaBaalaaZaalabaabbaalaalabcaanaaoaalabdabeabxaalaalaalaalaalaalaalaalaalaalaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVdhSbFldhNcaVdhObFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaabaabaalabgabiaaSabiaaMabfabjablaaxaavaayaboabmaaDabpabrabqabsaalabwabwabzabyabyaalaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVayLdhTbFldhNcaVdhObFlaafdhWdhVdhXbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabBabDabCaaDaaMabEaayaayabFabGaavabIabHabJaaGaavabMabNaalabOabOabQabPabPaaBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhYcaVcaVdhZbFldiacaVcczdicdibdibdibbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikaalabRaaHabSaaHabTabVabUabYabXacaabZaccacbacfaceabZacjacjacFahdahcbnHahedhqbnIbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVcaVdidcaVcaVdiedigdifdifdihbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdiibikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaavdiEdiDdkJdiIdpodkKdkJdkJdpqdppdpsdprdkJdptdpudkJdkJdpvdpxdpwdpydpwabPdpzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldhRcaVcaVcaVdijcaVcaVcaVaVUdikdikdimbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaaldpBdpAdpDdpCdpEaaldpFdpFaaldpGdpHaaldpJdpIaalaalaalaaldpKagtaaDagtabPdpLbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdhPaafaafaafaafaafaafdincaVcaVaafaafaafaafaafaafdhXbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaaldpMaaydpNabndpOdpDdpPdpOdpQdpSdpRdpDdpTdpOdpUdpVdpOdpXdpWdpZdpYdqaaalbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdiobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldipdipdiqdisdirbFlditcaVcaVbFldiudiwdivdiydixbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabuaalabvdqbaaldqcaaqaaldqcaaqabxdqcaaqaalbikaEQaalaalaalaalaalaalaalaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcaVcaVcaVayLcaVdizcaVcaVcaVdiAcaVayLcaVayLdiBbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaalaalaalaalabuaaldqddqeaaldqfdqfaaldqgdqgabxdqhdqhaalbikaEQabKabKabKdqiaEQaEQaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikabAcQScJadgjbikbikbikabAbikbikbikdgjbikbikbikabAdiCdgldgjbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlajbcaVcaVcaVcaVdiFcaVcaVcaVdiGcaVcaVcaVcaVdiHbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaaldqkdqjdqmdqldqnabkdqpdqodqqdqqdqsdqrdqrdqtdqrdquaalbikbikbikaEQabKabKaEQaabbikbikaabbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgodgndgmbikbikabAdgmdgpdgrdgqdgmdgjbikbikdgmdgsdgtdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlajecaVcaVdiKdiJbFldiLdiMdiLbFlaWldiOcaVcaVcaVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikaaldqwdqvdqydqxdqAdqzdqCdqBdqAdqDdqAdqEdqFdqAdqAdqGaalbikbikbikbikaEQabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgvdgudgmbikabAdgwdgydgxdgAdgzdgydgwdgjbikdgmdgBdgCdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcaVcaVdiPbFlaafbFlcaVdiRdiQbFlaafbFlcaVcaVcaVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalaalaalaalaalaaldqHdqIaalaalaalaalaalaalaalaalaalaalbikbikbikbikaEQabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdgEdgDdgFbikdgHdgGdgydgydgIdgydgydgGdgJbikdgLdgKdgMdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiSdiUdiTbFlbikbFldiVdiVdiVbFlbikbFldiWdiYdiXbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaaldqJdqLdqKdqNdqMdqOaalaabaabaabbikbikbikbikbikbikbikabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwbikbikdgOdgGdgydgPdgQdgydgydgGdgRbikbikdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiVdiVdiVbFlbikcVGdiZdjbdjadelbikbFldiVdiVdiVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacgacgacgacgacgachacidqPackacldqQaalacmbikbikbikbikbikbikbikbikbikdqRabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwdgwdgwdgwdgwdgwdgwdgSdgwdgwdgwdgwdgwdgwdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacnacoacpacqacracsacdaalaalaalaalaalbikbikbikbikbikbikbikbikbikbikactactactacuacvactactactabKabKabKabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgHdgNdgTdgTdgTdgTdgTdgTdgmdgUdgmdgTdgTdgTdgTdgTdgTdgNdgJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacwacxacyaczacAacBacCaalacDacEacEacEacEacEbikbikbikbikbikbikbikbikactacHacIacJacKacLacMactabLabLabLabLabLabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgVdgXdgWdgZanqdhadgmdgSdgwdgSdgwdgSdgmdhcdhbdhedhddgXdhfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikacgacNacOacPacQacRacSacCaalacEacEacUacTacVacEacEacEbikbikbikbikbikbikactacWacXacYacXacXacZactadaadaadaadaadaadaabLadbbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgOdgXdgydgydgydhgdgmdgydgydgydgydgydgmdgydgydhhdgydgXdgRbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacgacgacgacgacgadcaddacEacEadeadgadfadiadhacEacEbikbikbikbikbikbikactadjadkadladmadnadoactadpadqadradsadtaduadvbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhjdhidhldhkdhmdgmdhndgydgydgydhodgmarWdgydhsdhrdhjdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaabaaladBadCacEadEadDadGadFadIadHadJacEbikbikbikbikbikbikactadKadLadMadNacXadOactadPadtadtadtadtaduadvbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhtdhtdgwdgwdgwdgmdhudgydgydgydhvdgmdgwdgwdgwdhtdhtdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikaabaalachacdacEadWadVadYadFaeaadZaebacEbikbikbikbikbikaesactaecaedadAaeeacXaefactaeiadtaejadtadtaduadvbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdhwdhwdgFbikbikdgmdhxdgydgydgydhydgmbikbikdgLdhwdhwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabbikaabbikbikbikaabaaladRacdacEaetadVadYadFaeaadZaevacEbikbikbikbikbikbikactaeIadLaewadNacXaexactaeyadtadtadtadtaezadvbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhzdgydgydgydhydgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAaeAaeAaeAaeAaeAaeAaeAaeAaabbikbikbikaabaabaabaabaabaabaaladBacdacEacEaeJaeLaeKafhaeMacEacEbikbikbikbikbikbikactaeNaeOaePacXaeQaeRactaeSaeTaeUaeUaeVadaabLabWbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhBdhAdgSdhBdhAdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAaeWaeXaeYaeAaeZaeXafaaeAaabbikbikaabadwadwadwadwadwadwaalaffafgadSacEafiadXafjaeuaflacEafmafmaepaeDahZafmafmactafnafoafpafqafractactafsaftafuafuafwadabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxafxafxacGacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhDdhCdgydhEdhFdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafzafAaeAafyafzafAaeAbikbikbikaabadwadxaekadUaemaelaenafKafLaeoacEacEafPafOafQacEacEafmafDafcafRagaafIafEafWafXafYaegagaagaagbafVagdagcagfaggaghadabikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikafxbikaabbikagibikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhHdhGdgydhIdhJdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAagjafAagkaeAaglafAagmaeAaabbikbikbikadwadyaeraeqaeBagqagragsagtaeCagvagwagzagyaeFaehafeafMahlafSageafSafSafTahpafbafGafCafSafSaikagoagLagxagMagNagOagPbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabagRaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdgwdhKdhMdhLdgwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafAafyafAaeAafAafyafAaeAbikbikaabaabadwadzaeraeGaeHahaahbdqSdqUdqTagvagnahiahhahmahjafJagvagpagYahgaguaguagAagDagCafUagEagHagGahUafZahvahwahxahyahzadaahAahAahAahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQagQafxbikahBbikafxagQagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdgwdgwdgwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafAafyaeAafyafAafyaeAbikaabbikbikadwadxafBagBagFahJahfagWahnagIagKagJahRahQairahSahqagVagZahFahGahrahkahUahoahsahuahtahKahKahMahLahAadaadaadaadaadaaieaieaieahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabaabaabahBaabaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxacGacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafyafAaeAafyafyafAaeAaabaabbikbikadwadwaiOafFailailadTaatahTahNagvaiqaisahhamuaitaiuahOahVahPahXahWahYaifaibaiaamyamzamzaicaiCaidahAaieaieaieaieaieaieaieaieahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQbikbikbikaiIbikbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafAafyaiJaeAafAafyaiKaeAamcaabaabaabaabadwagTaiOaigaiwaeEaatagXaiSagvaimaiUaiVaiWaiXaiYaihaijaiiajgajfahYaioaiyaixaiEaiDaiHaiGaiCaiLahAaieaieaieaieaieaieaieaieahAagQagQajjaabagQagQagQagQagQagQagQagQagQagQagQagQagQagQaabaabajkajlajmaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVydmddmkdmjdmldmddmddmmdmddmddmnbikbikbikbikbikbikbikbikbikafxaabajnaabafxbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaeAajoajpajqajrajoajpajqajsajtajtajtajtajtajtajuajuafdaiAagSafHakoagUajGajGajNahIajEajFajGaiRaiPaiMaiNaipaiTajaajwaixaiEajhajiaiGajMajvajOaieaieaieaieaieaieaieaieahAaabaabaabaabaabaabbikaabbikaabaabaabaabaabaabaabaabbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmpdmodmrdmqdmtdmsdmsdmsdmvdmudmwbikbikbikacGacGacGafxafxaabaabbikajQbikaabaabafxafxacGacGacGbikbikbikbikbikbikbikbikbikbikbikbikaeAajRajSajTafyajUajVajWakcajtbSoclqajcajAajyajDajuahDahCajJajxajLahHajBakjakkaklakmaiFajFaiRakiakaaiRajIaiRahUalhajKakbajYakpakdakzaiCakAaieaieaieaieaieaieaieaieahAaabakBakCakCakCakDakCakCakCakCakDakCakCakCakCakEaabbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmxdmodmzdmydmsdmAdmAdmAdmAdmAdmBbikbikbikacGbikbikaabbikaabbikbikajQbikbikaabbikaabbikbikacGbikbikbikbikbikbikbikbikbikbikbikbikaeAakFafyakGakHakIakJakKakLajtakMakNakOakOakPajZajuaivainaiBaizakrahHakWakXakYakZalaalbajdaknakwakuakqaksaktakTalBakSalcakUalealdaiCalfajOaieaieaieaieaieaieaieaieahAaabaloaabaabaabaloaabbikbikaabaloaabaabbikbikaloaabbikaabaabajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmCdmodmEdmDdmAdmAdmAdmAdmGdmFdmwbikbikbikacGaabalpalpalpalpalpbikalqbikalpalpalpalpalpaabacGbikbikbikbikbikbikbikbikbikbikbikbikaeAalralsakGafyaltakJalualvajtalwalxalyalzakQakxajuampaiQakRaiZalEajzajBalFalGaklalHalIajFaliahPaljaljallalCalgalJajXakfakealMakeakhakgahAahAahAahAahAahAahAahAahAahAaabaloaabbikajkajlajmbikbikajkajlajmbikbikajkajlajmaabaabbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaXhdmddmddmddmldmddmddmmdmddmddmIbikbikbikacGbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikamaalZaowanxambbikbikbikamcaeAaeAaeAamdamdamealKamgamdajuamfamiamjamkamhamlajualNajHammalQamnakvajGamsamtaXNamvaYjajGamXamDamqanlamYdoHaocaoNdoIasvaiCateauydoNalkahAamKamKamKamKamKbikbikbikbikaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGaabamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikamOamNamQamPamOamRamSamSamTamUamVamWalnakVamZanaanbancajuajuandaneajuajualmajualAalAaufalAauLalDajGajBajCanjajEajFajGdoOatgdoPaiRaiRaiRahUahUannalLdoSalOahUahAalPahAanrantansansanubikbikbikbikbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikbikbikaabbikbikbikanvbikbikbikaabbikbikbikaabbikbikbikaEEanwanzanyanBanAanDanCanAanGanGanHanIanJanKanLanManNanOanPanQanRanSanTaoiaokalRaqjaxtaojaPcauwaswamoamxamwamBamAamEamCamGamFaokaojaokaolaomamHamJamIanfaoraovapmaotaovaEHaouaoyaoxbikbikbikbikbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGaabalpalpalpalpalpbikamMbikalpalpalpalpalpaabacGbikbikbikamOanEaoAanFamOamRamSamSamSauQasYamrankauSaoLaoLanoanmaoPaoQaoRaoSaoTaoUaoVaoWaoXaoYaoWaoZapaaoTavRapcawqanpaoTapdanUaoTapeaoTapcapbaoTaoVapfapgaphapianVapkaplapmapnaovaozansansapobikaacapqaacbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikaabaabajkajPajmaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikapsdmMdmLdmOdmNbikbikbikbikbikbikajjbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikamOaoCaoCaoDamObikbikbikapwanganianhanWawDanianiapBapBapBapBapCapDapEapEapEapFapGapHapFapEapEapEaoeaodaodanXanZanYaopaooahEahEaobaoaahEahEapRapSapTapUapVapWapXapmapnapYapYamKapZapZapZamKaqaamKaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmaabaabbikaabaiIaabbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmQdmQdmQdmPbikbikbikbikbikbikacGaqbamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikaEEaoEaoCaoFamOamRamSamSamSaxyaniaofaohaogaoqaonapBaqnaqoaqpapjaqraqsaqtaquaqvapxapvaqyaqzaqAaqsapzapyapyaosaoHaoBapMapLahEaoIaoKaoJaoMahEaqMaqNaqOaqhaqQaqiapXapmaqSaqTaqUaqVaqWaqWaqXamKaqYamKaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikaabaloaabbikbikaqZbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmRdmRdmRdmPbikbikbikbikbikbikacGbikbikbikaabbikbikbikanvbikbikbikaabbikbikbikacGbikbikbikamOaoGaoCaoCaptanAapuanCanAaykaniayYapAaoOapJapIapBarkarlarmarnaqCarparqarrarsartaruarvarrarwarxaqDapyapyaosapNapKaqHaqGapPapOaqgapQawFahEaszasAarMarNarMarOapXapmaovaovaovaovarPaovarQarRarSamKakBarTakEbikbikaiIaabaabaabaabaiIaabaabaabaabaiIaabaabaabaabarUarVakEaabbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmTdmSdmUdmPbikbikbikbikbikbikacGaabalpalpalpalpalpbikamMbikalpalpalpalpalpaabacGbikbikbikamOaqcaqcaqcamOamRamSazdazdazfaqlaqkaqqaqmaqxaqwapBascasdasearzasgashasiasjaskarAasmasnasoaspasharBapyapyaosaqBaooarFarEaqFaqEaqJaqIaqKahEatnatoatparNarMasBapXasCasDasEasFasEasGasHamKamKapnamKaloasIasJakCakCarTakCakCakCakCarTakCakCakCakCarTakCakCakCasKasLasIaloaabbikagQaabbikbikbikbikbikbikbikbikbikbikaabbikaabbikasMasMasNasNasNasNasNasNasMasMaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmVdmSdmUdmPbikbikbikbikbikbikacGbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikaqeaqdaqdaqdaqfbikbikaqLaqPaqPaqPaqRaqRaqRaqRarhapBapBatRapBarZasWapEapEatSapEasbasaapEatSapEasZaslasfapyariaroarjaAEasuahEaryarDarCarHarGauiaueaukatqarMatrapXatsattatuatvatwatxatyatzatAatBamKatCarTatDaabaabbikaabbikbikbikbikbikbikbikbikaabaabaabaabaabatEatFatDaabaabaabaabaabbikbikbikbikbikbikbikbikbikaabbikaabasMasMatGatHatIatJatKatLatMatIasMasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmVdmSdmUdmPbikbikbikbikbikbikaabatNamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikbikbikbikbikbikbikbikarIaqPaqPaqParJaqRarKarXarLapBatPatUatTatbatVaqsatQauJauEatdatcavEavBatWaqsatfaATapyapyapyathaSWatiahEarYaryasqasrahEatXatOarMarNarMaulapXatsarPattattattaumaovaunauoaupamKbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikaabaabaabaabauqaabaabbikbikaabaabaabbikbikbikbikbikbikbikbikasMasMasMasMauratJausatJausautatJatJatJauuasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmSdmSdmSdmWbikbikbikbikbikbikacGbikbikaabbikaabbikbikauvbikbikaabbikaabbikbikacGbikbikbikbikbikbikaahbikbikbikarIassaqPaqPastaqRaqRasxaxjapBarkavJauzaucauBaudauDdlLauFauGauHauIdlMauKaujaugauNauNauNauNauNcwXauhahEasyasqaryasTasSasXasVasSauMauXauPapXatsavbavcavcavcavdaveavfavgavhamKbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabbikbikbikaabaabaabaviaabaabbikbikaabbikaabaabbikbikbikbikbikbikbikasMavjavkavlavmavnavoavpatJatJavqavratJavsasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmXdmSdmSdmYbikbikbikbikbikbikacGacGacGaabaabaabaabavtavuavtaabaabaabaabacGacGacGbikbikbikbikbikbikbikbikbikbikaqLatadoKatkatjatmatlatZatYapBdlPdlQavyauZasgashdlRdlSashavvavaashdlTdlUashavxavwavAavzapyavHapyavCahEauaauxaubasqdoTauCauAaSqavMavOavOavQavPavTavUavUavUavVavWavXavYavYavYbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikaabaabavZawaavZaabaabbikaabbikbikaabaabbikbikbikbikbikbikasMawbawcawdaweawfawgatJatJatJawhawiatJawjasMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmPdmZdmSdnadmPbikaahbikbikbikbikaabbikaabbikbikaabbikavtawkawlbikbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikauOauOazIazIazIavSdoJdoGdoLauRasUasUasUawoawvawuawrawrawsawrawyawwawrawtasZasZaUcawzawAawBawCawBawCawAahEahEahEahEahEasSauUauTauVaxbaxeaxdawEaxfavUawGawHawIavVawJawKawLawMavWbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikaabbikavZawNavZbikaabbikaabbikbikbikaabaabbikbikbikbikbikasMawOawPavlawQawRawSawTatJawUawVawWawXasMawYaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdnbdnddncdnddnebikbikbikbikbikbikaabbikaabbikbikaabavtavtawZaxaavtbikaabbikbikaabbikbikbikbikbikbikbikbikbikbikauOauWavDauYavGavFavIaxvdoQaxxdoZaxhaxhaxzaxlaxlaxlaxlaxlaxmaxnaxoaxlaxlaxlaxlaxpdoUaxlaxlaxqdoVaxqaxraxraxAaxraxBaxuadQavLavKavNaxXaxCaxDaxEapmavUaxGaxHaxIavVaxKaxLaxJaAZavWbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikaabavZavZaxMavZavZaabbikaabbikbikbikbikaabaabbikbikbikbikasMaxNaxOavlasMavlavlaxPaxQasMasMasMasMasMasMaabaabbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdnbdnfdnebikbikbikbikbikbikaabaabbikaabbikbikaabaxRaxSaxTaxUaxRaxVaxVbikbikaabbikbikbikbikbikbikbikbikbikbikdoFdoWaxqawnayjawpayjaygayiayhayoayjayjaypayjayjayjayjayjayqayjayjayjayjayjayjayPayuayjayjayjayQayjayRaxqaylaxqaymaynadQdpfdoYadQayraysaytaxEayUavUayvaywayxayyayzayAayBawMavWbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikaabayCayDayEayFayCaabbikaabbikbikaabbikbikaabaabbikbikayGasMavlasMavlayHayIayHayJayHayHayHayKayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikaxVaxVaxVaxVaxVaabaabaxRazsayMayNaxRayOaxVbikbikaabbikbikbikbikbikbikbikbikbikbikdoFdplaxgaxcaxkaxiaxsazgdpabOIayXayXayZdlNazbazcayXayXayXdpbayXayXayXayXayXayXazedpcazgazgazgazhaziazjaziazkazlazmaznadQadQadQadQazoazoazoaxEapmavUazpaxHazqavVcscazraxJcvYavWbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikbikbikaabayCaFCaztazuayCaabbikaabbikbikaabbikbikayGazvayGazvayGayKayHayHayHayHayHayHayHayHayHazwazxayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikazyazzazybikbikbikaxVaxVaxVaxVazAazBazCaxVbikbikaxRazDazEazFazGazHaxVbikbikaabbikbikbikbikbikbikbikbikbikbikauOauOauOdpdawmdlVayaayaaVMazJazKazKazLazMazNazOazPazPazOazQazOazRazRazRazRazRazRazSazRazRazTazUazVazWazIazXazIazYazIazIaqVazZaovaovaovaovaAaapmavUaAbaxHaAcavVaAdayAayBawMavWbikbikbikbikbikbikbikbikaabaabbikbikbikbikazyaAeazybikaabayCaAfaAgaAhayCaAiaAiaAiaAiaAiazvazvazvayGaAjayHazwazxayJayHayJayJayJayGaAkayGayGayGayGayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikaAlaAmaAlbikbikaabaxVaAnaAoaApazHaAqazHaxVaAlaAlaxRaxRaAraAsazGazHaxVaxVaAlaAlaAlaxVaxVbikaabbikbikbikbikbikbikbikbikdpdaxFaxwaxYaxWaxZazJaAtaAuaAvazMaAwazOaAxaAyaAzaAAaABaACaADbfTaAFaAGaAHaAIaAJaAKaALaxqaxraAMaANaAOaAPaAQaAPaAPaAPaARaAPaAPaAPaAPaASdoMaAUaAVaAWaAXaAYcNsaBaaUadcuavWaabaBbaBcaBcaBcaBcaBcaBdaabaabbikbikbikbikazvaBeazvbikaAiayCayCaBfaBgayCaBhayHayHayHayJaBiayHaBjayGayHayHayHaBkayJayHayGaBlaBmayGayHaBnayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikappaBpaBobikaBqaBsaBraabaabaAlazHaAlbikbikaabaxVaBuaBvaBwaBxaByaBzaxVaBAazHaBBaBCaBDaBEaBEaBEaBEaBEaBEaBEaBEaBFaxVbikaBGbikbikbikbikbikbikbikbikdpdaycaybayfayeaySdoRaBIaBJaBKazMaAwazOaBLafvaBNaAAaABaBOaBPaBPaBPaBPaBPaAIbjlaAKaxlaxqaxrazIaBQaBRaBSaBTaBSaBSaBUaBVaBWaBWaBWaBWaBWaBWaBXaBYaBZaCaaCbaCcaCdaCeavWavWaCfaCgaChaChaChaChaChaCgaCfaabbikbikbikbikazvaCiaCjbikaAiaCkaClaCmaCnayHayHayHayJayHayJaCoayHayHayGayHaCpaCqaCoaAkayHayGaCraCsayGayHaCtayGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaCuaBtaCvaBtaCuaCwaCxaCwaCuaabaAlaCzaCAbikbikaxVaxVaxVaxVaxVaCBaCCaCDaCEaCFaCGaCGaCHaCIaCIaCJaCKaxVazHaxVaxVaxVaCLaxVbikaabbikbikbikbikbikbikaabaabdpdayVayTdpeayWazaaCMaCNaCOaBKazMaAwazOaCPaCQaCRaAAaCSaCTaBPaCUaBPaCVaCVaAIaBPaAKaxlaxqaCWazIaCXaBRaCYaCZaDaaDbaDcaDdaDeaDfaDgaDhaDiaDjaDkaDlaDmaDnaDoaDpaDqaDraDsaDtaCfaCgaChaChaChaChaChaCgaCfaabaabaabaabazvazvaDuaDvazvaAiaDwayHaDxayHayKayHayGayGaDyayGayGaDzayJayJaCoaDAaDBayHayGayHaDCaDCaDCaDCaDCaDCaDCaDCaDCaDDaDDaDDaDDaacaDDaDDaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaDEaBtaCyaBtaDEaCwaDFaCwaDEaxVaAlaDHaDIaAlaAlaxVazHazHazHazHazHazHazHaCBaCLaxVaxVaxVaxVaxVaDJaxVaxVazHaDKaxVaDLaCLaxVaxVaxVbikbikbikbikbikaDMaDMaDMaDMaDMaDMaDMaDMawmaCMaDNaDOaDPaDQaDRaDSaDTaDUaDVaDWaABaDXaBPaDYaDZaEaaEbaEcaEdaAKaxlaxqaxrazIatsaEeaEfaCZaDaaDbaEgaEhaEhaEhaEhaEhaEhaEhaEhaEhaEhaEiaEjaEkaElaEmaEnaEoaEpaCgaChaChaChaChaChaCgaCfaCfaCfbikbikazvayHaEqaEraBhaEsaDAaCoaDxayHaEtayIaEuaAkayHayHayHayHaEvayHayHaDAaEwayHaDzayHaDCaExaEyaEzaDCaEAaEBaECaDCaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaDEaDGcUCaEDaDEaEFddzaEGaEJaEKazHaELaEMaENaDKaEOazHaxVaxVaxVaxVaxVaxVaxVaCLaxVaEPaEQaERaxVaESaETaEUazHaEOaxVaENaEVaBEaBFaEWbikbikbikbikbikaEXaEYaEZaFaaFbaFcaFdaDMdoXaCMaFeaFfaFgaCMaFhazOaFiaFjaFkaFlaABaFnaBPaFoaFpaFqaFraFsaFtaFuaFvaydaFwaFxaFyaFzaFAaCZaDaaDbaFBaEhaHTaHTaHTaEhaEhaFDaFEaFEaFFaEiaFGaFHaFIaFIaFJaFKaFLaFMaChaChaChaChaChaFNaFOaFPaFQbikbikazvayHayHaFRayHaEsaFSayHaFTaFUaFUaFUaFUaFVaFUaFWayHayHayHayHayHayHayHayHayJayIaDCaFXaFYaFYaDCaFZaGaaGbaDCbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaDEaGcaGdaGeaDEaGcaGdaGeaEJaBzazHaGfazHazHazHazHazHaxVaGgaGhaGiaGjaGkaxVaCLaxVaEQaGlaEPaGmaGnaGoaxVaGpaxVaxVaxVaxVaGpaCLaEWbikazyazyazyazyaGqaEYaGraGsaGtaGuaGvaGwaDMaCMaBHaGxaGxaGxaGyaGzaGAaGzaGzaGzaGBaGCaGDaGEaGFaGFaGFaGFaGGaGHaGIaxqaGJazIatsaGKaGLaCZaDaaDbaEgaHTaGMaGMaGNaHTaEhaGOaGPaGPaGQaGRaFGaGSaGTaGUaGVaEhaGWaFQaChaChaChaChaChaFQaGXaGYaFQaabaabayGayHayHayJayJaEsaGZaGZaAiaAiaAiaEsaEsaEsayGaHaaHbayGayJayJayGayJayJayGayGaHcaHdaHeaHfaHgaHhaHiaFXaHjaDCbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbjNaInaCuaDEaEIaHlaCuaDEaEIaHlaCuaxVaCBaxVaxVaxVaxVaxVazHaxVazHaHnaHoazHazHaxVaCLaxVaHpaabaHpaxVaBvaGoaxVaHqaHraxVaENaBzaxVaAwaDMaDMaHsaHsaHsaHsaHsaHsaHsaHsaHsaGvaGvaGwaHtaHuaHvaHwaHxaHyaHzaHAaHBaHBaHBaHBaHCaHDaHEaHFaHGaHBaHBaHHaHHaHIaHJaHKaHLaHMaHNaGKaHOaHPaHPaDbaEgaHTaHQaHRaHSaHTaEhaGOaGPaGPaGQaKhaFGaGSaGUaGUaGVaEhaGWaFQaChaChaChaChaChaFQaHUaGYaFQbikbikayGaHVayHayHaHWayJaHXazwaHYaHZayKayGaFSayKayGaIaayHayGaIbayHayGaIcaIdaIeaFUaIfaFUaIgaIhaIiaIjaIkaIlaImaDCaDDaDDaacaacaDDaDDaDDaDDaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmJdmKaGddmKaIoaIoaIoaIqaIoaIoaIoaIsaItaIuaIuaIuaIuaIvaxVazHaxVaIwaIxaIyazHaIzaGpaCLaxVaxVaxVaxVaxVaxVaGpaxVazHaIyaCBazHazHaGvaIAaIBaICaIDaIDaIDaIDaIEaIDaIDaIFaIGaICaIHaIIaIIaIIaIIaIIaIIaIIaIJaIKaIKaIKaIKaILaIMaIKaINaIKaIOaILaIKaIKaIKaIKaIPaIQaIRaISaITaFzaIUaIVaHPaIWaEgaHTaIXaIYbvsaHTaEhaIZaJaaJaaJbaEiaFGaJcaJdaJdaJeaEhaJfaJgaChaChaChaChaChaJhaJiaJjaFQbikbikayGayHayHayHayHayHayHaIeaFUaFUaFUaFUaFUaFUaFUaCmayHayHayHayHaDzayHayHaDxayHaJkaJlaJmaJnaJoaFYaFYaFYaJpaDCaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
@@ -8905,14 +9108,14 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaDEaKzaKAaKzaKBaJraJraKCaKzaKAaKzaKDaKEaKFaKGaxVazHaGpaGpaxVaxVaxVaKHaKHaKHazNaKHaKHaKHaKHaKHaGvaDMaDMaDMaDMaDMaDMaDMaJFaKIaJGbikaabbikaabbikaabbikaabbikaJGaJLaJMaKJaKKaKLaKMaKNaJMaGvaIKaKOaKOaKPaKQaKRaKSaKTaKSaKUaKVaKWaKOaKOaIKaJZaxqaKXazIaKbaGKaGLaCZaDaaDbaEgaKYaKZaLaaLbaLcaLcaLdaLeaLcaLeaLfaLgaLhaLiaLjaLkaLlaCfaKraChaChaChaChaChaKrayGaCtayHaLmaLnayJayGayJaCtayHayGaCtaDxayGaLoayHayGaLpayHayJaLqaLrayGaLsayHayJaAkaAkaDxaAkaLtaDCaLuaIhaLvaLwaLvaIhaLxaDCaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaLyaCuaLzaGdaKzaLAaLBaLCaLDaKzaGdaLEaInaCuaLFaLGaxVazHazHazHazHazHazHaKHaLHaLIaLJaLKaLLaLMaLHaKHaLNaLOaIDaIDaIDaIDaIDaIDaLPaLQaJGaabaLRaLRaLRaLRaLRaLRaLRaabaJGaJLaJMaLSaLTaLUaLVaLSaJMaGvaIKaIKaIKaIKaLWaLXaJOaLYaJOaLXaLZaIKaIKaIKaIKaJZaxqaMaazIaKbaGKaFAaCZaDaaDbaFBaMbaMcaMcaMcaMcaMcaMcaMcaMdaMcaMeaMeaMeaMeaMeaMfayGaCfaKraChaChaChaChaChaKrayGayGayHaMgaLnayJaMhayGayHayHayGayHaDxayJayHayHayGayHayHayJaDxayIayGayHayHayJaMiayHaDxayHaMjaMkaMkaDCaDCaDCaDCaDCaDCaDCaDDaDDaDDaDDaDDaabbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaKAaKzaKzaKzaKzaKzaKzaKAaInaMlaCuaMmaMnaMoaMoaMoaMoaMoaMoaMpaKHaLHaMqaLJaMraMqaMqaLHaKHaMsaMtaMuaMuaMuaMuaMuaMuaMuaMuaMvbikaLRaMwaMxaMyaMzaMAaLRbikaJGaJLaJMaMBaMCaMDaMEaLSaJMaGvaIKaMFaMFaKPaMGaMHaKSaKTaKSaMHaMIaMJaKOaKOaIKaJZaxqaKaazIaMKaBRaMLaCZaDaaDbaEgaMbaMcaMMaMNaMOaMOaMcaMPaMQaMRaMeaMSaMTaMUaMeaMVayGbikaMWaMXaMXaMXaMXaMXaMYbikayGayHaMZaNaayJayJayGayGayJayJaNbaNcayJayGazxayGayGayJayJaNdaNeayGayGayGaHYaMiayHaDxayHaMjazwayKaFSayGaNfaNgaNfayGayGayGaabaabaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNhaNiaNjaNiaNiaNkaNlaNiaNiaNjaNmaNnaCuaKBaNoaMoaNpaNqaNraNsaNtaNuaKHaLHaMqaLJaNvaMqaMqaLHaKHaNwaNxaNyaNzaNAaNBaNCaNDaNEaNFaMvaabaLRaNGaNHaNIaNJaNKaLRaabaJGaJLaJMaNLaNMaNNaNOaNPaJMaGvaIKaJNaJOaNQaNRaLXaJOaNSaJOaLXaNTaNUaJOaJYaIKaJZaxqaNVazIaKbaEeaEfaCZaDaaDbaNWaNXaMcaNYaMQaMQaMQaNZaOaaObaOcaMeaOdaOeaOfaOgaOhazxbikbikbikbikbikbikbikbikbikayGaOiaOjaOkaOlaOmayGaEtayHaHVaDxayHayGbikayGayHayHayHayHaDxaOnaOoaOpaOpaOpaOpaOqaOraOsaOtaOuaOvaOuaOwaOxaOxaOyaOzaOAaOBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNhaNmaNiaODaOEaOFaOGaOHaOIaOJaOKaOLaOMaONaOOaKzaKBaOPaMoaOQaORaOSaOTaOSaOUaKHaOVaMqaOWaOXaOYaOXaOZaPaaPbaPcaPdaPdaPdaPdaPdaPdaPeaPfaMvbikaLRaPgaNHaPhaNJaPiaLRbikaJGaJLaJMaPjaPkaPlaPmaPnaJMaGvaIKaPoaPoaKPaPpaMHaKSaPqaKSaMHaPraKWaPsaPsaIKaPtazUaPuazIaKbaEeaPvaPvaPvaPvaPwaPxaPyaPzaPAaPBaPBaPBaPCaPBaPDaPEaPFaPGaPHaPEaPIaPJazxayGayGayGayGayGayGayGayGayGayGayGayGaBMayGayGayGayGayHaDxaOiazvaabazvayHaPLaPMaPNaPOaPPaPQaPRaPRaPRaPRaPSaPTaPUaPVaPWaPXaPWaPYaPWaPWaPZaQabpqaQbaQcaQdaQeaQeaQeaQeaQeaQeaQeaQeaQeabLadbbikbikbikbikbikbikbikaaabdBaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaQgaQhaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaQmaMoaQnaQoaQpaQqaQraQsaKHaQtaMqaQuaQvaQwaQxaQyaKHaQzaPdaPdaPdaPdaPdaPdaPdaPeaQAaMvaabaLRaQBaQCaQDaQEaQFaLRaabaJGaJLaJMaQGaQHaQIaQJaQKaJMaGvaIKaIKaIKaIKaQLaLXaJOaLYaJOaLXaQMaIKaIKaIKaIKaQNaQOaQPazIaMKaQQaQRaQRaQRaQSaQTaQUaQVaQWaQXaQVaQYaQZaRaaQVaRbaRcaRdaReaRfaMeaRgaRhaRiaRjaRjaRhaRkaRlaRlaRlaRlaRlaRmaRnaRlaRoaRpaRqaRraRsaRvaRuaTkaRwaRxaRwaRyaRzayHayGaRAaRBaRCaRDaREaRFaRGaRHaRIaRJaRIaRKaRLaRMaRNaROaRPaOCbbVaTCaRTaRUaQdaRVaRWaRXaRYaRZaSaaSbaScaSdaprbikbikbikbikbikbikbikaaabfmbifbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSfaOFaOFaNjaOMaQjaOFaQjaSgaQjaOFaQjaOMaQkaQlaKzaKBaShaMoaMoaSiaSjaSkaSjaMoaKHaKHaKHaKHaSlaSmaSnaSoaKHaSpaSqaSraPdaPdaZVaPdaStaSuaSvaMvbikaLRaLRaSwaSxaSwaLRaLRbikaJGaJLaJMaSyaSzaSAaQJaSBaJMaGvaIKaJNaJOaSCaNRaLXaJOaLYaJOaLXaNTaSDaIKaIKaIKaSEaSFaSGaSHaSIaSJamKamKaSKaSLaSMaSNaMcaSOaMQaMcaSPaMcaSQaMcaSRaSSaSTaSUaSVaTeaSXaSYaSZaTaaTbaTcaTdaTbaTbaUjaTbaSYaTfaSYaOvaTgaSYaThaTiaTjaTmaTlaToaTnaTqaTpaWIaTraOuaTsaTtaTuaTvaTwaTxaTyaTzaRHaTAaTBaRIcLhaTDaTEaTFaROaTGaRQaRRaRSaTHaTIaQdaTJaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikaaabfmbigbijbihbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaTMaTNaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaTOaTPaTQaTRaTSaTSaJraTTaTUaTVaTWaTXaTYaTZaMqcoCaKHaUbaUcaUdaUeaUfaUgaUhaUiaUZaUkaMvbikaabbikaUlaUmaUlbikaabbikaJGaJLaJMaUnaUoaUpaUqaUraJMaGvaIKaUsaUtaKPaUuaUvaKSaUwaKSaUxaUyaUzaIKaUAaUBaUCaUDaUEaUFaUGaUHbikbikaSKaUIaUJaUKaMcaULaUMaMQaMQaUNaMQaMQaMQaUOaMeaUPaMeaUQaURaMeaUSaMeaUTaUUaUVaUWaUXaUYaUTbwNaVaaVbaVcaVbaVbaVbaVbaVdaWLaVbaVeaVfaWFaWBaVbaVhayHaRDaViaTvaVjaVkaVlaVmaVnaVoaVpaVqaRIaVraVsaVtaVuaVvaTGaRQaRRaRSaRTaVwaQdaVxaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikbdBblqbjMbmKbjMbqQbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVyaVzaNiaODaOMaOFaVAaVBaOFaOFaVCaVAaOMaONaVDaKzaKBaVEaVFaVGaVHaVGaVGaVGaVGaVGaVIaJraKHaVJaVKaVJaKHaKHaVLaVMaVLaMuaMuaMuaMuaVLaVNaVOaMvaVPaVQaVQaVRaVSaVRaVQaVQaVTaJGaVVaJMaVWaJMaVXaVYaVZaJMaWaaIKaIKaIKaIKaWbaWcaWdaWeaWdaWcaWbaIKaIKaWfaUDaUDaUDaUDaWgaWhaWiaWjaWkaSKbKgaUJaWmaMcaMcaMcaMcaMcaMcaMcaMeaMeaUOaWnaWoaWpaWqaWraWsaWuaWtaUTaWvaWwaWxaWyaWzaUTaWAaWGaWCaWDaWCaWEaWHaYDaWNaYFaWJaWKaYGaWMaYEaVbaWOaRtaWPaWQaWRaVjbtTcvIaVmaWTaRIaWUaWVaWWaWXaWYaTFaTFaRIaRIaRQaRRaRSaTHaWZaQdaXaaXbaXcaXdaXeaXfaScaScaXgaprbikbikbikbikbikaaabfmbqRbmKbmKbmKbqSbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVyaNiaNjaNiaNiaNkaNlaNiaNiaNjaVzaXhaCuaXiaVEaInaXjaXjaXkaXjaXlaDEaXmaXnaJraXoaXpaXqaXqaXraXsaXqaXtaXqaXqaXqaXuaXqaXqaXvaXwaXxaXyaXzaXAaXyaXBaXyaXyaXyaXyaXCaXDaXEaXqaXqaXFaXGaXHaXIaXJaXKaXLaXMaXRaXPaXPaXPaXPaXPaXPaXPaXQaXWaXXaXSaXTaXUaXVaXYaZHaXZaUDaUDaYaaYbaYcaYbaYcaYdaYeaYfaYgaYhaYiaMeaYkbBvaYmaYlaYnaYnaYoaYpaYqaYraUTaYsaYtaYuaYuaYvaUTaYwaYxaYyaYzaYAaYAaYBaYCaYHbbFbalbbHbbGbbJaVgaVbaVhaKsaRDaYIaYJaYJaYKaYLaYJaYMaRIaYNaYOaRIaYPaYQaTFaYRaRIaYSaYTaYUaRSaQbaQbaQdaYVaQeaYWaYXaQeaQeaQeaQeaQeabLadbbikbikbikbikbqUbqTbqVbmKbmKbrUbthbmKbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaYYaKzaKzaKzaKzaKzaKzaYYaInaMlaCuaYZaZaaInaZbaZcaZdaZdaZeaDEaZfaXnaZgaZhaXpaZiaZjaZkaZlaZlaZmaZnaZnaZnaZoaZpaZpaZqaZraZsaZlaZlaZtaZpaZvaZwaZxaZxaZyaZzaZAaZuaZuaZuaZBaXGaXHaXIaXJaXJaXJaXJaZCaXJaXJaXJaXJaXJaXJaZDaZEaZNaZFaZGaZJaZIaZLaZKaZMaZNaZNaZNaZOaZPaZPaZPaZQaYiaYiaYiaZRaZSaYiaMebbsaZUaYnaYnbcMaYnaZWaZXaYqaZYaUTaZZbaababbacbadaUTbaebafbagbahbaibajaVbaVbbbKbbLaVbaVbbakbbMbakaVbaVhayHaRDbamaTvaTvaTvbanaTvbaoaRIaRIaRIaRIaRIaRIaRIbapaRIaRSaRSaRRaRSbaqbaraQbbasbatbaubavbawbaxbaybazbaAbikbikbikbikaaabtibtjbtibtibtibtkbtibtlbtibtjbtiaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdetaNiaNjaNiaNiaNkaNlaNiaNiaNjaNmdeuaCuaKBaNoaMoaNpaNqaNraNsaNtaNuaKHaLHaMqaLJaNvaMqaMqaLHaKHaNwaNxaNyaNzaNAaNBaNCaNDaNEaNFaMvaabaLRaNGaNHaNIaNJaNKaLRaabaJGaJLaJMaNLaNMaNNaNOaNPaJMaGvaIKaJNaJOaNQaNRaLXaJOaNSaJOaLXaNTaNUaJOaJYaIKaJZaxqaNVazIaKbaEeaEfaCZaDaaDbaNWaNXaMcaNYaMQaMQaMQaNZaOaaObaOcaMeaOdaOeaOfaOgaOhazxbikbikbikbikbikbikbikbikbikayGaOiaOjaOkaOlaOmayGaEtayHaHVaDxayHayGbikayGayHayHayHayHaDxaOnaOoaOpaOpaOpaOpaOqaOraOsaOtaOuaOvaOuaOwaOxaOxaOyaOzaOAaOBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdetaNmaNiaODaOEaOFaOGaOHaOIaOJaOKaOLaOMaONaOOaKzaKBaOPaMoaOQaORaOSaOTaOSaOUaKHaOVaMqaOWaOXaOYaOXaOZaPaaPbaXtaPdaPdaPdaPdaPdaPdaPeaPfaMvbikaLRaPgaNHaPhaNJaPiaLRbikaJGaJLaJMaPjaPkaPlaPmaPnaJMaGvaIKaPoaPoaKPaPpaMHaKSaPqaKSaMHaPraKWaPsaPsaIKaPtazUaPuazIaKbaEeaPvaPvaPvaPvaPwaPxaPyaPzaPAaPBaPBaPBaPCaPBaPDaPEaPFaPGaPHaPEaPIaPJazxayGayGayGayGayGayGayGayGayGayGayGayGaBMayGayGayGayGayHaDxaOiazvaabazvayHaPLaPMaPNaPOaPPaPQaPRaPRaPRaPRaPSaPTaPUaPVaPWaPXaPWaPYaPWaPWaPZaQabpqaQbaQcaQdaQeaQeaQeaQeaQeaQeaQeaQeaQeabLadbbikbikbikbikbikbikbikaaabdBaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaQgaQhaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaQmaMoaQnaQoaQpaQqaQraQsaKHaQtaMqaQuaQvaQwaQxaQyaKHaQzaZmaPdaPdaPdaPdaPdaPdaPeaQAaMvaabaLRaQBaQCaQDaQEaQFaLRaabaJGaJLaJMaQGaQHaQIaQJaQKaJMaGvaIKaIKaIKaIKaQLaLXaJOaLYaJOaLXaQMaIKaIKaIKaIKaQNaQOaQPazIaMKaQQaQRaQRaQRaQSaQTaQUaQVaQWaQXaQVaQYaQZaRaaQVaRbaRcaRdaReaRfaMeaRgaRhaRiaRjaRjaRhaRkaRlaRlaRlaRlaRlaRmaRnaRlaRoaRpaRqaRraRsaRvaRuaTkaRwaRxaRwaRyaRzayHayGaRAaRBaRCaRDaREaRFaRGaRHaRIaRJaRIaRKaRLaRMaRNaROaRPaOCbbVaTCaRTaRUaQdaRVaRWaRXaRYaRZaSaaSbaScaSdaprbikbikbikbikbikbikbikaaabfmbifbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSfaOFaOFaNjaOMaQjaOFaQjaSgaQjaOFaQjaOMaQkaQlaKzaKBaShaMoaMoaSiaSjaSkaSjaMoaKHaKHaKHaKHaSlaSmaSnaSoaKHaSpdpgaSraPdaPdaZVaPdaStaSuaSvaMvbikaLRaLRaSwaSxaSwaLRaLRbikaJGaJLaJMaSyaSzaSAaQJaSBaJMaGvaIKaJNaJOaSCaNRaLXaJOaLYaJOaLXaNTaSDaIKaIKaIKaSEaSFaSGaSHaSIaSJamKamKaSKaSLaSMaSNaMcaSOaMQaMcaSPaMcaSQaMcaSRaSSaSTaSUaSVaTeaSXaSYaSZaTaaTbaTcaTdaTbaTbaUjaTbaSYaTfaSYaOvaTgaSYaThaTiaTjaTmaTlaToaTnaTqaTpaWIaTraOuaTsaTtaTuaTvaTwaTxaTyaTzaRHaTAaTBaRIcLhaTDaTEaTFaROaTGaRQaRRaRSaTHaTIaQdaTJaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikaaabfmbigbijbihbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaTMaTNaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaTOaTPaTQaTRaTSaTSaJraTTaTUaTVaTWaTXaTYaTZaMqcoCaKHaUbdphaUdaUeaUfaUgaUhaUiaUZaUkaMvbikaabbikaUlaUmaUlbikaabbikaJGaJLaJMaUnaUoaUpaUqaUraJMaGvaIKaUsaUtaKPaUuaUvaKSaUwaKSaUxaUyaUzaIKaUAaUBaUCaUDaUEaUFaUGaUHbikbikaSKaUIaUJaUKaMcaULaUMaMQaMQaUNaMQaMQaMQaUOaMeaUPaMeaUQaURaMeaUSaMeaUTaUUaUVaUWaUXaUYaUTbwNaVaaVbaVcaVbaVbaVbaVbaVdaWLaVbaVeaVfaWFaWBaVbaVhayHaRDaViaTvaVjaVkaVlaVmaVnaVoaVpaVqaRIaVraVsaVtaVuaVvaTGaRQaRRaRSaRTaVwaQdaVxaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikbdBblqbjMbmKbjMbqQbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdeOaVzaNiaODaOMaOFaVAaVBaOFaOFaVCaVAaOMaONaVDaKzaKBaVEaVFaVGaVHaVGaVGaVGaVGaVGaVIaJraKHaVJaVKaVJaKHaKHaVLdpiaVLaMuaMuaMuaMuaVLaVNaVOaMvaVPaVQaVQaVRaVSaVRaVQaVQaVTaJGaVVaJMaVWaJMaVXaVYaVZaJMaWaaIKaIKaIKaIKaWbaWcaWdaWeaWdaWcaWbaIKaIKaWfaUDaUDaUDaUDaWgaWhaWiaWjaWkaSKbKgaUJaWmaMcaMcaMcaMcaMcaMcaMcaMeaMeaUOaWnaWoaWpaWqaWraWsaWuaWtaUTaWvaWwaWxaWyaWzaUTaWAaWGaWCaWDaWCaWEaWHaYDaWNaYFaWJaWKaYGaWMaYEaVbaWOaRtaWPaWQaWRaVjbtTcvIaVmaWTaRIaWUaWVaWWaWXaWYaTFaTFaRIaRIaRQaRRaRSaTHaWZaQdaXaaXbaXcaXdaXeaXfaScaScaXgaprbikbikbikbikbikaaabfmbqRbmKbmKbmKbqSbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdeOaNiaNjaNiaNiaNkaNlaNiaNiaNjaVzdeQaCuaXiaVEaInaXjaXjaXkaXjaXlaDEaXmaXnaJraXoaXpaXqaXqaXraXsaXqdpjaXqaXqaXqaXuaXqaXqaXvaXwaXxaXyaXzaXAaXyaXBaXyaXyaXyaXyaXCaXDaXEaXqaXqaXFaXGaXHaXIaXJaXKaXLaXMaXRaXPaXPaXPaXPaXPaXPaXPaXQaXWaXXaXSaXTaXUaXVaXYaZHaXZaUDaUDaYaaYbaYcaYbaYcaYdaYeaYfaYgaYhaYiaMeaYkbBvaYmaYlaYnaYnaYoaYpaYqaYraUTaYsaYtaYuaYuaYvaUTaYwaYxaYyaYzaYAaYAaYBaYCaYHbbFbalbbHbbGbbJaVgaVbaVhaKsaRDaYIaYJaYJaYKaYLaYJaYMaRIaYNaYOaRIaYPaYQaTFaYRaRIaYSaYTaYUaRSaQbaQbaQdaYVaQeaYWaYXaQeaQeaQeaQeaQeabLadbbikbikbikbikbqUbqTbqVbmKbmKbrUbthbmKbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaYYaKzaKzaKzaKzaKzaKzaYYaInaMlaCuaYZaZaaInaZbaZcaZdaZdaZeaDEaZfaXnaZgaZhaXpaZiaZjaZkaZlaZldpkaZnaZnaZnaZoaZpaZpaZqaZraZsaZlaZlaZtaZpaZvaZwaZxaZxaZyaZzaZAaZuaZuaZuaZBaXGaXHaXIaXJaXJaXJaXJaZCaXJaXJaXJaXJaXJaXJaZDaZEaZNaZFaZGaZJaZIaZLaZKaZMaZNaZNaZNaZOaZPaZPaZPaZQaYiaYiaYiaZRaZSaYiaMebbsaZUaYnaYnbcMaYnaZWaZXaYqaZYaUTaZZbaababbacbadaUTbaebafbagbahbaibajaVbaVbbbKbbLaVbaVbbakbbMbakaVbaVhayHaRDbamaTvaTvaTvbanaTvbaoaRIaRIaRIaRIaRIaRIaRIbapaRIaRSaRSaRRaRSbaqbaraQbbasbatbaubavbawbaxbaybazbaAbikbikbikbikaaabtibtjbtibtibtibtkbtibtlbtibtjbtiaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaLyaCuaInaGdaKzbaBbaCbaDbaEaKzaGdaInaInaCubaFaVEaInbaGbaHaZdaZdaZeaDEbaIaXnaJraZhaXpaXqbaJbaKbaLbaLbaMbaNbaObaLbaPbaLbaQbaLbaRbaSbaLbaLbaWbaLbaLbaUbaVbaLbaWbaXbaYbaZaXqaXqbbabbbbbcbbdbbebbfbbebbgbbhbbgbbgbbgbbgbbgbbgbbibbjbbkbbkbbkbbkbblbbkbbmbbnbbkbbkbbobbpbbqbbqbbqbbqbbqbbqbbqbbraYiaYiaMebcTbbtbbubbvbbvbbwbbxaZXaYqbbyaUTaUTaUTaUTaUTbbzaUTbbAbbBbbCbbDaWCbbEaVbbdfbdcbdgbbIbkZbjrcSNcIgaVbaVhaHYaRDbbNbbOaTvbbPbbQaTvbbRbbRaRDbbSbbTbbUaQbdilbbWbbXaRSaRSbbYbbZaQbbcaaQbbcbbatbccbcdbcebatbatbcfbaAbikbikbikbikbqUbtmbwlbutbwmbtmbmKbutbwmbtmbwlbutbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaDEaInaYYaKzaKBaJraJraKCaKzaYYaKzbcgbchbcibcjaInbckbckaXkbckaXlaDEbclaXnaJraDEbcmbcmbcnbcobcobcobcobcobcobcpbcqbcobcobcobcobcobcobcrbcsbctbctbcubctbcvbcwbcxbcvbcvbcybczbcAbcmbcBbcBbcCbcCbcCbcDbcDbcDbcDbcDbcDbcDbcDbcEbcFbcFbcGbcFbcHbcHbcHbcHbcIbcJbcHbcEbcKbcKbcKbcKbcKbcKbcKbcKbcLbcLbcLaMebcObcNbcPbcPbcPbcPbgRbcQbcRbmwbcUaZTbcVbcWbcXbcYaUTaUTbcZbdabdbbdabdaaVbcYtbdddcnbdebdebdecZrcZqaVbbdhbdiaRDbdjaTvbbPbbPbbQbbPaTvbdkaRDbdlbdmbdnaQbaRSbdobdpbdqbdqbdrbdsbdtbdubdvbdwbdxbdybdzbavbatbatbdAbaAbikbikbikbikbqUbwnbmKbutbBQbtmbmKbutbBQbtmbmKbFmbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbdCbdDaJrbdEbdFbdGbdHbdIbdJbdHbdKbdLbdHbdHbdMbdNbdObdPbdQbdQbdQbdRbdQbdSbdTaDEbdUbdVbdWbcobdXbdYbdZbeabebbecbedbeebefbegbehbeibcobejbekbctbelbembenbcvbeobepbeqbcvberbesbetberberberbeuaXJaXObcDbikbikbikbikbikbikbikbcEbevbewbexbeybezbeAbeBbeCbeDbeEbeFbcEbikbikbikbikbikbikbikbcKbeGaYibeHaMebeIbcNbmwbmwbmwbmwbmwbeJbeKbmwbmwbmwbnMbeMbeMbeNbeObePbeQbeRbeSbeTbeUaVbbeVbeWdlHbeYbeYbeXbeZbfaaVbaVhayHaRDbfbbfcaTvbbPbbQaTvbfdbfdaRDaRDbfeaRDaQbbffbbWbbZbfgbfgbfhbbZaQbaQbaQbbfibatbfjbfjbfkbfjbatbflbaAaabbikbikaabbdBbtmbmKbutbBQbtmbmKbutbBQbtmbmKbutbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
@@ -8925,62 +9128,62 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbrcbltbltblubltbltbltblvbltbltbtnaabaInboibdFbokbgNbjObjObjObimbolbombonboobgNbopboqbjWblCborblCbosbotblCboubovbowbcobnbbncbndbiCbcobejbnfbngboxboybozboAboBbngboCboDboEbSVbyzbyzbyzbuVboGboHboIbnqboJboKboLboMboNboOboPboQbmgboRbnvboSboTboUboTboSbnvboVbmgboWboXboYboZbpabpbbpcbpdbnAbpebpfbpfbpgaMeaMeaMeaMebphbjfbphbpiaMeaURaMeaMeaUTaUTaUTaUTbplbpkbpkbpkbpkbpmbpJaVbbakbpnbakbpobpobakbpnbakaVbbnSbmFbmFbppbnTaRDaRDaRDaRDaRDbjvaRDaRDaRDaRDaQbbpqaQcaQcaQcaQcaQcaQcaQbaQbbprbpsbatbatbatbavbatbatddAbaAbaAbaAbaAbgKbqUddFbmKbmKbmKbmKbmKbmKbmKbmKbmKddGbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaKzaDEaDEaDEaDEaDEaDEbtobpubgNbgNbgNbgNbgNbgNbpvbgNbgNbgNbejbejbpxblCbpybpzbosbpAblCdlEbpCbpBbcobnbbncbndbecbcobejbnfbngbpDbpEbpFboAbpFbngboCbpGbpHbAibmubpKbpLbnmbpMbpNboIbpObpPbpQbpRbpSbpSbpRbpTbpUbmgbpVbnvbnvbpWbpXboTboSbnvbpYbmkbpZbqabqbbqcbqdbqebqbbqfbnAbqgbqhbqibqjbqkbqlbqmbqnbqnbqnbqnbqnbqnbqobqpbqqbqnbqnbqsbqnbqnbqnbqnbqnbqnbqnbqndcZbqubqvbqvbqvbqvbqvbqvbqwbqlbqxbqybqyaHkbqAbqBbqAbqCbqAbqDbqEbqFbqAbqGbqHbqIbqJbqKbqKbqKbqKbqKbqKbqKbqLbqMbqNbqNbqNbqNbqObqNbqPbKnddHbPfddIbiibPfdlbbmKbmKbmKbmKddKbmKddKbmKbmKbmKddGbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbtpbtqbtqbtqbtqbwpbwpbtqbtqbxZbikaabaInaLAaJtbzPbzObzRbzQbzQbzQbzQbzSbzUbzTbcsbdVbBFbrhblCblCblCbribotblCbcobcobcobcobnbbrjbrkbrlbcobrmbrnbngbrobrpboAbpFbrqbngboCbrrbpHbAibpIbrsbrtbnmbrubpNboIbpObrvbrwbrxbrybrzbrAbpTbrBbmgbrCbpWbnvbrDbrEbrDbnvbpWbrFbnzbrGbqbbqbbqcbrHbqebqbbrIbnAbrJbqibqibqjbqkbqlbqnbqnbqnbqnbqnbqnbqnbrKbqnbqnbqnbqnbqnbqnbrLbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrMbrNbrObrPbqKbqKbrQbmFbmFbmFbmFbmFbmGbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbrRbmFbrSbrTbatbatbatbatbatbatbatddLbaAbgKbaAbaAbaAbqUddMddOddNbdBddPbdBddPbdBddQddMddObqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCbBHdjhbDDdjidjidjkdjjbtqbxZbjNaInaInaKBbrWbrXbrYbrXbrXbrXbrXbrZbsabsbbcsbcsbscbsdblCbmUbsebsfbpAblCbsgbshbsgbcobcobcobcobsibcobsjbskbngbslbsmbpFbsnbsobngboCbnmbspbAibpIbpIbsqbnmbsrbpNboIbpObWDbrwbrxbstbsubrAbpTbsvbmgbswbsxbnvbsybszbsAboSbsBbsCbsDbsEbsFbsGbsHbsIbsJbqbbsKbnAbsLbsMbqibqjbqkbqlbqnbsNbqnbqnbqnbqnbsObsPbsPbsPbsPbsQbqnbqnbqnbqnbsRbqnbsNbsSbqnbsTbsUbsVbqnbsWbsXbsXbsYbsZbtabtbbmFbmFbmFbmFbmFbmFbmFbtcbtdbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbtebtfbtfbtgddSddRddUddTddTddTddTddVddWbaAaabbikbikaabbqUddXddZddYdeabqUbikbqUdecdebdecdecbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCbBHdjhbDDdjidjidjkdjjbtqbxZbjNaInaInaKBbrWbrXbrYbrXbrXbrXbrXbrZbsabsbbcsbcsbscbsdblCbmUbsebsfbpAblCbsgbshbsgbcobcobcobcobsibcobsjbskbngbslbsmbpFbsnbsobngboCbnmbspbAibpIbpIbsqbnmbsrbpNboIbpObWDbrwbrxbstbsubrAbpTbsvbmgbswbsxbnvbsybszbsAboSbsBbsCbsDbsEbsFbsGbsHbsIbsJbqbbsKbnAbsLbsMbqibqjbqkbqlbqnbsNbqnbqnbqnbqnbsObsPbsPbsPbsPbsQbqnbqnbqnbqnbsRbqnbsNbsSbqnbsTbsUbsVbqnbsWbsXbsXbsYbsZbtabtbbmFbmFbmFbmFbmFbmFbmFbtcbtdbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbmFbtebtfbtfbtgddSddRddUddTddTddTddTddVddWbaAaabbikbikaabbqUddXddYddYdeabqUbikbqUdecdebdecdecbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCdjldjidjidjidjidjidjidjideHdjnaGddjnaJrbtrbrXbtsbttbtubtvbtwbrZbtxbtybtzbtzbtAbtBblCblCblCbosbtCborbcsbcsbcsbcsbtDbejbejbskbejbsjbskbngbtEbtFbtGbtHboAbngbtIbnmbtJbAibpIbpIbtKbtLbtMbpNbtNbnqbtObtPbpRbpRbpRbpRbpTbtQbmgbtRbtSbmgbmgbmgbmgbmgbmgbmgbnzbnAbqrbtUbtVbtWbtXbtYbtZbnAbvubuabuabucbucbucbucbucbucbucbudbudbuebufbugbugbufbuebudbudbuhbuhbuhbuhbuhbuhbuibuibujbuibuibuibuibuibukafkbumbunbmFbmFbuobuobupbupbupbupbupbuqbtfbtfbtebtfbmFbtfbtfbtfbtfburbusbusbusbusdedbuubuubuubuubuubuubuubuubuubikbikbikbikbdBddYddYddYdeebqUbikbqUdefdebdebdegbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCdjodjpdjpdjidjpdjpdjpbtqdjqaInaInaInaKBbuvbrXbuwbuxbuxbuxbuybrZbejbuzbuAbuBbuCbuDblCbmUbuEbosbuFborbuGbuHbuIbuJbuKbuLbuLbuMbuLbuNbuObngbuPbuQbuRbuSbuTbuUdngbyzdnidnhbpIbuXbuYbuZbtMbpNbvabnqbvbbvcbvdbvebvfbvgbvhbnqbnqbvibvjbvkbvlbvmbvlbvnbvjbikbvobnAbvpbvqbvrccIbtXbqbbvtbnAbxebvwbxfbucbzcbvybvzbvAbvBbvCbvDbvEbvFbvGbvHbvHbvGbvIbvJbvKbuhbvLbvMbvNbvObuhbvPbvQbvRbvSbvTbvUbvUbvVbukafNbvXbvYbvZbvYbwabwabupbwbbwcbwdbupbwebwfbwebupbwgbtfburbusbwhbwibwhbusbwjbwkbusdeicngbxXbwobikbikbikbikbikbikbikbikbikbikbqUddXddZddYdejbqUbikbqUdekdekdekdekbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbBGbDCdjodjpdjpdjidjpdjpdjpbtqdjqaInaInaInaKBbuvbrXbuwbuxbuxbuxbuybrZbejbuzbuAbuBbuCbuDblCbmUbuEbosbuFborbuGbuHbuIbuJbuKbuLbuLbuMbuLbuNbuObngbuPbuQbuRbuSbuTbuUdngbyzdnidnhbpIbuXbuYbuZbtMbpNbvabnqbvbbvcbvdbvebvfbvgbvhbnqbnqbvibvjbvkbvlbvmbvlbvnbvjbikbvobnAbvpbvqbvrccIbtXbqbbvtbnAbxebvwbxfbucbzcbvybvzbvAbvBbvCbvDbvEbvFbvGbvHbvHbvGbvIbvJbvKbuhbvLbvMbvNbvObuhbvPbvQbvRbvSbvTbvUbvUbvVbukafNbvXbvYbvZbvYbwabwabupbwbbwcbwdbupbwebwfbwebupbwgbtfburbusbwhbwibwhbusbwjbwkbusdeicngbxXbwobikbikbikbikbikbikbikbikbikbikbqUddXddYddYdejbqUbikbqUdekdekdekdekbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjrbtqbtqbtqbtqbtqbtqbtqbtqdjqbikbikaInbwqbdFbwrbrXbwsbrXbwtbuxbwubwvbrZbwwbwxbwybwzbuDblCblCblCblCblCblCbwAbwBbwCbwDbwEbngbngbngbngbngbngbngbwFbngbngbngbwGbngbwHbwIbwJbpIbpIbpIbwKbtLbwLbpNbwMbnqbIDbvcbnrbnrbnrbnqbwObnqbwPbwQbwRbwSbwTbwUbwVbwWbwXbwYbwZbnAbxabqbbxbbxcbtXbxdbqbbnAbzbbxgbANbucbxhbxibxjbxkbxlbxmbxnbvHbvHbvHbvHbvHbvHbvHbvHbxobxpbxqbxrbxsbxtbuhbxubxvbxwbxxbxybxzbxvbxAbukbDdbvXbxCbxDbxEbxFbxFbxGbxHbxIbxJbxKbxLbxMbxNbupbxObxPbxQbusbxRbxSbxTbLSbxUbxVbusbxWbxXbxYbwobikbikbikbikbikbikbikbikbikbikbDybtldemdemdemdenbikdeodepdepdepbtlbDzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaInaInaInaInaInaInaInaKBaJrbyabrXbybbycbydbyebyebyfbygbyhbyibyibyjbykbtzbtzbtzbtzbtzbtzbylbymbymbynbyobngbypbyqbyrbysbytbyubyvbywbngbyxbyybyzbuVbtLbwJbpIbpIbyAbnmbnmbyBbyCbyDbyEbyFbyGbyHbyIbyJbyKbyLbyMbyNbyObwXbyPbyQbyPbyQbyRbwXbwYbySbyTbyUbyVbyWbyXbyYbyZbzabyTbAObvwbvwbucbzebzdcSCbzfbzgbucbxnbvHbvHbvHbvHbvHbvHbvHbzhbzibzjbzkbzlbxqbzmbuhbznbzobzpbxxbxAbxzbzqbzrbukbIbbztbzubzvbzvbzwbzxbzybzzbzAbzAbzAbzBbzAbzCbzDbzEbzFbzGbzHbzIbzJbzKbzKbzKbzLbusbzMbxXbzNbwobikbikbikbikbikbikbikbikbikbikbikbDyderderderbDzbikbDyderderderbDzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjtdjsdjuaIoaIoaIobdFaJraJrbrXbzVbrXbzWbzXbzYbzZbrXbcsbAabAabAbbAcbAbbAbbAbbAcbAbbcsbcsbngbngbngbAdbngbAebAebAebAebAebAebyvbAfbAgbAhbAibAjbAkbAlbAmbAnbAobApbAqbArbAsbAtbAubAvbAwbAwbAxbAybAzbAAbABbACbADbAEbvjbAFbwVbAGbwTbAHbvjbikbAIbAJbAKbALbAJbAJbAJbAJbAMbnAbCBbvwbCCbAPbAQbARbASbATbAUbucbAVbAWbAXbAYbAZbBabBbbBcbvHbBdbuhbBebzlbBfbBgbuhbBhbBibxwbxxbxAbxzbxvbxAbukbDdbvXbBjbBkbBlbBmbBnbBobBpbBqbBrbBsbBtbBubKpbupbBwbBxbBybusbBzbBAbBBbxUbBCbKwbusbzMbxXbBEbwobikbikbikbikaabaabaabaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjwdjvdjuaJqaJqbBIbBJaJqbBKbrXbBLbycbBMbBNbBObBPbrXbikaabaabdetdesdesdesdesdesdeubikbikbBRbBSbBTbBUbBVbAebAebAebAebAebAebBWbBXbBYbBZbCabCbbCcbCdbnmbnmbCebCfbnmbnmbCgbChbCibCjbCkbClbClbCmbClbCnbCobCpbCqbAEbvjbCrbvlbvlbvlbCsbvjbikbAIbAJbCtbCubCvbCwbCxbCybCzbCAbEsbvwbEtbucbvxbCDbCEbCFbCGbCHbCIbCJbCKbCLbCMbCNbCObCPbCQbCRbCSbCTbzlbCUbCVbuhbCWbCXbCYbCZbDabDbbDcbvVbukbIcbDebDfbDgbDgbDhbDibDjbDkbDlbDmbDnbDobDpbDqbupbDrbBxbDsbusbDtbDubDvbxUbxUbDwbusbxWbxXbDxbwobikbikbikbikaabbDAbFfbDBbFfbDBbFfbFgaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjwdjvdjuaJqaJqbBIbBJaJqbBKbrXbBLbycbBMbBNbBObBPbrXbikaabaabdfMdesdesdesdesdesdfNbikbikbBRbBSbBTbBUbBVbAebAebAebAebAebAebBWbBXbBYbBZbCabCbbCcbCdbnmbnmbCebCfbnmbnmbCgbChbCibCjbCkbClbClbCmbClbCnbCobCpbCqbAEbvjbCrbvlbvlbvlbCsbvjbikbAIbAJbCtbCubCvbCwbCxbCybCzbCAbEsbvwbEtbucbvxbCDbCEbCFbCGbCHbCIbCJbCKbCLbCMbCNbCObCPbCQbCRbCSbCTbzlbCUbCVbuhbCWbCXbCYbCZbDabDbbDcbvVbukbIcbDebDfbDgbDgbDhbDibDjbDkbDlbDmbDnbDobDpbDqbupbDrbBxbDsbusbDtbDubDvbxUbxUbDwbusbxWbxXbDxbwobikbikbikbikaabbDAbFfbDBbFfbDBbFfbFgaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjudjubDEaInaInaLyaCubDFbDGbrXbDHbycbycbycbrXbrXbrXbikbikbikdewdevdevdexdevdevdewbikbikbBRbDIbAebDJbDKbDKbDKbDKbDKbDLbDMbDKbDNbDObDPbDQbDRbDSbDTbnmbDUbpIbDVbDWbtLbDXbDYbDZbCjbCjbCpbEabEbbEcbEdbEebCpbvibAEbvjbEfbEgbEhbqtbEjbvjbikbEkbAJbElbEmbEnbEobEpbEobEqbErbFWbvwbHBbucbEubEubEvbEwbExbEybEzbEAbEBbECbEDbEDbEEbEFbEGbEHbuhbCTbEIaJSbuhbuhbuibEKbELbEMbuibukbukbukbENbIdbvXbEPbBkbBlbEQbDgbDjbERbESbESbETbxJbEUbEVbEWbEXbxPbEYbusbEZbFabxUbFbbFcbFdbusbzMbFebwobwobikbikbikbikaabbFhbFjbFibGSbFkbGTbFhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjydjydjydjAdjzdjydjydjydjydjBbikbikbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdewbFnbBRbBRbFobFpbFqbFrbFrbFrbFpbAebyvbAfbAebAebAgbFsbFtbFubFvbFwbFxbFybpIbpIbFzbtLbDXbDYbFAbFBbFCbFDbFEbFFbFGbFHbFIbCpbFJbFKbwRbFLbFMbFNbFObFPbwXbwYbFQbAJbFRbFSbFTbEobFUbEobFVbErbJebvwbKObucbFYbFZbGabGbbGcbGdbGebGfbGgbGgbGhbGibGgbGgbGjbGkbGlbGmbGnbGobGpbGqbGrbGsbGtbGubGvbGwbKhbIebKjbKibvXbGBbGCbGDbGEbGFbxGbGGbESbESbGHbGIbEUbGJbupbGKbGKbGLbusbGMbGNbGObGPbxUbGQbusbzMbGRbwobikbikbikbikbikaabbGUbIybFibFkbFibKkbDBaabbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjCdjEdjDdjGdjFdjIdjHdjFdjJdjLdjKdjydjydjBbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbGWbmrbNkbmrbGXbGYbGZbGYbGYbGYbGYbHabyvbAfbHbbngbngbHcbpIbAibFvbHdbtLbHebHfbHfbHgbHhbHibHjbHkbHlbHmbHnbHobHpbHqbHrbHsbCpbCqbAEbvjbEibHubHvbHwbHxbvjbikbEkbHybHzbHybHybHybHybHybHAbHybKPbvwbKObucbHCbHDbHDbHEbHFbEybHGbHHbHIbHJbHKbHLbHMbHIbHNbHObHPbHQbHRbHSbHTbHTbHUbHVbHWbHXbHYbLibLCbLBbNdbNcbNebIfbIfbIgbIhbIibxGbIjbxJbxJbIkbIlbEUbImbInbIobIpbIqbIrbIsbItbIubIvbIubusbusbIwbEXbGxbLDbLDbLDbLDbLDbGxbFhbFkbFibFkbFkbGTbFhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjHdjHdjHdjMdjFdjNdjNdjFdjOdjHdjHdjQdjPdjydjBbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbLFbKmbIAbKmbIBbAebFqbFrbFrbFrbAebAebyvbAfbICbKobngbIEbpIbAibFvbIFbtLbIGbpIbrsbpIbIHbDXbvvbIIbHlbHmbIJbIKbILbIMbINbIObIPbIQbIRbISbISbITbIUbIVbvjbvjbikbEkbHybIWbIXbIYbIZbJabJbbJcbJdbMhbvwbKObCHbJfbJgbJhbJibJjbEybJkbJlbJmbJnbJobJpbJqbJrbJsbJtbJubJvbJwbJxbJybJzbJAbJBbJCbJDbJEbGwchEbIecnfcjubvYbJIbJJbJKbJLbJLbxGbJMbJNbJObxGbJPbEUbJQbxGbJRbJSbJTbJUbJVbJWbJXbJYbJZbKabKbbKcbKdbKebKfbKfbIxbJFbJHbGzbKlbFfbDBbNhbDBbFfbLEaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjSdjRdjUdjTdjVdjFdjWdjHdjXdjHdjHdjHdjHdjHdjMdjFbikbikbikbikbikbikbikbikbikbikdewdeCdevdevdevcOfdewbFnbBRbBRdezbAebFqbAebAebAebAebAebyvbAfbICbLwbngbLQbpIbKqbKrbpIbKsbpHbpIbpIbKtbtLbDXbvvbIIbHlbHmbCpbKubKvbqzbKxbKybKzbKAbKBbKCbKDbwXbKEbKFbwXbwYbwYbKGbHybKHbKIbKJbKKbKLbKLbKMbKNbMibvwbMjbucbEybKQbEubKRbKSbEybJkbKTbKUbKVbKWbKXbKYbKUbJkbKZbLabLbcchbLbbLcbLbbLdbLdbLebLfbLgbLhbLhcpLbLgbLgbLhbLhbLjbLkbLjbLjbxGbxGbxGbxGbxGbLlbLmbBobxGbLnbLobLpbLqbLqbLrbLsbLtbLubLvbLIbLxbLybLzbLAbLAbEObGAbHZbGxbGzbGzbGzbIabGxbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjZdjYdjHdjHdkadkadkadjFdjHdjHdjFdkbdkddkcdkfdkedkgdjFbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbWobKmbIAbKmbFobLGbLHbAebAebAebLGbAebyvbAfbICbNrbngbLJbpIbAibFvbpIbnmbLKbpIbpIbLLbtLbDXbvvbLMbHlbLNbCpbLObLPdiNbLRcobbKzbLTbLUbLVbLWbLXbLYbLZbMabikbikbikbHybMbbMcbMdbMdbMebMfbMgbHybNSbNRbKObNTbMkbMlbMmbMnbMobMpbMqbJlbMrbMsbMtbMubMvbMrbJkbKZbMwbMxbMybMzbMAbMBbLdbMCbMDbMEbLgbMFbMGbMHbMIbMJbMKbMLbKabMMbLqbLqbMNbMObLqbMPbMQbMRbMSbMTbLqbMUbiTbMWbMXbMYbMZbNabNbbNabNabNabIwbEXbGxbLDbLDbGxcnccndcnebOQbOSbUHbYdbGzbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjZdjYdjHdjHdkadkadkadjFdjHdjHdjFdkbdkddkcdkfdkedkgdjFbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbWobKmbIAbKmbFobLGbLHbAebAebAebLGbAebyvbAfbICbNrbngbLJbpIbAibFvbpIbnmbLKbpIbpIbLLbtLbDXbvvbLMbHlbLNbCpbLObLPdiNbLRcobbKzbLTbLUbLVbLWbLXbLYbLZbMabikbikbikbHybMbbMcbMdbMdbMebMfbMgbHybNSbNRbKObNTbMkbMlbMmbMnbMobMpbMqbJlbMrbMsbMtbMubMvbMrbJkbKZbMwbMxbMybMzbMAbMBbLdbMCbMDbMEbPEbMFbMGbMHbMIbMJbMKbMLbKabMMbLqbLqbMNbMObLqbMPbMQbMRbMSbMTbLqbMUbiTbMWbMXbMYbMZbNabNbbNabNabNabIwbEXbGxbLDbLDbGxcnccndcnebOQbOSbUHbYdbGzbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkhdjYdjHdjHdjHdjHdjHdkidjHdjHdjFdjydjydjydjydjydjydkjbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdeEdeDdeGdeDbNlbNmbNnbNnbNnbNnbNnbNobNpbNqbICbWSbngbNsbNtbNubNvbNwbNxbNybNybNybNzbNzbNAbvvbNBbNCbHmbCpbNDbNEbNFbKvbNGbKzbNHbNIbNJbNKbNLbFNbNMbMabikbikbikbHybNNbNObNPbNQbMebMfbMgbHybPibNUbQObPjbNVbNWbNXbNYbNZbOabObbOcbKUbKUbOdbOebKUbKUbJkbKZbOfbOgbOhbOibOjbOkbLdbOlbOmbOnbOobOpbOqbOrbOrbOsbOtbOubOvbOwbJVbJVbOxbJVbOybJVbOzbJVbOAbOBbOBbOCbODbOEbOFbOGbOHcsjbOJbOKbOLbNabOMcxHbikbikbikbGxbORbJFbOPbOQbGzbOObNibGxbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydkmdkldkodkndjHdjFdjHdjHdjFdjHdkqdkpdkrbikbikbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdewbFnbBRbBRbngbngbBRbBRbBRbBRbBRbngbngbBRbBRbBRbngbOVbOVbOVbOWbOVbNzbOXbOYbOZbPabNzbDXbvvbPbbPcbPcbCpbCpbCpbCpbCpbPdbKzbISbIRbPebNKbPgbPhbMabMabvjbvjbvjbHybHzbHybHybHybHybHybHybHybQPbvwbQQbPkbPlbPmbPnbPlbPlbPobPpbPqbPrbPsbPtbPubPvbPwbMqbPxbPybPzbPAbPBbPCbPDbPEbPFbPGbPHbPIbPJbPKbPLbMHbPMbLhbLhbPNbPObPNbPPbPQbPPbPPbPPbPRbPSbPTbPTbPUbPVbPWbPXbOFbPYbPZbQabQbbQcbQdbNabOMcxHbikbikbikbGxbNfbNgbGxbGzbGxbGxbGzbGxbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjydjydjydjydjydjydjFdjOdjHdksdjHdkudktdkvbikbikbikbikbikbikbikbikbikbikbikbikbikdeJdeIdevdeKdevdeLdeMbikbikbikbikbikbikbikbikbikbikbQgaabbikbikbikbikbOVbQhbQibQjbQkbNzbQlbQmbQnbQobNzbDXbvvbQpbQqbQrbQsbQtbQubQvbQwbQxbQybQzbQAbQBbQCbQDbQEbQFbQGbQHbQIbQJbQKbQLbQMbQRbuabQSbvwbShbSgbSibvwbSjbPlbQTbQUbQVbQWbQXbJkbQYbQZbRabRbbRcbRdbRebRfbRgbRhbRibLbbRjbOibRkbRlbRmbRnbRobRpbLgbRqbMHbMHbMHbRrbLhbPNbRsbRtbRubRvbRwbRxbRybPPbRzbRAbRBbPTbPTbRCbPWbRDbREbWHbRGbRHbRIbRJbRKbNabRLbwobikbikbikbGxbGxbGxbGxbikbikaabbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydkxdkwdkydkxdkzdjFdjHdjHdjFdjHdkBdkAdkCbikbikbikbikbikbikbikbikbikbikbikbikbikdeOdeNdePdePdePdeNdeQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbOVbRMbRNbRObRPbNybRQbRRbRSbRTbNzbDXbRUbRVbvvbvvbFXbRWbubbQNbQMbRXbRYbRXbRZbSabSabSbbScbSdbSabSabSebSabSfbSabQMbQRbuabSlbSkbTJbTIbTLbTKbvwbPlbSmbQUbSnbSobSpbJkbSqbSrbSsbStbSubSvbSwbSxbJkbSybSzbLbbSAbSBbSBbSCbSDbSEbSFbSGbLgbSHbSIbMHbSJbSKbLhbPNbSLbSMbSNbSObSPbSQbSRbPPbSSbRAbSTbSTbPTbSUdnjbSWbSXbSYbSZbTabTbbTcbTdbNabOMbwobTebikbikbikbikbikbikbikbikaabbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjZdjYdkDdkDdkDdkDdkDdkEdjHdjHdjFdjydjydjydjydjydjydjBbikbikbikbikbikbikbikbikbikbikbikdeRdeSdeSdeSdeTbikbikbikbikbikbikbikbikbOUbOTbQebOTbQfbikbikbikbOVbOVbTjbTkbRObTlbNybTmbQnbTnbTobNzbDXbTpbTqbTrbTsbTtbTubTvbTwbTxbTybTzbTAbTBbTCbTCbTDbTEbTEbTEbTEbTEbTEbTFbTGbTHbTNbTMbTPbTOdlidjmdlkdljdllbPlbTQbQUbQVbTRbSpbJkbSqbSrbTSbTTbTUbTVbTWbTXbJsbTYbTZbLbbLbbUabUabLbbSDbLdbUbbUcbLgbUdbUebUfbUgbUhbLhbPNbUibUjbUkbUlbUmbUnbUobPPbUpbRAbSTbSTbPTbUqbUrbUsbUtbUubUvbUwbUxbUybUzbNabOMbUAbUBbUAbUCbUDbUCbUCbUCbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkhdjYdkDdkDdkDdkFdkGdjFdjHdjHdjFdjHdjHdjHdkHdjHdkIdjFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbTgbTfbTibThbTgbUIbUIbUIbOVbUJbUKbULbUMbUNbUObUPbUQbUQbURbNzbUSbUTbUUbUVbUVbUWbUXbUYbUVbUZbUZbVabVbbONbUZbUZbVdbQMbQMbVebVfbVfbVfbVgbVhbVfbVfbVibVjbVkbVkbVlbVkbVmbVnbVkbVobVpbVqbPlbVrbVsbSqbVtbVubVvbVwbVxbVybVubJkbSybVzbVAbVBbVCbVDbVEbVFbVGbVHbVIbVJbVKbVLbVMbVNbVObLhbPNbPNbVPbVQbVRbVSbVRbVTbPPbVUbVVbVWbVWbPTbVXbVYbVZbNabNabNabNabNabNabNabNabOMbUAbWabWbbWcbWdbWdbWebUCbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikaabbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydkKdkJdkDdkLdkMdjFdjHdjHdkNdjHdjHdjHdkOdjHdkPdjFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbQebUEbUFbUEbQebUIbWmbWlbOVbWnbWpbWqbWrbWsbNzbWtbWubWvbWwbNzbUTbUTbWxbUVbWybWzbWAbWBbWCbUZdmbbWEbWFbWGcAzbUZbWIbWJbWKbVfbWLbWMbWObWNbWPbWQbWRceLbWTbWUbWVbWWbWXbWYbWZbXabXbbXcbXdbXebXfbXgbXhbSrbXibXjbXkbXlbXmbXnbJsbXobXpbXqbXrbVDbXsbXsbXtbXubLgbXvbXwbXxbXybXzbXAbXBbLhbXCbXDbXEbXFbXEbXEbXGbXHbXIbXJbXKbXLbXMbPTbXNbXObPXbEXbxXbXPbXQbXRbXRbXQbXRbXSbUAbXTbXUbWcbWdbXWbXVbUCbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfbXXbXYbXXbWgbWhbWhbXZbYabXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydkQdkDdkDdkRdjFdjHdjHdjFdkSdjHdjHdkUdkTdjydkjbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbTgbUGbUEbUEdeycOWbTkbTkdeAbZAbTkbWqbYhbYibNzbNzbNzbNzbNzbNzbYjbUTbYkbYlbYmbYnbYnbYnbYobUZbYpbYqbYqbYqbYrbYsbYtbYubYvbYwbYxbYybYzbYAbYBbYCbVfbVibYDbVkbYEbYFbYGbYHbYIbVkbSmbQVbSnbSobYJbYKbYLbYMbYNbYObYPbYQbYRbVubYSbYTbYUbYVbYWbYXbYYbYZbZabZbbLgbLgbLgbLgbLgbZcbZdbZebLhbZfbXEbXEbZgbZhbXEbZibZjbZkbZlbRAbZmbZmbPTbPVbZnbPXbEXbUAbZobUAbUAbUAbUAbUAbUAbUAbZpbZqbUCbZrbZtbZsbUCaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacbZubXXbXXbZvbWhbWhbXZbXZbZwbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydkWdkVdkXdjFdjHdkYdjFdkZdladjHdjydjydkjbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbQebUFbUFbUFbQebUIbYfbYebZzbZAbTkbZBbZCbZDbZEbZFbZFbZFbZGbUTbUTbUTbWxbUVbZHbYnbZIbYnbZJbUZbYpbYqbZKbYqbZLbUZbZMbZNbZObVfbZPbZQbZRbZSbZTbZUbZVbZWbZXbZYbZZcaacabcaccadbVkbTQbQVbQVcaebYJbYKcafcagcahbXjcaicajcElcalcamcancaocapcaqcarcIfcasbXscatbVAcaucavcawcaxcaycazcaAbZjbZfcaBbXEbXEbXEcaCcaDbZjbZkcaEbRAbZmbZmbPTcaFcaGbPXbEXcaHcaIcaJbUAcaKcaLcaMcaNcaOcaPcaQbUCcaRcaScaTbUCbUAbUAbUAbUAbUAbUAbUAbUAbikbikbikbikbikaabbikbikbikbikbikbikbikcaUbWhbZubWhbWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydjydjydjydjydjydjydjydjydjydkjbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbTgbWjbYbbWkbTgbUIbUIbUIbOVcaYcaZcaZcaZbOVbOVbUTcbacbacbbcbcbUTcbdcbebUVbZHbYnbYnbYncbfbUZbYpbYqbYqcbgcbhcbicbjcbkcblbVfbVfbVfbVfbVfcbmbVfbVfcbncbobVkbVkcbpbVkbVnbVkbVkbPlcbqcbqbPlccicbrcbscbtcbucbvcbwcbxcbycbzcbAcbBcaocapcbCcbDcbEcbFcbGcbHbVAcbIcbJcbKcbLcbMcbNcbOcbPcbQcbPcbRcbRcbRcbPcbScbPcbPcbTcbUbZmbZmbPTcbVbZnbPXcbWcbXcbYcbZccaccbccccccccdcceccfccgcckccjcdqcclcfeccmccnccoccpccqccrccscctaabaabaabaabaabaabaabaabbikbikbikbikbikbWgbWhccuccvccvbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbYcbOTbYgbOTbZxbikaabbikbOVbOVbUIbUIbUIbOVbikbUTccAccBccCccDbZFccEccFbUVccGccHdmcbYnccJccKccLccMccNccOccPbUZccQccRccSccTccUccUccUccUccVccWccXccYccYccZccZcdacdbcdcbVibPlcddcdecdfcdgcdhbYKcdicbtcdjcdkcdlcdmbSwcdncdocdpcffcdrcdrcdscdrcdrcdrcdtbVAcducdvcdwcdxcdycdzcdAcbPcdBcdCcdDcdEcdFcdCcdGcdHcdCcdIcdJbRBbPTbPTcdKcdLcdMcdNcdOcdPcdQcdRcdScdTcdUcdVcdWcdXcdYcdZceacebceaceccebcebcebcedceecefcegcehaabbikbikbikbikaabbikbikbikbikbikbikbikbWhbWhceibXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabcejbUTbUTbUTcekbUTbUTcelbUVcemcenceocepceqcercescetceucevcewccKcexceycezceAceBceBceBceBceCceDceEceFceGceFceHceIceJceKchvceMceNceOcePceQceRceSceTceUceVceWceXceYceZcfacfbcfccfgbMmbMmcfichOcgHceYchVcfjcfjcfkcfjcflcfmcfncfocbPcfpcfqcfrcfscfrcftcfucfvcdCbPTcfwbPTbPTcfxcfybZnbBxbEXbUAcfzbUAbUAcfAcfBcfCcfDcfEcebcfFcfGcfHcdUcfHcdUcfIcdUcdUbUAcfJcfKcfLcfMaabaabaabaabaabaabaabaabbikbikbikbikbikbWhbXZbXZbXZbXZbXZbXZcfNbXZcfObXZbXZbXZbXZbXZbWhbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcejcfPbVccqsbUTcfSbUVcfTcfUcfVbZHcfWcfXcfYbYpcfZcgacgbcfXcgccgdcgecgfcgfcggcghcgicgjcgkcglcgmbGycgnbVicgobGybGycgpcgqcgrcgscgtceQcgucgvcgwcgxcgycgzbMVcgBcgCcgzcgzcgDcgEcgEcgEcgEcgEcgGcgFciOcgJcgJcgKcgLcgMcgNcgOcgPcbPcgQcgRcgScgTcgScgUcgVcfrcgWcgXcgYbBxcgZbBxcfybZnbBxbEXchachbchcbUAbUAbUAbUAbUAchdcdUchechfcfIcdUchgcdUbZpcdUchhbUAchichjchkbUAaabbikbikbikbikaabbikbikbikbikbikbikbikbWhchlchlchlchlchlchlchmbXZchnchlcfObXZbXZbXZbXZbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcejchocfQchpbUTcfSchrchrchrchrchrchrbUZbUZbUZbUZbUZbUZbUZchschtchucWpchwchxchychychzchAcglbGybGychBchCchDbGybGybGycqOchFchGceOchHchIchJcgEchKchLchMbSqchLchNcfdcfdcfdcjncjlcjlcjlcjlckacgIbSqclPchPchQchRchSchTchUclQcbPchWchXcfrchYcfrchZciacibciccidciecifbBxcigcfybZncihbEXbFeciicijcikbwobxXbxXbUAcilcimcinciocipciqcirciscitciucivbUAciwciycixcizbikbikbikbikaahbikbikbikbikbikbikbikbikciAbXXbXXbXXbXXbXXbXXbXXciBciCbXZbXZbXZbXZciDbYabWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcejcejcejcejbUTcfScejbikbikbikbikciEbaTciGciHciIciJciKciLciMciNcmPciPciQciRciSciSciTciUciVciWciWciWciWciXciWbGybGybPlciYciZcjacjbcjccjdchScjecjfcjgcjhcjicjjcjkcjlcfdcnicjpcjpcjpcjpckNclSckUcnjcjqcjrcjscjtcbAcwncjvcbPcjwcjxcjycjzcjAcfrcjBcbPcbPbEXcjCbEXbEXbEXcjDcjEcjFbEXbxXciicjGcjHbwobwobwobUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbikbikbikbikbikaabbikbikbikbikbikbikbikbWhccvccvccvccvccvccvcjIbXZccuccvcjJbXZbXZbXZbXZbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcAjbikaabaabcjKcjKcjKcjKcjKcjKcjLcjKbUTcelcjMbikcjNcjOcjPcjQcjRcjScjTcjUcjVcjWcjXcjYcjZcosckbckcckdckeckfckgckhciVckickjckjckjckkciWbGybGycklcklcklcklckmcklckncknckocklcklckpcklckqckrckscktcksclZaPKcmacmmcmlcmocmnckzckAckBckCckDckEckFcdccbPcbPckGcbPckHcbPckIckJckKcgnckLckMckvckOckPckQckRckSckPbxXciickTbxXbxXckVckWckXchabxXbxXbxXbxXbxXbxXbxXckYckZcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhbXZbXZbXZbXZbXZbXZcfNbXZcjJbXZbXZbXZbXZbXZbWhbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikclaclbclbclbclccldcleclfclgclhclicjLcljcelcjMbikclkcllclmclnclocjSclpclqclrclsciLcltcgdcoaciPcluchyclvchyclwclxclyclzclAclAclAclBciWbGybGycklclCclDclEclFclGclHclHclIclJclKclLclMclNclOcotcfhcpwcmpcmrcmqctbcsZcuoctcckDclVclWclXckzclYcmtcmscmbcmbcmccmdcmecmfcmgcmhcmfcmfcmfcmicmfcmfcmjcmucnpcnlcqRcoXcrGcqScrHcrHcrIcrHcrHcrHcrHcrJcrKcrHcrHcrHcrMcmvbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhbWhceibXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcmwcmxcmxcmxcmxcmycmzcmAcmBcmCcmCcmDcjKcmEcfScjMbikclkcmFcmGcmHcmIcmJcmKcmLcmIcmIcmMcmNcmOcpxcmQcmQcmRbHtchycmTcmUclyclAclAclAclAcmVciWbGybGycklcmWcmXcmYcmZcnacnbcnbbzsbvWbulbxBclHcnhcklcqQcfdcrLcjpcwscvxcwEcwCcxNcxIckDcnmcnncnockDbJGcumctecnqcnqcnqcnqcnqcnrcnscntcnucnvcnvcnwcnwcnvcnxcnycnzcnAcnBcnCcnDcnEcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcuncnFcnGcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcaUbWhbWhchlchlbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcnIcnJcnKcnJcnLcnMcnNcnOcnPcnQcjKcnRcelcjMbikclkcnScnTcnUcnVcjScnWcnXcnYcnZciLcltcgdcbkchqcgfcoccodciPciPciPcoecofclAclAcogcohciWbGycoicklcojcokcolcomcomcomconcoocomcomcopclHcoqcorcrNcfdcupcjpcxVcxUcxVcxVcxNcEickDcowcoxcoyckDcozcuscoicoAcoAcoAcoAcoAcoDcoDcoDcoAcoAbikbikbikbikckPcoEcoFcoGcnCcoHcoIcoJcoKcoLcoMcoNcoOcoPcoQcoRcoScoTcoUcnCcuncoWcvtcoYcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcpacpbbWhbZubWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikcnHcpccpdcpecpfcmBcpgcphcpicmBcpjcpkcplcpmcjMbikcpncjOcpocjQcppcjScjScpqcprcpscptcpucpvcwqchqcgfcpycpzcpAcpBcpCciVcpDclAclAclAcpEciWbGybGycpFcpFcpGcpHcpIcpIcpIcyFcpJcpJcpJcpKcpFcpGcpMcqQcfdcrLcEjbjVcEYdbndbmcxNclRckDcoucpNcovckDbGycuscoAcoAaabaabbikbikbikbikbikbikbikbikbikbikbikcpRcpScpTcpUcpVcpWcpXcpXcpYcpXcpXcpXcpXcpXcpZcqacqbcqccqdbwocvvbXSbwobwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhcqhcqicqjbWhbWhbXZbXZcqkbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcqlcnJcqmcnJcqncqocqpcqqcnNcqrcjKcqscelcejbikbikbikbikciEcqtcqucqvcqvciLcqwciLcqxcgdcbkcqycqzcqAcqBcqCcqCcqCcqDcqEclAcqFclAcqGciWbGybGycpFcqHcqIcqJcqKcqLcqMcpFcqLcqMcqKcqNdehcqPcpMczecyWczgcEjdbpdbodbrdbqdbsctcckDcpOcpPcpQckDbGycuscoAcvyaabaabaabbikbikbikbikbikbikbikbikbikbikcpRcqUcqVcqWcqXcqYcqZcracrbcpXcpXcrccpXcpXcpZcqbcqbcqbcrdbwocvzbxXbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfcrhcribZvbWgbWhbWhbXZbYabXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikadbabLcrjcrjcrjcrjcrjcrjcrjcrjcrkcrkcrkcrkcrkcjKcjKcjKcjKcjKcjKcjKcekcrlcrmcrmcrmcrmcrmciEciLciLciLciLciLciLciLcrncgdcbkcrocrpcrqcrrcrscrtcrucrvcrwcrxcrycrzcrAciWbGybGycpFcrBcrCcqJcqKcqKcrDcpFcrEcqKcqKcqNcqKcrFcpMbGwbGwbGwcEjdbudbtdbvdbmdbxctcdbydbydbycoAcoAbGycuscoDcwpbikaabaabaabbikbikbikbikbikbikbikbikbikcpRczNczPcoBcrOcrPcrQcrRcrScpXcpXcpXcpXcrTcrUcrVcrWcrXcrYbwocvzbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikaSecsdcsecsfcsgcsgcshcsicspcskcslcsmcsncsocsrcsqcsqcsscsucstctzctzctAcsvcswcsxcsycsxcsxcsxcswcsxcsxcszcsAcsBcsCcgdcbkcsDcsEcsFcsGcgfcsHcmQcsIcsJcsKcsLcsMcsNcsObGybGycpFcsPcsQcsRcsScsTcsUcpFcsVcsTcsWcsXdlFcsYcwrbikbikbikcEjdbAdbzdbAdbAdbCdbBdbEdbDdbycwFbVibGycuscoDcwpbikbikaabaabaabbikbikbikbikbikbikbikbikctdckPcxGckSctdctfctgcthctictjctkctlcpXcpXctmctnctoctpctqbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSecsdctuctvctwctvctxctyctDctCdmedcYdmedmfcxnctEctFctEcgdctGcblcblctEctHctEctEctEctEctEctEctEctEctEctEctIctJctKctLctMctNctOctPctQctRctSctTctUctVctWctXciFctZcuacnqcubcuccudcuecufcugcuhcuicpFcujcqKcugcukcqKculcwrbikbikbikdbFcmkdbGdbJdbIdbCdbKdbMdbLdbOdbNceFceJdbPcoDcwpbikbikbikaabaabaabbikbikbikbikbikbikbikckPcurczQcutckPcnCcnCcnCcnCcnCcnCcuuctlcuvcuwcuxcuycnCcnCbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSecuBctvcuCcuDcuEcuFcuGcuHcuIcuJcuKcuLcuMcuNcuOcuPcuQcuRceAcuSceAcuNcuTcuNcuNcuNcuNcuNcuNcuNcuNcuNcuNcuUctEcuVcuWcuXcuYcuZcvacvbcvccvdcvecvfcvgcvhcvicvjcvkcsLceJcvlcvmcvncqKcqJcqKcqKcvocpFcvpcqKcqKcqNcqKcyGcwrbikbikbikdbFdbRdbQdbTdbSdbVdbUdbXdbWdbybGychCcyHcuscoAbikbikbikbikbikaabckPckPckPckPckPckPckPckPckPcvucxScvwckPcxOcxOcyIckPaabcnCcnCcvAcnCcvBcvCcvDcnCcyKcyJcvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikadbabLcrjcrjcrjcrjcrjcrjcvFcvGcvGcvHctBdlXcrjcrmcvJcvKcvKcvLcvKcvMcvKcvKcvNcvOcvKcvKcvOcvOcvOcvKcvKcvKcvKcvPcvQcvRcvScvTcvUcvVcvWcvXcvWcvWcvWcvWcvZcwacwbcwccwdcsObGycvrcwecwfcwgcwhcwicwjcwkcpFcwlcwjcwmcqNcqKcwocpMbikbikbikdbFdbZdbYdcadbIdccdcbdbUczRdbycyObVibVicuscoAbikbikbikbikbikbikckPcwtcwucwvcwwcwxcwycwzcwAcwBczScwDckPcxOcBZcyPckPaabaabcwGcwHcwIcwJcwKcwLcwGbxXbxXcvzczfbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGacGafxafxacGafxafxafxagiafxafxaabagiaqZbikaabaabcwNcwNcwNcrjcwOcwPcwQcwRcwScwTcwUcwVcwWcwXcwYcwZcxacxbcxccxdcxecxfcxgcvKcxfcxhcxicxjcxjcxkcvKcxlcxmcxncxocbkcxpcxqcxrcxscxtcxucxtcxvcxwcxxcxycxzcxAcsOcsOcvrcwecpMcpMcxBcpMcpMcxCcxDcxEcxEcxEcxFcxEcyUcpMbikbikbikdbFdbFdbFdbFdbFdbydcedcgdcfdbybGybGyczhcuscoAbikbikbikbikbikbikckPcxOcxPcxOcxQcxRcqUcxScwAcxTczicxTckPcxOcxOcMpckPaabbikcwGcxWcxXcwJcwJcxYcwGczjbxXcvzbzNczMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikbikaabaabbikaabaabbikbikaabaabaabbikaqZbikbikbikaabaabcwNcrjcrjcrjcrjcrjcrjcrjcrjcybcwWcwXcyccydcyecyfcyfcyfcyfcygcyhcyicxjcyjcxjcxjcykcxjcylcymcyncyocxocbkcypcyqcmScxscyscytcyucxscyvcywcyxcyycyzcyAcyBcyCcyDcyEcyEcAaczUcAdcAccAeczTcALceJcAhbGycAMcoAcoAcoAcoAcoAbikbikbikbikdcidchdckdcjdbydclbVibVicuscoAcoAcoAcoAcoAbikbikckPcxOcxOcxOcyZczaczbczcczdcAicAOcAvckPcAVcAYcAWckPbikbikcwGczkcwJczlcwJczmcwGbxXbxXcvzczMbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikczoczpczqbikczoczpczqbikczoczpczqaabczraabbikbikbikbikaabaabaabbikbikbikbikbikbikczscwWcwXcztcxjcykczucxjcxjcxjczvcxjcztcztcxjcxjcxjcxjczwczxcymczyctEczzcoacyqcyqczAcxsczBczCczDcxsczEctWczFczGczHczIczJczKbGyczLcdcczLbGycBacAZcBccBccBccBccBPcBNcBNcBNcBNcBNcBQcoAbikbikbikbikdcidchdckdcmcTabGyckObVicusbGybGybGycgmcoAbikbikckPcwAcwAcwAcwAczWcqUczXczYczZcCfcAbckPcCGcCYcCIckPbikbikcwGcAfcAgcDLcwJcDNcwGcEdbxXcvzbwoaabaabaabaabbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikczocAkczqbikczocAkczqbikczocAkczqaabaabaabaabbikbikbikbikbikbikbikbikbikaabaabaabczscwWcwXcztcAlcxjcAmcAncAocAocyjcxjcztcApcxjcxjcxjcxjcAqcArcAscAtbZNcAucAPcAwcAxcAycxsczBdlYcAAcxscABctWcsOcACcsLcADcAEcAFcAGcAHcAIcAJcAGcAKcAGcAGcAGcoAcoAcoAcoAcoAcoAcoAcoAcEhcoAbikbikbikbikdcicBTdcqcBUdbycgmcFdbVicFmcFlcFlcFnbGycoAbikbikckPcwtcwucwvcAQcARczbcAScATcAUcFrcIScAXcGscIScGtckPbikbikcwGcwGcBbcCrcBdcwGcwGbwobxXcGycyJcyJcyJbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikafxaabczocAkczqbikczocAkczqaabczocAkczqaabbikbikaabaabaabaabaabbikbikbikbikbikaabbikbikczscwWcvKcBecxjcBfcBgcBhcBicBjcBicBkcBicBlcBmcxfcBncztcztczxcBocBpcBqcBrcBscBtcBucBvcBwcBxcBycBzcBAcBBcBCcBDcBDcBEcBFcBGcBHcBIcBJcBKcBLcBMcrecBOcHucHtcDPcDPcDPcDPcDPcDPcHvcoAcEhclUclUclUclUclUclUcjmbEJcjmcFfclUclUcoAcoAcoAcoAcusbGycoAbikbikckPcxOcBZcxOcCacxRcqUcCbcCccCdcCecqUcqUcCgcqUcChckPbikaabaabcwGcwGcCscwGcwGbikbwobxXcvzcyJcHycHxbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikczocAkczqaabczocAkczqbikczocAkczqbikbikbikbikbikbikaabaabaabbikaabbikaabaabbikbikcybcCicvKcCjcCkcCkcClcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcCmcCncCmcCocCmcrmcCpcCqcFbcCtcCtcCtcCucCvcBCcCwcCxcCycCzcCAcCBcBIcCCcCDcCEcCFcHzcCHcHAcCJaabcCKcCKcCKcCKcCKcHBcoAcHDcHCcIGcHHcIHctackycjocBWckuckycBXcCPcBYcCRcCQcoAcusbGycoAbikbikckPcxOcxOcxOcAQcCTczbcCUcCVcCWcCXcCZcCZcDacqUcDbckPaabaabbikbikbikcIKbikbikbikbwobxXcvzcyJbxXbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxaabbikczocAkczqaabczocAkczqbikczocAkczqaabbikbikbikbikbikbikbikbikaabcDccDdcDdcDdcDdcybcDecwWcDfcDgcDhcDhcDicDjcDkcDlcDlcDlcDlcDmcDncDocDncDncDpcDpcDncDqcDrcDscDtcDtctYcDvcDwcDxcDycDzcDzcDAcDBcDCcDDcDEcDFcCAcDGcBIcDHcDIcDJcDKcILcDMcIMcDOcDPcDQcDRcDScDTcCKcHBcoDcEhclUcvscvqcIOcINcxLckxckwdcrclUcCSczVcuqczVcDUcoAcusbGycoAcoAbikckPcwAcwAcwAcwAcEkcqUcCbdlZcEmcCecqUcEncEocEocEpcEqcXYaabbikbikbikbikbikbikbikbwobxXcGybxXbxXcIPbwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabaabcEraabaabaabcEraabbikaabcEraabbikbikbikbikbikbikbikbikcDccDccDccEscEtcEucEvcEwcExcEycDfcDfcEzcEAcvKcvKcEBcECcECcECcECcEDcEEcEFcEEcEEcEEcDtcDtcEGcEHcEIcEJcEKcDzcELcDwcDzcDzcDzcDzcEMcBCcENcEOcCycDFcCAcDFcBIcDHcDIcEPcEQcERcEScETcEUaabcEVcEWcDTcEXcCKcHBcoDcHDcHCcxKcxJczVcxMclUcIIcDVdcsclUcDWcDYczVcEbcEaclUcusbGycITcoAbikckPcwtcwucwvcFjcARczbcFkcJIcGCcJKcJKcFocFpcFqcJLckPaabaabaabbikbikbikbikbikbikbwocJMcvzbwobwobwobwobwoaabaabaabcJNcJNcJNcJNcJNcJNaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabcFscFtcFtcFucFvcFwcFwcFwcFvcFwcFwcFwcFvcFwcFwcFxcFtcFtcFtcFtcFtcFycFzcFAcFBcFCcFDcFEcFFcFGcfRcwWcFHcDfcvKcvKcvKcFIcEBcECcFJcFKcFLcyrcFNcDucFPcFOcFQcFScFTcSpcFVcFWcFXcFScFYcFZcDwcGacDzcDzcDzcGbcBCcGccGccDFcGdcGecGfcGgcGhcGicGjcGkcGlcGmcGncDOcGocDQcGpcDTcDTcCKcHBcoDcEhclUcyMcyLcyNcFfclUcnkclTcFfclUcyQcyScyRcyTcyTclUcusbGycJOcoAbikckPcxOcxPcxOcGAcxRcqUcGBcJPcJJcqUdlWcGDcwAcwAcwAckPbikbikaabaabbikbikbikbikbikbwocyKcvzbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabaabcGFaabbikaabcGFaabbikaabcGFaabbikbikbikbikbikbikbikbikcDccDccDccGGcGHcFMcDdcGJcfRcGKcExcExcExcExcGLcExcFGcECcGMcGNcGOcGPcGQcGRcGScGTcGUcGVcGWcGXcGYcGZcHacHbcFYcELcDwcHccHdcDzcDzcHecBCcHfcHgcDFcHhcCAcHicHjcHkcHlcHmcHncHocHpcHocHqaabcCKcCKcCKcCKcCKcHBcoAcEhclUcIJcyVcyYcyXcEecEccEgcEfcHwcGucHZczVcIRcIQclUcusbGycJRcoAbikckPcxOcxOcxOcFjcHEcHFcHGcJScHIcCZcCZcCZcHJcHKcHLcHMbikbikbikaabaabbikbikbikbikbwobwocvzbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxaabaabczocHOczqbikczocHOczqbikczocHOczqaabbikbikbikbikbikbikbikaabaabcDccDdcDdcDdcDdcHPcHQcHRcfRcHScfRcfRcEBcHTcfRcECcHUcHVcGOcHWcFNcHXcHYcIacIacIbcIccIdcIedmabRFcIbcIhcIicIjcIkcIlcImcIncIocIpcIqcGfcIrcIscItcIucIvcIwcIxcIycIzcIAcIBcICcIDcDPcDQcIEcIFcIFcCKcHBcoAcEhclUclUclUclUclUcJhcANcBRcJQcMccBScMecMdcMCcBVclUcuscGqcGrcGrcGrcJTcJTcJTcJTcJTcJUcKTcKbcKUcIUczbcIVczbcIWczbcIXcHMbikbikbikbikaabaabbikbikbikbikbwocvzbwoaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikczocHOczqaabczocHOczqbikczocHOczqbikbikbikaabbikbikbikbikaabaabaabbikbikaabaabcJbcJbcJbcJbcJbcJbcJbcJccJbcJbcECcJdcJecGOcHWcFNcJfcFNcFNcJgcDtcJicJjcFWcJkcFRcDtcJmcDzcDwcJncJocJpcIncJqcJrcJscJtcJucJvcJwcJtcJxcJycJzcJAcDFcJBcJCcJDcJEaabcEVcJFcJGcJHcCKcHBcoDcKWcKVcKVcKVcKXclUcFacyLcCLcFecyScCMcyTcyTcyScCNclUcuscGvbVibGycKYcKZcoAbikbikckPcJVcJWcJXcJYcJVcJWcJZcKacJVcJWcLackPaabaabaabaabaabaabaabaabaabaabbwocvzbwobwobwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjcbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabczocHOczqbikczocHOczqbikczocHOczqaabbikbikbikbikbikbikbikaabaabbikbikaabaabaabcJbcKjcKjcKkcGIcKmcKmcKncKocKocKpcKqcKrcGOcHWcGOcKscGOcGOcGOcDtcKtcKucKvcKwcKxcKycKzcKAcKBcKCcKCcKCcKDcKEcKFcKGcKHcKIcHhcCAcKJcKKcKLcKMcKNcDFcJBcKOcKPcKQcKRcDQcKScIFcIFcCKcHBcoDcEhbVibVibVibYDclUcFgcCOcDXcNDcyScPocPMcyTcPVcPQclUcuscGvbVibGycyHbGycoAbikbikckPcLicLjcLkcwAcLlcLmcLncwAcLocLpcLqckPaabaabbikbikbikbikbikbikbikbikbwocvzbxXbxXbwoaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabczocHOczqbikczocHOczqaabczocHOczqaabaabaabbikaabbikbikaabaabbikbikbikaabbikbikcJbcKjcKjcKkcLscLscLscLtcLucLvcECcLwcLxcLycLzcLAcLBcLCcLDcLDcLEcLFcLGcGOcGOcGOcLHcLIcLJcLKcLLcLMcLNcLOcLPcECcLQcLQcLRcHhcCAcLScLTcLUcLVcLWcDFcLXcLYcLZcMacMbcCKcCKcCKcCKcCKcHBcoDcEhcLbbGybGybYDclUcNEczVczVcOtcDZcQMcRwcyTdbkcYuclUcuscGvczhbGychCcITcoAbikbikckPcMpcxOcxOcwAcMpcxOcxOcwAcMpcxOcxOckPbikaabaabbikbikbikbikbikbikbikbwocLccyJbxXbwobwobwocJNcJNaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagiaabczocMqczqbikczocMqczqbikczocMqczqaabafxaabaabaabaabaabaabbikbikbikbikbikbikaabcJbcMrcMscLscLscLscMtcMucMucMucMucMucMucMucMvcMwcMxcMycMzcMzcMzcMAcMBdcpdcodcvcMzcMBcMDcMEcMFcLMcMGcLOcLPcMHcMIcMJcMKcMLcMMcMNcMOcKNcMPcMQcMRcMScMTcMUcIDcMVcDQcMWcMXcMXcCKcHBcoAcEhbVicozcLdbYDclUcOBczVcQgcPYcySdcydczcyTdcBdcAclUcuscGvbVibGybVibVicoAaabaabckPcNncBZcxOcwAcNncBZcxOcwAcNncBZcxOckPbikbikaabaabbikbikbikbikbikbikbwocvzcyJcLecyJcLfbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxbikaabbikbikbikaabaabaabbikbikaabaabbikafxaabaabaabaabaabbikbikbikbikbikbikbikaabcJbcNocLscLscLscLscLscMubhGcNpcHscNrcNtcMucNucNvcNwcJecGOcGOcNxdcCcNzcNAcNBdcDcNCdcEcECdcFcMFcLMcNFcLOcNGcECcNHcLQcNIcNJcDFcMNcMOcNKcDFcMQcMRcJBcJCcNLcJEcNMcEVcNNcNOcNPcCKcHBcoAcEhbVicLgcLgbYDclUclUdbldcwclUcEZclUclUclUclUclUclUcuscGvbVibGybGycMfcoAbikbikckPcOacxOcxOcwAcOacxOcxOcwAcOacxOcxOckPbikbikbikaabaabbikbikbikbikbikbwocvzcyJbxXbxXbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxacGacGagiafxafxafxafxacGafxafxacGcOcaabbikbikbikbikbikbikbikbikbikbikbikbikcJbcOdcLucLscLscLscOecMucNpcNqcOkcOlcOmcOncOocOpcOqcOrcGOcOsdcKcOucOvcOwcOxcOycOzcOAdcLcNwcJecOCcODcLKcOEcECcOFcLQcOGcOHcDFcMNcMOcKNcDFcOIcMRcJBcOJcOKcKQcOLcDQcOMcMXcMXcCKcHBcoDcEhcMgchCbJGbYDdcxclUclUcMhclUdcHdcGcFcbVicMjcMibGycuscGvbVibGycMkcITcoAbikbikckPckPckPckPckPckPckPckPckPckPckPckPckPbikbikbikbikaabaabbikbikbwobwobwocvzcyJcMmcMlbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydkmdkldkodkndjHdjFdjHdjHdjFdjHdkqdkpdkrbikbikbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdewbFnbBRbBRbngbngbBRbBRbBRbBRbBRbngbngbBRbBRbBRbngbOVbOVbOVbOWbOVbNzbOXbOYbOZbPabNzbDXbvvbPbbPcbPcbCpbCpbCpbCpbCpbPdbKzbISbIRbPebNKbPgbPhbMabMabvjbvjbvjbHybHzbHybHybHybHybHybHybHybQPbvwbQQbPkbPlbPmbPnbPlbPlbPobPpbPqbPrbPsbPtbPubPvbPwbMqbPxbPybPzbPAbPBbPCbPDbRpbPFbPGbPHbPIbPJbPKbPLbTdbXBbLhbLhbPNbPObPNbPPbPQbPPbPPbPPbPRbPSbPTbPTbPUbPVbPWbPXbOFbPYbPZbQabQbbQcbQdbNabOMcxHbikbikbikbGxbNfbNgbGxbGzbGxbGxbGzbGxbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjydjydjydjydjydjydjFdjOdjHdksdjHdkudktdkvbikbikbikbikbikbikbikbikbikbikbikbikbikdeJdeIdevdeKdevdeLdeMbikbikbikbikbikbikbikbikbikbikbQgaabbikbikbikbikbOVbQhbQibQjbQkbNzbQlbQmbQnbQobNzbDXbvvbQpbQqbQrbQsbQtbQubQvbQwbQxbQybQzbQAbQBbQCbQDbQEbQFbQGbQHbQIbQJbQKbQLbQMbQRbuabQSbvwbShbSgbSibvwbSjbPlbQTbQUbQVbQWbQXbJkbQYbQZbRabRbbRcbRdbRebRfbRgbRhbRibLbbRjbOibRkbRlbRmbRnbRobRqbPEbSFbMHbMHbMHbUzbLhbPNbRsbRtbRubRvbRwbRxbRybPPbRzbRAbRBbPTbPTbRCbPWbRDbREbWHbRGbRHbRIbRJbRrbNabRLbwobikbikbikbGxbGxbGxbGxbikbikaabbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydkxdkwdkydkxdkzdjFdjHdjHdjFdjHdkBdkAdkCbikbikbikbikbikbikbikbikbikbikbikbikbikdmideNdePdePdePdeNdmHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbOVbRMbRNbRObRPbNybRQbRRbRSbRTbNzbDXbRUbRVbvvbvvbFXbRWbubbQNbQMbRXbRYbRXbRZbSabSabSbbScbSdbSabSabSebSabSfbSabQMbQRbuabSlbSkbTJbTIbTLbTKbvwbPlbSmbQUbSnbQVbSpbJkbSqbSrbSsbStbSubSvbSwbSxbJkbSybSzbLbbSAbSBbSBbSCbSDbSEbSHbSGbPEcgQbSIbMHbSJbSKbLhbPNbSLbSMbSNbSObSPbSQbSRbPPbSSbRAbSTbSTbPTbSUdnjbSWbSXbSYbSZbTabTbbTcbRKbNabOMbwobTebikbikbikbikbikbikbikbikaabbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjZdjYdkDdkDdkDdkDdkDdkEdjHdjHdjFdjydjydjydjydjydjydjBbikbikbikbikbikbikbikbikbikbikbikdeRdeSdeSdeSdeTbikbikbikbikbikbikbikbOUbOTbQebOTbQfbikbikbikbOVbOVbOVbTjbTkbRObTlbNybTmbQnbTnbTobNzbDXbTpbTqbTrbTsbTtbTubTvbTwbTxbTybTzbTAbTBbTCbTCbTDbTEbTEbTEbTEbTEbTEbTFbTGbTHbTNbTMbTPbTOdlidjmdlkdljdllbPlbTQbQUbQVbTRbSpbJkbSqbSrbTSbTTbTUbTVbTWbTXbJsbTYbTZbLbbLbbUabUabLbbSDbLdbUbbUcbLgbUdbUebUfbUgbUhbLhbPNbUibUjbUkbUlbUmbUnbUobPPbUpbRAbSTbSTbPTbUqbUrbUsbUtbUubUvbUwbUxbUybVObNabOMbUAbUBbUAbUCbUDbUCbUCbUCbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkhdjYdkDdkDdkDdkFdkGdjFdjHdjHdjFdjHdjHdjHdkHdjHdkIdjFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbTgbTfbTibThbTgbUIbUIbUIbOVbUJdpmbUKbULbUMbUNbUObUPbUQbUQbURbNzbUSbUTbUUbUVbUVbUWbUXbUYbUVbUZbUZbVabVbbONbUZbUZbVdbQMbQMbVebVfbVfbVfbVgbVhbVfbVfbVibVjbVkbVkbVlbVkbVmbVnbVkbVobVpbVqbPlbVrbVsbSqbVtbVubVvbVwbVxbVybVubJkbSybVzbVAbVBbVCbVDbVEbVFbVGbVHbVIbVJbVKbVLbVMbVNbPMbLhbPNbPNbVPbVQbVRbVSbVRbVTbPPbVUbVVbVWbVWbPTbVXbVYbVZbNabNabNabNabNabNabNabNabOMbUAbWabWbbWcbWdbWdbWebUCbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikaabbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjyddZdkDdkDdkLdkMdjFdjHdjHdkNdjHdjHdjHdkOdjHdkPdjFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbQebUEbUFbUEbQebUIbWmbWlbOVbWnbTkbWpbWqbWrbWsbNzbWtbWubWvbWwbNzbUTbUTbWxbUVbWybWzbWAbWBbWCbUZdmbbWEbWFbWGcAzbUZbWIbWJbWKbVfbWLbWMbWObWNbWPbWQbWRceLbWTbWUbWVbWWbWXbWYbWZbXabXbbXcbXdbXebXfbXgbXhbSrbXibXjbXkbXlbXmbXnbJsbXobXpbXqbXrbVDbXsbXsbXtbXubLgbXvbXwbXxbXybXzbXAdoEbLhbXCbXDbXEbXFbXEbXEbXGbXHbXIbXJbXKbXLbXMbPTbXNbXObPXbEXbxXbXPbXQbXRbXRbXQbXRbXSbUAbXTbXUbWcbWdbXWbXVbUCbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfbXXbXYbXXbWgbWhbWhbXZbYabXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydkQdkDdkDdkRdjFdjHdjHdjFdkSdjHdjHdkUdkTdjydkjbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbTgbUGbUEbUEdeycOWbTkbTkdeAbZAbTkbTkbWqbYhbYibNzbNzbNzbNzbNzbNzbYjbUTbYkbYlbYmbYnbYnbYnbYobUZbYpbYqbYqbYqbYrbYsbYtbYubYvbYwbYxbYybYzbYAbYBbYCbVfbVibYDbVkbYEbYFbYGbYHbYIbVkbSmbQVbSnbQVbYJbYKbYLbYMbYNbYObYPbYQbYRbVubYSbYTbYUbYVbYWbYXbYYbYZbZabZbbLgbLgbLgbLgbLgbZcbZdbZebLhbZfbXEbXEbZgbZhbXEbZibZjbZkbZlbRAbZmbZmbPTbPVbZnbPXbEXbUAbZobUAbUAbUAbUAbUAbUAbUAbZpbZqbUCbZrbZtbZsbUCaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacbZubXXbXXbZvbWhbWhbXZbXZbZwbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydkWdkVdkXdjFdjHdkYdjFdkZdladjHdjydjydkjbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbQebUFbUFbUFbQebUIbYfbYebZzbZAbTkbTkbZBbZCbZDbZEbZFbZFbZFbZGbUTbUTbUTbWxbUVbZHbYnbZIbYnbZJbUZbYpbYqbZKbYqbZLbUZbZMbZNbZObVfbZPbZQbZRbZSbZTbZUbZVbZWbZXbZYbZZcaacabcaccadbVkbTQbQVbQVcaebYJbYKcafcagcahbXjcaicajcElcalcamcancaocapcaqcarcIfcasbXscatbVAcaucavcawcaxcaycazcaAbZjbZfcaBbXEbXEbXEcaCcaDbZjbZkcaEbRAbZmbZmbPTcaFcaGbPXbEXcaHcaIcaJbUAcaKcaLcaMcaNcaOcaPcaQbUCcaRcaScaTbUCbUAbUAbUAbUAbUAbUAbUAbUAbikbikbikbikbikaabbikbikbikbikbikbikbikcaUbWhbZubWhbWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydjydjydjydjydjydjydjydjydjydkjbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaacbUTcjMcjMbUTcjMcjMbUTbikbikbTgbWjbYbbWkbTgbUIbUIbUIbOVcaYdpncaZcaZcaZbOVbOVbUTcbbcbaccAcbcbUTcbdcbebUVbZHbYnbYnbYncbfbUZbYpbYqbYqcbgcbhcbicbjcbkcblbVfbVfbVfbVfbVfcbmbVfbVfcbncbobVkbVkcbpbVkbVnbVkbVkbPlcbqcbqbPlccicbrcbscbtcbucbvcbwcbxcbycbzcbAcbBcaocapcbCcbDcbEcbFcbGcbHbVAcbIcbJcbKcbLcbMcbNcbOcbPcbQcbPcbRcbRcbRcbPcbScbPcbPcbTcbUbZmbZmbPTcbVbZnbPXcbWcbXcbYcbZccaccbccccccccdcceccfccgcckccjcdqcclcfeccmccnccoccpccqccrccscctaabaabaabaabaabaabaabaabbikbikbikbikbikbWgbWhccuccvccvbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbUTccBcqsbUTccBcqsbUTbikbikbYcbOTbYgbOTbZxbikaabbikbOVbOVbOVbOVbOVbOVbOVclabUTcuRcsuccCccDbZFccEccFbUVccGccHdmcbYnccJccKccLccMccNccOccPbUZccQccRccSccTccUccUccUccUccVccWccXccYccYccZccZcdacdbcdcbVibPlcddcdecdfcdgcdhbYKcdicbtcdjcdkcdlcdmbSwcdncdocdpcffcdrcdrcdscdrcdrcdrcdtbVAcducdvcdwcdxcdycdzcdAcbPcdBcdCcdDcdEcdFcdCcdGcdHcdCcdIcdJbRBbPTbPTcdKcdLcdMcdNcdOcdPcdQcdRcdScdTcdUcdVcdWcdXcdYcdZceacebceaceccebcebcebcedceecefcegcehaabbikbikbikbikaabbikbikbikbikbikbikbikbWhbWhceibXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaacbikaacbUTcfQcqsbUTcfQcqsbUTbikbikaabaabaabaabaabaabaabaabaabbUTcqscAjcwNbUTcEvcEwbUTcGJbUTbUTcekbUTbUTcelbUVcemcenceocepceqcercescetceucevcewccKcexceycezceAceBceBceBceBceCceDceEceFceGceFceHceIceJceKchvceMceNceOcePceQceRceSceTceUceVceWceXceYceZcfacfbcfccfgbMmbMmcfichOcgHceYchVcfjcfjcfkcfjcflcfmcfncfocbPcfpcfqcfrcfscfrcftcfucfvcdCbPTcfwbPTbPTcfxcfybZnbBxbEXbUAcfzbUAbUAcfAcfBcfCcfDcfEcebcfFcfGcfHcdUcfHcdUcfIcdUcdUbUAcfJcfKcfLcfMaabaabaabaabaabaabaabaabbikbikbikbikbikbWhbXZbXZbXZbXZbXZbXZcfNbXZcfObXZbXZbXZbXZbXZbWhbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabdnkaacaabaDDaDDaacbUTbUTcekbUTbUTcekbUTbUTbUTcjMcjMcjMbUTbUTbUTbUTbUTbUTbUTcqschodnmbUTdnnbUTbUTdnobUTcfPbVccqsbUTcfSbUVcfTcfUcfVbZHcfWcfXcfYbYpcfZcgacgbcfXcgccgdcgecgfcgfcggcghcgicgjcgkcglcgmbGycgnbVicgobGybGycgpcgqcgrcgscgtceQcgucgvcgwcgxcgycgzbMVcgBcgCcgzcgzcgDcgEcgEcgEcgEcgEcgGcgFciOcgJcgJcgKcgLcgMcgNcgOcgPcbPdomcgRcgScgTcgScgUcgVcfrcgWcgXcgYbBxcgZbBxcfybZnbBxbEXchachbchcbUAbUAbUAbUAbUAchdcdUchechfcfIcdUchgcdUbZpcdUchhbUAchichjchkbUAaabbikbikbikbikaabbikbikbikbikbikbikbikbWhchlchlchlchlchlchlchmbXZchnchlcfObXZbXZbXZbXZbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaaccjMcqscqscqscqsdoadnxcqscqscuRdnpdnpdowdnpdnpdnpdnpdnpdnpdnpdnpdnpdnpdnpdnpcsubUTchocfQchpbUTcfSchrchrchrchrchrchrbUZbUZbUZbUZbUZbUZbUZchschtchucWpchwchxchychychzchAcglbGybGychBchCchDbGybGybGycqOchFchGceOchHchIchJcgEchKchLchMbSqchLchNcfdcfdcfdcjncjlcjlcjlcjlckacgIbSqclPchPchQchRchSchTchUclQcbPchWchXcfrchYcfrchZciacibciccidciecifbBxcigcfybZncihbEXbFeciicijcikbwobxXbxXbUAcilcimcinciocipciqcirciscitciucivbUAciwciycixcizbikbikbikbikaahbikbikbikbikbikbikbikbikciAbXXbXXbXXbXXbXXbXXbXXciBciCbXZbXZbXZbXZciDbYabWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaabaabaaccjMdnrdnqdnscqscqsdoxcqscqsdnobUTbUTbUTbUTbUTbUTcekbUTbUTbUTbUTdntdntdntdntdntdntdntdntdntbUTcfScejbikbikbikbikciEbaTciGciHciIciJciKciLciMciNcmPciPciQciRciSciSciTciUciVciWciWciWciWciXciWbGybGybPlciYciZcjacjbcjccjdchScjecjfcjgcjhcjicjjcjkcjlcfdcnicjpcjpcjpcjpckNclSckUcnjcjqcjrcjscjtcbAcwncjvcbPcjwcjxcjycjzcjAcfrcjBcbPcbPbEXcjCbEXbEXbEXcjDcjEcjFbEXbxXciicjGcjHbwobwobwobUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbikbikbikbikbikaabbikbikbikbikbikbikbikbWhccvccvccvccvccvccvcjIbXZccuccvcjJbXZbXZbXZbXZbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbUTcjKcjKcjKcjKcjKcjKcjLcjKdnodnubUTcqsdoydnwdnycqsdnydnvdnzdnwdntdnAdnAdntdnBdntdnDdnCdntcqscelcjMbikcjNcjOcjPcjQcjRcjScjTcjUcjVcjWcjXcjYcjZcosckbckcckdckeckfckgckhciVckickjckjckjckkciWbGybGycklcklcklcklckmcklckncknckocklcklckpcklckqckrckscktcksclZaPKcmacmmcmlcmocmnckzckAckBckCckDckEckFcdccbPcbPckGcbPckHcbPckIckJckKcgnckLckMckvckOckPckQckRckSckPbxXciickTbxXbxXckVckWckXchabxXbxXbxXbxXbxXbxXbxXckYckZcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhbXZbXZbXZbXZbXZbXZcfNbXZcjJbXZbXZbXZbXZbXZbWhbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdnEclbclbclbclbclbclbclccldcleclfclgclhclicjLdnocnRbUTcqsdozdnwcqscqscqsdnvcwNdnwdntdnAdnFdnCdnCdnGdnCdnHdntcljcelcjMbikclkcllclmclnclocjSclpdhpclrclsciLcltcgdcoaciPcluchyclvchyclwclxclyclzclAclAclAclBciWbGybGycklclCbzsclEclDclGclHclIclFclJclKclMclLclNclOcotcfhcpwcmpcmrcmqctbcsZcuoctcckDclVclWclXckzclYcmtcmscmbcmbcmccmdcmecmfcmgcmhcmfcmfcmfcmicmfcmfcmjcmucnpcnlcqRcoXcrGcqScrHcrHcrIcrHcrHcrHcrHcrJcrKcrHcrHcrHcrMcmvbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhbWhceibXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcmwcmxcmxcmxcmxcmycmzcmAcmBcmCcmCcmDcjKdnocqscekcqscqscqscqscqscqscqscqscqsdntdntdnCdnIdnCdntdnCdnIdntcmEcfScjMbikclkcmFcmGcmHcmIcmJcmKcmLcmIcmIcmMcmNcmOcpxcmQcmQcmRbHtchycmTcmUclyclAclAclAclAcmVciWbGybGycklcmWcmXcmYcmZcnacnbcojcnhbvWbulbxBclHconcklcqQcfdcrLcjpcwscvxcwEcwCcxNcxIckDcnmcnncnockDbJGcumctecnqcnqcnqcnqcnqcnrcnscntcnucnvcnvcnwcnwcnvcnxcnycnzcnAcnBcnCcnDcnEcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcuncnFcnGcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcaUbWhbWhchlchlbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcnIcnJcnKcnJcnLcnMcnNcnOcnPcnQcjKdnobUTbUTdnJcjMcjMcjMcjMcjMcjMcjMdnKdntdnCdnCdnCdnCdnLdnCdnCdntcnRcelcjMbikclkcnScnTcnUcnVcjScnWcnXcnYcnZciLcltcgdcbkchqcgfcoccodciPciPciPcoecofclAclAcogcohciWbGycoicklcoocokcolcomcomcoqcrBcqIcomcomcopclHcrCcorcrNcfdcupcjpcxVcxUcxVcxVcxNcEickDcowcoxcoyckDcozcuscoicoAcoAcoAcoAcoAcoDcoDcoDcoAcoAbikbikbikbikckPcoEcoFcoGcnCcoHcoIcoJcoKcoLcoMcoNcoOcoPcoQcoRcoScoTcoUcnCcuncoWcvtcoYcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcpacpbbWhbZubWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcpccpdcpecpfcmBcpgcphcpicmBcpjcpkdnMchobUTcqscjMbikbikbikbikbikcjMcqsdnldnAdnOdnCdnCdnCdnCdnPdnNcplcpmcjMbikcpncjOcpocjQcppcjScjScpqcprcpscptcpucpvcwqchqcgfcpycpzcpAcpBcpCciVcpDclAclAclAcpEciWbGybGycpFcpFcpGcpHcpIcpIcrDcyFcrEcpJcpJcpKcpFcpGcpMcqQcfdcrLcEjbjVcEYdbndbmcxNclRckDcoucpNcovckDbGycuscoAcoAaabaabbikbikbikbikbikbikbikbikbikbikbikcpRcpScpTcpUcpVcpWcpXcpXcpYcpXcpXcpXcpXcpXcpZcqacqbcqccqdbwocvvbXSbwobwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhcqhcqicqjbWhbWhbXZbXZcqkbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcqlcnJcqmcnJcqncqocqpcqqcnNcqrcjKdoAcwNbUTcfQcejbikbikbikbikbikcejdnRdntdnSdnSdnAdnUdnTdnCdnVdntcqscelcejbikbikbikbikciEcqtcqucqvcqvciLcqwciLcqxcgdcbkcqycqzcqAcqBcqCcqCcqCcqDcqEclAcqFclAcqGciWbGybGycpFcqHcrFcqJcqKcqLcsPcpFcsUcqMcqKcqNcsVcqPcpMczecyWczgcEjdbpdbodbrdbqdbsctcckDcpOcpPcpQckDbGycuscoAcvyaabaabaabbikbikbikbikbikbikbikbikbikbikcpRcqUcqVcqWcqXcqYcqZcracrbcpXcpXcrccpXcpXcpZcqbcqbcqbcrdbwocvzbxXbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfcrhcribZvbWgbWhbWhbXZbYabXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcjKcjKcjKcjKcjKcjKdnWcrjcrjcrjcrjcrjdnQcrjcrjcrjcrjcrjcrjcrjcrjcrkcrkcrkcrkcrkdnYdnYdnYdnYdnYdnYdnYcekcrlcrmcrmcrmcrmcrmciEciLciLciLciLciLciLciLcrncgdcbkcrocrpcrqcrrcrscrtcrucrvcrwcrxcrycrzcrAciWbGybGycpFcuicsYcvocujcujcvpcpFcwicujcujcwjcujcwkcpMbGwbGwbGwcEjdbudbtdbvdbmdbxctcdbydbydbycoAcoAbGycuscoDcwpbikaabaabaabbikbikbikbikbikbikbikbikbikcpRczNczPcoBcrOcrPcrQcrRcrScpXcpXcpXcpXcrTcrUcrVcrWcrXcrYbwocvzbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaSecsdctvdnZctvdoBcsdcsecsfcsgcsgcshcsicspcskcslcsmcsncsocsrcsqcsqcsscsqcstctzctzctAcsvcswcsxcsycsxcsxcsxcswcsxcsxcszcsAcsBcsCcgdcbkcsDcsEcsFcsGcgfcsHcmQcsIcsJcsKcsLcsMcsNcsObGybGycpFcwlcsQcsRcsScsTcwmcpFdehcsTcsWcsXdlFdqVcwrbikbikbikcEjdbAdbzdbAdbAdbCdbBdbEdbDdbycwFbVibGycuscoDcwpbikbikaabaabaabbikbikbikbikbikbikbikbikctdckPcxGckSctdctfctgcthctictjctkctlcpXcpXctmctnctoctpctqbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSecsdctvctvctvdoBcsdctuctvctwctvctxctyctDctCdmedcYdmedmfcxnctEctFctEctEctGcblcblctEctHctEctEctEctEctEctEctEctEctEctEctIctJctKctLctMctNctOctPctQctRctSctTctUctVctWctXciFctZcuacnqcubcuccudcuecufcugcuhdqWcpFdqXcqKcugcukcqKculcwrbikbikbikdbFcmkdbGdbJdbIdbCdbKdbMdbLdbOdbNceFceJdbPcoDcwpbikbikbikaabaabaabbikbikbikbikbikbikbikckPcurczQcutckPcnCcnCcnCcnCcnCcnCcuuctlcuvcuwcuxcuycnCcnCbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSedobctvdocctvdoBcuBdodcuCcuDcuEcuFcuGcuHcuIcuJcuKcuLcuMcuNcuOcuPcuQdoeceAcuSceAcuNcuTcuNcuNcuNcuNcuNcuNcuNcuNcuNcuNcuUctEcuVcuWcuXcuYcuZcvacvbcvccvdcvecvfcvgcvhcvicvjcvkcsLceJcvlcvmcvncqKcqJcqKcqKdqYcpFdqZcqKcqKcqNcqKcyGcwrbikbikbikdbFdbRdbQdbTdbSdbVdbUdbXdbWdbybGychCcyHcuscoAbikbikbikbikbikaabckPckPckPckPckPckPckPckPckPcvucxScvwckPcxOcxOcyIckPaabcnCcnCcvAcnCcvBcvCcvDcnCcyKcyJcvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdogdofcrjcrjcrjcrjdnQcrjcrjcrjcrjdnXcrjcvFcvGcvGcvHctBdlXcrjcrmcvJcvKcvKcvLcvKcvMcvKcvKcvNcvOcvKcvKcvOcvOcvOcvKcvKcvKcvKcvPcvQcvRcvScvTcvUcvVcvWcvXcvWcvWcvWcvWcvZcwacwbcwccwdcsObGycvrcwecwfcwgcwhdradrcdrbcpFdrddrcdrecqNcqKcwocpMbikbikbikdbFdbZdbYdcadbIdccdcbdbUczRdbycyObVibVicuscoAbikbikbikbikbikbikckPcwtcwucwvcwwcwxcwycwzcwAcwBczScwDckPcxOcBZcyPckPaabaabcwGcwHcwIcwJcwKcwLcwGbxXbxXcvzczfbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGacGafxafxacGafxafxaabagiaabaqZbikaqZaqZdoidoCdojdojdojdoldokcrjcwOcwPcwQcwRcwScwTcwUcwVcwWcvOcwYcwZcxacxbcxccxdcxecxfcxgcvKcxfcxhcxicxjcxjcxkcvKcxlcxmcxncxocbkcxpcxqcxrcxscxtcxucxtcxvcxwcxxcxycxzcxAcsOcsOcvrcwecpMcpMcxBcpMcpMcxCcxDcxEcxEcxEcxFcxEcyUcpMbikbikbikdbFdbFdbFdbFdbFdbydcedcgdcfdbybGybGyczhcuscoAbikbikbikbikbikbikckPcxOcxPcxOcxQcxRcqUcxScwAcxTczicxTckPcxOcxOcMpckPaabbikcwGcxWcxXcwJcwJcxYcwGczjbxXcvzbzNczMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikbikaabaabbikaabaabbikbikaabaabaabaabaabdoidoidohdoidoidoncEBcrjcrjcrjcrjcrjcrjcrjcrjcybcwWcvOcyccydcyecyfcyfcyfcyfcygcyhcyicxjcyjcxjcxjcykcxjcylcymcyncyocxocbkcypcyqcmScxscyscytcyucxscyvcywcyxcyycyzcyAcyBcyCcyDcyEcyEcAaczUcAdcAccAeczTcALceJcAhbGycAMcoAcoAcoAcoAcoAbikbikbikbikdcidchdckdcjdbydclbVibVicuscoAcoAcoAcoAcoAbikbikckPcxOcxOcxOcyZczaczbczcczdcAicAOcAvckPcAVcAYcAWckPbikbikcwGczkcwJczlcwJczmcwGbxXbxXcvzczMbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdoDbikacGbikczoczpczqbikczoczpczqbikczoczpczqbikbikdoidoocfRdopdoidoqcGKdojdojdojdojdojdojdojdojdojcEycvOcztcxjcykczucxjcxjcxjczvcxjcztcztcxjcxjcxjcxjczwczxcymczyctEczzcoacyqcyqczAcxsczBczCczDcxsczEctWczFczGczHczIczJczKbGyczLcdcczLbGycBacAZcBccBccBccBccBPcBNcBNcBNcBNcBNcBQcoAbikbikbikbikdcidchdckdcmcTabGyckObVicusbGybGybGycgmcoAbikbikckPcwAcwAcwAcwAczWcqUczXczYczZcCfcAbckPcCGcCYcCIckPbikbikcwGcAfcAgcDLcwJcDNcwGcEdbxXcvzbwoaabaabaabaabbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikczocAkczqbikczocAkczqbikczocAkczqbikaqZdoicfRcfRcfRdoidoidorczsdoidoiczsczsdoidoiczsczscwWcvOcztcAlcxjcAmcAncAocAocyjcxjcztcApcxjcxjcxjcxjcAqcArcAscAtbZNcAucAPcAwcAxcAycxsczBdlYcAAcxscABctWcsOcACcsLcADcAEcAFcAGcAHcAIcAJcAGcAKcAGcAGcAGcoAcoAcoAcoAcoAcoAcoAcoAcEhcoAbikbikbikbikdcicBTdcqcBUdbycgmcFdbVicFmcFlcFlcFnbGycoAbikbikckPcwtcwucwvcAQcARczbcAScATcAUcFrcIScAXcGscIScGtckPbikbikcwGcwGcBbcCrcBdcwGcwGbwobxXcGycyJcyJcyJbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikaqZaabczocAkczqbikczocAkczqaabczocAkczqbikaabdoidondosdoqdoibikaabbikbikbikbikbikaabbikbikczscwWcvKcBecxjcBfcBgcBhcBicBjcBicBkcBicBlcBmcxfcBncztcztczxcBocBpcBqcBrcBscBtcBucBvcBwcBxcBycBzcBAcBBcBCcBDcBDcBEcBFcBGcBHcBIcBJcBKcBLcBMcrecBOcHucHtcDPcDPcDPcDPcDPcDPcHvcoAcEhclUclUclUclUclUclUcjmbEJcjmcFfclUclUcoAcoAcoAcoAcusbGycoAbikbikckPcxOcBZcxOcCacxRcqUcCbcCccCdcCecqUcqUcCgcqUcChckPbikaabaabcwGcwGcCscwGcwGbikbwobxXcvzcyJcHycHxbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikczocAkczqaabczocAkczqbikczocAkczqaabbikdoidoiczsdoidoibikaabaabbikaabbikaabaabbikbikcybcCicvKcCjcCkcCkcClcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcCmcCncCmcCocCmcrmcCpcCqcFbcCtcCtcCtcCucCvcBCcCwcCxcCycCzcCAcCBcBIcCCcCDcCEcCFcHzcCHcHAcCJaabcCKcCKcCKcCKcCKcHBcoAcHDcHCcIGcHHcIHctackycjocBWckuckycBXcCPcBYcCRcCQcoAcusbGycoAbikbikckPcxOcxOcxOcAQcCTczbcCUcCVcCWcCXcCZcCZcDacqUcDbckPaabaabbikbikbikcIKbikbikbikbwobxXcvzcyJbxXbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxaqZbikczocAkczqaabczocAkczqbikczocAkczqaabbikbikbikbikbikbikbikbikbikaabcDccDdcDdcDdcDdcybcDecwWcDfcDgcDhcDhcDicDjcDkcDlcDlcDlcDlcDmdotcDocDncDncDpcDpcDncDqcDrcDscDtcDtctYcDvcDwcDxcDycDzcDzcDAcDBcDCcDDcDEcDFcCAcDGcBIcDHcDIcDJcDKcILcDMcIMcDOcDPcDQcDRcDScDTcCKcHBcoDcEhclUcvscvqcIOcINcxLckxckwdcrclUcCSczVcuqczVcDUcoAcusbGycoAcoAbikckPcwAcwAcwAcwAcEkcqUcCbdlZcEmcCecqUcEncEocEocEpcEqcXYaabbikbikbikbikbikbikbikbwobxXcGybxXbxXcIPbwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabaabcEraabaabaabcEraabbikaabcEraabbikbikbikbikbikbikbikbikbikcDccDccDccEscEtcEucDddoucExcEycDfcDfcEzcEAcvKcvKcEBcECcECcECcECcEDcEEcEFcEEcEEcEEcDtcDtcEGcEHcEIcEJcEKcDzcELcDwcDzcDzcDzcDzcEMcBCcENcEOcCycDFcCAcDFcBIcDHcDIcEPcEQcERcEScETcEUaabcEVcEWcDTcEXcCKcHBcoDcHDcHCcxKcxJczVcxMclUcIIcDVdcsclUcDWcDYczVcEbcEaclUcusbGycITcoAbikckPcwtcwucwvcFjcARczbcFkcJIcGCcJKcJKcFocFpcFqcJLckPaabaabaabbikbikbikbikbikbikbwocJMcvzbwobwobwobwobwoaabaabaabcJNcJNcJNcJNcJNcJNaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabcFscFtcFtcFucFvcFwcFwcFwcFvcFwcFwcFwcFvcFwcFwcFwcFxcFtcFtcFtcFtcFtcFycFzcFAcFBcFCcFDcFEcFFcFGcfRcwWcFHcDfcvKcvKcvKcFIcEBcECcFJcFKcFLcyrcFNcDucFPcFOcFQcFScFTcSpcFVcFWcFXcFScFYcFZcDwcGacDzcDzcDzcGbcBCcGccGccDFcGdcGecGfcGgcGhcGicGjcGkcGlcGmcGncDOcGocDQcGpcDTcDTcCKcHBcoDcEhclUcyMcyLcyNcFfclUcnkclTcFfclUcyQcyScyRcyTcyTclUcusbGycJOcoAbikckPcxOcxPcxOcGAcxRcqUcGBcJPcJJcqUdlWcGDcwAcwAcwAckPbikbikaabaabbikbikbikbikbikbwocyKcvzbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabaabcGFaabbikaabcGFaabbikaabcGFaabbikbikbikbikbikbikbikbikbikcDccDccDccGGcGHcFMcDddovcfRcGKcExcExcExcExcGLcExcFGcECcGMcGNcGOcGPcGQcGRcGScGTcGUcGVcGWcGXcGYcGZcHacHbcFYcELcDwcHccHdcDzcDzcHecBCcHfcHgcDFcHhcCAcHicHjcHkcHlcHmcHncHocHpcHocHqaabcCKcCKcCKcCKcCKcHBcoAcEhclUcIJcyVcyYcyXcEecEccEgcEfcHwcGucHZczVcIRcIQclUcusbGycJRcoAbikckPcxOcxOcxOcFjcHEcHFcHGcJScHIcCZcCZcCZcHJcHKcHLcHMbikbikbikaabaabbikbikbikbikbwobwocvzbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxacGaabczocHOczqbikczocHOczqbikczocHOczqaabbikbikbikbikbikbikbikbikaabaabcDccDdcDdcDdcDdcHPcHQcHRcfRcHScfRcfRcEBcHTcfRcECcHUcHVcGOcHWcFNcHXcHYcIacIacIbcIccIdcIedmabRFcIbcIhcIicIjcIkcIlcImcIncIocIpcIqcGfcIrcIscItcIucIvcIwcIxcIycIzcIAcIBcICcIDcDPcDQcIEcIFcIFcCKcHBcoAcEhclUclUclUclUclUcJhcANcBRcJQcMccBScMecMdcMCcBVclUcuscGqcGrcGrcGrcJTcJTcJTcJTcJTcJUcKTcKbcKUcIUczbcIVczbcIWczbcIXcHMbikbikbikbikaabaabbikbikbikbikbwocvzbwoaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikczocHOczqaabczocHOczqbikczocHOczqbikbikbikbikaabbikbikbikbikaabaabaabbikbikaabaabcJbcJbcJbcJbcJbcJbcJbcJccJbcJbcECcJdcJecGOcHWcFNcJfcFNcFNcJgcDtcJicJjcFWcJkcFRcDtcJmcDzcDwcJncJocJpcIncJqcJrcJscJtcJucJvcJwcJtcJxcJycJzcJAcDFcJBcJCcJDcJEaabcEVcJFcJGcJHcCKcHBcoDcKWcKVcKVcKVcKXclUcFacyLcCLcFecyScCMcyTcyTcyScCNclUcuscGvbVibGycKYcKZcoAbikbikckPcJVcJWcJXcJYcJVcJWcJZcKacJVcJWcLackPaabaabaabaabaabaabaabaabaabaabbwocvzbwobwobwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjcbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabczocHOczqbikczocHOczqbikczocHOczqaabbikbikbikbikbikbikbikbikaabaabbikbikaabaabaabcJbcKjcKjcKkcGIcKmcKmcKncKocKocKpcKqcKrcGOcHWcGOcKscGOcGOcGOcDtcKtcKucKvcKwcKxcKycKzcKAcKBcKCcKCcKCcKDcKEcKFcKGcKHcKIcHhcCAcKJcKKcKLcKMcKNcDFcJBcKOcKPcKQcKRcDQcKScIFcIFcCKcHBcoDcEhbVibVibVibYDclUcFgcCOcDXcNDcyScPocPMcyTcPVcPQclUcuscGvbVibGycyHbGycoAbikbikckPcLicLjcLkcwAcLlcLmcLncwAcLocLpcLqckPaabaabbikbikbikbikbikbikbikbikbwocvzbxXbxXbwoaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxaabczocHOczqbikczocHOczqaabczocHOczqaabaabaabaabbikaabbikbikaabaabbikbikbikaabbikbikcJbcKjcKjcKkcLscLscLscLtcLucLvcECcLwcLxcLycLzcLAcLBcLCcLDcLDcLEcLFcLGcGOcGOcGOcLHcLIcLJcLKcLLcLMcLNcLOcLPcECcLQcLQcLRcHhcCAcLScLTcLUcLVcLWcDFcLXcLYcLZcMacMbcCKcCKcCKcCKcCKcHBcoDcEhcLbbGybGybYDclUcNEczVczVcOtcDZcQMcRwcyTdbkcYuclUcuscGvczhbGychCcITcoAbikbikckPcMpcxOcxOcwAcMpcxOcxOcwAcMpcxOcxOckPbikaabaabbikbikbikbikbikbikbikbwocLccyJbxXbwobwobwocJNcJNaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagiaabczocMqczqbikczocMqczqbikczocMqczqaabafxaabaabaabaabaabaabaabbikbikbikbikbikbikaabcJbcMrcMscLscLscLscMtcMucMucMucMucMucMucMucMvcMwcMxcMycMzcMzcMzcMAcMBdcpdcodcvcMzcMBcMDcMEcMFcLMcMGcLOcLPcMHcMIcMJcMKcMLcMMcMNcMOcKNcMPcMQcMRcMScMTcMUcIDcMVcDQcMWcMXcMXcCKcHBcoAcEhbVicozcLdbYDclUcOBczVcQgcPYcySdcydczcyTdcBdcAclUcuscGvbVibGybVibVicoAaabaabckPcNncBZcxOcwAcNncBZcxOcwAcNncBZcxOckPbikbikaabaabbikbikbikbikbikbikbwocvzcyJcLecyJcLfbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikafxbikaabbikbikbikaabaabaabbikbikaabaabbikafxaabaabaabaabaabaabbikbikbikbikbikbikbikaabcJbcNocLscLscLscLscLscMubhGcNpcHscNrcNtcMucNucNvcNwcJecGOcGOcNxdcCcNzcNAcNBdcDcNCdcEcECdcFcMFcLMcNFcLOcNGcECcNHcLQcNIcNJcDFcMNcMOcNKcDFcMQcMRcJBcJCcNLcJEcNMcEVcNNcNOcNPcCKcHBcoAcEhbVicLgcLgbYDclUclUdbldcwclUcEZclUclUclUclUclUclUcuscGvbVibGybGycMfcoAbikbikckPcOacxOcxOcwAcOacxOcxOcwAcOacxOcxOckPbikbikbikaabaabbikbikbikbikbikbwocvzcyJbxXbxXbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxacGacGagiafxafxafxafxacGafxafxacGcOcbikaabbikbikbikbikbikbikbikbikbikbikbikbikcJbcOdcLucLscLscLscOecMucNpcNqcOkcOlcOmcOncOocOpcOqcOrcGOcOsdcKcOucOvcOwcOxcOycOzcOAdcLcNwcJecOCcODcLKcOEcECcOFcLQcOGcOHcDFcMNcMOcKNcDFcOIcMRcJBcOJcOKcKQcOLcDQcOMcMXcMXcCKcHBcoDcEhcMgchCbJGbYDdcxclUclUcMhclUdcHdcGcFcbVicMjcMibGycuscGvbVibGycMkcITcoAbikbikckPckPckPckPckPckPckPckPckPckPckPckPckPbikbikbikbikaabaabbikbikbwobwobwocvzcyJcMmcMlbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabcJbcJbcJbdeBcOXcOXcOXcMucOYcOZcPacPacPbcPccMzcPdcPecPfcPgcPhdcMcPicPjcPkcPlcPmcPncPidcNcPpcPqcPrcPscPtcPucPvcNHcLQcPwcPxcDFcMNcDFcPycDFcMQcMRcJBcJCcPzcJEcNMcCKcCKcCKcCKcCKcHBcoDcMncKXchCcITcMYcMocMocMocMZbVidcJdcIcFhbVicNacKVcKVcNbcHrczhbGybGycoAcoAbikbikcONaabbikbikbikbikaabbikbikbikbikbikaabbikbikbikbikbikaabaabbikbwocyKcNccNdcyJcNfcNebxXcxHbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabcPEcLscLscOXaabaabcMucPHcPIcPacPacPJcMucPKcPLdcOcPNcPOcPPdcPcECcPRcPScPTcGOcPUcECdcQcPWcPXcPNcPNdcRcPZcECcQacLQcQbcQccDFcMNcDFcLScLTcQdcQecMScQfdcScIDcQhcDQcQicQjcQjcCKcHBcoDcNhcNgbVibVicEhbVibVibGycNibVibVicGwbVibVicNkcNjcNmcNlcNQcoAcoAcoAcoAbikbikbikbikaabbikbikbikbikaabbikbikbikbikbikaabbikbikbikbikbikbikaabaabbwocNRcunbOMcyJcyJcyJbxXbwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikaabaabcPEcLscLscOXaabbikcMucQscPIcPacPacQtcMucQucQvcECcQwcQxcQxdcTcECcQycQzcQAcQBdcUcECcQxcQxcQxcQwcECcQCcQucECcNHcLQcJlcQEcQFcQGcQHcQIcQJcQKcIAcQLcJCdcVcJEcNMcEVcQNcQOcQPcCKcHBcoAcoAcEhcdbcNScEhcNTbVibGycNVcNUcNXcNWcMocMocNYcGvbVicNZcoAcoAbikbikaabbikbikbikbikaabbikbikbikbikaabbikbikbikbikbikaabbikbikbikbikbikbwobwobwobwobwocOObOMcyJcOQcOPbxXbwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index 366fa34f260..c644a9afd3d 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -160,7 +160,7 @@
"dd" = (/obj/structure/rack,/obj/item/weapon/kitchen/knife/ritual,/turf/unsimulated/floor{icon_state = "chapel"},/area/wizard_station)
"de" = (/obj/structure/table/reinforced,/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/kitchen/knife/combat,/obj/item/weapon/kitchen/knife/combat,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
"df" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/syndicate,/obj/item/weapon/shard,/obj/item/weapon/kitchen/knife,/obj/item/weapon/storage/firstaid/tactical,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/admin)
-"dg" = (/obj/structure/table/holotable,/obj/item/clothing/suit/armor/riot/knight/red,/obj/item/clothing/head/helmet/knight/red,/obj/item/weapon/holo/claymore/red,/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_knightarena)
+"dg" = (/obj/structure/table/holotable,/obj/item/clothing/suit/armor/riot/knight/red,/obj/item/clothing/head/helmet/riot/knight/red,/obj/item/weapon/holo/claymore/red,/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_knightarena)
"dh" = (/obj/structure/table/holotable,/obj/machinery/readybutton{pixel_y = 0},/turf/simulated/floor/holofloor{dir = 9; icon_state = "red"},/area/holodeck/source_knightarena)
"di" = (/obj/structure/table/holotable,/turf/simulated/floor/holofloor{dir = 5; icon_state = "red"},/area/holodeck/source_knightarena)
"dj" = (/turf/simulated/floor/holofloor,/area/holodeck/source_knightarena)
@@ -181,7 +181,7 @@
"dy" = (/obj/structure/holowindow{dir = 1},/turf/simulated/floor/holofloor{dir = 4; icon_state = "blue"},/area/holodeck/source_knightarena)
"dz" = (/turf/simulated/floor/holofloor{dir = 8; icon_state = "blue"},/area/holodeck/source_knightarena)
"dA" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "blue"},/area/holodeck/source_knightarena)
-"dB" = (/obj/structure/table/holotable,/obj/item/clothing/suit/armor/riot/knight/blue,/obj/item/clothing/head/helmet/knight/blue,/obj/item/weapon/holo/claymore/blue,/turf/simulated/floor/holofloor{dir = 2; icon_state = "blue"},/area/holodeck/source_knightarena)
+"dB" = (/obj/structure/table/holotable,/obj/item/clothing/suit/armor/riot/knight/blue,/obj/item/clothing/head/helmet/riot/knight/blue,/obj/item/weapon/holo/claymore/blue,/turf/simulated/floor/holofloor{dir = 2; icon_state = "blue"},/area/holodeck/source_knightarena)
"dC" = (/obj/structure/table/holotable,/turf/simulated/floor/holofloor{dir = 10; icon_state = "blue"},/area/holodeck/source_knightarena)
"dD" = (/obj/structure/table/holotable,/obj/machinery/readybutton{pixel_y = 0},/turf/simulated/floor/holofloor{dir = 6; icon_state = "blue"},/area/holodeck/source_knightarena)
"dE" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/weapon/grenade/smokebomb,/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/sleeping_carp_scroll,/obj/item/weapon/twohanded/bostaff,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source)
@@ -309,7 +309,7 @@
"fW" = (/obj/structure/holowindow,/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_thunderdomecourt)
"fX" = (/turf/space,/turf/unsimulated/wall{dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "diagonalWall3"},/area/centcom/control)
"fY" = (/obj/structure/urinal{pixel_y = 28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
-"fZ" = (/obj/item/weapon/mop,/obj/structure/mirror{pixel_x = 28},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
+"fZ" = (/obj/item/device/radio/intercom/syndicate{pixel_x = 0; pixel_y = 25},/obj/item/weapon/twohanded/required/kirbyplants,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"ga" = (/obj/structure/mirror{pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"gb" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave/upgraded,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja/holding)
"gc" = (/obj/structure/table,/obj/item/clothing/head/that{pixel_x = 4; pixel_y = 6},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/ninja/holding)
@@ -628,6 +628,10 @@
"md" = (/obj/machinery/computer/mech_bay_power_console,/obj/structure/cable,/turf/simulated/floor/plasteel,/area/shuttle/gamma/space)
"me" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station)
"mf" = (/obj/structure/stool,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"mg" = (/obj/item/weapon/mop,/obj/structure/mirror{pixel_x = 28},/obj/item/weapon/twohanded/required/kirbyplants,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
+"mh" = (/obj/item/weapon/twohanded/required/kirbyplants,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"mi" = (/obj/machinery/door_control{id = "nukeop_ready"; name = "Mission Launch Control"; pixel_x = -26; pixel_y = -2; req_access_txt = "151"},/obj/item/weapon/twohanded/required/kirbyplants,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
+"mj" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1},/obj/effect/landmark{name = "ERT Director"},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/specops)
"mk" = (/obj/structure/stool,/obj/effect/landmark{name = "Syndicate-Spawn"},/obj/effect/decal/warning_stripes/east,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"ml" = (/obj/structure/stool,/turf/unsimulated/floor{tag = "icon-dark"; icon_state = "dark"},/area/syndicate_mothership)
"mm" = (/obj/structure/stool,/obj/structure/sign/poster/legit{pixel_y = 32},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/centcom/control)
@@ -636,6 +640,7 @@
"mp" = (/obj/structure/stool,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/control)
"mq" = (/obj/structure/stool,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/evac)
"mr" = (/turf/unsimulated/wall,/area/trader_station/sol)
+"ms" = (/obj/machinery/teleport/hub/upgraded{admin_usage = 1},/turf/unsimulated/floor{tag = "icon-delivery"; icon_state = "delivery"},/area/admin)
"mt" = (/turf/space,/area/syndicate_mothership/elite_squad)
"mu" = (/obj/effect/landmark{name = "Syndicate-Commando"; tag = "Commando"},/obj/machinery/light/spot,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership/elite_squad)
"mv" = (/obj/machinery/light/spot,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
@@ -683,13 +688,13 @@
"nl" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows2 (NORTH)"; icon_state = "fakewindows2"; dir = 1},/area/trader_station/sol)
"nm" = (/obj/machinery/light{dir = 4},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/trader_station/sol)
"nn" = (/obj/docking_port/stationary/transit{dir = 8; dwidth = 2; height = 11; id = "trade_sol_transit"; name = "trade_sol in transit"; turf_type = /turf/space/transit/horizontal; width = 5},/turf/space/transit/horizontal,/area/space)
+"no" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/centcom/evac)
"oB" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (WEST)"; icon_state = "fakewindows"; dir = 8},/area/syndicate_mothership)
"oC" = (/turf/unsimulated/wall/fakeglass{tag = "icon-fakewindows (EAST)"; icon_state = "fakewindows"; dir = 4},/area/syndicate_mothership)
"oH" = (/obj/structure/table,/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/storage/fancy/crayons,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"oI" = (/obj/machinery/washing_machine,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"oJ" = (/obj/structure/table,/obj/item/weapon/storage/fancy/crayons,/obj/item/weapon/storage/fancy/crayons,/obj/machinery/light{dir = 1; on = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership)
"oO" = (/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
-"oP" = (/obj/item/device/radio/intercom/syndicate{pixel_x = 0; pixel_y = 25},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"oQ" = (/obj/machinery/vending/syndisnack,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"oR" = (/obj/machinery/vending/syndicigs,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"pa" = (/obj/structure/noticeboard{pixel_x = -32},/obj/item/weapon/paper/syndimemo,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
@@ -708,7 +713,6 @@
"pA" = (/obj/machinery/light,/turf/unsimulated/floor{icon_state = "floor"},/area/syndicate_mothership)
"pC" = (/obj/machinery/door/poddoor{id_tag = "nukeop_ready"; name = "Shuttle Dock Door"},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
"pF" = (/turf/unsimulated/wall/fakeglass,/area/syndicate_mothership)
-"pH" = (/obj/machinery/door_control{id = "nukeop_ready"; name = "Mission Launch Control"; pixel_x = -26; pixel_y = -2; req_access_txt = "151"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership)
"pR" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/box/drinkingglasses,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership)
"pS" = (/obj/structure/table/woodentable,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership)
"pT" = (/obj/structure/table/woodentable,/obj/item/device/syndicatedetonator,/turf/unsimulated/floor{dir = 2; icon_state = "wood"},/area/syndicate_mothership)
@@ -933,7 +937,6 @@
"vJ" = (/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = -27},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"vL" = (/obj/item/device/radio/intercom/specops{pixel_y = -28},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"vM" = (/obj/structure/table/woodentable{dir = 10},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "SPECOPS"; name = "Ready Room"; pixel_y = 16; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "ASSAULT"; name = "Assault Armor"; pixel_y = -4; req_access_txt = "114"},/obj/machinery/door_control{desc = "A remote control switch to block view of the singularity."; icon_state = "doorctrl0"; id = "specopsoffice"; name = "Privacy Shutters"; pixel_y = 6; req_access_txt = "114"},/turf/unsimulated/floor{dir = 8; icon_state = "carpetside"},/area/centcom/specops)
-"vN" = (/obj/structure/stool/bed/chair/comfy/black{dir = 1},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/specops)
"vO" = (/obj/machinery/computer/artillerycontrol{luminosity = 255},/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/centcom/specops)
"vP" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/specops)
"vQ" = (/obj/machinery/telecomms/processor/preset_cent,/turf/unsimulated/floor{icon_state = "green"; dir = 8},/area/centcom/control)
@@ -1067,8 +1070,6 @@
"zV" = (/obj/structure/grille,/obj/structure/window/full/shuttle,/turf/simulated/floor/plating,/area/centcom/evac)
"zW" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/centcom/evac)
"zX" = (/obj/structure/grille,/obj/structure/window/full/shuttle{icon_state = "15"},/turf/simulated/floor/plating,/area/centcom/evac)
-"Aj" = (/obj/machinery/sleeper/upgraded,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/centcom/evac)
-"Ak" = (/obj/machinery/sleep_console{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/centcom/evac)
"Al" = (/obj/machinery/door/airlock/hatch{name = "Infirmary"; req_access_txt = "0"},/turf/simulated/shuttle/floor{tag = "icon-floor2"; icon_state = "floor2"},/area/centcom/evac)
"Aw" = (/turf/unsimulated/wall,/area/centcom)
"AD" = (/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = -30; pixel_y = 0; req_access_txt = "0"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/centcom/evac)
@@ -1354,7 +1355,6 @@
"IF" = (/obj/structure/table,/obj/item/clothing/gloves/color/yellow,/obj/random/bomb_supply,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"IG" = (/obj/machinery/computer/teleporter,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"IH" = (/obj/machinery/teleport/station,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
-"II" = (/obj/machinery/teleport/hub/upgraded,/turf/unsimulated/floor{tag = "icon-delivery"; icon_state = "delivery"},/area/admin)
"IJ" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/electrical,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"IK" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/shield/energy,/obj/machinery/recharger/wallcharger{pixel_x = 3; pixel_y = -30},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
"IL" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/shield/energy,/obj/machinery/recharger/wallcharger{pixel_x = 3; pixel_y = -30},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
@@ -1426,12 +1426,12 @@ aNckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckck
aNckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaiaNaNaNaNaNaNaNaiacabababababajagagakagakababafabnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNnlnmataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaNaNaNaNaNaNaNaNaNalabababacamnjnjoBoCnjnjanagagagnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaNaNaNaNaNaNaNaNaNalabababaonjnjoHoIoIoJnjnjnjnjnjnjnjnjaNaNaNaNaNaNaNaNaNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaNaNaNaNaNaNaNaNaNalababadaonjaLoOoOoOoOoPoQoRnjfYjMfZnjaNaNaNaNaNaNaNaNaNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaNaNaNaNaNaNaNaNaNalababadaonjaLoOoOoOoOfZoQoRnjfYjMmgnjaNaNaNaNaNaNaNaNaNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaiaNaNaNaNaNaNaNaiababababaSnjpaoOmfmfpcoOpdpepWpXpXganjnjnjnjnjnjnjnjnjnjnjnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababaNaNaNaNaNaTagagababaUamnjplmfpmjNmfoOmkppnjpXggnjnjghgjgigxgxhggxgxhxhGnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababaNaNaNaNaNpupvpvpvpvpvoCnjoOmfpwpxmfoOmkppnjnjnjnjnjgjgiiuiwiviFiviHiGhxnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababaNaNaNaNaNpupvpvpvpvpvoCnjmhmfpwpxmfoOmkppnjnjnjnjnjgjgiiuiwiviFiviHiGhxnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaiaNaNaNaNaNaNaNaNaNpypzpApzpzpzpzpCoOJboOoOoOoOmkppnjnjnjnjnjgjiIiwiviJiSiKiviHiTnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaNaNaNaNaNaNaNaNaNaNpFaVoBpvpvpvoCnjpHmfmfmfoOoOmkppoBpvpvpvpvpvpviviJiSiUiSiKiviTnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaNaNaNaNaNaNaNaNaNaNpFaVoBpvpvpvoCnjmimfmfmfmhoOmkppoBpvpvpvpvpvpviviJiSiUiSiKiviTnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaNaNaNaNaNaNaNaNaNaNaNaWaNaiababaXnjpRpSpTpSjOoOpUpViWiViViXiViViWiFiSiYjjjiiSiFiTnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjaYabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaZabaonjqfqgqhqiqjoOoOoOoBpvpvpvpvpvpviviJiSjkiSiSiviTnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaNaNaNaNaNaNaNaNaNaNaNaNaNaNalabaonjnjppqtqrqunjqwoOnjnjnjnjnjgjiIjsiviJiSiKivjtiTnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
@@ -1514,7 +1514,7 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXuWsXsXujuXuRuYuZvavbujvcvdvdvdvdvesXuosXsXsXsXsqtQtRtZsuvfuuvgvgvgvhvisutQtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvjvkvlsXujujvauRvmuRujujvnvdvovpvqvdsXsXsXvrtTtUsqtQtRtZsqsqvsvtvuvvvwsqsqtQtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkvkvkvxujujujvyvyujujujvzvdvAvBvCbesXvEtTuEtRtRvFtRtRtZsqsqsusususususqsqtQtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXvGvHsXvIvJujujujujvLujsXvdvMvNvOvPsXvQtRtRtRtZsutQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXvGvHsXvIvJujujujujvLujsXvdvMmjvOvPsXvQtRtRtRtZsutQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXbfbfsXsXsXvSvTvUvVvdsXvWtRtRtRvXsutQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwbwcwdwbwesXiDwgwhwiwjsXwkudududwlsuwmudududududuetRucudududududwnsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwrwswtwrwesXsXsXsXsXsXsXsqsqsqsqsqsqsqsqsqsqsqsqsqwusqsqsqsqsqsqsqsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
@@ -1536,9 +1536,9 @@ aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbW
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwKztzezezezezewKwKzBwKwKxLwKwNwNwNyHxzxzxzaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNykylylylyoyNzazbyNzHyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcjcjcjcjcjcjcjcjcjcjcjcjcjcjytytytwKxLwKxZxZxZxZwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyizOzOzPzQyNzazbyNzRyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcpcpcpcpcpcpcpcpcpcpcpcpcpcqytytytwKxLwKxzxzxzxzwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNzVzWzWzWzXyNzazbyNyMyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcpcraNaNaNaNaNaNaNaNaNcrcpcsytytytwKxLxLxLxLxLxLwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiAjAkzWAlyNyNyNyNyNaBaDaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcpcraNaNaNaNaNaNaNaNaNcrcpcsytytytwKxLxLxLxLxLxLwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyinozWzWAlyNyNyNyNyNaBaDaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcraNaNaNaNaNaNaNaNaNaNaNcCcBytytytwKwKwKwKwKwKwKAwaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiADzWzWzQyNyMyMyMyPyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjaNaNaNaNaNaNaNaNaNaNaNcEcGcFytytytcHwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiAjAkzWzXyNAMANAOyyyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjaNaNaNaNaNaNaNaNaNaNaNcEcGcFytytytcHwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyinozWzWzXyNAMANAOyyyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcraNaNaNaNaNaNaNaNaNaNaNcCcIytytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySAXAXylylAYylylAXAXyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcpcraNaNaNaNaNaNaNaNaNcrcpcsytytytytwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNySyoBbzayNzbBcykyUaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNcjcpcpcpcpcpcpcpcpcpcpcpcpcpcJytytytcKwKaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNyiAMyMBeyMBfyiaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
@@ -1617,7 +1617,7 @@ aNaNaNaNHjIiIjIkIrIkIrIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIsIoIsIoIjIpHjaNaNaN
aNaNaNaNHjIiIjIkIkIvIkIkIlImjcjcjcjcjcIwIxIwjcjcjcjcjcInIlIoIoIyIoIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkQkRkxkxkxkAkSaNkQkRkxkxkxkAkSaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDIDKDKDKDKlKDIaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNHjIiIjIkIrIkIrIkIlImjcjcjcjcjcIwIzIwjcjcjcjcjcInIlIoIsIoIsIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNkUlikVlkljlmllaNkUlikVlkljlmllaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNDNIADKDKDKIBDNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNHjIiIjIkIkIkIkIkIlImjcjcjcjcjcjcjcjcjcjcjcjcjcInIlIoIoIoIoIoIjIpHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNlylnlAlzlFaNaNaNlylnlAlzlFaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEfICDKDKDKIDEfaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNHjHjHjIEIEIEIEIEjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaIEIEIEIEIEHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwIFIGIHIIIJDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNHjHjHjIEIEIEIEIEjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaIEIEIEIEIEHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFZFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwIFIGIHmsIJDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNHjIKIKIKIKIKHjIdIeIeIeIeIeIeIeIeIeIeIeIeIeIfHjILILILILILHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLFLaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMDwDxDyDzDwEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNHjHjHjHjHjHjHjIMINININININIOIPIQINININININIMHjHjHjHjHjHjHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNEMaNaNaNEnaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNHjIMIMIMIRIMISISISISISIMIRIMIMIMHjaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
diff --git a/_maps/map_files/cyberiad/z3.dmm b/_maps/map_files/cyberiad/z3.dmm
index 04b1791e6c3..0738ff80065 100644
--- a/_maps/map_files/cyberiad/z3.dmm
+++ b/_maps/map_files/cyberiad/z3.dmm
@@ -2,6 +2,8 @@
"ab" = (/obj/item/trash/cheesie,/turf/space,/area/space)
"ac" = (/obj/docking_port/stationary{dir = 8; dwidth = 10; height = 35; id = "whiteship_away"; name = "Deep Space"; width = 21},/turf/space,/area/space)
"ad" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_z3"; name = "south of telecomms"; width = 18},/turf/space,/area/space)
+"ae" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "61"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
+"af" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "61"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/tcommsat/powercontrol)
"aT" = (/obj/structure/lattice,/turf/space,/area/space)
"ba" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/space)
"bb" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/space)
@@ -289,7 +291,6 @@
"hq" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1381; id_tag = "telecoms_pump"},/obj/machinery/light/small{dir = 8},/obj/structure/sign/vacuum{pixel_x = 0; pixel_y = 32},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
"hr" = (/obj/machinery/camera/xray{c_tag = "Telecomms Airlock"; network = list("Telecomms")},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
"hs" = (/obj/machinery/door/airlock/external{frequency = 1381; icon_state = "door_locked"; id_tag = "telecoms_inner"; locked = 1; name = "External Access"; req_access = null; req_access_txt = "13"},/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
-"ht" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "13"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
"hu" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
"hv" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
"hw" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/camera{c_tag = "Telecomms Foyer"; dir = 2; network = list("Telecomms")},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
@@ -319,7 +320,6 @@
"hU" = (/turf/simulated/floor/plasteel,/area/tcommsat/entrance)
"hV" = (/obj/structure/closet/malf/suits,/turf/simulated/floor/plasteel,/area/tcommsat/entrance)
"hW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/light{dir = 1},/turf/simulated/floor/plating/airless,/area/tcommsat/powercontrol)
-"hX" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "13"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/tcommsat/powercontrol)
"hY" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plating/airless,/area/tcommsat/powercontrol)
"hZ" = (/obj/machinery/light{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
"ia" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
@@ -515,10 +515,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrcncncpcsctctctctctcpgPhchdhehfhghdhhhdhigPcpctctctctctcscpcncncraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacoclcncncpcpcpcpcpcpcpgPgPgPgPhjhkhlgPgPgPgPcpcpcpcpcpcpcpcncncicmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacoclhmhmhmhmhmhmhmhmhmhmgPgPhnhohpgPcncncncncncncncncncncncicmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrhmhqhrhshthuhvhwhxhmgPgPhyhzhAgPgPbWcicjcjcjcjcjcjcjcjcmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrhmhqhrhsaehuhvhwhxhmgPgPhyhzhAgPgPbWcicjcjcjcjcjcjcjcjcmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahBhmhChDhmhEhFhFhFhGhmgPhHhIhJhdhKgPgPcrbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahBhmhLhmhmhMhNhOhNhPhmhQhRhShThUhUhVgPcraTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdhWhXhYhmhZiaiaiaibicidieifighUhUihgPcraTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdhWafhYhmhZiaiaiaibicidieifighUhUihgPcraTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiiiichiihmijikhFiliminioiphUhUhUhUhVgPcrbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiiiichiihmhmhmhmhmhmhmgPiqiriririsgPgPcrbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaitceiuceivcjcjcjcjcjclgPgPiwixiygPgPcicmbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/cyberiad/z4.dmm b/_maps/map_files/cyberiad/z4.dmm
index e0701e70cb1..c8ef280d538 100644
--- a/_maps/map_files/cyberiad/z4.dmm
+++ b/_maps/map_files/cyberiad/z4.dmm
@@ -140,7 +140,7 @@
"cJ" = (/obj/machinery/recharge_station,/turf/simulated/floor/plating/airless,/area/constructionsite/ai)
"cK" = (/obj/structure/table,/obj/item/weapon/lighter/random,/obj/item/weapon/reagent_containers/food/snacks/icecreamsandwich,/obj/item/clothing/head/chefhat,/obj/item/weapon/storage/box/donkpockets,/obj/structure/sign/fire{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 9; icon_state = "blue"},/area/engiestation)
"cL" = (/obj/structure/table,/obj/machinery/kitchen_machine/microwave{pixel_x = -3; pixel_y = 6},/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/engiestation)
-"cM" = (/obj/structure/flora/kirbyplants,/obj/machinery/light{dir = 1},/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/engiestation)
+"cM" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/light{dir = 1},/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/engiestation)
"cN" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/structure/sign/singulo{pixel_y = 32},/turf/simulated/floor/plasteel{dir = 1; icon_state = "blue"},/area/engiestation)
"cO" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/meatballsoup,/turf/simulated/floor/plasteel{dir = 5; icon_state = "blue"},/area/engiestation)
"cP" = (/obj/machinery/pipedispenser/disposal,/turf/simulated/floor/plasteel,/area/engiestation)
@@ -186,7 +186,7 @@
"dD" = (/obj/machinery/vending/cola,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/engiestation)
"dE" = (/obj/machinery/light,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/engiestation)
"dF" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/engiestation)
-"dG" = (/obj/machinery/light_switch{pixel_y = -28},/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/engiestation)
+"dG" = (/obj/machinery/light_switch{pixel_y = -28},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/engiestation)
"dH" = (/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/engiestation)
"dI" = (/obj/machinery/door/airlock/glass{name = "Kitchen"},/turf/simulated/floor/plasteel,/area/engiestation)
"dJ" = (/obj/machinery/door/airlock/glass{name = "Cabin"},/turf/simulated/floor/plasteel{icon_state = "wood"},/area/engiestation)
@@ -196,14 +196,14 @@
"dN" = (/obj/machinery/door/airlock{name = "Restroom"; req_access_txt = "0"},/turf/simulated/floor/plasteel,/area/engiestation)
"dO" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engiestation)
"dP" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel,/area/engiestation)
-"dQ" = (/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/engiestation)
+"dQ" = (/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "wood"},/area/engiestation)
"dR" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/engiestation)
"dS" = (/obj/structure/table,/obj/item/toy/minimeteor,/obj/item/toy/carpplushie,/turf/simulated/floor/plasteel{dir = 2; icon_state = "carpet"},/area/engiestation)
"dT" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/engiestation)
"dU" = (/obj/structure/toilet{dir = 4},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engiestation)
"dV" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engiestation)
"dW" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engiestation)
-"dX" = (/obj/structure/flora/kirbyplants,/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engiestation)
+"dX" = (/obj/item/weapon/twohanded/required/kirbyplants,/obj/machinery/light{dir = 1; in_use = 1},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engiestation)
"dY" = (/obj/structure/closet/firecloset,/obj/machinery/light{dir = 8},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engiestation)
"dZ" = (/obj/machinery/door/airlock/maintenance_hatch,/turf/simulated/wall,/area/constructionsite/hallway/aft)
"ea" = (/obj/machinery/door/airlock/highsecurity{icon_state = "door_closed"; locked = 0; name = "AI Upload Access"; req_access_txt = "16"},/turf/simulated/floor/plating/airless,/area/constructionsite/hallway/aft)
@@ -237,7 +237,7 @@
"eC" = (/obj/machinery/computer/shuttle/engineering,/turf/simulated/floor/plasteel,/area/engiestation)
"eD" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/obj/machinery/light_switch{pixel_y = -28},/turf/simulated/floor/plasteel,/area/engiestation)
"eE" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/cleanable/dirt,/obj/machinery/light,/obj/item/device/radio/intercom{dir = 1; name = "station intercom (General)"; pixel_y = -28},/turf/simulated/floor/plasteel,/area/engiestation)
-"eF" = (/obj/item/weapon/storage/fancy/egg_box,/obj/item/weapon/storage/box/drinkingglasses,/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/milk,/turf/simulated/floor/plasteel,/area/engiestation)
+"eF" = (/obj/item/weapon/storage/fancy/egg_box,/obj/item/weapon/storage/box/drinkingglasses,/obj/structure/table,/obj/item/weapon/reagent_containers/food/condiment/milk,/turf/simulated/floor/plasteel,/area/engiestation)
"eG" = (/obj/machinery/light_switch{pixel_x = -28; pixel_y = 0},/turf/simulated/floor/plasteel,/area/engiestation)
"eH" = (/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/engiestation)
"eI" = (/obj/docking_port/stationary{dir = 8; dwidth = 10; height = 35; id = "whiteship_z4"; name = "east of engistation"; width = 21},/turf/space,/area/space)
@@ -245,6 +245,8 @@
"eK" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/engiestation)
"eL" = (/obj/docking_port/stationary{dir = 2; dwidth = 3; height = 5; id = "engineering_away"; name = "engineering outpost dock"; width = 7},/turf/space,/area/space)
"eM" = (/obj/machinery/field/generator,/turf/simulated/floor/plating/airless,/area/space)
+"eN" = (/obj/item/weapon/grenade/chem_grenade/drugs,/turf/simulated/floor/plating,/area/exploration/methlab)
+"eO" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/beaker/drugs/meth,/obj/item/weapon/reagent_containers/glass/beaker/drugs/meth,/obj/item/weapon/reagent_containers/glass/beaker/drugs/meth,/turf/simulated/floor/plating,/area/exploration/methlab)
"fe" = (/turf/simulated/floor/plasteel/airless{icon_state = "white"},/area/constructionsite/medical)
"ff" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/constructionsite/medical)
"fg" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/plasteel/airless{icon_state = "white"},/area/constructionsite/medical)
@@ -301,13 +303,11 @@
"gk" = (/obj/effect/decal/cleanable/blood/drip,/turf/simulated/floor/plating,/area/exploration/methlab)
"gl" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating,/area/exploration/methlab)
"gm" = (/obj/machinery/door/airlock/external{name = "Crackden Airlock"},/turf/simulated/floor/plating,/area/exploration/methlab)
-"gn" = (/obj/item/weapon/reagent_containers/drugs/baggie,/turf/simulated/floor/plating,/area/exploration/methlab)
"go" = (/turf/simulated/floor/plating,/area/exploration/methlab)
"gp" = (/obj/machinery/door/airlock/external{name = "Plain Airlock"},/turf/simulated/floor/plating,/area/exploration/methlab)
"gq" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/simulated/floor/plating,/area/exploration/methlab)
"gr" = (/obj/item/ammo_casing{pixel_y = 3},/turf/simulated/floor/plating,/area/exploration/methlab)
"gs" = (/obj/effect/decal/cleanable/blood/oil,/obj/item/ammo_casing{pixel_x = -4; pixel_y = -6},/turf/simulated/floor/plating,/area/exploration/methlab)
-"gt" = (/obj/structure/table,/obj/item/weapon/reagent_containers/drugs/baggie/meth,/obj/item/weapon/reagent_containers/drugs/baggie/meth,/obj/item/weapon/reagent_containers/drugs/baggie/meth,/turf/simulated/floor/plating,/area/exploration/methlab)
"gu" = (/obj/machinery/power/apc/noalarm{pixel_x = 26},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/exploration/methlab)
"gv" = (/obj/machinery/floodlight,/turf/simulated/floor/plating,/area/exploration/methlab)
"gw" = (/obj/machinery/chem_master,/turf/simulated/floor/plating,/area/exploration/methlab)
@@ -510,10 +510,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggggggaaaaggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagefZgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbfZgeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggggggggggggggggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafZfZgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbfZfZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggggggggggggggggggggggggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagfgbgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbgbgfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggggggghgigjgkgkglgmgngogpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagfgbgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbgbgfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagggggqgngogogrgsgnggggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagfgbgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbgbgfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagggggggtgogogugggogogvggggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagfgbgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbgbgfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagggggggwgogxgygggngoggggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagfgbgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbgbgfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggggggghgigjgkgkglgmeNgogpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagfgbgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbgbgfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagggggqeNgogogrgseNggggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagfgbgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbgbgfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggggggeOgogogugggogogvggggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagfgbgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbgbgfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagggggggwgogxgyggeNgoggggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagfgbgbgbgbgbgbgfgdfZgbfZgdgfgbgbgbgbgbgbgfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagggggggzgAgogggggogoggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafZfZgbgbgbgbgbfZfZfZgafZfZfZgbgbgbgbgbfZfZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagggggggBgogogggggCgCggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagefZfZfZgDfZfZfZgbgbgbgbgbfZfZfZgafZfZfZgeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagggggggEggggggggggaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagegegfgbgbgbgfgbgbgbgbgbgbgbgfgbgbgbgfgegeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm
index 8d593d21011..ae5425c4ad5 100644
--- a/_maps/map_files/cyberiad/z5.dmm
+++ b/_maps/map_files/cyberiad/z5.dmm
@@ -349,8 +349,8 @@
"gK" = (/obj/machinery/light{dir = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/research_outpost/anomaly)
"gL" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/research_outpost/anomaly)
"gM" = (/obj/structure/rack,/obj/item/clothing/suit/bio_suit/anomaly,/obj/item/clothing/head/bio_hood/anomaly,/obj/item/clothing/mask/breath,/obj/item/clothing/glasses/science,/obj/item/clothing/gloves/color/latex,/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/research_outpost/anomaly)
-"gN" = (/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
-"gO" = (/obj/machinery/door/window/westleft{dir = 4; name = "Monkey Pen"; req_access_txt = "47"},/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
+"gN" = (/obj/machinery/door/window/westleft{dir = 4; name = "Monkey Pen"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
+"gO" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
"gP" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"gQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{level = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/obj/machinery/power/apc{dir = 4; name = "Outpost Hallways APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"gR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/power)
@@ -379,14 +379,15 @@
"ho" = (/obj/machinery/door/window/westleft{dir = 8; name = "Locker room"; opacity = 0; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/anomaly)
"hp" = (/turf/simulated/floor/plasteel,/area/research_outpost/anomaly)
"hq" = (/obj/structure/rack,/obj/item/clothing/suit/bio_suit/anomaly,/obj/item/clothing/head/bio_hood/anomaly,/obj/item/clothing/mask/breath,/obj/item/clothing/glasses/science,/obj/item/clothing/gloves/color/latex,/obj/machinery/camera{c_tag = "Research Outpost Anomaly Lab Storage"; dir = 8; network = list("Research Outpost")},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/research_outpost/anomaly)
-"hr" = (/obj/machinery/alarm{dir = 4; pixel_x = -25; pixel_y = 0},/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
-"hs" = (/obj/structure/window/reinforced{dir = 4},/mob/living/carbon/human/monkey,/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
+"hr" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
+"hs" = (/obj/machinery/alarm{dir = 4; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/anomaly)
"ht" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"hu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/research_outpost/hallway)
"hv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/wall/r_wall,/area/research_outpost/power)
"hw" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/obj/machinery/light/small,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/machinery/firealarm{pixel_y = -24},/turf/simulated/floor/plating,/area/research_outpost/power)
"hx" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/research_outpost/power)
"hy" = (/obj/structure/sign/deathsposal{pixel_x = 32},/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/disposal,/turf/simulated/floor/plating,/area/research_outpost/power)
+"hz" = (/obj/structure/rack,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plating,/area/research_outpost/maintstore2)
"hA" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/wall/r_wall,/area/research_outpost/power)
"hB" = (/obj/effect/spawner/window/reinforced,/obj/structure/transit_tube{icon_state = "N-SE"},/obj/machinery/door/firedoor{dir = 2},/turf/simulated/floor/plating,/area/research_outpost/hallway)
"hC" = (/obj/structure/transit_tube{icon_state = "D-SW"},/turf/simulated/wall/r_wall,/area/research_outpost/hallway)
@@ -543,8 +544,8 @@
"kx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
"ky" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
"kz" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plasteel,/area/research_outpost/med)
-"kA" = (/obj/machinery/sleeper{dir = 8},/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/research_outpost/med)
-"kB" = (/obj/machinery/sleep_console{dir = 8},/obj/machinery/light/small,/obj/machinery/camera{c_tag = "Research Outpost Medbay"; dir = 8; network = list("Research Outpost")},/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/research_outpost/med)
+"kA" = (/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warnwhite"},/area/research_outpost/med)
+"kB" = (/obj/machinery/light/small,/obj/machinery/camera{c_tag = "Research Outpost Medbay"; dir = 8; network = list("Research Outpost")},/obj/machinery/sleeper,/turf/simulated/floor/plasteel{icon_state = "warnwhite"; dir = 5},/area/research_outpost/med)
"kC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/research_outpost/tempstorage)
"kD" = (/turf/simulated/wall/r_wall,/area/research_outpost/entry)
"kE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_research{name = "Expedition Prep"; req_access_txt = "65"},/turf/simulated/floor/plasteel,/area/research_outpost/entry)
@@ -697,7 +698,7 @@
"nv" = (/obj/machinery/mineral/unloading_machine{input_dir = 1; output_dir = 2},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/research_outpost/tempstorage)
"nw" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
"nx" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
-"ny" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
+"ny" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
"nz" = (/obj/machinery/light_switch{pixel_x = 27},/obj/structure/stool/bed/chair/sofa/left{dir = 8},/turf/simulated/floor/plasteel,/area/research_outpost/gearstore)
"nA" = (/obj/machinery/portable_atmospherics/canister/toxins,/turf/simulated/floor/plating,/area/research_outpost/maint)
"nB" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/plating,/area/research_outpost/maint)
@@ -770,7 +771,7 @@
"oQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/research_outpost/iso3)
"oR" = (/obj/machinery/conveyor{dir = 1; id = "iso3"},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/research_outpost/iso3)
"oS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1; pump_direction = 0},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/research_outpost/iso3)
-"oT" = (/obj/structure/rack,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor/plating,/area/research_outpost/maintstore2)
+"oT" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/rack,/obj/item/weapon/pickaxe,/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"oU" = (/obj/structure/rack,/obj/item/weapon/storage/box/lights/bulbs{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/box/lights/tubes{pixel_x = -5; pixel_y = 5},/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/research_outpost/maintstore2)
"oV" = (/turf/simulated/mineral/random/low_chance,/area/mine/explored)
"oW" = (/obj/structure/transit_tube{tag = "icon-D-SE"; icon_state = "D-SE"},/turf/simulated/mineral/random/low_chance,/area/mine/explored)
@@ -1167,7 +1168,7 @@
"wx" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"wy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"wz" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/living_quarters)
-"wA" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor/plasteel,/area/mine/living_quarters)
+"wA" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/mine/living_quarters)
"wB" = (/obj/machinery/camera{c_tag = "Mining Outpost Storage Room"; dir = 1; network = list("Mining Outpost")},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"wC" = (/obj/machinery/light_switch{pixel_y = -25},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"wD" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/living_quarters)
@@ -1308,9 +1309,9 @@
"zi" = (/obj/machinery/computer/mech_bay_power_console,/turf/simulated/floor/plasteel,/area/mine/production{name = "Mining Station Mech Bay"})
"zj" = (/turf/simulated/floor/plasteel/airless{icon_state = "asteroidwarning"; dir = 5},/area/mine/explored)
"zk" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel{icon_state = "white"},/area/mine/living_quarters)
-"zl" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/mine/living_quarters)
+"zl" = (/obj/machinery/light_switch{pixel_x = 23; pixel_y = 0},/obj/structure/table,/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/floor/plasteel{icon_state = "white"},/area/mine/living_quarters)
"zm" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/mine/living_quarters)
-"zn" = (/obj/machinery/light_switch{pixel_x = 23; pixel_y = 0},/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "white"},/area/mine/living_quarters)
+"zn" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "white"},/area/mine/living_quarters)
"zo" = (/obj/machinery/power/smes{charge = 5e+006},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/mine/living_quarters)
"zp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/light/small{dir = 1},/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/mine/living_quarters)
"zq" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating,/area/mine/living_quarters)
@@ -1329,10 +1330,10 @@
"zD" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/mine/production{name = "Mining Station Mech Bay"})
"zE" = (/obj/structure/plasticflaps/mining,/turf/simulated/floor/plasteel{dir = 4; icon_state = "loadingarea"; tag = "loading"},/area/mine/production{name = "Mining Station Mech Bay"})
"zF" = (/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/explored)
-"zG" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/mine/living_quarters)
-"zH" = (/obj/machinery/sleep_console{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/mine/living_quarters)
+"zG" = (/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTHEAST)"; icon_state = "warnwhite"; dir = 5},/area/mine/living_quarters)
+"zH" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-warnwhite (NORTH)"; icon_state = "warnwhite"; dir = 1},/area/mine/living_quarters)
"zI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/camera{c_tag = "Mining Outpost Sleeper Room"; dir = 1; network = list("Mining Outpost")},/turf/simulated/floor/plasteel{icon_state = "white"},/area/mine/living_quarters)
-"zJ" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/o2{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/firstaid/regular,/obj/item/weapon/storage/firstaid/brute,/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/toxin,/turf/simulated/floor/plasteel{icon_state = "white"},/area/mine/living_quarters)
+"zJ" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "Mining Station Port Wing APC"; pixel_x = 1; pixel_y = 25},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"zK" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/mine/living_quarters)
"zL" = (/turf/simulated/floor/plating,/area/mine/living_quarters)
"zM" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating,/area/mine/living_quarters)
@@ -1385,7 +1386,7 @@
"AH" = (/obj/machinery/hologram/holopad,/obj/machinery/firealarm{pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"})
"AI" = (/obj/machinery/power/apc{dir = 1; name = "Mining Station Break Room APC"; pixel_x = 1; pixel_y = 25},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"})
"AJ" = (/obj/machinery/alarm{pixel_y = 25},/obj/structure/closet/crate/bin{name = "Garbage bin"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"})
-"AK" = (/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"})
+"AK" = (/obj/item/weapon/twohanded/required/kirbyplants,/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"})
"AL" = (/obj/machinery/door/firedoor,/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/mine/living_quarters{name = "Mining Station Break Room"})
"AM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel,/area/mine/lobby)
"AN" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel,/area/mine/lobby)
@@ -1397,7 +1398,6 @@
"AT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"})
"AU" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"})
"AV" = (/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"})
-"AW" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"AX" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/mine/lobby)
"AY" = (/obj/machinery/door/firedoor,/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/mine/lobby)
"AZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters{name = "Mining Station Break Room"})
@@ -1505,8 +1505,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagageOePeQekacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjacacacacacacaaaaaQaaaaaaaaaaaaaaaoeReSeSeUeVeWeXeYeZfafbfcfdfefffgfhfhfjfkflfmeHeCfieTfqeHfrafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagfsftfufvekacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacaaaaaaaaaQaaaaaaaaaaaaaaaofwenfxfyfzfAfBfCfDaLfEfFfGfHfIfJfKfLfMcZfNfOfPfQfQfRfSfTfUfVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagfWfXfYekfZgaekekekekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaaaQaaaaaaaaaaaaaaaofwenfxfygbgcfBgdgeaLgfggcZghcZcZcZcZgicZgjgkeHglgmgngogpgqgraeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggsgtgugvgwgxbPdLgyekgzgAekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaaaQaaaaaaelaaaaaaaLfwengBfygCfAfBgEgFaLgGgHgIgJgKgLgMcZgNgOgPgQgRgSgTfQgVgpefafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggWgXgtgYgZhahbhcgyhdgAgAgzekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaahehfhfhfadhfhfhffnhihjbahkhlaLaLaLaLaLhmhnhogJhpgLhqcZhrhshthuhvhwhxgUhyhAhBhCaLhDbzaAaAaAaAaAaAaBhEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggsgtgugvgwgxbPdLgyekgzgAekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaaaQaaaaaaelaaaaaaaLfwengBfygCfAfBgEgFaLgGgHgIgJgKgLgMcZgOgNgPgQgRgSgTfQgVgpefafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggWgXgtgYgZhahbhcgyhdgAgAgzekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaahehfhfhfadhfhfhffnhihjbahkhlaLaLaLaLaLhmhnhogJhpgLhqcZhshrhthuhvhwhxgUhyhAhBhCaLhDbzaAaAaAaAaAaAaBhEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahFgWgXgWgugufZhGgZekfvhHekgAhIekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacaaaaaaaaaaaahJhKhLhNhNhNhOhPhQhRhShThUhVhWhXfohZiaibicidieifigihcZiiijikileHeHimeHeHeHinioipiqirisisitisisisiubhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagiviwguixiygueQizhaiAiBiCekekekekekekbjbjbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacacaaaaaaaaaaiDiEhNhNhNhNiFiGiHiIiJiKiLiMhWfpiOiPiQiRiSiTiUiViWiXiYiZiWjajbjcjdjejfjcjgjciWjhjijjjkjljmjnjojpisbxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagjqjrjsguiygAgYjtgZcrekjujvekjwgyjxjyekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacacacacacacacacacacacaaaaaaaaaajzjAhNhNjBhNjCjDjEjFjGjHjIjJhWjKjLjMjNjOjPjQjRjSjTjUjVjWjXjUjYjVjZjUjVkakbkckdkekfkgkhkikjkkkkklisbxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -1516,7 +1516,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaceklGeQdLgYiAlLkmdLkmfudLdLmzgydLeQeQekcrmAeQdLekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacafafaeaeaeaeaeaeaeaeaeaeafafmBmCmDacaaaaaaaaaaaaagldlXmFmbmHmImJmcljmdmMhWkFkFkFkFkFmgmPkHmQmRmSkKmTmUmVkNmWmXmYkNmZnanbncndndnelCnfaiaAaAngnhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaceklGnieQeQiAeQlafZeQnjfulakpcreQnkfvekkmcrlLdLekbjbjbjbjbjbjbjbjcsbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacafnlaeaeaeaeaeaeaeaeaeaeaenmafnnnoafafaaaaaaaaaaaaagldmenqnrmEnrntmGljljnvhWyuyumKyukFnAnBkHnCnDnEkKnFnGnHkNnInJnKkNnLnMlCnNnOnPnOlCnnnQafagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaceklGnRgYgweknSeknTfYekhaeknTfYekgZlLekmziCcrjuekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacafnUaeaeaeaenVaeaeaeaeaeaenWnlnXnlafaaaaaaaaaaaaaaagldmNmLmOnZnuobnunphWodhWoeoeoeoekFnsmgkHogohoikKojokolkNomonookNopoqorlClClClCosotafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacekekekekekeknSekougyhajufvgZkogZiCgYeknTovowoxekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacafnmaeaeaeaeaeaeaeaeaeaeaeaeoyozoAaaaaaaaaaaaaaaagagldnwnunxnZnynununzhWoHhWaeaeaeaekFoIoJkHoKoLoMkKoNoOoPkNoQoRoSkNoToUorafoVafoWmCoXafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacekekekekekeknSekougyhajufvgZkogZiCgYeknTovowoxekbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacafnmaeaeaeaeaeaeaeaeaeaeaeaeoyozoAaaaaaaaaaaaaaaagagldnwnunxnZnynununzhWoHhWaeaeaeaekFoIoJkHoKoLoMkKoNoOoPkNoQoRoSkNhzoUorafoVafoWmCoXafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacbjbjbjbjbjeknSekgyjuoYizdlgYgyekgZfvekoZpapapbekpcbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacafafaeaeaeaeaeaeaeaeaeaeaeaepdpepfaaaaaaaaaaaaagagagldldpgpgldldnZnZldldnYhWaeaeaeaekFkFkFkHkHkHkHkKkKkKkKkNkNkNkNkNororpjlOakakpknQafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacbjbjbjbjbjbjeknSekjudLiCgygZfviCeknSekekjwcrpaplpmpcpcbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacafafaeaeaeaeaeaeaeaeaeaeaeaepnpoppaaaaaaaaaaagpqprpsptpupvpwpxaeaeaeaeaeqCaeaeaeaeaepBpCpDafafafafafafafafafafafafafafpEpFnQpGafafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacbjbjbjbjbjbjbjbjeknSekekekekekekekekeknSekjwcrjxcrpbpHpcpcbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacafaeaeaeaeaeaeaeaeaeaeaeaeaepIpJpKpLpLpLpLpLpLpMpNpOpPpPpQpRpRaeaeaeaeaeqCaeaeaeaeaepdpopWafafoVoVoVoVoVoVafafafafafpEpFnQpXaepXafafafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -1625,14 +1625,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaccsacacacacaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaaaaaaaaaaaaaaacacacbjbjacaaaaaaaaaeaevkvkvkvkvkvkvlvlvlvkvmvkvkvkaeaeaeafacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacacafafaeaeaeaeaeafafafafafacacacacacacacbjbjbjbjuEuEuEuEvnvovpuEuIvquEvruEuEuEuVuVuVuEaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaafafafafaeaeaeaeoapSpUpTpApVphaeaeaeaeaeaeaeaeafafafafafoVoVoVoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaaaaaaaaaaaaaaacacacacacaaaaafaeaeaevkvvvwvxvyvzvAvBvCvDvEvFvGvyquaeaeafafafafacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjacacacafafaeaeaeaeaeaeaeaeaeaeafafafafafacacacacbjbjbjuEvHvIvJvKvIvIuEuMuNvLuKuEvMvNvOvOvOuVaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaafafafaeaeaeaeqdqcqsqqwXvPvRvRvQvQaeaeaeaeaeaeafafafafoVoVoVoVoVoVoVoVoVoVafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaacacacaaaaacafaeaeaevkvSvTvUvyvTvVvTvTvWvXvYvGvZwaaeaeaeaeaeafafafacacacacacacacbjbjbjbjbjbjbjbjbjbjbjbjacacafafnlaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafacacacacacacuEwbvIwcwdwewfuEuEuEuEuKuEvMwgwgwgwhuVaeaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaeaeaeaeaeaeaeqdxwzgxFwXwiwjwjwkvQaewlaeaeaenWnlafafafoVoVoVoVoVoVoVoVoVoVafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaaaaacafaeaeaevkwmvTvTwnvTvVwovTvTvywpwqvyqraeaeaeaeaeaeaeafafafafacacacacacacbjbjbjbjbjbjbjbjbjacacafafaeuWaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafafafacacacuEwrwswtvIwuwvwwwhwxwywzuEwAwgwBwCwDuVaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaezRzRAAAzwXwGwHwIwJvQvQvQvQaeaeaeaeafafafafoVoVoVoVoVoVoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacaaaaaaaaaaaaaaaaaaaaaaaaaaacafaeaeaevkwmvTvTwnvTvVwovTvTvywpwqvyqraeaeaeaeaeaeaeafafafafacacacacacacbjbjbjbjbjbjbjbjbjacacafafaeuWaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeafafafafacacacuEwrwswtvIwuwvwwwhwxwywzuEoTwgwBwCwDuVaeaeaeaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeaezRzRAAAzwXwGwHwIwJvQvQvQvQaeaeaeaeafafafafoVoVoVoVoVoVoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacafafaeaevkwKvTwLvEwMwNwOvTvkvkvkvkvkvmrTquaeaeaeaeaeaeaeaeafafafacacacacacbjbjbjbjbjbjbjacacacafaeaeaeaeaeaeaeaeaeaeaerTquaeaeaeaeaeaeaeaeaeafafacacwPuEuEuEwQuEuEwRwSwTwRwSuEuEuEuEuEwUuEuEuVuVaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaewFwFwVAMABwYwZxaxaxbxcxdxexcquaeaeaenmafafafoVoVoVoVoVoVoVafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkxfxgxhvyxixjxkxlxmxnxoxpxqxrtTtUrsrsrsrsrsqLaeaeaeaeafafafacacacacacbjbjbjacacacacafafaeaetRrsrsrsrsrsrsrsrstTtUrsrsrsrsqLaeaeaeaeaeafacacacacacwQxsxtxuwgwDxvwhwDwwAWxxxywhwDwgxzxAuVuVuVxBxCxCxCxCxCxCxCxDxDxDxDxDxDxDwFwFwFxEwWBQxGxHxIxaxaxJxKxLxMxNxOaeaeaenmafafafoVoVoVoVoVoVafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkxfxgxhvyxixjxkxlxmxnxoxpxqxrtTtUrsrsrsrsrsqLaeaeaeaeafafafacacacacacbjbjbjacacacacafafaeaetRrsrsrsrsrsrsrsrstTtUrsrsrsrsqLaeaeaeaeaeafacacacacacwQxsxtxuwgwDxvwhwDwwzJxxxywhwDwgxzxAuVuVuVxBxCxCxCxCxCxCxCxDxDxDxDxDxDxDwFwFwFxEwWBQxGxHxIxaxaxJxKxLxMxNxOaeaeaenmafafafoVoVoVoVoVoVafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafaeaevkvkvkvkvkxPxQxRvkvkxSvkvkvkvkqpqraeaeaeaeaeqCaeaeaeaeafaeafafacacacacacacacacacacafafaeaeaeqCaeaeaeaeaeaeaeaeqpqraeaeaeaeqCaeaeaeaeaeafafnlafafacuEuEuEuEwgwDxTxUxVwyxWxXxXxYxYxZxXyaybxXybycycycycycycycycydydydydydydydyeyfyeygyfyhyiyjykylymynxcyoypxcqraeaeaeaeafafafafoVoVoVoVoVafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaeaevkyqyrysytvkyuyvoeaeaeaeaeaeqEaeaeaeqKrsrsqLaeaeaeaeafacacacacacacacacacacafaeaetRrstSaeaeaeaeafaeaeqEaeaeaeaeaeaeqCaeaeaeaeaeaeaeuWaeafafafafafuEwgywyxyyyyyxyzyAyByyyyyCyxyDyEyEyEyFyFyFyFyFyFyFyFyGyGyGyGyGyGyHyIyIyIyJyKyLyMyNyOyPyOyOyOyOyOyOyQaeaeaeaenmafafafoVoVoVoVafafafafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacafafaeaeaeaevkyRySyTyUvkaeaeaeaeaeaeafafnlafaeaeaeaeaeqCaeaeaeaeaeafacacacacacafafafafafaetRtSaeaeaeafafafafafafnlaeaeaeaeaeaeqCaeaeaeaeaeaeaeaeaeaeaeafafuEuEwRyVwRuEuEyWyXyYuEuEuEyZwRuEuVaeaeaeaaaaaaaaagaaaaaaagaaaaaaaaaaagaawFwFwWzazbzczdzezfBRzhziyOvbzjaeaeaeaeaeafafafoVoVoVoVafafafoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafaeaeaevkvkvkvkvkvkaeaeafafafafafacacafafaeaeaeaeqCaeaeaeaeaeaeafafafafafafaeaeaeaeaeqCaeaeafafafacacacacacafaeaeaeaeaeaeqCaeaeaerTquaeaeaeaeaeaeaeafuEzkzlzmznuEzozpzqzrzsuEztzuzvuEaeaeaeaeaeaeaaaaagaaaaaaagagagagagagagagagwEzwzxzyzzzAzAzBzCzCzDzEzFvjaeaeaeaeaeafafafoVoVoVafafoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeaeaeafacacacacacacacafafaeaeaeqKrsrsrsqLaeaeaeaeaeaeaeaeaeaeaeaeaeqCaeafafacacacacacacacafafaeaeaeaeaeqKrsrsrstTtUrsrsrsqLaeaeaeaeuEzGzHzIzJuEzKzLzLzMzNuEzOzPzQuEaeaeaeaeaeaeagagagagagagagaaaaaaaaaaagaaaawEzSzTzUzVzWzXzWzCzCzDzEzFvjaeaeaeaeafafafafoVoVafafafoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafaeaeaevkvkvkvkvkvkaeaeafafafafafacacafafaeaeaeaeqCaeaeaeaeaeaeafafafafafafaeaeaeaeaeqCaeaeafafafacacacacacafaeaeaeaeaeaeqCaeaeaerTquaeaeaeaeaeaeaeafuEzkwAzmzluEzozpzqzrzsuEztzuzvuEaeaeaeaeaeaeaaaaagaaaaaaagagagagagagagagagwEzwzxzyzzzAzAzBzCzCzDzEzFvjaeaeaeaeaeafafafoVoVoVafafoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeaeaeafacacacacacacacafafaeaeaeqKrsrsrsqLaeaeaeaeaeaeaeaeaeaeaeaeaeqCaeafafacacacacacacacafafaeaeaeaeaeqKrsrsrstTtUrsrsrsqLaeaeaeaeuEzHzGzIznuEzKzLzLzMzNuEzOzPzQuEaeaeaeaeaeaeagagagagagagagaaaaaaaaaaagaaaawEzSzTzUzVzWzXzWzCzCzDzEzFvjaeaeaeaeafafafafoVoVafafafoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafaeaeaeaeaeaeaeaeaeafafafacacacacacacacacafafafaeaeaeaeaeqKqLaeaerTquaeaetRrsrsrsrsrstSaeafacacacacbjbjbjacacafafafaeaeaeaeaeaeaeqpqraeaeaeqCaeaeaeaewPuEuEuEuEuEzZAaAbAczNuEuEAdwRwPaeaeaeaeaeaeaaaaagaaaaaaagaaaaaaaaaaagaawFwFAeAfAgyOAhAiAjAkzhziyOvtvuaeaeaeaeafafafoVoVoVafafafafoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacafafafafaeaeaeaeafafafacacacacacacacacacacacacafafafaeqEaeaeqKrsrstTtUrsrstSaeaeaeaeaeaeaeafacacacbjbjbjbjbjacacacafafafafaeaeaeaeaeaeaeaeaeqKrsrsqLaeaeaeaeaeaewPuEuEuEuEuEwPzFAlAmAnaeaeaeaeaeaaaaaaagaaaaaaagaaaaaaaaaaAowFApAqArAsAtwEAuAvAuAuAuAuAuAutNaeaeaeafafafafoVoVafafafafoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacafafafafafafacacacacacacacacacacacacacacacacafafnlafaeaeaeaeqpqraeaeaeaeqEaeafafafafafacacbjbjbjbjbjbjbjacacacacacafafafafafafafafaeaeaeaeaeqCaeaeaeaeaeaeaeaeqpAwAxAxAxAxAyqraeaeaeaeaeaeagagagagagagagagaaaaaaaahMhgwWBSwWwWAsADwEAEAFAGAHAIAJAKALaeaeaeaeafafafafoVoVafafafoVoVoVafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/cyberiad/z6.dmm b/_maps/map_files/cyberiad/z6.dmm
index da5594a4405..e47f28bf95c 100644
--- a/_maps/map_files/cyberiad/z6.dmm
+++ b/_maps/map_files/cyberiad/z6.dmm
@@ -47,8 +47,8 @@
"aU" = (/obj/structure/table,/obj/item/weapon/paper/djstation{info = "Welcome new owner! You have purchased the latest in listening equipment. The telecommunication setup we created is the best in listening to common and private radio fequencies. Here is a step by step guide to start listening in on those saucy radio channels:
Equip yourself with a multi-tool Use the multitool on each machine, that is the broadcaster, receiver and the relay. Turn all the machines on, it has already been configured for you to listen on. Simple as that. Now to listen to the private channels, you'll have to configure the intercoms, located on the front desk. Here is a list of frequencies for you to listen on.145.7 - Common Channel 144.7 - Private AI Channel 135.9 - Security Channel 135.7 - Engineering Channel 135.5 - Medical Channel 135.3 - Command Channel 135.1 - Science Channel 134.7 - Supply Channel "},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/djstation)
"aV" = (/obj/structure/computerframe{anchored = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/djstation)
"aW" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/djstation)
-"aX" = (/obj/machinery/light/small,/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/djstation)
-"aY" = (/obj/machinery/sleep_console{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/djstation)
+"aX" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/djstation)
+"aY" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/djstation)
"aZ" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/djstation)
"ba" = (/obj/machinery/door/airlock{name = "Restroom"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/djstation)
"bb" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/djstation)
@@ -127,7 +127,7 @@
"cw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/wall,/area/derelict/bridge/access)
"cx" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plasteel,/area/derelict/bridge/access)
"cy" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/turf/simulated/floor/plating/airless,/area/solar/derelict_starboard)
-"cz" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/space)
+"cz" = (/turf/space,/turf/simulated/shuttle/wall{dir = 2; icon_state = "swall_f6"; tag = "icon-swall_f6"},/area/space)
"cA" = (/turf/simulated/floor/plating,/area/derelict/bridge/access)
"cB" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel,/area/derelict/bridge/access)
"cC" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/derelict/bridge/access)
@@ -413,7 +413,6 @@
"hW" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel/airless,/area/derelict/medical/chapel)
"hX" = (/obj/structure/cable,/obj/machinery/power/apc/noalarm{dir = 4; name = "Worn-out APC"; pixel_x = 24; pixel_y = 0},/turf/simulated/floor/plasteel/airless,/area/derelict/medical/chapel)
"hY" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/plasteel/airless{icon_state = "white"},/area/derelict/medical)
-"hZ" = (/obj/machinery/sleep_console{dir = 8},/turf/simulated/floor/plasteel/airless{icon_state = "white"},/area/derelict/medical)
"ia" = (/obj/machinery/power/apc/noalarm{dir = 0; name = "Worn-out APC"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/plasteel/airless{icon_state = "white"},/area/derelict/medical)
"ib" = (/obj/item/stack/medical/ointment,/turf/simulated/floor/plasteel/airless{icon_state = "white"},/area/derelict/medical)
"ic" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel/airless{icon_state = "white"},/area/derelict/medical)
@@ -657,10 +656,10 @@
"mG" = (/turf/simulated/mineral,/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/syndicate_depot)
"mH" = (/turf/simulated/mineral,/area/space)
"mI" = (/turf/simulated/floor/plating/airless/asteroid,/area/space)
-"mJ" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/space)
+"mJ" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"; dir = 2},/area/space)
"mK" = (/turf/simulated/shuttle/wall{tag = "icon-swall12"; icon_state = "swall12"; dir = 2},/area/space)
"mL" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/floor/plasteel/airless,/area/space)
-"mM" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s10"; icon_state = "swall_s10"; dir = 2},/area/space)
+"mM" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/space)
"mN" = (/turf/simulated/floor/plating/airless/asteroid,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"; dir = 2},/area/space)
"mO" = (/obj/effect/landmark/corpse/clown,/turf/simulated/floor/plasteel/airless,/area/space)
"mP" = (/obj/structure/closet/crate,/obj/item/weapon/ore/bananium,/obj/item/weapon/ore/bananium,/obj/item/weapon/ore/bananium,/obj/item/weapon/ore/bananium,/obj/item/weapon/ore/bananium,/turf/simulated/floor/plasteel/airless,/area/space)
@@ -682,10 +681,7 @@
"nf" = (/obj/item/weapon/pickaxe,/turf/simulated/floor/plasteel/airless,/area/space)
"ng" = (/obj/structure/closet/crate,/obj/item/weapon/ore/bananium,/obj/item/weapon/ore/bananium,/obj/item/weapon/ore/bananium,/obj/item/weapon/ore/bananium,/turf/simulated/floor/plasteel/airless,/area/space)
"nh" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (WEST)"; icon_state = "propulsion_l"; dir = 8},/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_l (WEST)"; icon_state = "propulsion_l"; dir = 8},/turf/space,/area/space)
-"ni" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s5"; icon_state = "swall_s5"; dir = 2},/area/space)
-"nj" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s9"; icon_state = "swall_s9"; dir = 2},/area/space)
"nk" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (NORTH)"; icon_state = "heater"; dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/space)
-"nl" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/space)
"nm" = (/obj/item/weapon/shard,/turf/simulated/floor/plasteel/airless,/area/space)
"nn" = (/obj/item/weapon/broken_bottle,/turf/simulated/floor/plasteel/airless,/area/space)
"no" = (/turf/simulated/shuttle/wall{tag = "icon-swall11"; icon_state = "swall11"; dir = 2},/area/space)
@@ -751,8 +747,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafauafafafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavavaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafafafafafafawaxaxaxayafafafafafafaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaeaeavazavaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaBaCaDaEagaxaxaxaxaxagaFaGaHaIagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaaaeavavazazaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaJaDaDaDaKaxaLaMaLaxaNaOaOaOaOagaaaaaaaaaaaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaaavavavazazavaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaQaRaSaDagaxaTaLaUaxagaVaWaXaYagaeaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavavavavazazazavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaJaDaDaDaKaxaLaMaLaxaNaOaOaOaXagaaaaaaaaaaaeaeaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaeaaavavavazazavaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaQaRaSaDagaxaTaLaUaxagaVaWaYaOagaeaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavavavavazazazavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaZafafbaafaxaxaxaxbbafafafafafafaeaeaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaAbcbcbdbcbcbcaAaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeaeafbfafafbgaxbhbiafaaaeaeaebjaaaeaeaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkblblbmblbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaebeaeafbnboafbpaxbqbrafaaaaaebsbsaaaaaeaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtblblbublbkbkbkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -801,7 +797,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahfhghhhihhhihhhihhgjgZgrgZgrgZgrgOgDgDgDgDgDhjgDhkgFhlgGgygyhmguguguguhnhnaeaaaeaahoaaaaavfmfmhdfofmfmfPfpfPfEfufHgQaaaaaaaeaaaaaaaaaaaaaaaafSfXfYgfgffYfYfYfYfYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahfhphqhrhqhrhqhrhqgjgrgrgrgrgrgrgjgDgDgDgDgDhsgDhtgDgFgFgGgygyhugyhuavavavavaaaeaeaeaeaaavfmfphvfpfpfmfpfpfpfpfugVfHaaaaaaaeaaaaaaaaaaaaaaaafXfXfXgfgffYhwhwhwfYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahxhyhzhAhBhAhihhhihhgjgjgjgjgjgjhChDhEhEhFhFhGhHhEhEhEhEhIgGgGgGguhJgufSavavavhKhLavavavhMhNfmfphOfpfpfmfpfofphPfufufuavaeaeavaeavaeaeaeavaeaeavavfXgfgfgfgfgfhQfYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRhShShShShThrhqhrhqhUhVhVhVhWhVhXgjhYhZgDgDiahsibgDgDguicgDguguguguguidhNfSfIieavfIavavfShNfmfphOfphPfmfpfpfpfPfpfpfufmififbBigaaaaaaaaaeaaaaaaaefXgfgfgfgfgfihfYiiijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahRhShShShShThrhqhrhqhUhVhVhVhWhVhXgjhYgDgDgDiahsibgDgDguicgDguguguguguidhNfSfIieavfIavavfShNfmfphOfphPfmfpfpfpfPfpfpfufmififbBigaaaaaaaaaeaaaaaaaefXgfgfgfgfgfihfYiiijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaikiliminioinhihhhihhgjgjgjgjgjgjipgjfmfmfmfmfmfmfmfmfmfmiqirfmfmfmfmfmfmfmfmfmfmfIhNhNhNfIavfmfpisitititititiuitititivitiwiwixiyifaabBbBbsbBbBbBgnfXfYgfgfgfgfgfizgNizaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahfhphqhrhqhrhqhrhqgjaaaaaafmfpfpfpfpfpiAfpfpfpfpfmfpfphOfpfpfpfmfpfpfpfpfpfmfmfmfmfmfmfmfmfmfphOfpfpfmfpfofpfpfPfpfufmgLbBiBiwiCiDiEiFiGiCiwiCiCiHiIiJiKgNgfgffYiiijaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahfhghhhiiLhihhhihhgjaaaaaafmfpfpfpfpfpfpfpfpfpfpfmiMfphOfpfphPfmiMfpfpfpfpfmfmfmfmfpfpfpfpfpfpiNitiOfmfpfpfofofpiPfueKaeaaiQiQiQiReKbBaaiSiSiQiTfXfYgfiUgfgfiVfYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -905,20 +901,20 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacvcvcvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacznknknknlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacznknknkmJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamLnnnmncmLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamJnonpaznpnqmMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHaaaaaaaamInrnomTnsnsnqnjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacznonpaznpnqmJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHaaaaaaaamInrnomTnsnsnqmMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHaaaamHmHmHmHmHntnvnumHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmImImHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmImIaaaamJmKmKmLmLmKmKmKmKmMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmImJmKmNmImOazazmPmPmQazmRmSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmImIaaaaczmKmKmLmLmKmKmKmKmJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmIczmKmNmImOazazmPmPmQazmRmSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmTazazazazazmUazmRmVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmWmXmYazmZmUazmUazmUmRmVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHnaaznbazncazmOazazazmUmRmVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHndmKneaznfazazngmPmPazmRnhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmHnimKmKmLmLmKmKmKmKnjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmHndmKmKmLmLmKmKmKmKmMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHaamHmHmHmHmHmImImHmHmHmHmHmHmHmHmHmHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamHmHmHmHmImImImHmHmHmHmHmHmHmHmHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/debug/singletile.dmm b/_maps/map_files/debug/singletile.dmm
new file mode 100644
index 00000000000..517b24b8871
--- /dev/null
+++ b/_maps/map_files/debug/singletile.dmm
@@ -0,0 +1,4 @@
+"a" = (/turf/simulated/floor/plasteel{icon_state = "chapel"},/area/template_noop)
+(1,1,1) = {"
+a
+"}
diff --git a/_maps/map_files/templates/light_floor_1.dmm b/_maps/map_files/templates/light_floor_1.dmm
new file mode 100644
index 00000000000..eedb8420201
--- /dev/null
+++ b/_maps/map_files/templates/light_floor_1.dmm
@@ -0,0 +1,16 @@
+"a" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"b" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-r"},/area/template_noop)
+"c" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-y"},/area/template_noop)
+"d" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-g"},/area/template_noop)
+"e" = (/turf/unsimulated/floor{icon_state = "light_on"; luminosity = 1},/area/template_noop)
+"f" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-b"},/area/template_noop)
+"g" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-p"},/area/template_noop)
+"h" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-w"},/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaa
+abcdefghgfedcbcdefg
+abcdefghgfedcbcdefg
+abcdefghgfedcbcdefg
+aaaaaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/map_files/templates/light_floor_2.dmm b/_maps/map_files/templates/light_floor_2.dmm
new file mode 100644
index 00000000000..03b6c6735b0
--- /dev/null
+++ b/_maps/map_files/templates/light_floor_2.dmm
@@ -0,0 +1,16 @@
+"a" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"b" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-r"},/area/template_noop)
+"c" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-y"},/area/template_noop)
+"d" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-g"},/area/template_noop)
+"e" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on"},/area/template_noop)
+"f" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-b"},/area/template_noop)
+"g" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-p"},/area/template_noop)
+"h" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-w"},/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaa
+aabcdefghgfedcbcdef
+abcdefghgfedcbcdefg
+bcdefghgfedcbcdefga
+aaaaaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/map_files/templates/light_floor_3.dmm b/_maps/map_files/templates/light_floor_3.dmm
new file mode 100644
index 00000000000..940cd14e631
--- /dev/null
+++ b/_maps/map_files/templates/light_floor_3.dmm
@@ -0,0 +1,16 @@
+"a" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"b" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-y"},/area/template_noop)
+"c" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-b"},/area/template_noop)
+"d" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-p"},/area/template_noop)
+"e" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-g"},/area/template_noop)
+"f" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-r"},/area/template_noop)
+"g" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on"},/area/template_noop)
+"h" = (/turf/unsimulated/floor{luminosity = 1; icon_state = "light_on-w"},/area/template_noop)
+
+(1,1,1) = {"
+aabaacaadaaeaabaaca
+afbegcdhdcgebfbegcd
+afbegcdhdcgebfbegcd
+afbegcdhdcgebfbegcd
+affffffhhhhhhgggggg
+"}
diff --git a/_maps/map_files/templates/medium_shuttle1.dmm b/_maps/map_files/templates/medium_shuttle1.dmm
new file mode 100644
index 00000000000..ee0c3ef5876
--- /dev/null
+++ b/_maps/map_files/templates/medium_shuttle1.dmm
@@ -0,0 +1,46 @@
+"a" = (/turf/space,/area/space)
+"b" = (/obj/structure/shuttle/engine/propulsion/burst/left{tag = "icon-burst_l (EAST)"; icon_state = "burst_l"; dir = 4},/turf/space,/area/ruin/powered{name = "Shuttle"})
+"c" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/turf/simulated/floor/plating/airless,/area/ruin/powered{name = "Shuttle"})
+"d" = (/turf/simulated/shuttle/wall{tag = "icon-wall3"; icon_state = "wall3"},/area/ruin/powered{name = "Shuttle"})
+"e" = (/turf/space,/turf/simulated/shuttle{tag = "icon-wall3 (NORTHEAST)"; icon_state = "wall3"; dir = 5},/area/ruin/powered{name = "Shuttle"})
+"f" = (/turf/simulated/shuttle/wall,/turf/simulated/shuttle/wall{tag = "icon-wall3 (SOUTHEAST)"; icon_state = "wall3"; dir = 6},/area/ruin/powered{name = "Shuttle"})
+"g" = (/turf/simulated/shuttle/wall,/area/ruin/powered{name = "Shuttle"})
+"h" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"i" = (/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (SOUTHEAST)"; icon_state = "diagonalWall"; dir = 6},/area/ruin/powered{name = "Shuttle"})
+"j" = (/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"k" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"l" = (/obj/machinery/door/airlock/glass,/turf/space,/area/ruin/powered{name = "Shuttle"})
+"m" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/ruin/powered{name = "Shuttle"})
+"n" = (/obj/machinery/sleeper{tag = "icon-sleeper (NORTH)"; icon_state = "sleeper"; dir = 1},/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/ruin/powered{name = "Shuttle"})
+"o" = (/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
+"p" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
+"q" = (/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/ruin/powered{name = "Shuttle"})
+"r" = (/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
+"s" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
+"t" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"u" = (/obj/machinery/power/smes/magical,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
+"v" = (/turf/simulated/floor/plating,/turf/simulated/shuttle/wall{tag = "icon-window1"; icon_state = "window1"},/area/ruin/powered{name = "Shuttle"})
+"w" = (/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (NORTHWEST)"; icon_state = "diagonalWall"; dir = 9},/area/ruin/powered{name = "Shuttle"})
+"x" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (NORTHWEST)"; icon_state = "diagonalWall"; dir = 9},/area/ruin/powered{name = "Shuttle"})
+"y" = (/turf/simulated/shuttle/wall{tag = "icon-wall"; icon_state = "wall"},/area/ruin/powered{name = "Shuttle"})
+"z" = (/obj/structure/shuttle/engine/propulsion/burst/right{tag = "icon-burst_r (EAST)"; icon_state = "burst_r"; dir = 4},/turf/space,/area/ruin/powered{name = "Shuttle"})
+"A" = (/turf/simulated/shuttle/wall,/turf/simulated/shuttle/wall{tag = "icon-wall3 (NORTHEAST)"; icon_state = "wall3"; dir = 5},/area/ruin/powered{name = "Shuttle"})
+"B" = (/turf/space,/turf/simulated/shuttle{tag = "icon-wall3 (SOUTHEAST)"; icon_state = "wall3"; dir = 6},/area/ruin/powered{name = "Shuttle"})
+
+(1,1,1) = {"
+aaabcdddeaaaaaaaaaaaaaa
+aaabcddddeaaaaaaaaaaaaa
+aaabcfgggghhgiaaaaaaaaa
+aaggggjjjgjjggiaaaaaaaa
+aagjjkjjjglggggggggiaaa
+ggggkggkggjjgmngjjggggi
+hopoogjjjljjlqqljjlrrst
+gogougjjjgvvgvvggggrrst
+hopoogjjjljjljjljjlrrst
+ggggkggkggjjgjjgjjggggw
+aagjjkjjjglggggggggxaaa
+aaygggjjjgjjggwaaaaaaaa
+aaazcAgggghhgwaaaaaaaaa
+aaazcdddBaaaaaaaaaaaaaa
+aaazcddBaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/map_files/templates/medium_shuttle2.dmm b/_maps/map_files/templates/medium_shuttle2.dmm
new file mode 100644
index 00000000000..3aafdccbed8
--- /dev/null
+++ b/_maps/map_files/templates/medium_shuttle2.dmm
@@ -0,0 +1,48 @@
+"a" = (/turf/space,/area/space)
+"b" = (/obj/structure/shuttle/engine/propulsion/burst/left{tag = "icon-burst_l (EAST)"; icon_state = "burst_l"; dir = 4},/turf/space,/area/ruin/powered{name = "Shuttle"})
+"c" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{tag = "icon-rwindow (EAST)"; icon_state = "rwindow"; dir = 4},/turf/simulated/floor/plating/airless,/area/ruin/powered{name = "Shuttle"})
+"d" = (/turf/simulated/shuttle{tag = "icon-wall3 (EAST)"; icon_state = "wall3"; dir = 4},/area/ruin/powered{name = "Shuttle"})
+"e" = (/turf/space,/turf/simulated/shuttle{tag = "icon-wall3 (NORTHEAST)"; icon_state = "wall3"; dir = 5},/area/ruin/powered{name = "Shuttle"})
+"f" = (/obj/structure/shuttle/engine/propulsion/burst/right{tag = "icon-burst_r (EAST)"; icon_state = "burst_r"; dir = 4},/turf/space,/area/ruin/powered{name = "Shuttle"})
+"g" = (/turf/simulated/shuttle/wall,/turf/simulated/shuttle{tag = "icon-wall3 (SOUTHEAST)"; icon_state = "wall3"; dir = 6},/area/ruin/powered{name = "Shuttle"})
+"h" = (/turf/simulated/shuttle/wall,/area/ruin/powered{name = "Shuttle"})
+"i" = (/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (SOUTHEAST)"; icon_state = "diagonalWall"; dir = 6},/area/space)
+"j" = (/turf/space,/turf/simulated/shuttle{tag = "icon-wall3 (NORTHWEST)"; icon_state = "wall3"; dir = 9},/area/ruin/powered{name = "Shuttle"})
+"k" = (/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"l" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"m" = (/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
+"n" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"o" = (/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (SOUTHEAST)"; icon_state = "diagonalWall"; dir = 6},/area/ruin/powered{name = "Shuttle"})
+"p" = (/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/ruin/powered{name = "Shuttle"})
+"q" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
+"r" = (/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
+"s" = (/turf/space,/turf/simulated/shuttle{tag = "icon-wall3 (SOUTHWEST)"; icon_state = "wall3"; dir = 10},/area/ruin/powered{name = "Shuttle"})
+"t" = (/obj/structure/table,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
+"u" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/ruin/powered{name = "Shuttle"})
+"v" = (/obj/machinery/sleeper{tag = "icon-sleeper (NORTH)"; icon_state = "sleeper"; dir = 1},/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/ruin/powered{name = "Shuttle"})
+"w" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
+"x" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"y" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"z" = (/obj/machinery/power/smes/magical,/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"A" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"B" = (/obj/structure/stool/bed/chair/comfy{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
+"C" = (/turf/simulated/shuttle/wall,/turf/simulated/shuttle{tag = "icon-wall3 (NORTHEAST)"; icon_state = "wall3"; dir = 5},/area/ruin/powered{name = "Shuttle"})
+"D" = (/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (NORTHWEST)"; icon_state = "diagonalWall"; dir = 9},/area/ruin/powered{name = "Shuttle"})
+"E" = (/turf/simulated/shuttle/wall{tag = "icon-diagonalWall (NORTHWEST)"; icon_state = "diagonalWall"; dir = 9},/area/space)
+"F" = (/turf/space,/turf/simulated/shuttle{tag = "icon-wall3 (SOUTHEAST)"; icon_state = "wall3"; dir = 6},/area/ruin/powered{name = "Shuttle"})
+
+(1,1,1) = {"
+aaabcddddeaaaaaaaaaaaaaaaaaa
+aaafcddghhhiaaaaaaaaaaaaaaaa
+aaajdghhkkhhhhlhiaaaaaaaaaaa
+bcdddhmnkknkkhkhhhhhhhhhhhoa
+fcddghmhhhhkknknknppnkkqrrhh
+aaashtmhhhhnhhhhkhuvhkkhrwxa
+aaaaymmzhhhkhhhhkhAAhAAhBwxa
+aaajhtmhhhhnhhhhkhkkhkkhrwxa
+bcddChmhhhhkknknknkknkkqrrhh
+fcdddhmnkknkkhkhhhhhhhhhhhDa
+aaasdChhkkhhhhlhEaaaaaaaaaaa
+aaabcddChhhEaaaaaaaaaaaaaaaa
+aaafcddddFaaaaaaaaaaaaaaaaaa
+"}
diff --git a/_maps/map_files/templates/medium_shuttle3.dmm b/_maps/map_files/templates/medium_shuttle3.dmm
new file mode 100644
index 00000000000..8d258c55716
--- /dev/null
+++ b/_maps/map_files/templates/medium_shuttle3.dmm
@@ -0,0 +1,58 @@
+"a" = (/turf/space,/area/space)
+"b" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (NORTH)"; icon_state = "propulsion"; dir = 1},/turf/space,/area/ruin/powered{name = "Shuttle"})
+"c" = (/turf/simulated/shuttle/wall{tag = "icon-wall3"; icon_state = "wall3"},/area/ruin/powered{name = "Shuttle"})
+"d" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (NORTH)"; icon_state = "heater"; dir = 1},/turf/simulated/floor/plating/airless,/area/ruin/powered{name = "Shuttle"})
+"e" = (/turf/space,/turf/simulated/shuttle{tag = "icon-wall3 (NORTHWEST)"; icon_state = "wall3"; dir = 9},/area/ruin/powered{name = "Shuttle"})
+"f" = (/turf/space,/turf/simulated/shuttle{tag = "icon-wall3 (NORTHEAST)"; icon_state = "wall3"; dir = 5},/area/ruin/powered{name = "Shuttle"})
+"g" = (/turf/simulated/shuttle/wall,/turf/simulated/shuttle{tag = "icon-wall3 (SOUTHEAST)"; icon_state = "wall3"; dir = 6},/area/ruin/powered{name = "Shuttle"})
+"h" = (/turf/simulated/shuttle/wall,/area/ruin/powered{name = "Shuttle"})
+"i" = (/turf/simulated/shuttle/wall,/turf/simulated/shuttle{tag = "icon-wall3 (SOUTHWEST)"; icon_state = "wall3"; dir = 10},/area/ruin/powered{name = "Shuttle"})
+"j" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"k" = (/obj/machinery/power/smes/magical,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
+"l" = (/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
+"m" = (/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"n" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (EAST)"; icon_state = "propulsion"; dir = 4},/turf/space,/area/ruin/powered{name = "Shuttle"})
+"o" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (WEST)"; icon_state = "heater"; dir = 8},/turf/simulated/floor/plating/airless,/area/ruin/powered{name = "Shuttle"})
+"p" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/plasteel,/area/ruin/powered{name = "Shuttle"})
+"q" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (EAST)"; icon_state = "heater"; dir = 4},/turf/simulated/floor/plating/airless,/area/ruin/powered{name = "Shuttle"})
+"r" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (WEST)"; icon_state = "propulsion"; dir = 8},/turf/space,/area/ruin/powered{name = "Shuttle"})
+"s" = (/turf/simulated/shuttle/wall,/turf/simulated/shuttle{tag = "icon-wall3 (NORTHEAST)"; icon_state = "wall3"; dir = 5},/area/ruin/powered{name = "Shuttle"})
+"t" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"u" = (/turf/simulated/shuttle/wall,/turf/simulated/shuttle{tag = "icon-wall3 (NORTHWEST)"; icon_state = "wall3"; dir = 9},/area/ruin/powered{name = "Shuttle"})
+"v" = (/obj/structure/table,/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
+"w" = (/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
+"x" = (/obj/structure/stool/bed/chair/comfy{tag = "icon-comfychair (WEST)"; icon_state = "comfychair"; dir = 8},/turf/simulated/floor/plasteel{tag = "icon-whiteyellowfull"; icon_state = "whiteyellowfull"},/area/ruin/powered{name = "Shuttle"})
+"y" = (/turf/space,/turf/simulated/shuttle{tag = "icon-wall3 (SOUTHWEST)"; icon_state = "wall3"; dir = 10},/area/ruin/powered{name = "Shuttle"})
+"z" = (/obj/machinery/sleeper,/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/ruin/powered{name = "Shuttle"})
+"A" = (/turf/simulated/floor/plasteel{tag = "icon-dark"; icon_state = "dark"},/area/ruin/powered{name = "Shuttle"})
+"B" = (/turf/space,/turf/simulated/shuttle{tag = "icon-wall3 (SOUTHEAST)"; icon_state = "wall3"; dir = 6},/area/ruin/powered{name = "Shuttle"})
+"C" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/plating,/area/ruin/powered{name = "Shuttle"})
+"D" = (/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/ruin/powered{name = "Shuttle"})
+"E" = (/obj/structure/table,/obj/item/weapon/storage/firstaid,/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/ruin/powered{name = "Shuttle"})
+"F" = (/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/ruin/powered{name = "Shuttle"})
+"G" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/ruin/powered{name = "Shuttle"})
+
+(1,1,1) = {"
+aaaaaaaabaaaabaaaaaaaa
+aaaaaabcdaaaadcbaaaaaa
+aaaaaedccfaaeccdfaaaaa
+aaaaecccccaacccccfaaaa
+aaaeghhicgjjicghhifaaa
+aaechklhhhmmhhhlkhcfaa
+anochllllpllpllllhcqra
+acccshlllhtthlllhuccca
+noccchllhvwxwhllhcccqr
+aaycghphzhwwhAhphicBaa
+aaaajmlCDDllAAClmjaaaa
+aaaajmlCDDllAAClmjaaaa
+aaecshphEhAAhAhphucfaa
+noccchllhAAAAhllhcccqr
+acccghlllhtthlllhiccca
+anochllllpllpllllhcqra
+aaychklhhhmmhhhlkhcBaa
+aaayshhucsjjucshhuBaaa
+aaaaycccccaacccccBaaaa
+aaaaayFccBaayccFBaaaaa
+aaaaaaGcFaaaaFcGaaaaaa
+aaaaaaaaGaaaaGaaaaaaaa
+"}
diff --git a/_maps/map_files/templates/small_asteroid_1.dmm b/_maps/map_files/templates/small_asteroid_1.dmm
new file mode 100644
index 00000000000..e1ce08e80b4
--- /dev/null
+++ b/_maps/map_files/templates/small_asteroid_1.dmm
@@ -0,0 +1,14 @@
+"a" = (/turf/space,/area/space)
+"b" = (/turf/simulated/mineral,/area/space)
+"c" = (/turf/simulated/mineral/random/low_chance,/area/space)
+
+(1,1,1) = {"
+aabbaaa
+abbbcaa
+bbcccca
+cccccbb
+bcccccb
+bccccbb
+bcbcbba
+aabbaaa
+"}
diff --git a/_maps/map_files/templates/small_shuttle_1.dmm b/_maps/map_files/templates/small_shuttle_1.dmm
new file mode 100644
index 00000000000..ffb52eea1d0
--- /dev/null
+++ b/_maps/map_files/templates/small_shuttle_1.dmm
@@ -0,0 +1,33 @@
+"a" = (/turf/space,/area/space)
+"b" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"},/area/space)
+"c" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/floor/plating/airless,/area/space)
+"d" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f10"; icon_state = "swall_f10"},/area/space)
+"e" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/space)
+"f" = (/turf/simulated/shuttle/floor,/area/space)
+"g" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor,/area/space)
+"h" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"},/area/space)
+"i" = (/turf/simulated/shuttle/wall{tag = "icon-swall8"; icon_state = "swall8"},/area/space)
+"j" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/space)
+"k" = (/turf/simulated/shuttle/wall{tag = "icon-swall4"; icon_state = "swall4"},/area/space)
+"l" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/space)
+"m" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor,/area/space)
+"n" = (/obj/structure/shuttle/engine/heater,/turf/simulated/floor/plating/airless,/area/space)
+"o" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f5"; icon_state = "swall_f5"},/area/space)
+"p" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"},/turf/simulated/floor/plating/airless,/area/space)
+"q" = (/obj/structure/shuttle/engine/propulsion,/turf/simulated/floor/plating/airless,/area/space)
+"r" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_r"},/turf/simulated/floor/plating/airless,/area/space)
+"s" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_f9"; icon_state = "swall_f9"},/area/space)
+
+(1,1,1) = {"
+abcccda
+aefgfea
+aefffea
+bhijkhd
+elfffme
+elfffme
+jfffffj
+jfffffj
+efffffe
+ennnnne
+opqqqrs
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_01.dmm b/_maps/map_files/templates/spacehotel/n_01.dmm
new file mode 100644
index 00000000000..4480512c668
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_01.dmm
@@ -0,0 +1,25 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"c" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"d" = (/obj/structure/dresser,/obj/item/weapon/lipstick/jade,/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/green,/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/green,/obj/item/toy/plushie/octopus,/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop)
+"k" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"l" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"m" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"n" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"o" = (/turf/unsimulated/wall/metal,/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaa
+abcccda
+aecccfa
+accccga
+ahhihja
+aklmnoa
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_02.dmm b/_maps/map_files/templates/spacehotel/n_02.dmm
new file mode 100644
index 00000000000..9555b7a80e5
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_02.dmm
@@ -0,0 +1,30 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/effect/decal/cleanable/flour{desc = "Probably."},/obj/effect/decal/cleanable/pie_smudge,/turf/template_noop,/area/template_noop)
+"c" = (/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/obj/item/weapon/bananapeel{layer = 2.6},/turf/template_noop,/area/template_noop)
+"d" = (/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/obj/item/weapon/bananapeel/clownfish,/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/orange,/obj/effect/decal/cleanable/flour{desc = "Rather caked in there."},/obj/effect/decal/cleanable/pie_smudge,/obj/item/weapon/bananapeel/clownfish,/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"k" = (/obj/machinery/door/window/southright,/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/turf/unsimulated/floor/carpet,/area/template_noop)
+"l" = (/obj/effect/decal/cleanable/pie_smudge,/obj/effect/decal/cleanable/flour,/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"m" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/bananalamp,/turf/unsimulated/floor/carpet,/area/template_noop)
+"n" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"o" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"p" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"q" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"r" = (/turf/unsimulated/wall/metal,/area/template_noop)
+
+(1,1,1) = {"
+aaabbaa
+aaacaaa
+adefega
+affffha
+aefffia
+ajjklma
+anopqra
+aaaaaaa
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_03.dmm b/_maps/map_files/templates/spacehotel/n_03.dmm
new file mode 100644
index 00000000000..e4aa24d6899
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_03.dmm
@@ -0,0 +1,24 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"c" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"d" = (/obj/structure/dresser,/obj/item/weapon/lipstick/purple,/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/purple,/obj/item/toy/random,/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"k" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"l" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"m" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"n" = (/turf/unsimulated/wall/metal,/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaa
+abcccda
+aecccfa
+accccfa
+agghgia
+ajklmna
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_04.dmm b/_maps/map_files/templates/spacehotel/n_04.dmm
new file mode 100644
index 00000000000..74a6e875b4a
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_04.dmm
@@ -0,0 +1,30 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/structure/sign/poster{desc = "You can't make out anything from the poster's original print. It's ruined."; dir = 8; icon_state = "poster_ripped"; name = "ripped poster"; pixel_x = -32; ruined = 1},/turf/unsimulated/floor/carpet,/area/template_noop)
+"c" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"d" = (/obj/structure/dresser,/obj/item/clothing/head/xenos,/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/mob/living/simple_animal/hostile/alien/queen,/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/structure/stool/bed/nest,/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/structure/stool/bed/alien,/obj/item/xenos_claw,/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/effect/gibspawner/xeno,/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/effect/decal/remains/human,/turf/unsimulated/floor/carpet,/area/template_noop)
+"k" = (/obj/structure/stool/bed/alien,/obj/item/clothing/suit/xenos,/turf/unsimulated/floor/carpet,/area/template_noop)
+"l" = (/obj/structure/alien/weeds/node,/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"m" = (/obj/structure/alien/weeds{icon_state = "weeds1"},/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"n" = (/obj/machinery/door/window/southright,/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"o" = (/obj/structure/table/woodentable,/obj/item/weapon/lipstick/black,/turf/unsimulated/floor/carpet,/area/template_noop)
+"p" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/alien/weeds,/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"q" = (/obj/structure/toilet{dir = 1},/obj/structure/alien/weeds{icon_state = "weeds2"},/obj/item/organ/internal/body_egg/alien_embryo,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"r" = (/obj/machinery/door/window/eastleft,/obj/structure/alien/weeds,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"s" = (/obj/machinery/shower{dir = 8},/obj/structure/alien/weeds{icon_state = "weeds1"},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"t" = (/turf/unsimulated/wall/metal,/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaa
+abcccda
+aecfgha
+acijgka
+almnmoa
+apqrsta
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_05.dmm b/_maps/map_files/templates/spacehotel/n_05.dmm
new file mode 100644
index 00000000000..cf60cf65327
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_05.dmm
@@ -0,0 +1,25 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"c" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/yellow,/obj/item/toy/plushie/girly_corgi,/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/yellow,/obj/item/toy/plushie/corgi,/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop)
+"k" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"l" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"m" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"n" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"o" = (/turf/unsimulated/wall/metal,/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaa
+abcccda
+aecccfa
+accccga
+ahhihja
+aklmnoa
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_06.dmm b/_maps/map_files/templates/spacehotel/n_06.dmm
new file mode 100644
index 00000000000..046119cf016
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_06.dmm
@@ -0,0 +1,28 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/effect/decal/cleanable/blood/gibs/old,/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"c" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/machinery/light{dir = 8},/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/red,/obj/item/toy/figure/cmo,/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/machinery/optable,/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/red,/obj/effect/decal/cleanable/blood/gibs/old,/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/cleanable/blood/gibs/old,/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"k" = (/obj/effect/decal/cleanable/blood/old,/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"l" = (/obj/machinery/door/window/southright,/obj/effect/decal/cleanable/blood/old,/turf/unsimulated/floor/carpet,/area/template_noop)
+"m" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop)
+"n" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"o" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"p" = (/obj/machinery/door/window/eastleft,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"q" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"r" = (/turf/unsimulated/wall/metal,/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaa
+abcccda
+aeffcga
+afhfcia
+ajklkma
+anopqra
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_07.dmm b/_maps/map_files/templates/spacehotel/n_07.dmm
new file mode 100644
index 00000000000..fc00baa9a45
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_07.dmm
@@ -0,0 +1,25 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"c" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/effect/decal/cleanable/blood/old,/obj/item/toy/carpplushie/dehy_carp,/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop)
+"k" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"l" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"m" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"n" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"o" = (/turf/unsimulated/wall/metal,/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaa
+abcccda
+aecccfa
+accccga
+ahhihja
+aklmnoa
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_08.dmm b/_maps/map_files/templates/spacehotel/n_08.dmm
new file mode 100644
index 00000000000..81c8881c5e7
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_08.dmm
@@ -0,0 +1,26 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"c" = (/obj/structure/sign/poster{dir = 1; pixel_x = 0; pixel_y = 32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"d" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/structure/dresser,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/obj/item/weapon/contraband/poster,/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop)
+"k" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop)
+"l" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"m" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"n" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"o" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"p" = (/turf/unsimulated/wall/metal,/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaa
+abcdcea
+afdddga
+addddga
+ahijika
+almnopa
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_09.dmm b/_maps/map_files/templates/spacehotel/n_09.dmm
new file mode 100644
index 00000000000..ecf873f1913
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_09.dmm
@@ -0,0 +1,25 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"c" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/obj/item/toy/eight_ball,/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop)
+"k" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/obj/effect/decal/cleanable/vomit,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"l" = (/obj/structure/toilet{dir = 1},/obj/effect/decal/cleanable/vomit,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"m" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"n" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"o" = (/turf/unsimulated/wall/metal,/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaa
+abcccda
+aecccfa
+accccga
+ahhihja
+aklmnoa
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_10.dmm b/_maps/map_files/templates/spacehotel/n_10.dmm
new file mode 100644
index 00000000000..9038bbbce3d
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_10.dmm
@@ -0,0 +1,24 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"c" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/obj/item/toy/plushie/deer,/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/effect/decal/snow/sand/edge,/obj/effect/view_portal{id = "snowland_room"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet,/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows"; opacity = 1},/area/template_noop)
+"j" = (/turf/unsimulated/wall/fakeglass{dir = 4; icon_state = "fakewindows"; opacity = 0},/area/template_noop)
+"k" = (/obj/effect/view_portal/visual{dist = 6; frustrum = 1; id = "snowland"; radius = 2},/turf/unsimulated/floor,/area/template_noop)
+"l" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows"; opacity = 0},/area/template_noop)
+"m" = (/turf/unsimulated/wall/fakeglass{dir = 4; icon_state = "fakewindows"; opacity = 1},/area/template_noop)
+"n" = (/turf/unsimulated/wall{dynamic_lighting = 0; icon = null},/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaa
+abcccda
+aecccfa
+accgcha
+aijklma
+annnnna
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_11.dmm b/_maps/map_files/templates/spacehotel/n_11.dmm
new file mode 100644
index 00000000000..415d3f1f7c5
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_11.dmm
@@ -0,0 +1,26 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"c" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/obj/item/weapon/twohanded/toy/chainsaw,/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/obj/item/toy/figure/syndie{pixel_x = 8},/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/structure/sign/poster{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop)
+"k" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop)
+"l" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"m" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"n" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"o" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"p" = (/turf/unsimulated/wall/metal,/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaa
+abcccda
+aecccfa
+accccga
+ahijika
+almnopa
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_12.dmm b/_maps/map_files/templates/spacehotel/n_12.dmm
new file mode 100644
index 00000000000..24d3321f4f7
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_12.dmm
@@ -0,0 +1,26 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"c" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/item/weapon/bikehorn/rubberducky,/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop)
+"k" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"l" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"m" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"n" = (/obj/machinery/shower{dir = 8},/obj/structure/curtain/open/shower{anchored = 1; opacity = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; opacity = 1},/area/template_noop)
+"o" = (/turf/unsimulated/wall/metal,/area/template_noop)
+"p" = (/obj/effect/view_portal/visual{dist = 0; id = "poolland"; radius = 0},/turf/template_noop,/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaa
+abcccda
+aecccfa
+aghigja
+aklmnoa
+aooopoa
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_13.dmm b/_maps/map_files/templates/spacehotel/n_13.dmm
new file mode 100644
index 00000000000..0d10f62eba5
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_13.dmm
@@ -0,0 +1,29 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/obj/structure/sign/poster/legit{dir = 1; pixel_y = 32},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop)
+"c" = (/obj/structure/sign/poster/legit{dir = 1; pixel_y = 32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"d" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/structure/sign/poster/legit{dir = 1; pixel_y = 32},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/structure/dresser,/obj/structure/sign/poster/legit{dir = 1; pixel_y = 32},/obj/structure/sign/poster/legit{dir = 4; pixel_x = 32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/machinery/light{dir = 8},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/structure/stool/bed,/obj/structure/sign/poster/legit{dir = 4; pixel_x = 32},/obj/item/weapon/bedsheet/rainbow,/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop)
+"k" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"l" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop)
+"m" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/random/plushie,/turf/unsimulated/floor/carpet,/area/template_noop)
+"n" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/obj/structure/sign/poster/legit{dir = 4; pixel_x = 32},/obj/structure/sign/poster/legit{pixel_y = -32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"o" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"p" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"q" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"r" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"s" = (/turf/unsimulated/wall/metal,/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaa
+abcdefa
+agdddha
+aidddha
+ajklmna
+aopqrsa
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_14.dmm b/_maps/map_files/templates/spacehotel/n_14.dmm
new file mode 100644
index 00000000000..7fe5a48cafd
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_14.dmm
@@ -0,0 +1,26 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"c" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/structure/stool/bed,/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/structure/mopbucket,/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/qm,/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop)
+"k" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop)
+"l" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"m" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"n" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"o" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"p" = (/turf/unsimulated/wall/metal,/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaa
+abcccda
+aecccfa
+agcccha
+aiijika
+almnopa
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_15.dmm b/_maps/map_files/templates/spacehotel/n_15.dmm
new file mode 100644
index 00000000000..39ef7bf1334
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_15.dmm
@@ -0,0 +1,23 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/unsimulated/floor{icon_state = "engine"},/area/template_noop)
+"c" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor{icon_state = "engine"},/area/template_noop)
+"d" = (/obj/machinery/power/compressor{dir = 1},/obj/effect/decal/warning_stripes/eastnorthwest,/turf/unsimulated/floor{icon_state = "engine"},/area/template_noop)
+"e" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/unsimulated/floor{icon_state = "engine"},/area/template_noop)
+"f" = (/obj/machinery/power/turbine,/obj/effect/decal/warning_stripes/east,/obj/effect/decal/warning_stripes/west,/turf/unsimulated/floor{icon_state = "engine"},/area/template_noop)
+"g" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows"; opacity = 1},/area/template_noop)
+"h" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 4},/area/template_noop)
+"i" = (/obj/machinery/door/poddoor{opacity = 0},/turf/space,/area/template_noop)
+"j" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows"; dir = 8},/area/template_noop)
+"k" = (/turf/unsimulated/wall/fakeglass{dir = 4; icon_state = "fakewindows"; opacity = 1},/area/template_noop)
+"l" = (/turf/unsimulated/wall{dynamic_lighting = 0; icon = null},/area/template_noop)
+"m" = (/obj/effect/view_portal/visual{dist = 5; frustrum = 1; id = "turbinespace"},/turf/unsimulated/floor,/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaa
+abbbbba
+acbdbea
+abbfbba
+aghijka
+allmlla
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_16.dmm b/_maps/map_files/templates/spacehotel/n_16.dmm
new file mode 100644
index 00000000000..0312f2a7b33
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_16.dmm
@@ -0,0 +1,25 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/unsimulated/wall{icon_state = "sandstone2"},/area/template_noop)
+"c" = (/obj/structure/stool,/obj/structure/mirror{dir = 8; pixel_x = -28},/obj/machinery/light/small{dir = 1},/turf/unsimulated/floor{icon_state = "wood"},/area/template_noop)
+"d" = (/turf/unsimulated/floor{icon_state = "wood"},/area/template_noop)
+"e" = (/obj/structure/stool,/obj/structure/mirror{dir = 4; pixel_x = 28},/obj/machinery/light/small{dir = 1},/turf/unsimulated/floor{icon_state = "wood"},/area/template_noop)
+"f" = (/turf/unsimulated/wall{icon_state = "sandstone3"},/area/template_noop)
+"g" = (/obj/structure/stool,/obj/structure/mirror{dir = 8; pixel_x = -28},/obj/machinery/light/small,/turf/unsimulated/floor{icon_state = "wood"},/area/template_noop)
+"h" = (/obj/structure/stool,/obj/structure/mirror{dir = 4; pixel_x = 28},/obj/machinery/light/small,/turf/unsimulated/floor{icon_state = "wood"},/area/template_noop)
+"i" = (/turf/unsimulated/wall{icon_state = "sandstone5"},/area/template_noop)
+"j" = (/turf/unsimulated/wall{icon_state = "sandstone8"},/area/template_noop)
+"k" = (/obj/effect/view_portal{id = "beach_room"},/obj/structure/curtain/open,/turf/unsimulated/floor{icon_state = "wood"},/area/template_noop)
+"l" = (/turf/unsimulated/wall{icon_state = "sandstone4"},/area/template_noop)
+"m" = (/turf/unsimulated/wall{icon_state = "sandstone9"},/area/template_noop)
+"n" = (/turf/unsimulated/wall{dynamic_lighting = 0; icon = null},/area/template_noop)
+"o" = (/obj/effect/view_portal/visual{dist = 6; frustrum = 1; id = "beach"; radius = 1},/turf/unsimulated/floor{icon_state = "wood"},/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaa
+abcdeba
+afgdhfa
+aijklma
+annonna
+annnnna
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_17.dmm b/_maps/map_files/templates/spacehotel/n_17.dmm
new file mode 100644
index 00000000000..964a75ba8ba
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_17.dmm
@@ -0,0 +1,27 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/obj/item/pizzabox/margherita,/obj/item/pizzabox/margherita{pixel_y = 4},/turf/unsimulated/floor/carpet,/area/template_noop)
+"c" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"d" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/machinery/light{dir = 8},/obj/item/pizzabox/vegetable,/obj/item/pizzabox/vegetable{pixel_y = 4},/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/obj/item/toy/prize/ripley{pixel_x = 4},/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/item/pizzabox/mushroom,/obj/item/pizzabox/mushroom{pixel_y = 4},/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/brown,/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/obj/item/pizzabox/meat,/obj/item/pizzabox/meat{pixel_y = 4},/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"k" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop)
+"l" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/obj/item/toy/katana,/turf/unsimulated/floor/carpet,/area/template_noop)
+"m" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"n" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"o" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"p" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"q" = (/turf/unsimulated/wall/metal,/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaa
+abcccda
+aecccfa
+agcccha
+aijkjla
+amnopqa
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_18.dmm b/_maps/map_files/templates/spacehotel/n_18.dmm
new file mode 100644
index 00000000000..28145e1b4fb
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_18.dmm
@@ -0,0 +1,24 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/obj/structure/sign/poster/legit{dir = 8; pixel_x = -32},/turf/unsimulated/floor/carpet,/area/template_noop)
+"c" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"d" = (/obj/structure/dresser,/obj/item/weapon/lipstick/purple,/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/machinery/light{dir = 8},/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/purple,/obj/item/toy/plushie/purple_fox,/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/structure/window/reinforced/polarized{id = "room_n"},/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/machinery/door/window/southright,/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table/woodentable,/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 8; pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"k" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"l" = (/obj/machinery/door/window/eastleft,/obj/machinery/button/windowtint{id = "room_n"; pixel_y = -24; range = 2},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"m" = (/obj/machinery/shower{dir = 8},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"n" = (/turf/unsimulated/wall/metal,/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaa
+abcccda
+aecccfa
+accccfa
+agghgia
+ajklmna
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/n_19.dmm b/_maps/map_files/templates/spacehotel/n_19.dmm
new file mode 100644
index 00000000000..114dabbf44b
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/n_19.dmm
@@ -0,0 +1,15 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/unsimulated/wall/metal,/area/template_noop)
+"c" = (/obj/effect/view_portal{id = "mazeland_room"},/obj/machinery/light{dir = 8},/turf/unsimulated/floor{icon_state = "floor"},/area/template_noop)
+"d" = (/obj/effect/view_portal/visual{dist = 2; frustrum = 0; id = "mazeland"; radius = 1},/turf/unsimulated/floor{icon_state = "floor"},/area/template_noop)
+"e" = (/turf/unsimulated/wall{dynamic_lighting = 0; icon = null},/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaa
+abbcbba
+abbdbba
+abeeeba
+abeeeba
+abbbbba
+aaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/s_01.dmm b/_maps/map_files/templates/spacehotel/s_01.dmm
new file mode 100644
index 00000000000..11ec761615a
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/s_01.dmm
@@ -0,0 +1,27 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/unsimulated/beach/water,/area/template_noop)
+"c" = (/obj/machinery/shower{pixel_y = 24},/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop)
+"d" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/structure/rack,/obj/item/clothing/suit/apron,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/holidaypriest,/obj/item/clothing/suit/judgerobe,/obj/item/clothing/suit/storage/labcoat,/obj/item/clothing/suit/nun,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/suit/wizrobe/fake,/obj/item/clothing/suit/wizrobe/marisa/fake,/obj/effect/decal/cleanable/greenglow,/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/structure/rack,/obj/item/clothing/head/collectable/police,/obj/item/clothing/head/nun_hood,/obj/item/clothing/head/mailman,/obj/item/clothing/head/nursehat,/obj/item/clothing/head/wizard/fake,/obj/item/clothing/head/powdered_wig,/obj/item/clothing/head/wizard/marisa/fake,/obj/item/clothing/mask/gas/sexyclown,/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/structure/rack,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/head/kitty,/obj/item/clothing/head/rabbitears,/obj/item/clothing/mask/muzzle,/obj/item/clothing/accessory/stethoscope,/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop)
+"k" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/captain,/turf/unsimulated/floor/carpet,/area/template_noop)
+"l" = (/obj/machinery/light{dir = 8},/obj/item/weapon/soap/deluxe,/obj/machinery/button/windowtint{id = "room_s"; pixel_x = -24; pixel_y = 0; range = 5},/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop)
+"m" = (/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop)
+"n" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/template_noop)
+"o" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"p" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"q" = (/obj/machinery/door/window/eastleft,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaaaaaa
+abbcdefghia
+abbjdddddka
+almndddddka
+aopqdddddda
+aaaaaaaaaaa
+aaaaaaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/s_02.dmm b/_maps/map_files/templates/spacehotel/s_02.dmm
new file mode 100644
index 00000000000..98eaa3b377b
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/s_02.dmm
@@ -0,0 +1,27 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/unsimulated/beach/water,/area/template_noop)
+"c" = (/obj/machinery/shower{pixel_y = 24},/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop)
+"d" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/structure/rack,/obj/item/clothing/suit/apron,/obj/item/clothing/suit/storage/hazardvest,/obj/item/clothing/suit/holidaypriest,/obj/item/clothing/suit/judgerobe,/obj/item/clothing/suit/storage/labcoat,/obj/item/clothing/suit/nun,/obj/item/clothing/suit/straight_jacket,/obj/item/clothing/suit/wizrobe/fake,/obj/item/clothing/suit/xenos,/obj/item/clothing/suit/wizrobe/marisa/fake,/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/structure/rack,/obj/item/clothing/head/collectable/police,/obj/item/clothing/head/nun_hood,/obj/item/clothing/head/mailman,/obj/item/clothing/head/nursehat,/obj/item/clothing/head/wizard/fake,/obj/item/clothing/head/powdered_wig,/obj/item/clothing/head/xenos,/obj/item/clothing/head/wizard/marisa/fake,/obj/item/clothing/mask/gas/sexyclown,/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/structure/rack,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/head/kitty,/obj/item/clothing/head/rabbitears,/obj/item/clothing/mask/muzzle,/obj/item/clothing/accessory/stethoscope,/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop)
+"k" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/hop,/turf/unsimulated/floor/carpet,/area/template_noop)
+"l" = (/obj/machinery/light{dir = 8},/obj/item/weapon/soap/deluxe,/obj/machinery/button/windowtint{id = "room_s"; pixel_x = -24; pixel_y = 0; range = 5},/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop)
+"m" = (/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop)
+"n" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/template_noop)
+"o" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"p" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"q" = (/obj/machinery/door/window/eastleft,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaaaaaa
+abbcdefghia
+abbjdddddka
+almndddddka
+aopqdddddda
+aaaaaaaaaaa
+aaaaaaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/s_03.dmm b/_maps/map_files/templates/spacehotel/s_03.dmm
new file mode 100644
index 00000000000..c82b1f84d11
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/s_03.dmm
@@ -0,0 +1,28 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/unsimulated/floor/upperlevel,/area/awaymission/desert{name = "Sudden Drop"})
+"c" = (/obj/machinery/shower{pixel_y = 24},/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop)
+"d" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/structure/rack,/obj/item/weapon/gun/magic/wand,/obj/item/weapon/gun/magic/staff{pixel_y = -4},/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe{pixel_x = -8; pixel_y = -8},/obj/item/clothing/suit/wizrobe/black{pixel_x = -4; pixel_y = -4},/obj/item/clothing/suit/wizrobe/clown,/obj/item/clothing/suit/wizrobe/marisa{pixel_x = 4; pixel_y = 4},/obj/item/clothing/suit/wizrobe/red{pixel_x = 8; pixel_y = 8},/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/structure/rack,/obj/item/clothing/head/wizard{pixel_x = 8; pixel_y = -8},/obj/item/clothing/head/wizard/black{pixel_x = 4; pixel_y = -4},/obj/item/clothing/head/wizard/clown,/obj/item/clothing/head/wizard/marisa{pixel_x = -4; pixel_y = 4},/obj/item/clothing/head/wizard/red{pixel_x = -8; pixel_y = 8},/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/effect/levelref{id = "lavaland"; name = "lavaland"},/turf/unsimulated/floor/upperlevel,/area/awaymission/desert{name = "Sudden Drop"})
+"k" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop)
+"l" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/wiz,/turf/unsimulated/floor/carpet,/area/template_noop)
+"m" = (/obj/machinery/light{dir = 8},/obj/item/weapon/soap/deluxe,/obj/machinery/button/windowtint{id = "room_s"; pixel_x = -24; pixel_y = 0; range = 5},/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop)
+"n" = (/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop)
+"o" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/template_noop)
+"p" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"q" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"r" = (/obj/machinery/door/window/eastleft,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaaaaaa
+abbcdefghia
+abjkdddddla
+amnodddddla
+apqrdddddda
+aaaaaaaaaaa
+aaaaaaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/s_04.dmm b/_maps/map_files/templates/spacehotel/s_04.dmm
new file mode 100644
index 00000000000..9648a7c707c
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/s_04.dmm
@@ -0,0 +1,29 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/unsimulated/beach/water,/area/template_noop)
+"c" = (/obj/machinery/shower{pixel_y = 24},/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop)
+"d" = (/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
+"e" = (/obj/structure/rack,/obj/item/clothing/suit/syndicatefake,/obj/item/clothing/under/syndicate,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
+"f" = (/obj/structure/rack,/obj/item/clothing/mask/gas/syndicate,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
+"g" = (/obj/structure/rack,/obj/structure/sign/poster{dir = 1; pixel_y = 32},/obj/item/clothing/suit/space/rig/syndi,/obj/item/clothing/head/helmet/space/syndicate{pixel_x = -4},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
+"h" = (/obj/structure/dresser,/obj/structure/sign/poster{dir = 1; pixel_y = 32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
+"i" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/obj/item/weapon/storage/fancy/cigarettes/syndicate{pixel_x = 8},/obj/structure/sign/poster{dir = 1; pixel_y = 32},/obj/structure/sign/poster{dir = 4; pixel_x = 32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
+"j" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop)
+"k" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/obj/structure/sign/poster{dir = 4; pixel_x = 32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
+"l" = (/obj/machinery/light{dir = 8},/obj/machinery/button/windowtint{id = "room_s"; pixel_x = -24; pixel_y = 0; range = 5},/obj/item/weapon/soap/syndie,/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop)
+"m" = (/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop)
+"n" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/template_noop)
+"o" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"p" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"q" = (/obj/machinery/door/window/eastleft,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"r" = (/obj/structure/sign/poster{pixel_y = -32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
+"s" = (/obj/structure/sign/poster{dir = 4; pixel_x = 32},/obj/structure/sign/poster{pixel_y = -32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaaaaaa
+abbcdefghia
+abbjdddddka
+almndddddka
+aopqrdrrrsa
+aaaaaaaaaaa
+aaaaaaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/s_05.dmm b/_maps/map_files/templates/spacehotel/s_05.dmm
new file mode 100644
index 00000000000..1de8b749e58
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/s_05.dmm
@@ -0,0 +1,26 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/unsimulated/beach/water,/area/template_noop)
+"c" = (/obj/machinery/shower{pixel_y = 24},/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whitehall"},/area/template_noop)
+"d" = (/turf/unsimulated/floor{icon_state = "white"},/area/template_noop)
+"e" = (/obj/structure/rack,/obj/item/device/guitar,/obj/item/device/violin{pixel_x = 8},/turf/unsimulated/floor{icon_state = "white"},/area/template_noop)
+"f" = (/obj/structure/dresser,/turf/unsimulated/floor{icon_state = "white"},/area/template_noop)
+"g" = (/obj/item/device/flashlight/lamp/green,/obj/structure/table,/turf/unsimulated/floor{icon_state = "white"},/area/template_noop)
+"h" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whitehall"},/area/template_noop)
+"i" = (/obj/structure/piano,/turf/unsimulated/floor{icon_state = "white"},/area/template_noop)
+"j" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/mime,/turf/unsimulated/floor{icon_state = "white"},/area/template_noop)
+"k" = (/obj/machinery/light{dir = 8},/obj/machinery/button/windowtint{id = "room_s"; pixel_x = -24; pixel_y = 0; range = 5},/obj/item/weapon/soap,/turf/unsimulated/floor{dir = 1; icon_state = "whitehall"},/area/template_noop)
+"l" = (/turf/unsimulated/floor{dir = 1; icon_state = "whitehall"},/area/template_noop)
+"m" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 1; icon_state = "whitecorner"},/area/template_noop)
+"n" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"o" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"p" = (/obj/machinery/door/window/eastleft,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaaaaaa
+abbcdddefga
+abbhiddddja
+aklmdddddja
+anopdddddda
+aaaaaaaaaaa
+aaaaaaaaaaa
+"}
diff --git a/_maps/map_files/templates/spacehotel/s_06.dmm b/_maps/map_files/templates/spacehotel/s_06.dmm
new file mode 100644
index 00000000000..e733f819c36
--- /dev/null
+++ b/_maps/map_files/templates/spacehotel/s_06.dmm
@@ -0,0 +1,28 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/unsimulated/beach/water,/area/template_noop)
+"c" = (/obj/machinery/shower{pixel_y = 24},/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop)
+"d" = (/turf/unsimulated/floor/carpet,/area/template_noop)
+"e" = (/obj/structure/rack,/obj/item/weapon/twohanded/dualsaber/toy,/obj/item/weapon/twohanded/toy/chainsaw,/obj/item/toy/foamblade,/turf/unsimulated/floor/carpet,/area/template_noop)
+"f" = (/obj/structure/rack,/obj/item/toy/griffin{pixel_y = 8},/obj/item/toy/snappop,/obj/item/toy/redbutton,/turf/unsimulated/floor/carpet,/area/template_noop)
+"g" = (/obj/structure/rack,/obj/item/toy/cards/deck,/obj/item/toy/figure/secofficer,/turf/unsimulated/floor/carpet,/area/template_noop)
+"h" = (/obj/structure/dresser,/turf/unsimulated/floor/carpet,/area/template_noop)
+"i" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/turf/unsimulated/floor/carpet,/area/template_noop)
+"j" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop)
+"k" = (/obj/item/toy/snappop,/turf/unsimulated/floor/carpet,/area/template_noop)
+"l" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/patriot,/turf/unsimulated/floor/carpet,/area/template_noop)
+"m" = (/obj/machinery/light{dir = 8},/obj/machinery/button/windowtint{id = "room_s"; pixel_x = -24; pixel_y = 0; range = 5},/obj/item/weapon/soap/nanotrasen,/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop)
+"n" = (/turf/unsimulated/floor{dir = 1; icon_state = "whiteblue"},/area/template_noop)
+"o" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 1; icon_state = "whitebluecorner"},/area/template_noop)
+"p" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"q" = (/obj/structure/toilet{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+"r" = (/obj/machinery/door/window/eastleft,/turf/unsimulated/floor{icon_state = "freezerfloor"},/area/template_noop)
+
+(1,1,1) = {"
+aaaaaaaaaaa
+abbcdefghia
+abbjdddkdla
+amnokddddla
+apqrdddddda
+aaaaaaaaaaa
+aaaaaaaaaaa
+"}
diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index adb9d60ab1f..aeadda0a7b4 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -32,6 +32,8 @@ Pipelines + Other Objects -> Pipe network
var/global/datum/pipe_icon_manager/icon_manager
/obj/machinery/atmospherics/New()
+ ..()
+
if(!icon_manager)
icon_manager = new()
@@ -42,8 +44,6 @@ Pipelines + Other Objects -> Pipe network
if(!pipe_color_check(pipe_color))
pipe_color = null
- ..()
-
/obj/machinery/atmospherics/initialize()
..()
@@ -156,7 +156,7 @@ Pipelines + Other Objects -> Pipe network
/obj/machinery/atmospherics/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if(can_unwrench && istype(W, /obj/item/weapon/wrench))
var/turf/T = get_turf(src)
- if (level == 1 && isturf(T) && T.intact)
+ if(level == 1 && isturf(T) && T.intact)
to_chat(user, "You must remove the plating first. ")
return 1
var/datum/gas_mixture/int_air = return_air()
@@ -168,11 +168,11 @@ Pipelines + Other Objects -> Pipe network
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
to_chat(user, "You begin to unfasten \the [src]... ")
- if (internal_pressure > 2*ONE_ATMOSPHERE)
+ if(internal_pressure > 2*ONE_ATMOSPHERE)
to_chat(user, "As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider? ")
unsafe_wrenching = TRUE //Oh dear oh dear
- if (do_after(user, 40, target = src) && isnull(gcDestroyed))
+ if(do_after(user, 40, target = src) && isnull(gcDestroyed))
user.visible_message( \
"[user] unfastens \the [src].", \
"You have unfastened \the [src]. ", \
@@ -293,7 +293,7 @@ Pipelines + Other Objects -> Pipe network
add_underlay_adapter(T, , node_dir, "")
add_underlay_adapter(T, node, node_dir, "-supply")
add_underlay_adapter(T, , node_dir, "-scrubbers")
- else if (node.icon_connect_type == "-scrubbers")
+ else if(node.icon_connect_type == "-scrubbers")
add_underlay_adapter(T, , node_dir, "")
add_underlay_adapter(T, , node_dir, "-supply")
add_underlay_adapter(T, node, node_dir, "-scrubbers")
diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
index f24623f9422..8951977d4db 100644
--- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm
@@ -49,7 +49,7 @@
for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect))
if(target.initialize_directions & get_dir(target,src))
var/c = check_connect_types(target,src)
- if (c)
+ if(c)
target.connected_to = c
connected_to = c
node1 = target
@@ -58,7 +58,7 @@
for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect))
if(target.initialize_directions & get_dir(target,src))
var/c = check_connect_types(target,src)
- if (c)
+ if(c)
target.connected_to = c
connected_to = c
node2 = target
diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
index aff64bd8a10..06fe22de2ce 100644
--- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
@@ -35,7 +35,7 @@
/obj/machinery/atmospherics/binary/dp_vent_pump/New()
..()
- if (!id_tag)
+ if(!id_tag)
assign_uid()
id_tag = num2text(uid)
icon = null
@@ -93,11 +93,11 @@
if(T.intact && node1 && node2 && node1.level == 1 && node2.level == 1 && istype(node1, /obj/machinery/atmospherics/pipe) && istype(node2, /obj/machinery/atmospherics/pipe))
return
else
- if (node1)
+ if(node1)
add_underlay(T, node1, turn(dir, -180), node1.icon_connect_type)
else
add_underlay(T, node1, turn(dir, -180))
- if (node2)
+ if(node2)
add_underlay(T, node2, dir, node2.icon_connect_type)
else
add_underlay(T, node2, dir)
diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
index 3e643565ac6..e53c89f787d 100644
--- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
@@ -94,7 +94,9 @@
[round(target_pressure,0.1)]kPa | Change
"}
- user << browse("[src.name] control [dat] ", "window=atmo_pump")
+ var/datum/browser/popup = new(user, "atmo_pump", name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "atmo_pump")
/obj/machinery/atmospherics/binary/passive_gate/receive_signal(datum/signal/signal)
@@ -155,9 +157,9 @@
return
/obj/machinery/atmospherics/binary/passive_gate/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params)
- if (!istype(W, /obj/item/weapon/wrench))
+ if(!istype(W, /obj/item/weapon/wrench))
return ..()
- if (on)
+ if(on)
to_chat(user, "You cannot unwrench this [src], turn it off first. ")
return 1
return ..()
diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm
index a8d8c453706..e6b66d873b0 100644
--- a/code/ATMOSPHERICS/components/binary_devices/pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm
@@ -109,7 +109,9 @@ Thus, the two variables affect pump operation are set in New():
[round(target_pressure,0.1)]kPa | Change
"}
- user << browse("[src.name] control [dat] ", "window=atmo_pump")
+ var/datum/browser/popup = new(user, "atmo_pump", name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "atmo_pump")
/obj/machinery/atmospherics/binary/pump/initialize()
@@ -182,9 +184,9 @@ Thus, the two variables affect pump operation are set in New():
update_icon()
/obj/machinery/atmospherics/binary/pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params)
- if (!istype(W, /obj/item/weapon/wrench))
+ if(!istype(W, /obj/item/weapon/wrench))
return ..()
- if (!(stat & NOPOWER) && on)
+ if(!(stat & NOPOWER) && on)
to_chat(user, "You cannot unwrench this [src], turn it off first. ")
return 1
return ..()
\ No newline at end of file
diff --git a/code/ATMOSPHERICS/components/binary_devices/valve.dm b/code/ATMOSPHERICS/components/binary_devices/valve.dm
index 1c0f625e036..b9ab8a4272d 100644
--- a/code/ATMOSPHERICS/components/binary_devices/valve.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/valve.dm
@@ -52,7 +52,7 @@
add_fingerprint(usr)
update_icon(1)
sleep(10)
- if (open)
+ if(open)
close()
return
open()
diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
index 059cb25f080..8ae59b54358 100644
--- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
@@ -105,7 +105,9 @@ Thus, the two variables affect pump operation are set in New():
[round(transfer_rate,1)]l/s | Change
"}
- user << browse("[src.name] control [dat] ", "window=atmo_pump")
+ var/datum/browser/popup = new(user, "atmo_pump", name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "atmo_pump")
@@ -173,9 +175,9 @@ Thus, the two variables affect pump operation are set in New():
update_icon()
/obj/machinery/atmospherics/binary/volume_pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params)
- if (!istype(W, /obj/item/weapon/wrench))
+ if(!istype(W, /obj/item/weapon/wrench))
return ..()
- if (!(stat & NOPOWER) && on)
+ if(!(stat & NOPOWER) && on)
to_chat(user, "You cannot unwrench this [src], turn it off first. ")
return 1
return ..()
\ No newline at end of file
diff --git a/code/ATMOSPHERICS/components/omni_devices/filter.dm b/code/ATMOSPHERICS/components/omni_devices/filter.dm
index 8570f92462a..94efade9b1a 100644
--- a/code/ATMOSPHERICS/components/omni_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/omni_devices/filter.dm
@@ -117,7 +117,7 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "omni_filter.tmpl", "Omni Filter Control", 330, 330)
ui.set_initial_data(data)
ui.open()
diff --git a/code/ATMOSPHERICS/components/omni_devices/mixer.dm b/code/ATMOSPHERICS/components/omni_devices/mixer.dm
index 27bf6437c9e..c64703773d3 100644
--- a/code/ATMOSPHERICS/components/omni_devices/mixer.dm
+++ b/code/ATMOSPHERICS/components/omni_devices/mixer.dm
@@ -141,7 +141,7 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "omni_mixer.tmpl", "Omni Mixer Control", 360, 330)
ui.set_initial_data(data)
ui.open()
diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
index 77fd2328b08..beae30e55db 100644
--- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
+++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
@@ -103,7 +103,7 @@
for(var/datum/omni_port/P in ports)
int_pressure += P.air.return_pressure()
var/datum/gas_mixture/env_air = loc.return_air()
- if ((int_pressure - env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
+ if((int_pressure - env_air.return_pressure()) > 2*ONE_ATMOSPHERE)
to_chat(user, "You cannot unwrench [src], it is too exerted due to internal pressure. ")
add_fingerprint(user)
return 1
diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
index 698753fa1be..833454e51a8 100755
--- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
@@ -191,12 +191,14 @@ Filter types:
onclose(user, "atmo_filter")
return
- if (src.temp)
+ if(src.temp)
dat = text("[] Clear Screen ", src.temp, src)
//else
// src.on != src.on
*/
- user << browse("[src.name] control [dat] ", "window=atmo_filter")
+ var/datum/browser/popup = new(user, "atmo_filter", name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "atmo_filter")
return
@@ -207,7 +209,7 @@ Filter types:
src.add_fingerprint(usr)
if(href_list["filterset"])
src.filter_type = text2num(href_list["filterset"])
- if (href_list["temp"])
+ if(href_list["temp"])
src.temp = null
if(href_list["set_press"])
var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num
@@ -218,7 +220,7 @@ Filter types:
src.updateUsrDialog()
/*
for(var/mob/M in viewers(1, src))
- if ((M.client && M.machine == src))
+ if((M.client && M.machine == src))
src.attack_hand(M)
*/
return
diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
index e56e839ef73..35d031dcf46 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
@@ -135,7 +135,9 @@
+
"}
- user << browse("[src.name] control [dat] ", "window=atmo_mixer")
+ var/datum/browser/popup = new(user, "atmo_mixer", name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "atmo_mixer")
return
diff --git a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm
index 2f6845a16c6..cdf11742ad8 100644
--- a/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/outlet_injector.dm
@@ -172,7 +172,7 @@
interact(user)
return 1
if(istype(W, /obj/item/weapon/wrench))
- if (!(stat & NOPOWER) && on)
+ if(!(stat & NOPOWER) && on)
to_chat(user, "You cannot unwrench this [src], turn if off first. ")
return 1
return ..()
diff --git a/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm b/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm
index 94384f8ca3d..dc7da589017 100644
--- a/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/thermal_plate.dm
@@ -28,10 +28,10 @@
var/transfer_moles = 0.25 * environment.total_moles()
var/datum/gas_mixture/external_removed = environment.remove(transfer_moles)
- if (!external_removed)
+ if(!external_removed)
return radiate()
- if (external_removed.total_moles() < 10)
+ if(external_removed.total_moles() < 10)
return radiate()
//Get same info from connected gas
@@ -39,7 +39,7 @@
var/internal_transfer_moles = 0.25 * air_contents.total_moles()
var/datum/gas_mixture/internal_removed = air_contents.remove(internal_transfer_moles)
- if (!internal_removed)
+ if(!internal_removed)
environment.merge(external_removed)
return 1
@@ -63,7 +63,7 @@
var/internal_transfer_moles = 0.25 * air_contents.total_moles()
var/datum/gas_mixture/internal_removed = air_contents.remove(internal_transfer_moles)
- if (!internal_removed)
+ if(!internal_removed)
return 1
var/combined_heat_capacity = internal_removed.heat_capacity() + RADIATION_CAPACITY
diff --git a/code/ATMOSPHERICS/components/unary_devices/unary_base.dm b/code/ATMOSPHERICS/components/unary_devices/unary_base.dm
index 3c993e26b0b..e61a62736c3 100644
--- a/code/ATMOSPHERICS/components/unary_devices/unary_base.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/unary_base.dm
@@ -27,7 +27,7 @@
for(var/obj/machinery/atmospherics/target in get_step(src, dir))
if(target.initialize_directions & get_dir(target,src))
var/c = check_connect_types(target,src)
- if (c)
+ if(c)
target.connected_to = c
src.connected_to = c
node = target
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
index 6fe6c646cf5..338c1a02e9c 100644
--- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
@@ -60,13 +60,13 @@
icon_state = "map_vent_in"
/obj/machinery/atmospherics/unary/vent_pump/New()
+ ..()
icon = null
initial_loc = get_area(loc)
area_uid = initial_loc.uid
- if (!id_tag)
+ if(!id_tag)
assign_uid()
id_tag = num2text(uid)
- ..()
/obj/machinery/atmospherics/unary/vent_pump/high_volume
name = "large air vent"
@@ -121,7 +121,7 @@
/obj/machinery/atmospherics/unary/vent_pump/process()
if(!..() || (stat & (NOPOWER|BROKEN)))
return 0
- if (!node)
+ if(!node)
on = 0
//broadcast_status() // from now air alarm/control computer should request update purposely --rastaf0
if(!on)
@@ -164,7 +164,7 @@
var/transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
- if (isnull(removed)) //in space
+ if(isnull(removed)) //in space
return
air_contents.merge(removed)
@@ -252,7 +252,7 @@
on = !on
if(signal.data["checks"] != null)
- if (signal.data["checks"] == "default")
+ if(signal.data["checks"] == "default")
pressure_checks = pressure_checks_default
else
pressure_checks = text2num(signal.data["checks"])
@@ -264,7 +264,7 @@
pump_direction = text2num(signal.data["direction"])
if(signal.data["set_internal_pressure"] != null)
- if (signal.data["set_internal_pressure"] == "default")
+ if(signal.data["set_internal_pressure"] == "default")
internal_pressure_bound = internal_pressure_bound_default
else
internal_pressure_bound = between(
@@ -274,7 +274,7 @@
)
if(signal.data["set_external_pressure"] != null)
- if (signal.data["set_external_pressure"] == "default")
+ if(signal.data["set_external_pressure"] == "default")
external_pressure_bound = external_pressure_bound_default
else
external_pressure_bound = between(
@@ -320,7 +320,7 @@
/obj/machinery/atmospherics/unary/vent_pump/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
- if (WT.remove_fuel(0,user))
+ if(WT.remove_fuel(0,user))
to_chat(user, "Now welding the vent. ")
if(do_after(user, 20, target = src))
if(!src || !WT.isOn()) return
@@ -343,12 +343,12 @@
if(!welded)
if(open)
to_chat(user, " Now closing the vent. ")
- if (do_after(user, 20, target = src))
+ if(do_after(user, 20, target = src))
open = 0
user.visible_message("[user] screwdrivers the vent shut.", "You screwdriver the vent shut.", "You hear a screwdriver.")
else
to_chat(user, " Now opening the vent. ")
- if (do_after(user, 20, target = src))
+ if(do_after(user, 20, target = src))
open = 1
user.visible_message("[user] screwdrivers the vent shut.", "You screwdriver the vent shut.", "You hear a screwdriver.")
return
@@ -365,8 +365,8 @@
if(istype(W, /obj/item/device/multitool))
update_multitool_menu(user)
return 1
- if (istype(W, /obj/item/weapon/wrench))
- if (!(stat & NOPOWER) && on)
+ if(istype(W, /obj/item/weapon/wrench))
+ if(!(stat & NOPOWER) && on)
to_chat(user, "You cannot unwrench this [src], turn it off first. ")
return 1
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
index d0b0c9eb693..98d6a0db879 100644
--- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
@@ -41,13 +41,13 @@
connect_types = list(1,3) //connects to regular and scrubber pipes
/obj/machinery/atmospherics/unary/vent_scrubber/New()
+ ..()
icon = null
initial_loc = get_area(loc)
area_uid = initial_loc.uid
- if (!id_tag)
+ if(!id_tag)
assign_uid()
id_tag = num2text(uid)
- ..()
/obj/machinery/atmospherics/unary/vent_scrubber/Destroy()
if(initial_loc && frequency == 1439)
@@ -63,26 +63,26 @@
/obj/machinery/atmospherics/unary/vent_scrubber/auto_use_power()
if(!powered(power_channel))
return 0
- if (!on || welded)
+ if(!on || welded)
return 0
if(stat & (NOPOWER|BROKEN))
return 0
var/amount = idle_power_usage
- if (scrubbing)
- if (scrub_CO2)
+ if(scrubbing)
+ if(scrub_CO2)
amount += idle_power_usage
- if (scrub_Toxins)
+ if(scrub_Toxins)
amount += idle_power_usage
- if (scrub_N2)
+ if(scrub_N2)
amount += idle_power_usage
- if (scrub_N2O)
+ if(scrub_N2O)
amount += idle_power_usage
else
amount = active_power_usage
- if (widenet)
+ if(widenet)
amount += amount*(adjacent_turfs.len*(adjacent_turfs.len/2))
use_power(amount, power_channel)
return 1
@@ -178,13 +178,13 @@
if(!..())
return 0
- if (widenet)
+ if(widenet)
check_turfs()
if(stat & (NOPOWER|BROKEN))
return
- if (!node)
+ if(!node)
on = 0
if(welded)
@@ -194,8 +194,8 @@
return 0
scrub(loc)
- if (widenet)
- for (var/turf/simulated/tile in adjacent_turfs)
+ if(widenet)
+ for(var/turf/simulated/tile in adjacent_turfs)
scrub(tile)
//we populate a list of turfs with nonatmos-blocked cardinal turfs AND
@@ -203,11 +203,11 @@
/obj/machinery/atmospherics/unary/vent_scrubber/proc/check_turfs()
adjacent_turfs.Cut()
var/turf/T = loc
- if (istype(T))
+ if(istype(T))
adjacent_turfs = T.GetAtmosAdjacentTurfs(alldir=1)
/obj/machinery/atmospherics/unary/vent_scrubber/proc/scrub(var/turf/simulated/tile)
- if (!tile || !istype(tile))
+ if(!tile || !istype(tile))
return 0
var/datum/gas_mixture/environment = tile.return_air()
@@ -218,7 +218,7 @@
//Take a gas sample
var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
- if (isnull(removed)) //in space
+ if(isnull(removed)) //in space
return
//Filter it
@@ -253,7 +253,7 @@
tile.air_update_turf()
else //Just siphoning all air
- if (air_contents.return_pressure()>=50*ONE_ATMOSPHERE)
+ if(air_contents.return_pressure()>=50*ONE_ATMOSPHERE)
return
var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume)
@@ -372,7 +372,7 @@
/obj/machinery/atmospherics/unary/vent_scrubber/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params)
if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
- if (WT.remove_fuel(0,user))
+ if(WT.remove_fuel(0,user))
to_chat(user, "Now welding the scrubber. ")
if(do_after(user, 20, target = src))
if(!src || !WT.isOn()) return
@@ -394,8 +394,8 @@
if(istype(W, /obj/item/device/multitool))
update_multitool_menu(user)
return 1
- if (istype(W, /obj/item/weapon/wrench))
- if (!(stat & NOPOWER) && on)
+ if(istype(W, /obj/item/weapon/wrench))
+ if(!(stat & NOPOWER) && on)
to_chat(user, "You cannot unwrench this [src], turn it off first. ")
return 1
diff --git a/code/ATMOSPHERICS/pipes/cap.dm b/code/ATMOSPHERICS/pipes/cap.dm
index f20d71c2828..0504062eb09 100644
--- a/code/ATMOSPHERICS/pipes/cap.dm
+++ b/code/ATMOSPHERICS/pipes/cap.dm
@@ -67,7 +67,7 @@
for(var/obj/machinery/atmospherics/target in get_step(src, dir))
if(target.initialize_directions & get_dir(target,src))
var/c = check_connect_types(target,src)
- if (c)
+ if(c)
target.connected_to = c
src.connected_to = c
node = target
diff --git a/code/ATMOSPHERICS/pipes/manifold.dm b/code/ATMOSPHERICS/pipes/manifold.dm
index 8ba5db9fbd5..0c3e5fd5be3 100644
--- a/code/ATMOSPHERICS/pipes/manifold.dm
+++ b/code/ATMOSPHERICS/pipes/manifold.dm
@@ -17,6 +17,11 @@
layer = 2.4 //under wires with their 2.44
/obj/machinery/atmospherics/pipe/manifold/New()
+
+ ..()
+
+ alpha = 255
+ icon = null
switch(dir)
if(NORTH)
initialize_directions = EAST|SOUTH|WEST
@@ -27,11 +32,6 @@
if(WEST)
initialize_directions = NORTH|EAST|SOUTH
- ..()
-
- alpha = 255
- icon = null
-
/obj/machinery/atmospherics/pipe/manifold/initialize()
..()
for(var/D in cardinal)
@@ -62,7 +62,6 @@
/obj/machinery/atmospherics/pipe/manifold/hide(var/i)
if(level == 1 && istype(loc, /turf/simulated))
invisibility = i ? 101 : 0
- update_icon()
/obj/machinery/atmospherics/pipe/manifold/pipeline_expansion()
return list(node1, node2, node3)
@@ -102,6 +101,7 @@
if(istype(node3, /obj/machinery/atmospherics/pipe))
qdel(parent)
node3 = null
+ check_nodes_exist()
update_icon()
..()
@@ -121,40 +121,39 @@
alpha = 255
- if(!node1 && !node2 && !node3)
- var/turf/T = get_turf(src)
- new /obj/item/pipe(loc, make_from=src)
- for (var/obj/machinery/meter/meter in T)
- if (meter.target == src)
- new /obj/item/pipe_meter(T)
- qdel(meter)
- qdel(src)
- else
- overlays.Cut()
- overlays += icon_manager.get_atmos_icon("manifold", , pipe_color, "core" + icon_connect_type)
- overlays += icon_manager.get_atmos_icon("manifold", , , "clamps" + icon_connect_type)
- underlays.Cut()
+ overlays.Cut()
+ overlays += icon_manager.get_atmos_icon("manifold", , pipe_color, "core" + icon_connect_type)
+ overlays += icon_manager.get_atmos_icon("manifold", , , "clamps" + icon_connect_type)
+ underlays.Cut()
- var/turf/T = get_turf(src)
- if(!istype(T)) return
- var/list/directions = list(NORTH, SOUTH, EAST, WEST)
- var/node1_direction = get_dir(src, node1)
- var/node2_direction = get_dir(src, node2)
- var/node3_direction = get_dir(src, node3)
+ var/turf/T = get_turf(src)
+ if(!istype(T)) return
+ var/list/directions = list(NORTH, SOUTH, EAST, WEST)
+ var/node1_direction = get_dir(src, node1)
+ var/node2_direction = get_dir(src, node2)
+ var/node3_direction = get_dir(src, node3)
- directions -= dir
+ directions -= dir
- directions -= add_underlay(T,node1,node1_direction,icon_connect_type)
- directions -= add_underlay(T,node2,node2_direction,icon_connect_type)
- directions -= add_underlay(T,node3,node3_direction,icon_connect_type)
+ directions -= add_underlay(T,node1,node1_direction,icon_connect_type)
+ directions -= add_underlay(T,node2,node2_direction,icon_connect_type)
+ directions -= add_underlay(T,node3,node3_direction,icon_connect_type)
- for(var/D in directions)
- add_underlay(T,,D,icon_connect_type)
+ for(var/D in directions)
+ add_underlay(T,,D,icon_connect_type)
/obj/machinery/atmospherics/pipe/manifold/update_underlays()
..()
update_icon()
+// A check to make sure both nodes exist - self-delete if they aren't present
+/obj/machinery/atmospherics/pipe/manifold/check_nodes_exist()
+ if(!node1 && !node2 && !node3)
+ Deconstruct()
+ return 0 // 0: No nodes exist
+ // 1: 1-3 nodes exist, we continue existing
+ return 1
+
/obj/machinery/atmospherics/pipe/manifold/visible
icon_state = "map"
level = 2
diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm
index 5975ffce26b..c00696ed1a9 100644
--- a/code/ATMOSPHERICS/pipes/manifold4w.dm
+++ b/code/ATMOSPHERICS/pipes/manifold4w.dm
@@ -72,6 +72,7 @@
qdel(parent)
node4 = null
+ check_nodes_exist()
update_icon()
..()
@@ -93,59 +94,45 @@
return
alpha = 255
+ overlays.Cut()
+ overlays += icon_manager.get_atmos_icon("manifold", , pipe_color, "4way" + icon_connect_type)
+ overlays += icon_manager.get_atmos_icon("manifold", , , "clamps_4way" + icon_connect_type)
+ underlays.Cut()
- if(!node1 && !node2 && !node3 && !node4)
- var/turf/T = get_turf(src)
- new /obj/item/pipe(loc, make_from=src)
- for (var/obj/machinery/meter/meter in T)
- if (meter.target == src)
- new /obj/item/pipe_meter(T)
- qdel(meter)
- qdel(src)
- else
- overlays.Cut()
- overlays += icon_manager.get_atmos_icon("manifold", , pipe_color, "4way" + icon_connect_type)
- overlays += icon_manager.get_atmos_icon("manifold", , , "clamps_4way" + icon_connect_type)
- underlays.Cut()
+ var/turf/T = get_turf(src)
+ if(!istype(T)) return
+ var/list/directions = list(NORTH, SOUTH, EAST, WEST)
+ var/node1_direction = get_dir(src, node1)
+ var/node2_direction = get_dir(src, node2)
+ var/node3_direction = get_dir(src, node3)
+ var/node4_direction = get_dir(src, node4)
- /*
- var/list/directions = list(NORTH, SOUTH, EAST, WEST)
+ directions -= dir
- directions -= add_underlay(node1)
- directions -= add_underlay(node2)
- directions -= add_underlay(node3)
- directions -= add_underlay(node4)
+ directions -= add_underlay(T,node1,node1_direction,icon_connect_type)
+ directions -= add_underlay(T,node2,node2_direction,icon_connect_type)
+ directions -= add_underlay(T,node3,node3_direction,icon_connect_type)
+ directions -= add_underlay(T,node4,node4_direction,icon_connect_type)
- for(var/D in directions)
- add_underlay(,D)
- */
-
- var/turf/T = get_turf(src)
- if(!istype(T)) return
- var/list/directions = list(NORTH, SOUTH, EAST, WEST)
- var/node1_direction = get_dir(src, node1)
- var/node2_direction = get_dir(src, node2)
- var/node3_direction = get_dir(src, node3)
- var/node4_direction = get_dir(src, node4)
-
- directions -= dir
-
- directions -= add_underlay(T,node1,node1_direction,icon_connect_type)
- directions -= add_underlay(T,node2,node2_direction,icon_connect_type)
- directions -= add_underlay(T,node3,node3_direction,icon_connect_type)
- directions -= add_underlay(T,node4,node4_direction,icon_connect_type)
-
- for(var/D in directions)
- add_underlay(T,,D,icon_connect_type)
+ for(var/D in directions)
+ add_underlay(T,,D,icon_connect_type)
/obj/machinery/atmospherics/pipe/manifold4w/update_underlays()
..()
update_icon()
+
+// A check to make sure both nodes exist - self-delete if they aren't present
+/obj/machinery/atmospherics/pipe/manifold4w/check_nodes_exist()
+ if(!node1 && !node2 && !node3 && !node4)
+ Deconstruct()
+ return 0 // 0: No nodes exist
+ // 1: 1-4 nodes exist, we continue existing
+ return 1
+
/obj/machinery/atmospherics/pipe/manifold4w/hide(var/i)
if(level == 1 && istype(loc, /turf/simulated))
invisibility = i ? 101 : 0
- update_icon()
/obj/machinery/atmospherics/pipe/manifold4w/initialize()
..()
@@ -244,4 +231,4 @@
color = PIPE_COLOR_GREEN
/obj/machinery/atmospherics/pipe/manifold4w/hidden/purple
- color = PIPE_COLOR_PURPLE
\ No newline at end of file
+ color = PIPE_COLOR_PURPLE
diff --git a/code/ATMOSPHERICS/pipes/pipe.dm b/code/ATMOSPHERICS/pipes/pipe.dm
index 488f4d65c6a..f319e563835 100644
--- a/code/ATMOSPHERICS/pipes/pipe.dm
+++ b/code/ATMOSPHERICS/pipes/pipe.dm
@@ -85,3 +85,7 @@
return node.pipe_color
else
return pipe_color
+
+// A check to make sure both nodes exist - self-delete if they aren't present
+/obj/machinery/atmospherics/pipe/proc/check_nodes_exist()
+ return
diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm
index fbd5f85b6c5..cd5e4a9367d 100644
--- a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm
+++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm
@@ -66,6 +66,7 @@
connected_to = c
node2 = target
break
+
var/turf/T = loc // hide if turf is not intact
hide(T.intact)
update_icon()
@@ -120,7 +121,9 @@
if(istype(node2, /obj/machinery/atmospherics/pipe))
qdel(parent)
node2 = null
+ check_nodes_exist()
update_icon()
+ ..()
/obj/machinery/atmospherics/pipe/simple/pipeline_expansion()
return list(node1, node2)
@@ -141,23 +144,22 @@
overlays.Cut()
- if(!node1 && !node2)
- var/turf/T = get_turf(src)
- new /obj/item/pipe(loc, make_from=src)
- for (var/obj/machinery/meter/meter in T)
- if (meter.target == src)
- new /obj/item/pipe_meter(T)
- qdel(meter)
- qdel(src)
- else if(node1 && node2)
+ if(node1 && node2)
overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, pipe_icon + "intact" + icon_connect_type)
else
overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, pipe_icon + "exposed[node1?1:0][node2?1:0]" + icon_connect_type)
+// A check to make sure both nodes exist - self-delete if they aren't present
+/obj/machinery/atmospherics/pipe/simple/check_nodes_exist()
+ if(!node1 && !node2)
+ Deconstruct()
+ return 0 // 0: No nodes exist
+ // 1: 1-2 nodes exist, we continue existing
+ return 1
+
/obj/machinery/atmospherics/pipe/simple/update_underlays()
return
/obj/machinery/atmospherics/pipe/simple/hide(var/i)
if(level == 1 && istype(loc, /turf/simulated))
invisibility = i ? 101 : 0
- update_icon()
diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm
index 5cde784c8ce..a771bdd6234 100644
--- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm
+++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_he.dm
@@ -96,17 +96,17 @@
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/New()
.. ()
- switch (dir)
- if (SOUTH)
+ switch(dir)
+ if(SOUTH)
initialize_directions = NORTH
initialize_directions_he = SOUTH
- if (NORTH)
+ if(NORTH)
initialize_directions = SOUTH
initialize_directions_he = NORTH
- if (EAST)
+ if(EAST)
initialize_directions = WEST
initialize_directions_he = EAST
- if (WEST)
+ if(WEST)
initialize_directions = EAST
initialize_directions_he = WEST
diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm
index 7cf983e0e32..db62f8e51fe 100644
--- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm
+++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_hidden.dm
@@ -37,14 +37,14 @@
overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "universal")
underlays.Cut()
- if (node1)
+ if(node1)
universal_underlays(node1)
if(node2)
universal_underlays(node2)
else
var/node2_dir = turn(get_dir(src,node1),-180)
universal_underlays(,node2_dir)
- else if (node2)
+ else if(node2)
universal_underlays(node2)
var/node1_dir = turn(get_dir(src,node2),-180)
universal_underlays(,node1_dir)
diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm
index a93351b29c7..1fcb45e7959 100644
--- a/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm
+++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple_visible.dm
@@ -48,14 +48,14 @@
overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "universal")
underlays.Cut()
- if (node1)
+ if(node1)
universal_underlays(node1)
if(node2)
universal_underlays(node2)
else
var/node1_dir = get_dir(node1,src)
universal_underlays(,node1_dir)
- else if (node2)
+ else if(node2)
universal_underlays(node2)
else
universal_underlays(,dir)
diff --git a/code/LINDA/LINDA_fire.dm b/code/LINDA/LINDA_fire.dm
index afbeb0a0e45..14f8ab20998 100644
--- a/code/LINDA/LINDA_fire.dm
+++ b/code/LINDA/LINDA_fire.dm
@@ -165,7 +165,7 @@
var/turf/simulated/T = loc
if(T.to_be_destroyed)
var/chance_of_deletion
- if (T.heat_capacity) //beware of division by zero
+ if(T.heat_capacity) //beware of division by zero
chance_of_deletion = T.max_fire_temperature_sustained / T.heat_capacity * 8 //there is no problem with prob(23456), min() was redundant --rastaf0
else
chance_of_deletion = 100
diff --git a/code/LINDA/LINDA_system.dm b/code/LINDA/LINDA_system.dm
index 2584192e7b4..3c2d0cd34a7 100644
--- a/code/LINDA/LINDA_system.dm
+++ b/code/LINDA/LINDA_system.dm
@@ -78,40 +78,40 @@ turf/CanPass(atom/movable/mover, turf/target, height=1.5,air_group=0)
if(T.atmos_adjacent_turfs & counterdir)
T.atmos_adjacent_turfs_amount -= 1
T.atmos_adjacent_turfs &= ~counterdir
-
+
//returns a list of adjacent turfs that can share air with this one.
//alldir includes adjacent diagonal tiles that can share
// air with both of the related adjacent cardinal tiles
/turf/proc/GetAtmosAdjacentTurfs(alldir = 0)
- if (!istype(src, /turf/simulated))
+ if(!istype(src, /turf/simulated))
return list()
var/adjacent_turfs = list()
var/turf/simulated/curloc = src
- for (var/direction in cardinal)
+ for(var/direction in cardinal)
if(!(curloc.atmos_adjacent_turfs & direction))
continue
var/turf/simulated/S = get_step(curloc, direction)
- if (istype(S))
+ if(istype(S))
adjacent_turfs += S
- if (!alldir)
+ if(!alldir)
return adjacent_turfs
- for (var/direction in diagonals)
+ for(var/direction in diagonals)
var/matchingDirections = 0
var/turf/simulated/S = get_step(curloc, direction)
- for (var/checkDirection in cardinal)
+ for(var/checkDirection in cardinal)
if(!(S.atmos_adjacent_turfs & checkDirection))
continue
var/turf/simulated/checkTurf = get_step(S, checkDirection)
- if (checkTurf in adjacent_turfs)
+ if(checkTurf in adjacent_turfs)
matchingDirections++
- if (matchingDirections >= 2)
+ if(matchingDirections >= 2)
adjacent_turfs += S
break
@@ -184,4 +184,4 @@ var/const/SPAWN_AIR = 256
G.nitrogen += MOLES_N2STANDARD * amount
air.merge(G)
- air_master.add_to_active(src, 0)
\ No newline at end of file
+ air_master.add_to_active(src, 0)
diff --git a/code/LINDA/LINDA_turf_tile.dm b/code/LINDA/LINDA_turf_tile.dm
index 3aeacb942a7..b292e7664b2 100644
--- a/code/LINDA/LINDA_turf_tile.dm
+++ b/code/LINDA/LINDA_turf_tile.dm
@@ -246,14 +246,14 @@
overlays -= icemaster
var/new_overlay_type = tile_graphic()
- if (new_overlay_type == atmos_overlay_type)
+ if(new_overlay_type == atmos_overlay_type)
return
var/atmos_overlay = get_atmos_overlay_by_name(atmos_overlay_type)
- if (atmos_overlay)
+ if(atmos_overlay)
overlays -= atmos_overlay
atmos_overlay = get_atmos_overlay_by_name(new_overlay_type)
- if (atmos_overlay)
+ if(atmos_overlay)
overlays += atmos_overlay
atmos_overlay_type = new_overlay_type
diff --git a/code/__DEFINES/bots.dm b/code/__DEFINES/bots.dm
index 339d272b57e..1fad6d6cd4b 100644
--- a/code/__DEFINES/bots.dm
+++ b/code/__DEFINES/bots.dm
@@ -36,4 +36,5 @@
#define SENTIENCE_ORGANIC 1
#define SENTIENCE_ARTIFICIAL 2
#define SENTIENCE_OTHER 3
-#define SENTIENCE_MINEBOT 4
\ No newline at end of file
+#define SENTIENCE_MINEBOT 4
+#define SENTIENCE_BOSS 5
\ No newline at end of file
diff --git a/code/__DEFINES/clothing.dm b/code/__DEFINES/clothing.dm
index 83a6ac5b20a..bc067253ff1 100644
--- a/code/__DEFINES/clothing.dm
+++ b/code/__DEFINES/clothing.dm
@@ -30,9 +30,8 @@
#define slot_in_backpack 18
#define slot_legcuffed 19
#define slot_r_ear 20
-#define slot_wear_pda 21
-#define slot_tie 22
-#define slots_amt 22
+#define slot_tie 21
+#define slots_amt 21
//Cant seem to find a mob bitflags area other than the powers one
@@ -78,3 +77,5 @@
#define BLOCKHEADHAIR 4 // temporarily removes the user's hair overlay. Leaves facial hair.
#define BLOCKHAIR 32768 // temporarily removes the user's hair, facial and otherwise.
+
+#define ONESIZEFITSALL 1 // determines if something can be worn by a fatty or not.
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index ca293307099..a05575f575d 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -54,6 +54,13 @@
#define AI_IDLE 2
#define AI_OFF 3
+//Attack types for checking shields/hit reactions
+
+#define MELEE_ATTACK 1
+#define UNARMED_ATTACK 2
+#define PROJECTILE_ATTACK 3
+#define THROWN_PROJECTILE_ATTACK 4
+
//Gun Stuff
#define SAWN_INTACT 0
#define SAWN_OFF 1
diff --git a/code/__DEFINES/crafting.dm b/code/__DEFINES/crafting.dm
new file mode 100644
index 00000000000..8218d392640
--- /dev/null
+++ b/code/__DEFINES/crafting.dm
@@ -0,0 +1,7 @@
+#define CAT_NONE ""
+#define CAT_WEAPON "Weaponry"
+#define CAT_AMMO "Ammunition"
+#define CAT_ROBOT "Robots"
+#define CAT_FOOD "Food"
+#define CAT_MISC "Misc"
+#define CAT_PRIMAL "Tribal"
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index 915cb8816e8..23421c58aa4 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -4,13 +4,9 @@
#define NOBLUDGEON 4 // when an item has this it produces no "X has been hit by Y with Z" message with the default handler
#define AIRTIGHT 8 // mask allows internals
#define HANDSLOW 16 // If an item has this flag, it will slow you to carry it
-#define NOSHIELD 32 // weapon not affected by shield
-#define CONDUCT 64 // conducts electricity (metal etc.)
-#define ABSTRACT 128 // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way
-#define ON_BORDER 512 // item has priority to check when entering or leaving
-#define NODELAY 32768 // 1 second attackby delay skipped (Can be used once every 0.2s). Most objects have a 1s attackby delay, which doesn't require a flag.
-
-#define NOBLOODY 2048 // used to items if they don't want to get a blood overlay
+#define CONDUCT 32 // conducts electricity (metal etc.)
+#define ABSTRACT 64 // for all things that are technically items but used for various different stuff, made it 128 because it could conflict with other flags other way
+#define ON_BORDER 128 // item has priority to check when entering or leaving
#define GLASSESCOVERSEYES 1024
#define MASKCOVERSEYES 1024 // get rid of some of the other retardation in these flags
@@ -21,14 +17,13 @@
#define HEADBANGPROTECT 4096
#define EARBANGPROTECT 1024
-#define THICKMATERIAL 1024 //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with NOSLIP)
#define NOSLIP 1024 //prevents from slipping on wet floors, in space etc
#define OPENCONTAINER 4096 // is an open container for chemistry purposes
-#define BLOCK_GAS_SMOKE_EFFECT 8192 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY! (NOTE: flag shared with ONESIZEFITSALL)
-#define ONESIZEFITSALL 8192
-#define PLASMAGUARD 16384 //Does not get contaminated by plasma.
+#define BLOCK_GAS_SMOKE_EFFECT 8192 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY!
+#define THICKMATERIAL 8192 //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with BLOCK_GAS_SMOKE_EFFECT)
+
#define NOREACT 16384 //Reagents dont' react inside this container.
@@ -107,10 +102,9 @@
#define SLOT_POCKET 2048 //this is to allow items with a w_class of 3 or 4 to fit in pockets.
#define SLOT_DENYPOCKET 4096 //this is to deny items with a w_class of 2 or 1 to fit in pockets.
#define SLOT_TWOEARS 8192
-#define SLOT_PDA 16384
-#define SLOT_TIE 32768
+#define SLOT_TIE 16384
//ORGAN TYPE FLAGS
#define AFFECT_ROBOTIC_ORGAN 1
#define AFFECT_ORGANIC_ORGAN 2
-#define AFFECT_ALL_ORGANS 3
\ No newline at end of file
+#define AFFECT_ALL_ORGANS 3
diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm
index 3be0682c727..97f797b2718 100644
--- a/code/__DEFINES/genetics.dm
+++ b/code/__DEFINES/genetics.dm
@@ -1,5 +1,8 @@
// String identifiers for associative list lookup
+
+#define MUTCHK_FORCED 1
+
// mob/var/list/mutations
// Used in preferences.
@@ -15,8 +18,8 @@
///////////////////////////////////////
// Generic mutations:
-#define TK 1
-#define RESIST_COLD 2
+#define TK 1
+#define RESIST_COLD 2
#define XRAY 3
#define HULK 4
#define CLUMSY 5
@@ -27,79 +30,52 @@
// Extra powers:
#define LASER 9 // harm intent - click anywhere to shoot lasers from eyes
-#define GREY 10 //Wingdings for Greys -- Not activatable or researchable
-//#define HEAL 10 // (Not implemented) healing people with hands
-//#define SHADOW 11 // (Not implemented) shadow teleportation (create in/out portals anywhere) (25%)
-//#define SCREAM 12 // (Not implemented) supersonic screaming (25%)
-//#define EXPLOSIVE 13 // (Not implemented) exploding on-demand (15%)
-//#define REGENERATION 14 // (Not implemented) superhuman regeneration (30%)
-//#define REPROCESSOR 15 // (Not implemented) eat anything (50%)
-//#define SHAPESHIFTING 16 // (Not implemented) take on the appearance of anything (40%)
-//#define PHASING 17 // (Not implemented) ability to phase through walls (40%)
-//#define SHIELD 18 // (Not implemented) shielding from all projectile attacks (30%)
-//#define SHOCKWAVE 19 // (Not implemented) attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%)
-//#define ELECTRICITY 20 // (Not implemented) ability to shoot electric attacks (15%)
-//bitflags for mutations
- // Extra powers:
-#define SHADOW (1<<10) // shadow teleportation (create in/out portals anywhere) (25%)
-#define SCREAM (1<<11) // supersonic screaming (25%)
-#define EXPLOSIVE (1<<12) // exploding on-demand (15%)
-#define REGENERATION (1<<13) // superhuman regeneration (30%)
-#define REPROCESSOR (1<<14) // eat anything (50%)
-#define SHAPESHIFTING (1<<15) // take on the appearance of anything (40%)
-#define PHASING (1<<16) // ability to phase through walls (40%)
-#define SHIELD (1<<17) // shielding from all projectile attacks (30%)
-#define SHOCKWAVE (1<<18) // attack a nearby tile and cause a massive shockwave, knocking most people on their asses (25%)
-#define ELECTRICITY (1<<19) // ability to shoot electric attacks (15%)
-
-
- //2spooky
+//2spooky
#define SKELETON 29
#define PLANT 30
// Other Mutations:
#define NO_BREATH 100 // no need to breathe
-#define REMOTE_VIEW 101 // remote viewing
+#define REMOTE_VIEW 101 // remote viewing
#define REGEN 102 // health regen
-#define RUN 103 // no slowdown
-#define REMOTE_TALK 104 // remote talking
+#define RUN 103 // no slowdown
+#define REMOTE_TALK 104 // remote talking
#define MORPH 105 // changing appearance
-#define RESIST_HEAT 106 // heat resistance
-#define HALLUCINATE 107 // hallucinations
+#define RESIST_HEAT 106 // heat resistance
+#define HALLUCINATE 107 // hallucinations
#define FINGERPRINTS 108 // no fingerprints
#define NO_SHOCK 109 // insulated hands
#define DWARF 110 // table climbing
// Goon muts
-#define OBESITY 200 // Decreased metabolism
-#define TOXIC_FARTS 201 // Duh
-#define STRONG 202 // (Nothing)
-#define SOBER 203 // Increased alcohol metabolism
-#define PSY_RESIST 204 // Block remoteview
-#define SUPER_FART 205 // Duh
-#define EMPATH 206 //Read minds
+#define OBESITY 200 // Decreased metabolism
+#define TOXIC_FARTS 201 // Duh
+#define STRONG 202 // (Nothing)
+#define SOBER 203 // Increased alcohol metabolism
+#define PSY_RESIST 204 // Block remoteview
+#define SUPER_FART 205 // Duh
+#define EMPATH 206 //Read minds
#define COMIC 207 //Comic Sans
// /vg/ muts
-#define LOUD 208 // CAUSES INTENSE YELLING
-//#define WHISPER 209 // causes quiet whispering
-#define DIZZY 210 // Trippy.
+#define LOUD 208 // CAUSES INTENSE YELLING
+#define DIZZY 210 // Trippy.
-#define LISP 300
-#define RADIOACTIVE 301
-#define CHAV 302
-#define SWEDISH 303
-#define SCRAMBLED 304
-#define HORNS 305
-#define IMMOLATE 306
-#define CLOAK 307
-#define CHAMELEON 308
-#define CRYO 309
-#define EATER 310
+#define LISP 300
+#define RADIOACTIVE 301
+#define CHAV 302
+#define SWEDISH 303
+#define SCRAMBLED 304
+#define HORNS 305
+#define IMMOLATE 306
+#define CLOAK 307
+#define CHAMELEON 308
+#define CRYO 309
+#define EATER 310
-#define JUMPY 400
-#define POLYMORPH 401
+#define JUMPY 400
+#define POLYMORPH 401
//disabilities
#define NEARSIGHTED 1
@@ -107,11 +83,9 @@
#define COUGHING 4
#define TOURETTES 8
#define NERVOUS 16
-
-//sdisabilities
-#define BLIND 1
-#define MUTE 2
-#define DEAF 4
+#define BLIND 32
+#define MUTE 64
+#define DEAF 128
//Nutrition levels for humans. No idea where else to put it
#define NUTRITION_LEVEL_FAT 600
@@ -121,3 +95,15 @@
#define NUTRITION_LEVEL_HUNGRY 250
#define NUTRITION_LEVEL_STARVING 150
+//Blood levels
+#define BLOOD_VOLUME_NORMAL 560
+#define BLOOD_VOLUME_SAFE 501
+#define BLOOD_VOLUME_OKAY 336
+#define BLOOD_VOLUME_BAD 224
+#define BLOOD_VOLUME_SURVIVE 122
+
+//Used for calculations for negative effects of having genetics powers
+#define DEFAULT_GENE_STABILITY 100
+#define GENE_INSTABILITY_MINOR 5
+#define GENE_INSTABILITY_MODERATE 10
+#define GENE_INSTABILITY_MAJOR 15
diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm
index 628afa0f5e9..1d89eea87a1 100644
--- a/code/__DEFINES/hud.dm
+++ b/code/__DEFINES/hud.dm
@@ -15,11 +15,16 @@
#define DIAG_BATT_HUD "10"// Borg/Mech power meter
#define DIAG_MECH_HUD "11"// Mech health bar
#define STATUS_HUD_OOC "12"// STATUS_HUD without virus db check for someone being ill.
-#define DIAG_BOT_HUD "13"// Bot HUDS
-
-//for antag huds. these are used at the /mob level
-#define SPECIALROLE_HUD "13"
+#define SPECIALROLE_HUD "13" //for antag huds. these are used at the /mob level
#define NATIONS_HUD "14" //Show nations icons during nations gamemode
+#define DIAG_BOT_HUD "15"// Bot HUDS
+#define PLANT_NUTRIENT_HUD "16"// Plant nutrient level
+#define PLANT_WATER_HUD "17"// Plant water level
+#define PLANT_STATUS_HUD "18"// Plant harvest/dead
+#define PLANT_HEALTH_HUD "19"// Plant health
+#define PLANT_TOXIN_HUD "20"// Toxin level
+#define PLANT_PEST_HUD "21"// Pest level
+#define PLANT_WEED_HUD "22"// Weed level
//data HUD (medhud, sechud) defines
//Don't forget to update human/New() if you change these!
@@ -28,16 +33,17 @@
#define DATA_HUD_MEDICAL_BASIC 3
#define DATA_HUD_MEDICAL_ADVANCED 4
#define DATA_HUD_DIAGNOSTIC 5
+#define DATA_HUD_HYDROPONIC 6
//NATIONS
-#define GAME_HUD_NATIONS 6
+#define GAME_HUD_NATIONS 7
//antag HUD defines
-#define ANTAG_HUD_CULT 7
-#define ANTAG_HUD_REV 8
-#define ANTAG_HUD_OPS 9
-#define ANTAG_HUD_WIZ 10
-#define ANTAG_HUD_SHADOW 11
-#define ANTAG_HUD_TRAITOR 12
-#define ANTAG_HUD_NINJA 13 //For Daves Rework
-#define ANTAG_HUD_CHANGELING 14
-#define ANTAG_HUD_VAMPIRE 15
-#define ANTAG_HUD_ABDUCTOR 16 //For Fox
+#define ANTAG_HUD_CULT 8
+#define ANTAG_HUD_REV 9
+#define ANTAG_HUD_OPS 10
+#define ANTAG_HUD_WIZ 11
+#define ANTAG_HUD_SHADOW 12
+#define ANTAG_HUD_TRAITOR 13
+#define ANTAG_HUD_NINJA 14 //For Daves Rework
+#define ANTAG_HUD_CHANGELING 15
+#define ANTAG_HUD_VAMPIRE 16
+#define ANTAG_HUD_ABDUCTOR 17 //For Fox
diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm
index 14161a5775f..8e27f9315c3 100644
--- a/code/__DEFINES/is_helpers.dm
+++ b/code/__DEFINES/is_helpers.dm
@@ -1 +1,5 @@
-#define ismovableatom(A) istype(A, /atom/movable)
\ No newline at end of file
+#define isatom(A) istype(A, /atom)
+#define ismovableatom(A) istype(A, /atom/movable)
+#define isclient(A) istype(A, /client)
+
+#define isradio(A) istype(A, /obj/item/device/radio)
\ No newline at end of file
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index d36405db5d1..f6ddb6a5a6a 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -66,6 +66,7 @@
#define COLOR_YELLOW "#FFFF00"
#define COLOR_ORANGE "#FF9900"
#define COLOR_WHITE "#FFFFFF"
+#define COLOR_GRAY "#808080"
//some arbitrary defines to be used by self-pruning global lists. (see master_controller)
#define PROCESS_KILL 26 //Used to trigger removal from a processing list
@@ -156,6 +157,8 @@
for(type in view(range, dview_mob))
#define END_FOR_DVIEW dview_mob.loc = null
+#define get_turf(A) (get_step(A, 0))
+
#define MIN_SUPPLIED_LAW_NUMBER 15
#define MAX_SUPPLIED_LAW_NUMBER 50
@@ -241,6 +244,14 @@
#define REGION_COMMAND 7
#define REGION_CENTCOMM 8
+//used for maploader
+#define MAP_MINX 1
+#define MAP_MINY 2
+#define MAP_MINZ 3
+#define MAP_MAXX 4
+#define MAP_MAXY 5
+#define MAP_MAXZ 6
+
//Matricies
#define MATRIX_DEFAULT list(1, 0, 0, 0,\
0, 1, 0, 0,\
@@ -255,3 +266,10 @@
#define TRIGGER_GUARD_ALLOW_ALL -1
#define TRIGGER_GUARD_NONE 0
#define TRIGGER_GUARD_NORMAL 1
+
+// Macro to get the current elapsed round time, rather than total world runtime
+#define ROUND_TIME (round_start_time ? (world.time - round_start_time) : 0)
+
+// Used by radios to indicate that they have sent a message via something other than subspace
+#define RADIO_CONNECTION_FAIL 0
+#define RADIO_CONNECTION_NON_SUBSPACE 1
diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm
index 82ca895b42d..736ca0d291f 100644
--- a/code/__DEFINES/mob.dm
+++ b/code/__DEFINES/mob.dm
@@ -103,10 +103,7 @@
#define CHEM_MOB_SPAWN_HOSTILE 1
#define CHEM_MOB_SPAWN_FRIENDLY 2
-#define isobserver(A) (istype((A), /mob/dead/observer))
#define isliving(A) (istype((A), /mob/living))
-#define isAutoAnnouncer(A) (istype((A), /mob/living/automatedannouncer))
-
#define iscarbon(A) (istype((A), /mob/living/carbon))
#define ishuman(A) (istype((A), /mob/living/carbon/human))
#define isbrain(A) (istype((A), /mob/living/carbon/brain))
@@ -127,12 +124,18 @@
#define isrobot(A) (istype((A), /mob/living/silicon/robot))
#define ispAI(A) (istype((A), /mob/living/silicon/pai))
+#define isAutoAnnouncer(A) (istype((A), /mob/living/automatedannouncer))
+
#define isAIEye(A) (istype((A), /mob/camera/aiEye))
#define isovermind(A) (istype((A), /mob/camera/blob))
#define isSpirit(A) (istype((A), /mob/spirit))
#define ismask(A) (istype((A), /mob/spirit/mask))
+#define isobserver(A) (istype((A), /mob/dead/observer))
+
+#define isnewplayer(A) (istype((A), /mob/new_player))
+
#define isorgan(A) (istype((A), /obj/item/organ/external))
#define hasorgans(A) (ishuman(A))
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index 1753045cb8c..8ac165cec6a 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -24,5 +24,6 @@
#define DISABLE_SCOREBOARD 2048
#define DISABLE_KARMA_REMINDER 4096
#define MEMBER_PUBLIC 8192
+#define CHAT_NO_ADMINLOGS 16384
#define TOGGLES_DEFAULT (CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS|CHAT_LOOC|MEMBER_PUBLIC)
diff --git a/code/__DEFINES/tick.dm b/code/__DEFINES/tick.dm
index 0469a81a392..71a63af6289 100644
--- a/code/__DEFINES/tick.dm
+++ b/code/__DEFINES/tick.dm
@@ -2,4 +2,4 @@
#define TICK_LIMIT_TO_RUN 85
#define TICK_CHECK ( world.tick_usage > TICK_LIMIT_RUNNING ? stoplag() : 0 )
-#define CHECK_TICK if (world.tick_usage > TICK_LIMIT_RUNNING) stoplag()
\ No newline at end of file
+#define CHECK_TICK if(world.tick_usage > TICK_LIMIT_RUNNING) stoplag()
\ No newline at end of file
diff --git a/code/__HELPERS/AnimationLibrary.dm b/code/__HELPERS/AnimationLibrary.dm
index 65225d37363..fcabe2e0a78 100644
--- a/code/__HELPERS/AnimationLibrary.dm
+++ b/code/__HELPERS/AnimationLibrary.dm
@@ -64,7 +64,7 @@
return
var/matrix/M = matrix()
var/do_loops = 15
- while (do_loops > 0)
+ while(do_loops > 0)
do_loops--
animate(A, transform = M, pixel_z = A.pixel_z + 12, alpha = A.alpha - 17, time = 1, loop = 1, easing = LINEAR_EASING)
M.Scale(1.2,1.2)
diff --git a/code/__HELPERS/experimental.dm b/code/__HELPERS/experimental.dm
index 27daccfc58c..533f67b68d9 100644
--- a/code/__HELPERS/experimental.dm
+++ b/code/__HELPERS/experimental.dm
@@ -16,18 +16,18 @@
* -2, parameter A is not a string
*/
/proc/strpos(const/A, const/B)
- if (istext(A) == 0 || length(A) < 1)
+ if(istext(A) == 0 || length(A) < 1)
return -2
- if (istext(B) == 0 || length(B) > 1)
+ if(istext(B) == 0 || length(B) > 1)
return -1
var/i = findtext(A, B)
- if (0 == i)
+ if(0 == i)
return 0
- while (i)
+ while(i)
. = i
i = findtext(A, B, i + 1)
@@ -35,8 +35,8 @@
var/prototype = Object.type
Object = null
- for (var/type in params2list(types))
- if (ispath(prototype, text2path(type)))
+ for(var/type in params2list(types))
+ if(ispath(prototype, text2path(type)))
return 1
return 0
@@ -45,7 +45,7 @@
/obj/machinery/proc/getArea()
var/area/A = loc.loc
- if (A != myArea)
+ if(A != myArea)
myArea = A
. = myArea
\ No newline at end of file
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index 47cee347876..0852622f2c6 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -10,7 +10,7 @@
/proc/get_area_master(const/O)
var/area/A = get_area(O)
- if (isarea(A))
+ if(isarea(A))
return A
/proc/get_area(atom/A)
@@ -42,7 +42,6 @@
// Like view but bypasses luminosity check
/proc/hear(var/range, var/atom/source)
-
var/lum = source.luminosity
source.luminosity = 6
@@ -194,7 +193,7 @@
var/datum/robot_component/CO = borg.get_component("radio")
if(!CO)
continue //No radio component (Shouldn't happen)
- if(!borg.is_component_functioning("radio") || !borg.use_power(CO.energy_consumption))
+ if(!borg.is_component_functioning("radio"))
continue //No power.
var/turf/speaker = get_turf(R)
@@ -440,7 +439,7 @@ proc/pollCandidates(var/Question, var/be_special_type, var/antag_age_check = 0,
var/roletext = be_special_type ? get_roletext(be_special_type) : null
var/list/mob/dead/observer/candidates = list()
var/time_passed = world.time
- if (!Question)
+ if(!Question)
Question = "Would you like to be a special role?"
for(var/mob/dead/observer/G in player_list)
diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm
index 4c2517d9617..5d5307cd50d 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: \icon[getFlatIcon(src)]")
+ to_chat(src, "Icon is: [bicon(getFlatIcon(src))]")
Label_Icon()
set name = "3. Label Icon"
@@ -747,7 +747,7 @@ The _flatIcons list is a cache for generated icon files.
add = icon(I:icon, I:icon_state, I:dir)
// This checks for a silent failure mode of the icon routine. If the requested dir
// doesn't exist in this icon state it returns a 32x32 icon with 0 alpha.
- if (I:dir != SOUTH && add.Width() == 32 && add.Height() == 32)
+ if(I:dir != SOUTH && add.Width() == 32 && add.Height() == 32)
// Check every pixel for blank (computationally expensive, but the process is limited
// by the amount of film on the station, only happens when we hit something that's
// turned, and bails at the very first pixel it sees.
@@ -760,7 +760,7 @@ The _flatIcons list is a cache for generated icon files.
if(!blankpixel)
break
// If we ALWAYS returned a null (which happens when GetPixel encounters something with alpha 0)
- if (blankpixel)
+ if(blankpixel)
// Pull the default direction.
add = icon(I:icon, I:icon_state)
else // 'I' is an appearance object.
@@ -815,9 +815,13 @@ The _flatIcons list is a cache for generated icon files.
/proc/getHologramIcon(icon/A, safety=1)//If safety is on, a new icon is not created.
var/icon/flat_icon = safety ? A : new(A)//Has to be a new icon to not constantly change the same icon.
+ var/icon/alpha_mask
flat_icon.ColorTone(rgb(125,180,225))//Let's make it bluish.
flat_icon.ChangeOpacity(0.5)//Make it half transparent.
- var/icon/alpha_mask = new('icons/effects/effects.dmi', "scanline")//Scanline effect.
+ if(A.Height() == 64)
+ alpha_mask = new('icons/mob/ancient_machine.dmi', "scanline2")//Scaline for tall icons.
+ else
+ alpha_mask = new('icons/effects/effects.dmi', "scanline")//Scanline effect.
flat_icon.AddAlphaMask(alpha_mask)//Finally, let's mix in a distortion effect.
return flat_icon
@@ -830,8 +834,8 @@ The _flatIcons list is a cache for generated icon files.
return composite
proc/adjust_brightness(var/color, var/value)
- if (!color) return "#FFFFFF"
- if (!value) return color
+ if(!color) return "#FFFFFF"
+ if(!value) return color
var/list/RGB = ReadRGB(color)
RGB[1] = Clamp(RGB[1]+value,0,255)
@@ -844,7 +848,7 @@ proc/sort_atoms_by_layer(var/list/atoms)
var/list/result = atoms.Copy()
var/gap = result.len
var/swapped = 1
- while (gap > 1 || swapped)
+ while(gap > 1 || swapped)
swapped = 0
if(gap > 1)
gap = round(gap / 1.3) // 1.3 is the emperic comb sort coefficient
@@ -879,4 +883,4 @@ proc/sort_atoms_by_layer(var/list/atoms)
if(J) //Only set the icon if it succeeded, the icon without the pixel is 1000x better than a black square.
icon = J
return J
- return 0
\ No newline at end of file
+ return 0
diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm
index 948602def06..29ccb098cb9 100644
--- a/code/__HELPERS/lists.dm
+++ b/code/__HELPERS/lists.dm
@@ -12,17 +12,17 @@
//Returns a list in plain english as a string
/proc/english_list(var/list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" )
var/total = input.len
- if (!total)
+ if(!total)
return "[nothing_text]"
- else if (total == 1)
+ else if(total == 1)
return "[input[1]]"
- else if (total == 2)
+ else if(total == 2)
return "[input[1]][and_text][input[2]]"
else
var/output = ""
var/index = 1
- while (index < total)
- if (index == total - 1)
+ while(index < total)
+ if(index == total - 1)
comma_text = final_comma_text
output += "[input[index]][comma_text]"
@@ -107,22 +107,22 @@
/proc/pickweight(list/L)
var/total = 0
var/item
- for (item in L)
- if (!L[item])
+ for(item in L)
+ if(!L[item])
L[item] = 1
total += L[item]
total = rand(1, total)
- for (item in L)
+ for(item in L)
total -=L [item]
- if (total <= 0)
+ if(total <= 0)
return item
return null
//Pick a random element from the list and remove it from the list.
/proc/pick_n_take(list/listfrom)
- if (listfrom.len > 0)
+ if(listfrom.len > 0)
var/picked = pick(listfrom)
listfrom -= picked
return picked
@@ -130,7 +130,7 @@
//Returns the top(last) element from the list and removes it from the list (typical stack function)
/proc/pop(list/listfrom)
- if (listfrom.len > 0)
+ if(listfrom.len > 0)
var/picked = listfrom[listfrom.len]
listfrom.len--
return picked
@@ -386,6 +386,16 @@
//log_to_dd(" output: [out.len]")
return reverselist(out)
+//Copies a list, and all lists inside it recusively
+//Does not copy any other reference type
+/proc/deepCopyList(list/l)
+ if(!islist(l))
+ return l
+ . = l.Copy()
+ for(var/i = 1 to l.len)
+ if(islist(.[i]))
+ .[i] = .(.[i])
+
/proc/dd_sortedObjectList(var/list/L, var/cache=list())
if(L.len < 2)
return L
@@ -459,22 +469,22 @@ proc/dd_sortedObjectList(list/incoming)
var/list/list_bottom
var/current_sort_object
- for (current_sort_object in incoming)
+ for(current_sort_object in incoming)
low_index = 1
high_index = sorted_list.len
- while (low_index <= high_index)
+ while(low_index <= high_index)
// Figure out the midpoint, rounding up for fractions. (BYOND rounds down, so add 1 if necessary.)
midway_calc = (low_index + high_index) / 2
current_index = round(midway_calc)
- if (midway_calc > current_index)
+ if(midway_calc > current_index)
current_index++
current_item = sorted_list[current_index]
current_item_value = current_item:dd_SortValue()
current_sort_object_value = current_sort_object:dd_SortValue()
- if (current_sort_object_value < current_item_value)
+ if(current_sort_object_value < current_item_value)
high_index = current_index - 1
- else if (current_sort_object_value > current_item_value)
+ else if(current_sort_object_value > current_item_value)
low_index = current_index + 1
else
// current_sort_object == current_item
@@ -485,7 +495,7 @@ proc/dd_sortedObjectList(list/incoming)
insert_index = low_index
// Special case adding to end of list.
- if (insert_index > sorted_list.len)
+ if(insert_index > sorted_list.len)
sorted_list += current_sort_object
continue
@@ -515,28 +525,28 @@ proc/dd_sortedObjectList(list/incoming)
var/sort_result
var/current_sort_text
- for (current_sort_text in incoming)
+ for(current_sort_text in incoming)
low_index = 1
high_index = sorted_text.len
- while (low_index <= high_index)
+ while(low_index <= high_index)
// Figure out the midpoint, rounding up for fractions. (BYOND rounds down, so add 1 if necessary.)
midway_calc = (low_index + high_index) / 2
current_index = round(midway_calc)
- if (midway_calc > current_index)
+ if(midway_calc > current_index)
current_index++
current_item = sorted_text[current_index]
- if (case_sensitive)
+ if(case_sensitive)
sort_result = sorttextEx(current_sort_text, current_item)
else
sort_result = sorttext(current_sort_text, current_item)
switch(sort_result)
- if (1)
+ if(1)
high_index = current_index - 1 // current_sort_text < current_item
- if (-1)
+ if(-1)
low_index = current_index + 1 // current_sort_text > current_item
- if (0)
+ if(0)
low_index = current_index // current_sort_text == current_item
break
@@ -544,7 +554,7 @@ proc/dd_sortedObjectList(list/incoming)
insert_index = low_index
// Special case adding to end of list.
- if (insert_index > sorted_text.len)
+ if(insert_index > sorted_text.len)
sorted_text += current_sort_text
continue
diff --git a/code/__HELPERS/logging.dm b/code/__HELPERS/logging.dm
index 5d2427603c7..ce6ce9d7650 100644
--- a/code/__HELPERS/logging.dm
+++ b/code/__HELPERS/logging.dm
@@ -21,12 +21,12 @@
/proc/log_admin(text)
admin_log.Add(text)
- if (config.log_admin)
+ if(config.log_admin)
diary << "\[[time_stamp()]]ADMIN: [text]"
/proc/log_debug(text)
- if (config.log_debug)
+ if(config.log_debug)
diary << "\[[time_stamp()]]DEBUG: [text]"
for(var/client/C in admins)
@@ -35,55 +35,55 @@
/proc/log_game(text)
- if (config.log_game)
+ if(config.log_game)
diary << "\[[time_stamp()]]GAME: [text]"
/proc/log_vote(text)
- if (config.log_vote)
+ if(config.log_vote)
diary << "\[[time_stamp()]]VOTE: [text]"
/proc/log_access(text)
- if (config.log_access)
+ if(config.log_access)
diary << "\[[time_stamp()]]ACCESS: [text]"
/proc/log_say(text)
- if (config.log_say)
+ if(config.log_say)
diary << "\[[time_stamp()]]SAY: [text]"
/proc/log_ooc(text)
- if (config.log_ooc)
+ if(config.log_ooc)
diary << "\[[time_stamp()]]OOC: [text]"
/proc/log_whisper(text)
- if (config.log_whisper)
+ if(config.log_whisper)
diary << "\[[time_stamp()]]WHISPER: [text]"
/proc/log_emote(text)
- if (config.log_emote)
+ if(config.log_emote)
diary << "\[[time_stamp()]]EMOTE: [text]"
/proc/log_attack(text)
- if (config.log_attack)
+ if(config.log_attack)
diary << "\[[time_stamp()]]ATTACK: [text]" //Seperate attack logs? Why?
/proc/log_adminsay(text)
- if (config.log_adminchat)
+ if(config.log_adminchat)
diary << "\[[time_stamp()]]ADMINSAY: [text]"
/proc/log_adminwarn(text)
- if (config.log_adminwarn)
+ if(config.log_adminwarn)
diary << "\[[time_stamp()]]ADMINWARN: [text]"
/proc/log_pda(text)
- if (config.log_pda)
+ if(config.log_pda)
diary << "\[[time_stamp()]]PDA: [text][log_end]"
/proc/log_misc(text)
diary << "\[[time_stamp()]]MISC: [text][log_end]"
/proc/log_to_dd(text)
- world.log << text //this comes before the config check because it can't possibly runtime
- if(config.log_world_output)
+ world.log << text
+ if(config && config.log_world_output)
diary << "\[[time_stamp()]]DD_OUTPUT: [text][log_end]"
/**
@@ -93,6 +93,12 @@
to_chat(world, "[message] ")
log_to_dd(message)
+// A logging proc that only outputs after setup is done, to
+// help devs test initialization stuff that happens a lot
+/proc/log_after_setup(var/message)
+ if(ticker && ticker.current_state > GAME_STATE_SETTING_UP)
+ to_chat(world, "[message] ")
+ log_to_dd(message)
// Helper procs for building detailed log lines
/proc/datum_info_line(var/datum/d)
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 9657f867b5a..4bc41808b96 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -116,7 +116,7 @@ proc/random_skin_tone(species = "Human")
proc/skintone2racedescription(tone, species = "Human")
if(species == "Human")
- switch (tone)
+ switch(tone)
if(30 to INFINITY) return "albino"
if(20 to 30) return "pale"
if(5 to 15) return "light skinned"
@@ -171,7 +171,7 @@ proc/add_logs(mob/target, mob/user, what_done, var/object=null, var/addition=nul
target.attack_log += text("\[[time_stamp()]\] Has been [what_done] by [key_name(user)][object ? " with [object]" : " "][addition] ")
if(admin)
log_attack("[key_name(user)] [what_done] [key_name(target)][object ? " with [object]" : " "][addition] ")
- if(target.client)
+ if(istype(target) && target.client)
if(what_done in ignore) return
if(target == user)return
if(!admin) return
@@ -190,15 +190,15 @@ proc/add_logs(mob/target, mob/user, what_done, var/object=null, var/addition=nul
var/holding = user.get_active_hand()
var/datum/progressbar/progbar
- if (progress)
+ if(progress)
progbar = new(user, time, target)
var/endtime = world.time+time
var/starttime = world.time
. = 1
- while (world.time < endtime)
+ while(world.time < endtime)
sleep(1)
- if (progress)
+ if(progress)
progbar.update(world.time - starttime)
if(!user || !target)
. = 0
@@ -213,7 +213,7 @@ proc/add_logs(mob/target, mob/user, what_done, var/object=null, var/addition=nul
if((!drifting && user.loc != user_loc) || target.loc != target_loc || user.get_active_hand() != holding || user.incapacitated() || user.lying )
. = 0
break
- if (progress)
+ if(progress)
qdel(progbar)
/proc/do_after(mob/user, delay, needhand = 1, atom/target = null, progress = 1)
@@ -236,15 +236,15 @@ proc/add_logs(mob/target, mob/user, what_done, var/object=null, var/addition=nul
holdingnull = 0 //Users hand started holding something, check to see if it's still holding that
var/datum/progressbar/progbar
- if (progress)
+ if(progress)
progbar = new(user, delay, target)
var/endtime = world.time + delay
var/starttime = world.time
. = 1
- while (world.time < endtime)
+ while(world.time < endtime)
sleep(1)
- if (progress)
+ if(progress)
progbar.update(world.time - starttime)
if(drifting && !user.inertia_dir)
@@ -269,5 +269,5 @@ proc/add_logs(mob/target, mob/user, what_done, var/object=null, var/addition=nul
if(user.get_active_hand() != holding)
. = 0
break
- if (progress)
+ if(progress)
qdel(progbar)
\ No newline at end of file
diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm
index be0b6bbf245..6b90ace2489 100644
--- a/code/__HELPERS/names.dm
+++ b/code/__HELPERS/names.dm
@@ -1,13 +1,13 @@
var/church_name = null
/proc/church_name()
- if (church_name)
+ if(church_name)
return church_name
var/name = ""
name += pick("Holy", "United", "First", "Second", "Last")
- if (prob(20))
+ if(prob(20))
name += " Space"
name += " " + pick("Church", "Cathedral", "Body", "Worshippers", "Movement", "Witnesses")
@@ -17,7 +17,7 @@ var/church_name = null
var/command_name = null
/proc/command_name()
- if (command_name)
+ if(command_name)
return command_name
var/name = "Central Command"
@@ -33,7 +33,7 @@ var/command_name = null
var/religion_name = null
/proc/religion_name()
- if (religion_name)
+ if(religion_name)
return religion_name
var/name = ""
@@ -47,12 +47,12 @@ var/religion_name = null
return "Nyx"
/proc/station_name()
- if (station_name)
+ if(station_name)
return station_name
var/name = ""
- if (config && config.server_name)
+ if(config && config.server_name)
world.name = "[config.server_name]: [name]"
else
world.name = station_name
@@ -65,7 +65,7 @@ var/religion_name = null
var/new_station_name = ""
//Rare: Pre-Prefix
- if (prob(10))
+ if(prob(10))
name = pick("Imperium", "Heretical", "Cuban", "Psychic", "Elegant", "Common", "Uncommon", "Rare", "Unique", "Houseruled", "Religious", "Atheist", "Traditional", "Houseruled", "Mad", "Super", "Ultra", "Secret", "Top Secret", "Deep", "Death", "Zybourne", "Central", "Main", "Government", "Uoi", "Fat", "Automated", "Experimental", "Augmented")
new_station_name = name + " "
name = ""
@@ -107,7 +107,7 @@ var/religion_name = null
station_name = name
- if (config && config.server_name)
+ if(config && config.server_name)
world.name = "[config.server_name]: [name]"
else
world.name = name
@@ -116,7 +116,7 @@ var/religion_name = null
var/syndicate_name = null
/proc/syndicate_name()
- if (syndicate_name)
+ if(syndicate_name)
return syndicate_name
var/name = ""
@@ -125,11 +125,11 @@ var/syndicate_name = null
name += pick("Clandestine", "Prima", "Blue", "Zero-G", "Max", "Blasto", "Waffle", "North", "Omni", "Newton", "Cyber", "Bonk", "Gene", "Gib")
// Suffix
- if (prob(80))
+ if(prob(80))
name += " "
// Full
- if (prob(60))
+ if(prob(60))
name += pick("Syndicate", "Consortium", "Collective", "Corporation", "Group", "Holdings", "Biotech", "Industries", "Systems", "Products", "Chemicals", "Enterprises", "Family", "Creations", "International", "Intergalactic", "Interplanetary", "Foundation", "Positronics", "Hive")
// Broken
else
@@ -175,7 +175,7 @@ var/syndicate_code_response//Code response for traitors.
var/safety[] = list(1,2,3)//Tells the proc which options to remove later on.
var/nouns[] = list("love","hate","anger","peace","pride","sympathy","bravery","loyalty","honesty","integrity","compassion","charity","success","courage","deceit","skill","beauty","brilliance","pain","misery","beliefs","dreams","justice","truth","faith","liberty","knowledge","thought","information","culture","trust","dedication","progress","education","hospitality","leisure","trouble","friendships", "relaxation")
- var/drinks[] = list("vodka and tonic","gin fizz","bahama mama","manhattan","black Russian","whiskey soda","long island tea","margarita","Irish coffee"," manly dwarf","Irish cream","doctor's delight","Beepksy Smash","tequilla sunrise","brave bull","gargle blaster","bloody mary","whiskey cola","white Russian","vodka martini","martini","Cuba libre","kahlua","vodka","wine","moonshine")
+ var/drinks[] = list("vodka and tonic","gin fizz","bahama mama","manhattan","black Russian","whiskey soda","long island tea","margarita","Irish coffee"," manly dwarf","Irish cream","doctor's delight","Beepksy Smash","tequila sunrise","brave bull","gargle blaster","bloody mary","whiskey cola","white Russian","vodka martini","martini","Cuba libre","kahlua","vodka","wine","moonshine")
var/locations[] = teleportlocs.len ? teleportlocs : drinks//if null, defaults to drinks instead.
var/names[] = list()
@@ -239,7 +239,7 @@ var/syndicate_code_response//Code response for traitors.
set name = "Generate Code Phrase"
set category = "Debug"
- to_chat(world, "\red Code Phrase is: \black [generate_code_phrase()]")
+ to_chat(world, "Code Phrase is: [generate_code_phrase()]")
return
@@ -269,7 +269,7 @@ var/syndicate_code_response//Code response for traitors.
else
syndicate_code_phrase += pick("One")
syndicate_code_phrase += " "
- syndicate_code_phrase += pick("vodka and tonic","gin fizz","bahama mama","manhattan","black Russian","whiskey soda","long island tea","margarita","Irish coffee"," manly dwarf","Irish cream","doctor's delight","Beepksy Smash","tequilla sunrise","brave bull","gargle blaster","bloody mary","whiskey cola","white Russian","vodka martini","martini","Cuba libre","kahlua","vodka","wine","moonshine")
+ syndicate_code_phrase += pick("vodka and tonic","gin fizz","bahama mama","manhattan","black Russian","whiskey soda","long island tea","margarita","Irish coffee"," manly dwarf","Irish cream","doctor's delight","Beepksy Smash","tequila sunrise","brave bull","gargle blaster","bloody mary","whiskey cola","white Russian","vodka martini","martini","Cuba libre","kahlua","vodka","wine","moonshine")
syndicate_code_phrase += "."
if(4)
syndicate_code_phrase += pick("I wish I was","My dad was","His mom was","Where do I find","The hero this station needs is","I'd fuck","I wouldn't trust","Someone caught","HoS caught","Someone found","I'd wrestle","I wanna kill")
diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm
index f490f71df43..5020693a499 100644
--- a/code/__HELPERS/sanitize_values.dm
+++ b/code/__HELPERS/sanitize_values.dm
@@ -62,6 +62,6 @@
// Calls the above proc on each entry of a list to ensure its entries are clean
/proc/sql_sanitize_text_list(var/list/l)
var/list/new_list = l.Copy()
- for (var/text in new_list)
+ for(var/text in new_list)
sql_sanitize_text(text)
return new_list
\ No newline at end of file
diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm
index 59784a357e0..b17cda4e560 100644
--- a/code/__HELPERS/text.dm
+++ b/code/__HELPERS/text.dm
@@ -154,15 +154,15 @@
proc/checkhtml(var/t)
t = sanitize_simple(t, list(""="."))
var/p = findtext(t,"<",1)
- while (p) //going through all the tags
+ while(p) //going through all the tags
var/start = p++
var/tag = copytext(t,p, p+1)
- if (tag != "/")
- while (reject_bad_text(copytext(t, p, p+1), 1))
+ if(tag != "/")
+ while(reject_bad_text(copytext(t, p, p+1), 1))
tag = copytext(t,start, p)
p++
tag = copytext(t,start+1, p)
- if (!(tag in paper_tag_whitelist)) //if it's unkown tag, disarming it
+ if(!(tag in paper_tag_whitelist)) //if it's unkown tag, disarming it
t = copytext(t,1,start-1) + "<" + copytext(t,start+1)
p = findtext(t,"<",p)
return t
@@ -218,7 +218,7 @@ proc/checkhtml(var/t)
//Adds 'u' number of zeros ahead of the text 't'
/proc/add_zero(t, u)
- while (length(t) < u)
+ while(length(t) < u)
t = "0[t]"
return t
@@ -236,15 +236,15 @@ proc/checkhtml(var/t)
//Returns a string with reserved characters and spaces before the first letter removed
/proc/trim_left(text)
- for (var/i = 1 to length(text))
- if (text2ascii(text, i) > 32)
+ for(var/i = 1 to length(text))
+ if(text2ascii(text, i) > 32)
return copytext(text, i)
return ""
//Returns a string with reserved characters and spaces after the last letter removed
/proc/trim_right(text)
- for (var/i = length(text), i > 0, i--)
- if (text2ascii(text, i) > 32)
+ for(var/i = length(text), i > 0, i--)
+ if(text2ascii(text, i) > 32)
return copytext(text, 1, i + 1)
return ""
@@ -371,4 +371,22 @@ proc/checkhtml(var/t)
//If you have a problem with sanitize() in chat, when quotes and >, < are displayed as html entites -
//this is a problem of double-encode(when & becomes &), use sanitize() with encode=0, but not the sanitizeSafe()!
/proc/sanitizeSafe(var/input, var/max_length = MAX_MESSAGE_LEN, var/encode = 1, var/trim = 1, var/extra = 1)
- return sanitize(replace_characters(input, list(">"=" ","<"=" ", "\""="'")), max_length, encode, trim, extra)
\ No newline at end of file
+ return sanitize(replace_characters(input, list(">"=" ","<"=" ", "\""="'")), max_length, encode, trim, extra)
+
+
+//Replaces \red \blue \green \b etc with span classes for to_chat
+/proc/replace_text_macro(match, code, rest)
+ var/regex/text_macro = new("(\\xFF.)(.*)$")
+ switch(code)
+ if("\red")
+ return "[text_macro.Replace(rest, /proc/replace_text_macro)] "
+ if("\blue", "\green")
+ return "[text_macro.Replace(rest, /proc/replace_text_macro)] "
+ if("\b")
+ return "[text_macro.Replace(rest, /proc/replace_text_macro)] "
+ else
+ return text_macro.Replace(rest, /proc/replace_text_macro)
+
+/proc/macro2html(text)
+ var/static/regex/text_macro = new("(\\xFF.)(.*)$")
+ return text_macro.Replace(text, /proc/replace_text_macro)
\ No newline at end of file
diff --git a/code/__HELPERS/time.dm b/code/__HELPERS/time.dm
index 4973de14b81..872f299479c 100644
--- a/code/__HELPERS/time.dm
+++ b/code/__HELPERS/time.dm
@@ -24,6 +24,7 @@
//Returns the world time in english
/proc/worldtime2text(time = world.time)
+ time = (round_start_time ? (time - round_start_time) : (time - world.time))
return "[round(time / 36000)+12]:[(time / 600 % 60) < 10 ? add_zero(time / 600 % 60, 1) : time / 600 % 60]"
/proc/time_stamp()
diff --git a/code/__HELPERS/timed_alerts.dm b/code/__HELPERS/timed_alerts.dm
index 929341c3fc0..97e92900288 100644
--- a/code/__HELPERS/timed_alerts.dm
+++ b/code/__HELPERS/timed_alerts.dm
@@ -10,9 +10,9 @@
var/ref_result
ref_result = ref_alert.timed_alert(src, question, title, time, choice1, choice2, choice3)
- if (!ref_result) ref_result = default
+ if(!ref_result) ref_result = default
- if (ref_alert) del(ref_alert)
+ if(ref_alert) del(ref_alert)
return ref_result
@@ -20,13 +20,13 @@
/mob/proc/timed_alert(question as text, title as text, default as text, time as num, \
choice1 as text, choice2 as text, choice3 as text)
- if (client) return client.timed_alert(question, title, default, time, choice1, choice2, choice3)
+ if(client) return client.timed_alert(question, title, default, time, choice1, choice2, choice3)
return
/timed_alert/proc/timed_alert(client/ref_client, question, title, time, choice1, choice2, choice3)
- if (!ref_client) return
+ if(!ref_client) return
spawn (time) del(src) // When src is deleted, the proc ends immediately. The alert itself closes.
var/ref_answer
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index 0dd40091e1e..005ef4c2fc9 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -10,7 +10,7 @@
//Returns an integer given a hex input
/proc/hex2num(hex)
- if (!( istext(hex) ))
+ if(!( istext(hex) ))
return
var/num = 0
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index ff4ee54b2e9..6cd28a20a32 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -26,11 +26,11 @@
//Inverts the colour of an HTML string
/proc/invertHTML(HTMLstring)
- if (!( istext(HTMLstring) ))
+ if(!( istext(HTMLstring) ))
CRASH("Given non-text argument!")
return
else
- if (length(HTMLstring) != 7)
+ if(length(HTMLstring) != 7)
CRASH("Given non-HTML argument!")
return
var/textr = copytext(HTMLstring, 2, 4)
@@ -42,11 +42,11 @@
textr = num2hex(255 - r)
textg = num2hex(255 - g)
textb = num2hex(255 - b)
- if (length(textr) < 2)
+ if(length(textr) < 2)
textr = text("0[]", textr)
- if (length(textg) < 2)
+ if(length(textg) < 2)
textr = text("0[]", textg)
- if (length(textb) < 2)
+ if(length(textb) < 2)
textr = text("0[]", textb)
return text("#[][][]", textr, textg, textb)
return
@@ -218,14 +218,14 @@ Turf and target are seperate in case you want to teleport some distance from a t
//Returns whether or not a player is a guest using their ckey as an input
/proc/IsGuestKey(key)
- if (findtext(key, "Guest-", 1, 7) != 1) //was findtextEx
+ if(findtext(key, "Guest-", 1, 7) != 1) //was findtextEx
return 0
var/i, ch, len = length(key)
- for (i = 7, i <= len, ++i)
+ for(i = 7, i <= len, ++i)
ch = text2ascii(key, i)
- if (ch < 48 || ch > 57)
+ if(ch < 48 || ch > 57)
return 0
return 1
@@ -234,7 +234,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
f = round(f)
f = max(low, f)
f = min(high, f)
- if ((f % 2) == 0) //Ensure the last digit is an odd number
+ if((f % 2) == 0) //Ensure the last digit is an odd number
f += 1
return f
@@ -248,7 +248,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
var/pressure = air_contents.return_pressure()
var/total_moles = air_contents.total_moles()
- to_chat(user, "Results of analysis of \icon[icon] [target]. ")
+ to_chat(user, "Results of analysis of [bicon(icon)] [target]. ")
if(total_moles>0)
var/o2_concentration = air_contents.oxygen/total_moles
var/n2_concentration = air_contents.nitrogen/total_moles
@@ -277,13 +277,13 @@ Turf and target are seperate in case you want to teleport some distance from a t
/proc/freeborg()
var/select = null
var/list/borgs = list()
- for (var/mob/living/silicon/robot/A in player_list)
- if (A.stat == 2 || A.connected_ai || A.scrambledcodes || istype(A,/mob/living/silicon/robot/drone))
+ for(var/mob/living/silicon/robot/A in player_list)
+ if(A.stat == 2 || A.connected_ai || A.scrambledcodes || istype(A,/mob/living/silicon/robot/drone))
continue
var/name = "[A.real_name] ([A.modtype] [A.braintype])"
borgs[name] = A
- if (borgs.len)
+ if(borgs.len)
select = input("Unshackled borg signals detected:", "Borg selection", null, null) as null|anything in borgs
return borgs[select]
@@ -352,15 +352,15 @@ Turf and target are seperate in case you want to teleport some distance from a t
var/list/namecounts = list()
for(var/mob/M in mobs)
var/name = M.name
- if (name in names)
+ if(name in names)
namecounts[name]++
name = "[name] ([namecounts[name]])"
else
names.Add(name)
namecounts[name] = 1
- if (M.real_name && M.real_name != M.name)
+ if(M.real_name && M.real_name != M.name)
name += " \[[M.real_name]\]"
- if (M.stat == 2)
+ if(M.stat == 2)
if(istype(M, /mob/dead/observer/))
name += " \[ghost\]"
else
@@ -679,13 +679,13 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl
var/src_min_x = 0
var/src_min_y = 0
- for (var/turf/T in turfs_src)
+ for(var/turf/T in turfs_src)
if(T.x < src_min_x || !src_min_x) src_min_x = T.x
if(T.y < src_min_y || !src_min_y) src_min_y = T.y
var/trg_min_x = 0
var/trg_min_y = 0
- for (var/turf/T in turfs_trg)
+ for(var/turf/T in turfs_trg)
if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x
if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y
@@ -709,9 +709,9 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl
var/list/toupdate = new/list()
moving:
- for (var/turf/T in refined_src)
+ for(var/turf/T in refined_src)
var/datum/coords/C_src = refined_src[T]
- for (var/turf/B in refined_trg)
+ for(var/turf/B in refined_trg)
var/datum/coords/C_trg = refined_trg[B]
if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos)
@@ -845,13 +845,13 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl
var/src_min_x = 0
var/src_min_y = 0
- for (var/turf/T in turfs_src)
+ for(var/turf/T in turfs_src)
if(T.x < src_min_x || !src_min_x) src_min_x = T.x
if(T.y < src_min_y || !src_min_y) src_min_y = T.y
var/trg_min_x = 0
var/trg_min_y = 0
- for (var/turf/T in turfs_trg)
+ for(var/turf/T in turfs_trg)
if(T.x < trg_min_x || !trg_min_x) trg_min_x = T.x
if(T.y < trg_min_y || !trg_min_y) trg_min_y = T.y
@@ -877,9 +877,9 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl
moving:
- for (var/turf/T in refined_src)
+ for(var/turf/T in refined_src)
var/datum/coords/C_src = refined_src[T]
- for (var/turf/B in refined_trg)
+ for(var/turf/B in refined_trg)
var/datum/coords/C_trg = refined_trg[B]
if(C_src.x_pos == C_trg.x_pos && C_src.y_pos == C_trg.y_pos)
@@ -990,33 +990,26 @@ proc/oview_or_orange(distance = world.view , center = usr , type)
proc/get_mob_with_client_list()
var/list/mobs = list()
for(var/mob/M in mob_list)
- if (M.client)
+ if(M.client)
mobs += M
return mobs
/proc/parse_zone(zone)
if(zone == "r_hand") return "right hand"
- else if (zone == "l_hand") return "left hand"
- else if (zone == "l_arm") return "left arm"
- else if (zone == "r_arm") return "right arm"
- else if (zone == "l_leg") return "left leg"
- else if (zone == "r_leg") return "right leg"
- else if (zone == "l_foot") return "left foot"
- else if (zone == "r_foot") return "right foot"
- else if (zone == "l_hand") return "left hand"
- else if (zone == "r_hand") return "right hand"
- else if (zone == "l_foot") return "left foot"
- else if (zone == "r_foot") return "right foot"
+ else if(zone == "l_hand") return "left hand"
+ else if(zone == "l_arm") return "left arm"
+ else if(zone == "r_arm") return "right arm"
+ else if(zone == "l_leg") return "left leg"
+ else if(zone == "r_leg") return "right leg"
+ else if(zone == "l_foot") return "left foot"
+ else if(zone == "r_foot") return "right foot"
+ else if(zone == "l_hand") return "left hand"
+ else if(zone == "r_hand") return "right hand"
+ else if(zone == "l_foot") return "left foot"
+ else if(zone == "r_foot") return "right foot"
else return zone
-
-/proc/get_turf(atom/A)
- if (!istype(A))
- return
- for(A, A && !isturf(A), A=A.loc); //semicolon is for the empty statement
- return A
-
//Finds the distance between two atoms, in pixels
//centered = 0 counts from turf edge to edge
//centered = 1 counts from turf center to turf center
@@ -1146,15 +1139,15 @@ var/global/list/common_tools = list(
//Whether or not the given item counts as sharp in terms of dealing damage
/proc/is_sharp(obj/O as obj)
- if (!O) return 0
- if (O.sharp) return 1
- if (O.edge) return 1
+ if(!O) return 0
+ if(O.sharp) return 1
+ if(O.edge) return 1
return 0
//Whether or not the given item counts as cutting with an edge in terms of removing limbs
/proc/has_edge(obj/O as obj)
- if (!O) return 0
- if (O.edge) return 1
+ if(!O) return 0
+ if(O.edge) return 1
return 0
//Returns 1 if the given item is capable of popping things like balloons, inflatable barriers, or cutting police tape.
@@ -1528,7 +1521,7 @@ var/mob/dview/dview_mob = new
lastloc = loc
sleep(0.6)
- if (orbiting == A) //make sure we haven't started orbiting something else.
+ if(orbiting == A) //make sure we haven't started orbiting something else.
orbiting = null
SpinAnimation(0,0)
@@ -1679,7 +1672,7 @@ var/mob/dview/dview_mob = new
/proc/pick_closest_path(value)
var/list/matches = get_fancy_list_of_types()
- if (!isnull(value) && value!="")
+ if(!isnull(value) && value!="")
matches = filter_fancy_list(matches, value)
if(matches.len==0)
@@ -1713,13 +1706,13 @@ var/list/TYPES_SHORTCUTS = list(
var/global/list/g_fancy_list_of_types = null
/proc/get_fancy_list_of_types()
- if (isnull(g_fancy_list_of_types)) //init
+ if(isnull(g_fancy_list_of_types)) //init
var/list/temp = sortList(subtypesof(/atom) - typesof(/area) - /atom/movable)
g_fancy_list_of_types = new(temp.len)
for(var/type in temp)
var/typename = "[type]"
- for (var/tn in TYPES_SHORTCUTS)
- if (copytext(typename,1, length("[tn]/")+1)=="[tn]/" /*findtextEx(typename,"[tn]/",1,2)*/ )
+ for(var/tn in TYPES_SHORTCUTS)
+ if(copytext(typename,1, length("[tn]/")+1)=="[tn]/" /*findtextEx(typename,"[tn]/",1,2)*/ )
typename = TYPES_SHORTCUTS[tn]+copytext(typename,length("[tn]/"))
break
g_fancy_list_of_types[typename] = type
@@ -1733,18 +1726,14 @@ var/global/list/g_fancy_list_of_types = null
matches[key] = value
return matches
-// Use this to send to a client's chat, no exceptions (except this proc itself).
-/proc/to_chat(var/thing, var/output)
- thing << output
-
//Key thing that stops lag. Cornerstone of performance in ss13, Just sitting here, in unsorted.dm.
/proc/stoplag()
. = 1
sleep(world.tick_lag)
- if (world.tick_usage > TICK_LIMIT_TO_RUN) //woke up, still not enough tick, sleep for more.
+ if(world.tick_usage > TICK_LIMIT_TO_RUN) //woke up, still not enough tick, sleep for more.
. += 2
sleep(world.tick_lag*2)
- if (world.tick_usage > TICK_LIMIT_TO_RUN) //woke up, STILL not enough tick, sleep for more.
+ if(world.tick_usage > TICK_LIMIT_TO_RUN) //woke up, STILL not enough tick, sleep for more.
. += 4
sleep(world.tick_lag*4)
//you might be thinking of adding more steps to this, or making it use a loop and a counter var
diff --git a/code/_compile_options.dm b/code/_compile_options.dm
index cac93fdbaf6..5e9d9462d7f 100644
--- a/code/_compile_options.dm
+++ b/code/_compile_options.dm
@@ -20,3 +20,6 @@ This may require updating to a beta release.
#endif
var/global/list/processing_objects = list() //This has to be initialized BEFORE world
+
+// Macros that must exist before world.dm
+#define to_chat to_chat_filename=__FILE__;to_chat_line=__LINE__;to_chat_src=src;__to_chat
diff --git a/code/_globalvars/genetics.dm b/code/_globalvars/genetics.dm
index b642b034921..73b2b7304f6 100644
--- a/code/_globalvars/genetics.dm
+++ b/code/_globalvars/genetics.dm
@@ -53,7 +53,6 @@ var/CHAMELEONBLOCK = 0
var/CRYOBLOCK = 0
var/EATBLOCK = 0
var/JUMPBLOCK = 0
-//var/MELTBLOCK = 0
var/EMPATHBLOCK = 0
var/SUPERFARTBLOCK = 0
var/IMMOLATEBLOCK = 0
@@ -63,7 +62,6 @@ var/POLYMORPHBLOCK = 0
// /vg/ Mutations
///////////////////////////////
var/LOUDBLOCK = 0
-//var/WHISPERBLOCK = 0
var/DIZZYBLOCK = 0
var/list/reg_dna = list( ) //this appears to be a list of UE == real_name correlations
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index ba8513981ea..d409d6e54c9 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -42,6 +42,6 @@ var/list/TAGGERLOCATIONS = list("Disposals",
"Atmospherics", "HoS Office", "Security", "Medbay",
"CMO Office", "Chemistry", "Research", "RD Office",
"Robotics", "HoP Office", "Library", "Chapel", "Captain's Office",
- "Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics")
+ "Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics","Brig Physician")
var/list/hit_appends = list("-OOF", "-ACK", "-UGH", "-HRNK", "-HURGH", "-GLORF")
\ No newline at end of file
diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm
index 0511286268e..4cdc0bef33d 100644
--- a/code/_globalvars/lists/misc.dm
+++ b/code/_globalvars/lists/misc.dm
@@ -7,12 +7,6 @@ var/global/list/binary = list("0","1")
var/global/list/day_names = list("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
var/global/list/month_names = list("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")
-//Reagent stuff
-var/list/tachycardics = list("coffee", "methamphetamine", "nitroglycerin", "thirteenloko", "nicotine") //increase heart rate
-var/list/bradycardics = list("neurotoxin", "cryoxadone", "space_drugs") //decrease heart rate
-var/list/heartstopper = list("capulettium", "capulettium_plus") //this stops the heart
-var/list/cheartstopper = list() //this stops the heart when overdose is met -- c = conditional
-
var/list/restricted_camera_networks = list( //Those networks can only be accessed by preexisting terminals. AIs and new terminals can't use them.
"CentComm",
"ERT",
@@ -20,8 +14,8 @@ var/list/restricted_camera_networks = list( //Those networks can only be accesse
"Thunderdome",
"UO45",
"UO45R",
- "Xeno"
+ "Xeno",
+ "Hotel"
)
-var/list/map_templates = list()
-var/list/mineral_turfs = list()
\ No newline at end of file
+var/list/mineral_turfs = list()
diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm
index e1e8b818356..b6dc1c58b8f 100644
--- a/code/_globalvars/lists/mobs.dm
+++ b/code/_globalvars/lists/mobs.dm
@@ -4,7 +4,6 @@ var/global/list/all_languages[0]
var/global/list/language_keys[0] // Table of say codes for all languages
var/global/list/all_superheroes[0]
var/global/list/all_nations[0]
-var/global/list/emotes[0]
var/global/list/whitelisted_species = list()
var/list/clients = list() //list of all clients
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index ec3be384bad..9204d5ec524 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -11,7 +11,7 @@ var/global/list/joblist = list() //list of all jobstypes, minus borg and AI
var/global/list/airlocks = list() //list of all airlocks
var/global/list/singularities = list() //list of all singularities
var/global/list/janitorial_equipment = list() //list of janitorial equipment
-var/global/list/table_recipes = list() //list of all table craft recipes
+var/global/list/crafting_recipes = list() //list of all crafting recipes
var/global/list/all_areas = list()
var/global/list/machines = list()
@@ -30,4 +30,4 @@ var/global/list/beacons = list()
var/global/list/shuttle_caller_list = list() //list of all communication consoles and AIs, for automatic shuttle calls when there are none.
var/global/list/tracked_implants = list() //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented...
var/global/list/abductor_equipment = list() //list of all abductor equipment
-var/global/list/global_intercoms = list() //list of all intercomms, across all z-levels
\ No newline at end of file
+var/global/list/global_intercoms = list() //list of all intercomms, across all z-levels
diff --git a/code/_globalvars/lists/reagents.dm b/code/_globalvars/lists/reagents.dm
index 8417275d780..4b9786a86df 100644
--- a/code/_globalvars/lists/reagents.dm
+++ b/code/_globalvars/lists/reagents.dm
@@ -34,10 +34,10 @@ var/list/drinks = list("beer2","hot_coco","orangejuice","tomatojuice","limejuice
"nothing","potato","milk","soymilk","cream","coffee","tea","icecoffee",
"icetea","cola","nuka_cola","spacemountainwind","thirteenloko","dr_gibb",
"space_up","lemon_lime","beer","whiskey","gin","rum","vodka","holywater",
- "tequilla","vermouth","wine","tonic","kahlua","cognac","ale","sodawater",
+ "tequila","vermouth","wine","tonic","kahlua","cognac","ale","sodawater",
"ice","bilk","atomicbomb","threemileisland","goldschlager","patron","gintonic",
"cubalibre","whiskeycola","martini","vodkamartini","whiterussian","screwdrivercocktail",
- "booger","bloodymary","gargleblaster","bravebull","tequillasunrise","toxinsspecial",
+ "booger","bloodymary","gargleblaster","bravebull","tequilasunrise","toxinsspecial",
"beepskysmash","salglu_solution","irishcream","manlydorf","longislandicedtea",
"moonshine","b52","irishcoffee","margarita","blackrussian","manhattan",
"manhattan_proj","whiskeysoda","antifreeze","barefoot","snowwhite","demonsblood",
@@ -58,4 +58,9 @@ var/global/list/blocked_chems = list("polonium", "initropidril", "concentrated_i
"reagent", "life","dragonsbreath")
//List of chems/mixtures that can't grow in plants (in addition to the global random chem blacklist)
-var/global/list/plant_blocked_chems = list() //filled in /datum/reagents/New() with chems that have can_grow_in_plants = 0
\ No newline at end of file
+var/global/list/plant_blocked_chems = list() //filled in /datum/reagents/New() with chems that have can_grow_in_plants = 0
+
+var/global/list/safe_chem_list = list("antihol", "charcoal", "epinephrine", "insulin", "teporone","silver_sulfadiazine", "salbutamol",
+ "omnizine", "stimulants", "synaptizine", "potass_iodide", "oculine", "mannitol", "styptic_powder",
+ "spaceacillin", "salglu_solution", "sal_acid", "cryoxadone", "blood", "synthflesh", "hydrocodone",
+ "mitocholide", "rezadone")
\ No newline at end of file
diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm
index d975491a15c..e4223fcee55 100644
--- a/code/_globalvars/logging.dm
+++ b/code/_globalvars/logging.dm
@@ -12,3 +12,5 @@ var/list/combatlog = list()
var/list/IClog = list()
var/list/OOClog = list()
var/list/adminlog = list()
+
+var/list/investigate_log_subjects = list("notes", "watchlist", "hrefs")
diff --git a/code/_globalvars/mapping.dm b/code/_globalvars/mapping.dm
index 1810bff0b47..891dbc05b24 100644
--- a/code/_globalvars/mapping.dm
+++ b/code/_globalvars/mapping.dm
@@ -37,6 +37,7 @@ var/list/latejoin_cyborg = list()
var/list/prisonwarp = list() //prisoners go to these
var/list/holdingfacility = list() //captured people go here
var/list/xeno_spawn = list()//Aliens spawn at these.
+var/list/ertdirector = list()
// list/mazewarp = list()
var/list/tdome1 = list()
var/list/tdome2 = list()
@@ -53,3 +54,10 @@ var/list/carplist = list() //list of all carp-spawn landmarks
//away missions
var/list/awaydestinations = list() //a list of landmarks that the warpgate can take you to
+
+//List of preloaded templates
+var/list/datum/map_template/map_templates = list()
+
+var/list/datum/map_template/ruins_templates = list()
+var/list/datum/map_template/space_ruins_templates = list()
+//var/list/datum/map_template/lava_ruins_templates = list()
diff --git a/code/_hooks/area.dm b/code/_hooks/area.dm
deleted file mode 100644
index 6b2834af165..00000000000
--- a/code/_hooks/area.dm
+++ /dev/null
@@ -1,4 +0,0 @@
-// Called when a mob moves from one MASTER area to another.
-// (Master, as opposed to lighting subareas)
-/hook/mobAreaChange
- name = "MobAreaChange"
\ No newline at end of file
diff --git a/code/_hooks/hooks.dm b/code/_hooks/hooks.dm
deleted file mode 100644
index b78526bfc2b..00000000000
--- a/code/_hooks/hooks.dm
+++ /dev/null
@@ -1,54 +0,0 @@
-/************
- * D2K5-STYLE HOOKS
- *
- * BLATANTLY STOLEN FROM D2K5 AND MODIFIED
- *
- * SOMEHOW SUCKS LESS THAN BAY'S HOOKS
- ************
-
- The major change is to standardize them a bit
- by changing the event prefix to On instead of Hook.
-
- Oh and it's documented and cleaned up. - N3X
- */
-
-/hook
- var/name = "DefaultHookName"
- var/list/handlers = list()
-
- proc/Called(var/list/args) // When the hook is called
- return 0
-
- proc/Setup() // Called when the setup things is ran for the hook, objs contain all objects with that is hooking
-
-/hook_handler
- // Your hook handler should do this:
- // proc/OnThingHappened(var/list/args)
- // return handled // boolean
-
-var/global/list/hooks = list()
-
-/proc/SetupHooks()
- for (var/hook_path in typesof(/hook))
- var/hook/hook = new hook_path
- hooks[hook.name] = hook
-// log_to_dd("Found hook: " + hook.name)
- for (var/hook_path in typesof(/hook_handler))
- var/hook_handler/hook_handler = new hook_path
- for (var/name in hooks)
- if (hascall(hook_handler, "On" + name))
- var/hook/hook = hooks[name]
- hook.handlers += hook_handler
-// log_to_dd("Found hook handler for: " + name)
- for (var/hook/hook in hooks)
- hook.Setup()
-
-/proc/CallHook(var/name as text, var/list/args)
- var/hook/hook = hooks[name]
- if (!hook)
- //log_to_dd("WARNING: Hook with name " + name + " does not exist")
- return
- if (hook.Called(args))
- return
- for (var/hook_handler/hook_handler in hook.handlers)
- call(hook_handler, "On" + hook.name)(args)
\ No newline at end of file
diff --git a/code/_hooks/mob.dm b/code/_hooks/mob.dm
deleted file mode 100644
index f0ea2952f57..00000000000
--- a/code/_hooks/mob.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/hook/login
- name = "Login"
\ No newline at end of file
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index db5a0bbcd0f..2579005af3d 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -131,7 +131,9 @@
Topic(src, list("src"= "\ref[src]", "command"="emergency", "activate" = "0"), 1)
return
-/atom/proc/AIShiftClick()
+/atom/proc/AIShiftClick(var/mob/user)
+ if(user.client)
+ user.examinate(src)
return
/obj/machinery/door/airlock/AIShiftClick() // Opens and closes doors!
diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm
index ecb7f00cd8b..1f60c26f885 100644
--- a/code/_onclick/cyborg.dm
+++ b/code/_onclick/cyborg.dm
@@ -139,7 +139,9 @@
/obj/machinery/door/airlock/BorgAltShiftClick() // Enables emergency override on doors! Forwards to AI code.
AIAltShiftClick()
-/atom/proc/BorgShiftClick()
+/atom/proc/BorgShiftClick(var/mob/user)
+ if(user.client && user.client.eye == user)
+ user.examinate(src)
return
/obj/machinery/door/airlock/BorgShiftClick() // Opens and closes doors! Forwards to AI code.
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 0050eb1db0f..c6137fd7081 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -35,14 +35,14 @@
#define ui_swaphand2 "CENTER: 16,SOUTH+1:5"
#define ui_storage1 "CENTER+1:18,SOUTH:5"
#define ui_storage2 "CENTER+2:20,SOUTH:5"
-
-#define ui_pda "CENTER+3:22,SOUTH:5"
+#define ui_crafting "12:-10,1:5"
#define ui_alien_head "4:12,1:5" //aliens
#define ui_alien_oclothing "5:14,1:5" //aliens
#define ui_borg_sensor "CENTER-3:16, SOUTH:5" //borgs
#define ui_borg_lamp "CENTER-4:16, SOUTH:5" //borgs
+#define ui_borg_thrusters "CENTER-5:16, SOUTH:5"//borgs
#define ui_inv1 "CENTER-2:16,SOUTH:5" //borgs
#define ui_inv2 "CENTER-1 :16,SOUTH:5" //borgs
#define ui_inv3 "CENTER :16,SOUTH:5" //borgs
@@ -154,4 +154,4 @@
#define HUD_VERSIONS 3 //used in show_hud()
//1 = standard hud
//2 = reduced hud (just hands and intent switcher)
-//3 = no hud (for screenshots)
\ No newline at end of file
+//3 = no hud (for screenshots)
diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm
deleted file mode 100644
index 4744b789712..00000000000
--- a/code/_onclick/hud/action.dm
+++ /dev/null
@@ -1,315 +0,0 @@
-#define AB_ITEM 1
-#define AB_SPELL 2
-#define AB_INNATE 3
-#define AB_GENERIC 4
-
-#define AB_CHECK_RESTRAINED 1
-#define AB_CHECK_STUNNED 2
-#define AB_CHECK_LYING 4
-#define AB_CHECK_ALIVE 8
-#define AB_CHECK_INSIDE 16
-
-
-/datum/action
- var/name = "Generic Action"
- var/action_type = AB_ITEM
- var/procname = null
- var/atom/movable/target = null
- var/check_flags = 0
- var/processing = 0
- var/active = 0
- var/obj/screen/movable/action_button/button = null
- var/button_icon = 'icons/mob/actions.dmi'
- var/button_icon_state = "default"
- var/background_icon_state = "bg_default"
- var/mob/living/owner
-
-/datum/action/New(var/Target)
- target = Target
-
-/datum/action/Destroy()
- if(owner)
- Remove(owner)
- if(target)
- target = null
- return ..()
-
-/datum/action/proc/Grant(mob/living/T)
- if(owner)
- if(owner == T)
- return
- Remove(owner)
- owner = T
- owner.actions.Add(src)
- owner.update_action_buttons()
- return
-
-/datum/action/proc/Remove(mob/living/T)
- if(button)
- if(T.client)
- T.client.screen -= button
- qdel(button)
- button = null
- if(T.actions)
- T.actions.Remove(src)
- T.update_action_buttons()
- owner = null
- return
-
-/datum/action/proc/Trigger()
- if(!Checks())
- return
- switch(action_type)
- if(AB_ITEM)
- if(target)
- var/obj/item/item = target
- item.ui_action_click()
- if(AB_SPELL)
- if(target)
- var/obj/effect/proc_holder/spell = target
- spell.Click()
- if(AB_INNATE)
- if(!active)
- Activate()
- else
- Deactivate()
- if(AB_GENERIC)
- if(target && procname)
- call(target,procname)(usr)
- return
-
-/datum/action/proc/Activate()
- return
-
-/datum/action/proc/Deactivate()
- return
-
-/datum/action/proc/Process()
- return
-
-/datum/action/proc/CheckRemoval(mob/living/user) // 1 if action is no longer valid for this mob and should be removed
- return 0
-
-/datum/action/proc/IsAvailable()
- return Checks()
-
-/datum/action/proc/Checks()// returns 1 if all checks pass
- if(!owner)
- return 0
- if(check_flags & AB_CHECK_RESTRAINED)
- if(owner.restrained())
- return 0
- if(check_flags & AB_CHECK_STUNNED)
- if(owner.stunned)
- return 0
- if(check_flags & AB_CHECK_LYING)
- if(owner.lying)
- return 0
- if(check_flags & AB_CHECK_ALIVE)
- if(owner.stat)
- return 0
- if(check_flags & AB_CHECK_INSIDE)
- if(!(target in owner))
- return 0
- return 1
-
-/datum/action/proc/UpdateName()
- return name
-
-/obj/screen/movable/action_button
- var/datum/action/owner
- screen_loc = "WEST,NORTH"
-
-/obj/screen/movable/action_button/Click(location,control,params)
- var/list/modifiers = params2list(params)
- if(modifiers["shift"])
- moved = 0
- return 1
- if(usr.next_move >= world.time) // Is this needed ?
- return
- owner.Trigger()
- return 1
-
-/obj/screen/movable/action_button/proc/UpdateIcon()
- if(!owner)
- return
- icon = owner.button_icon
- icon_state = owner.background_icon_state
-
- overlays.Cut()
- var/image/img
- if(owner.action_type == AB_ITEM && owner.target)
- var/obj/item/I = owner.target
- img = image(I.icon, src , I.icon_state)
- else if(owner.button_icon && owner.button_icon_state)
- img = image(owner.button_icon,src,owner.button_icon_state)
- img.pixel_x = 0
- img.pixel_y = 0
- overlays += img
-
- if(!owner.IsAvailable())
- color = rgb(128,0,0,128)
- else
- color = rgb(255,255,255,255)
-
-//Hide/Show Action Buttons ... Button
-/obj/screen/movable/action_button/hide_toggle
- name = "Hide Buttons"
- icon = 'icons/mob/actions.dmi'
- icon_state = "bg_default"
- var/hidden = 0
-
-/obj/screen/movable/action_button/hide_toggle/Click()
- usr.hud_used.action_buttons_hidden = !usr.hud_used.action_buttons_hidden
-
- hidden = usr.hud_used.action_buttons_hidden
- if(hidden)
- name = "Show Buttons"
- else
- name = "Hide Buttons"
- UpdateIcon()
- usr.update_action_buttons()
-
-
-/obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(var/mob/living/user)
- if(isalien(user))
- icon_state = "bg_alien"
- else
- icon_state = "bg_default"
- UpdateIcon()
- return
-
-/obj/screen/movable/action_button/hide_toggle/UpdateIcon()
- overlays.Cut()
- var/image/img = image(icon,src,hidden?"show":"hide")
- overlays += img
- return
-
-//This is the proc used to update all the action buttons. Properly defined in /mob/living/
-/mob/proc/update_action_buttons()
- return
-
-#define AB_WEST_OFFSET 4
-#define AB_NORTH_OFFSET 26
-#define AB_MAX_COLUMNS 10
-
-/datum/hud/proc/ButtonNumberToScreenCoords(var/number) // TODO : Make this zero-indexed for readabilty
- var/row = round((number-1)/AB_MAX_COLUMNS)
- var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1
- var/coord_col = "+[col-1]"
- var/coord_col_offset = 4+2*col
- var/coord_row = "[-1 - row]"
- var/coord_row_offset = 26
- return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:[coord_row_offset]"
-
-/datum/hud/proc/SetButtonCoords(var/obj/screen/button,var/number)
- var/row = round((number-1)/AB_MAX_COLUMNS)
- var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1
- var/x_offset = 32*(col-1) + 4 + 2*col
- var/y_offset = -32*(row+1) + 26
-
- var/matrix/M = matrix()
- M.Translate(x_offset,y_offset)
- button.transform = M
-
-//Presets for item actions
-/datum/action/item_action
- check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_ALIVE|AB_CHECK_INSIDE
-
-/datum/action/item_action/CheckRemoval(mob/living/user)
- return get(target, /mob/living) != user
-
-/datum/action/item_action/hands_free
- check_flags = AB_CHECK_ALIVE|AB_CHECK_INSIDE
-
-// for clothing accessories like holsters
-/datum/action/item_action/accessory
- check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_ALIVE
-
-/datum/action/item_action/accessory/Checks()
- . = ..()
- if(!.)
- return 0
- if(target.loc == owner)
- return 1
- if(istype(target.loc, /obj/item/clothing/under) && target.loc.loc == owner)
- return 1
- return 0
-
-///prset for organ actions
-/datum/action/item_action/organ_action
- check_flags = AB_CHECK_ALIVE
-
-/datum/action/item_action/organ_action/CheckRemoval(mob/living/carbon/user)
- if(!iscarbon(user))
- return 1
- if(target in user.internal_organs)
- return 0
- return 1
-
-/datum/action/item_action/organ_action/IsAvailable()
- var/obj/item/organ/internal/I = target
- if(!I.owner)
- return 0
- return ..()
-
-//Preset for spells
-/datum/action/spell_action
- action_type = AB_SPELL
- check_flags = 0
- background_icon_state = "bg_spell"
-
-/datum/action/spell_action/UpdateName()
- var/obj/effect/proc_holder/spell/spell = target
- if(!spell)
- return 0
- return spell.name
-
-/datum/action/spell_action/IsAvailable()
- if(!target)
- return 0
- var/obj/effect/proc_holder/spell/spell = target
-
- if(usr)
- return spell.can_cast(usr)
- else
- if(owner)
- return spell.can_cast(owner)
- return 1
-
-/datum/action/spell_action/CheckRemoval()
- if(owner.mind)
- if(target in owner.mind.spell_list)
- return 0
- return !(target in owner.spell_list)
-
- //Action button controlling a mob's research examine ability.
-/datum/action/scan_mode
- name = "Toggle Research Scanner"
- button_icon_state = "scan_mode"
- check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_ALIVE
- action_type = AB_INNATE
- var/devices = 0 //How may enabled scanners the mob has
-
-/datum/action/scan_mode/Activate()
- active = 1
- owner.research_scanner = 1
- to_chat(owner, " Research analyzer is now active. ")
-
-/datum/action/scan_mode/Deactivate()
- active = 0
- owner.research_scanner = 0
- to_chat(owner, " Research analyzer deactivated. ")
-
-/datum/action/scan_mode/Grant(mob/living/T)
- devices += 1
- ..(T)
-
-/datum/action/scan_mode/CheckRemoval(mob/living/user)
- if(devices)
- return 0
- return 1
-
-/datum/action/scan_mode/Remove(mob/living/T)
- owner.research_scanner = 0
- ..(T)
diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm
new file mode 100644
index 00000000000..16cb8baa044
--- /dev/null
+++ b/code/_onclick/hud/action_button.dm
@@ -0,0 +1,127 @@
+
+/obj/screen/movable/action_button
+ var/datum/action/linked_action
+ screen_loc = null
+
+/obj/screen/movable/action_button/Click(location,control,params)
+ var/list/modifiers = params2list(params)
+ if(modifiers["shift"])
+ moved = 0
+ usr.update_action_buttons() //redraw buttons that are no longer considered "moved"
+ return 1
+ if(usr.next_move >= world.time) // Is this needed ?
+ return
+ linked_action.Trigger()
+ return 1
+
+//Hide/Show Action Buttons ... Button
+/obj/screen/movable/action_button/hide_toggle
+ name = "Hide Buttons"
+ icon = 'icons/mob/actions.dmi'
+ icon_state = "bg_default"
+ var/hidden = 0
+
+/obj/screen/movable/action_button/hide_toggle/Click(location,control,params)
+ var/list/modifiers = params2list(params)
+ if(modifiers["shift"])
+ moved = 0
+ return 1
+ usr.hud_used.action_buttons_hidden = !usr.hud_used.action_buttons_hidden
+
+ hidden = usr.hud_used.action_buttons_hidden
+ if(hidden)
+ name = "Show Buttons"
+ else
+ name = "Hide Buttons"
+ UpdateIcon()
+ usr.update_action_buttons()
+
+
+/obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(mob/living/user)
+ if(isalien(user))
+ icon_state = "bg_alien"
+ else
+ icon_state = "bg_default"
+ UpdateIcon()
+
+/obj/screen/movable/action_button/hide_toggle/proc/UpdateIcon()
+ overlays.Cut()
+ var/image/img = image(icon, src, hidden ? "show" : "hide")
+ overlays += img
+
+
+/obj/screen/movable/action_button/MouseEntered(location,control,params)
+ openToolTip(usr,src,params,title = name,content = desc)
+
+
+/obj/screen/movable/action_button/MouseExited()
+ closeToolTip(usr)
+
+
+/mob/proc/update_action_buttons_icon()
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
+
+//This is the proc used to update all the action buttons.
+/mob/proc/update_action_buttons(reload_screen)
+ if(!hud_used || !client)
+ return
+
+ if(hud_used.hud_shown != HUD_STYLE_STANDARD)
+ return
+
+ var/button_number = 0
+
+ if(hud_used.action_buttons_hidden)
+ for(var/datum/action/A in actions)
+ A.button.screen_loc = null
+ if(reload_screen)
+ client.screen += A.button
+ else
+ for(var/datum/action/A in actions)
+ button_number++
+ A.UpdateButtonIcon()
+ var/obj/screen/movable/action_button/B = A.button
+ if(!B.moved)
+ B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number)
+ else
+ B.screen_loc = B.moved
+ if(reload_screen)
+ client.screen += B
+
+ if(!button_number)
+ hud_used.hide_actions_toggle.screen_loc = null
+ return
+
+ if(!hud_used.hide_actions_toggle.moved)
+ hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1)
+ else
+ hud_used.hide_actions_toggle.screen_loc = hud_used.hide_actions_toggle.moved
+ if(reload_screen)
+ client.screen += hud_used.hide_actions_toggle
+
+
+
+#define AB_MAX_COLUMNS 10
+
+/datum/hud/proc/ButtonNumberToScreenCoords(number) // TODO : Make this zero-indexed for readabilty
+ var/row = round((number - 1)/AB_MAX_COLUMNS)
+ var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1
+
+ var/coord_col = "+[col-1]"
+ var/coord_col_offset = 4 + 2 * col
+
+ var/coord_row = "[row ? -row : "+0"]"
+
+ return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:-6"
+
+/datum/hud/proc/SetButtonCoords(obj/screen/button,number)
+ var/row = round((number-1)/AB_MAX_COLUMNS)
+ var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1
+ var/x_offset = 32*(col-1) + 4 + 2*col
+ var/y_offset = -32*(row+1) + 26
+
+ var/matrix/M = matrix()
+ M.Translate(x_offset,y_offset)
+ button.transform = M
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index b25c4d69b44..543f02e8a79 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -37,9 +37,12 @@
if(new_master)
var/old_layer = new_master.layer
+ var/old_plane = new_master.plane
new_master.layer = FLOAT_LAYER
+ new_master.plane = FLOAT_PLANE
alert.overlays += new_master
new_master.layer = old_layer
+ new_master.plane = old_plane
alert.icon_state = "template" // We'll set the icon to the client's ui pref in reorganize_alerts()
alert.master = new_master
else
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index e49e99ad6b7..29e7c676ac4 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -36,12 +36,16 @@
var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle
var/action_buttons_hidden = 0
+ var/obj/screen/internals
+
/mob/proc/create_mob_hud()
if(client && !hud_used)
hud_used = new /datum/hud(src)
/datum/hud/New(mob/owner)
mymob = owner
+ hide_actions_toggle = new
+ hide_actions_toggle.InitialiseIcon(mymob)
/datum/hud/Destroy()
if(mymob.hud_used == src)
@@ -79,7 +83,6 @@
//clear mob refs to screen objects
mymob.throw_icon = null
- mymob.internals = null
mymob.healths = null
mymob.healthdoll = null
mymob.pullin = null
@@ -92,6 +95,7 @@
alien_plasma_display = null
vampire_blood_display = null
nightvisionicon = null
+ internals = null
mymob = null
return ..()
@@ -122,6 +126,8 @@
if(infodisplay.len)
mymob.client.screen += infodisplay
+ mymob.client.screen += hide_actions_toggle
+
if(action_intent)
action_intent.screen_loc = initial(action_intent.screen_loc) //Restore intent selection to the original position
@@ -158,7 +164,7 @@
hud_version = display_hud_version
persistant_inventory_update()
- mymob.update_action_buttons()
+ mymob.update_action_buttons(1)
reorganize_alerts()
reload_fullscreen()
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 3a6e9df5dae..5227a25cde7 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -60,6 +60,12 @@
var/obj/screen/using
var/obj/screen/inventory/inv_box
+ using = new /obj/screen/inventory/craft
+ using.icon = ui_style
+ using.color = ui_color
+ using.alpha = ui_alpha
+ static_inventory += using
+
using = new /obj/screen/act_intent()
using.icon_state = mymob.a_intent
using.color = ui_color
@@ -151,16 +157,6 @@
inv_box.alpha = ui_alpha
static_inventory += inv_box
- inv_box = new /obj/screen/inventory()
- inv_box.name = "pda"
- inv_box.icon = ui_style
- inv_box.icon_state = "pda"
- inv_box.screen_loc = ui_pda
- inv_box.slot_id = slot_wear_pda
- inv_box.color = ui_color
- inv_box.alpha = ui_alpha
- static_inventory += inv_box
-
inv_box = new /obj/screen/inventory()
inv_box.name = "mask"
inv_box.icon = ui_style
@@ -309,8 +305,8 @@
mymob.throw_icon.alpha = ui_alpha
hotkeybuttons += mymob.throw_icon
- mymob.internals = new /obj/screen/internals()
- infodisplay += mymob.internals
+ internals = new /obj/screen/internals()
+ infodisplay += internals
mymob.healths = new /obj/screen/healths()
infodisplay += mymob.healths
@@ -397,9 +393,6 @@
if(H.wear_id)
H.wear_id.screen_loc = ui_id
H.client.screen += H.wear_id
- if(H.wear_pda)
- H.wear_pda.screen_loc = ui_pda
- H.client.screen += H.wear_pda
if(H.belt)
H.belt.screen_loc = ui_belt
H.client.screen += H.belt
@@ -417,8 +410,6 @@
H.s_store.screen_loc = null
if(H.wear_id)
H.wear_id.screen_loc = null
- if(H.wear_pda)
- H.wear_pda.screen_loc = null
if(H.belt)
H.belt.screen_loc = null
if(H.back)
@@ -452,4 +443,4 @@
hud_used.hotkey_ui_hidden = 0
else
client.screen -= hud_used.hotkeybuttons
- hud_used.hotkey_ui_hidden = 1
\ No newline at end of file
+ hud_used.hotkey_ui_hidden = 1
diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm
index ef87435c79f..c6bbbd27ae2 100644
--- a/code/_onclick/hud/monkey.dm
+++ b/code/_onclick/hud/monkey.dm
@@ -96,8 +96,8 @@
mymob.throw_icon.alpha = ui_alpha
hotkeybuttons += mymob.throw_icon
- mymob.internals = new /obj/screen/internals()
- infodisplay += mymob.internals
+ internals = new /obj/screen/internals()
+ infodisplay += internals
mymob.healths = new /obj/screen/healths()
infodisplay += mymob.healths
diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm
index e8d4e4b3d73..315fce5bf65 100644
--- a/code/_onclick/hud/movable_screen_objects.dm
+++ b/code/_onclick/hud/movable_screen_objects.dm
@@ -43,7 +43,7 @@
var/pix_Y = text2num(screen_loc_Y[2]) - 16
screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]"
- moved = TRUE
+ moved = screen_loc
//Debug procs
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index 861209033af..b95bacd06e2 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -70,6 +70,14 @@
var/mob/living/silicon/robot/R = usr
R.control_headlamp()
+/obj/screen/robot/thrusters
+ name = "ion thrusters"
+ icon_state = "ionpulse0"
+
+/obj/screen/robot/thrusters/Click()
+ var/mob/living/silicon/robot/R = usr
+ R.toggle_ionpulse()
+
/obj/screen/robot/panel
name = "installed modules"
icon_state = "panel"
@@ -117,10 +125,10 @@
using.screen_loc = ui_borg_sensor
static_inventory += using
-//Intent
- using = new /obj/screen/act_intent/robot()
- using.icon_state = mymob.a_intent
- static_inventory += using
+//Intent
+ using = new /obj/screen/act_intent/robot()
+ using.icon_state = mymob.a_intent
+ static_inventory += using
action_intent = using
//Health
@@ -141,8 +149,8 @@
mymob.pullin.screen_loc = ui_borg_pull
hotkeybuttons += mymob.pullin
- mymob.zone_sel = new /obj/screen/zone_sel/robot()
- mymob.zone_sel.update_icon(mymob)
+ mymob.zone_sel = new /obj/screen/zone_sel/robot()
+ mymob.zone_sel.update_icon(mymob)
static_inventory += mymob.zone_sel
//Headlamp
@@ -150,6 +158,11 @@
mymobR.lamp_button.screen_loc = ui_borg_lamp
static_inventory += mymobR.lamp_button
+//Thrusters
+ using = new /obj/screen/robot/thrusters()
+ using.screen_loc = ui_borg_thrusters
+ static_inventory += using
+ mymobR.thruster_button = using
/datum/hud/proc/toggle_show_robot_modules()
if(!isrobot(mymob))
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 58fb139ce33..dc59cf16097 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -96,114 +96,99 @@
screen_loc = ui_internal
/obj/screen/internals/Click()
- if(iscarbon(usr))
- var/mob/living/carbon/C = usr
- if(!C.stat && !C.stunned && !C.paralysis && !C.restrained())
- if(C.internal)
- C.internal = null
- to_chat(C, "No longer running on internals. ")
- if(C.internals)
- C.internals.icon_state = "internal0"
- else
+ if(!iscarbon(usr))
+ return
+ var/mob/living/carbon/C = usr
+ if(C.incapacitated())
+ return
- var/no_mask
- if(!(C.wear_mask && C.wear_mask.flags & AIRTIGHT))
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- if(!(H.head && H.head.flags & AIRTIGHT))
- no_mask = 1
+ if(C.internal)
+ C.internal = null
+ to_chat(C, "No longer running on internals. ")
+ icon_state = "internal0"
+ else
+ var/no_mask = FALSE
+ if(!C.wear_mask || !(C.wear_mask.flags & AIRTIGHT))
+ if(ishuman(C))
+ var/mob/living/carbon/human/H = C
+ if(!H.head || !(H.head.flags & AIRTIGHT))
+ no_mask = TRUE
- if(no_mask)
- to_chat(C, "You are not wearing a suitable mask or helmet. ")
- return 1
- else
- var/list/nicename = null
- var/list/tankcheck = null
- var/breathes = "oxygen" //default, we'll check later
- var/list/contents = list()
- var/from = "on"
+ if(no_mask)
+ to_chat(C, "You are not wearing a suitable mask or helmet. ")
+ return
- if(ishuman(C))
- var/mob/living/carbon/human/H = C
- breathes = H.species.breath_type
- nicename = list ("suit", "back", "belt", "right hand", "left hand", "left pocket", "right pocket")
- tankcheck = list (H.s_store, C.back, H.belt, C.r_hand, C.l_hand, H.l_store, H.r_store)
- else
- nicename = list("right hand", "left hand", "back")
- tankcheck = list(C.r_hand, C.l_hand, C.back)
+ var/list/nicename = null
+ var/list/tankcheck = null
+ var/breathes = "oxygen"
+ var/list/contents = list()
+ var/from = "on"
- // Rigs are a fucking pain since they keep an air tank in nullspace.
- if(istype(C.back,/obj/item/weapon/rig))
- var/obj/item/weapon/rig/rig = C.back
- if(rig.air_supply)
- from = "in"
- nicename |= "hardsuit"
- tankcheck |= rig.air_supply
-
- for(var/i=1, i bestcontents)
+ best = i
+ bestcontents = contents[i]
+ //We've determined the best container now we set it as our internals
+ if(best)
+ to_chat(C, "You are now running on internals from [tankcheck[best]] [from] your [nicename[best]]. ")
+ C.internal = tankcheck[best]
- var/best = 0
- var/bestcontents = 0
- for(var/i=1, i < contents.len + 1 , ++i)
- if(!contents[i])
- continue
- if(contents[i] > bestcontents)
- best = i
- bestcontents = contents[i]
+ if(C.internal)
+ icon_state = "internal1"
+ else
+ to_chat(C, "You don't have a[breathes == "oxygen" ? "n oxygen" : addtext(" ",breathes)] tank. ")
-
- //We've determined the best container now we set it as our internals
-
- if(best)
- to_chat(C, "You are now running on internals from [tankcheck[best]] [from] your [nicename[best]]. ")
- C.internal = tankcheck[best]
-
-
- if(C.internal)
- if(C.internals)
- C.internals.icon_state = "internal1"
- else
- to_chat(C, "You don't have a[breathes=="oxygen" ? "n oxygen" : addtext(" ",breathes)] tank. ")
+ C.update_action_buttons_icon()
/obj/screen/mov_intent
name = "run/walk toggle"
@@ -272,7 +257,7 @@
return 1
if(usr.stat || usr.paralysis || usr.stunned || usr.weakened)
return 1
- if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
+ if(istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return 1
if(master)
var/obj/item/I = usr.get_active_hand()
@@ -361,6 +346,16 @@
/obj/screen/zone_sel/robot
icon = 'icons/mob/screen_robot.dmi'
+/obj/screen/inventory/craft
+ name = "crafting menu"
+ icon = 'icons/mob/screen_midnight.dmi'
+ icon_state = "craft"
+ screen_loc = ui_crafting
+
+/obj/screen/inventory/craft/Click()
+ var/mob/living/M = usr
+ M.OpenCraftingMenu()
+
/obj/screen/inventory
var/slot_id //The indentifier for the slot. It has nothing to do with ID cards.
layer = 19
@@ -372,7 +367,7 @@
return 1
if(usr.incapacitated())
return 1
- if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
+ if(istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return 1
if(usr.attack_ui(slot_id))
usr.update_inv_l_hand(0)
@@ -411,7 +406,7 @@
return 1
if(usr.incapacitated())
return 1
- if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
+ if(istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return 1
if(ismob(usr))
@@ -473,4 +468,3 @@
name = "health doll"
icon_state = "healthdoll_DEAD"
screen_loc = ui_healthdoll
-
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index e32637e798c..6c363e6770a 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -15,13 +15,8 @@
/mob/living/attackby(obj/item/I, mob/user, params)
user.changeNext_move(CLICK_CD_MELEE)
- if(stat == DEAD && !isnull(butcher_results)) //can we butcher it?
- if(istype(I, /obj/item/weapon/kitchen/knife))
- to_chat(user, "You begin to butcher [src]... ")
- playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1)
- if(do_mob(user, src, 80))
- harvest(user)
- return
+ if(attempt_harvest(I, user))
+ return
I.attack(src, user)
@@ -33,11 +28,11 @@
/obj/item/proc/attack(mob/living/M as mob, mob/living/user as mob, def_zone)
- if (!istype(M)) // not sure if this is the right thing...
+ if(!istype(M)) // not sure if this is the right thing...
return 0
var/messagesource = M
- if (can_operate(M)) //Checks if mob is lying down on table for surgery
+ if(can_operate(M)) //Checks if mob is lying down on table for surgery
if(istype(src,/obj/item/robot_parts))//popup ovveride for direct attach
if(!attempt_initiate_surgery(src, M, user,1))
return 0
@@ -54,9 +49,9 @@
else
return 1
- if (istype(M,/mob/living/carbon/brain))
+ if(istype(M,/mob/living/carbon/brain))
messagesource = M:container
- if (hitsound && force > 0)
+ if(hitsound && force > 0)
playsound(loc, hitsound, 50, 1, -1)
/////////////////////////
user.lastattacked = M
@@ -177,9 +172,9 @@
else
M.take_organ_damage(power)
- if (prob(33)) // Added blood for whacking non-humans too
+ if(prob(33)) // Added blood for whacking non-humans too
var/turf/simulated/location = M.loc
- if (istype(location, /turf/simulated))
+ if(istype(location, /turf/simulated))
location.add_blood_floor(M)
if("fire")
M.take_organ_damage(0, power)
diff --git a/code/_onclick/oldcode.dm b/code/_onclick/oldcode.dm
index 89b1131a6f0..a68f9668e78 100644
--- a/code/_onclick/oldcode.dm
+++ b/code/_onclick/oldcode.dm
@@ -2,7 +2,7 @@
if(!usr) return
// ------- TIME SINCE LAST CLICK -------
- if (world.time <= usr:lastDblClick+1)
+ if(world.time <= usr:lastDblClick+1)
return
else
usr:lastDblClick = world.time
@@ -38,15 +38,15 @@
// ------- AI -------
- else if (istype(usr, /mob/living/silicon/ai))
+ else if(istype(usr, /mob/living/silicon/ai))
var/mob/living/silicon/ai/ai = usr
- if (ai.control_disabled)
+ if(ai.control_disabled)
return
// ------- CYBORG -------
- else if (istype(usr, /mob/living/silicon/robot))
+ else if(istype(usr, /mob/living/silicon/robot))
var/mob/living/silicon/robot/bot = usr
- if (bot.lockcharge) return
+ if(bot.lockcharge) return
..()
@@ -106,7 +106,7 @@
W = null
*/
// ------- ATTACK SELF -------
- if (W == src && usr.stat == 0)
+ if(W == src && usr.stat == 0)
W.attack_self(usr)
if(usr.hand)
usr.update_inv_l_hand(0) //update in-hand overlays
@@ -115,14 +115,14 @@
return
// ------- PARALYSIS, STUN, WEAKENED, DEAD, (And not AI) -------
- if (((usr.paralysis || usr.stunned || usr.weakened) && !istype(usr, /mob/living/silicon/ai)) || usr.stat != 0)
+ if(((usr.paralysis || usr.stunned || usr.weakened) && !istype(usr, /mob/living/silicon/ai)) || usr.stat != 0)
return
// ------- CLICKING STUFF IN CONTAINERS -------
- if ((!( src in usr.contents ) && (((!( isturf(src) ) && (!( isturf(src.loc) ) && (src.loc && !( isturf(src.loc.loc) )))) || !( isturf(usr.loc) )) && (src.loc != usr.loc && (!( istype(src, /obj/screen) ) && !( usr.contents.Find(src.loc) ))))))
- if (istype(usr, /mob/living/silicon/ai))
+ if((!( src in usr.contents ) && (((!( isturf(src) ) && (!( isturf(src.loc) ) && (src.loc && !( isturf(src.loc.loc) )))) || !( isturf(usr.loc) )) && (src.loc != usr.loc && (!( istype(src, /obj/screen) ) && !( usr.contents.Find(src.loc) ))))))
+ if(istype(usr, /mob/living/silicon/ai))
var/mob/living/silicon/ai/ai = usr
- if (ai.control_disabled || ai.malfhacking)
+ if(ai.control_disabled || ai.malfhacking)
return
else
return
@@ -141,11 +141,11 @@
// to_chat(world, "according to dblclick(), t5 is [t5]")
// ------- ACTUALLY DETERMINING STUFF -------
- if (((t5 || (W && (W.flags & USEDELAY))) && !( istype(src, /obj/screen) )))
+ if(((t5 || (W && (W.flags & USEDELAY))) && !( istype(src, /obj/screen) )))
// ------- ( CAN USE ITEM OR HAS 1 SECOND USE DELAY ) AND NOT CLICKING ON SCREEN -------
- if (usr.next_move < world.time)
+ if(usr.next_move < world.time)
usr.prev_move = usr.next_move
usr.next_move = world.time + 10
else
@@ -154,14 +154,14 @@
// ------- DELAY CHECK PASSED -------
- if ((src.loc && (get_dist(src, usr) < 2 || src.loc == usr.loc)))
+ if((src.loc && (get_dist(src, usr) < 2 || src.loc == usr.loc)))
// ------- CLICKED OBJECT EXISTS IN GAME WORLD, DISTANCE FROM PERSON TO OBJECT IS 1 SQUARE OR THEY'RE ON THE SAME SQUARE -------
var/direct = get_dir(usr, src)
var/obj/item/weapon/dummy/D = new /obj/item/weapon/dummy( usr.loc )
var/ok = 0
- if ( (direct - 1) & direct)
+ if( (direct - 1) & direct)
// ------- CLICKED OBJECT IS LOCATED IN A DIAGONAL POSITION FROM THE PERSON -------
@@ -259,39 +259,39 @@
D = null
// ------- DUMMY OBJECT'S SERVED IT'S PURPOSE, IT'S REWARDED WITH A SWIFT DELETE -------
- if (!( ok ))
+ if(!( ok ))
// ------- TESTS ABOVE DETERMINED YOU CANNOT REACH THE TILE -------
return 0
- if (!( usr.restrained() || (usr.lying && usr.buckled!=src) ))
+ if(!( usr.restrained() || (usr.lying && usr.buckled!=src) ))
// ------- YOU ARE NOT REASTRAINED -------
- if (W)
+ if(W)
// ------- YOU HAVE AN ITEM IN YOUR HAND - HANDLE ATTACKBY AND AFTERATTACK -------
var/ignoreAA = 0 //Ignore afterattack(). Surgery uses this.
- if (t5)
+ if(t5)
ignoreAA = src.attackby(W, usr, params)
- if (W && !ignoreAA)
+ if(W && !ignoreAA)
W.afterattack(src, usr, (t5 ? 1 : 0), params)
else
// ------- YOU DO NOT HAVE AN ITEM IN YOUR HAND -------
- if (istype(usr, /mob/living/carbon/human))
+ if(istype(usr, /mob/living/carbon/human))
// ------- YOU ARE HUMAN -------
src.attack_hand(usr, usr.hand)
else
// ------- YOU ARE NOT HUMAN. WHAT ARE YOU - DETERMINED HERE AND PROPER ATTACK_MOBTYPE CALLED -------
- if (istype(usr, /mob/living/carbon/monkey))
+ if(istype(usr, /mob/living/carbon/monkey))
src.attack_paw(usr, usr.hand)
- else if (istype(usr, /mob/living/carbon/alien/humanoid))
+ else if(istype(usr, /mob/living/carbon/alien/humanoid))
if(usr.m_intent == "walk" && istype(usr, /mob/living/carbon/alien/humanoid/hunter))
usr.m_intent = "run"
usr.hud_used.move_intent.icon_state = "running"
usr.update_icons()
src.attack_alien(usr, usr.hand)
- else if (istype(usr, /mob/living/carbon/alien/larva))
+ else if(istype(usr, /mob/living/carbon/alien/larva))
src.attack_larva(usr)
- else if (istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot))
+ else if(istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot))
src.attack_ai(usr, usr.hand)
else if(istype(usr, /mob/living/carbon/slime))
src.attack_slime(usr)
@@ -299,51 +299,51 @@
src.attack_animal(usr)
else
// ------- YOU ARE RESTRAINED. DETERMINE WHAT YOU ARE AND ATTACK WITH THE PROPER HAND_X PROC -------
- if (istype(usr, /mob/living/carbon/human))
+ if(istype(usr, /mob/living/carbon/human))
src.hand_h(usr, usr.hand)
- else if (istype(usr, /mob/living/carbon/monkey))
+ else if(istype(usr, /mob/living/carbon/monkey))
src.hand_p(usr, usr.hand)
- else if (istype(usr, /mob/living/carbon/alien/humanoid))
+ else if(istype(usr, /mob/living/carbon/alien/humanoid))
src.hand_al(usr, usr.hand)
- else if (istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot))
+ else if(istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot))
src.hand_a(usr, usr.hand)
else
// ------- ITEM INACESSIBLE OR CLICKING ON SCREEN -------
- if (istype(src, /obj/screen))
+ if(istype(src, /obj/screen))
// ------- IT'S THE HUD YOU'RE CLICKING ON -------
usr.prev_move = usr.next_move
usr:lastDblClick = world.time + 2
- if (usr.next_move < world.time)
+ if(usr.next_move < world.time)
usr.next_move = world.time + 2
else
return
// ------- 2 DECISECOND DELAY FOR CLICKING PASSED -------
- if (!( usr.restrained() ))
+ if(!( usr.restrained() ))
// ------- YOU ARE NOT RESTRAINED -------
- if ((W && !( istype(src, /obj/screen) )))
+ if((W && !( istype(src, /obj/screen) )))
// ------- IT SHOULD NEVER GET TO HERE, DUE TO THE ISTYPE(SRC, /OBJ/SCREEN) FROM PREVIOUS IF-S - I TESTED IT WITH A DEBUG OUTPUT AND I COULDN'T GET THIST TO SHOW UP. -------
src.attackby(W, usr, params)
- if (W)
+ if(W)
W.afterattack(src, usr,, params)
else
// ------- YOU ARE NOT RESTRAINED, AND ARE CLICKING A HUD OBJECT -------
- if (istype(usr, /mob/living/carbon/human))
+ if(istype(usr, /mob/living/carbon/human))
src.attack_hand(usr, usr.hand)
- else if (istype(usr, /mob/living/carbon/monkey))
+ else if(istype(usr, /mob/living/carbon/monkey))
src.attack_paw(usr, usr.hand)
- else if (istype(usr, /mob/living/carbon/alien/humanoid))
+ else if(istype(usr, /mob/living/carbon/alien/humanoid))
src.attack_alien(usr, usr.hand)
else
// ------- YOU ARE RESTRAINED CLICKING ON A HUD OBJECT -------
- if (istype(usr, /mob/living/carbon/human))
+ if(istype(usr, /mob/living/carbon/human))
src.hand_h(usr, usr.hand)
- else if (istype(usr, /mob/living/carbon/monkey))
+ else if(istype(usr, /mob/living/carbon/monkey))
src.hand_p(usr, usr.hand)
- else if (istype(usr, /mob/living/carbon/alien/humanoid))
+ else if(istype(usr, /mob/living/carbon/alien/humanoid))
src.hand_al(usr, usr.hand)
else
// ------- YOU ARE CLICKING ON AN OBJECT THAT'S INACCESSIBLE TO YOU AND IS NOT YOUR HUD -------
diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm
index 50b6716c977..f32161b92a2 100644
--- a/code/_onclick/telekinesis.dm
+++ b/code/_onclick/telekinesis.dm
@@ -67,7 +67,7 @@ var/const/tk_maxrange = 15
icon_state = "2"
flags = NOBLUDGEON | ABSTRACT
//item_state = null
- w_class = 10.0
+ w_class = 10
layer = 20
plane = HUD_PLANE
diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm
index 620dafca4ec..acf34e3c4c8 100644
--- a/code/controllers/ProcessScheduler/core/process.dm
+++ b/code/controllers/ProcessScheduler/core/process.dm
@@ -171,7 +171,7 @@
main.restartProcess(src.name)
/datum/controller/process/proc/kill()
- if (!killed)
+ if(!killed)
var/msg = "[name] process was killed at tick #[ticks]."
log_debug(msg)
message_admins(msg)
@@ -186,22 +186,22 @@
// Do not call this directly - use SHECK or SCHECK_EVERY
/datum/controller/process/proc/sleepCheck(var/tickId = 0)
calls_since_last_scheck = 0
- if (killed)
+ if(killed)
// The kill proc is the only place where killed is set.
// The kill proc should have deleted this datum, and all sleeping procs that are
// owned by it.
CRASH("A killed process is still running somehow...")
- if (hung)
+ if(hung)
// This will only really help if the doWork proc ends up in an infinite loop.
handleHung()
CRASH("Process [name] hung and was restarted.")
- if (main.getCurrentTickElapsedTime() > main.timeAllowance)
+ if(main.getCurrentTickElapsedTime() > main.timeAllowance)
sleep(world.tick_lag)
cpu_defer_count++
last_slept = 0
else
- if (TimeOfTick > last_slept + sleep_interval)
+ if(TimeOfTick > last_slept + sleep_interval)
// If we haven't slept in sleep_interval deciseconds, sleep to allow other work to proceed.
sleep(0)
last_slept = TimeOfTick
@@ -213,14 +213,14 @@
var/elapsedTime = getElapsedTime()
- if (hung)
+ if(hung)
handleHung()
return
- else if (elapsedTime > hang_restart_time)
+ else if(elapsedTime > hang_restart_time)
hung()
- else if (elapsedTime > hang_alert_time)
+ else if(elapsedTime > hang_alert_time)
setStatus(PROCESS_STATUS_PROBABLY_HUNG)
- else if (elapsedTime > hang_warning_time)
+ else if(elapsedTime > hang_warning_time)
setStatus(PROCESS_STATUS_MAYBE_HUNG)
@@ -327,9 +327,7 @@
/datum/controller/process/proc/catchException(var/exception/e, var/thrower)
if(istype(e)) // Real runtimes go to the real error handler
- // There are two newlines here, because handling desc sucks
- e.desc = " Caught by process: [name]\n\n" + e.desc
- world.Error(e, e_src = thrower)
+ log_runtime(e, thrower, "Caught by process: [name]")
return
var/etext = "[e]"
var/eid = "[e]" // Exception ID, for tracking repeated exceptions
diff --git a/code/controllers/ProcessScheduler/core/processScheduler.dm b/code/controllers/ProcessScheduler/core/processScheduler.dm
index 86e1fc5bbe9..494e776650d 100644
--- a/code/controllers/ProcessScheduler/core/processScheduler.dm
+++ b/code/controllers/ProcessScheduler/core/processScheduler.dm
@@ -66,7 +66,7 @@ var/global/datum/controller/processScheduler/processScheduler
* this treatment.
*/
/datum/controller/processScheduler/proc/deferSetupFor(var/processPath)
- if (!(processPath in deferredSetupList))
+ if(!(processPath in deferredSetupList))
deferredSetupList += processPath
/datum/controller/processScheduler/proc/setup()
@@ -77,11 +77,11 @@ var/global/datum/controller/processScheduler/processScheduler
var/process
// Add all the processes we can find, except for the ticker
- for (process in subtypesof(/datum/controller/process))
- if (!(process in deferredSetupList))
+ for(process in subtypesof(/datum/controller/process))
+ if(!(process in deferredSetupList))
addProcess(new process(src))
- for (process in deferredSetupList)
+ for(process in deferredSetupList)
addProcess(new process(src))
/datum/controller/processScheduler/proc/start()
@@ -114,7 +114,7 @@ var/global/datum/controller/processScheduler/processScheduler
for(var/datum/controller/process/p in running)
p.update()
- if (isnull(p)) // Process was killed
+ if(isnull(p)) // Process was killed
continue
var/status = p.getStatus()
@@ -132,11 +132,11 @@ var/global/datum/controller/processScheduler/processScheduler
/datum/controller/processScheduler/proc/queueProcesses()
for(var/datum/controller/process/p in processes)
// Don't double-queue, don't queue running processes
- if (p.disabled || p.running || p.queued || !p.idle)
+ if(p.disabled || p.running || p.queued || !p.idle)
continue
// If the process should be running by now, go ahead and queue it
- if (world.time >= last_queued[p] + p.schedule_interval)
+ if(world.time >= last_queued[p] + p.schedule_interval)
setQueuedProcessState(p)
/datum/controller/processScheduler/proc/runQueuedProcesses()
@@ -217,34 +217,34 @@ var/global/datum/controller/processScheduler/processScheduler
recordEnd(process)
/datum/controller/processScheduler/proc/setIdleProcessState(var/datum/controller/process/process)
- if (process in running)
+ if(process in running)
running -= process
- if (process in queued)
+ if(process in queued)
queued -= process
- if (!(process in idle))
+ if(!(process in idle))
idle += process
/datum/controller/processScheduler/proc/setQueuedProcessState(var/datum/controller/process/process)
- if (process in running)
+ if(process in running)
running -= process
- if (process in idle)
+ if(process in idle)
idle -= process
- if (!(process in queued))
+ if(!(process in queued))
queued += process
// The other state transitions are handled internally by the process.
process.queued()
/datum/controller/processScheduler/proc/setRunningProcessState(var/datum/controller/process/process)
- if (process in queued)
+ if(process in queued)
queued -= process
- if (process in idle)
+ if(process in idle)
idle -= process
- if (!(process in running))
+ if(!(process in running))
running += process
/datum/controller/processScheduler/proc/recordStart(var/datum/controller/process/process, var/time = null)
- if (isnull(time))
+ if(isnull(time))
time = TimeOfGame
last_queued[process] = world.time
last_start[process] = time
@@ -253,7 +253,7 @@ var/global/datum/controller/processScheduler/processScheduler
last_start[process] = time
/datum/controller/processScheduler/proc/recordEnd(var/datum/controller/process/process, var/time = null)
- if (isnull(time))
+ if(isnull(time))
time = TimeOfGame
var/lastRunTime = time - last_start[process]
@@ -273,7 +273,7 @@ var/global/datum/controller/processScheduler/processScheduler
highest_run_time[process] = time
var/list/lastTwenty = last_twenty_run_times[process]
- if (lastTwenty.len == 20)
+ if(lastTwenty.len == 20)
lastTwenty.Cut(1, 2)
lastTwenty.len++
lastTwenty[lastTwenty.len] = time
@@ -304,7 +304,7 @@ var/global/datum/controller/processScheduler/processScheduler
/datum/controller/processScheduler/proc/getStatusData()
var/list/data = new
- for (var/datum/controller/process/p in processes)
+ for(var/datum/controller/process/p in processes)
data.len++
data[data.len] = p.getContextData()
@@ -314,14 +314,14 @@ var/global/datum/controller/processScheduler/processScheduler
return processes.len
/datum/controller/processScheduler/proc/hasProcess(var/processName as text)
- if (nameToProcessMap[processName])
+ if(nameToProcessMap[processName])
return 1
/datum/controller/processScheduler/proc/killProcess(var/processName as text)
restartProcess(processName)
/datum/controller/processScheduler/proc/restartProcess(var/processName as text)
- if (hasProcess(processName))
+ if(hasProcess(processName))
var/datum/controller/process/oldInstance = nameToProcessMap[processName]
var/datum/controller/process/newInstance = new oldInstance.type(src)
newInstance._copyStateFrom(oldInstance)
@@ -329,24 +329,24 @@ var/global/datum/controller/processScheduler/processScheduler
oldInstance.kill()
/datum/controller/processScheduler/proc/enableProcess(var/processName as text)
- if (hasProcess(processName))
+ if(hasProcess(processName))
var/datum/controller/process/process = nameToProcessMap[processName]
process.enable()
/datum/controller/processScheduler/proc/disableProcess(var/processName as text)
- if (hasProcess(processName))
+ if(hasProcess(processName))
var/datum/controller/process/process = nameToProcessMap[processName]
process.disable()
/datum/controller/processScheduler/proc/getCurrentTickElapsedTime()
- if (world.time > currentTick)
+ if(world.time > currentTick)
updateCurrentTickData()
return 0
else
return TimeOfTick
/datum/controller/processScheduler/proc/updateCurrentTickData()
- if (world.time > currentTick)
+ if(world.time > currentTick)
// New tick!
currentTick = world.time
updateTimeAllowance()
diff --git a/code/controllers/Processes/air.dm b/code/controllers/Processes/air.dm
index 4846b850790..ab8dd1a6906 100644
--- a/code/controllers/Processes/air.dm
+++ b/code/controllers/Processes/air.dm
@@ -146,4 +146,4 @@ var/global/datum/controller/process/air_system/air_master
icemaster.icon = 'icons/turf/overlays.dmi'
icemaster.icon_state = "snowfloor"
icemaster.layer = TURF_LAYER+0.1
- icemaster.mouse_opacity = 0
\ No newline at end of file
+ icemaster.mouse_opacity = 0
diff --git a/code/controllers/Processes/sun.dm b/code/controllers/Processes/sun.dm
index abd2dc5433d..06eac82baf0 100644
--- a/code/controllers/Processes/sun.dm
+++ b/code/controllers/Processes/sun.dm
@@ -11,6 +11,7 @@ var/global/datum/controller/process/sun/sun
name = "sun"
schedule_interval = 600 // every 60 seconds
sun = src
+ log_startup_progress("Sun ticker starting up.")
angle = rand (0,360) // the station position to the sun is randomised at round start
rate = rand(50,200)/100 // 50% - 200% of standard rotation
diff --git a/code/controllers/Processes/ticker.dm b/code/controllers/Processes/ticker.dm
index b7c45ba91a4..19dad45a898 100644
--- a/code/controllers/Processes/ticker.dm
+++ b/code/controllers/Processes/ticker.dm
@@ -9,6 +9,7 @@ var/global/datum/controller/process/ticker/tickerProcess
schedule_interval = 20 // every 2 seconds
lastTickerTime = world.timeofday
+ log_startup_progress("Time ticker starting up.")
if(!ticker)
ticker = new
diff --git a/code/controllers/Processes/timer.dm b/code/controllers/Processes/timer.dm
index ee3637efa24..de68a01ef51 100644
--- a/code/controllers/Processes/timer.dm
+++ b/code/controllers/Processes/timer.dm
@@ -8,6 +8,7 @@ var/global/datum/controller/process/timer/timer_master
name = "timer"
schedule_interval = 5 //every 0.5 seconds
timer_master = src
+ log_startup_progress("Timer process starting up.")
/datum/controller/process/timer/statProcess()
..()
@@ -79,4 +80,4 @@ var/global/datum/controller/process/timer/timer_master
if(event.id == id)
qdel(event)
return 1
- return 0
\ No newline at end of file
+ return 0
diff --git a/code/controllers/Processes/vote.dm b/code/controllers/Processes/vote.dm
index 5df5ce69792..47cf079eeba 100644
--- a/code/controllers/Processes/vote.dm
+++ b/code/controllers/Processes/vote.dm
@@ -1,6 +1,7 @@
/datum/controller/process/vote/setup()
name = "vote"
schedule_interval = 10 // every second
+ log_startup_progress("Voting ticker starting up.")
/datum/controller/process/vote/doWork()
vote.process()
diff --git a/code/controllers/Processes/weather.dm b/code/controllers/Processes/weather.dm
new file mode 100644
index 00000000000..999c6c51dc5
--- /dev/null
+++ b/code/controllers/Processes/weather.dm
@@ -0,0 +1,52 @@
+//Used for all kinds of weather, ex. lavaland ash storms.
+var/global/datum/controller/process/weather/weather_master
+
+/datum/controller/process/weather
+ var/list/processing_weather = list()
+ var/list/existing_weather = list()
+ var/list/eligible_zlevels = list()
+
+/datum/controller/process/weather/setup()
+ name = "weather"
+ schedule_interval = 10
+ weather_master = src
+
+ for(var/V in subtypesof(/datum/weather))
+ var/datum/weather/W = V
+ existing_weather |= new W
+
+/datum/controller/process/weather/statProcess()
+ ..()
+ stat(null, "[processing_weather.len] weather")
+
+/datum/controller/process/weather/doWork()
+ for(var/V in processing_weather)
+ var/datum/weather/W = V
+ if(W.aesthetic)
+ continue
+ for(var/mob/living/L in mob_list)
+ if(W.can_impact(L))
+ W.impact(L)
+ SCHECK
+ for(var/Z in eligible_zlevels)
+ var/list/possible_weather_for_this_z = list()
+ for(var/V in existing_weather)
+ var/datum/weather/WE = V
+ if(WE.target_z == Z && WE.probability) //Another check so that it doesn't run extra weather
+ possible_weather_for_this_z[WE] = WE.probability
+ var/datum/weather/W = pickweight(possible_weather_for_this_z)
+ run_weather(W.name)
+ eligible_zlevels -= Z
+ addtimer(src, "make_z_eligible", rand(3000, 6000) + W.weather_duration_upper, TRUE, Z) //Around 5-10 minutes between weathers
+
+/datum/controller/process/weather/proc/run_weather(weather_name)
+ if(!weather_name)
+ return
+ for(var/V in existing_weather)
+ var/datum/weather/W = V
+ if(W.name == weather_name)
+ W.telegraph()
+ SCHECK
+
+/datum/controller/process/weather/proc/make_z_eligible(zlevel)
+ eligible_zlevels |= zlevel
diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm
index 43bee48f267..dc7cbe6a24d 100644
--- a/code/controllers/communications.dm
+++ b/code/controllers/communications.dm
@@ -153,7 +153,7 @@ var/list/DEPT_FREQS = list(AI_FREQ, COMM_FREQ, ENG_FREQ, MED_FREQ, SEC_FREQ, SCI
/proc/frequency_span_class(var/frequency)
// Antags!
- if (frequency in ANTAG_FREQS)
+ if(frequency in ANTAG_FREQS)
return "syndradio"
// centcomm channels (deathsquid and ert)
if(frequency in CENT_FREQS)
@@ -167,7 +167,7 @@ var/list/DEPT_FREQS = list(AI_FREQ, COMM_FREQ, ENG_FREQ, MED_FREQ, SEC_FREQ, SCI
// department radio formatting (poorly optimized, ugh)
if(frequency == SEC_FREQ)
return "secradio"
- if (frequency == ENG_FREQ)
+ if(frequency == ENG_FREQ)
return "engradio"
if(frequency == SCI_FREQ)
return "sciradio"
@@ -265,17 +265,17 @@ var/global/datum/controller/radio/radio_controller
if(!start_point)
qdel(signal)
return 0
- if (filter)
+ if(filter)
send_to_filter(source, signal, filter, start_point, range)
send_to_filter(source, signal, RADIO_DEFAULT, start_point, range)
else
//Broadcast the signal to everyone!
- for (var/next_filter in devices)
+ for(var/next_filter in devices)
send_to_filter(source, signal, next_filter, start_point, range)
//Sends a signal to all machines belonging to a given filter. Should be called by post_signal()
/datum/radio_frequency/proc/send_to_filter(obj/source, datum/signal/signal, var/filter, var/turf/start_point = null, var/range = null)
- if (range && !start_point)
+ if(range && !start_point)
return
for(var/obj/device in devices[filter])
@@ -291,11 +291,11 @@ var/global/datum/controller/radio/radio_controller
device.receive_signal(signal, TRANSMISSION_RADIO, frequency)
/datum/radio_frequency/proc/add_listener(obj/device as obj, var/filter as text|null)
- if (!filter)
+ if(!filter)
filter = RADIO_DEFAULT
//log_admin("add_listener(device=[device],filter=[filter]) frequency=[frequency]")
var/list/obj/devices_line = devices[filter]
- if (!devices_line)
+ if(!devices_line)
devices_line = new
devices[filter] = devices_line
devices_line+=device
@@ -305,12 +305,12 @@ var/global/datum/controller/radio/radio_controller
//log_admin("DEBUG: devices(filter_str).len=[l]")
/datum/radio_frequency/proc/remove_listener(obj/device)
- for (var/devices_filter in devices)
+ for(var/devices_filter in devices)
var/list/devices_line = devices[devices_filter]
devices_line-=device
- while (null in devices_line)
+ while(null in devices_line)
devices_line -= null
- if (devices_line.len==0)
+ if(devices_line.len==0)
devices -= devices_filter
qdel(devices_line)
@@ -335,11 +335,11 @@ var/global/datum/controller/radio/radio_controller
frequency = model.frequency
/datum/signal/proc/debug_print()
- if (source)
+ if(source)
. = "signal = {source = '[source]' ([source:x],[source:y],[source:z])\n"
else
. = "signal = {source = '[source]' ()\n"
- for (var/i in data)
+ for(var/i in data)
. += "data\[\"[i]\"\] = \"[data[i]]\"\n"
if(islist(data[i]))
var/list/L = data[i]
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index f4e795f6c77..5cedd40abfc 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -18,9 +18,8 @@
var/log_adminwarn = 0 // log warnings admins get about bomb construction and such
var/log_pda = 0 // log pda messages
var/log_world_output = 0 // log world.log << messages
- var/log_runtimes = 0 // Logs all runtimes.
+ var/log_runtimes = 0 // logs world.log to a file
var/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits
- var/log_runtime = 0 // logs world.log to a file
var/sql_enabled = 0 // for sql switching
var/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour
var/allow_vote_restart = 0 // allow votes to restart
@@ -168,6 +167,7 @@
var/list/overflow_whitelist = list() //whitelist for overflow
var/disable_away_missions = 0 // disable away missions
+ var/disable_space_ruins = 0 //disable space ruins
var/ooc_allowed = 1
var/looc_allowed = 1
@@ -177,20 +177,22 @@
var/disable_lobby_music = 0 // Disables the lobby music
var/disable_cid_warn_popup = 0 //disables the annoying "You have already logged in this round, disconnect or be banned" popup, because it annoys the shit out of me when testing.
+ var/max_loadout_points = 5 // How many points can be spent on extra items in character setup
+
/datum/configuration/New()
var/list/L = subtypesof(/datum/game_mode)
- for (var/T in L)
+ for(var/T in L)
// I wish I didn't have to instance the game modes in order to look up
// their information, but it is the only way (at least that I know of).
var/datum/game_mode/M = new T()
- if (M.config_tag)
+ if(M.config_tag)
if(!(M.config_tag in modes)) // ensure each mode is added only once
diary << "Adding game mode [M.name] ([M.config_tag]) to configuration."
src.modes += M.config_tag
src.mode_names[M.config_tag] = M.name
src.probabilities[M.config_tag] = M.probability
- if (M.votable)
+ if(M.votable)
src.votable_modes += M.config_tag
qdel(M)
src.votable_modes += "secret"
@@ -202,188 +204,188 @@
if(!t) continue
t = trim(t)
- if (length(t) == 0)
+ if(length(t) == 0)
continue
- else if (copytext(t, 1, 2) == "#")
+ else if(copytext(t, 1, 2) == "#")
continue
var/pos = findtext(t, " ")
var/name = null
var/value = null
- if (pos)
+ if(pos)
name = lowertext(copytext(t, 1, pos))
value = copytext(t, pos + 1)
else
name = lowertext(t)
- if (!name)
+ if(!name)
continue
if(type == "config")
- switch (name)
- if ("resource_urls")
+ switch(name)
+ if("resource_urls")
config.resource_urls = splittext(value, " ")
- if ("admin_legacy_system")
+ if("admin_legacy_system")
config.admin_legacy_system = 1
- if ("ban_legacy_system")
+ if("ban_legacy_system")
config.ban_legacy_system = 1
- if ("use_age_restriction_for_jobs")
+ if("use_age_restriction_for_jobs")
config.use_age_restriction_for_jobs = 1
- if ("use_age_restriction_for_antags")
+ if("use_age_restriction_for_antags")
config.use_age_restriction_for_antags = 1
- if ("jobs_have_minimal_access")
+ if("jobs_have_minimal_access")
config.jobs_have_minimal_access = 1
- if ("log_ooc")
+ if("log_ooc")
config.log_ooc = 1
- if ("log_access")
+ if("log_access")
config.log_access = 1
- if ("log_say")
+ if("log_say")
config.log_say = 1
- if ("log_admin")
+ if("log_admin")
config.log_admin = 1
- if ("log_debug")
+ if("log_debug")
config.log_debug = text2num(value)
- if ("log_game")
+ if("log_game")
config.log_game = 1
- if ("log_vote")
+ if("log_vote")
config.log_vote = 1
- if ("log_whisper")
+ if("log_whisper")
config.log_whisper = 1
- if ("log_attack")
+ if("log_attack")
config.log_attack = 1
- if ("log_emote")
+ if("log_emote")
config.log_emote = 1
- if ("log_adminchat")
+ if("log_adminchat")
config.log_adminchat = 1
- if ("log_adminwarn")
+ if("log_adminwarn")
config.log_adminwarn = 1
- if ("log_pda")
+ if("log_pda")
config.log_pda = 1
- if ("log_world_output")
+ if("log_world_output")
config.log_world_output = 1
- if ("log_hrefs")
+ if("log_hrefs")
config.log_hrefs = 1
- if ("log_runtime")
- config.log_runtime = 1
+ if("log_runtime")
+ config.log_runtimes = 1
- if ("mentors")
+ if("mentors")
config.mods_are_mentors = 1
if("allow_admin_ooccolor")
config.allow_admin_ooccolor = 1
- if ("allow_vote_restart")
+ if("allow_vote_restart")
config.allow_vote_restart = 1
- if ("allow_vote_mode")
+ if("allow_vote_mode")
config.allow_vote_mode = 1
if("no_dead_vote")
config.vote_no_dead = 1
- if ("default_no_vote")
+ if("default_no_vote")
config.vote_no_default = 1
- if ("vote_delay")
+ if("vote_delay")
config.vote_delay = text2num(value)
- if ("vote_period")
+ if("vote_period")
config.vote_period = text2num(value)
- if ("allow_ai")
+ if("allow_ai")
config.allow_ai = 1
-// if ("authentication")
+// if("authentication")
// config.enable_authentication = 1
- if ("norespawn")
+ if("norespawn")
config.respawn = 0
- if ("servername")
+ if("servername")
config.server_name = value
- if ("serversuffix")
+ if("serversuffix")
config.server_suffix = 1
- if ("nudge_script_path")
+ if("nudge_script_path")
config.nudge_script_path = value
- if ("hostedby")
+ if("hostedby")
config.hostedby = value
- if ("server")
+ if("server")
config.server = value
- if ("banappeals")
+ if("banappeals")
config.banappeals = value
- if ("wikiurl")
+ if("wikiurl")
config.wikiurl = value
- if ("forumurl")
+ if("forumurl")
config.forumurl = value
- if ("rulesurl")
+ if("rulesurl")
config.rulesurl = value
- if ("donationsurl")
+ if("donationsurl")
config.donationsurl = value
- if ("repositoryurl")
+ if("repositoryurl")
config.repositoryurl = value
- if ("guest_jobban")
+ if("guest_jobban")
config.guest_jobban = 1
- if ("guest_ban")
+ if("guest_ban")
guests_allowed = 0
- if ("usewhitelist")
+ if("usewhitelist")
config.usewhitelist = 1
- if ("feature_object_spell_system")
+ if("feature_object_spell_system")
config.feature_object_spell_system = 1
- if ("allow_metadata")
+ if("allow_metadata")
config.allow_Metadata = 1
- if ("traitor_scaling")
+ if("traitor_scaling")
config.traitor_scaling = 1
if("protect_roles_from_antagonist")
config.protect_roles_from_antagonist = 1
- if ("probability")
+ if("probability")
var/prob_pos = findtext(value, " ")
var/prob_name = null
var/prob_value = null
- if (prob_pos)
+ if(prob_pos)
prob_name = lowertext(copytext(value, 1, prob_pos))
prob_value = copytext(value, prob_pos + 1)
- if (prob_name in config.modes)
+ if(prob_name in config.modes)
config.probabilities[prob_name] = text2num(prob_value)
else
diary << "Unknown game mode probability configuration definition: [prob_name]."
@@ -546,12 +548,18 @@
if("disable_away_missions")
config.disable_away_missions = 1
+ if("disable_space_ruins")
+ config.disable_space_ruins = 1
+
if("disable_lobby_music")
config.disable_lobby_music = 1
if("disable_cid_warn_popup")
config.disable_cid_warn_popup = 1
+ if("max_loadout_points")
+ config.max_loadout_points = text2num(value)
+
else
diary << "Unknown setting in configuration: '[name]'"
@@ -606,11 +614,11 @@
config.reactionary_explosions = 1
if("bombcap")
var/BombCap = text2num(value)
- if (!BombCap)
+ if(!BombCap)
continue
- if (BombCap < 4)
+ if(BombCap < 4)
BombCap = 4
- if (BombCap > 128)
+ if(BombCap > 128)
BombCap = 128
MAX_EX_DEVESTATION_RANGE = round(BombCap/4)
@@ -629,36 +637,36 @@
if(!t) continue
t = trim(t)
- if (length(t) == 0)
+ if(length(t) == 0)
continue
- else if (copytext(t, 1, 2) == "#")
+ else if(copytext(t, 1, 2) == "#")
continue
var/pos = findtext(t, " ")
var/name = null
var/value = null
- if (pos)
+ if(pos)
name = lowertext(copytext(t, 1, pos))
value = copytext(t, pos + 1)
else
name = lowertext(t)
- if (!name)
+ if(!name)
continue
- switch (name)
+ switch(name)
if("sql_enabled")
config.sql_enabled = 1
- if ("address")
+ if("address")
sqladdress = value
- if ("port")
+ if("port")
sqlport = value
- if ("feedback_database")
+ if("feedback_database")
sqlfdbkdb = value
- if ("feedback_login")
+ if("feedback_login")
sqlfdbklogin = value
- if ("feedback_password")
+ if("feedback_password")
sqlfdbkpass = value
if("feedback_tableprefix")
sqlfdbktableprefix = value
@@ -671,9 +679,9 @@
if(!t) continue
t = trim(t)
- if (length(t) == 0)
+ if(length(t) == 0)
continue
- else if (copytext(t, 1, 2) == "#")
+ else if(copytext(t, 1, 2) == "#")
continue
config.overflow_whitelist += t
@@ -681,25 +689,25 @@
/datum/configuration/proc/pick_mode(mode_name)
// I wish I didn't have to instance the game modes in order to look up
// their information, but it is the only way (at least that I know of).
- for (var/T in subtypesof(/datum/game_mode))
+ for(var/T in subtypesof(/datum/game_mode))
var/datum/game_mode/M = new T()
- if (M.config_tag && M.config_tag == mode_name)
+ if(M.config_tag && M.config_tag == mode_name)
return M
qdel(M)
return new /datum/game_mode/extended()
/datum/configuration/proc/get_runnable_modes()
var/list/datum/game_mode/runnable_modes = new
- for (var/T in subtypesof(/datum/game_mode))
+ for(var/T in subtypesof(/datum/game_mode))
var/datum/game_mode/M = new T()
// to_chat(world, "DEBUG: [T], tag=[M.config_tag], prob=[probabilities[M.config_tag]]")
- if (!(M.config_tag in modes))
+ if(!(M.config_tag in modes))
qdel(M)
continue
- if (probabilities[M.config_tag]<=0)
+ if(probabilities[M.config_tag]<=0)
qdel(M)
continue
- if (M.can_start())
+ if(M.can_start())
runnable_modes[M] = probabilities[M.config_tag]
// to_chat(world, "DEBUG: runnable_mode\[[runnable_modes.len]\] = [M.config_tag]")
return runnable_modes
diff --git a/code/controllers/failsafe.dm b/code/controllers/failsafe.dm
index 2775590dab6..afb0e68d83f 100644
--- a/code/controllers/failsafe.dm
+++ b/code/controllers/failsafe.dm
@@ -18,8 +18,8 @@ var/global/datum/controller/failsafe/failsafe
. = ..()
// There can be only one failsafe. Out with the old in with the new (that way we can restart the Failsafe by spawning a new one).
- if (failsafe != src)
- if (istype(failsafe))
+ if(failsafe != src)
+ if(istype(failsafe))
recover()
qdel(failsafe)
diff --git a/code/controllers/hooks-defs.dm b/code/controllers/hooks-defs.dm
index ae0e7e85b69..68db39c69dc 100644
--- a/code/controllers/hooks-defs.dm
+++ b/code/controllers/hooks-defs.dm
@@ -99,3 +99,24 @@
* Parameters: var/mob/living/carbon/human/captain
*/
/hook/captain_spawned
+
+/**
+ * Mob login hook.
+ * Called in login.dm when a player logs in to a mob.
+ * Parameters: var/client/client, var/mob/mob
+ */
+/hook/mob_login
+
+ /**
+ * Mob logout hook.
+ * Called in logout.dm when a player logs out of a mob.
+ * Parameters: var/client/client, var/mob/mob
+ */
+/hook/mob_logout
+
+/**
+ * Mob area change hook.
+ * Called in area.dm when a mob moves from one area to another.
+ * Parameters: var/mob/mob, var/area/newarea, var/area/oldarea
+ */
+/hook/mob_area_change
diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm
index d2bd83461f8..c3c0ea77ddb 100644
--- a/code/controllers/master_controller.dm
+++ b/code/controllers/master_controller.dm
@@ -11,16 +11,16 @@ var/global/air_processing_killed = 0
var/global/pipe_processing_killed = 0
/datum/controller
- var/processing = 0
- var/iteration = 0
- var/processing_interval = 0
+ var/processing = 0
+ var/iteration = 0
+ var/processing_interval = 0
/datum/controller/proc/recover() // If we are replacing an existing controller (due to a crash) we attempt to preserve as much as we can.
-datum/controller/game_controller
- var/list/shuttle_list // For debugging and VV
+/datum/controller/game_controller
+ var/list/shuttle_list // For debugging and VV
-datum/controller/game_controller/New()
+/datum/controller/game_controller/New()
//There can be only one master_controller. Out with the old and in with the new.
if(master_controller != src)
if(istype(master_controller))
@@ -38,12 +38,16 @@ datum/controller/game_controller/New()
if(!syndicate_code_phrase) syndicate_code_phrase = generate_code_phrase()
if(!syndicate_code_response) syndicate_code_response = generate_code_phrase()
-datum/controller/game_controller/proc/setup()
+/datum/controller/game_controller/proc/setup()
world.tick_lag = config.Ticklag
+ zlevels.initialize()
+
preloadTemplates()
if(!config.disable_away_missions)
createRandomZlevel()
+ if(!config.disable_space_ruins)
+ seedRuins(7, rand(0, 3), /area/space, space_ruins_templates)
setup_objects()
setupgenetics()
@@ -55,21 +59,21 @@ datum/controller/game_controller/proc/setup()
populate_spawn_points()
-datum/controller/game_controller/proc/setup_objects()
+/datum/controller/game_controller/proc/setup_objects()
var/watch = start_watch()
var/count = 0
var/overwatch = start_watch() // Overall.
log_startup_progress("Populating asset cache...")
populate_asset_cache()
- log_startup_progress(" Populated [asset_cache.len] assets in [stop_watch(watch)]s.")
+ log_startup_progress(" Populated [asset_cache.len] assets in [stop_watch(watch)]s.")
watch = start_watch()
log_startup_progress("Initializing objects...")
for(var/atom/movable/object in world)
object.initialize()
count++
- log_startup_progress(" Initialized [count] objects in [stop_watch(watch)]s.")
+ log_startup_progress(" Initialized [count] objects in [stop_watch(watch)]s.")
watch = start_watch()
count = 0
@@ -83,7 +87,7 @@ datum/controller/game_controller/proc/setup_objects()
var/obj/machinery/atmospherics/unary/vent_scrubber/T = U
T.broadcast_status()
count++
- log_startup_progress(" Initialized [count] atmospherics machines in [stop_watch(watch)]s.")
+ log_startup_progress(" Initialized [count] atmospherics machines in [stop_watch(watch)]s.")
watch = start_watch()
count = 0
@@ -91,6 +95,6 @@ datum/controller/game_controller/proc/setup_objects()
for(var/obj/machinery/atmospherics/machine in machines)
machine.build_network()
count++
- log_startup_progress(" Initialized [count] pipe networks in [stop_watch(watch)]s.")
+ log_startup_progress(" Initialized [count] pipes in [stop_watch(watch)]s.")
log_startup_progress("Finished object initializations in [stop_watch(overwatch)]s.")
diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm
index 97c490852b6..25b038554cc 100644
--- a/code/controllers/verbs.dm
+++ b/code/controllers/verbs.dm
@@ -28,7 +28,7 @@
if("Master")
debug_variables(master_controller)
feedback_add_details("admin_verb","DMC")
- if ("failsafe")
+ if("failsafe")
debug_variables(failsafe)
feedback_add_details("admin_verb", "dfailsafe")
if("Ticker")
diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm
index 6b7e4e7558f..52c976ec470 100644
--- a/code/controllers/voting.dm
+++ b/code/controllers/voting.dm
@@ -200,7 +200,7 @@ datum/controller/vote
return 0
choices.Add(config.votable_modes)
if("crew_transfer")
- if (check_rights(R_ADMIN|R_MOD))
+ if(check_rights(R_ADMIN|R_MOD))
if(ticker.current_state <= 2)
return 0
question = "End the shift?"
@@ -229,11 +229,11 @@ datum/controller/vote
to_chat(world, "[text] \nType vote to place your votes.\nYou have [config.vote_period/10] seconds to vote. ")
switch(vote_type)
if("crew_transfer")
- to_chat(world, sound('sound/ambience/alarm4.ogg'))
+ world << sound('sound/ambience/alarm4.ogg')
if("gamemode")
- to_chat(world, sound('sound/ambience/alarm4.ogg'))
+ world << sound('sound/ambience/alarm4.ogg')
if("custom")
- to_chat(world, sound('sound/ambience/alarm4.ogg'))
+ world << sound('sound/ambience/alarm4.ogg')
if(mode == "gamemode" && going)
going = 0
to_chat(world, "Round start has been delayed. ")
diff --git a/code/datums/Emote_system/emote.dm b/code/datums/Emote_system/emote.dm
deleted file mode 100644
index 07089785740..00000000000
--- a/code/datums/Emote_system/emote.dm
+++ /dev/null
@@ -1,584 +0,0 @@
-/*******************************************************************************************************
- Emotes
-Remember, only 1 instance of each emote is made, and used by all mobs that can access it. As such, the
-ONLY place you can safely set object variables during runtime is in New(). Otherwise override the emote.
-The only exception to this is custom emotes, which are created as needed and only last until they are finished
-VampyrBytes
-
-*******************************************************************************************************/
-#define EMOTE_COOLDOWN 20 //Time in deciseconds that the cooldown lasts
-#define HEARING_RANGE 7
-#define INVALID -1 //Using -1 as I can't see how a negative number could be a valid input
-
-/datum/emote
- var/name = ""
- var/desc = ""
- var/list/commands[0] // list of commands that trigger the emote.
- var/text = ""
- var/selfText = "" // the version of text that you should see - eg, if text is screams, you want scream here, as You screams is bad grammer
- var/startText = "" // if you need to put something in before [user]
- var/selfStart = 1 // whether the start text is used in what you see
-
- var/audible = 0
- var/mimeText = ""
- var/mimeSelf = "" //self version of mimeText
- var/sound // sound file
- var/vol = 50
- var/muzzleAffected = 0 // whether being muzzled affects this emote
- var/muzzledNoise = "" // if the emote is audible and you're muzzled, this is what type of noise you make (eg weak, loud).
- var/cooldown = 0 // How long the cooldown should be on this emote. Defaults to EMOTE_COOLDOWN if not set and the emote plays a sound
-
- var/restrained = 0 // 1 if being restrained prevents this emote
-
- var/canTarget = 0 // 1 if the emote accepts a target
- var/targetMob = 0 // 0 if target can be any atom, 1 if it has to be a mob,
- var/mustTarget = 0 // 1 if the emote needs a target to work (won't get None as an option)
- var/targetText = "at" // what goes inbetween user and target
- var/takesNumber = 0 // 1 if the emote uses a number parameter
-
- var/emoteSpanClass = "notice"
- var/userSpanClass = "em"
- var/baseLevel = 1
- var/allowParent = 0 // 1 if you want the parent available as well as this one
-
-
-/datum/emote/New()
- var/pathString = "[type]"
- var/count = 0
- for(var/i in 1 to lentext(pathString))
- var/char = copytext(pathString, i, i+1)
- if(char == "/")
- count++
- if(count == 4)
- baseLevel = 0
- break
-
- if(sound && !cooldown)
- cooldown = EMOTE_COOLDOWN
-
- if(targetText)
- if(!findtextEx(targetText, " ", lentext(targetText)))
- targetText += " "
-
-/datum/emote/proc/doEmote(var/mob/user, var/command = "")
- if(!istype(user))
- return
- if(cooldown)
- if(handle_emote_CD(user))
- return
-
- var/message = ""
- var/list/params[0]
-
- params = getParams(user)
-
- for(var/p in params)
- if(params[p] == INVALID)
- return
-
- if(text)
- message = createMessage(user, params)
-
- if(message)
- message = addExtras(user, params, message)
- . = processMessage(user, params, message)
-
- if(!doMime(user) && (!muzzleAffected || !isMuzzled(user)))
- if(playSound(user, params))
- . = 2
-
- doAction(user, params)
-
- for(var/obj/item/weapon/implant/I in user)
- if(I.implanted)
- I.trigger(command, user)
-
- return
-
-// for things that the emote does that aren't text or sound based
-/datum/emote/proc/doAction(var/mob/user, var/list/params)
- return
-
-/datum/emote/proc/getParams(var/mob/user)
- var/list/params[0]
-
- if(takesNumber)
- user.set_typing_indicator(1)
- user.hud_typing = 1
- params["num"] = getNumber(user)
- user.hud_typing = 0
- user.set_typing_indicator(0)
-
- if(canTarget)
- user.set_typing_indicator(1)
- user.hud_typing = 1
- params["target"] = getTarget(user)
- user.hud_typing = 0
- user.set_typing_indicator(0)
- return params
-
-// return INVALID from either of these getters if you've tested the input and it's failed
-/datum/emote/proc/getNumber(var/mob/user)
- var/number = input("How many?", "Enter number") as null|num
- return number
-
-/datum/emote/proc/getTarget(var/mob/user)
- if(user.sdisabilities & BLIND || user.blinded || user.paralysis)
- return
- var/list/targets = list()
- if(!mustTarget)
- targets += "None"
- var/target
- if(targetMob)
- target = getMobTarget(user, targets)
- else
- target = getAtomTarget(user, targets)
- if(!target)
- return INVALID
- if(target == "None")
- return
- return target
-
-/datum/emote/proc/getMobTarget(var/mob/user, var/list/targets)
- for(var/mob/M in view(getLoc(user)))
- targets += M
- var/mob/target = input("Select target", "Target Mob") as null|anything in targets
- return target
-
-
-/datum/emote/proc/getAtomTarget(var/mob/user, var/list/targets)
- for(var/A in oview(getLoc(user)))
- if(ismob(A) || isobj(A) || isturf(A))
- targets += A
- var/atom/target = input("Select target", "Target") as null|anything in targets
- return target
-
-// returns the reason the user can't currently do the emote
-/datum/emote/proc/prevented(var/mob/user)
- if(user.stat == DEAD)
- return "you are dead"
- if(user.stat == UNCONSCIOUS)
- return "you are unconscious"
- if(restrained && user.restrained())
- return "you are restrained"
- if(isbrain(user))
- var/mob/living/carbon/brain/brain = user
- if(!(brain.container && istype(brain.container, /obj/item/device/mmi)))
- return "you need to be in an mmi to do this"
-
-// return 1 if this emote can be used by this type of user
-/datum/emote/proc/available(var/mob/user)
- return
-
-/datum/emote/proc/createMessage(var/mob/user, var/list/params)
- if(!text)
- return
- var/message = ""
-
- if(doMime(user))
- message = mimeMessage(user, params)
- if(message)
- return message
-
- if(muzzleAffected && isMuzzled(user))
- message = muzzleMessage(user, params)
- return message
-
- if(checkForParams(params))
- message = paramMessage(user, params)
- return message
-
- message = standardMessage(user, params)
-
- return message
-
-/datum/emote/proc/isMuzzled(var/mob/user)
- if(user.sdisabilities & MUTE || user.is_muzzled())
- return 1
- if(!isliving(user))
- return
- var/mob/living/L = user
- if(L.silent)
- return 1
-
-/datum/emote/proc/checkForParams(var/list/params)
- for(var/p in params)
- if(p == "target")
- continue
- return 1
-
-/datum/emote/proc/addExtras(var/mob/user, var/list/params, var/message = "")
- if(!message)
- return
- if(startText)
- message = "[startText] [message]"
- message = addPunc(message)
- message = "[message] "
- return message
-
-/datum/emote/proc/addPunc(var/message = "")
- var/regex/endingPunc = new("\[\\.!\\?\"]$")
- if(!endingPunc.Find(message))
- message += "."
- return message
-
-/datum/emote/proc/standardMessage(var/mob/user, var/list/params)
- var/message = "\The [user] [text]"
- if("target" in params)
- message = addTarget(user, params, message)
- return message
-
-/datum/emote/proc/mimeMessage(var/mob/user, var/list/params)
- if(!mimeText)
- return
- if(checkForParams(params))
- return paramMimeMessage(user, params)
- var/message = "\The [user] [mimeText]"
- if(message && "target" in params)
- message = addTarget(user, params, message)
- return message
-
-/datum/emote/proc/muzzleMessage(var/mob/user, var/list/params)
- var/message = "\The [user] makes a "
- if(muzzledNoise)
- message += "[muzzledNoise] "
- message += "noise"
- return message
-
-// if the emote takes a non target parameter, set up and return the with parameter version in here
-/datum/emote/proc/paramMessage(var/mob/user, var/list/params)
- return
-
-// as above, but for mimes when there is mimeText
-/datum/emote/proc/paramMimeMessage(var/mob/user, var/list/params)
- return
-
-/datum/emote/proc/addTarget(var/mob/user, var/list/params, var/message = "")
- if(!canTarget)
- return message
- if(!params["target"])
- return message
- if(params["target"] == user)
- message += " [targetText][getHimself(user)]"
- return message
- message += " [targetText]\the [params["target"]]"
- return message
-
-
-// What you should see when you perform the emote
-/datum/emote/proc/createSelfMessage(var/mob/user, var/list/params, var/message = "")
- if(!selfText)
- return message
-
- message = replacetext(message, text, selfText)
- message = changeTextMacros(user, message)
-
- if(mimeSelf)
- message = replacetext(message, mimeText, mimeSelf)
-
- if(startText && !selfStart)
- var/start = findtextEx(message, startText)
- var/end = start + lentext(startText) + 1
- message = copytext(message, 1, start) + copytext(message, end, lentext(message) + 1)
-
- message = replaceMobWithYou(user, message)
-
- return message
-
-/datum/emote/proc/replaceMobWithYou(var/mob/M, var/message = "", var/mob/user) // user passed in in case an override needs to do something different if M != user (see johnny) VB
-
- message = replacetext(message, "\The [M]", "You")
- message = replacetext(message, "\the [M]", "you")
-
- return message
-
-/datum/emote/proc/processMessage(var/mob/user, var/list/params, var/message = "")
- var/visualOrAudible = audible + 1
- if(doMime(user))
- visualOrAudible = 1
-
- log_emote("[user.name]/[user.key] : [message]")
- sendToDead(message)
- for(var/mob/M in getRecipients(getLoc(user, message), visualOrAudible))
- var/msg = ""
-
- if(M==user)
- msg = createSelfMessage(user, params, message)
- if(msg)
- outputMessage(M, msg)
- continue
-
- if(M.stat == UNCONSCIOUS || (M.sleeping && M.stat != DEAD))
- if(!visualOrAudible == 2)
- continue
- msg = "... You can almost hear someone talking ... "
- outputMessage(M, msg)
- continue
-
- if(M.sdisabilities & DEAF || M.ear_deaf)
- if(M.sdisabilities & BLIND || M.blinded || M.paralysis)
- continue
- if(!(M in getRecipients(user, 1)) || M.see_invisible < user.invisibility)
- continue
-
- msg = createDeafMessage(user, params, message)
- if(!msg && visualOrAudible == 2)
- continue
- if(msg)
- outputMessage(M, msg)
- continue
-
- if(M.sdisabilities & BLIND || M.blinded || M.paralysis || (M.see_invisible < user.invisibility && visualOrAudible == 2))
- if(!(M in getRecipients(user, 2)))
- continue
-
- msg = createBlindMessage(user, params, message)
- if(!msg && visualOrAudible == 1)
- continue
- if(msg)
- outputMessage(M, msg)
- continue
-
- if(M.see_invisible < user.invisibility && visualOrAudible == 1)
- continue
-
- msg = message
- outputMessage(M, msg, user)
-
- if(visualOrAudible == 2)
- handleListeningObjects(user, message)
-
- return visualOrAudible
-
-/datum/emote/proc/outputMessage(var/mob/M, var/msg = "", var/mob/user)
- msg = replaceMobWithYou(M, msg, user)
- to_chat(M, msg)
-
-/datum/emote/proc/getLoc(var/mob/user, var/message = "")
- var/loc = checkForHolopad(user, message)
- if(loc)
- return loc
- return user
-
-/datum/emote/proc/checkForHolopad(var/mob/user, var/message = "")
- if(!isAI(user))
- return
- var/mob/living/silicon/ai/AI = user
- var/obj/machinery/hologram/holopad/T = AI.holo
- if(!(T && T.hologram && T.master == AI))
- return
- if(message)
- to_chat(AI, "Holopad action relayed, [message] ")
- return T
-
-/datum/emote/proc/handleListeningObjects(var/mob/user, var/message = "")
- // based on say code
- var/omsg = replacetext(message, "[user] ", "")
- var/list/listening_obj = new
- for(var/atom/movable/A in view(HEARING_RANGE, user))
- if(istype(A, /mob))
- var/mob/M = A
- for(var/obj/O in M.contents)
- listening_obj |= O
- else if(istype(A, /obj))
- var/obj/O = A
- listening_obj |= O
- for(var/obj/O in listening_obj)
- O.hear_message(user, omsg)
-
-/datum/emote/proc/getRecipients(var/location, var/visualOrAudible)
- if(visualOrAudible == 1)
- return viewers(location)
- return get_mobs_in_view(HEARING_RANGE, location)
-
-// set up different messages for blind people here. Empty will mean no message for
-//non-audible emotes and the standard message for audible ones
-/datum/emote/proc/createBlindMessage(var/mob/user, var/list/params, var/message)
- if(audible && selfText)
- message = "You hear someone [selfText]"
- message = addExtras(message)
- return message
-
-// set up different messages for deaf people here. Empty will mean no message for
-// audible emotes and standard for non-audible ones
-/datum/emote/proc/createDeafMessage(var/mob/user, var/list/params, var/message)
- message = mimeMessage(user, params)
- message = addExtras(message)
- return message
-
-/datum/emote/proc/sendToDead(var/message = "")
- for(var/mob/M in dead_mob_list)
- if(!M.client || istype(M, /mob/new_player))
- continue //skip monkeys, leavers and new players
- if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
- M.show_message(message)
-
-/datum/emote/proc/playSound(var/mob/user, var/list/params)
- if(!sound)
- return
- playsound(user, sound, vol)
- return 1
-
-/datum/emote/proc/doMime(var/mob/user)
- if(mimeText && user.mind && user.mind.miming)
- return 1
-
-//Emote Cooldown System (it's so simple!)
-/datum/emote/proc/handle_emote_CD(var/mob/user)
- if(user.emote_cd == 2) return 1 // Cooldown emotes were disabled by an admin, prevent use
- if(user.emote_cd == 1) return 1 // Already on CD, prevent use
-
- user.emote_cd = 1 // Starting cooldown
-
- spawn(cooldown)
- if(user.emote_cd == 2) return 1 // Don't reset if cooldown emotes were disabled by an admin during the cooldown
- user.emote_cd = 0 // Cooldown complete, ready for more!
-
- return 0 // Proceed with emote
-//--FalseIncarnate
-
-/datum/emote/proc/changeTextMacros(var/mob/user, var/message = "")
- message = swapHisToYour(user, message)
- message = swapHimselfToYourself(user, message)
- return message
-
-/datum/emote/proc/getHis(var/mob/user)
- var/his = "[user]\his"
- his = copytext(his, lentext("[user]") + 1)
- return his
-
-/datum/emote/proc/swapHisToYour(var/mob/user, var/message = "")
- var/his = getHis(user)
- message = replacetext(message, " [his] ", " your ")
- return message
-
-/datum/emote/proc/getHimself(var/mob/user)
- var/himself = "[user]\himself"
- himself = copytext(himself, lentext("[user]") + 1)
- return himself
-
-/datum/emote/proc/swapHimselfToYourself(var/mob/user, var/message)
- var/himself = getHimself(user)
- message = replacetext(message, "[himself]", "yourself")
- return message
-
-/******************************************************************************************
- Emote Verbs
-******************************************************************************************/
-
-/datum/emote/proc/addVerbs(var/mob/user)
- if(!istype(user))
- return
- new /obj/emoteVerb(user, src, commands)
-
-// Dummy object to allow access to the verb, needed as verbs require a valid loc for setting the src
-/obj/emoteVerb
- var/datum/emote/emote
- var/mob/owner
-
-/obj/emoteVerb/New(var/mob/user, var/datum/emote/toAccess)
- if(!(istype(user)))
- return
- if(!(istype(toAccess)))
- return
- if(!toAccess.commands)
- return
- owner = user
- emote = toAccess
- name = "[emote]"
- loc = user
- user.verbs += new/obj/emoteVerb/proc/runEmote(src, emote.commands[1], emote.desc)
-
-/obj/emoteVerb/proc/runEmote()
- set src = usr.contents
- set category = "Emotes"
- return usr.emoteHandler.runEmote(emote.commands[1])
-
-/obj/emoteVerb/Destroy()
- owner.verbs -= new/obj/emoteVerb/proc/runEmote(src, emote.commands[1])
- ..()
-
-/obj/emoteVerb/custom
-
-obj/emoteVerb/custom/New(var/mob/user)
- if(!(istype(user)))
- return
- owner = user
- name = "custom"
- user.verbs += new/obj/emoteVerb/proc/runEmote(src, "custom", "Make your own emote")
-
-/obj/emoteVerb/custom/runEmote()
- set src = usr.contents
- set category = "Emotes"
- return usr.emoteHandler.runEmote("me")
-
-
-
-/**************************************************************************************************************************
- Custom Emotes
-As these are made as needed, they aren't searched for the appropriate one. As such, you need to specify conditions for which
-one is used in /datum/emote_handler/customEmote().
-
-***************************************************************************************************************************/
-
-/datum/emote/custom
- name = "Custom emote"
- baseLevel = 0
-
-/datum/emote/custom/New(var/mob/user, var/message = "", var/isAudible)
- if(!message)
- message = getMessage(user)
- text = message
- audible = isAudible
-
-/datum/emote/custom/proc/getMessage(var/mob/user)
-// user.set_typing_indicator(1)
-// user.hud_typing = 1
- var/input = sanitize(copytext(input(user,"What do you want to emote?.", "Custom emote") as text|null,1,MAX_MESSAGE_LEN))
-// user.hud_typing = 0
-// user.set_typing_indicator(0)
- input = strip_html_properly(input)
- return input
-
-/datum/emote/custom/available(var/mob/user)
- return 1
-
-/datum/emote/custom/prevented(var/mob/user)
- if(!user.use_me)
- return "you are prevented from using custom emotes"
-
-// Yeah, no
-/datum/emote/custom/createSelfMessage(var/mob/user, var/list/params, var/message = "")
- return
-
-/datum/emote/custom/replaceMobWithYou(var/mob/M, var/message = "", var/mob/user)
- return message
-
-/datum/emote/custom/ghost
- name = "Ghost emote"
- startText = "DEAD: "
- emoteSpanClass = "game deadsay"
-
-/datum/emote/custom/ghost/prevented(var/mob/user)
- . = ..()
- if(.)
- return
- if(user.client.prefs.muted & MUTE_DEADCHAT)
- return "you are muted from deadchat"
- if(!(user.client.prefs.toggles & CHAT_DEAD))
- return "you have deadchat muted"
- if(!user.client.holder)
- if(!config.dsay_allowed)
- return "deadchat is globally muted"
-
-/datum/emote/custom/ghost/getMessage(var/mob/user)
- var/input = sanitize(copytext(input(user,"What do you want to emote?.", "Custom emote") as text|null,1,MAX_MESSAGE_LEN))
- input = strip_html_properly(input)
- return input
-
-/datum/emote/custom/ghost/processMessage(var/mob/user, var/list/params, var/message = "")
- if(!message)
- return
- log_emote("Ghost/[user.key] : [message]")
- sendToDead(message)
-
diff --git a/code/datums/Emote_system/emote_handler.dm b/code/datums/Emote_system/emote_handler.dm
deleted file mode 100644
index be962a72dc7..00000000000
--- a/code/datums/Emote_system/emote_handler.dm
+++ /dev/null
@@ -1,90 +0,0 @@
-/datum/emoteHandler
- var/mob/owner
- var/list/commands
-
-/datum/emoteHandler/New(var/mob/user)
- owner = user
- setupCommands()
-
-/datum/emoteHandler/proc/setupCommands(var/reset = 0)
- spawn(0) // needed so at mob creation species is set before emotes are allocated
- if(reset)
- deleteEmoteVerbs()
- commands = new/list()
- for(var/e in emotes)
- var/datum/emote/emote = e
- if(emote.baseLevel || emote.allowParent)
- var/datum/emote/found = searchTree(emote)
- if(found)
- for(var/command in found.commands)
- commands[lowertext(command)] = found
- found.addVerbs(owner)
-
-/datum/emoteHandler/proc/deleteEmoteVerbs()
- for(var/obj/emoteVerb/E in owner.contents)
- qdel(E)
-
-/datum/emoteHandler/proc/runEmote(var/command = "", var/message = "", var/audible = 0) // message and audible only used in custom emotes
- if(!command)
- return 0
- if(command == "help")
- showCommands()
- return 1
-
- var/datum/emote/emote
-
- if(copytext(command, 1, 3) == "me" && !message && lentext(command) >= 4)
- message = copytext(command, 4)
- command = "me"
-
- if(command == "me")
- emote = customEmote(message, audible)
- if(!emote)
- return 0
-
- if(!commands[command] && !(command == "me"))
- to_chat(owner, "Unknown emote, please check *help for emotes available to your character ")
- return 0
-
- if(!emote)
- emote = commands[command]
-
- if(!emote.available(owner)) // something's changed, remake the commands list, then try again to see if they've got a different version
- setupCommands()
- return runEmote(command, message, audible)
-
- var/prevented = emote.prevented(owner)
- if(prevented)
- to_chat(owner, "You can't do that because [prevented]! ")
- return 0
- return emote.doEmote(owner, command)
-
-/datum/emoteHandler/proc/showCommands()
- var/emoteList = "Available emotes are "
- var/commandAdded = 0
- for(var/c in commands)
- if(commandAdded)
- emoteList += ", "
- emoteList += c
- commandAdded = 1
-
- to_chat(owner, emoteList)
-
-// recursive search of subtypes - starts checking at the lowest level and breaks out if it finds one that can be done
-/datum/emoteHandler/proc/searchTree(var/datum/emote/emote)
- var/list/subtypes = subtypesof(emote.type)
- var/datum/emote/found
- for(var/t in subtypes)
- var/datum/emote/em = new t
- if(em.allowParent)
- continue
- found = searchTree(em)
- if(found)
- return (found)
- if(emote.available(owner))
- return emote
-
-/datum/emoteHandler/proc/customEmote(var/custom, var/audible)
- if(isobserver(owner))
- return new /datum/emote/custom/ghost(owner, custom, audible)
- return new /datum/emote/custom(owner, custom, audible)
diff --git a/code/datums/Emote_system/emotes.dm b/code/datums/Emote_system/emotes.dm
deleted file mode 100644
index a5383c30c23..00000000000
--- a/code/datums/Emote_system/emotes.dm
+++ /dev/null
@@ -1,1718 +0,0 @@
-
-/datum/emote/airguitar
- name = "airguitar"
- desc = "Makes the mob play an air guitar"
- commands = list("airguitar")
- text = "is strumming the air and headbanging like a safari chimp"
- selfText = "are strumming the air and headbanging like a safari chimp"
- restrained = 1
-
-/datum/emote/airguitar/available(var/mob/user)
- if(ishuman(user))
- return 1
- if(isrobot(user))
- return 1
-
-/datum/emote/alarm
- name = "alarm"
- desc = "makes the mob sound an alarm"
- commands = list("alarm")
- text = "sounds an alarm"
- selfText = "sound an alarm"
- audible = 1
-
-/datum/emote/alarm/available(var/mob/user)
- if(isbrain(user))
- return 1
-
-/datum/emote/alarm/createBlindMessage(var/mob/user, var/params, var/messaage)
- return "You hear an alarm"
-
-/datum/emote/alert
- name = "alert"
- desc = "Makes the mob sound an alert"
- commands = list("alert")
- text = "lets out a distressed noise"
- selfText = "let out a distressed noise"
- audible = 1
-
-/datum/emote/alert/available(var/mob/user)
- if(isbrain(user))
- return 1
-
-/datum/emote/beep
- name = "beep"
- desc = "makes the mob let out a beep"
- commands = list("beep")
- text = "beeps"
- selfText = "beep"
- audible = 1
-
-/datum/emote/beep/available(var/mob/user)
- if(isbrain(user))
- return 1
-
-/datum/emote/beep/targetted
- sound = 'sound/machines/twobeep.ogg'
- cooldown = 50
- canTarget = 1
- targetMob = 1
-
-/datum/emote/beep/targetted/available(var/mob/user)
- if(user.is_mechanical())
- return 1
-
-/datum/emote/blink
- name = "blink"
- desc = "Makes the mob blink"
- commands = list("blink", "blinks")
- text = "blinks"
- selfText = "blink"
-
-/datum/emote/blink/available(var/mob/user)
- if(ishuman(user))
- return 1
- if(isbrain(user))
- return 1
-
-/datum/emote/blink/rapid
- name = "rapid blink"
- desc = "Makes the mob blink rapidly"
- commands = list("blink_r", "blinks_r")
- allowParent = 1
-
-/datum/emote/blink/rapid/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/blink/rapid/standardMessage(var/mob/user)
- var/message = ..()
- message += " rapidly"
- return message
-
-/datum/emote/blush
- name = "blush"
- desc = "Makes the mob blush"
- commands = list("blush", "blushes")
- text = "blushes"
- selfText = "blush"
-
-/datum/emote/blush/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/boop
- name = "boop"
- desc = "Makes the mob boop"
- commands = list("boop", "boops")
- text = "boops"
- selfText = "boop"
-
-/datum/emote/boop/available(var/mob/user)
- if(isbrain(user))
- return 1
-
-/datum/emote/bounce
- name = "bounce"
- desc = "Makes the mob bounce"
- commands = list("bounce", "bounces")
- text = "bounces in place"
- selfText = "bounce in place"
-
-/datum/emote/bounce/available(var/mob/user)
- if(isslime(user))
- return 1
-
-/datum/emote/bow
- name = "bow"
- desc = "Makes the mob bow"
- commands = list("bow", "bows")
- text = "bows"
- selfText = "bow"
- canTarget = 1
- targetMob = 1
- targetText = "to"
-
-/datum/emote/bow/available(var/mob/user)
- if(isrobot(user))
- return 1
- if(ishuman(user))
- return 1
-
-/datum/emote/bow/prevented(var/mob/user)
- . = ..()
- if(!. && user.buckled)
- return "you are buckled to something"
-
-/datum/emote/burp
- name = "burp"
- desc = "Makes the mob burp"
- commands = list("burp", "burps")
- text = "burps"
- selfText = "burp"
- audible = 1
- mimeText = "opens their mouth rather obnoxiously"
- mimeSelf = "open your mouth rather obnoxiously"
- muzzleAffected = 1
- muzzledNoise = "peculiar"
-
-/datum/emote/burp/available(var/mob/user)
- if(ishuman(user))
- return 1
- if(islarva(user) || isalienadult(user))
- return 1
-
-/datum/emote/buzz
- name = "buzz"
- desc = "Makes the mob buzz"
- commands = list("buzz", "buzzes", "buzzs")
- text = "buzzes"
- selfText = "buzz"
- audible = 1
- sound = 'sound/machines/buzz-sigh.ogg'
- canTarget = 1
- targetMob = 1
-
-/datum/emote/buzz/available(var/mob/user)
- if(user.is_mechanical())
- return 1
-
-/datum/emote/buzz/buzz2
- name = "buzz 2"
- desc = "makes the mob buzz in an irritated way"
- commands = list("buzz2")
- text = "makes an irritated buzzing sound"
- selfText = "make an irritated buzzing sound"
- sound = "sound/machines/buzz-two.ogg"
- allowParent = 1
-
-/datum/emote/chirp
- name = "chirp"
- desc = "Makes the mob chirp"
- commands = list("chirp", "chirps")
- text = "chirps"
- selfText = "chirp"
- audible = 1
- sound = 'sound/misc/nymphchirp.ogg'
- vol = 40
- cooldown = 50
-
-/datum/emote/chirp/available(var/mob/user)
- if(istype(user, /mob/living/simple_animal/diona))
- return 1
-
-/datum/emote/choke
- name = "choke"
- desc = "Makes the mob choke"
- commands = list("choke", "chokes")
- text = "chokes"
- selfText = "choke"
- audible = 1
- mimeText = "clutches"
- mimeSelf = "clutch"
- muzzleAffected = 1
- muzzledNoise = "strong"
-
-/datum/emote/choke/available(var/mob/user)
- if(ishuman(user))
- return 1
- if(islarva(user) || isalienadult(user))
- return 1
-
-// This has to be done here not mimeText because \his will throw a compile error
-// instead of a runtime if there's not a valid target in the string *frown VB
-/datum/emote/choke/mimeMessage(var/mob/user, var/list/params)
- var/message = "[user] [mimeText] \his throat desperately"
- return message
-
-/datum/emote/chuckle
- name = "chuckle"
- desc = "chuckle"
- commands = list("chuckle", "chuckles")
- text = "chuckles"
- selfText = "chuckle"
- audible = 1
- mimeText = "appears to chuckle"
- mimeSelf = "appear to chuckle"
- muzzleAffected = 1
-
-/datum/emote/chuckle/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/clap
- name = "clap"
- desc = "clap"
- commands = list("clap", "claps")
- text = "claps"
- selfText = "clap"
- audible = 1
- mimeText = "claps silently"
- restrained = 1
-
-/datum/emote/clap/available(var/mob/user)
- if(isrobot(user))
- return 1
- if(ishuman(user))
- return 1
-
-/datum/emote/collapse
- name = "collapse"
- desc = "Makes the mob collapse"
- commands = list("collapse", "collapses")
- text = "collapses"
- selfText = "collapse"
- audible = 1
- mimeText = "collapses without a sound"
-
-/datum/emote/collapse/available(var/mob/user)
- if(islarva(user))
- return 1
- if(ishuman(user))
- return 1
-
-/datum/emote/collapse/doAction(var/mob/user, var/list/params)
- user.Paralyse(2)
-
-/datum/emote/cough
- name = "cough"
- desc = "Makes the mob cough"
- commands = list("cough", "coughs")
- text = "coughs"
- selfText = "cough"
- audible = 1
- mimeText = "appears to cough"
- mimeSelf = "appear to cough"
- muzzleAffected = 1
- muzzledNoise = "strong"
-
-/datum/emote/cough/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/cry
- name = "cry"
- desc = "Makes the mob cry"
- commands = list("cry", "cries")
- text = "cries"
- selfText = "cry"
- audible = 1
- mimeText = "cries silently"
- muzzleAffected = 1
- muzzledNoise = "weak"
-
-/datum/emote/cry/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/dance
- name = "dance"
- desc = "makes the mob dance around happily"
- commands = list("dance", "dances")
- text = "dances around happily"
- selfText = "dance around happily"
- restrained = 1
-
-/datum/emote/dance/available(var/mob/user)
- if(islarva(user))
- return 1
-
-/datum/emote/dap
- name = "dap"
- desc = "Makes the mob give daps"
- commands = list("dap", "daps")
- text = "gives daps"
- selfText = "give daps"
- restrained = 1
- canTarget = 1
- targetMob = 1
- targetText = "to"
-
-/datum/emote/dap/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/dap/addTarget(var/mob/user, var/list/params, var/message = "")
- if(!params["target"] || params["target"] == user)
- message = "[user] sadly can't find anybody to give daps to, and daps \himself. Shameful"
- return message
- return ..()
-
-/datum/emote/deathgasp
- name = "deathgasp"
- desc = "Makes the mob let out it's final gasp"
- commands = list("deathgasp", "deathgasps")
- audible = 1
-
-/datum/emote/deathgasp/alien
- text = "lets out a waning guttural screech, green blood bubbling from its maw..."
- selfText = "let out a waning guttural screech, green blood bubbling from your maw..."
-
-/datum/emote/deathgasp/alien/available(var/mob/user)
- if(isalienadult(user))
- return 1
-
-// sorry, no selftext for humans as we'd have to add a var to species for it and that's yuk - VB
-/datum/emote/deathgasp/human
- text = "dummytext"
-
-/datum/emote/deathgasp/human/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/deathgasp/human/standardMessage(var/mob/user, var/list/params)
- var/mob/living/carbon/human/U = user
- var/message = "\The [user] [U.species.death_message]"
- return message
-
-/datum/emote/deathgasp/human/createSelfMessage(var/mob/user, var/list/params, var/message)
- return message
-
-/datum/emote/deathgasp/human/replaceMobWithYou(var/mob/user, var/message)
- return message
-
-/datum/emote/deathgasp/robot
- text = "shudders violently for a moment, then becomes motionless, its eyes slowly darkening"
- selfText = "shudder violently for a moment, then become motionless, your eyes slowly darkening"
- audible = 0
-
-/datum/emote/deathgasp/robot/available(var/mob/user)
- if(isrobot(user))
- return 1
-
-/datum/emote/drone
- name = "drone"
- desc = "Makes the mob drone and rumble"
- commands = list("drone", "drones", "rumble", "rumbles", "hum", "hums")
- text = "rumbles"
- selfText = "rumble"
- audible = 1
- sound = 'sound/voice/DraskTalk.ogg'
- canTarget = 1
- targetMob = 1
-
-/datum/emote/drone/available(var/mob/user)
- if(user.get_species() == "Drask")
- return 1
-
-/datum/emote/drone/addTarget(var/mob/user, var/list/params, var/message)
- if(!params["target"])
- return message
- message = replacetext(message, "rumbles", "drones")
- return ..()
-
-/datum/emote/drone/createSelfMessage(var/mob/user, var/list/params, var/message)
- message = ..()
- message = replacetext(message, "drones", "drone")
- return message
-
-/datum/emote/drool
- name = "drool"
- desc = "Makes the mob drool"
- commands = list("drool", "drools")
- text = "drools"
- selfText = "drool"
-
-/datum/emote/drool/available(var/mob/user)
- if(isalienadult(user) || islarva(user))
- return 1
- if(ishuman(user))
- return 1
-
-/datum/emote/eyebrow
- name = "eyebrow"
- desc = "Makes the mob raise an eyebrow"
- commands = list("eyebrow")
- text = "raises an eyebrow"
- selfText = "raise an eyebrow"
-
-/datum/emote/eyebrow/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/faint
- name = "faint"
- desc = "makes the mob faint"
- commands = list("faint", "faints")
- text = "faints"
- selfText = "faint"
-
-/datum/emote/faint/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/faint/doAction(var/mob/user, var/list/params)
- if(!user.sleeping)
- user.sleeping += 1
-
-/datum/emote/fart
- name = "fart"
- desc = "makes the mob fart"
- commands = list("fart", "farts")
- text = "farts"
- selfText = "fart"
- cooldown = 50
- audible = 1
-
-/datum/emote/fart/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/fart/standardMessage(var/mob/user)
- var/message
-
- if(TOXIC_FARTS in user.mutations)
- message = "\The [user] unleashes a [pick("horrible","terrible","foul","disgusting","awful")] fart "
- return message
- message = "\The [user] [pick("passes wind","farts")] "
- return message
-
-/datum/emote/fart/createSelfMessage(var/mob/user, var/list/params, var/message)
- message = ..()
- message = replacetext(message, "unleashes", "unleash")
- message = replacetext(message, "passes", "pass")
- return message
-
-/datum/emote/fart/doAction(var/mob/user)
- if(TOXIC_FARTS in user.mutations)
- for(var/mob/M in range(get_turf(user),2))
- if(M.internal != null && M.wear_mask && (M.wear_mask.flags & AIRTIGHT))
- continue
- if(M == user)
- continue
- M.reagents.add_reagent("jenkem", 1)
-
- if(locate(/obj/item/weapon/storage/bible) in get_turf(user))
- to_chat(viewers(user), "[user] farted on the Bible! ")
- to_chat(viewers(user), "A mysterious force smites [user]! ")
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(3, 1, user)
- s.start()
- user.gib()
-
-/datum/emote/flap
- name = "flap"
- desc = "Makes the mob flap their wings"
- commands = list("flap", "flaps")
- text = "flaps"
- selfText = "flap"
- restrained = 1
- audible = 1
-
-/datum/emote/flap/available(var/mob/user)
- if(ishuman(user))
- return 1
- if(isrobot(user))
- return 1
-
-/datum/emote/flap/standardMessage(var/mob/user, var/list/params)
- var/message = "\The [user] [text] \his wings"
- return message
-
-/datum/emote/flap/angry
- name = "angry flap"
- desc = "makes the mob flap their wings angrily"
- commands = list("a_flap", "a_flaps")
- allowParent = 1
-
-/datum/emote/flap/angry/standardMessage(var/mob/user)
- var/message = ..()
- message += " angrily"
- return message
-
-/datum/emote/flash
- name = "flash"
- desc = "Makes the lights on the mob flash quickly"
- commands = list("flash", "flashes")
- text = "flash quickly"
- selfText = "flash quickly"
- startText = "The lights on"
-
-/datum/emote/flash/available(var/mob/user)
- if(isbrain(user))
- return 1
-
-/datum/emote/flip
- name = "flip"
- desc = "Makes the mob flip, possibly in the direction of someone"
- commands = list("flip", "flips")
- text = "flips"
- selfText = "flip"
- canTarget = 1
- targetMob = 1
- targetText = "in"
-
-/datum/emote/flip/available(var/mob/user)
- if(isrobot(user))
- return 1
-
-/datum/emote/flip/prevented(var/mob/user)
- . = ..()
- if(!. && user.buckled)
- return "you are buckled to something"
-
-/datum/emote/flip/createMessage(var/mob/user, var/list/params)
- var/message = ""
- if(user.lying || user.weakened)
- message = "\The [user] flops and flails around on the floor"
- else
- message = ..()
- return message
-
-/datum/emote/flip/addTarget(var/mob/user, var/list/params, var/message)
- message = ..()
- if(params["target"])
- message += "'s general direction"
- return message
-
-/datum/emote/flip/createSelfMessage(var/mob/user, var/list/params, var/message)
- message = ..()
- message = replacetext(message, "flops", "flop")
- message = replacetext(message, "flails", "flail")
- return message
-
-/datum/emote/flip/doAction(var/mob/user, var/list/params, var/message)
- if(user.lying || user.weakened)
- return
- user.SpinAnimation(5,1)
-
-/datum/emote/flip/flipOver
- desc = "Makes the mob flip, possibly in the direction of, or even over someone"
-
-/datum/emote/flip/flipOver/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/flip/flipOver/createMessage(var/mob/user, var/params)
- var/message = ""
- var/obj/item/weapon/grab/G = user.get_active_hand()
- if(istype(G) && G.affecting && !G.affecting.buckled)
- params["target"] = G.affecting
- message = "\The [user] [text] over [params["target"]]!"
- return message
- return ..()
-
-/datum/emote/flip/flipOver/doAction(var/mob/user, var/params, var/message)
- var/obj/item/weapon/grab/G = user.get_active_hand()
- if(G == params["target"])
- var/turf/oldloc = user.loc
- var/turf/newloc = G.affecting.loc
- if(isturf(oldloc) && isturf(newloc))
- user.SpinAnimation(5,1)
- user.forceMove(newloc)
- G.affecting.forceMove(oldloc)
- return
- ..()
-
-/datum/emote/frown
- name = "frown"
- desc = "Makes the mob frown"
- commands = list("frown", "frowns")
- text = "frowns"
- selfText = "frown"
-
-/datum/emote/frown/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/gasp
- name = "gasp"
- desc = "Makes the mob gasp"
- commands = list("gasp", "gasps")
- text = "gasps"
- selfText = "gasp"
- audible = 1
- mimeText = "appears to be gasping"
- mimeSelf = "appear to be gasping"
- muzzleAffected = 1
- muzzledNoise = "weak"
-
-/datum/emote/gasp/available(var/mob/user)
- if(isalienadult(user) || islarva(user))
- return 1
- if(ishuman(user))
- return 1
-
-/datum/emote/giggle
- name = "giggle"
- desc = "Makes the mob giggle"
- commands = list("giggle", "giggles")
- text = "giggles"
- selfText = "giggle"
- audible = 1
- mimeText = "giggles silently"
- muzzleAffected = 1
-
-/datum/emote/giggle/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/glare
- name = "glare"
- desc = "Makes the mob glare"
- commands = list("glare", "glares")
- text = "glares"
- selfText = "glare"
- canTarget = 1
- targetMob = 1
-
-/datum/emote/glare/available(var/mob/user)
- if(ishuman(user))
- return 1
- if(isrobot(user))
- return 1
-
-/datum/emote/gnarl
- name = "gnarl"
- desc = "Makes the mob gnarl and show its teeth"
- commands = list("gnarl", "gnarls")
- text = "gnarls and shows its teeth"
- selfText = "gnarl and show your teeth"
- audible = 1
- muzzleAffected = 1
-
-/datum/emote/gnarl/available(var/mob/user)
- if(islarva(user))
- return 1
-
-/datum/emote/grin
- name = "grin"
- desc = "Makes the mob grin"
- commands = list("grin", "grins")
- text = "grins"
- selfText = "grin"
-
-/datum/emote/grin/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/groan
- name = "groan"
- desc = "Makes the mob groan"
- commands = list("groan", "groans")
- text = "groans"
- selfText = "groan"
- audible = 1
- mimeText = "appears to groan"
- mimeSelf = "appear to groan"
- muzzleAffected = 1
-
-/datum/emote/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/grumble
- name = "grumble"
- desc = "Makes the mob grumble"
- commands = list("grumble", "grumbles")
- text = "grumbles"
- selfText = "grumble"
- audible = 1
- mimeText = "grumbles"
- muzzleAffected = 1
-
-/datum/emote/grumble/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/halt
- name = "halt"
- desc = "Makes the mob sound a halt warning. Only available with a security module"
- commands = list("halt")
- text = "'s speakers skreech, \"Halt! Security!\""
- selfText = " speakers skreech, \"Halt! Security!\""
- audible = 1
- sound = 'sound/voice/halt.ogg'
-
-/datum/emote/halt/available(var/mob/user)
- if(isrobot(user))
- return 1
-
-/datum/emote/halt/prevented(var/mob/user)
- . = ..()
- if(.)
- return
- var/mob/living/silicon/robot/U = user
- if(!(istype(U.module, /obj/item/weapon/robot_module/security)))
- return "you are not security"
-
-/datum/emote/handshake
- name = "handshake"
- desc = "Makes the mob shake hands with a target"
- commands = list("handshake")
- text = "shakes hands"
- selfText = "shake hands"
- canTarget = 1
- targetMob = 1
- mustTarget = 1
- targetText = "with"
- restrained = 1
-
-/datum/emote/handshake/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/handshake/prevented(var/mob/user)
- . = ..()
- if(!. && user.r_hand)
- return "you need your right hand free"
-
-/datum/emote/handshake/addTarget(var/mob/user, var/list/params, var/message)
- var/mob/target = params["target"]
- if(target.r_hand)
- message = "\The [user] holds out his hand to [params["target"]]"
- return message
- return ..()
-
-/datum/emote/hiss
- name = "hiss"
- desc = "Makes the mob hiss"
- commands = list("hiss", "hisses")
- text = "hisses"
- selfText = "hiss"
- audible = 1
-
-/datum/emote/hiss/available(var/mob/user)
- if(isalienadult(user) || islarva(user))
- return 1
-
-/datum/emote/hug
- name = "hug"
- desc = "Makes the mob hug a target or themselves"
- commands = list("hug", "hugs")
- text = "hugs"
- selfText = "hug"
- canTarget = 1
- targetMob = 1
- targetText = ""
-
-/datum/emote/hug/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/hug/getTarget(var/mob/user)
- var/mob/target = ..()
- if(target)
- return target
- return user
-
-/datum/emote/jiggle
- name = "jiggle"
- desc = "Makes the mob jiggle"
- commands = list("jiggle", "jiggles")
- text = "jiggles"
- selfText = "jiggle"
-
-/datum/emote/jiggle/available(var/mob/user)
- if(isslime(user))
- return 1
-
-/datum/emote/johnny
- name = "johnny"
- desc = "Yeah, just try it"
- commands = list("johnny")
- text = "takes a drag from a cigarette and blows their name out in smoke"
- selfText = "take a drag from a cigarette and blow their name out in smoke"
- audible = 1
- mimeText = "takes a drag from a cigarette and blows"
- mimeSelf = "take a drag from a cigarette and blow"
- canTarget = 1
- targetMob = 1
- mustTarget = 1
- targetText = ""
-
-/datum/emote/johnny/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/johnny/getTarget(var/mob/user)
- var/mob/target = ..()
- if(target != user)
- return target
- to_chat(user, "You need a target that isn't yourself")
- return INVALID
-
-/datum/emote/johnny/createMessage(var/mob/user, var/params)
- if(doMime(user))
- return ..()
- var/message = "\The [user] says \"[params["target"]], please. They had a family.\" [user] [text]"
- return message
-
-/datum/emote/johnny/createSelfMessage(var/mob/user, var/list/params, var/message = "")
- message = ..()
- message = replacetext(message, "says", "say")
- return message
-
-/datum/emote/johnny/createDeafMessage(var/mob/user, vap/list/params, var/message)
- message = "\The [user] says something, then [text]"
- return message
-
-/datum/emote/johnny/replaceMobWithYou(var/mob/M, var/message, var/mob/user)
- if(user && M != user)
- return message
- return ..()
-
-/datum/emote/johnny/createBlindMessage(var/mob/user, var/list/params, var/message)
- message = "You hear someone say \"[params["target"]], please, They had a family\""
- return message
-
-/datum/emote/jump
- name = "jump"
- desc = "Makes the mob jump"
- commands = list("jump", "jumps")
- text = "jumps"
- selfText = "jump"
-
-/datum/emote/jump/available(var/mob/user)
- if(islarva(user) || isalienadult(user))
- return 1
- if(issmall(user))
- return 1
-
-/datum/emote/laugh
- name = "laugh"
- desc = "Makes the mob laugh"
- commands = list("laugh", "laughs")
- text = "laughs"
- selfText = "laugh"
- audible = 1
- mimeText = "acts out a laugh"
- mimeSelf = "act out a laugh"
- muzzleAffected = 1
-
-/datum/emote/laugh/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/law
- name = "law"
- desc = "Makes the mob prove it is the law"
- commands = list("law")
- text = "shows its legal authorization barcode"
- selfText = "show your legal authorization barcode"
- audible = 1
- sound = 'sound/voice/biamthelaw.ogg'
-
-/datum/emote/law/available(var/mob/user)
- if(isrobot(user))
- return 1
-
-/datum/emote/law/prevented(var/mob/user)
- . = ..()
- if(.)
- return
- var/mob/living/silicon/robot/U = user
- if(!(istype(U.module, /obj/item/weapon/robot_module/security)))
- return "You are not THE LAW, pal"
-
-/datum/emote/light
- name = "light"
- desc = "makes the mob light up"
- commands = list("light", "lights")
- text = "lights up for a bit, then stops"
- selfText = "light up for a bit, then stop"
-
-/datum/emote/light/available(var/mob/user)
- if(isslime(user))
- return 1
-
-/datum/emote/look
- name = "look"
- desc = "Makes the mob look"
- commands = list("look", "looks")
- text = "looks"
- selfText = "look"
- canTarget = 1
- targetMob = 1
-
-/datum/emote/look/available(var/mob/user)
- if(ishuman(user))
- return 1
- if(isrobot(user))
- return 1
-
-/datum/emote/look/addTarget(var/mob/user, var/list/params, var/message)
- if(!params["target"])
- message += " around"
- return message
- return ..()
-
-/datum/emote/moan
- name = "moan"
- desc = "Makes the mob moan"
- commands = list("moan", "moans")
- text = "moans"
- selfText = "moan"
- audible = 1
-
-/datum/emote/moan/available(var/mob/user)
- if(isslime(user))
- return 1
- if(islarva(user))
- return 1
-
-/datum/emote/mumble
- name = "mumble"
- desc = "Makes the mob mumble"
- commands = list("mumble", "mumbles")
- text = "mumbles"
- selfText = "mumble"
- audible = 1
- mimeText = "mumbles"
-
-/datum/emote/mumble/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/no
- name = "no"
- desc = "Makes the mob let out a negative blip"
- commands = list("no")
- text = "emits a negative blip"
- selfText = "emit a negative blip"
- audible = 1
- sound = 'sound/machines/synth_no.ogg'
-
-/datum/emote/no/New()
- ..()
- commands += "no"
-
-/datum/emote/no/available(var/mob/user)
- if(user.is_mechanical())
- return 1
-
-/datum/emote/nod
- name = "nod"
- desc = "Makes the mob nod"
- commands = list("nod", "nods")
- text = "nods"
- selfText = "nod"
-
-/datum/emote/nod/available(var/mob/user)
- if(islarva(user))
- return 1
- if(isrobot(user))
- return 1
- if(ishuman(user))
- return 1
-
-/datum/emote/notice
- name = "notice"
- desc = "Makes the mob play a loud tone"
- commands = list("notice")
- text = "plays a loud tone"
- selfText = "play a loud tone"
- audible = 1
-
-/datum/emote/notice/available(var/mob/user)
- if(isbrain(user))
- return 1
-
-/datum/emote/pale
- name = "pale"
- desc = "Makes the mob go pale"
- commands = list("pale", "pales")
- text = "goes pale for a second"
- selfText = "go pale for a second"
-
-/datum/emote/pale/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/ping
- name = "ping"
- desc = "Makes the mob ping"
- commands = list("ping", "pings")
- text = "pings"
- selfText = "ping"
- audible = 1
- sound = 'sound/machines/ping.ogg'
- canTarget = 1
- targetMob = 1
-
-/datum/emote/ping/available(var/mob/user)
- if(user.is_mechanical())
- return 1
-
-/datum/emote/point
- name = "point"
- desc = "Makes the mob point"
- commands = list("point", "points")
- text = "points"
- selfText = "point"
- canTarget = 1
-
-/datum/emote/point/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/point/createMessage(var/mob/user, var/list/params)
- if(params["target"])
- return
- return ..()
-
-/datum/emote/point/doAction(var/mob/user, var/list/params)
- if(!params["target"])
- return
- user.pointed(params["target"])
-
-/datum/emote/quiver
- name = "quiver"
- desc = "Makes the mob quiver"
- commands = list("quiver", "quivers")
- text = "quivers"
- selfText = "quiver"
-
-/datum/emote/quiver/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/raise
- name = "raise"
- desc = "Makes the mob raise a hand"
- commands = list("raise", "raises")
- text = "raises a hand"
- selfText = "raise a hand"
- restrained = 1
-
-/datum/emote/raise/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/roar
- name = "roar"
- desc = "Makes the mob roar"
- commands = list("roar", "roars")
- text = "roars"
- selfText = "roar"
- audible = 1
- muzzleAffected = 1
- muzzledNoise = "loud"
-
-/datum/emote/roar/available(var/mob/user)
- if(isalienadult(user))
- return 1
-
-/datum/emote/roll
- name = "roll"
- desc = "Makes the mob roll"
- commands = list("roll", "rolls")
- text = "rolls"
- selfText = "roll"
-
-/datum/emote/roll/available(var/mob/user)
- if(islarva(user))
- return 1
- if(issmall(user))
- return 1
-
-/datum/emote/salute
- name = "salute"
- desc = "Makes the mob salute"
- commands = list("salute", "salutes")
- text = "salutes"
- selfText = "salute"
- canTarget = 1
- targetMob = 1
- targetText = "to"
-
-/datum/emote/salute/available(var/mob/user)
- if(ishuman(user))
- return 1
- if(isrobot(user))
- return 1
-
-/datum/emote/salute/prevented(var/mob/user)
- . = ..()
- if(!. && user.buckled)
- return "you are buckled to something"
-
-/datum/emote/salute/getMobTarget(var/mob/user, var/list/targets)
- var/mob/target = ..()
- if(target != user)
- return target
-
-/datum/emote/scratch
- name = "scratch"
- desc = "Makes the mob scratch"
- commands = list("scratch", "scratches")
- text = "scratches"
- selfText = "scratch"
- restrained = 1
-
-/datum/emote/scratch/available(var/mob/user)
- if(islarva(user) || isalienadult(user))
- return 1
- if(issmall(user))
- return 1
-
-/datum/emote/scream
- name = "scream"
- desc = "makes the mob scream"
- commands = list("scream", "screams")
- audible = 1
- mimeText = "acts out a scream"
- muzzledNoise = "very loud"
- cooldown = 50
- vol = 80
-
-/datum/emote/scream/machine
- name = "machine scream"
- sound = 'sound/goonstation/voice/robot_scream.ogg'
-
-/datum/emote/scream/machine/available(var/mob/user)
- if(user.is_mechanical())
- return 1
-
-/datum/emote/scream/human
- name = "human scream"
-
-/datum/emote/scream/human/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/scream/human/playSound(var/mob/user)
- var/mob/living/carbon/human/H = user
-
- if(H.gender == FEMALE)
- playsound(H, "[H.species.female_scream_sound]", vol, 1, 0, pitch = H.get_age_pitch())
- else
- playsound(H, "[H.species.male_scream_sound]", vol, 1, 0, pitch = H.get_age_pitch())
- return 1
-
-/datum/emote/scretch
- name = "scretch"
- desc = "makes the mob scretch" //whatever that is!
- commands = list("scretch", "scretches")
- text = "scretches"
- selfText = "scretch"
- audible = 1
- muzzleAffected = 1
-
-/datum/emote/scretch/available(var/mob/user)
- if(isalienadult(user) || islarva(user))
- return 1
-
-/datum/emote/shake
- name = "shake"
- desc = "Makes the mob shake its head"
- commands = list("shake", "shakes")
- text = "shakes"
- selfText = "shake"
-
-/datum/emote/shake/available(var/mob/user)
- if(islarva(user))
- return 1
- if(ishuman(user))
- return 1
-
-/datum/emote/shake/standardMessage(var/mob/user)
- var/message = ..()
- message += " [getHis(user)] head"
- return message
-
-/datum/emote/shiver
- name = "shiver"
- desc = "Makes the mob shiver"
- commands = list("shiver", "shivers")
- text = "shivers"
- selfText = "shiver"
- audible = 1
- mimeText = "shivers"
-
-/datum/emote/shiver/available(var/mob/user)
- if(isalienadult(user) || islarva(user))
- return 1
- if(isslime(user))
- return 1
- if(ishuman(user))
- return 1
-
-/datum/emote/shiver/createBlindMessage(var/mob/user, var/list/params, var/message)
- message = "you hear someone's teeth chattering together"
-
-/datum/emote/shrug
- name = "shrug"
- desc = "Makes the mob shrug"
- commands = list("shrug", "shrugs")
- text = "shrugs"
- selfText = "shrug"
-
-/datum/emote/shrug/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/sigh
- name = "sigh"
- desc = "Makes the mob sigh"
- commands = list("sigh", "sighs")
- text = "sighs"
- selfText = "sigh"
- audible = 1
- mimeText = "sighs"
- muzzleAffected = 1
- muzzledNoise = "weak"
-
-/datum/emote/sigh/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/sign
- name = "sign"
- desc = "Makes the mob sign a number"
- commands = list("sign", "signs")
- text = "signs"
- selfText = "sign"
- restrained = 1
- takesNumber = 1
-
-/datum/emote/sign/available(var/mob/user)
- if(isalienadult(user) || islarva(user))
- return 1
-
-/datum/emote/sign/getNumber(var/mob/user)
- var/number = ..()
- if(number == null)
- to_chat(user, "You need a number to sign")
- return INVALID
- return number
-
-/datum/emote/sign/paramMessage(var/mob/user, var/list/params)
- var/message = "\The [user] [text] [params["num"]]"
- return message
-
-/datum/emote/sign/fingers
- desc = "Makes the mob raise a number of fingers"
- text = "raises"
- selfText = "raise"
-
-/datum/emote/sign/fingers/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/sign/fingers/getNumber(var/mob/user)
- var/number = ..()
- if(number == INVALID)
- return INVALID
- var/fingersAvailable = 0
- if(!user.r_hand)
- fingersAvailable += 5
- if(!user.l_hand)
- fingersAvailable += 5
- if(fingersAvailable < number)
- to_chat(user, "You don't have enough fingers free")
- return INVALID
- return number
-
-/datum/emote/sign/fingers/paramMessage(var/mob/user, var/list/params)
- var/message = "\The [user] [text] [params["num"]] finger\s" // no, we can't just add " finger\s" to the parent version because the text macro won't work then :( VB
- return message
-
-/datum/emote/slap
- name = "slap"
- desc = "makes the mob slap someone"
- commands = list("slap", "slaps")
- text = "slaps"
- selfText = "slap"
- audible = 1
- sound = 'sound/effects/snap.ogg'
- canTarget = 1
- targetMob = 1
- targetText = ""
-
-/datum/emote/slap/New()
- ..()
- cooldown = 0
-
-/datum/emote/slap/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/slap/getMobTarget(var/mob/user, var/list/targets)
- for(var/mob/M in view(getLoc(user), 1))
- targets += M
- var/mob/target = input("Select target", "Target Mob") as null|anything in targets
- if(target == "None")
- target = user
- return target
-
-/datum/emote/slap/createBlindMessage(var/mob/user, var/list/params, var/message)
- message = ..()
- message = replacetext(message, "someone", "a")
- return message
-
-/datum/emote/slap/doAction(var/mob/user, var/list/params)
- if(user == params["target"])
- var/mob/living/U = user
- U.adjustFireLoss(4)
-
-/datum/emote/smile
- name = "smile"
- desc = "Makes the mob smile"
- commands = list("smile", "smiles")
- text = "smiles"
- selfText = "smile"
-
-/datum/emote/smile/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/snap
- name = "snap"
- desc = "Makes the mob snap it's fingers"
- commands = list("snap", "snaps")
- text = "snaps"
- selfText = "snap"
- audible = 1
- sound = 'sound/effects/fingersnap.ogg'
-
-/datum/emote/snap/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/snap/prevented(var/mob/user)
- . = ..()
- if(.)
- return
- var/mob/living/carbon/human/H = user
- var/obj/item/organ/external/L = H.get_organ("l_hand")
- var/obj/item/organ/external/R = H.get_organ("r_hand")
- var/left_hand_good = 0
- var/right_hand_good = 0
- if(L && (!(L.status & ORGAN_DESTROYED)) && (!(L.status & ORGAN_SPLINTED)) && (!(L.status & ORGAN_BROKEN)))
- left_hand_good = 1
- if(R && (!(R.status & ORGAN_DESTROYED)) && (!(R.status & ORGAN_SPLINTED)) && (!(R.status & ORGAN_BROKEN)))
- right_hand_good = 1
-
- if(!left_hand_good && !right_hand_good)
- return "You need at least one hand in good working order to snap your fingers"
-
-/datum/emote/snap/standardMessage(var/mob/user, var/list/params)
- var/message = ..()
- message += " [getHis(user)] fingers"
- params["prob"] = prob(5)
- if(!params["prob"])
- return message
- message += " right off!"
- return message
-
-/datum/emote/snap/playSound(var/mob/user, var/list/params)
- if(params["prob"])
- playsound(user.loc, 'sound/effects/snap.ogg', 50, 1)
- return 1
- return ..()
-
-/datum/emote/snap/createBlindMessage(var/mob/user, var/list/params, var/message)
- message = ..()
- message += " their fingers"
- return message
-
-/datum/emote/snap/createDeafMessage(var/mob/user, var/list/params, var/message)
- return message
-
-/datum/emote/sneeze
- name = "sneeze"
- desc = "Makes the mob sneeze"
- commands = list("sneeze", "sneezes")
- text = "sneezes"
- selfText = "sneeze"
- audible = 1
- mimeText = "sneeze"
- muzzleAffected = 1
- muzzledNoise = "strange"
-
-/datum/emote/sneeze/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/sniff
- name = "sniff"
- desc = "Makes the mob sniff"
- commands = list("sniff", "sniffs")
- text = "sniffs"
- selfText = "sniff"
- audible = 1
- mimeText = "sniffs"
-
-/datum/emote/sniff/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/snore
- name = "snore"
- desc = "Makes the mob snore"
- commands = list("snore", "snores")
- text = "snores"
- selfText = "snore"
- audible = 1
- mimeText = "sleeps soundly"
- mimeSelf = "sleep soundly"
- muzzleAffected = 1
-
-/datum/emote/snore/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/squish
- name = "squish"
- desc = "Makes the mob squish"
- commands = list("squish", "squishes")
- text = "squishes"
- selfText = "squish"
- audible = 1
- sound = 'sound/effects/slime_squish.ogg'
- canTarget = 1
- targetMob = 1
-
-/datum/emote/squish/available(var/mob/user)
- if(isslime(user))
- return 1
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if(H.species.name == "Slime People") //Only Slime People can squish
- return 1
- for(var/obj/item/organ/external/L in H.organs) // if your limbs are squishy you can squish too!
- if(L.dna.species =="Slime People")
- return 1
-
-/datum/emote/stare
- name = "stare"
- desc = "Makes the mob stare"
- commands = list("stare", "stares")
- text = "stares"
- selfText = "stare"
- canTarget = 1
- targetMob = 1
-
-/datum/emote/stare/available(var/mob/user)
- if(ishuman(user))
- return 1
- if(isrobot(user))
- return 1
-
-/datum/emote/sulk
- name = "sulk"
- desc = "Makes the mob sulk"
- commands = list("sulk", "sulks")
- text = "sulks down sadly"
- selfText = "sulk down sadly"
-
-/datum/emote/sulk/available(var/mob/user)
- if(islarva(user))
- return 1
-
-/datum/emote/sway
- name = "sway"
- desc = "Makes the mob sway"
- commands = list("sway", "sways")
- text = "sways around dizzily"
- selfText = "sway around dizzily"
-
-/datum/emote/sway/available(var/mob/user)
- if(islarva(user))
- return 1
- if(isslime(user))
- return 1
-
-/datum/emote/tail
- name = "tail"
- desc = "Makes the mob wave it's tail"
- commands = list("tail")
- text = "waves it's tail"
- selfText = "wave your tail"
-
-/datum/emote/tail/available(var/mob/user)
- if(islarva(user) || isalienadult(user))
- return 1
- if(issmall(user))
- return 1
-
-/datum/emote/tail/wag
- name = "wag"
- desc = "Makes the mob start wagging its tail"
- commands = list("wag", "wags")
- text = "starts"
- selfText = "start"
-
-/datum/emote/tail/wag/available(var/mob/user)
- if(issmall(user))
- return
- if(ishuman(user))
- return 1
-
-/datum/emote/tail/wag/prevented(var/mob/user)
- . = ..()
- if(.)
- return
- var/mob/living/carbon/human/H = user
- if(H.species.bodyflags & TAIL_WAGGING)
- if(H.wear_suit && (H.wear_suit.flags_inv & HIDETAIL || istype(H.wear_suit, /obj/item/clothing/suit/space)))
- return "your clothing is stopping you wag your tail"
- return
- if(!H.body_accessory)
- return "you have no tail to wag!"
- if(!H.body_accessory.try_restrictions())
- return "your clothing is stopping you wag your tail"
-
-/datum/emote/tail/wag/standardMessage(var/mob/user, var/list/params)
- var/message = ..()
- message += " wagging [getHis(user)] tail"
- return message
-
-/datum/emote/tail/wag/doAction(var/mob/user, var/list/params)
- var/mob/living/carbon/human/H = user
- H.start_tail_wagging(1)
-
-/datum/emote/tail/wag/stop
- name = "swag"
- desc = "Makes the mob stop wagging its tail"
- commands = list("swag", "swags")
- text = "stops"
- selfText = "stop"
- allowParent = 1
-
-// seemingly no way to tell if a mob is wagging it's tail! VB
-/datum/emote/tail/wag/stop/prevented(var/mob/user)
- . = ..()
- if(.)
- return
- var/mob/living/carbon/human/H = user
- if(!(H.species.bodyflags & TAIL_WAGGING) && !H.body_accessory)
- return "you can't stop wagging a tail you don't have!"
-
-/datum/emote/tail/wag/stop/doAction(var/mob/user, var/list/params)
- var/mob/living/carbon/human/H = user
- H.stop_tail_wagging(1)
-
-/datum/emote/tremble
- name = "tremble"
- desc = "Makes the mob tremble"
- commands = list("tremble", "trembles")
- text = "trembles"
- selfText = "tremble"
-
-/datum/emote/tremble/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/twitch_s
- name = "twitch_s"
- desc = "Makes the mob twitch"
- commands = list("twitch_s", "twitches_s")
- text = "twitches"
- selfText = "twitch"
-
-/datum/emote/twitch_s/available(var/mob/user)
- if(ishuman(user))
- return 1
- if(isrobot(user))
- return 1
-
-/datum/emote/twitch_s/twitch
- name = "twitch"
- desc = "Makes the mob twitch violently"
- commands = list("twitch", "twitches")
- allowParent = 1
-
-/datum/emote/twitch_s/twitch/available(var/mob/user)
- if(isslime(user))
- return 1
- if(islarva(user))
- return 1
- return ..()
-
-/datum/emote/twitch_s/twitch/standardMessage(var/mob/user, var/list/params)
- var/message = ..()
- message += " violently"
- return message
-
-/datum/emote/vibrate
- name = "vibrate"
- desc = "Makes the mob vibrate"
- commands = list("vibrate", "vibrates")
- text = "vibrates"
- selfText = "vibrate"
-
-/datum/emote/vibrate/available(var/mob/user)
- if(isslime(user))
- return 1
-
-/datum/emote/wave
- name = "wave"
- desc = "Makes the mob wave"
- commands = list ("wave", "waves")
- text = "waves"
- selfText = "wave"
-
-/datum/emote/wave/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/whimper
- name = "whimper"
- desc = "Makes the mob whimper"
- commands = list("whimper", "whimpers")
- text = "whimpers"
- selfText = "whimper"
- audible = 1
- mimeText = "appears hurt"
- mimeSelf = "appear hurt"
- muzzleAffected = 1
-
-/datum/emote/whimper/available(var/mob/user)
- if(islarva(user) || isalienadult(user))
- return 1
- if(ishuman(user))
- return 1
-
-/datum/emote/whistle
- name = "whistle"
- desc = "Makes the mob whistle"
- commands = list("whistle", "whistles")
- text = "whistles"
- selfText = "whistle"
- audible = 1
-
-/datum/emote/whistle/available(var/mob/user)
- if(isbrain(user))
- return 1
-
-/datum/emote/wink
- name = "wink"
- desc = "Makes the mob wink"
- commands = list("wink", "winks")
- text = "winks"
- selfText = "wink"
-
-/datum/emote/wink/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/yawn
- name = "yawn"
- desc = "makes the mob yawn"
- commands = list("yawn", "yawns")
- text = "yawns"
- selfText = "yawn"
- audible = 1
- mimeText = "yawns"
- muzzleAffected = 1
-
-/datum/emote/yawn/available(var/mob/user)
- if(ishuman(user))
- return 1
-
-/datum/emote/yes
- name = "yes"
- desc = "Makes the mob let out an affirmative beep"
- commands = list("yes")
- text = "lets out an affirmative beep"
- selfText = "let out an affirmative beep"
- audible = 1
- sound = 'sound/machines/synth_yes.ogg'
- canTarget = 1
- targetMob = 1
-
-/datum/emote/yes/available(var/mob/user)
- if(user.is_mechanical())
- return 1
\ No newline at end of file
diff --git a/code/datums/action.dm b/code/datums/action.dm
new file mode 100644
index 00000000000..2f7e6296f80
--- /dev/null
+++ b/code/datums/action.dm
@@ -0,0 +1,410 @@
+#define AB_CHECK_RESTRAINED 1
+#define AB_CHECK_STUNNED 2
+#define AB_CHECK_LYING 4
+#define AB_CHECK_CONSCIOUS 8
+
+
+/datum/action
+ var/name = "Generic Action"
+ var/desc = null
+ var/obj/target = null
+ var/check_flags = 0
+ var/processing = 0
+ var/obj/screen/movable/action_button/button = null
+ var/button_icon = 'icons/mob/actions.dmi'
+ var/background_icon_state = "bg_default"
+
+ var/icon_icon = 'icons/mob/actions.dmi'
+ var/button_icon_state = "default"
+ var/mob/owner
+
+/datum/action/New(var/Target)
+ target = Target
+ button = new
+ button.linked_action = src
+ button.name = name
+
+/datum/action/Destroy()
+ if(owner)
+ Remove(owner)
+ if(target)
+ target = null
+ qdel(button)
+ button = null
+ return ..()
+
+/datum/action/proc/Grant(mob/M)
+ if(owner)
+ if(owner == M)
+ return
+ Remove(owner)
+ owner = M
+ M.actions += src
+ if(M.client)
+ M.client.screen += button
+ M.update_action_buttons()
+
+/datum/action/proc/Remove(mob/M)
+ if(M.client)
+ M.client.screen -= button
+ button.moved = FALSE //so the button appears in its normal position when given to another owner.
+ M.actions -= src
+ M.update_action_buttons()
+ owner = null
+
+/datum/action/proc/Trigger()
+ if(!IsAvailable())
+ return 0
+ return 1
+
+/datum/action/proc/Process()
+ return
+
+/datum/action/proc/IsAvailable()// returns 1 if all checks pass
+ if(!owner)
+ return 0
+ if(check_flags & AB_CHECK_RESTRAINED)
+ if(owner.restrained())
+ return 0
+ if(check_flags & AB_CHECK_STUNNED)
+ if(owner.stunned || owner.weakened)
+ return 0
+ if(check_flags & AB_CHECK_LYING)
+ if(owner.lying)
+ return 0
+ if(check_flags & AB_CHECK_CONSCIOUS)
+ if(owner.stat)
+ return 0
+ return 1
+
+/datum/action/proc/UpdateButtonIcon()
+ if(button)
+ button.icon = button_icon
+ button.icon_state = background_icon_state
+
+ ApplyIcon(button)
+
+ if(!IsAvailable())
+ button.color = rgb(128,0,0,128)
+ else
+ button.color = rgb(255,255,255,255)
+ return 1
+
+/datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button)
+ current_button.overlays.Cut()
+ if(icon_icon && button_icon_state)
+ var/image/img
+ img = image(icon_icon, current_button, button_icon_state)
+ img.pixel_x = 0
+ img.pixel_y = 0
+ current_button.overlays += img
+
+//Presets for item actions
+/datum/action/item_action
+ check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS
+
+/datum/action/item_action/New(Target)
+ ..()
+ var/obj/item/I = target
+ I.actions += src
+
+/datum/action/item_action/Destroy()
+ var/obj/item/I = target
+ I.actions -= src
+ return ..()
+
+/datum/action/item_action/Trigger()
+ if(!..())
+ return 0
+ if(target)
+ var/obj/item/I = target
+ I.ui_action_click(owner, type)
+ return 1
+
+/datum/action/item_action/ApplyIcon(obj/screen/movable/action_button/current_button)
+ current_button.overlays.Cut()
+ if(target)
+ var/obj/item/I = target
+ var/old_layer = I.layer
+ var/old_plane = I.plane
+ I.layer = 21
+ I.plane = HUD_PLANE
+ current_button.overlays += I
+ I.layer = old_layer
+ I.plane = old_plane
+
+/datum/action/item_action/toggle_light
+ name = "Toggle Light"
+
+/datum/action/item_action/toggle_hood
+ name = "Toggle Hood"
+
+/datum/action/item_action/toggle_firemode
+ name = "Toggle Firemode"
+
+/datum/action/item_action/startchainsaw
+ name = "Pull The Starting Cord"
+
+/datum/action/item_action/toggle_gunlight
+ name = "Toggle Gunlight"
+
+/datum/action/item_action/toggle_mode
+ name = "Toggle Mode"
+
+/datum/action/item_action/toggle_barrier_spread
+ name = "Toggle Barrier Spread"
+
+/datum/action/item_action/equip_unequip_TED_Gun
+ name = "Equip/Unequip TED Gun"
+
+/datum/action/item_action/toggle_paddles
+ name = "Toggle Paddles"
+
+/datum/action/item_action/set_internals
+ name = "Set Internals"
+
+/datum/action/item_action/set_internals/UpdateButtonIcon()
+ if(..()) //button available
+ if(iscarbon(owner))
+ var/mob/living/carbon/C = owner
+ if(target == C.internal)
+ button.icon_state = "bg_default_on"
+
+/datum/action/item_action/toggle_mister
+ name = "Toggle Mister"
+
+/datum/action/item_action/toggle_helmet_light
+ name = "Toggle Helmet Light"
+
+/datum/action/item_action/toggle_helmet_mode
+ name = "Toggle Helmet Mode"
+
+/datum/action/item_action/toggle_hardsuit_mode
+ name = "Toggle Hardsuit Mode"
+
+/datum/action/item_action/toggle
+
+/datum/action/item_action/toggle/New(Target)
+ ..()
+ name = "Toggle [target.name]"
+ button.name = name
+
+/datum/action/item_action/openclose
+
+/datum/action/item_action/openclose/New(Target)
+ ..()
+ name = "Open/Close [target.name]"
+ button.name = name
+
+/datum/action/item_action/button
+
+/datum/action/item_action/button/New(Target)
+ ..()
+ name = "Button/Unbutton [target.name]"
+ button.name = name
+
+/datum/action/item_action/zipper
+
+/datum/action/item_action/zipper/New(Target)
+ ..()
+ name = "Zip/Unzip [target.name]"
+ button.name = name
+
+/datum/action/item_action/halt
+ name = "HALT!"
+
+/datum/action/item_action/hoot
+ name = "Hoot"
+
+/datum/action/item_action/caw
+ name = "Caw"
+
+/datum/action/item_action/toggle_voice_box
+ name = "Toggle Voice Box"
+
+/datum/action/item_action/change
+ name = "Change"
+
+/datum/action/item_action/noir
+ name = "Noir"
+
+/datum/action/item_action/YEEEAAAAAHHHHHHHHHHHHH
+ name = "YEAH!"
+
+/datum/action/item_action/adjust
+
+/datum/action/item_action/adjust/New(Target)
+ ..()
+ name = "Adjust [target.name]"
+ button.name = name
+
+/datum/action/item_action/switch_hud
+ name = "Switch HUD"
+
+/datum/action/item_action/toggle_wings
+ name = "Toggle Wings"
+
+/datum/action/item_action/toggle_helmet
+ name = "Toggle Helmet"
+
+/datum/action/item_action/toggle_jetpack
+ name = "Toggle Jetpack"
+
+/datum/action/item_action/jetpack_stabilization
+ name = "Toggle Jetpack Stabilization"
+
+/datum/action/item_action/jetpack_stabilization/IsAvailable()
+ var/obj/item/weapon/tank/jetpack/J = target
+ if(!istype(J) || !J.on)
+ return 0
+ return ..()
+
+/datum/action/item_action/hands_free
+ check_flags = AB_CHECK_CONSCIOUS
+
+/datum/action/item_action/hands_free/activate
+ name = "Activate"
+
+/datum/action/item_action/toggle_research_scanner
+ name = "Toggle Research Scanner"
+ button_icon_state = "scan_mode"
+
+/datum/action/item_action/toggle_research_scanner/Trigger()
+ if(IsAvailable())
+ owner.research_scanner = !owner.research_scanner
+ to_chat(owner, "Research analyzer is now [owner.research_scanner ? "active" : "deactivated"]. ")
+ return 1
+
+/datum/action/item_action/toggle_research_scanner/Remove(mob/living/L)
+ if(owner)
+ owner.research_scanner = 0
+ ..()
+
+/datum/action/item_action/toggle_research_scanner/ApplyIcon(obj/screen/movable/action_button/current_button)
+ current_button.overlays.Cut()
+ if(button_icon && button_icon_state)
+ var/image/img = image(button_icon, current_button, "scan_mode")
+ current_button.overlays += img
+
+/datum/action/item_action/remove_badge
+ name = "Remove Holobadge"
+
+///prset for organ actions
+/datum/action/item_action/organ_action
+ check_flags = AB_CHECK_CONSCIOUS
+
+/datum/action/item_action/organ_action/IsAvailable()
+ var/obj/item/organ/internal/I = target
+ if(!I.owner)
+ return 0
+ return ..()
+
+/datum/action/item_action/organ_action/toggle
+
+/datum/action/item_action/organ_action/toggle/New(Target)
+ ..()
+ name = "Toggle [target.name]"
+ button.name = name
+
+// for clothing accessories like holsters
+/datum/action/item_action/accessory
+ check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS
+
+/datum/action/item_action/accessory/IsAvailable()
+ . = ..()
+ if(!.)
+ return 0
+ if(target.loc == owner)
+ return 1
+ if(istype(target.loc, /obj/item/clothing/under) && target.loc.loc == owner)
+ return 1
+ return 0
+
+/datum/action/item_action/accessory/holster
+ name = "Holster"
+
+/datum/action/item_action/accessory/storage
+ name = "View Storage"
+
+
+//Preset for spells
+/datum/action/spell_action
+ check_flags = 0
+ background_icon_state = "bg_spell"
+
+/datum/action/spell_action/New(Target)
+ ..()
+ var/obj/effect/proc_holder/spell/S = target
+ S.action = src
+ name = S.name
+ button_icon = S.action_icon
+ button_icon_state = S.action_icon_state
+ background_icon_state = S.action_background_icon_state
+ button.name = name
+
+/datum/action/spell_action/Destroy()
+ var/obj/effect/proc_holder/spell/S = target
+ S.action = null
+ return ..()
+
+/datum/action/spell_action/Trigger()
+ if(!..())
+ return 0
+ if(target)
+ var/obj/effect/proc_holder/spell = target
+ spell.Click()
+ return 1
+
+/datum/action/spell_action/IsAvailable()
+ if(!target)
+ return 0
+ var/obj/effect/proc_holder/spell/spell = target
+
+ if(owner)
+ return spell.can_cast(owner)
+ return 0
+
+/*
+/datum/action/spell_action/alien
+
+/datum/action/spell_action/alien/IsAvailable()
+ if(!target)
+ return 0
+ var/obj/effect/proc_holder/alien/ab = target
+
+ if(owner)
+ return ab.cost_check(ab.check_turf, owner, 1)
+ return 0
+*/
+
+//Preset for general and toggled actions
+/datum/action/innate
+ check_flags = 0
+ var/active = 0
+
+/datum/action/innate/Trigger()
+ if(!..())
+ return 0
+ if(!active)
+ Activate()
+ else
+ Deactivate()
+ return 1
+
+/datum/action/innate/proc/Activate()
+ return
+
+/datum/action/innate/proc/Deactivate()
+ return
+
+//Preset for action that call specific procs (consider innate)
+/datum/action/generic
+ check_flags = 0
+ var/procname
+
+/datum/action/generic/Trigger()
+ if(!..())
+ return 0
+ if(target && procname)
+ call(target,procname)(usr)
+ return 1
diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm
index 4af13e256fd..0f796798d26 100644
--- a/code/datums/ai_laws.dm
+++ b/code/datums/ai_laws.dm
@@ -83,17 +83,17 @@ var/global/const/base_law_type = /datum/ai_laws/nanotrasen
if(full_sync || supplied_laws.len)
S.laws.clear_supplied_laws()
- for (var/datum/ai_law/law in ion_laws)
+ for(var/datum/ai_law/law in ion_laws)
S.laws.add_ion_law(law.law)
- for (var/datum/ai_law/law in inherent_laws)
+ for(var/datum/ai_law/law in inherent_laws)
S.laws.add_inherent_law(law.law)
- for (var/datum/ai_law/law in supplied_laws)
+ for(var/datum/ai_law/law in supplied_laws)
if(law)
S.laws.add_supplied_law(law.index, law.law)
/mob/living/silicon/proc/sync_zeroth(var/datum/ai_law/zeroth_law, var/datum/ai_law/zeroth_law_borg)
- if (!is_special_character(src) || mind.original != src)
+ if(!is_special_character(src) || mind.original != src)
if(zeroth_law_borg)
laws.set_zeroth_law(zeroth_law_borg.law)
else if(zeroth_law)
@@ -159,7 +159,7 @@ var/global/const/base_law_type = /datum/ai_laws/nanotrasen
if(supplied_laws.len >= number && supplied_laws[number])
delete_law(supplied_laws[number])
- while (src.supplied_laws.len < number)
+ while(src.supplied_laws.len < number)
src.supplied_laws += ""
if(state_supplied.len < supplied_laws.len)
state_supplied += 1
diff --git a/code/datums/browser.dm b/code/datums/browser.dm
index e8f17f17ad0..85f8e52e89d 100644
--- a/code/datums/browser.dm
+++ b/code/datums/browser.dm
@@ -20,13 +20,13 @@
user = nuser
window_id = nwindow_id
- if (ntitle)
+ if(ntitle)
title = format_text(ntitle)
- if (nwidth)
+ if(nwidth)
width = nwidth
- if (nheight)
+ if(nheight)
height = nheight
- if (nref)
+ if(nref)
ref = nref
add_stylesheet("common", 'html/browser/common.css') // this CSS sheet is common to all UIs
@@ -60,18 +60,18 @@
/datum/browser/proc/get_header()
var/key
var/filename
- for (key in stylesheets)
+ for(key in stylesheets)
filename = "[ckey(key)].css"
user << browse_rsc(stylesheets[key], filename)
head_content += " "
- for (key in scripts)
+ for(key in scripts)
filename = "[ckey(key)].js"
user << browse_rsc(scripts[key], filename)
head_content += ""
var/title_attributes = "class='uiTitle'"
- if (title_image)
+ if(title_image)
title_attributes = "class='uiTitle icon' style='background-image: url([title_image]);'"
return {"
@@ -103,10 +103,10 @@
/datum/browser/proc/open(var/use_onclose = 1)
var/window_size = ""
- if (width && height)
+ if(width && height)
window_size = "size=[width]x[height];"
user << browse(get_content(), "window=[window_id];[window_size][window_options]")
- if (use_onclose)
+ if(use_onclose)
onclose(user, window_id, ref)
/datum/browser/proc/close()
@@ -118,7 +118,7 @@
/mob/proc/browse_rsc_icon(icon, icon_state, dir = -1)
/*
var/icon/I
- if (dir >= 0)
+ if(dir >= 0)
I = new /icon(icon, icon_state, dir)
else
I = new /icon(icon, icon_state)
diff --git a/code/datums/cache/apc.dm b/code/datums/cache/apc.dm
index f50b0a8e121..4271886ac4b 100644
--- a/code/datums/cache/apc.dm
+++ b/code/datums/cache/apc.dm
@@ -11,7 +11,7 @@ var/global/datum/repository/apc/apc_repository = new()
if(world.time < cache_entry.timestamp)
return cache_entry.data
- if (powermonitor && !isnull(powermonitor.powernet))
+ if(powermonitor && !isnull(powermonitor.powernet))
var/list/L = list()
for(var/obj/machinery/power/terminal/term in powermonitor.powernet.nodes)
if(istype(term.master, /obj/machinery/power/apc))
diff --git a/code/datums/cache/crew.dm b/code/datums/cache/crew.dm
index 0afb70a4404..2912b8c6753 100644
--- a/code/datums/cache/crew.dm
+++ b/code/datums/cache/crew.dm
@@ -62,6 +62,6 @@ var/global/datum/repository/crew/crew_repository = new()
for(var/mob/living/carbon/human/H in mob_list)
if(istype(H.w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/C = H.w_uniform
- if (C.has_sensor)
+ if(C.has_sensor)
tracked |= C
return tracked
diff --git a/code/datums/cargoprofile.dm b/code/datums/cargoprofile.dm
index 40a065e5bad..91a4420b31c 100644
--- a/code/datums/cargoprofile.dm
+++ b/code/datums/cargoprofile.dm
@@ -156,7 +156,7 @@
blacklist = null
whitelist = list(/obj/item/weapon/tank,/obj/item/weapon/reagent_containers,
/obj/item/stack/medical,/obj/item/weapon/storage/pill_bottle,/obj/item/weapon/gun/syringe,
- /obj/item/weapon/c4,/obj/item/weapon/grenade,/obj/item/ammo_box,
+ /obj/item/weapon/grenade/plastic/c4,/obj/item/weapon/grenade,/obj/item/ammo_box,
/obj/item/weapon/gun/grenadelauncher,/obj/item/weapon/flamethrower, /obj/item/weapon/lighter,
/obj/item/weapon/match,/obj/item/weapon/weldingtool)
@@ -258,7 +258,7 @@
whitelist = list(/obj/item/weapon/banhammer,/obj/item/weapon/sord,/obj/item/weapon/claymore,/obj/item/weapon/holo/esword,
/obj/item/weapon/flamethrower,/obj/item/weapon/grenade,/obj/item/weapon/gun,/obj/item/weapon/hatchet,/obj/item/weapon/katana,
/obj/item/weapon/kitchen/knife,/obj/item/weapon/melee,/obj/item/weapon/nullrod,/obj/item/weapon/pickaxe,/obj/item/weapon/twohanded,
- /obj/item/weapon/c4,/obj/item/weapon/scalpel,/obj/item/weapon/shield,/obj/item/weapon/grown/nettle/death)
+ /obj/item/weapon/grenade/plastic/c4,/obj/item/weapon/scalpel,/obj/item/weapon/shield,/obj/item/weapon/grown/nettle/death)
/datum/cargoprofile/tools
name = "Devices & Tools"
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index d07b6e3eb73..f9c3ce39b08 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -17,7 +17,7 @@
var/real_title = assignment
for(var/datum/data/record/t in data_core.general)
- if (t)
+ if(t)
if(t.fields["name"] == name)
foundrecord = t
break
@@ -66,6 +66,8 @@
G.fields["sex"] = capitalize(H.gender)
G.fields["species"] = H.get_species()
G.fields["photo"] = get_id_photo(H)
+ G.fields["photo-south"] = "'data:image/png;base64,[icon2base64(icon(G.fields["photo"], dir = SOUTH))]'"
+ G.fields["photo-west"] = "'data:image/png;base64,[icon2base64(icon(G.fields["photo"], dir = WEST))]'"
if(H.gen_record && !jobban_isbanned(H, "Records"))
G.fields["notes"] = H.gen_record
else
@@ -129,7 +131,7 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
var/g = "m"
- if (H.gender == FEMALE)
+ if(H.gender == FEMALE)
g = "f"
var/icon/icobase = H.species.icobase
@@ -151,7 +153,7 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
// Skin tone
if(H.species.bodyflags & HAS_SKIN_TONE)
- if (H.s_tone >= 0)
+ if(H.s_tone >= 0)
preview_icon.Blend(rgb(H.s_tone, H.s_tone, H.s_tone), ICON_ADD)
else
preview_icon.Blend(rgb(-H.s_tone, -H.s_tone, -H.s_tone), ICON_SUBTRACT)
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index eeb26f5f6f2..e6461865bed 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -20,7 +20,7 @@
title = "[A.name] (\ref[A]) = [A.type]"
#ifdef VARSICON
- if (A.icon)
+ if(A.icon)
body += debug_variable("icon", new/icon(A.icon, A.icon_state, A.dir), 0)
#endif
@@ -43,11 +43,11 @@
if(event.keyCode == 13){ //Enter / return
var vars_ol = document.getElementById('vars');
var lis = vars_ol.getElementsByTagName("li");
- for ( var i = 0; i < lis.length; ++i )
+ for( var i = 0; i < lis.length; ++i )
{
try{
var li = lis\[i\];
- if ( li.style.backgroundColor == "#ffee88" )
+ if( li.style.backgroundColor == "#ffee88" )
{
alist = lis\[i\].getElementsByTagName("a")
if(alist.length > 0){
@@ -62,11 +62,11 @@
if(event.keyCode == 38){ //Up arrow
var vars_ol = document.getElementById('vars');
var lis = vars_ol.getElementsByTagName("li");
- for ( var i = 0; i < lis.length; ++i )
+ for( var i = 0; i < lis.length; ++i )
{
try{
var li = lis\[i\];
- if ( li.style.backgroundColor == "#ffee88" )
+ if( li.style.backgroundColor == "#ffee88" )
{
if( (i-1) >= 0){
var li_new = lis\[i-1\];
@@ -83,11 +83,11 @@
if(event.keyCode == 40){ //Down arrow
var vars_ol = document.getElementById('vars');
var lis = vars_ol.getElementsByTagName("li");
- for ( var i = 0; i < lis.length; ++i )
+ for( var i = 0; i < lis.length; ++i )
{
try{
var li = lis\[i\];
- if ( li.style.backgroundColor == "#ffee88" )
+ if( li.style.backgroundColor == "#ffee88" )
{
if( (i+1) < lis.length){
var li_new = lis\[i+1\];
@@ -113,11 +113,11 @@
var vars_ol = document.getElementById('vars');
var lis = vars_ol.getElementsByTagName("li");
- for ( var i = 0; i < lis.length; ++i )
+ for( var i = 0; i < lis.length; ++i )
{
try{
var li = lis\[i\];
- if ( li.innerText.toLowerCase().indexOf(filter) == -1 )
+ if( li.innerText.toLowerCase().indexOf(filter) == -1 )
{
vars_ol.removeChild(li);
i--;
@@ -126,10 +126,10 @@
}
}
var lis_new = vars_ol.getElementsByTagName("li");
- for ( var j = 0; j < lis_new.length; ++j )
+ for( var j = 0; j < lis_new.length; ++j )
{
var li1 = lis\[j\];
- if (j == 0){
+ if(j == 0){
li1.style.backgroundColor = "#ffee88";
}else{
li1.style.backgroundColor = "white";
@@ -234,6 +234,7 @@
body += "Mark Object "
body += "Call Proc "
+ body += "Jump to Object "
if(ismob(D))
body += "Show player panel "
@@ -293,18 +294,18 @@
body += ""
var/list/names = list()
- for (var/V in D.vars)
+ for(var/V in D.vars)
names += V
names = sortList(names)
- for (var/V in names)
+ for(var/V in names)
body += debug_variable(V, D.vars[V], 0, D)
body += " "
var/html = ""
- if (title)
+ if(title)
html += "[title] "
html += {"
-
-
- [name]
[show_sensors ? "Sensor Data: " + sensor_data : ""]
"}
diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm
index 0b1be444c7c..89cf4cd3610 100644
--- a/code/game/machinery/atmoalter/area_atmos_computer.dm
+++ b/code/game/machinery/atmoalter/area_atmos_computer.dm
@@ -85,7 +85,9 @@
[zone]
"}
- user << browse("[dat]", "window=miningshuttle;size=400x400")
+ var/datum/browser/popup = new(user, "area_atmos", name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
status = ""
Topic(href, href_list)
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 14b3ca3fc59..7eb01d06988 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -178,7 +178,7 @@ update_flag
(note: colors and decals has to be applied every icon update)
*/
- if (src.destroyed)
+ if(src.destroyed)
src.overlays = 0
src.icon_state = text("[]-1", src.canister_color["prim"])//yes, I KNOW the colours don't reflect when the can's borked, whatever.
@@ -217,27 +217,27 @@ update_flag
//template modification exploit prevention, used in Topic()
/obj/machinery/portable_atmospherics/canister/proc/is_a_color(var/inputVar, var/checkColor = "all")
- if (checkColor == "prim" || checkColor == "all")
+ if(checkColor == "prim" || checkColor == "all")
for(var/list/L in canister_icon_container.possiblemaincolor)
- if (L["icon"] == inputVar)
+ if(L["icon"] == inputVar)
return 1
- if (checkColor == "sec" || checkColor == "all")
+ if(checkColor == "sec" || checkColor == "all")
for(var/list/L in canister_icon_container.possibleseccolor)
- if (L["icon"] == inputVar)
+ if(L["icon"] == inputVar)
return 1
- if (checkColor == "ter" || checkColor == "all")
+ if(checkColor == "ter" || checkColor == "all")
for(var/list/L in canister_icon_container.possibletertcolor)
- if (L["icon"] == inputVar)
+ if(L["icon"] == inputVar)
return 1
- if (checkColor == "quart" || checkColor == "all")
+ if(checkColor == "quart" || checkColor == "all")
for(var/list/L in canister_icon_container.possiblequartcolor)
- if (L["icon"] == inputVar)
+ if(L["icon"] == inputVar)
return 1
return 0
/obj/machinery/portable_atmospherics/canister/proc/is_a_decal(var/inputVar)
for(var/list/L in canister_icon_container.possibledecals)
- if (L["icon"] == inputVar)
+ if(L["icon"] == inputVar)
return 1
return 0
@@ -250,7 +250,7 @@ update_flag
if(destroyed)
return 1
- if (src.health <= 10)
+ if(src.health <= 10)
var/atom/location = src.loc
location.assume_air(air_contents)
air_update_turf()
@@ -260,7 +260,7 @@ update_flag
src.density = 0
update_icon()
- if (src.holding)
+ if(src.holding)
src.holding.loc = src.loc
src.holding = null
@@ -269,7 +269,7 @@ update_flag
return 1
/obj/machinery/portable_atmospherics/canister/process()
- if (destroyed)
+ if(destroyed)
return
..()
@@ -383,7 +383,7 @@ update_flag
return src.ui_interact(user)
/obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- if (src.destroyed)
+ if(src.destroyed)
return
init_data_vars() //set up var/colorcontainer and var/possibledecals
@@ -404,12 +404,12 @@ update_flag
data["valveOpen"] = valve_open ? 1 : 0
data["hasHoldingTank"] = holding ? 1 : 0
- if (holding)
+ if(holding)
data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure()))
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "canister.tmpl", "Canister", 480, 400, state = physical_state)
@@ -428,18 +428,18 @@ update_flag
if(..())
return 1
- if (href_list["choice"] == "menu")
+ if(href_list["choice"] == "menu")
menu = text2num(href_list["mode_target"])
if(href_list["toggle"])
var/logmsg
- if (valve_open)
- if (holding)
+ if(valve_open)
+ if(holding)
logmsg = "Valve was closed by [usr] ([usr.ckey]), stopping the transfer into the [holding] "
else
logmsg = "Valve was closed by [usr] ([usr.ckey]), stopping the transfer into the air "
else
- if (holding)
+ if(holding)
logmsg = "Valve was opened by [usr] ([usr.ckey]), starting the transfer into the [holding] "
else
logmsg = "Valve was opened by [usr] ([usr.ckey]), starting the transfer into the air "
@@ -454,53 +454,53 @@ update_flag
release_log += logmsg
valve_open = !valve_open
- if (href_list["remove_tank"])
+ if(href_list["remove_tank"])
if(holding)
- if (valve_open)
+ if(valve_open)
valve_open = 0
release_log += "Valve was closed by [usr] ([usr.ckey]), stopping the transfer into the [holding] "
holding.loc = loc
holding = null
- if (href_list["pressure_adj"])
+ if(href_list["pressure_adj"])
var/diff = text2num(href_list["pressure_adj"])
if(diff > 0)
release_pressure = min(10*ONE_ATMOSPHERE, release_pressure+diff)
else
release_pressure = max(ONE_ATMOSPHERE/10, release_pressure+diff)
- if (href_list["rename"])
- if (can_label)
+ if(href_list["rename"])
+ if(can_label)
var/T = sanitize(copytext(input("Choose canister label", "Name", name) as text|null,1,MAX_NAME_LEN))
- if (can_label) //Exploit prevention
- if (T)
+ if(can_label) //Exploit prevention
+ if(T)
name = T
else
name = "canister"
else
to_chat(usr, "\red As you attempted to rename it the pressure rose!")
- if (href_list["choice"] == "Primary color")
- if (is_a_color(href_list["icon"],"prim"))
+ if(href_list["choice"] == "Primary color")
+ if(is_a_color(href_list["icon"],"prim"))
canister_color["prim"] = href_list["icon"]
- if (href_list["choice"] == "Secondary color")
- if (href_list["icon"] == "none")
+ if(href_list["choice"] == "Secondary color")
+ if(href_list["icon"] == "none")
canister_color["sec"] = "none"
- else if (is_a_color(href_list["icon"],"sec"))
+ else if(is_a_color(href_list["icon"],"sec"))
canister_color["sec"] = href_list["icon"]
- if (href_list["choice"] == "Tertiary color")
- if (href_list["icon"] == "none")
+ if(href_list["choice"] == "Tertiary color")
+ if(href_list["icon"] == "none")
canister_color["ter"] = "none"
- else if (is_a_color(href_list["icon"],"ter"))
+ else if(is_a_color(href_list["icon"],"ter"))
canister_color["ter"] = href_list["icon"]
- if (href_list["choice"] == "Quaternary color")
- if (href_list["icon"] == "none")
+ if(href_list["choice"] == "Quaternary color")
+ if(href_list["icon"] == "none")
canister_color["quart"] = "none"
- else if (is_a_color(href_list["icon"],"quart"))
+ else if(is_a_color(href_list["icon"],"quart"))
canister_color["quart"] = href_list["icon"]
- if (href_list["choice"] == "decals")
- if (is_a_decal(href_list["icon"]))
+ if(href_list["choice"] == "decals")
+ if(is_a_decal(href_list["icon"]))
decals[href_list["icon"]] = (decals[href_list["icon"]] == 0)
src.add_fingerprint(usr)
@@ -577,8 +577,8 @@ update_flag
trace_gas.moles = 9*4000
spawn(100)
var/turf/simulated/location = src.loc
- if (istype(src.loc))
- while (!location.air)
+ if(istype(src.loc))
+ while(!location.air)
sleep(1000)
location.assume_air(air_contents)
air_contents = new
diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm
index b2b7b1efc06..560ad7642b7 100644
--- a/code/game/machinery/atmoalter/meter.dm
+++ b/code/game/machinery/atmoalter/meter.dm
@@ -28,7 +28,8 @@
return ..()
/obj/machinery/meter/initialize()
- if (!target)
+ ..()
+ if(!target)
target = locate(/obj/machinery/atmospherics/pipe) in loc
/obj/machinery/meter/process()
@@ -78,7 +79,7 @@
/obj/machinery/meter/proc/status()
var/t = ""
- if (target)
+ if(target)
var/datum/gas_mixture/environment = target.return_air()
if(environment)
t += "The pressure gauge reads [round(environment.return_pressure(), 0.01)] kPa; [round(environment.temperature,0.01)]°K ([round(environment.temperature-T0C,0.01)]°C)"
@@ -120,11 +121,11 @@
update_multitool_menu(user)
return 1
- if (!istype(W, /obj/item/weapon/wrench))
+ if(!istype(W, /obj/item/weapon/wrench))
return ..()
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
to_chat(user, "\blue You begin to unfasten \the [src]...")
- if (do_after(user, 40, target = src))
+ if(do_after(user, 40, target = src))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \
@@ -141,8 +142,9 @@
/obj/machinery/meter/turf/initialize()
- if (!target)
+ if(!target)
target = loc
+ ..()
/obj/machinery/meter/turf/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params)
return
@@ -153,4 +155,4 @@
"}
\ No newline at end of file
+ "}
diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm
index 21eee7b52ac..01f9d022c57 100644
--- a/code/game/machinery/atmoalter/portable_atmospherics.dm
+++ b/code/game/machinery/atmoalter/portable_atmospherics.dm
@@ -57,6 +57,10 @@
//Perform the connection
connected_port = new_port
connected_port.connected_device = src
+ // To avoid a chicken-egg thing where pipes need to
+ // be initialized before the atmos cans are
+ if(!connected_port.parent)
+ connected_port.build_network()
connected_port.parent.reconcile_air()
anchored = 1 //Prevent movement
@@ -78,8 +82,8 @@
return air_contents
/obj/machinery/portable_atmospherics/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params)
- if ((istype(W, /obj/item/weapon/tank) && !( src.destroyed )))
- if (src.holding)
+ if((istype(W, /obj/item/weapon/tank) && !( src.destroyed )))
+ if(src.holding)
return
var/obj/item/weapon/tank/T = W
user.drop_item()
@@ -88,7 +92,7 @@
update_icon()
return
- else if (istype(W, /obj/item/weapon/wrench))
+ else if(istype(W, /obj/item/weapon/wrench))
if(connected_port)
disconnect()
to_chat(user, "\blue You disconnect [name] from the port.")
@@ -108,7 +112,7 @@
to_chat(user, "\blue Nothing happens.")
return
- else if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1)
+ else if((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1)
atmosanalyzer_scan(air_contents, user)
return
diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm
index 23dca91dd51..9f716696591 100644
--- a/code/game/machinery/atmoalter/pump.dm
+++ b/code/game/machinery/atmoalter/pump.dm
@@ -116,12 +116,12 @@
data["on"] = on ? 1 : 0
data["hasHoldingTank"] = holding ? 1 : 0
- if (holding)
+ if(holding)
data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure() > 0 ? holding.air_contents.return_pressure() : 0))
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
- if (!ui)
+ if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "portpump.tmpl", "Portable Pump", 480, 400, state = physical_state)
@@ -143,13 +143,13 @@
if(href_list["direction"])
direction_out = !direction_out
- if (href_list["remove_tank"])
+ if(href_list["remove_tank"])
if(holding)
holding.loc = loc
holding = null
update_icon()
- if (href_list["pressure_adj"])
+ if(href_list["pressure_adj"])
var/diff = text2num(href_list["pressure_adj"])
target_pressure = Clamp(target_pressure+diff, pressuremin, pressuremax)
update_icon()
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm
index 1790dec775d..1fb0bdd1308 100644
--- a/code/game/machinery/atmoalter/scrubber.dm
+++ b/code/game/machinery/atmoalter/scrubber.dm
@@ -47,10 +47,10 @@
if(!on)
return
scrub(loc)
- if (widenet)
+ if(widenet)
var/turf/T = loc
- if (istype(T))
- for (var/turf/simulated/tile in T.GetAtmosAdjacentTurfs(alldir=1))
+ if(istype(T))
+ for(var/turf/simulated/tile in T.GetAtmosAdjacentTurfs(alldir=1))
scrub(tile)
/obj/machinery/portable_atmospherics/scrubber/proc/scrub(var/turf/simulated/tile)
@@ -69,7 +69,7 @@
removed = loc.remove_air(transfer_moles)
//Filter it
- if (removed)
+ if(removed)
var/datum/gas_mixture/filtered_out = new
filtered_out.temperature = removed.temperature
@@ -126,12 +126,12 @@
data["on"] = on ? 1 : 0
data["hasHoldingTank"] = holding ? 1 : 0
- if (holding)
+ if(holding)
data["holdingTank"] = list("name" = holding.name, "tankPressure" = round(holding.air_contents.return_pressure() > 0 ? holding.air_contents.return_pressure() : 0))
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
- if (!ui)
+ if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "portscrubber.tmpl", "Portable Scrubber", 480, 400, state = physical_state)
@@ -205,7 +205,7 @@
to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src]. ")
return
- else if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1)
+ else if((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1)
atmosanalyzer_scan(air_contents, user)
/obj/machinery/portable_atmospherics/scrubber/huge/stationary
diff --git a/code/game/machinery/atmoalter/zvent.dm b/code/game/machinery/atmoalter/zvent.dm
index 2e7ce0ac9b7..e3ac09e8f09 100644
--- a/code/game/machinery/atmoalter/zvent.dm
+++ b/code/game/machinery/atmoalter/zvent.dm
@@ -12,16 +12,16 @@
/obj/machinery/zvent/process()
//all this object does, is make its turf share air with the ones above and below it, if they have a vent too.
- if (istype(loc,/turf/simulated)) //if we're not on a valid turf, forget it
- for (var/new_z in list(-1,1)) //change this list if a fancier system of z-levels gets implemented
+ if(istype(loc,/turf/simulated)) //if we're not on a valid turf, forget it
+ for(var/new_z in list(-1,1)) //change this list if a fancier system of z-levels gets implemented
var/turf/simulated/zturf_conn = locate(x,y,z+new_z)
- if (istype(zturf_conn))
+ if(istype(zturf_conn))
var/obj/machinery/zvent/zvent_conn= locate(/obj/machinery/zvent) in zturf_conn
- if (istype(zvent_conn))
+ if(istype(zvent_conn))
//both floors have simulated turfs, share()
var/turf/simulated/myturf = loc
var/datum/gas_mixture/conn_air = zturf_conn.air //TODO: pop culture reference
var/datum/gas_mixture/my_air = myturf.air
- if (istype(conn_air) && istype(my_air))
+ if(istype(conn_air) && istype(my_air))
my_air.share(conn_air)
air_update_turf()
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 9021a1a2127..b44d51c9b30 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -107,7 +107,7 @@
return
/obj/machinery/autolathe/attackby(obj/item/O, mob/user, params)
- if (busy)
+ if(busy)
to_chat(user, "The autolathe is busy. Please wait for completion of previous operation. ")
return 1
@@ -118,7 +118,7 @@
if(exchange_parts(user, O))
return
- if (panel_open)
+ if(panel_open)
if(istype(O, /obj/item/weapon/crowbar))
materials.retrieve_all()
default_deconstruction_crowbar(O)
@@ -126,7 +126,7 @@
else
attack_hand(user)
return 1
- if (stat)
+ if(stat)
return 1
if(istype(O, /obj/item/weapon/disk/design_disk))
@@ -156,9 +156,9 @@
var/inserted = materials.insert_item(O)
if(inserted)
if(istype(O,/obj/item/stack))
- if (O.materials[MAT_METAL])
+ if(O.materials[MAT_METAL])
flick("autolathe_o",src)//plays metal insertion animation
- if (O.materials[MAT_GLASS])
+ if(O.materials[MAT_GLASS])
flick("autolathe_r",src)//plays glass insertion animation
to_chat(user, "You insert [inserted] sheet[inserted>1 ? "s" : ""] to the autolathe. ")
use_power(inserted*100)
@@ -206,7 +206,7 @@
if(!is_stack && (multiplier > 1))
return
- if (!(multiplier in list(1,10,25,max_multiplier))) //"enough materials ?" is checked in the build proc
+ if(!(multiplier in list(1,10,25,max_multiplier))) //"enough materials ?" is checked in the build proc
return
/////////////////
@@ -214,7 +214,7 @@
add_to_queue(design_last_ordered,multiplier)
else
to_chat(usr, "\red The autolathe queue is full!")
- if (!busy)
+ if(!busy)
busy = 1
process_queue()
busy = 0
@@ -264,7 +264,7 @@
var/metal_cost = D.materials[MAT_METAL]
var/glass_cost = D.materials[MAT_GLASS]
var/power = max(2000, (metal_cost+glass_cost)*multiplier/5)
- if (can_build(D,multiplier))
+ if(can_build(D,multiplier))
being_built = list(D,multiplier)
use_power(power)
icon_state = "autolathe"
@@ -325,7 +325,7 @@
var/output = ""
output += ""
output += "
Queue contains: "
- if (!istype(queue) || !queue.len)
+ if(!istype(queue) || !queue.len)
if(being_built.len)
output += "
"
output += get_processing_line()
@@ -382,7 +382,7 @@
being_built = new /list()
return 0
if(!can_build(D,multiplier))
- visible_message("\icon[src] \The [src] beeps, \"Not enough resources. Queue processing terminated.\"")
+ visible_message("[bicon(src)] \The [src] beeps, \"Not enough resources. Queue processing terminated.\"")
queue = list()
being_built = new /list()
return 0
@@ -392,7 +392,7 @@
D = listgetindex(listgetindex(queue, 1),1)
multiplier = listgetindex(listgetindex(queue,1),2)
being_built = new /list()
- //visible_message("\icon[src] \The [src] beeps, \"Queue processing finished successfully.\"")
+ //visible_message("[bicon(src)] \The [src] beeps, \"Queue processing finished successfully.\"")
/obj/machinery/autolathe/proc/main_win(mob/user)
var/dat = ""
@@ -447,9 +447,9 @@
if(ispath(D.build_path, /obj/item/stack))
var/max_multiplier = min(D.maxstack, D.materials[MAT_METAL] ?round(materials.amount(MAT_METAL)/D.materials[MAT_METAL]):INFINITY,D.materials[MAT_GLASS]?round(materials.amount(MAT_GLASS)/D.materials[MAT_GLASS]):INFINITY)
- if (max_multiplier>10 && !disabled)
+ if(max_multiplier>10 && !disabled)
dat += " x10 "
- if (max_multiplier>25 && !disabled)
+ if(max_multiplier>25 && !disabled)
dat += " x25 "
if(max_multiplier > 0 && !disabled)
dat += " x[max_multiplier] "
@@ -479,9 +479,9 @@
if(ispath(D.build_path, /obj/item/stack))
var/max_multiplier = min(D.maxstack, D.materials[MAT_METAL] ?round(materials.amount(MAT_METAL)/D.materials[MAT_METAL]):INFINITY,D.materials[MAT_GLASS]?round(materials.amount(MAT_GLASS)/D.materials[MAT_GLASS]):INFINITY)
- if (max_multiplier>10 && !disabled)
+ if(max_multiplier>10 && !disabled)
dat += " x10 "
- if (max_multiplier>25 && !disabled)
+ if(max_multiplier>25 && !disabled)
dat += " x25 "
if(max_multiplier > 0 && !disabled)
dat += " x[max_multiplier] "
diff --git a/code/game/machinery/bees_apiary.dm b/code/game/machinery/bees_apiary.dm
index 437c188d9b8..ad9fb8795cb 100644
--- a/code/game/machinery/bees_apiary.dm
+++ b/code/game/machinery/bees_apiary.dm
@@ -36,7 +36,7 @@
if(!yieldmod)
yieldmod += 1
// to_chat(world, "Yield increased by 1, from 0, to a total of [myseed.yield]")
- else if (prob(1/(yieldmod * yieldmod) *100))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2...
+ else if(prob(1/(yieldmod * yieldmod) *100))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2...
yieldmod += 1
// to_chat(world, "Yield increased by 1, to a total of [myseed.yield]")
else
diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm
index fc00e8740d3..fed2328570a 100644
--- a/code/game/machinery/biogenerator.dm
+++ b/code/game/machinery/biogenerator.dm
@@ -207,9 +207,9 @@
interact(user)
/obj/machinery/biogenerator/proc/activate()
- if (usr.stat != 0)
+ if(usr.stat != 0)
return
- if (src.stat != 0) //NOPOWER etc
+ if(src.stat != 0) //NOPOWER etc
return
if(src.processing)
to_chat(usr, "The biogenerator is in the process of working. ")
@@ -236,7 +236,7 @@
return
/obj/machinery/biogenerator/proc/check_cost(var/cost, var/checkonly)
- if (cost > points)
+ if(cost > points)
menustat = "nopoints"
return 1
else if(checkonly)
@@ -258,89 +258,89 @@
//Food
if("milk")
if(check_container_volume(10)) return 0
- else if (check_cost(20/efficiency)) return 0
+ else if(check_cost(20/efficiency)) return 0
else beaker.reagents.add_reagent("milk",10)
if("cream")
if(check_container_volume(10)) return 0
- else if (check_cost(30/efficiency)) return 0
+ else if(check_cost(30/efficiency)) return 0
else beaker.reagents.add_reagent("cream",10)
if("meat")
- if (check_cost(250/efficiency)) return 0
+ if(check_cost(250/efficiency)) return 0
else new/obj/item/weapon/reagent_containers/food/snacks/monkeycube(src.loc)
//Nutrients
if("ez")
- if (check_cost(10/efficiency, 1)) return 0
+ if(check_cost(10/efficiency, 1)) return 0
if(in_beaker)
if(check_container_volume(10)) return 0
else beaker.reagents.add_reagent("eznutrient",10)
else
new/obj/item/weapon/reagent_containers/glass/fertilizer/ez(src.loc)
- if (check_cost(10/efficiency)) return 0
+ if(check_cost(10/efficiency)) return 0
if("l4z")
- if (check_cost(20/efficiency, 1)) return 0
+ if(check_cost(20/efficiency, 1)) return 0
if(in_beaker)
if(check_container_volume(10)) return 0
else beaker.reagents.add_reagent("left4zed",10)
else
new/obj/item/weapon/reagent_containers/glass/fertilizer/l4z(src.loc)
- if (check_cost(20/efficiency)) return 0
+ if(check_cost(20/efficiency)) return 0
if("rh")
- if (check_cost(25/efficiency, 1)) return 0
+ if(check_cost(25/efficiency, 1)) return 0
if(in_beaker)
if(check_container_volume(10)) return 0
else beaker.reagents.add_reagent("robustharvest",10)
else
new/obj/item/weapon/reagent_containers/glass/fertilizer/rh(src.loc)
- if (check_cost(25/efficiency)) return 0
+ if(check_cost(25/efficiency)) return 0
//Leather
if("wallet")
- if (check_cost(100/efficiency)) return 0
+ if(check_cost(100/efficiency)) return 0
else new/obj/item/weapon/storage/wallet(src.loc)
if("bkbag")
- if (check_cost(200/efficiency)) return 0
+ if(check_cost(200/efficiency)) return 0
else new/obj/item/weapon/storage/bag/books(src.loc)
if("ptbag")
- if (check_cost(200/efficiency)) return 0
+ if(check_cost(200/efficiency)) return 0
else new/obj/item/weapon/storage/bag/plants(src.loc)
if("mnbag")
- if (check_cost(200/efficiency)) return 0
+ if(check_cost(200/efficiency)) return 0
else new/obj/item/weapon/storage/bag/ore(src.loc)
if("chbag")
- if (check_cost(200/efficiency)) return 0
+ if(check_cost(200/efficiency)) return 0
else new/obj/item/weapon/storage/bag/chemistry(src.loc)
if("rag")
- if (check_cost(200/efficiency)) return 0
+ if(check_cost(200/efficiency)) return 0
else new/obj/item/weapon/reagent_containers/glass/rag(src.loc)
if("gloves")
- if (check_cost(250/efficiency)) return 0
+ if(check_cost(250/efficiency)) return 0
else new/obj/item/clothing/gloves/botanic_leather(src.loc)
if("satchel")
- if (check_cost(400/efficiency)) return 0
+ if(check_cost(400/efficiency)) return 0
else new/obj/item/weapon/storage/backpack/satchel(src.loc)
if("cashbag")
- if (check_cost(400/efficiency)) return 0
+ if(check_cost(400/efficiency)) return 0
else new/obj/item/weapon/storage/bag/cash(src.loc)
if("jacket")
- if (check_cost(500/efficiency)) return 0
+ if(check_cost(500/efficiency)) return 0
else new/obj/item/clothing/suit/jacket/leather(src.loc)
//Belts
if("tbelt")
- if (check_cost(300/efficiency)) return 0
+ if(check_cost(300/efficiency)) return 0
else new/obj/item/weapon/storage/belt/utility(src.loc)
if("bbelt")
- if (check_cost(300/efficiency)) return 0
+ if(check_cost(300/efficiency)) return 0
else new/obj/item/weapon/storage/belt/botany(src.loc)
if("sbelt")
- if (check_cost(300/efficiency)) return 0
+ if(check_cost(300/efficiency)) return 0
else new/obj/item/weapon/storage/belt/security(src.loc)
if("mbelt")
- if (check_cost(300/efficiency)) return 0
+ if(check_cost(300/efficiency)) return 0
else new/obj/item/weapon/storage/belt/medical(src.loc)
if("jbelt")
- if (check_cost(300/efficiency)) return 0
+ if(check_cost(300/efficiency)) return 0
else new/obj/item/weapon/storage/belt/janitor(src.loc)
if("band")
- if (check_cost(300/efficiency)) return 0
+ if(check_cost(300/efficiency)) return 0
else new/obj/item/weapon/storage/belt/bandolier(src.loc)
processing = 0
menustat = "complete"
diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm
index afeb5a1f778..5bff1c651ec 100644
--- a/code/game/machinery/buttons.dm
+++ b/code/game/machinery/buttons.dm
@@ -121,7 +121,7 @@
radio_connection.post_signal(src, signal, filter = RADIO_LOGIC)
for(var/obj/machinery/door/poddoor/M in range(src,range))
- if (M.id_tag == src.id_tag && !M.protected)
+ if(M.id_tag == src.id_tag && !M.protected)
spawn()
M.open()
@@ -134,7 +134,7 @@
sleep(50)
for(var/obj/machinery/door/poddoor/M in range(src,range))
- if (M.id_tag == src.id_tag && !M.protected)
+ if(M.id_tag == src.id_tag && !M.protected)
spawn()
M.close()
return
@@ -182,7 +182,7 @@
icon_state = "launcheract"
for(var/obj/machinery/sparker/M in world)
- if (M.id == src.id)
+ if(M.id == src.id)
spawn( 0 )
M.spark()
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 9aa7cfe2c7b..bcf8ee75b00 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -42,6 +42,7 @@
cameranet.addCamera(src)
/obj/machinery/camera/initialize()
+ ..()
if(z == ZLEVEL_STATION && prob(3) && !start_active)
toggle_cam()
@@ -89,7 +90,7 @@
if(!qdeleted(src))
cancelCameraAlarm()
for(var/mob/O in mob_list)
- if (O.client && O.client.eye == src)
+ if(O.client && O.client.eye == src)
O.unset_machine()
O.reset_view(null)
to_chat(O, "The screen bursts into static.")
@@ -161,7 +162,7 @@
else
to_chat(user, "[msg2]")
- else if(istype(W, /obj/item/stack/sheet/mineral/plasma) && panel_open)
+ else if(istype(W, /obj/item/stack/sheet/mineral/plasma) && panel_open)
if(!user.unEquip(W))
to_chat(user, "[W] is stuck! ")
return
@@ -171,7 +172,7 @@
qdel(W)
else
to_chat(user, "[msg2]")
- else if(istype(W, /obj/item/device/assembly/prox_sensor) && panel_open)
+ else if(istype(W, /obj/item/device/assembly/prox_sensor) && panel_open)
if(!user.unEquip(W))
return
if(!isMotion())
@@ -182,7 +183,7 @@
to_chat(user, "[msg2]")
// OTHER
- else if ((istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/device/pda)) && isliving(user))
+ else if((istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/device/pda)) && isliving(user))
var/mob/living/U = user
var/obj/item/weapon/paper/X = null
var/obj/item/device/pda/P = null
@@ -211,12 +212,12 @@
else
to_chat(AI, "[U] holds \a [itemname] up to one of your cameras ...")
AI.last_paper_seen = "[itemname] [info] "
- else if (O.client && O.client.eye == src)
+ else if(O.client && O.client.eye == src)
to_chat(O, "[U] holds \a [itemname] up to one of the cameras ...")
O << browse(text("[] [] ", itemname, info), text("window=[]", itemname))
- else if (istype(W, /obj/item/device/camera_bug))
- if (!src.can_use())
+ else if(istype(W, /obj/item/device/camera_bug))
+ if(!src.can_use())
to_chat(user, "Camera non-functional. ")
return
if(istype(src.bug))
@@ -276,7 +277,7 @@
//Apparently, this will disconnect anyone even if the camera was re-activated.
//I guess that doesn't matter since they can't use it anyway?
for(var/mob/O in player_list)
- if (O.client && O.client.eye == src)
+ if(O.client && O.client.eye == src)
O.unset_machine()
O.reset_view(null)
to_chat(O, "The screen bursts into static.")
@@ -376,9 +377,14 @@
cam["name"] = sanitize(c_tag)
cam["deact"] = !can_use()
cam["camera"] = "\ref[src]"
- cam["x"] = T.x
- cam["y"] = T.y
- cam["z"] = T.z
+ if(T)
+ cam["x"] = T.x
+ cam["y"] = T.y
+ cam["z"] = T.z
+ else
+ cam["x"] = 0
+ cam["y"] = 0
+ cam["z"] = 0
return cam
/obj/machinery/camera/portable //Cameras which are placed inside of things, such as helmets.
diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm
index 5b236d4baa9..eeb9eeb60d3 100644
--- a/code/game/machinery/camera/motion.dm
+++ b/code/game/machinery/camera/motion.dm
@@ -8,58 +8,58 @@
/obj/machinery/camera/process()
// motion camera event loop
- if (stat & (EMPED|NOPOWER))
+ if(stat & (EMPED|NOPOWER))
return
if(!isMotion())
. = PROCESS_KILL
return
- if (detectTime > 0)
+ if(detectTime > 0)
var/elapsed = world.time - detectTime
- if (elapsed > alarm_delay)
+ if(elapsed > alarm_delay)
triggerAlarm()
- else if (detectTime == -1)
- for (var/mob/target in motionTargets)
- if (target.stat == 2) lostTarget(target)
+ else if(detectTime == -1)
+ for(var/mob/target in motionTargets)
+ if(target.stat == 2) lostTarget(target)
// If not detecting with motion camera...
- if (!area_motion)
+ if(!area_motion)
// See if the camera is still in range
if(!in_range(src, target))
// If they aren't in range, lose the target.
lostTarget(target)
/obj/machinery/camera/proc/newTarget(var/mob/target)
- if (istype(target, /mob/living/silicon/ai)) return 0
- if (detectTime == 0)
+ if(istype(target, /mob/living/silicon/ai)) return 0
+ if(detectTime == 0)
detectTime = world.time // start the clock
- if (!(target in motionTargets))
+ if(!(target in motionTargets))
motionTargets += target
return 1
/obj/machinery/camera/proc/lostTarget(var/mob/target)
- if (target in motionTargets)
+ if(target in motionTargets)
motionTargets -= target
- if (motionTargets.len == 0)
+ if(motionTargets.len == 0)
cancelAlarm()
/obj/machinery/camera/proc/cancelAlarm()
- if (!status || (stat & NOPOWER))
+ if(!status || (stat & NOPOWER))
return 0
- if (detectTime == -1)
+ if(detectTime == -1)
motion_alarm.clearAlarm(loc, src)
detectTime = 0
return 1
/obj/machinery/camera/proc/triggerAlarm()
- if (!status || (stat & NOPOWER))
+ if(!status || (stat & NOPOWER))
return 0
- if (!detectTime) return 0
+ if(!detectTime) return 0
motion_alarm.triggerAlarm(loc, src)
detectTime = -1
return 1
/obj/machinery/camera/HasProximity(atom/movable/AM as mob|obj)
// Motion cameras outside of an "ai monitored" area will use this to detect stuff.
- if (!area_motion)
+ if(!area_motion)
if(isliving(AM))
newTarget(AM)
diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm
index 4f5565fdf77..5a36a900e61 100644
--- a/code/game/machinery/camera/presets.dm
+++ b/code/game/machinery/camera/presets.dm
@@ -85,8 +85,8 @@
/obj/machinery/camera/proc/setPowerUsage()
var/mult = 1
- if (isXRay())
+ if(isXRay())
mult++
- if (isMotion())
+ if(isMotion())
mult++
active_power_usage = mult*initial(active_power_usage)
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index 0be7126f5a5..aa32db20688 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -19,16 +19,16 @@
return
var/list/L = list()
- for (var/obj/machinery/camera/C in cameranet.cameras)
+ for(var/obj/machinery/camera/C in cameranet.cameras)
L.Add(C)
camera_sort(L)
var/list/T = list()
- for (var/obj/machinery/camera/C in L)
+ for(var/obj/machinery/camera/C in L)
var/list/tempnetwork = C.network & src.network
- if (tempnetwork.len)
+ if(tempnetwork.len)
T[text("[][]", C.c_tag, (C.can_use() ? null : " (Deactivated)"))] = C
track.cameras = T
@@ -43,7 +43,7 @@
to_chat(src, "You can't list the cameras because you are dead!")
return
- if (!camera || camera == "Cancel")
+ if(!camera || camera == "Cancel")
return 0
var/obj/machinery/camera/C = track.cameras[camera]
@@ -70,7 +70,7 @@
return
var/L = get_turf(eyeobj)
- if (InvalidTurf(get_turf(L)))
+ if(InvalidTurf(get_turf(L)))
to_chat(src, "\red Unable to store this location")
return
@@ -85,7 +85,7 @@
set name = "Goto Camera Location"
set desc = "Returns to the selected camera location"
- if (!(loc in stored_locations))
+ if(!(loc in stored_locations))
to_chat(src, "\red Location [loc] not found")
return
@@ -97,7 +97,7 @@
set name = "Delete Camera Location"
set desc = "Deletes the selected camera location"
- if (!(loc in stored_locations))
+ if(!(loc in stored_locations))
to_chat(src, "\red Location [loc] not found")
return
@@ -132,7 +132,7 @@
human = 1
var/name = M.name
- if (name in track.names)
+ if(name in track.names)
track.namecounts[name]++
name = text("[] ([])", name, track.namecounts[name])
else
@@ -224,7 +224,7 @@
sleep(10)
/proc/near_camera(mob/living/M)
- if (!isturf(M.loc))
+ if(!isturf(M.loc))
return 0
if(isrobot(M))
var/mob/living/silicon/robot/R = M
@@ -235,9 +235,9 @@
return 1
/obj/machinery/camera/attack_ai(mob/living/silicon/ai/user)
- if (!istype(user))
+ if(!istype(user))
return
- if (!src.can_use())
+ if(!src.can_use())
return
user.eyeobj.setLoc(get_turf(src))
@@ -249,14 +249,14 @@
var/obj/machinery/camera/a
var/obj/machinery/camera/b
- for (var/i = L.len, i > 0, i--)
- for (var/j = 1 to i - 1)
+ for(var/i = L.len, i > 0, i--)
+ for(var/j = 1 to i - 1)
a = L[j]
b = L[j + 1]
- if (a.c_tag_order != b.c_tag_order)
- if (a.c_tag_order > b.c_tag_order)
+ if(a.c_tag_order != b.c_tag_order)
+ if(a.c_tag_order > b.c_tag_order)
L.Swap(j, j + 1)
else
- if (sorttext(a.c_tag, b.c_tag) < 0)
+ if(sorttext(a.c_tag, b.c_tag) < 0)
L.Swap(j, j + 1)
return L
diff --git a/code/game/machinery/chiller.dm b/code/game/machinery/chiller.dm
index 82fe014e160..45ec0337fea 100644
--- a/code/game/machinery/chiller.dm
+++ b/code/game/machinery/chiller.dm
@@ -105,9 +105,9 @@
return
/obj/machinery/space_heater/air_conditioner/Topic(href, href_list)
- if (usr.stat)
+ if(usr.stat)
return
- if ((in_range(src, usr) && istype(src.loc, /turf)) || (istype(usr, /mob/living/silicon)))
+ if((in_range(src, usr) && istype(src.loc, /turf)) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
switch(href_list["op"])
diff --git a/code/game/machinery/computer/HolodeckControl.dm b/code/game/machinery/computer/HolodeckControl.dm
index 809ac579454..56a1f151876 100644
--- a/code/game/machinery/computer/HolodeckControl.dm
+++ b/code/game/machinery/computer/HolodeckControl.dm
@@ -58,7 +58,9 @@
dat += " "
dat += "Safety Protocols are ENABLED "
- user << browse(dat, "window=computer;size=400x500")
+ var/datum/browser/popup = new(user, "holodeck_computer", name, 400, 500)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "computer")
return
@@ -363,10 +365,10 @@
return // HOLOTABLE DOES NOT GIVE A FUCK
/obj/structure/table/holotable/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/grab))
+ if(istype(W, /obj/item/weapon/grab))
return ..()
- if (istype(W, /obj/item/weapon/wrench))
+ if(istype(W, /obj/item/weapon/wrench))
to_chat(user, "It's a holotable! There are no bolts! ")
return
@@ -406,7 +408,7 @@
return // HOLORACK DOES NOT GIVE A FUCK
/obj/structure/rack/holorack/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/wrench))
+ if(istype(W, /obj/item/weapon/wrench))
to_chat(user, "It's a holorack! There are no bolts! ")
return
@@ -423,6 +425,7 @@
throwforce = 10
w_class = 4
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ block_chance = 50
/obj/item/weapon/holo/claymore/blue
icon_state = "claymoreblue"
@@ -432,9 +435,6 @@
icon_state = "claymorered"
item_state = "claymorered"
-/obj/item/weapon/holo/claymore/IsShield()
- return 1
-
/obj/item/weapon/holo/esword
desc = "May the force be within you. Sorta"
icon_state = "sword0"
@@ -442,8 +442,9 @@
throw_speed = 1
throw_range = 5
throwforce = 0
- w_class = 2.0
- flags = NOSHIELD
+ w_class = 2
+ armour_penetration = 50
+ block_chance = 50
var/active = 0
/obj/item/weapon/holo/esword/green/New()
@@ -452,9 +453,9 @@
/obj/item/weapon/holo/esword/red/New()
item_color = "red"
-/obj/item/weapon/holo/esword/IsShield()
+/obj/item/weapon/holo/esword/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
if(active)
- return 1
+ return ..()
return 0
/obj/item/weapon/holo/esword/New()
@@ -462,7 +463,7 @@
/obj/item/weapon/holo/esword/attack_self(mob/living/user as mob)
active = !active
- if (active)
+ if(active)
force = 30
icon_state = "sword[item_color]"
w_class = 4
@@ -500,7 +501,7 @@
throwpass = 1
/obj/structure/holohoop/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
+ if(istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
var/obj/item/weapon/grab/G = W
if(G.state<2)
to_chat(user, "You need a better grip to do that! ")
@@ -510,13 +511,13 @@
visible_message("[G.assailant] dunks [G.affecting] into the [src]! ")
qdel(W)
return
- else if (istype(W, /obj/item) && get_dist(src,user)<2)
+ else if(istype(W, /obj/item) && get_dist(src,user)<2)
user.drop_item(src)
visible_message("[user] dunks [W] into the [src]! ")
return
/obj/structure/holohoop/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if (istype(mover,/obj/item) && mover.throwing)
+ if(istype(mover,/obj/item) && mover.throwing)
var/obj/item/I = mover
if(istype(I, /obj/item/projectile))
return
@@ -572,7 +573,7 @@
var/numready = 0
for(var/obj/machinery/readybutton/button in currentarea)
numbuttons++
- if (button.ready)
+ if(button.ready)
numready++
if(numbuttons == numready)
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index cd30465370d..81753797b57 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -25,7 +25,7 @@
..()
for(dir in list(NORTH,EAST,SOUTH,WEST))
table = locate(/obj/machinery/optable, get_step(src, dir))
- if (table)
+ if(table)
table.computer = src
break
@@ -49,8 +49,8 @@
///obj/machinery/computer/operating/interact(mob/user)
-// if ( ((get_dist(src, user) > 1) && !isobserver(user)) || (stat & (BROKEN|NOPOWER)) )
-// if (!istype(user, /mob/living/silicon))
+// if( ((get_dist(src, user) > 1) && !isobserver(user)) || (stat & (BROKEN|NOPOWER)) )
+// if(!istype(user, /mob/living/silicon))
// user.unset_machine()
// user << browse(null, "window=op")
// return
@@ -91,7 +91,7 @@
data["hasOccupant"] = occupant ? 1 : 0
var/occupantData[0]
- if (occupant)
+ if(occupant)
occupantData["name"] = occupant.name
occupantData["stat"] = occupant.stat
occupantData["health"] = occupant.health
@@ -107,36 +107,37 @@
occupantData["maxTemp"] = 1000 // If you get a burning vox armalis into the sleeper, congratulations
// Because we can put simple_animals in here, we need to do something tricky to get things working nice
occupantData["temperatureSuitability"] = 0 // 0 is the baseline
- if (ishuman(occupant) && occupant.species)
+ if(ishuman(occupant) && occupant.species)
var/datum/species/sp = occupant.species
- if (occupant.bodytemperature < sp.cold_level_3)
+ if(occupant.bodytemperature < sp.cold_level_3)
occupantData["temperatureSuitability"] = -3
- else if (occupant.bodytemperature < sp.cold_level_2)
+ else if(occupant.bodytemperature < sp.cold_level_2)
occupantData["temperatureSuitability"] = -2
- else if (occupant.bodytemperature < sp.cold_level_1)
+ else if(occupant.bodytemperature < sp.cold_level_1)
occupantData["temperatureSuitability"] = -1
- else if (occupant.bodytemperature > sp.heat_level_3)
+ else if(occupant.bodytemperature > sp.heat_level_3)
occupantData["temperatureSuitability"] = 3
- else if (occupant.bodytemperature > sp.heat_level_2)
+ else if(occupant.bodytemperature > sp.heat_level_2)
occupantData["temperatureSuitability"] = 2
- else if (occupant.bodytemperature > sp.heat_level_1)
+ else if(occupant.bodytemperature > sp.heat_level_1)
occupantData["temperatureSuitability"] = 1
- else if (istype(occupant, /mob/living/simple_animal))
+ else if(istype(occupant, /mob/living/simple_animal))
var/mob/living/simple_animal/silly = occupant
- if (silly.bodytemperature < silly.minbodytemp)
+ if(silly.bodytemperature < silly.minbodytemp)
occupantData["temperatureSuitability"] = -3
- else if (silly.bodytemperature > silly.maxbodytemp)
+ else if(silly.bodytemperature > silly.maxbodytemp)
occupantData["temperatureSuitability"] = 3
// Blast you, imperial measurement system
occupantData["btCelsius"] = occupant.bodytemperature - T0C
occupantData["btFaren"] = ((occupant.bodytemperature - T0C) * (9.0/5.0))+ 32
- if (ishuman(occupant) && occupant.vessel && !(occupant.species && occupant.species.flags & NO_BLOOD))
+ if(ishuman(occupant) && occupant.vessel && !(occupant.species && occupant.species.flags & NO_BLOOD))
+ var/blood_type = occupant.get_blood_name()
occupantData["pulse"] = occupant.get_pulse(GETPULSE_TOOL)
occupantData["hasBlood"] = 1
- occupantData["bloodLevel"] = round(occupant.vessel.get_reagent_amount("blood"))
+ occupantData["bloodLevel"] = round(occupant.vessel.get_reagent_amount(blood_type))
occupantData["bloodMax"] = occupant.max_blood
- occupantData["bloodPercent"] = round(100*(occupant.vessel.get_reagent_amount("blood")/occupant.max_blood), 0.01) //copy pasta ends here
+ occupantData["bloodPercent"] = round(100*(occupant.vessel.get_reagent_amount(blood_type)/occupant.max_blood), 0.01) //copy pasta ends here
occupantData["bloodType"]=occupant.b_type
if(occupant.surgeries.len)
@@ -156,7 +157,7 @@
data["oxy"]=oxy
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "op_computer.tmpl", "Patient Monitor", 650, 455)
ui.set_initial_data(data)
ui.open()
@@ -169,7 +170,7 @@
/obj/machinery/computer/operating/Topic(href, href_list)
if(..())
return 1
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
if(href_list["verboseOn"])
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index 8ad0b715b4f..f06771cc288 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -81,7 +81,7 @@
icon_state = "3"
if(3)
if(istype(P, /obj/item/weapon/wirecutters))
- if (brain)
+ if(brain)
to_chat(user, "Get that brain out of there first")
else
playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1)
@@ -95,7 +95,7 @@
if(P:amount >= 2)
playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 20, target = src))
- if (P)
+ if(P)
P:amount -= 2
if(!P:amount) qdel(P)
to_chat(user, "\blue You put in the glass panel.")
@@ -158,7 +158,7 @@
playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
to_chat(user, "\blue You remove the glass panel.")
state = 3
- if (brain)
+ if(brain)
icon_state = "3b"
else
icon_state = "3"
diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm
index e326d9750d5..343f421b4e8 100644
--- a/code/game/machinery/computer/aifixer.dm
+++ b/code/game/machinery/computer/aifixer.dm
@@ -43,14 +43,14 @@
data["radio"] = occupant.aiRadio.disabledAi
var/laws[0]
- for (var/datum/ai_law/law in occupant.laws.all_laws())
+ for(var/datum/ai_law/law in occupant.laws.all_laws())
laws.Add(list(list("law" = law.law, "number" = law.get_index())))
data["laws"] = laws
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "ai_fixer.tmpl", "AI System Integrity Restorer", 550, 500)
ui.set_initial_data(data)
ui.open()
@@ -62,13 +62,13 @@
if(href_list["fix"])
src.active = 1
- while (src.occupant.health < 100)
+ while(src.occupant.health < 100)
src.occupant.adjustOxyLoss(-1)
src.occupant.adjustFireLoss(-1)
src.occupant.adjustToxLoss(-1)
src.occupant.adjustBruteLoss(-1)
src.occupant.updatehealth()
- if (src.occupant.health >= 0 && src.occupant.stat == 2)
+ if(src.occupant.health >= 0 && src.occupant.stat == 2)
src.occupant.stat = 0
src.occupant.lying = 0
dead_mob_list -= src.occupant
@@ -99,11 +99,11 @@
var/overlay_layer = LIGHTING_LAYER+0.2 // +0.1 from the default computer overlays
if(active)
overlays += image(icon,"ai-fixer-on",overlay_layer)
- if (occupant)
- switch (occupant.stat)
- if (0)
+ if(occupant)
+ switch(occupant.stat)
+ if(0)
overlays += image(icon,"ai-fixer-full",overlay_layer)
- if (2)
+ if(2)
overlays += image(icon,"ai-fixer-404",overlay_layer)
else
overlays += image(icon,"ai-fixer-empty",overlay_layer)
@@ -131,7 +131,7 @@
occupant.loc = card
occupant = null
update_icon()
- else if (active)
+ else if(active)
to_chat(user, "ERROR : Reconstruction in progress.")
- else if (!occupant)
+ else if(!occupant)
to_chat(user, "ERROR : Unable to locate artificial intelligence.")
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index d3cc5f089a0..48b1dadc406 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -88,7 +88,7 @@
dat += "[temp] "
dat += "Health: [player_hp] | Magic: [player_mp] | Enemy Health: [enemy_hp] "
- if (gameover)
+ if(gameover)
dat += "New Game "
else
dat += "Attack | "
@@ -109,8 +109,8 @@
if(..())
return
- if (!blocked && !gameover)
- if (href_list["attack"])
+ if(!blocked && !gameover)
+ if(href_list["attack"])
blocked = 1
var/attackamt = rand(2,6)
temp = "You attack for [attackamt] damage!"
@@ -123,7 +123,7 @@
enemy_hp -= attackamt
arcade_action()
- else if (href_list["heal"])
+ else if(href_list["heal"])
blocked = 1
var/pointamt = rand(1,3)
var/healamt = rand(6,8)
@@ -139,7 +139,7 @@
updateUsrDialog()
arcade_action()
- else if (href_list["charge"])
+ else if(href_list["charge"])
blocked = 1
var/chargeamt = rand(4,7)
temp = "You regain [chargeamt] points"
@@ -152,11 +152,11 @@
sleep(10)
arcade_action()
- if (href_list["close"])
+ if(href_list["close"])
usr.unset_machine()
usr << browse(null, "window=arcade")
- else if (href_list["newgame"]) //Reset everything
+ else if(href_list["newgame"]) //Reset everything
temp = "New Round"
player_hp = 30
player_mp = 10
@@ -174,7 +174,7 @@
return
/obj/machinery/computer/arcade/battle/proc/arcade_action()
- if ((enemy_mp <= 0) || (enemy_hp <= 0))
+ if((enemy_mp <= 0) || (enemy_hp <= 0))
if(!gameover)
gameover = 1
temp = "[enemy_name] has fallen! Rejoice!"
@@ -193,20 +193,20 @@
var/score = player_hp + player_mp + 5
prizevend(score)
- else if (emagged && (turtle >= 4))
+ else if(emagged && (turtle >= 4))
var/boomamt = rand(5,10)
temp = "[enemy_name] throws a bomb, exploding you for [boomamt] damage!"
playsound(src.loc, 'sound/arcade/Boom.ogg', 20, 1, extrarange = -6, falloff = 10)
player_hp -= boomamt
- else if ((enemy_mp <= 5) && (prob(70)))
+ else if((enemy_mp <= 5) && (prob(70)))
var/stealamt = rand(2,3)
temp = "[enemy_name] steals [stealamt] of your power!"
playsound(src.loc, 'sound/arcade/Steal.ogg', 20, 1, extrarange = -6, falloff = 10)
player_mp -= stealamt
updateUsrDialog()
- if (player_mp <= 0)
+ if(player_mp <= 0)
gameover = 1
sleep(10)
temp = "You have been drained! GAME OVER"
@@ -217,7 +217,7 @@
else
feedback_inc("arcade_loss_mana_normal")
- else if ((enemy_hp <= 10) && (enemy_mp > 4))
+ else if((enemy_hp <= 10) && (enemy_mp > 4))
temp = "[enemy_name] heals for 4 health!"
playsound(src.loc, 'sound/arcade/Heal.ogg', 20, 1, extrarange = -6, falloff = 10)
enemy_hp += 4
@@ -229,7 +229,7 @@
playsound(src.loc, 'sound/arcade/Hit.ogg', 20, 1, extrarange = -6, falloff = 10)
player_hp -= attackamt
- if ((player_mp <= 0) || (player_hp <= 0))
+ if((player_mp <= 0) || (player_hp <= 0))
gameover = 1
temp = "You have been crushed! GAME OVER"
playsound(src.loc, 'sound/arcade/Lose.ogg', 20, 1, extrarange = -6, falloff = 10)
@@ -426,7 +426,7 @@
return
busy = 1
- if (href_list["continue"]) //Continue your travels
+ if(href_list["continue"]) //Continue your travels
if(turns >= ORION_TRAIL_WINTURN)
win()
else
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index b128b06bf49..1168552b952 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -13,7 +13,7 @@
/obj/item/weapon/circuitboard
density = 0
anchored = 0
- w_class = 2.0
+ w_class = 2
name = "circuit board"
icon = 'icons/obj/module.dmi'
icon_state = "id_mod"
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 0311ac200fb..81b2c6b86a4 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -43,17 +43,15 @@
/obj/machinery/computer/security/check_eye(var/mob/user as mob)
- if ((get_dist(user, src) > 1 || !( user.canmove ) || user.blinded || !( current ) || !( current.status )) && (!istype(user, /mob/living/silicon)))
+ if((get_dist(user, src) > 1 || !( user.canmove ) || user.blinded || !( current ) || !( current.status )) && (!istype(user, /mob/living/silicon)))
return null
user.reset_view(current)
return 1
// Network configuration
-/obj/machinery/computer/security/attackby(I as obj, user as mob, params)
- access = list()
- if(istype(I,/obj/item/weapon/card/id)) // If hit by a regular ID card.
- var/obj/item/weapon/card/id/E = I
- access = E.access
+/obj/machinery/computer/security/attackby(obj/item/I, user as mob, params)
+ access = I.GetAccess()
+ if(access.len) // If hit by something with access.
ui_interact(user)
else
..()
@@ -118,7 +116,7 @@
data["current"] = current.nano_structure()
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "sec_camera.tmpl", "Camera Console", 900, 800)
// adding a template with the key "mapContent" enables the map ui functionality
@@ -172,10 +170,7 @@
user.set_machine(src)
if(ishuman(user))
- var/mob/living/carbon/human/H = user
- if(H.wear_id)
- var/obj/item/weapon/card/id/gold/C = H.wear_id
- access = C.access
+ access = user.get_access()
ui_interact(user)
diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm
index 16242f5a58e..0a84ee81821 100644
--- a/code/game/machinery/computer/camera_advanced.dm
+++ b/code/game/machinery/computer/camera_advanced.dm
@@ -6,8 +6,8 @@
var/mob/camera/aiEye/remote/eyeobj
var/mob/living/carbon/human/current_user = null
var/list/networks = list("SS13")
- var/datum/action/camera_off/off_action = new
- var/datum/action/camera_jump/jump_action = new
+ var/datum/action/innate/camera_off/off_action = new
+ var/datum/action/innate/camera_jump/jump_action = new
/obj/machinery/computer/camera_advanced/proc/CreateEye()
eyeobj = new()
@@ -115,12 +115,11 @@
else
sprint = initial
-/datum/action/camera_off
+/datum/action/innate/camera_off
name = "End Camera View"
- action_type = AB_INNATE
button_icon_state = "camera_off"
-/datum/action/camera_off/Activate()
+/datum/action/innate/camera_off/Activate()
if(!target || !iscarbon(target))
return
var/mob/living/carbon/C = target
@@ -139,12 +138,11 @@
C.unset_machine()
src.Remove(C)
-/datum/action/camera_jump
+/datum/action/innate/camera_jump
name = "Jump To Camera"
- action_type = AB_INNATE
button_icon_state = "camera_jump"
-/datum/action/camera_jump/Activate()
+/datum/action/innate/camera_jump/Activate()
if(!target || !iscarbon(target))
return
var/mob/living/carbon/C = target
@@ -153,16 +151,16 @@
var/list/L = list()
- for (var/obj/machinery/camera/cam in cameranet.cameras)
+ for(var/obj/machinery/camera/cam in cameranet.cameras)
L.Add(cam)
camera_sort(L)
var/list/T = list()
- for (var/obj/machinery/camera/netcam in L)
+ for(var/obj/machinery/camera/netcam in L)
var/list/tempnetwork = netcam.network&origin.networks
- if (tempnetwork.len)
+ if(tempnetwork.len)
T[text("[][]", netcam.c_tag, (netcam.can_use() ? null : " (Deactivated)"))] = netcam
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 7af28cc4f73..bb31fba787d 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -37,6 +37,8 @@ var/time_last_changed_position = 0
/datum/job/mechanic,
/datum/job/barber,
/datum/job/chaplain,
+ /datum/job/ntnavyofficer,
+ /datum/job/ntspecops,
/datum/job/civilian
)
@@ -212,7 +214,7 @@ var/time_last_changed_position = 0
if(modify)
data["current_skin"] = modify.icon_state
- if (modify && is_centcom())
+ if(modify && is_centcom())
var/list/all_centcom_access = list()
for(var/access in get_all_centcom_access())
all_centcom_access.Add(list(list(
@@ -223,12 +225,12 @@ var/time_last_changed_position = 0
data["all_centcom_access"] = all_centcom_access
data["all_centcom_skins"] = format_card_skins(get_centcom_card_skins())
- else if (modify)
+ else if(modify)
var/list/regions = list()
for(var/i = 1; i <= 7; i++)
var/list/accesses = list()
for(var/access in get_region_accesses(i))
- if (get_access_desc(access))
+ if(get_access_desc(access))
accesses.Add(list(list(
"desc" = replacetext(get_access_desc(access), " ", " "),
"ref" = access,
@@ -241,7 +243,7 @@ var/time_last_changed_position = 0
data["regions"] = regions
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "identification_computer.tmpl", src.name, 775, 700)
ui.set_initial_data(data)
ui.open()
@@ -251,8 +253,8 @@ var/time_last_changed_position = 0
return 1
switch(href_list["choice"])
- if ("modify")
- if (modify)
+ if("modify")
+ if(modify)
data_core.manifest_modify(modify.registered_name, modify.assignment)
modify.name = text("[modify.registered_name]'s ID Card ([modify.assignment])")
if(ishuman(usr))
@@ -265,13 +267,13 @@ var/time_last_changed_position = 0
modify = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.loc = src
modify = I
- if ("scan")
- if (scan)
+ if("scan")
+ if(scan)
if(ishuman(usr))
scan.loc = usr.loc
if(!usr.get_active_hand())
@@ -282,7 +284,7 @@ var/time_last_changed_position = 0
scan = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.loc = src
scan = I
@@ -302,8 +304,8 @@ var/time_last_changed_position = 0
if(is_authenticated(usr) && modify && ((skin in get_station_card_skins()) || ((skin in get_centcom_card_skins()) && is_centcom())))
modify.icon_state = href_list["skin_target"]
- if ("assign")
- if (is_authenticated(usr) && modify)
+ if("assign")
+ if(is_authenticated(usr) && modify)
var/t1 = href_list["assign_target"]
if(t1 == "Custom")
var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,MAX_MESSAGE_LEN))
@@ -333,10 +335,10 @@ var/time_last_changed_position = 0
callHook("reassign_employee", list(modify))
- if ("reg")
- if (is_authenticated(usr))
+ if("reg")
+ if(is_authenticated(usr))
var/t2 = modify
- if ((modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf)))
+ if((modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf)))
var/temp_name = reject_bad_name(href_list["reg"])
if(temp_name)
modify.registered_name = temp_name
@@ -344,19 +346,19 @@ var/time_last_changed_position = 0
src.visible_message("[src] buzzes rudely. ")
nanomanager.update_uis(src)
- if ("account")
- if (is_authenticated(usr))
+ if("account")
+ if(is_authenticated(usr))
var/t2 = modify
- if ((modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf)))
+ if((modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf)))
var/account_num = text2num(href_list["account"])
modify.associated_account_number = account_num
nanomanager.update_uis(src)
- if ("mode")
+ if("mode")
mode = text2num(href_list["mode_target"])
- if ("print")
- if (!printing)
+ if("print")
+ if(!printing)
printing = 1
playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
spawn(50)
@@ -364,13 +366,13 @@ var/time_last_changed_position = 0
nanomanager.update_uis(src)
var/obj/item/weapon/paper/P = new(loc)
- if (mode == 2)
+ if(mode == 2)
P.name = text("crew manifest ([])", worldtime2text())
P.info = {"Crew Manifest
[data_core ? data_core.get_manifest(0) : ""]
"}
- else if (modify && !mode)
+ else if(modify && !mode)
P.name = "access report"
P.info = {"Access Report
Prepared By: [scan && scan.registered_name ? scan.registered_name : "Unknown"]
@@ -388,8 +390,8 @@ var/time_last_changed_position = 0
first = 0
P.info += ""
- if ("terminate")
- if (is_authenticated(usr))
+ if("terminate")
+ if(is_authenticated(usr))
modify.assignment = "Terminated"
modify.access = list()
@@ -426,7 +428,7 @@ var/time_last_changed_position = 0
opened_positions[edit_job_target]--
nanomanager.update_uis(src)
- if (modify)
+ if(modify)
modify.name = text("[modify.registered_name]'s ID Card ([modify.assignment])")
return 1
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 0818dccbe35..6f4a373580c 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -37,7 +37,7 @@
if(scanner.occupant && can_autoprocess())
scan_mob(scanner.occupant)
- for (var/obj/machinery/clonepod/pod in pods)
+ for(var/obj/machinery/clonepod/pod in pods)
if(!(pod.occupant || pod.mess) && (pod.efficiency > 5))
for(var/datum/dna2/record/R in src.records)
if(!(pod.occupant || pod.mess))
@@ -48,7 +48,7 @@
src.scanner = findscanner()
releasecloner()
findcloner()
- if(!selected_pod)
+ if(!selected_pod && pods.len)
selected_pod = pods[1]
/obj/machinery/computer/cloning/proc/findscanner()
@@ -57,7 +57,7 @@
//Try to find scanner on adjacent tiles first
for(dir in list(NORTH,EAST,SOUTH,WEST))
scannerf = locate(/obj/machinery/dna_scannernew, get_step(src, dir))
- if (scannerf)
+ if(scannerf)
return scannerf
//Then look for a free one in the area
@@ -82,8 +82,8 @@
P.name = "[initial(P.name)] #[num++]"
/obj/machinery/computer/cloning/attackby(obj/item/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES
- if (!src.diskette)
+ if(istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES
+ if(!src.diskette)
user.drop_item()
W.loc = src
src.diskette = W
@@ -129,7 +129,7 @@
data["numberofpods"] = src.pods.len
var/list/tempods[0]
- for (var/obj/machinery/clonepod/pod in pods)
+ for(var/obj/machinery/clonepod/pod in pods)
if(pod.efficiency > 5)
canpodautoprocess = 1
@@ -159,13 +159,13 @@
data["records"] = temprecords
if(src.menu == 3)
- if (src.active_record)
+ if(src.active_record)
data["activerecord"] = "\ref[src.active_record]"
var/obj/item/weapon/implant/health/H = null
if(src.active_record.implant)
H = locate(src.active_record.implant)
- if ((H) && (istype(H)))
+ if((H) && (istype(H)))
data["health"] = H.sensehealth()
data["realname"] = sanitize(src.active_record.dna.real_name)
data["unidentity"] = src.active_record.dna.uni_identity
@@ -177,7 +177,7 @@
// Set up the Nano UI
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "cloning_console.tmpl", "Cloning Console UI", 640, 520)
ui.set_initial_data(data)
ui.open()
@@ -189,7 +189,7 @@
if(loading)
return
- if (href_list["scan"] && scanner && scanner.occupant)
+ if(href_list["scan"] && scanner && scanner.occupant)
scantemp = "Scanner ready."
loading = 1
@@ -213,16 +213,16 @@
nanomanager.update_uis(src)
//No locking an open scanner.
- else if ((href_list["lock"]) && (!isnull(src.scanner)))
- if ((!src.scanner.locked) && (src.scanner.occupant))
+ else if((href_list["lock"]) && (!isnull(src.scanner)))
+ if((!src.scanner.locked) && (src.scanner.occupant))
src.scanner.locked = 1
else
src.scanner.locked = 0
- else if (href_list["view_rec"])
+ else if(href_list["view_rec"])
src.active_record = locate(href_list["view_rec"])
if(istype(src.active_record,/datum/dna2/record))
- if ((isnull(src.active_record.ckey)))
+ if((isnull(src.active_record.ckey)))
qdel(src.active_record)
src.temp = "Error: Record corrupt. "
else
@@ -231,16 +231,16 @@
src.active_record = null
src.temp = "Error: Record missing. "
- else if (href_list["del_rec"])
- if ((!src.active_record) || (src.menu < 3))
+ else if(href_list["del_rec"])
+ if((!src.active_record) || (src.menu < 3))
return
- if (src.menu == 3) //If we are viewing a record, confirm deletion
+ if(src.menu == 3) //If we are viewing a record, confirm deletion
src.temp = "Please confirm that you want to delete the record?"
src.menu = 4
- else if (src.menu == 4)
+ else if(src.menu == 4)
var/obj/item/weapon/card/id/C = usr.get_active_hand()
- if (istype(C)||istype(C, /obj/item/device/pda))
+ if(istype(C)||istype(C, /obj/item/device/pda))
if(src.check_access(C))
src.records.Remove(src.active_record)
qdel(src.active_record)
@@ -249,14 +249,14 @@
else
src.temp = "Error: Access denied. "
- else if (href_list["disk"]) //Load or eject.
+ else if(href_list["disk"]) //Load or eject.
switch(href_list["disk"])
if("load")
- if ((isnull(src.diskette)) || isnull(src.diskette.buf))
+ if((isnull(src.diskette)) || isnull(src.diskette.buf))
src.temp = "Error: The disk's data could not be read. "
nanomanager.update_uis(src)
return
- if (isnull(src.active_record))
+ if(isnull(src.active_record))
src.temp = "Error: No active record was found. "
src.menu = 1
nanomanager.update_uis(src)
@@ -267,12 +267,12 @@
src.temp = "Load successful."
if("eject")
- if (!isnull(src.diskette))
+ if(!isnull(src.diskette))
src.diskette.loc = src.loc
src.diskette = null
- else if (href_list["save_disk"]) //Save to disk!
- if ((isnull(src.diskette)) || (src.diskette.read_only) || (isnull(src.active_record)))
+ else if(href_list["save_disk"]) //Save to disk!
+ if((isnull(src.diskette)) || (src.diskette.read_only) || (isnull(src.active_record)))
src.temp = "Error: The data could not be saved. "
nanomanager.update_uis(src)
return
@@ -290,15 +290,15 @@
src.diskette.name = "data disk - '[src.active_record.dna.real_name]'"
src.temp = "Save \[[href_list["save_disk"]]\] successful."
- else if (href_list["refresh"])
+ else if(href_list["refresh"])
nanomanager.update_uis(src)
- else if (href_list["selectpod"])
+ else if(href_list["selectpod"])
var/obj/machinery/clonepod/selected = locate(href_list["selectpod"])
if(istype(selected) && (selected in pods))
selected_pod = selected
- else if (href_list["clone"])
+ else if(href_list["clone"])
var/datum/dna2/record/C = locate(href_list["clone"])
//Look for that player! They better be dead!
if(istype(C))
@@ -307,7 +307,7 @@
temp = "Error: No cloning pod detected. "
else
var/obj/machinery/clonepod/pod = selected_pod
- if (!selected_pod)
+ if(!selected_pod)
temp = "Error: No cloning pod selected. "
else if(pod.occupant)
temp = "Error: The cloning pod is currently occupied. "
@@ -340,11 +340,11 @@
else
temp = "Error: Data corruption. "
- else if (href_list["menu"])
+ else if(href_list["menu"])
src.menu = text2num(href_list["menu"])
temp = ""
scantemp = "Scanner ready."
- else if (href_list["toggle_mode"])
+ else if(href_list["toggle_mode"])
if(can_brainscan())
scan_mode = !scan_mode
else
@@ -355,13 +355,13 @@
return
/obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject as mob, var/scan_brain = 0)
- if (stat & NOPOWER)
+ if(stat & NOPOWER)
return
- if (scanner.stat & (NOPOWER|BROKEN))
+ if(scanner.stat & (NOPOWER|BROKEN))
return
- if (scan_brain && !can_brainscan())
+ if(scan_brain && !can_brainscan())
return
- if ((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna) || (subject.species.flags & NO_SCAN))
+ if((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna) || (subject.species.flags & NO_SCAN))
scantemp = "Error: Unable to locate valid genetic data. "
nanomanager.update_uis(src)
return
@@ -377,23 +377,23 @@
scantemp = "Error: No signs of intelligence detected. "
nanomanager.update_uis(src)
return
- if (subject.suiciding == 1 && src.scanner.scan_level < 2)
+ if(subject.suiciding == 1 && src.scanner.scan_level < 2)
scantemp = "Error: Subject's brain is not responding to scanning stimuli. "
nanomanager.update_uis(src)
return
- if ((!subject.ckey) || (!subject.client))
+ if((!subject.ckey) || (!subject.client))
scantemp = "Error: Mental interface failure. "
nanomanager.update_uis(src)
return
- if ((NOCLONE in subject.mutations) && src.scanner.scan_level < 2)
+ if((NOCLONE in subject.mutations) && src.scanner.scan_level < 2)
scantemp = "Error: Mental interface failure. "
nanomanager.update_uis(src)
return
- if (scan_brain && !subject.get_int_organ(/obj/item/organ/internal/brain))
+ if(scan_brain && !subject.get_int_organ(/obj/item/organ/internal/brain))
scantemp = "Error: No brain found. "
nanomanager.update_uis(src)
return
- if (!isnull(find_record(subject.ckey)))
+ if(!isnull(find_record(subject.ckey)))
scantemp = "Subject already in database."
nanomanager.update_uis(src)
return
@@ -422,7 +422,7 @@
R.languages=subject.languages
//Add an implant if needed
var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject)
- if (isnull(imp))
+ if(isnull(imp))
imp = new /obj/item/weapon/implant/health(subject)
imp.implanted = subject
R.implant = "\ref[imp]"
@@ -430,7 +430,7 @@
else
R.implant = "\ref[imp]"
- if (!isnull(subject.mind)) //Save that mind so traitors can continue traitoring after cloning.
+ if(!isnull(subject.mind)) //Save that mind so traitors can continue traitoring after cloning.
R.mind = "\ref[subject.mind]"
src.records += R
@@ -441,7 +441,7 @@
/obj/machinery/computer/cloning/proc/find_record(var/find_key)
var/selected_record = null
for(var/datum/dna2/record/R in src.records)
- if (R.ckey == find_key)
+ if(R.ckey == find_key)
selected_record = R
break
return selected_record
@@ -450,4 +450,4 @@
return (scanner && scanner.scan_level > 2)
/obj/machinery/computer/cloning/proc/can_brainscan()
- return (scanner && scanner.scan_level > 3)
\ No newline at end of file
+ return (scanner && scanner.scan_level > 3)
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 73779c170e0..e87802f728c 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -54,7 +54,7 @@
if(..(href, href_list))
return 1
- if ((!(src.z in config.station_levels) && !(src.z in config.admin_levels)))
+ if((!(src.z in config.station_levels) && !(src.z in config.admin_levels)))
to_chat(usr, "Unable to establish a connection: You're too far away from the station! ")
return 1
@@ -65,10 +65,10 @@
var/mob/living/carbon/human/M = usr
var/obj/item/card = M.get_active_hand()
var/obj/item/weapon/card/id/I = (card && card.GetID())||M.wear_id||M.wear_pda
- if (istype(I, /obj/item/device/pda))
+ if(istype(I, /obj/item/device/pda))
var/obj/item/device/pda/pda = I
I = pda.id
- if (I && istype(I))
+ if(I && istype(I))
if(src.check_access(I))
authenticated = 1
if(access_captain in I.access)
@@ -103,10 +103,10 @@
var/mob/living/carbon/human/L = usr
var/obj/item/card = L.get_active_hand()
var/obj/item/weapon/card/id/I = (card && card.GetID())||L.wear_id||L.wear_pda
- if (istype(I, /obj/item/device/pda))
+ if(istype(I, /obj/item/device/pda))
var/obj/item/device/pda/pda = I
I = pda.id
- if (I && istype(I))
+ if(I && istype(I))
if(access_captain in I.access)
var/old_level = security_level
if(!tmp_alertlevel) tmp_alertlevel = SEC_LEVEL_GREEN
@@ -303,7 +303,7 @@
if(stat & (NOPOWER|BROKEN))
return
- if (!(src.z in list(ZLEVEL_STATION, ZLEVEL_CENTCOMM)))
+ if(!(src.z in list(ZLEVEL_STATION, ZLEVEL_CENTCOMM)))
to_chat(user, "Unable to establish a connection: You're too far away from the station! ")
return
@@ -376,7 +376,7 @@
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
- if (!ui)
+ if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "comm_console.tmpl", "Communications Console", 400, 500)
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 8524cd85754..1cb4ba64b02 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -21,6 +21,7 @@
..()
/obj/machinery/computer/initialize()
+ ..()
power_change()
update_icon()
@@ -40,15 +41,15 @@
qdel(src)
return
if(2.0)
- if (prob(25))
+ if(prob(25))
qdel(src)
return
- if (prob(50))
+ if(prob(50))
for(var/x in verbs)
verbs -= x
set_broken()
if(3.0)
- if (prob(25))
+ if(prob(25))
for(var/x in verbs)
verbs -= x
set_broken()
@@ -62,7 +63,7 @@
..()
/obj/machinery/computer/blob_act()
- if (prob(75))
+ if(prob(75))
for(var/x in verbs)
verbs -= x
set_broken()
@@ -117,9 +118,9 @@
var/obj/item/weapon/circuitboard/M = new circuit( A )
A.circuit = M
A.anchored = 1
- for (var/obj/C in src)
+ for(var/obj/C in src)
C.loc = src.loc
- if (src.stat & BROKEN)
+ if(src.stat & BROKEN)
to_chat(user, "\blue The broken glass falls out.")
new /obj/item/weapon/shard(loc)
A.state = 3
diff --git a/code/game/machinery/computer/hologram.dm b/code/game/machinery/computer/hologram.dm
index 2b5f0b92296..48dfaf36bf6 100644
--- a/code/game/machinery/computer/hologram.dm
+++ b/code/game/machinery/computer/hologram.dm
@@ -22,7 +22,7 @@
return
/obj/machinery/computer/hologram_comp/attack_hand()
- if (!in_range(src, usr))
+ if(!in_range(src, usr))
return 0
src.show_console(usr)
return
@@ -30,7 +30,7 @@
/obj/machinery/computer/hologram_comp/proc/render()
var/icon/I = new /icon('icons/mob/human.dmi', "body_m_s")
- if (src.lumens >= 0)
+ if(src.lumens >= 0)
I.Blend(rgb(src.lumens, src.lumens, src.lumens), ICON_ADD)
else
I.Blend(rgb(- src.lumens, -src.lumens, -src.lumens), ICON_SUBTRACT)
@@ -48,7 +48,7 @@
/obj/machinery/computer/hologram_comp/proc/show_console(var/mob/user as mob)
var/dat
user.set_machine(src)
- if (src.temp)
+ if(src.temp)
dat = text("[]Clear ", src.temp, src)
else
dat = text("Hologram Status: \nPower: [] \nHologram Control: \nColor Luminosity: []/220 \[Reset\] \nLighten: 1 10 \nDarken: 1 10 \n \nHair Color: ([],[],[]) \[Reset\] \nRed (0-255): \[0\] -10 -1 [] 1 10 \[255\] \nGreen (0-255): \[0\] -10 -1 [] 1 10 \[255\] \nBlue (0-255): \[0\] -10 -1 [] 1 10 \[255\] ", src, (src.projector.hologram ? "On" : "Off"), -src.lumens + 35, src, src, src, src, src, src.h_r, src.h_g, src.h_b, src, src, src, src, src.h_r, src, src, src, src, src, src, src.h_g, src, src, src, src, src, src, src.h_b, src, src, src)
@@ -59,10 +59,10 @@
/obj/machinery/computer/hologram_comp/Topic(href, href_list)
if(..())
return 1
- if (in_range(src, usr))
+ if(in_range(src, usr))
flick("holo_console1", src)
- if (href_list["power"])
- if (src.projector.hologram)
+ if(href_list["power"])
+ if(src.projector.hologram)
src.projector.icon_state = "hologram0"
//src.projector.hologram = null
qdel(src.projector.hologram)
@@ -73,38 +73,38 @@
src.projector.icon_state = "hologram1"
src.render()
else
- if (href_list["h_r"])
- if (src.projector.hologram)
+ if(href_list["h_r"])
+ if(src.projector.hologram)
src.h_r += text2num(href_list["h_r"])
src.h_r = min(max(src.h_r, 0), 255)
render()
else
- if (href_list["h_g"])
- if (src.projector.hologram)
+ if(href_list["h_g"])
+ if(src.projector.hologram)
src.h_g += text2num(href_list["h_g"])
src.h_g = min(max(src.h_g, 0), 255)
render()
else
- if (href_list["h_b"])
- if (src.projector.hologram)
+ if(href_list["h_b"])
+ if(src.projector.hologram)
src.h_b += text2num(href_list["h_b"])
src.h_b = min(max(src.h_b, 0), 255)
render()
else
- if (href_list["light"])
- if (src.projector.hologram)
+ if(href_list["light"])
+ if(src.projector.hologram)
src.lumens += text2num(href_list["light"])
src.lumens = min(max(src.lumens, -185.0), 35)
render()
else
- if (href_list["reset"])
- if (src.projector.hologram)
+ if(href_list["reset"])
+ if(src.projector.hologram)
src.lumens = 0
render()
else
- if (href_list["temp"])
+ if(href_list["temp"])
src.temp = null
for(var/mob/M in viewers(1, src))
- if ((M.client && M.machine == src))
+ if((M.client && M.machine == src))
src.show_console(M)
return
diff --git a/code/game/machinery/computer/honkputer.dm b/code/game/machinery/computer/honkputer.dm
index 8ccd36fc780..2f26663395e 100644
--- a/code/game/machinery/computer/honkputer.dm
+++ b/code/game/machinery/computer/honkputer.dm
@@ -20,8 +20,8 @@
/obj/machinery/computer/HONKputer/Topic(href, href_list)
if(..())
return 1
- if (!(src.z in config.station_levels))
- to_chat(usr, "\red Unable to establish a connection : \black You're too far away from the station!")
+ if(!(src.z in config.station_levels))
+ to_chat(usr, "Unable to establish a connection : You're too far away from the station!")
return
usr.set_machine(src)
@@ -34,10 +34,10 @@
if("login")
var/mob/M = usr
var/obj/item/weapon/card/id/I = M.get_active_hand()
- if (istype(I, /obj/item/device/pda))
+ if(istype(I, /obj/item/device/pda))
var/obj/item/device/pda/pda = I
I = pda.id
- if (I && istype(I))
+ if(I && istype(I))
if(src.check_access(I) || src.emagged==1)
authenticated = 1
if("logout")
@@ -68,20 +68,20 @@
/obj/machinery/computer/HONKputer/attack_hand(var/mob/user as mob)
if(..())
return
- if (src.z > 6)
- to_chat(user, "\red Unable to establish a connection : \black You're too far away from the station!")
+ if(src.z > 6)
+ to_chat(user, "Unable to establish a connection : You're too far away from the station!")
return
user.set_machine(src)
var/dat = "HONKputer Interface "
- if (istype(user, /mob/living/silicon))
+ if(istype(user, /mob/living/silicon))
to_chat(user, "This console is not networked to the rest of the grid.")
return
switch(src.state)
if(STATE_DEFAULT)
- if (src.authenticated)
+ if(src.authenticated)
dat += " \[ Log Out \]"
dat += " \[ Send an emergency message to Honkplanet \]"
else
@@ -101,9 +101,9 @@
var/obj/item/weapon/circuitboard/M = new circuit( A )
A.circuit = M
A.anchored = 1
- for (var/obj/C in src)
+ for(var/obj/C in src)
C.loc = src.loc
- if (src.stat & BROKEN)
+ if(src.stat & BROKEN)
to_chat(user, "\blue The broken glass falls out.")
new /obj/item/weapon/shard( src.loc )
A.state = 3
diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm
index c84690cfa64..d50edbfd0cb 100644
--- a/code/game/machinery/computer/law.dm
+++ b/code/game/machinery/computer/law.dm
@@ -29,8 +29,8 @@
attackby(obj/item/weapon/O as obj, mob/user as mob, params)
- if (user.z > 6)
- to_chat(user, "\red Unable to establish a connection : \black You're too far away from the station!")
+ if(user.z > 6)
+ to_chat(user, "Unable to establish a connection : You're too far away from the station!")
return
if(istype(O, /obj/item/weapon/aiModule))
var/datum/game_mode/nations/mode = get_nations_mode()
@@ -54,7 +54,7 @@
src.current = select_active_ai(user)
- if (!src.current)
+ if(!src.current)
to_chat(usr, "No active AIs detected.")
else
to_chat(usr, "[src.current.name] selected for law changes.")
@@ -94,7 +94,7 @@
src.current = freeborg()
- if (!src.current)
+ if(!src.current)
to_chat(usr, "No free cyborgs detected.")
else
to_chat(usr, "[src.current.name] selected for law changes.")
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 6e331d46cf3..780bdd55f8e 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -27,11 +27,11 @@
if(..())
return
var/dat
- if (src.temp)
+ if(src.temp)
dat = text("[src.temp] Clear Screen ")
else
dat = text("Confirm Identity: [] ", src, (src.scan ? text("[]", src.scan.name) : "----------"))
- if (src.authenticated)
+ if(src.authenticated)
switch(src.screen)
if(1.0)
dat += {"
@@ -48,18 +48,14 @@
dat += "Record List : "
if(!isnull(data_core.general))
for(var/datum/data/record/R in sortRecord(data_core.general))
- dat += text("[]: [] ", src, R, R.fields["id"], R.fields["name"])
+ dat += text(" []: [] ", src, R, R.fields["id"], R.fields["name"])
//Foreach goto(132)
dat += text("Back ", src)
if(3.0)
dat += text("Records Maintenance \nBackup To Disk \nUpload From disk \nDelete All Records \n \nBack ", src, src, src, src)
if(4.0)
- var/icon/front = new(active1.fields["photo"], dir = SOUTH)
- var/icon/side = new(active1.fields["photo"], dir = WEST)
- user << browse_rsc(front, "front.png")
- user << browse_rsc(side, "side.png")
dat += "Medical Record "
- if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
+ if((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
dat += ""
+ Photo: \
+
"
else
dat += "General Record Lost! "
- if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
+ if((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
dat += text(" \nMedical Data \nBlood Type: [] \nDNA: [] \n \nMinor Disabilities: [] \nDetails: [] \n \nMajor Disabilities: [] \nDetails: [] \n \nAllergies: [] \nDetails: [] \n \nCurrent Diseases: [] (per disease info placed in log/comment section) \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", src, src.active2.fields["b_type"], src, src.active2.fields["b_dna"], src, src.active2.fields["mi_dis"], src, src.active2.fields["mi_dis_d"], src, src.active2.fields["ma_dis"], src, src.active2.fields["ma_dis_d"], src, src.active2.fields["alg"], src, src.active2.fields["alg_d"], src, src.active2.fields["cdi"], src, src.active2.fields["cdi_d"], src, src.active2.fields["notes"])
var/counter = 1
while(src.active2.fields[text("com_[]", counter)])
@@ -115,7 +112,9 @@
else
else
dat += text("{Log In} ", src)
- user << browse(text("Medical Records [] ", dat), "window=med_rec")
+ var/datum/browser/popup = new(user, "med_rec", name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "med_rec")
return
@@ -123,20 +122,20 @@
if(..())
return 1
- if (!( data_core.general.Find(src.active1) ))
+ if(!( data_core.general.Find(src.active1) ))
src.active1 = null
- if (!( data_core.medical.Find(src.active2) ))
+ if(!( data_core.medical.Find(src.active2) ))
src.active2 = null
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
- if (href_list["temp"])
+ if(href_list["temp"])
src.temp = null
- if (href_list["scan"])
- if (src.scan)
+ if(href_list["scan"])
+ if(src.scan)
if(ishuman(usr))
scan.loc = usr.loc
@@ -152,27 +151,27 @@
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.loc = src
src.scan = I
- else if (href_list["logout"])
+ else if(href_list["logout"])
src.authenticated = null
src.screen = null
src.active1 = null
src.active2 = null
- else if (href_list["login"])
+ else if(href_list["login"])
- if (istype(usr, /mob/living/silicon/ai))
+ if(istype(usr, /mob/living/silicon/ai))
src.active1 = null
src.active2 = null
src.authenticated = usr.name
src.rank = "AI"
src.screen = 1
- else if (istype(usr, /mob/living/silicon/robot))
+ else if(istype(usr, /mob/living/silicon/robot))
src.active1 = null
src.active2 = null
src.authenticated = usr.name
@@ -180,16 +179,16 @@
src.rank = "[R.modtype] [R.braintype]"
src.screen = 1
- else if (istype(src.scan, /obj/item/weapon/card/id))
+ else if(istype(src.scan, /obj/item/weapon/card/id))
src.active1 = null
src.active2 = null
- if (src.check_access(src.scan))
+ if(src.check_access(src.scan))
src.authenticated = src.scan.registered_name
src.rank = src.scan.assignment
src.screen = 1
- if (src.authenticated)
+ if(src.authenticated)
if(href_list["screen"])
src.screen = text2num(href_list["screen"])
@@ -215,125 +214,125 @@
Severity: [Dis.severity]"}
- if (href_list["del_all"])
+ if(href_list["del_all"])
src.temp = text("Are you sure you wish to delete all records? \n\tYes \n\tNo ", src, src)
- if (href_list["del_all2"])
+ if(href_list["del_all2"])
for(var/datum/data/record/R in data_core.medical)
//R = null
qdel(R)
//Foreach goto(494)
src.temp = "All records deleted."
- if (href_list["field"])
+ if(href_list["field"])
var/a1 = src.active1
var/a2 = src.active2
switch(href_list["field"])
if("fingerprint")
- if (istype(src.active1, /datum/data/record))
+ if(istype(src.active1, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) as text)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
return
src.active1.fields["fingerprint"] = t1
if("sex")
- if (istype(src.active1, /datum/data/record))
- if (src.active1.fields["sex"] == "Male")
+ if(istype(src.active1, /datum/data/record))
+ if(src.active1.fields["sex"] == "Male")
src.active1.fields["sex"] = "Female"
else
src.active1.fields["sex"] = "Male"
if("age")
- if (istype(src.active1, /datum/data/record))
+ if(istype(src.active1, /datum/data/record))
var/t1 = input("Please input age:", "Med. records", src.active1.fields["age"], null) as num
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
return
src.active1.fields["age"] = t1
if("mi_dis")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) as text)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
src.active2.fields["mi_dis"] = t1
if("mi_dis_d")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) as message)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
src.active2.fields["mi_dis_d"] = t1
if("ma_dis")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) as text)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
src.active2.fields["ma_dis"] = t1
if("ma_dis_d")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) as message)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
src.active2.fields["ma_dis_d"] = t1
if("alg")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) as text)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
src.active2.fields["alg"] = t1
if("alg_d")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) as message)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
src.active2.fields["alg_d"] = t1
if("cdi")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) as text)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
src.active2.fields["cdi"] = t1
if("cdi_d")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) as message)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
src.active2.fields["cdi_d"] = t1
if("notes")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
var/t1 = copytext(html_encode(trim(input("Please summarize notes:", "Med. records", html_decode(src.active2.fields["notes"]), null) as message)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
src.active2.fields["notes"] = t1
if("p_stat")
- if (istype(src.active1, /datum/data/record))
+ if(istype(src.active1, /datum/data/record))
src.temp = text("Physical Condition: \n\t*Deceased* \n\t*SSD* \n\tActive \n\tPhysically Unfit \n\tDisabled ", src, src, src, src, src)
if("m_stat")
- if (istype(src.active1, /datum/data/record))
+ if(istype(src.active1, /datum/data/record))
src.temp = text("Mental Condition: \n\t*Insane* \n\t*Unstable* \n\t*Watch* \n\tStable ", src, src, src, src)
if("b_type")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
src.temp = text("Blood Type: \n\tA- A+ \n\tB- B+ \n\tAB- AB+ \n\tO- O+ ", src, src, src, src, src, src, src, src)
if("b_dna")
- if (istype(src.active1, /datum/data/record))
+ if(istype(src.active1, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please input DNA hash:", "Med. records", src.active1.fields["dna"], null) as text)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
return
src.active1.fields["dna"] = t1
if("vir_name")
var/datum/data/record/v = locate(href_list["edit_vir"])
- if (v)
+ if(v)
var/t1 = copytext(trim(sanitize(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
return
v.fields["name"] = t1
if("vir_desc")
var/datum/data/record/v = locate(href_list["edit_vir"])
- if (v)
+ if(v)
var/t1 = copytext(trim(sanitize(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
return
v.fields["description"] = t1
else
- if (href_list["p_stat"])
- if (src.active1)
+ if(href_list["p_stat"])
+ if(src.active1)
switch(href_list["p_stat"])
if("deceased")
src.active1.fields["p_stat"] = "*Deceased*"
@@ -346,8 +345,8 @@
if("disabled")
src.active1.fields["p_stat"] = "Disabled"
- if (href_list["m_stat"])
- if (src.active1)
+ if(href_list["m_stat"])
+ if(src.active1)
switch(href_list["m_stat"])
if("insane")
src.active1.fields["m_stat"] = "*Insane*"
@@ -359,8 +358,8 @@
src.active1.fields["m_stat"] = "Stable"
- if (href_list["b_type"])
- if (src.active2)
+ if(href_list["b_type"])
+ if(src.active2)
switch(href_list["b_type"])
if("an")
src.active2.fields["b_type"] = "A-"
@@ -380,23 +379,23 @@
src.active2.fields["b_type"] = "O+"
- if (href_list["del_r"])
- if (src.active2)
+ if(href_list["del_r"])
+ if(src.active2)
src.temp = text("Are you sure you wish to delete the record (Medical Portion Only)? \n\tYes \n\tNo ", src, src)
- if (href_list["del_r2"])
- if (src.active2)
+ if(href_list["del_r2"])
+ if(src.active2)
//src.active2 = null
qdel(src.active2)
- if (href_list["d_rec"])
+ if(href_list["d_rec"])
var/datum/data/record/R = locate(href_list["d_rec"])
var/datum/data/record/M = locate(href_list["d_rec"])
- if (!( data_core.general.Find(R) ))
+ if(!( data_core.general.Find(R) ))
src.temp = "Record Not Found!"
return
for(var/datum/data/record/E in data_core.medical)
- if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
+ if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
M = E
else
//Foreach continue //goto(2540)
@@ -404,8 +403,8 @@
src.active2 = M
src.screen = 4
- if (href_list["new"])
- if ((istype(src.active1, /datum/data/record) && !( istype(src.active2, /datum/data/record) )))
+ if(href_list["new"])
+ if((istype(src.active1, /datum/data/record) && !( istype(src.active2, /datum/data/record) )))
var/datum/data/record/R = new /datum/data/record( )
R.fields["name"] = src.active1.fields["name"]
R.fields["id"] = src.active1.fields["id"]
@@ -425,56 +424,56 @@
src.active2 = R
src.screen = 4
- if (href_list["add_c"])
- if (!( istype(src.active2, /datum/data/record) ))
+ if(href_list["add_c"])
+ if(!( istype(src.active2, /datum/data/record) ))
return
var/a2 = src.active2
var/t1 = copytext(trim(sanitize(input("Add Comment:", "Med. records", null, null) as message)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
var/counter = 1
while(src.active2.fields[text("com_[]", counter)])
counter++
src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")] [t1]")
- if (href_list["del_c"])
- if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])]))
+ if(href_list["del_c"])
+ if((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])]))
src.active2.fields[text("com_[]", href_list["del_c"])] = "Deleted "
- if (href_list["search"])
+ if(href_list["search"])
var/t1 = input("Search String: (Name, DNA, or ID)", "Med. records", null, null) as text
- if ((!( t1 ) || usr.stat || !( src.authenticated ) || usr.restrained() || ((!in_range(src, usr)) && (!istype(usr, /mob/living/silicon)))))
+ if((!( t1 ) || usr.stat || !( src.authenticated ) || usr.restrained() || ((!in_range(src, usr)) && (!istype(usr, /mob/living/silicon)))))
return
src.active1 = null
src.active2 = null
t1 = lowertext(t1)
for(var/datum/data/record/R in data_core.medical)
- if ((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"])))
+ if((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"])))
src.active2 = R
else
//Foreach continue //goto(3229)
- if (!( src.active2 ))
+ if(!( src.active2 ))
src.temp = text("Could not locate record [].", t1)
else
for(var/datum/data/record/E in data_core.general)
- if ((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"]))
+ if((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"]))
src.active1 = E
else
//Foreach continue //goto(3334)
src.screen = 4
- if (href_list["print_p"])
- if (!( src.printing ))
+ if(href_list["print_p"])
+ if(!( src.printing ))
src.printing = 1
playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
sleep(50)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.loc )
P.info = "Medical Record "
- if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
+ if((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] ", src.active1.fields["name"], src.active1.fields["id"], src.active1.fields["sex"], src.active1.fields["age"], src.active1.fields["fingerprint"], src.active1.fields["p_stat"], src.active1.fields["m_stat"])
else
P.info += "General Record Lost! "
- if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
+ if((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
P.info += text(" \nMedical Data \nBlood Type: [] \nDNA: [] \n \nMinor Disabilities: [] \nDetails: [] \n \nMajor Disabilities: [] \nDetails: [] \n \nAllergies: [] \nDetails: [] \n \nCurrent Diseases: [] (per disease info placed in log/comment section) \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", src.active2.fields["b_type"], src.active2.fields["b_dna"], src.active2.fields["mi_dis"], src.active2.fields["mi_dis_d"], src.active2.fields["ma_dis"], src.active2.fields["ma_dis_d"], src.active2.fields["alg"], src.active2.fields["alg_d"], src.active2.fields["cdi"], src.active2.fields["cdi_d"], src.active2.fields["notes"])
var/counter = 1
while(src.active2.fields[text("com_[]", counter)])
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
index a56fe597b13..50dc9c19603 100644
--- a/code/game/machinery/computer/message.dm
+++ b/code/game/machinery/computer/message.dm
@@ -317,9 +317,9 @@
/obj/machinery/computer/message_monitor/Topic(href, href_list)
if(..(href, href_list))
return 1
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
//Authenticate
- if (href_list["auth"])
+ if(href_list["auth"])
if(auth)
auth = 0
screen = 0
@@ -332,10 +332,10 @@
message = incorrectkey
//Turn the server on/off.
- if (href_list["active"])
+ if(href_list["active"])
if(auth) linkedServer.active = !linkedServer.active
//Find a server
- if (href_list["find"])
+ if(href_list["find"])
if(message_servers && message_servers.len > 1)
src.linkedServer = input(usr,"Please select a server.", "Select a server.", null) as null|anything in message_servers
message = "NOTICE: Server selected. "
@@ -346,7 +346,7 @@
message = noserver
//View the logs - KEY REQUIRED
- if (href_list["view"])
+ if(href_list["view"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
@@ -354,7 +354,7 @@
src.screen = 1
//Clears the logs - KEY REQUIRED
- if (href_list["clear"])
+ if(href_list["clear"])
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
@@ -362,7 +362,7 @@
src.linkedServer.pda_msgs = list()
message = "NOTICE: Logs cleared. "
//Clears the request console logs - KEY REQUIRED
- if (href_list["clearr"])
+ if(href_list["clearr"])
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
@@ -370,7 +370,7 @@
src.linkedServer.rc_msgs = list()
message = "NOTICE: Logs cleared. "
//Change the password - KEY REQUIRED
- if (href_list["pass"])
+ if(href_list["pass"])
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
@@ -390,7 +390,7 @@
message = incorrectkey
//Hack the Console to get the password
- if (href_list["hack"])
+ if(href_list["hack"])
if((istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) && (usr.mind.special_role && usr.mind.original == usr))
src.hacking = 1
src.screen = 2
@@ -400,7 +400,7 @@
if(src && src.linkedServer && usr)
BruteForce(usr)
//Delete the log.
- if (href_list["delete"])
+ if(href_list["delete"])
//Are they on the view logs screen?
if(screen == 1)
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
@@ -409,7 +409,7 @@
src.linkedServer.pda_msgs -= locate(href_list["delete"])
message = "NOTICE: Log Deleted! "
//Delete the request console log.
- if (href_list["deleter"])
+ if(href_list["deleter"])
//Are they on the view logs screen?
if(screen == 4)
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
@@ -418,14 +418,14 @@
src.linkedServer.rc_msgs -= locate(href_list["deleter"])
message = "NOTICE: Log Deleted! "
//Create a custom message
- if (href_list["msg"])
+ if(href_list["msg"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
if(auth)
src.screen = 3
//Fake messaging selection - KEY REQUIRED
- if (href_list["select"])
+ if(href_list["select"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
screen = 0
@@ -484,10 +484,10 @@
return src.attack_hand(usr)
var/obj/item/device/pda/PDARec = null
- for (var/obj/item/device/pda/P in PDAs)
+ for(var/obj/item/device/pda/P in PDAs)
var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger)
- if (!PM || !PM.can_receive())
+ if(!PM || !PM.can_receive())
continue
if(P.owner == customsender)
PDARec = P
@@ -520,15 +520,15 @@
// to_chat(usr, href_list["select"])
- if (href_list["back"])
+ if(href_list["back"])
src.screen = 0
// View chat room list
- if (href_list["chatroom"])
+ if(href_list["chatroom"])
if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else if(auth)
screen = 5
- if (href_list["viewroom"])
+ if(href_list["viewroom"])
if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else if(auth)
diff --git a/code/game/machinery/computer/pod_tracking_console.dm b/code/game/machinery/computer/pod_tracking_console.dm
index 6817d265a0f..cf16c34e04d 100644
--- a/code/game/machinery/computer/pod_tracking_console.dm
+++ b/code/game/machinery/computer/pod_tracking_console.dm
@@ -36,7 +36,7 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "pod_tracking.tmpl", "Pod Tracking Console", 400, 500)
ui.set_initial_data(data)
ui.open()
diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm
index 7ae15a086f2..ebc0db47c32 100644
--- a/code/game/machinery/computer/prisoner.dm
+++ b/code/game/machinery/computer/prisoner.dm
@@ -38,13 +38,12 @@
dat += text("Space Law recommends sentences of 100 points per minute they would normally serve in the brig. ")
else
dat += text("Insert Prisoner ID ")
- dat += " Chemical Implants "
var/turf/Tr = null
+ dat += " Chemical Implants "
for(var/obj/item/weapon/implant/chem/C in tracked_implants)
Tr = get_turf(C)
if((Tr) && (Tr.z != src.z)) continue//Out of range
if(!C.implanted) continue
-
// AUTOFIXED BY fix_string_idiocy.py
// C:\Users\Rob\Documents\Projects\vgstation13\code\game\machinery\computer\prisoner.dm:41: dat += "[C.imp_in.name] | Remaining Units: [C.reagents.total_volume] | Inject: "
dat += {"[C.imp_in.name] | Remaining Units: [C.reagents.total_volume] | Inject:
@@ -58,12 +57,17 @@
Tr = get_turf(T)
if((Tr) && (Tr.z != src.z)) continue//Out of range
if(!T.implanted) continue
- var/loc_display = "Unknown"
var/mob/living/carbon/M = T.imp_in
+ var/loc_display = "Unknown"
+ var/health_display = "OK"
+ var/total_loss = (M.maxHealth - M.health)
+ if(M.stat == DEAD)
+ health_display = "DEAD"
+ else if(total_loss)
+ health_display = "HURT ([total_loss])"
if((M.z in config.station_levels) && !istype(M.loc, /turf/space))
- var/turf/mob_loc = get_turf(M)
- loc_display = mob_loc.loc
- dat += "ID: [T.id] | Location: [loc_display] "
+ loc_display = "[get_area(M)]"
+ dat += "ID: [T.id] Subject: [M] Location: [loc_display] Health: [health_display] "
dat += "(Message Holder ) | "
dat += "******************************** "
dat += "Lock Console "
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index 42875f58019..1f840bb5e08 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -47,7 +47,7 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "robot_control.tmpl", "Robotic Control Console", 400, 500)
ui.set_initial_data(data)
ui.open()
@@ -94,7 +94,7 @@
target.self_destruct()
// Locks or unlocks the cyborg
- else if (href_list["lockdown"])
+ else if(href_list["lockdown"])
var/mob/living/silicon/robot/target = get_cyborg_by_name(href_list["lockdown"])
if(!target || !istype(target))
return
@@ -123,7 +123,7 @@
to_chat(target.connected_ai, "[!target.lockcharge ? "NOTICE - Cyborg lockdown lifted " : "ALERT - Cyborg lockdown detected "]: [target.name] ")
// Remotely hacks the cyborg. Only antag AIs can do this and only to linked cyborgs.
- else if (href_list["hack"])
+ else if(href_list["hack"])
var/mob/living/silicon/robot/target = get_cyborg_by_name(href_list["hack"])
if(!target || !istype(target))
return
@@ -204,7 +204,7 @@
robot["name"] = R.name
if(R.stat)
robot["status"] = "Not Responding"
- else if (!R.canmove)
+ else if(!R.canmove)
robot["status"] = "Lockdown"
else
robot["status"] = "Operational"
@@ -240,7 +240,7 @@
// Parameters: 1 (name - Cyborg we are trying to find)
// Description: Helper proc for finding cyborg by name
/obj/machinery/computer/robotics/proc/get_cyborg_by_name(var/name)
- if (!name)
+ if(!name)
return
for(var/mob/living/silicon/robot/R in mob_list)
if(R.name == name)
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 2a074a9880b..7ab400823b1 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -41,58 +41,55 @@
/obj/machinery/computer/secure_data/attack_hand(mob/user as mob)
if(..())
return
- if (src.z > 6)
- to_chat(user, "\red Unable to establish a connection : \black You're too far away from the station!")
+ if(src.z > 6)
+ to_chat(user, "Unable to establish a connection : You're too far away from the station!")
return
var/dat
+
+ // search javascript
+ var/head_content = {"
+
+
+"}
+
+ if(temp)
dat = text("[] Clear Screen ", temp, src)
else
dat = text("Confirm Identity: [] ", src, (scan ? text("[]", scan.name) : "----------"))
- if (authenticated)
+ if(authenticated)
switch(screen)
if(1.0)
//body tag start + onload and onkeypress (onkeyup) javascript event calls
dat += ""
- //search bar javascript
- dat += {"
-
-
-
-
-
-
-
- "}
+
dat += {"
"}
dat += text("New Record ", src)
@@ -127,22 +124,22 @@
for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order))
var/crimstat = ""
for(var/datum/data/record/E in data_core.security)
- if ((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
+ if((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
crimstat = E.fields["criminal"]
var/background
switch(crimstat)
if("*Arrest*")
- background = "'background-color:#DC143C;'"
+ background = "'background-color:#890E26'"
if("Incarcerated")
- background = "'background-color:#CD853F;'"
+ background = "'background-color:#743B03'"
if("Parolled")
- background = "'background-color:#CD853F;'"
+ background = "'background-color:#743B03'"
if("Released")
- background = "'background-color:#3BB9FF;'"
+ background = "'background-color:#216489'"
if("None")
- background = "'background-color:#00FF7F;'"
+ background = "'background-color:#007f47'"
if("")
- background = "'background-color:#FFFFFF;'"
+ background = "''"
crimstat = "No Record."
dat += "
"
dat += text("[] ", R.fields["name"], R.fields["id"], R.fields["rank"], R.fields["fingerprint"], src, R, R.fields["name"])
@@ -164,11 +161,7 @@
dat += "Delete All Records Back "
if(3.0)
dat += "Security Record "
- if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- var/icon/front = new(active1.fields["photo"], dir = SOUTH)
- var/icon/side = new(active1.fields["photo"], dir = WEST)
- user << browse_rsc(front, "front.png")
- user << browse_rsc(side, "side.png")
+ if((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
dat += {"
"}
else
dat += "General Record Lost! "
- if ((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
+ if((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
dat += text(" \nSecurity Data \nCriminal Status: [] \n \nMinor Crimes: [] \nDetails: [] \n \nMajor Crimes: [] \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", src, active2.fields["criminal"], src, active2.fields["mi_crim"], src, active2.fields["mi_crim_d"], src, active2.fields["ma_crim"], src, active2.fields["ma_crim_d"], src, active2.fields["notes"])
var/counter = 1
while(active2.fields[text("com_[]", counter)])
@@ -203,7 +196,10 @@
else
else
dat += text("{Log In} ", src)
- user << browse(text("Security Records [] ", dat), "window=secure_rec;size=600x400")
+ var/datum/browser/popup = new(user, "secure_rec", name, 600, 400)
+ popup.set_content(dat)
+ popup.add_head_content(head_content)
+ popup.open(0)
onclose(user, "secure_rec")
return
@@ -213,11 +209,11 @@ What a mess.*/
/obj/machinery/computer/secure_data/Topic(href, href_list)
if(..())
return 1
- if (!( data_core.general.Find(active1) ))
+ if(!( data_core.general.Find(active1) ))
active1 = null
- if (!( data_core.security.Find(active2) ))
+ if(!( data_core.security.Find(active2) ))
active2 = null
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
switch(href_list["choice"])
// SORTING!
@@ -236,13 +232,13 @@ What a mess.*/
if("Clear Screen")
temp = null
- if ("Return")
+ if("Return")
screen = 1
active1 = null
active2 = null
if("Confirm Identity")
- if (scan)
+ if(scan)
if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
usr.put_in_hands(scan)
else
@@ -250,7 +246,7 @@ What a mess.*/
scan = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.loc = src
scan = I
@@ -262,20 +258,20 @@ What a mess.*/
active2 = null
if("Log In")
- if (istype(usr, /mob/living/silicon/ai))
+ if(istype(usr, /mob/living/silicon/ai))
src.active1 = null
src.active2 = null
src.authenticated = usr.name
src.rank = "AI"
src.screen = 1
- else if (istype(usr, /mob/living/silicon/robot))
+ else if(istype(usr, /mob/living/silicon/robot))
src.active1 = null
src.active2 = null
src.authenticated = usr.name
var/mob/living/silicon/robot/R = usr
src.rank = R.braintype
src.screen = 1
- else if (istype(scan, /obj/item/weapon/card/id))
+ else if(istype(scan, /obj/item/weapon/card/id))
active1 = null
active2 = null
if(check_access(scan))
@@ -288,49 +284,49 @@ What a mess.*/
active1 = null
active2 = null
- if ("Browse Record")
+ if("Browse Record")
var/datum/data/record/R = locate(href_list["d_rec"])
var/S = locate(href_list["d_rec"])
- if (!( data_core.general.Find(R) ))
+ if(!( data_core.general.Find(R) ))
temp = "Record Not Found!"
else
for(var/datum/data/record/E in data_core.security)
- if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
+ if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
S = E
active1 = R
active2 = S
screen = 3
-/* if ("Search Fingerprints")
+/* if("Search Fingerprints")
var/t1 = input("Search String: (Fingerprint)", "Secure. records", null, null) as text
- if ((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || (!in_range(src, usr)) && (!istype(usr, /mob/living/silicon))))
+ if((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || (!in_range(src, usr)) && (!istype(usr, /mob/living/silicon))))
return
active1 = null
active2 = null
t1 = lowertext(t1)
for(var/datum/data/record/R in data_core.general)
- if (lowertext(R.fields["fingerprint"]) == t1)
+ if(lowertext(R.fields["fingerprint"]) == t1)
active1 = R
- if (!( active1 ))
+ if(!( active1 ))
temp = text("Could not locate record [].", t1)
else
for(var/datum/data/record/E in data_core.security)
- if ((E.fields["name"] == active1.fields["name"] || E.fields["id"] == active1.fields["id"]))
+ if((E.fields["name"] == active1.fields["name"] || E.fields["id"] == active1.fields["id"]))
active2 = E
screen = 3 */
- if ("Print Record")
- if (!( printing ))
+ if("Print Record")
+ if(!( printing ))
printing = 1
playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
sleep(50)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc )
P.info = "Security Record "
- if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
+ if((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] ", active1.fields["name"], active1.fields["id"], active1.fields["sex"], active1.fields["age"], active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"])
else
P.info += "General Record Lost! "
- if ((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
+ if((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
P.info += text(" \nSecurity Data \nCriminal Status: [] \n \nMinor Crimes: [] \nDetails: [] \n \nMajor Crimes: [] \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", active2.fields["criminal"], active2.fields["mi_crim"], active2.fields["mi_crim_d"], active2.fields["ma_crim"], active2.fields["ma_crim_d"], active2.fields["notes"])
var/counter = 1
while(active2.fields[text("com_[]", counter)])
@@ -342,7 +338,7 @@ What a mess.*/
P.name = "paper - 'Security Record'"
printing = null
- if ("Print Photo")
+ if("Print Photo")
if(!printing)
printing = 1
playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
@@ -352,47 +348,47 @@ What a mess.*/
printing = null
//RECORD DELETE
- if ("Delete All Records")
+ if("Delete All Records")
temp = ""
temp += "Are you sure you wish to delete all Security records? "
temp += "Yes "
temp += "No "
- if ("Purge All Records")
+ if("Purge All Records")
for(var/datum/data/record/R in data_core.security)
qdel(R)
temp = "All Security records deleted."
- if ("Add Entry")
- if (!( istype(active2, /datum/data/record) ))
+ if("Add Entry")
+ if(!( istype(active2, /datum/data/record) ))
return
var/a2 = active2
var/t1 = copytext(trim(sanitize(input("Add Comment:", "Secure. records", null, null) as message)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
return
var/counter = 1
while(active2.fields[text("com_[]", counter)])
counter++
active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], 2557 [t1]")
- if ("Delete Record (ALL)")
- if (active1)
+ if("Delete Record (ALL)")
+ if(active1)
temp = "Are you sure you wish to delete the record (ALL)? "
temp += "Yes "
temp += "No "
- if ("Delete Record (Security)")
- if (active2)
+ if("Delete Record (Security)")
+ if(active2)
temp = "Are you sure you wish to delete the record (Security Portion Only)? "
temp += "Yes "
temp += "No "
- if ("Delete Entry")
- if ((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])]))
+ if("Delete Entry")
+ if((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])]))
active2.fields[text("com_[]", href_list["del_c"])] = "Deleted "
//RECORD CREATE
- if ("New Record (Security)")
- if ((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) )))
+ if("New Record (Security)")
+ if((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) )))
var/datum/data/record/R = new /datum/data/record()
R.fields["name"] = active1.fields["name"]
R.fields["id"] = active1.fields["id"]
@@ -407,7 +403,7 @@ What a mess.*/
active2 = R
screen = 3
- if ("New Record (General)")
+ if("New Record (General)")
var/datum/data/record/G = new /datum/data/record()
G.fields["name"] = "New Record"
G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
@@ -424,72 +420,72 @@ What a mess.*/
active2 = null
//FIELD FUNCTIONS
- if ("Edit Field")
+ if("Edit Field")
var/a1 = active1
var/a2 = active2
switch(href_list["field"])
if("name")
- if (istype(active1, /datum/data/record))
+ if(istype(active1, /datum/data/record))
var/t1 = reject_bad_name(input("Please input name:", "Secure. records", active1.fields["name"], null) as text)
- if ((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon)))) || active1 != a1)
+ if((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon)))) || active1 != a1)
return
active1.fields["name"] = t1
if("id")
- if (istype(active2, /datum/data/record))
+ if(istype(active2, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
return
active1.fields["id"] = t1
if("fingerprint")
- if (istype(active1, /datum/data/record))
+ if(istype(active1, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
return
active1.fields["fingerprint"] = t1
if("sex")
- if (istype(active1, /datum/data/record))
- if (active1.fields["sex"] == "Male")
+ if(istype(active1, /datum/data/record))
+ if(active1.fields["sex"] == "Male")
active1.fields["sex"] = "Female"
else
active1.fields["sex"] = "Male"
if("age")
- if (istype(active1, /datum/data/record))
+ if(istype(active1, /datum/data/record))
var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
return
active1.fields["age"] = t1
if("mi_crim")
- if (istype(active2, /datum/data/record))
+ if(istype(active2, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please input minor crimes list:", "Secure. records", active2.fields["mi_crim"], null) as text)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
return
active2.fields["mi_crim"] = t1
if("mi_crim_d")
- if (istype(active2, /datum/data/record))
+ if(istype(active2, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please summarize minor crimes:", "Secure. records", active2.fields["mi_crim_d"], null) as message)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
return
active2.fields["mi_crim_d"] = t1
if("ma_crim")
- if (istype(active2, /datum/data/record))
+ if(istype(active2, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please input major crimes list:", "Secure. records", active2.fields["ma_crim"], null) as text)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
return
active2.fields["ma_crim"] = t1
if("ma_crim_d")
- if (istype(active2, /datum/data/record))
+ if(istype(active2, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please summarize major crimes:", "Secure. records", active2.fields["ma_crim_d"], null) as message)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
return
active2.fields["ma_crim_d"] = t1
if("notes")
- if (istype(active2, /datum/data/record))
+ if(istype(active2, /datum/data/record))
var/t1 = copytext(html_encode(trim(input("Please summarize notes:", "Secure. records", html_decode(active2.fields["notes"]), null) as message)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active2 != a2))
return
active2.fields["notes"] = t1
if("criminal")
- if (istype(active2, /datum/data/record))
+ if(istype(active2, /datum/data/record))
temp = "Criminal Status: "
temp += ""
temp += "None "
@@ -501,7 +497,7 @@ What a mess.*/
if("rank")
var/list/L = list( "Head of Personnel", "Captain", "AI" )
//This was so silly before the change. Now it actually works without beating your head against the keyboard. /N
- if ((istype(active1, /datum/data/record) && L.Find(rank)))
+ if((istype(active1, /datum/data/record) && L.Find(rank)))
temp = "Rank: "
temp += ""
for(var/rank in joblist)
@@ -510,9 +506,9 @@ What a mess.*/
else
alert(usr, "You do not have the required rank to do this!")
if("species")
- if (istype(active1, /datum/data/record))
+ if(istype(active1, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
return
active1.fields["species"] = t1
@@ -520,14 +516,14 @@ What a mess.*/
else//To properly clear as per clear screen.
temp=null
switch(href_list["choice"])
- if ("Change Rank")
- if (active1)
+ if("Change Rank")
+ if(active1)
active1.fields["rank"] = href_list["rank"]
if(href_list["rank"] in joblist)
active1.fields["real_rank"] = href_list["real_rank"]
- if ("Change Criminal Status")
- if (active2)
+ if("Change Criminal Status")
+ if(active2)
switch(href_list["criminal2"])
if("none")
active2.fields["criminal"] = "None"
@@ -543,18 +539,18 @@ What a mess.*/
for(var/mob/living/carbon/human/H in mob_list)
H.sec_hud_set_security_status()
- if ("Delete Record (Security) Execute")
- if (active2)
+ if("Delete Record (Security) Execute")
+ if(active2)
qdel(active2)
- if ("Delete Record (ALL) Execute")
- if (active1)
+ if("Delete Record (ALL) Execute")
+ if(active1)
for(var/datum/data/record/R in data_core.medical)
- if ((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
+ if((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
qdel(R)
else
qdel(active1)
- if (active2)
+ if(active2)
qdel(active2)
else
temp = "This function does not appear to be working at the moment. Our apologies."
diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm
index d2f44de6011..2f039841cc3 100644
--- a/code/game/machinery/computer/skills.dm
+++ b/code/game/machinery/computer/skills.dm
@@ -40,16 +40,16 @@
/obj/machinery/computer/skills/attack_hand(mob/user as mob)
if(..())
return
- if (src.z > 6)
- to_chat(user, "\red Unable to establish a connection : \black You're too far away from the station!")
+ if(src.z > 6)
+ to_chat(user, "Unable to establish a connection : You're too far away from the station!")
return
var/dat
- if (temp)
+ if(temp)
dat = text("[] Clear Screen ", temp, src)
else
dat = text("Confirm Identity: [] ", src, (scan ? text("[]", scan.name) : "----------"))
- if (authenticated)
+ if(authenticated)
switch(screen)
if(1.0)
dat += {"
@@ -86,11 +86,7 @@
dat += "Delete All Records Back "
if(3.0)
dat += "Employment Record "
- if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- var/icon/front = new(active1.fields["photo"], dir = SOUTH)
- var/icon/side = new(active1.fields["photo"], dir = WEST)
- user << browse_rsc(front, "front.png")
- user << browse_rsc(side, "side.png")
+ if((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
dat += text(" \
Name: [active1.fields["name"]] \
ID: [active1.fields["id"]] \n \
@@ -101,8 +97,8 @@
Physical Status: [active1.fields["p_stat"]] \n \
Mental Status: [active1.fields["m_stat"]] \n \
Employment/skills summary: [active1.fields["notes"]] \
- Photo: \
-
")
+ Photo: \
+ ")
else
dat += "General Record Lost! "
dat += text("\nDelete Record (ALL) \nPrint Record \nBack ", src, src, src)
@@ -152,9 +148,9 @@ What a mess.*/
/obj/machinery/computer/skills/Topic(href, href_list)
if(..())
return 1
- if (!( data_core.general.Find(active1) ))
+ if(!( data_core.general.Find(active1) ))
active1 = null
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
switch(href_list["choice"])
// SORTING!
@@ -173,12 +169,12 @@ What a mess.*/
if("Clear Screen")
temp = null
- if ("Return")
+ if("Return")
screen = 1
active1 = null
if("Confirm Identity")
- if (scan)
+ if(scan)
if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
usr.put_in_hands(scan)
else
@@ -186,7 +182,7 @@ What a mess.*/
scan = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.loc = src
scan = I
@@ -197,18 +193,18 @@ What a mess.*/
active1 = null
if("Log In")
- if (istype(usr, /mob/living/silicon/ai))
+ if(istype(usr, /mob/living/silicon/ai))
src.active1 = null
src.authenticated = usr.name
src.rank = "AI"
src.screen = 1
- else if (istype(usr, /mob/living/silicon/robot))
+ else if(istype(usr, /mob/living/silicon/robot))
src.active1 = null
src.authenticated = usr.name
var/mob/living/silicon/robot/R = usr
src.rank = R.braintype
src.screen = 1
- else if (istype(scan, /obj/item/weapon/card/id))
+ else if(istype(scan, /obj/item/weapon/card/id))
active1 = null
if(check_access(scan))
authenticated = scan.registered_name
@@ -217,7 +213,7 @@ What a mess.*/
//RECORD FUNCTIONS
if("Search Records")
var/t1 = input("Search String: (Partial Name or ID or Fingerprints or Rank)", "Secure. records", null, null) as text
- if ((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || !in_range(src, usr)))
+ if((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || !in_range(src, usr)))
return
Perp = new/list()
t1 = lowertext(t1)
@@ -234,7 +230,7 @@ What a mess.*/
for(var/i = 1, i<=Perp.len, i+=2)
for(var/datum/data/record/E in data_core.security)
var/datum/data/record/R = Perp[i]
- if ((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
+ if((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
Perp[i+1] = E
tempname = t1
screen = 4
@@ -243,23 +239,23 @@ What a mess.*/
screen = 2
active1 = null
- if ("Browse Record")
+ if("Browse Record")
var/datum/data/record/R = locate(href_list["d_rec"])
- if (!( data_core.general.Find(R) ))
+ if(!( data_core.general.Find(R) ))
temp = "Record Not Found!"
else
for(var/datum/data/record/E in data_core.security)
active1 = R
screen = 3
- if ("Print Record")
- if (!( printing ))
+ if("Print Record")
+ if(!( printing ))
printing = 1
playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
sleep(50)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc )
P.info = "Employment Record "
- if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
+ if((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] \nEmployment/Skills Summary:[] ", active1.fields["name"], active1.fields["id"], active1.fields["sex"], active1.fields["age"], active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"], active1.fields["notes"])
else
P.info += "General Record Lost! "
@@ -267,26 +263,26 @@ What a mess.*/
P.name = "paper - 'Employment Record'"
printing = null
//RECORD DELETE
- if ("Delete All Records")
+ if("Delete All Records")
temp = ""
temp += "Are you sure you wish to delete all Employment records? "
temp += "Yes "
temp += "No "
- if ("Purge All Records")
+ if("Purge All Records")
if(PDA_Manifest.len)
PDA_Manifest.Cut()
for(var/datum/data/record/R in data_core.security)
qdel(R)
temp = "All Employment records deleted."
- if ("Delete Record (ALL)")
- if (active1)
+ if("Delete Record (ALL)")
+ if(active1)
temp = "Are you sure you wish to delete the record (ALL)? "
temp += "Yes "
temp += "No "
//RECORD CREATE
- if ("New Record (General)")
+ if("New Record (General)")
if(PDA_Manifest.len)
PDA_Manifest.Cut()
@@ -305,43 +301,43 @@ What a mess.*/
active1 = G
//FIELD FUNCTIONS
- if ("Edit Field")
+ if("Edit Field")
var/a1 = active1
switch(href_list["field"])
if("name")
- if (istype(active1, /datum/data/record))
+ if(istype(active1, /datum/data/record))
var/t1 = reject_bad_name(input("Please input name:", "Secure. records", active1.fields["name"], null) as text)
- if ((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon)))) || active1 != a1)
+ if((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon)))) || active1 != a1)
return
active1.fields["name"] = t1
if("id")
- if (istype(active1, /datum/data/record))
+ if(istype(active1, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
return
active1.fields["id"] = t1
if("fingerprint")
- if (istype(active1, /datum/data/record))
+ if(istype(active1, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
return
active1.fields["fingerprint"] = t1
if("sex")
- if (istype(active1, /datum/data/record))
- if (active1.fields["sex"] == "Male")
+ if(istype(active1, /datum/data/record))
+ if(active1.fields["sex"] == "Male")
active1.fields["sex"] = "Female"
else
active1.fields["sex"] = "Male"
if("age")
- if (istype(active1, /datum/data/record))
+ if(istype(active1, /datum/data/record))
var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
return
active1.fields["age"] = t1
if("rank")
var/list/L = list( "Head of Personnel", "Captain", "AI" )
//This was so silly before the change. Now it actually works without beating your head against the keyboard. /N
- if ((istype(active1, /datum/data/record) && L.Find(rank)))
+ if((istype(active1, /datum/data/record) && L.Find(rank)))
temp = "Rank: "
temp += ""
for(var/rank in joblist)
@@ -350,9 +346,9 @@ What a mess.*/
else
alert(usr, "You do not have the required rank to do this!")
if("species")
- if (istype(active1, /datum/data/record))
+ if(istype(active1, /datum/data/record))
var/t1 = copytext(trim(sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message)),1,MAX_MESSAGE_LEN)
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
return
active1.fields["species"] = t1
@@ -360,20 +356,20 @@ What a mess.*/
else//To properly clear as per clear screen.
temp=null
switch(href_list["choice"])
- if ("Change Rank")
- if (active1)
+ if("Change Rank")
+ if(active1)
if(PDA_Manifest.len)
PDA_Manifest.Cut()
active1.fields["rank"] = href_list["rank"]
if(href_list["rank"] in joblist)
active1.fields["real_rank"] = href_list["real_rank"]
- if ("Delete Record (ALL) Execute")
- if (active1)
+ if("Delete Record (ALL) Execute")
+ if(active1)
if(PDA_Manifest.len)
PDA_Manifest.Cut()
for(var/datum/data/record/R in data_core.medical)
- if ((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
+ if((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
qdel(R)
else
qdel(active1)
diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm
index d74e27bc702..a0386fe80c7 100644
--- a/code/game/machinery/computer/specops_shuttle.dm
+++ b/code/game/machinery/computer/specops_shuttle.dm
@@ -134,9 +134,9 @@ var/specops_shuttle_timeleft = 0
specops_shuttle_moving_to_centcom = 0
specops_shuttle_at_station = 1
- if (specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
+ if(specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
- if (!specops_can_move())
+ if(!specops_can_move())
to_chat(usr, "\red The Special Operations shuttle is unable to leave.")
return
@@ -262,7 +262,7 @@ var/specops_shuttle_timeleft = 0
return
//Commented out so admins can do shenanigans at their leisure. Also makes the force-spawned admin ERTs able to use the shuttle.
-// if (sent_strike_team == 0 && send_emergency_team == 0)
+// if(sent_strike_team == 0 && send_emergency_team == 0)
// to_chat(usr, "\red The strike team has not yet deployed.")
// return
@@ -271,7 +271,7 @@ var/specops_shuttle_timeleft = 0
user.machine = src
var/dat
- if (temp)
+ if(temp)
dat = temp
else
dat += {"Special Operations Shuttle
@@ -287,16 +287,16 @@ var/specops_shuttle_timeleft = 0
if(..())
return 1
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.machine = src
- if (href_list["sendtodock"])
+ if(href_list["sendtodock"])
if(!specops_shuttle_at_station|| specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
- if (!specops_can_move())
+ if(!specops_can_move())
to_chat(usr, "\blue Central Command will not allow the Special Operations shuttle to return yet.")
if(world.timeofday <= specops_shuttle_timereset)
- if (((world.timeofday - specops_shuttle_timereset)/10) > 60)
+ if(((world.timeofday - specops_shuttle_timereset)/10) > 60)
to_chat(usr, "\blue [-((world.timeofday - specops_shuttle_timereset)/10)/60] minutes remain!")
to_chat(usr, "\blue [-(world.timeofday - specops_shuttle_timereset)/10] seconds remain!")
return
@@ -311,10 +311,10 @@ var/specops_shuttle_timeleft = 0
spawn(0)
specops_return()
- else if (href_list["sendtostation"])
+ else if(href_list["sendtostation"])
if(specops_shuttle_at_station || specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
- if (!specops_can_move())
+ if(!specops_can_move())
to_chat(usr, "\red The Special Operations shuttle is unable to leave.")
return
@@ -332,7 +332,7 @@ var/specops_shuttle_timeleft = 0
spawn(0)
specops_process()
- else if (href_list["mainmenu"])
+ else if(href_list["mainmenu"])
temp = null
add_fingerprint(usr)
diff --git a/code/game/machinery/computer/store.dm b/code/game/machinery/computer/store.dm
index c8ae8741288..168ceb60e36 100644
--- a/code/game/machinery/computer/store.dm
+++ b/code/game/machinery/computer/store.dm
@@ -132,7 +132,7 @@ td.cost.toomuch {
src.add_fingerprint(usr)
- if (href_list["buy"])
+ if(href_list["buy"])
var/itemID = text2num(href_list["buy"])
var/datum/storeitem/item = centcomm_store.items[itemID]
var/sure = alert(usr,"Are you sure you wish to purchase [item.name] for $[item.cost]?","You sure?","Yes","No") in list("Yes","No")
diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm b/code/game/machinery/computer/syndicate_specops_shuttle.dm
index 16de635b0e7..f05a600b680 100644
--- a/code/game/machinery/computer/syndicate_specops_shuttle.dm
+++ b/code/game/machinery/computer/syndicate_specops_shuttle.dm
@@ -57,9 +57,9 @@ var/syndicate_elite_shuttle_timeleft = 0
syndicate_elite_shuttle_moving_to_mothership = 0
syndicate_elite_shuttle_at_station = 1
- if (syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return
+ if(syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return
- if (!syndicate_elite_can_move())
+ if(!syndicate_elite_can_move())
to_chat(usr, "\red The Syndicate Elite shuttle is unable to leave.")
return
@@ -133,8 +133,8 @@ var/syndicate_elite_shuttle_timeleft = 0
elite_squad.readyreset()//Reset firealarm after the team launched.
//End Marauder launchpad.
- for (var/obj/effect/landmark/L in landmarks_list)
- if (L.name == "Syndicate Breach Area")
+ for(var/obj/effect/landmark/L in landmarks_list)
+ if(L.name == "Syndicate Breach Area")
explosion(L.loc,4,6,8,10,0)
sleep(40)
@@ -196,7 +196,7 @@ var/syndicate_elite_shuttle_timeleft = 0
to_chat(user, "\red Access Denied.")
return
-// if (sent_syndicate_strike_team == 0)
+// if(sent_syndicate_strike_team == 0)
// to_chat(usr, "\red The strike team has not yet deployed.")
// return
@@ -205,7 +205,7 @@ var/syndicate_elite_shuttle_timeleft = 0
user.set_machine(src)
var/dat
- if (temp)
+ if(temp)
dat = temp
else
dat = {"Special Operations Shuttle
@@ -221,19 +221,19 @@ var/syndicate_elite_shuttle_timeleft = 0
if(..())
return 1
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
- if (href_list["sendtodock"])
+ if(href_list["sendtodock"])
if(!syndicate_elite_shuttle_at_station|| syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return
to_chat(usr, "\blue The Syndicate will not allow the Elite Squad shuttle to return.")
return
- else if (href_list["sendtostation"])
+ else if(href_list["sendtostation"])
if(syndicate_elite_shuttle_at_station || syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return
- if (!specops_can_move())
+ if(!specops_can_move())
to_chat(usr, "\red The Syndicate Elite shuttle is unable to leave.")
return
@@ -252,7 +252,7 @@ var/syndicate_elite_shuttle_timeleft = 0
syndicate_elite_process()
- else if (href_list["mainmenu"])
+ else if(href_list["mainmenu"])
temp = null
add_fingerprint(usr)
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index 4c820d26857..2defdbf4623 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -386,6 +386,16 @@ to destroy them and players will be able to make replacements.
/obj/item/stack/cable_coil = 5,
/obj/item/weapon/stock_parts/console_screen = 1)
+/obj/item/weapon/circuitboard/deepfryer
+ name = "circuit board (Deep Fryer)"
+ build_path = /obj/machinery/cooker/deepfryer
+ board_type = "machine"
+ origin_tech = "programming=2"
+ frame_desc = "Requires 2 Micro Lasers and 5 pieces of cable."
+ req_components = list(
+ /obj/item/weapon/stock_parts/micro_laser = 2,
+ /obj/item/stack/cable_coil = 5)
+
/obj/item/weapon/circuitboard/gibber
name = "circuit board (Gibber)"
build_path = /obj/machinery/gibber
@@ -734,16 +744,6 @@ obj/item/weapon/circuitboard/rdserver
/obj/item/stack/cable_coil = 1,
/obj/item/weapon/stock_parts/console_screen = 2)
-/obj/item/weapon/circuitboard/sleep_console
- name = "circuit board (Sleeper Console)"
- build_path = /obj/machinery/sleep_console
- board_type = "machine"
- origin_tech = "programming=3;biotech=2;engineering=3;materials=3"
- frame_desc = "Requires 2 pieces of cable and 2 Console Screens."
- req_components = list(
- /obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/console_screen = 2)
-
/obj/item/weapon/circuitboard/bodyscanner
name = "circuit board (Body Scanner)"
build_path = /obj/machinery/bodyscanner
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 6a1f0721253..d069e2d1ae6 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -63,6 +63,7 @@
efficiency = C
/obj/machinery/atmospherics/unary/cryo_cell/initialize()
+ ..()
if(node) return
for(var/cdir in cardinal)
node = findConnecting(cdir)
@@ -185,7 +186,7 @@
data["hasOccupant"] = occupant ? 1 : 0
var/occupantData[0]
- if (occupant)
+ if(occupant)
occupantData["name"] = occupant.name
occupantData["stat"] = occupant.stat
occupantData["health"] = occupant.health
@@ -217,7 +218,7 @@
data["beakerVolume"] = 0
if(beaker)
data["beakerLabel"] = beaker.label_text ? beaker.label_text : null
- if (beaker.reagents && beaker.reagents.reagent_list.len)
+ if(beaker.reagents && beaker.reagents.reagent_list.len)
for(var/datum/reagent/R in beaker.reagents.reagent_list)
data["beakerVolume"] += R.volume
@@ -225,7 +226,7 @@
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "cryo.tmpl", "Cryo Cell Control System", 520, 420)
@@ -283,7 +284,7 @@
user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!")
- if (istype(G, /obj/item/weapon/screwdriver))
+ if(istype(G, /obj/item/weapon/screwdriver))
if(occupant || on)
to_chat(user, "The maintenance panel is locked. ")
return
@@ -411,31 +412,34 @@
air_update_turf()
/obj/machinery/atmospherics/unary/cryo_cell/proc/go_out()
- if(!( occupant ))
+ if(!occupant)
return
- if (occupant.client)
+ if(occupant.client)
occupant.client.eye = occupant.client.mob
occupant.client.perspective = MOB_PERSPECTIVE
occupant.forceMove(get_step(loc, SOUTH)) //this doesn't account for walls or anything, but i don't forsee that being a problem.
- if (occupant.bodytemperature < 261 && occupant.bodytemperature >= 70) //Patch by Aranclanos to stop people from taking burn damage after being ejected
+ if(occupant.bodytemperature < 261 && occupant.bodytemperature >= 70) //Patch by Aranclanos to stop people from taking burn damage after being ejected
occupant.bodytemperature = 261
occupant = null
update_icon()
- return
+ // eject trash the occupant dropped
+ for(var/atom/movable/A in contents - component_parts - list(beaker))
+ A.forceMove(get_step(loc, SOUTH))
+
/obj/machinery/atmospherics/unary/cryo_cell/proc/put_mob(mob/living/carbon/M as mob)
- if (!istype(M))
+ if(!istype(M))
to_chat(usr, "\red The cryo cell cannot handle such a lifeform! ")
return
- if (occupant)
+ if(occupant)
to_chat(usr, "\red The cryo cell is already occupied! ")
return
- if (M.abiotic())
+ if(M.abiotic())
to_chat(usr, "\red Subject may not have abiotic items on.")
return
if(!node)
to_chat(usr, "\red The cell is not correctly connected to its pipe network!")
return
- if (M.client)
+ if(M.client)
M.client.perspective = EYE_PERSPECTIVE
M.client.eye = src
M.stop_pulling()
@@ -454,7 +458,7 @@
set category = "Object"
set src in oview(1)
if(usr == occupant)//If the user is inside the tube...
- if (usr.stat == 2)//and he's not dead....
+ if(usr.stat == 2)//and he's not dead....
return
to_chat(usr, "\blue Release sequence activated. This will take two minutes.")
sleep(600)
@@ -462,7 +466,7 @@
return
go_out()//and release him from the eternal prison.
else
- if (usr.stat != 0)
+ if(usr.stat != 0)
return
go_out()
add_fingerprint(usr)
@@ -476,7 +480,7 @@
if(M.Victim == usr)
to_chat(usr, "You're too busy getting your life sucked out of you.")
return
- if (usr.stat != 0 || stat & (NOPOWER|BROKEN))
+ if(usr.stat != 0 || stat & (NOPOWER|BROKEN))
return
if(usr.restrained() || usr.stat || usr.weakened || usr.stunned || usr.paralysis || usr.resting) //are you cuffed, dying, lying, stunned or other
return
@@ -492,4 +496,4 @@
return
/datum/data/function/proc/display()
- return
\ No newline at end of file
+ return
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index f7de2dd6b5f..257c583814b 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -40,7 +40,7 @@
var/dat
- if (!( ticker ))
+ if(!( ticker ))
return
dat += "[storage_name] "
@@ -319,7 +319,7 @@
else if(O.target && istype(O.target,/datum/mind))
if(O.target == occupant.mind)
if(O.owner && O.owner.current)
- to_chat(O.owner.current, "You get the feeling your target is no longer within your reach. Time for Plan [pick(list("A","B","C","D","X","Y","Z"))]... ")
+ to_chat(O.owner.current, "You get the feeling your target is no longer within reach. Time for Plan [pick("A","B","C","D","X","Y","Z")]. Objectives updated! ")
O.target = null
spawn(1) //This should ideally fire after the occupant is deleted.
if(!O) return
@@ -344,16 +344,18 @@
// Delete them from datacore.
+ var/announce_rank = null
if(PDA_Manifest.len)
PDA_Manifest.Cut()
for(var/datum/data/record/R in data_core.medical)
- if ((R.fields["name"] == occupant.real_name))
+ if((R.fields["name"] == occupant.real_name))
qdel(R)
for(var/datum/data/record/T in data_core.security)
- if ((T.fields["name"] == occupant.real_name))
+ if((T.fields["name"] == occupant.real_name))
qdel(T)
for(var/datum/data/record/G in data_core.general)
- if ((G.fields["name"] == occupant.real_name))
+ if((G.fields["name"] == occupant.real_name))
+ announce_rank = G.fields["rank"]
qdel(G)
if(orient_right)
@@ -365,14 +367,19 @@
control_computer.frozen_crew += "[occupant.real_name]"
var/ailist[] = list()
- for (var/mob/living/silicon/ai/A in living_mob_list)
+ for(var/mob/living/silicon/ai/A in living_mob_list)
ailist += A
- if (ailist.len)
+ if(ailist.len)
var/mob/living/silicon/ai/announcer = pick(ailist)
- announcer.say(";[occupant.real_name] [on_store_message]")
+ if (announce_rank)
+ announcer.say(";[occupant.real_name] ([announce_rank]) [on_store_message]")
+ else
+ announcer.say(";[occupant.real_name] [on_store_message]")
else
- announce.autosay("[occupant.real_name] [on_store_message]", "[on_store_name]")
-
+ if (announce_rank)
+ announce.autosay("[occupant.real_name] ([announce_rank]) [on_store_message]", "[on_store_name]")
+ else
+ announce.autosay("[occupant.real_name] [on_store_message]", "[on_store_name]")
visible_message("\The [src] hums and hisses as it moves [occupant.real_name] into storage. ")
// Delete the mob.
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index df7d3319c06..507527fd6da 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -63,8 +63,8 @@ for reference:
var/stacktype = /obj/item/stack/sheet/metal
/obj/structure/barricade/attackby(obj/item/W as obj, mob/user as mob, params)
- if (istype(W, stacktype))
- if (src.health < src.maxhealth)
+ if(istype(W, stacktype))
+ if(src.health < src.maxhealth)
visible_message("\red [user] begins to repair the [src]!")
if(do_after(user,20, target = src))
src.health = src.maxhealth
@@ -74,7 +74,7 @@ for reference:
else
return
return
- else if (istype(W, /obj/item/weapon/crowbar))
+ else if(istype(W, /obj/item/weapon/crowbar))
user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("[user] is prying apart \the [src]. ", "You begin to pry apart \the [src]. ")
playsound(src, 'sound/items/Crowbar.ogg', 200, 1)
@@ -90,7 +90,7 @@ for reference:
if("brute")
src.health -= W.force * 0.75
else
- if (src.health <= 0)
+ if(src.health <= 0)
visible_message("\The [src] is smashed apart! ")
dismantle()
..()
@@ -103,14 +103,14 @@ for reference:
return
if(2.0)
src.health -= 25
- if (src.health <= 0)
+ if(src.health <= 0)
visible_message("\The [src] is blown apart! ")
dismantle()
return
/obj/structure/barricade/blob_act()
src.health -= 25
- if (src.health <= 0)
+ if(src.health <= 0)
visible_message("\red The blob eats through \the [src]! ")
qdel(src)
return
@@ -173,16 +173,16 @@ for reference:
src.icon_state = "barrier[src.locked]"
attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/card/id))
- if (src.allowed(user))
- if (src.emagged < 2.0)
+ if(istype(W, /obj/item/weapon/card/id))
+ if(src.allowed(user))
+ if(src.emagged < 2.0)
src.locked = !src.locked
src.anchored = !src.anchored
src.icon_state = "barrier[src.locked]"
- if ((src.locked == 1.0) && (src.emagged < 2.0))
+ if((src.locked == 1.0) && (src.emagged < 2.0))
to_chat(user, "Barrier lock toggled on.")
return
- else if ((src.locked == 0.0) && (src.emagged < 2.0))
+ else if((src.locked == 0.0) && (src.emagged < 2.0))
to_chat(user, "Barrier lock toggled off.")
return
else
@@ -192,14 +192,14 @@ for reference:
visible_message("\red BZZzZZzZZzZT")
return
return
- else if (istype(W, /obj/item/weapon/wrench))
- if (src.health < src.maxhealth)
+ else if(istype(W, /obj/item/weapon/wrench))
+ if(src.health < src.maxhealth)
src.health = src.maxhealth
src.emagged = 0
src.req_access = list(access_security)
visible_message("\red [user] repairs the [src]!")
return
- else if (src.emagged > 0)
+ else if(src.emagged > 0)
src.emagged = 0
src.req_access = list(access_security)
visible_message("\red [user] repairs the [src]!")
@@ -212,12 +212,12 @@ for reference:
if("brute")
src.health -= W.force * 0.5
else
- if (src.health <= 0)
+ if(src.health <= 0)
src.explode()
..()
emag_act(user as mob)
- if (!emagged)
+ if(!emagged)
emagged = 1
req_access = null
to_chat(user, "You break the ID authentication lock on the [src].")
@@ -225,7 +225,7 @@ for reference:
s.set_up(2, 1, src)
s.start()
visible_message("\red BZZzZZzZZzZT")
- else if (src.emagged == 1)
+ else if(src.emagged == 1)
src.emagged = 2
to_chat(user, "You short out the anchoring mechanism on the [src].")
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
@@ -240,7 +240,7 @@ for reference:
return
if(2.0)
src.health -= 25
- if (src.health <= 0)
+ if(src.health <= 0)
src.explode()
return
emp_act(severity)
@@ -253,7 +253,7 @@ for reference:
blob_act()
src.health -= 25
- if (src.health <= 0)
+ if(src.health <= 0)
src.explode()
return
diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm
index 8c419216d07..a0f6c9a08ce 100644
--- a/code/game/machinery/door_control.dm
+++ b/code/game/machinery/door_control.dm
@@ -39,7 +39,7 @@
/obj/machinery/door_control/attackby(obj/item/weapon/W, mob/user as mob, params)
/* For later implementation
- if (istype(W, /obj/item/weapon/screwdriver))
+ if(istype(W, /obj/item/weapon/screwdriver))
{
if(wiresexposed)
icon_state = "doorctrl0"
@@ -81,7 +81,7 @@
for(var/obj/machinery/door/airlock/D in range(range))
if(D.id_tag == src.id)
if(specialfunctions & OPEN)
- if (D.density)
+ if(D.density)
spawn(0)
D.open()
return
@@ -110,8 +110,8 @@
else
for(var/obj/machinery/door/poddoor/M in world)
- if (M.id_tag == src.id)
- if (M.density)
+ if(M.id_tag == src.id)
+ if(M.density)
spawn( 0 )
M.open()
return
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 8fd840fd0e3..641d847e36b 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -258,14 +258,14 @@
/obj/machinery/door/airlock/clown
name = "Bananium Airlock"
icon = 'icons/obj/doors/Doorbananium.dmi'
- mineral = "clown"
+ mineral = "bananium"
doorOpen = 'sound/items/bikehorn.ogg'
doorClose = 'sound/items/bikehorn.ogg'
/obj/machinery/door/airlock/mime
name = "Tranquillite Airlock"
icon = 'icons/obj/doors/Doorfreezer.dmi'
- mineral = "mime"
+ mineral = "tranquillite"
doorOpen = null
doorClose = null
@@ -391,7 +391,7 @@ About the new airlock wires panel:
return ((src.aiControlDisabled==1) && (!hackProof) && (!src.isAllPowerLoss()));
/obj/machinery/door/airlock/proc/arePowerSystemsOn()
- if (stat & (NOPOWER|BROKEN))
+ if(stat & (NOPOWER|BROKEN))
return 0
return (src.main_power_lost_until==0 || src.backup_power_lost_until==0)
@@ -572,7 +572,7 @@ About the new airlock wires panel:
data["commands"] = commands
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "door_control.tmpl", "Door Controls - [src]", 600, 375)
ui.set_initial_data(data)
ui.open()
@@ -623,14 +623,14 @@ About the new airlock wires panel:
sleep(10)
//bring up airlock dialog
src.aiHacking = 0
- if (user)
+ if(user)
src.attack_ai(user)
/obj/machinery/door/airlock/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if (src.isElectrified())
- if (istype(mover, /obj/item))
+ if(src.isElectrified())
+ if(istype(mover, /obj/item))
var/obj/item/i = mover
- if (i.materials[MAT_METAL])
+ if(i.materials[MAT_METAL])
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
@@ -674,7 +674,7 @@ About the new airlock wires panel:
if(src.canAIHack(user))
src.hack(user)
else
- if (src.isAllPowerLoss()) //don't really like how this gets checked a second time, but not sure how else to do it.
+ if(src.isAllPowerLoss()) //don't really like how this gets checked a second time, but not sure how else to do it.
to_chat(user, "Unable to interface: Connection timed out. ")
else
to_chat(user, "Unable to interface: Connection refused. ")
@@ -687,7 +687,7 @@ About the new airlock wires panel:
return 1
var/activate = text2num(href_list["activate"])
- switch (href_list["command"])
+ switch(href_list["command"])
if("idscan")
if(src.isWireCut(AIRLOCK_WIRE_IDSCAN))
to_chat(usr, "The IdScan wire has been cut - IdScan feature permanently disabled.")
@@ -743,33 +743,33 @@ About the new airlock wires panel:
close()
if("safeties")
// Safeties! We don't need no stinking safeties!
- if (src.isWireCut(AIRLOCK_WIRE_SAFETY))
+ if(src.isWireCut(AIRLOCK_WIRE_SAFETY))
to_chat(usr, text("The safety wire is cut - Cannot secure the door."))
- else if (activate && src.safe)
+ else if(activate && src.safe)
safe = 0
- else if (!activate && !src.safe)
+ else if(!activate && !src.safe)
safe = 1
if("timing")
// Door speed control
if(src.isWireCut(AIRLOCK_WIRE_SPEED))
to_chat(usr, text("The timing wire is cut - Cannot alter timing."))
- else if (activate && src.normalspeed)
+ else if(activate && src.normalspeed)
normalspeed = 0
- else if (!activate && !src.normalspeed)
+ else if(!activate && !src.normalspeed)
normalspeed = 1
if("lights")
// Bolt lights
if(src.isWireCut(AIRLOCK_WIRE_LIGHT))
to_chat(usr, "The bolt lights wire has been cut - The door bolt lights are permanently disabled.")
- else if (!activate && src.lights)
+ else if(!activate && src.lights)
lights = 0
to_chat(usr, "The door bolt lights have been disabled.")
- else if (activate && !src.lights)
+ else if(activate && !src.lights)
lights = 1
to_chat(usr, "The door bolt lights have been enabled.")
if("emergency")
// Emergency access
- if (src.emergency)
+ if(src.emergency)
emergency = 0
to_chat(usr, "Emergency access has been disabled.")
else
@@ -844,7 +844,7 @@ About the new airlock wires panel:
src.check_access()
if(src.req_access.len)
ae.conf_access = src.req_access
- else if (src.req_one_access.len)
+ else if(src.req_one_access.len)
ae.conf_access = src.req_one_access
ae.one_access = 1
else
@@ -936,7 +936,7 @@ About the new airlock wires panel:
operating = 1
do_animate("closing")
src.layer = 3.1
- if (!override) sleep(5)
+ if(!override) sleep(5)
src.density = 1
if(!safe)
crush()
@@ -957,7 +957,7 @@ About the new airlock wires panel:
if(locked)
return 0
- if (operating && !forced) return 0
+ if(operating && !forced) return 0
src.locked = 1
playsound(src, boltDown, 30, 0, 3)
@@ -968,7 +968,7 @@ About the new airlock wires panel:
if(!src.locked)
return
- if (!forced)
+ if(!forced)
if(operating || !src.arePowerSystemsOn() || isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) return
src.locked = 0
@@ -981,7 +981,7 @@ About the new airlock wires panel:
wires = new(src)
if(src.closeOtherId != null)
spawn (5)
- for (var/obj/machinery/door/airlock/A in world)
+ for(var/obj/machinery/door/airlock/A in world)
if(A.closeOtherId == src.closeOtherId && A != src)
src.closeOther = A
break
@@ -998,7 +998,7 @@ About the new airlock wires panel:
if(istype(C, /obj/item/device/detective_scanner) || istype(C, /obj/item/taperoll))
return
- if(istype(C, /obj/item/weapon/c4))
+ if(istype(C, /obj/item/weapon/grenade/plastic/c4))
to_chat(user, "The hatch is coated with a product that prevents the shaped charge from sticking!")
return
diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm
index 5f55eb26fc2..9c4d881f378 100644
--- a/code/game/machinery/doors/airlock_control.dm
+++ b/code/game/machinery/doors/airlock_control.dm
@@ -16,7 +16,7 @@ obj/machinery/door/airlock/process()
return PROCESS_KILL
obj/machinery/door/airlock/receive_signal(datum/signal/signal)
- if (!arePowerSystemsOn()) return //no power
+ if(!arePowerSystemsOn()) return //no power
if(!signal || signal.encryption) return
@@ -30,7 +30,7 @@ obj/machinery/door/airlock/proc/execute_current_command()
if(operating)
return //emagged or busy doing something else
- if (!cur_command)
+ if(!cur_command)
return
do_command(cur_command)
@@ -103,7 +103,7 @@ obj/machinery/door/airlock/proc/send_status(var/bumped = 0)
signal.data["door_status"] = density?("closed"):("open")
signal.data["lock_status"] = locked?("locked"):("unlocked")
- if (bumped)
+ if(bumped)
signal.data["bumped_with_access"] = 1
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
@@ -135,6 +135,7 @@ obj/machinery/door/airlock/proc/set_frequency(new_frequency)
obj/machinery/door/airlock/initialize()
+ ..()
if(frequency)
set_frequency(frequency)
@@ -213,6 +214,7 @@ obj/machinery/airlock_sensor/proc/set_frequency(new_frequency)
radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK)
obj/machinery/airlock_sensor/initialize()
+ ..()
set_frequency(frequency)
obj/machinery/airlock_sensor/New()
@@ -252,7 +254,7 @@ obj/machinery/access_button/update_icon()
obj/machinery/access_button/attackby(obj/item/I as obj, mob/user as mob, params)
//Swiping ID on the access button
- if (istype(I, /obj/item/weapon/card/id) || istype(I, /obj/item/device/pda))
+ if(istype(I, /obj/item/weapon/card/id) || istype(I, /obj/item/device/pda))
attack_hand(user)
return
..()
@@ -279,6 +281,7 @@ obj/machinery/access_button/proc/set_frequency(new_frequency)
obj/machinery/access_button/initialize()
+ ..()
set_frequency(frequency)
@@ -294,4 +297,4 @@ obj/machinery/access_button/airlock_interior
obj/machinery/access_button/airlock_exterior
frequency = 1379
- command = "cycle_exterior"
\ No newline at end of file
+ command = "cycle_exterior"
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index 6113d1cf377..aca002f58c4 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -4,7 +4,7 @@
name = "airlock electronics"
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
- w_class = 2.0 //It should be tiny! -Agouri
+ w_class = 2 //It should be tiny! -Agouri
materials = list(MAT_METAL=50, MAT_GLASS=50)
req_access = list(access_engine)
@@ -15,7 +15,7 @@
var/locked = 1
attack_self(mob/user as mob)
- if (!ishuman(user) && !istype(user,/mob/living/silicon/robot))
+ if(!ishuman(user) && !istype(user,/mob/living/silicon/robot))
return ..(user)
var/mob/living/carbon/human/H = user
@@ -25,10 +25,10 @@
var/t1 = text("Access control \n")
- if (last_configurator)
+ if(last_configurator)
t1 += "Operator: [last_configurator] "
- if (locked)
+ if(locked)
t1 += "Swipe ID "
else
t1 += "Block "
@@ -41,10 +41,10 @@
t1 += " "
var/list/accesses = get_all_accesses()
- for (var/acc in accesses)
+ for(var/acc in accesses)
var/aname = get_access_desc(acc)
- if (!conf_access || !conf_access.len || !(acc in conf_access))
+ if(!conf_access || !conf_access.len || !(acc in conf_access))
t1 += "[aname] "
else if(one_access)
t1 += "[aname] "
@@ -53,58 +53,60 @@
t1 += text("Close
\n", src)
- user << browse(t1, "window=airlock_electronics")
+ var/datum/browser/popup = new(user, "airlock_electronics", name, 400, 400)
+ popup.set_content(t1)
+ popup.open(0)
onclose(user, "airlock")
Topic(href, href_list)
..()
- if (usr.stat || usr.restrained() || (!ishuman(usr) && !istype(usr,/mob/living/silicon)))
+ if(usr.stat || usr.restrained() || (!ishuman(usr) && !istype(usr,/mob/living/silicon)))
return
- if (href_list["close"])
+ if(href_list["close"])
usr << browse(null, "window=airlock")
return
- if (href_list["login"])
+ if(href_list["login"])
if(istype(usr,/mob/living/silicon))
src.locked = 0
src.last_configurator = usr.name
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/device/pda))
+ if(istype(I, /obj/item/device/pda))
var/obj/item/device/pda/pda = I
I = pda.id
- if (I && src.check_access(I))
+ if(I && src.check_access(I))
src.locked = 0
src.last_configurator = I:registered_name
- if (locked)
+ if(locked)
return
- if (href_list["logout"])
+ if(href_list["logout"])
locked = 1
- if (href_list["one_access"])
+ if(href_list["one_access"])
one_access = !one_access
- if (href_list["access"])
+ if(href_list["access"])
toggle_access(href_list["access"])
attack_self(usr)
proc
toggle_access(var/acc)
- if (acc == "all")
+ if(acc == "all")
conf_access = null
else
var/req = text2num(acc)
- if (conf_access == null)
+ if(conf_access == null)
conf_access = list()
- if (!(req in conf_access))
+ if(!(req in conf_access))
conf_access += req
else
conf_access -= req
- if (!conf_access.len)
+ if(!conf_access.len)
conf_access = null
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index 3e611b8dea4..b0be899942d 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -31,19 +31,19 @@
maptext_height = 26
maptext_width = 32
-/obj/machinery/door_timer/New()
+/obj/machinery/door_timer/initialize()
..()
Radio = new /obj/item/device/radio(src)
Radio.listening = 0
Radio.config(list("Security" = 0))
- pixel_x = ((src.dir & 3)? (0) : (src.dir == 4 ? 32 : -32))
- pixel_y = ((src.dir & 3)? (src.dir ==1 ? 24 : -32) : (0))
+ pixel_x = ((dir & 3)? (0) : (dir == 4 ? 32 : -32))
+ pixel_y = ((dir & 3)? (dir ==1 ? 24 : -32) : (0))
spawn(20)
for(var/obj/machinery/door/window/brigdoor/M in airlocks)
- if (M.id == id)
+ if(M.id == id)
targets += M
for(var/obj/machinery/flasher/F in machines)
@@ -53,7 +53,7 @@
for(var/obj/structure/closet/secure_closet/brig/C in world)
if(C.id == id)
targets += C
-
+
for(var/obj/machinery/treadmill_monitor/T in machines)
if(T.id == id)
targets += T
@@ -61,15 +61,14 @@
if(targets.len==0)
stat |= BROKEN
update_icon()
- return
- return
//Main door timer loop, if it's timing and time is >0 reduce time by 1.
// if it's less than 0, open door, reset timer
// update the door_timer window and the icon
/obj/machinery/door_timer/process()
- if(stat & (NOPOWER|BROKEN)) return
+ if(stat & (NOPOWER|BROKEN))
+ return
if(timing)
if(timeleft() <= 0)
Radio.autosay("Timer has expired. Releasing prisoner.", name, "Security", list(z))
@@ -77,8 +76,8 @@
timing = 0
. = PROCESS_KILL
- src.updateUsrDialog()
- src.update_icon()
+ updateUsrDialog()
+ update_icon()
else
timer_end()
return PROCESS_KILL
@@ -87,7 +86,6 @@
/obj/machinery/door_timer/power_change()
..()
update_icon()
- return
// open/closedoor checks if door_timer has power, if so it checks if the
@@ -95,7 +93,8 @@
// Closes and locks doors, power check
/obj/machinery/door_timer/proc/timer_start()
- if(stat & (NOPOWER|BROKEN)) return 0
+ if(stat & (NOPOWER|BROKEN))
+ return 0
// Set releasetime
releasetime = world.timeofday + timetoset
@@ -103,16 +102,19 @@
addAtProcessing()
for(var/obj/machinery/door/window/brigdoor/door in targets)
- if(door.density) continue
+ if(door.density)
+ continue
spawn(0)
door.close()
for(var/obj/structure/closet/secure_closet/brig/C in targets)
- if(C.broken) continue
- if(C.opened && !C.close()) continue
+ if(C.broken)
+ continue
+ if(C.opened && !C.close())
+ continue
C.locked = 1
C.icon_state = C.icon_locked
-
+
for(var/obj/machinery/treadmill_monitor/T in targets)
T.total_joules = 0
T.on = 1
@@ -122,19 +124,23 @@
// Opens and unlocks doors, power check
/obj/machinery/door_timer/proc/timer_end()
- if(stat & (NOPOWER|BROKEN)) return 0
+ if(stat & (NOPOWER|BROKEN))
+ return 0
// Reset releasetime
releasetime = 0
for(var/obj/machinery/door/window/brigdoor/door in targets)
- if(!door.density) continue
+ if(!door.density)
+ continue
spawn(0)
door.open()
for(var/obj/structure/closet/secure_closet/brig/C in targets)
- if(C.broken) continue
- if(C.opened) continue
+ if(C.broken)
+ continue
+ if(C.opened)
+ continue
C.locked = 0
C.icon_state = C.icon_closed
@@ -156,7 +162,7 @@
return time / 10
// Set timetoset
-/obj/machinery/door_timer/proc/timeset(var/seconds)
+/obj/machinery/door_timer/proc/timeset(seconds)
timetoset = seconds * 10
if(timetoset <= 0)
@@ -165,15 +171,15 @@
return
//Allows AIs to use door_timer, see human attack_hand function below
-/obj/machinery/door_timer/attack_ai(var/mob/user as mob)
- return src.attack_hand(user)
+/obj/machinery/door_timer/attack_ai(mob/user)
+ return attack_hand(user)
//Allows humans to use door_timer
//Opens dialog window when someone clicks on door timer
// Allows altering timer and the timing boolean.
// Flasher activation limited to 150 seconds
-/obj/machinery/door_timer/attack_hand(var/mob/user as mob)
+/obj/machinery/door_timer/attack_hand(mob/user)
if(..())
return
@@ -188,13 +194,11 @@
user.set_machine(src)
// dat
- var/dat = ""
-
- dat += " Timer System:"
- dat += " Door [src.id] controls "
+ var/dat = " Timer System:"
+ dat += " Door [id] controls "
// Start/Stop timer
- if (src.timing)
+ if(timing)
dat += "Stop Timer and open door "
else
dat += "Activate Timer and close door "
@@ -204,7 +208,7 @@
dat += " "
// Set Timer display (uses timetoset)
- if(src.timing)
+ if(timing)
dat += "Set Timer: [(setminute ? text("[setminute]:") : null)][setsecond] Set "
else
dat += "Set Timer: [(setminute ? text("[setminute]:") : null)][setsecond] "
@@ -220,11 +224,10 @@
dat += "Activate Flash "
dat += "Close "
- dat += " "
- user << browse(dat, "window=computer;size=400x500")
- onclose(user, "computer")
- return
+ var/datum/browser/popup = new(user, "door_timer", name, 400, 500)
+ popup.set_content(dat)
+ popup.open()
//Function for using door_timer dialog input, checks if user has permission
@@ -237,18 +240,18 @@
/obj/machinery/door_timer/Topic(href, href_list)
if(..())
return
- if(!src.allowed(usr))
+ if(!allowed(usr))
return
usr.set_machine(src)
if(href_list["timing"])
- src.timing = text2num(href_list["timing"])
+ timing = text2num(href_list["timing"])
- if(src.timing)
- src.timer_start()
+ if(timing)
+ timer_start()
else
- src.timer_end()
+ timer_end()
else
if(href_list["tp"]) //adjust timer, close door if not already closed
@@ -264,19 +267,11 @@
F.flash()
if(href_list["change"])
- src.timer_start()
+ timer_start()
- src.add_fingerprint(usr)
- src.updateUsrDialog()
- src.update_icon()
-
- /* if(src.timing)
- src.timer_start()
-
- else
- src.timer_end() */
-
- return
+ add_fingerprint(usr)
+ updateUsrDialog()
+ update_icon()
//icon update function
@@ -290,7 +285,7 @@
if(stat & (BROKEN))
set_picture("ai_bsod")
return
- if(src.timing)
+ if(timing)
var/disp1 = id
var/timeleft = timeleft()
var/disp2 = "[add_zero(num2text((timeleft / 60) % 60),2)]~[add_zero(num2text(timeleft % 60), 2)]"
@@ -299,11 +294,10 @@
update_display(disp1, disp2)
else
if(maptext) maptext = ""
- return
// Adds an icon in case the screen is broken/off, stolen from status_display.dm
-/obj/machinery/door_timer/proc/set_picture(var/state)
+/obj/machinery/door_timer/proc/set_picture(state)
picture_state = state
overlays.Cut()
overlays += image('icons/obj/status_display.dmi', icon_state=picture_state)
@@ -311,7 +305,7 @@
//Checks to see if there's 1 line or 2, adds text-icons-numbers/letters over display
// Stolen from status_display
-/obj/machinery/door_timer/proc/update_display(var/line1, var/line2)
+/obj/machinery/door_timer/proc/update_display(line1, line2)
var/new_text = {"[line1] [line2]
"}
if(maptext != new_text)
maptext = new_text
@@ -319,7 +313,7 @@
//Actual string input to icon display for loop, with 5 pixel x offsets for each letter.
//Stolen from status_display
-/obj/machinery/door_timer/proc/texticon(var/tn, var/px = 0, var/py = 0)
+/obj/machinery/door_timer/proc/texticon(tn, px = 0, py = 0)
var/image/I = image('icons/obj/status_display.dmi', "blank")
var/len = lentext(tn)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index fd5f1b19219..6c9537667fb 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -45,11 +45,13 @@
bound_width = world.icon_size
bound_height = width * world.icon_size
- air_update_turf(1)
update_freelook_sight()
airlocks += src
return
+/obj/machinery/door/initialize()
+ air_update_turf(1)
+ ..()
/obj/machinery/door/Destroy()
density = 0
diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm
index 1b3f13955d0..de3c4514bb5 100644
--- a/code/game/machinery/doors/poddoor.dm
+++ b/code/game/machinery/doors/poddoor.dm
@@ -44,9 +44,9 @@
/obj/machinery/door/poddoor/attackby(obj/item/weapon/C as obj, mob/user as mob, params)
src.add_fingerprint(user)
- if (!( istype(C, /obj/item/weapon/crowbar) || (istype(C, /obj/item/weapon/twohanded/fireaxe) && C:wielded == 1) ))
+ if(!( istype(C, /obj/item/weapon/crowbar) || (istype(C, /obj/item/weapon/twohanded/fireaxe) && C:wielded == 1) ))
return
- if ((src.density && (stat & NOPOWER) && !( src.operating )))
+ if((src.density && (stat & NOPOWER) && !( src.operating )))
spawn( 0 )
src.operating = 1
flick("pdoorc0", src)
@@ -59,9 +59,9 @@
return
/obj/machinery/door/poddoor/open()
- if (src.operating == 1) //doors can still open when emag-disabled
+ if(src.operating == 1) //doors can still open when emag-disabled
return
- if (!ticker)
+ if(!ticker)
return 0
if(!src.operating) //in case of emag
src.operating = 1
@@ -82,7 +82,7 @@
return 1
/obj/machinery/door/poddoor/close()
- if (src.operating)
+ if(src.operating)
return
src.operating = 1
flick("pdoorc1", src)
diff --git a/code/game/machinery/doors/spacepod.dm b/code/game/machinery/doors/spacepod.dm
index 244642021ad..021509a13ed 100644
--- a/code/game/machinery/doors/spacepod.dm
+++ b/code/game/machinery/doors/spacepod.dm
@@ -7,7 +7,7 @@
density = 0
anchored = 1
-/obj/structure/spacepoddoor/New()
+/obj/structure/spacepoddoor/initialize()
..()
air_update_turf(1)
@@ -21,4 +21,4 @@
/obj/structure/spacepoddoor/CanPass(atom/movable/A, turf/T)
if(istype(A, /obj/spacepod))
return ..()
- else return 0
\ No newline at end of file
+ else return 0
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 39ed81b3360..cbad06fab9c 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -13,7 +13,7 @@
/obj/machinery/door/window/New()
..()
- if (src.req_access && src.req_access.len)
+ if(src.req_access && src.req_access.len)
src.icon_state = "[src.icon_state]"
src.base_state = src.icon_state
@@ -42,7 +42,7 @@
/obj/machinery/door/window/Bumped(atom/movable/AM as mob|obj)
if(operating || !density)
return
- if (!ismob(AM))
+ if(!ismob(AM))
if(istype(AM, /obj/mecha))
var/obj/mecha/mecha = AM
if(mecha.occupant && src.allowed(mecha.occupant))
@@ -50,7 +50,7 @@
else
flick(text("[]deny", src.base_state), src)
return
- if (!ticker)
+ if(!ticker)
return
var/mob/M = AM
if(!M.restrained() && !M.small)
@@ -97,9 +97,9 @@
return 1
/obj/machinery/door/window/open(var/forced=0)
- if (src.operating == 1) //doors can still open when emag-disabled
+ if(src.operating == 1) //doors can still open when emag-disabled
return 0
- if (!ticker)
+ if(!ticker)
return 0
if(!forced)
if(stat & NOPOWER)
@@ -124,7 +124,7 @@
return 1
/obj/machinery/door/window/close(var/forced=0)
- if (src.operating)
+ if(src.operating)
return 0
if(!forced)
if(stat & NOPOWER)
@@ -149,7 +149,7 @@
/obj/machinery/door/window/proc/take_damage(var/damage)
src.health = max(0, src.health - damage)
- if (src.health <= 0)
+ if(src.health <= 0)
var/debris = list(
new /obj/item/weapon/shard(src.loc),
new /obj/item/weapon/shard(src.loc),
@@ -248,13 +248,13 @@
/obj/machinery/door/window/attackby(obj/item/weapon/I as obj, mob/living/user as mob, params)
//If it's in the process of opening/closing, ignore the click
- if (src.operating)
+ if(src.operating)
return
add_fingerprint(user)
//Ninja swords? You may pass.
- if (src.density && (istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade)))
+ if(src.density && (istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade)))
emag_act(user,I)
return 1
@@ -307,7 +307,7 @@
src.check_access()
if(src.req_access.len)
ae.conf_access = src.req_access
- else if (src.req_one_access.len)
+ else if(src.req_one_access.len)
ae.conf_access = src.req_one_access
ae.one_access = 1
else
@@ -341,17 +341,17 @@
take_damage(aforce)
return
- if (!src.requiresID())
+ if(!src.requiresID())
//don't care who they are or what they have, act as if they're NOTHING
user = null
- if (src.allowed(user))
- if (src.density)
+ if(src.allowed(user))
+ if(src.density)
open()
else
close()
- else if (src.density)
+ else if(src.density)
flick(text("[]deny", src.base_state), src)
return
diff --git a/code/game/machinery/dye_generator.dm b/code/game/machinery/dye_generator.dm
index c73996abd29..151478ddee6 100644
--- a/code/game/machinery/dye_generator.dm
+++ b/code/game/machinery/dye_generator.dm
@@ -9,6 +9,7 @@
var/dye_color = "#FFFFFF"
/obj/machinery/dye_generator/initialize()
+ ..()
power_change()
/obj/machinery/dye_generator/power_change()
@@ -32,7 +33,7 @@
qdel(src)
return
if(2.0)
- if (prob(50))
+ if(prob(50))
qdel(src)
return
if(3.0)
@@ -73,7 +74,7 @@
throw_speed = 4
throw_range = 7
force = 0
- w_class = 1.0
+ w_class = 1
var/dye_color = "#FFFFFF"
/obj/item/hair_dye_bottle/New()
@@ -127,4 +128,4 @@
var/b_skin = hex2num(copytext(dye_color, 6, 8))
if(H.change_skin_color(r_skin, g_skin, b_skin))
H.update_dna()
- user.visible_message("[user] finishes dying [M]'s [what_to_dye]! ", "You finish dying [M]'s [what_to_dye]! ")
\ No newline at end of file
+ user.visible_message("[user] finishes dying [M]'s [what_to_dye]! ", "You finish dying [M]'s [what_to_dye]! ")
diff --git a/code/game/machinery/embedded_controller/airlock_controllers.dm b/code/game/machinery/embedded_controller/airlock_controllers.dm
index bf6fe4f0fe7..2b336859127 100644
--- a/code/game/machinery/embedded_controller/airlock_controllers.dm
+++ b/code/game/machinery/embedded_controller/airlock_controllers.dm
@@ -34,7 +34,7 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "advanced_airlock_console.tmpl", name, 470, 290)
ui.set_initial_data(data)
@@ -90,7 +90,7 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "simple_airlock_console.tmpl", name, 470, 290)
ui.set_initial_data(data)
@@ -154,7 +154,7 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "door_access_console.tmpl", name, 330, 220)
ui.set_initial_data(data)
diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller.dm b/code/game/machinery/embedded_controller/airlock_docking_controller.dm
index 0ffb9c3d7dc..e94a975b91f 100644
--- a/code/game/machinery/embedded_controller/airlock_docking_controller.dm
+++ b/code/game/machinery/embedded_controller/airlock_docking_controller.dm
@@ -26,7 +26,7 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "docking_airlock_console.tmpl", name, 470, 290)
ui.set_initial_data(data)
ui.open()
@@ -71,8 +71,8 @@
airlock_program.master_prog = src
/datum/computer/file/embedded_program/docking/airlock/receive_user_command(command)
- if (command == "toggle_override")
- if (override_enabled)
+ if(command == "toggle_override")
+ if(override_enabled)
disable_override()
else
enable_override()
@@ -120,7 +120,7 @@
var/datum/computer/file/embedded_program/docking/airlock/master_prog
/datum/computer/file/embedded_program/airlock/docking/receive_user_command(command)
- if (master_prog.undocked() || master_prog.override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled
+ if(master_prog.undocked() || master_prog.override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled
..(command)
/datum/computer/file/embedded_program/airlock/docking/proc/enable_mech_regulators()
@@ -134,7 +134,7 @@
toggleDoor(memory["exterior_status"], tag_exterior_door, memory["secure"], "open")
/datum/computer/file/embedded_program/airlock/docking/cycleDoors(var/target)
- if (master_prog.undocked() || master_prog.override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled
+ if(master_prog.undocked() || master_prog.override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled
..(target)
/*** DEBUG VERBS ***
diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm b/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm
index f7ca5b1339a..8eeb93b8a8e 100644
--- a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm
+++ b/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm
@@ -17,8 +17,8 @@
var/list/names = splittext(child_names_txt, ";")
var/list/tags = splittext(child_tags_txt, ";")
- if (names.len == tags.len)
- for (var/i = 1; i <= tags.len; i++)
+ if(names.len == tags.len)
+ for(var/i = 1; i <= tags.len; i++)
child_names[tags[i]] = names[i]
@@ -27,7 +27,7 @@
var/list/airlocks[child_names.len]
var/i = 1
- for (var/child_tag in child_names)
+ for(var/child_tag in child_names)
airlocks[i++] = list("name"=child_names[child_tag], "override_enabled"=(docking_program.children_override[child_tag] == "enabled"))
data = list(
@@ -37,7 +37,7 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "multi_docking_console.tmpl", name, 470, 290)
ui.set_initial_data(data)
ui.open()
@@ -75,7 +75,7 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "docking_airlock_console.tmpl", name, 470, 290)
ui.set_initial_data(data)
ui.open()
diff --git a/code/game/machinery/embedded_controller/airlock_program.dm b/code/game/machinery/embedded_controller/airlock_program.dm
index 8cb3abb9980..670cce47785 100644
--- a/code/game/machinery/embedded_controller/airlock_program.dm
+++ b/code/game/machinery/embedded_controller/airlock_program.dm
@@ -36,7 +36,7 @@
memory["purge"] = 0
memory["secure"] = 0
- if (istype(M, /obj/machinery/embedded_controller/radio/airlock)) //if our controller is an airlock controller than we can auto-init our tags
+ if(istype(M, /obj/machinery/embedded_controller/radio/airlock)) //if our controller is an airlock controller than we can auto-init our tags
var/obj/machinery/embedded_controller/radio/airlock/controller = M
tag_exterior_door = controller.tag_exterior_door? controller.tag_exterior_door : "[id_tag]_outer"
tag_interior_door = controller.tag_interior_door? controller.tag_interior_door : "[id_tag]_inner"
@@ -177,13 +177,13 @@
if(memory["pump_status"] != "off") //send a signal to stop pumping
signalPump(tag_airpump, 0)
- if ((state == STATE_PRESSURIZE || state == STATE_DEPRESSURIZE) && !check_doors_secured())
+ if((state == STATE_PRESSURIZE || state == STATE_DEPRESSURIZE) && !check_doors_secured())
//the airlock will not allow itself to continue to cycle when any of the doors are forced open.
stop_cycling()
switch(state)
if(STATE_PREPARE)
- if (check_doors_secured())
+ if(check_doors_secured())
var/chamber_pressure = memory["chamber_sensor_pressure"]
var/target_pressure = memory["target_pressure"]
diff --git a/code/game/machinery/embedded_controller/docking_program.dm b/code/game/machinery/embedded_controller/docking_program.dm
index aa938c663bc..725ec6a337b 100644
--- a/code/game/machinery/embedded_controller/docking_program.dm
+++ b/code/game/machinery/embedded_controller/docking_program.dm
@@ -77,109 +77,109 @@
var/command = signal.data["command"]
var/recipient = signal.data["recipient"] //the intended recipient of the docking signal
- if (recipient != id_tag)
+ if(recipient != id_tag)
return //this signal is not for us
- switch (command)
- if ("confirm_dock")
- if (control_mode == MODE_CLIENT && dock_state == STATE_UNDOCKED && receive_tag == tag_target)
+ switch(command)
+ if("confirm_dock")
+ if(control_mode == MODE_CLIENT && dock_state == STATE_UNDOCKED && receive_tag == tag_target)
dock_state = STATE_DOCKING
broadcast_docking_status()
- if (!override_enabled)
+ if(!override_enabled)
prepare_for_docking()
- else if (control_mode == MODE_CLIENT && dock_state == STATE_DOCKING && receive_tag == tag_target)
+ else if(control_mode == MODE_CLIENT && dock_state == STATE_DOCKING && receive_tag == tag_target)
dock_state = STATE_DOCKED
broadcast_docking_status()
- if (!override_enabled)
+ if(!override_enabled)
finish_docking() //client done docking!
response_sent = 0
- else if (control_mode == MODE_SERVER && dock_state == STATE_DOCKING && receive_tag == tag_target) //client just sent us the confirmation back, we're done with the docking process
+ else if(control_mode == MODE_SERVER && dock_state == STATE_DOCKING && receive_tag == tag_target) //client just sent us the confirmation back, we're done with the docking process
received_confirm = 1
- if ("request_dock")
- if (control_mode == MODE_NONE && dock_state == STATE_UNDOCKED)
+ if("request_dock")
+ if(control_mode == MODE_NONE && dock_state == STATE_UNDOCKED)
control_mode = MODE_SERVER
dock_state = STATE_DOCKING
broadcast_docking_status()
tag_target = receive_tag
- if (!override_enabled)
+ if(!override_enabled)
prepare_for_docking()
send_docking_command(tag_target, "confirm_dock") //acknowledge the request
- if ("confirm_undock")
- if (control_mode == MODE_CLIENT && dock_state == STATE_UNDOCKING && receive_tag == tag_target)
- if (!override_enabled)
+ if("confirm_undock")
+ if(control_mode == MODE_CLIENT && dock_state == STATE_UNDOCKING && receive_tag == tag_target)
+ if(!override_enabled)
finish_undocking()
reset() //client is done undocking!
- else if (control_mode == MODE_SERVER && dock_state == STATE_UNDOCKING && receive_tag == tag_target)
+ else if(control_mode == MODE_SERVER && dock_state == STATE_UNDOCKING && receive_tag == tag_target)
received_confirm = 1
- if ("request_undock")
- if (control_mode == MODE_SERVER && dock_state == STATE_DOCKED && receive_tag == tag_target)
+ if("request_undock")
+ if(control_mode == MODE_SERVER && dock_state == STATE_DOCKED && receive_tag == tag_target)
dock_state = STATE_UNDOCKING
broadcast_docking_status()
- if (!override_enabled)
+ if(!override_enabled)
prepare_for_undocking()
- if ("dock_error")
- if (receive_tag == tag_target)
+ if("dock_error")
+ if(receive_tag == tag_target)
reset()
/datum/computer/file/embedded_program/docking/process()
switch(dock_state)
- if (STATE_DOCKING) //waiting for our docking port to be ready for docking
- if (ready_for_docking())
- if (control_mode == MODE_CLIENT)
- if (!response_sent)
+ if(STATE_DOCKING) //waiting for our docking port to be ready for docking
+ if(ready_for_docking())
+ if(control_mode == MODE_CLIENT)
+ if(!response_sent)
send_docking_command(tag_target, "confirm_dock") //tell the server we're ready
response_sent = 1
- else if (control_mode == MODE_SERVER && received_confirm)
+ else if(control_mode == MODE_SERVER && received_confirm)
send_docking_command(tag_target, "confirm_dock") //tell the client we are done docking.
dock_state = STATE_DOCKED
broadcast_docking_status()
- if (!override_enabled)
+ if(!override_enabled)
finish_docking() //server done docking!
response_sent = 0
received_confirm = 0
- if (STATE_UNDOCKING)
- if (ready_for_undocking())
- if (control_mode == MODE_CLIENT)
- if (!response_sent)
+ if(STATE_UNDOCKING)
+ if(ready_for_undocking())
+ if(control_mode == MODE_CLIENT)
+ if(!response_sent)
send_docking_command(tag_target, "confirm_undock") //tell the server we are OK to undock.
response_sent = 1
- else if (control_mode == MODE_SERVER && received_confirm)
+ else if(control_mode == MODE_SERVER && received_confirm)
send_docking_command(tag_target, "confirm_undock") //tell the client we are done undocking.
- if (!override_enabled)
+ if(!override_enabled)
finish_undocking()
reset() //server is done undocking!
- if (response_sent || resend_counter > 0)
+ if(response_sent || resend_counter > 0)
resend_counter++
- if (resend_counter >= MESSAGE_RESEND_TIME || (dock_state != STATE_DOCKING && dock_state != STATE_UNDOCKING))
+ if(resend_counter >= MESSAGE_RESEND_TIME || (dock_state != STATE_DOCKING && dock_state != STATE_UNDOCKING))
response_sent = 0
resend_counter = 0
//handle invalid states
- if (control_mode == MODE_NONE && dock_state != STATE_UNDOCKED)
- if (tag_target)
+ if(control_mode == MODE_NONE && dock_state != STATE_UNDOCKED)
+ if(tag_target)
send_docking_command(tag_target, "dock_error")
reset()
- if (control_mode == MODE_SERVER && dock_state == STATE_UNDOCKED)
+ if(control_mode == MODE_SERVER && dock_state == STATE_UNDOCKED)
control_mode = MODE_NONE
/datum/computer/file/embedded_program/docking/proc/initiate_docking(var/target)
- if (dock_state != STATE_UNDOCKED || control_mode == MODE_SERVER) //must be undocked and not serving another request to begin a new docking handshake
+ if(dock_state != STATE_UNDOCKED || control_mode == MODE_SERVER) //must be undocked and not serving another request to begin a new docking handshake
return
tag_target = target
@@ -188,13 +188,13 @@
send_docking_command(tag_target, "request_dock")
/datum/computer/file/embedded_program/docking/proc/initiate_undocking()
- if (dock_state != STATE_DOCKED || control_mode != MODE_CLIENT) //must be docked and must be client to start undocking
+ if(dock_state != STATE_DOCKED || control_mode != MODE_CLIENT) //must be docked and must be client to start undocking
return
dock_state = STATE_UNDOCKING
broadcast_docking_status()
- if (!override_enabled)
+ if(!override_enabled)
prepare_for_undocking()
send_docking_command(tag_target, "request_undock")
@@ -240,7 +240,7 @@
/datum/computer/file/embedded_program/docking/proc/force_undock()
// to_chat(world, "[id_tag]: forcing undock")
- if (tag_target)
+ if(tag_target)
send_docking_command(tag_target, "dock_error")
reset()
@@ -269,11 +269,11 @@
//this is mostly for NanoUI
/datum/computer/file/embedded_program/docking/proc/get_docking_status()
- switch (dock_state)
- if (STATE_UNDOCKED) return "undocked"
- if (STATE_DOCKING) return "docking"
- if (STATE_UNDOCKING) return "undocking"
- if (STATE_DOCKED) return "docked"
+ switch(dock_state)
+ if(STATE_UNDOCKED) return "undocked"
+ if(STATE_DOCKING) return "docking"
+ if(STATE_UNDOCKING) return "undocking"
+ if(STATE_DOCKED) return "docked"
#undef STATE_UNDOCKED
diff --git a/code/game/machinery/embedded_controller/docking_program_multi.dm b/code/game/machinery/embedded_controller/docking_program_multi.dm
index dc582b915f9..0a3d9228435 100644
--- a/code/game/machinery/embedded_controller/docking_program_multi.dm
+++ b/code/game/machinery/embedded_controller/docking_program_multi.dm
@@ -14,19 +14,19 @@
/datum/computer/file/embedded_program/docking/multi/New(var/obj/machinery/embedded_controller/M)
..(M)
- if (istype(M,/obj/machinery/embedded_controller/radio/docking_port_multi)) //if our parent controller is the right type, then we can auto-init stuff at construction
+ if(istype(M,/obj/machinery/embedded_controller/radio/docking_port_multi)) //if our parent controller is the right type, then we can auto-init stuff at construction
var/obj/machinery/embedded_controller/radio/docking_port_multi/controller = M
//parse child_tags_txt and create child tags
children_tags = splittext(controller.child_tags_txt, ";")
children_ready = list()
children_override = list()
- for (var/child_tag in children_tags)
+ for(var/child_tag in children_tags)
children_ready[child_tag] = 0
children_override[child_tag] = "disabled"
/datum/computer/file/embedded_program/docking/multi/proc/clear_children_ready_status()
- for (var/child_tag in children_tags)
+ for(var/child_tag in children_tags)
children_ready[child_tag] = 0
/datum/computer/file/embedded_program/docking/multi/receive_signal(datum/signal/signal, receive_method, receive_param)
@@ -34,21 +34,21 @@
var/command = signal.data["command"]
var/recipient = signal.data["recipient"] //the intended recipient of the docking signal
- if (receive_tag in children_tags)
+ if(receive_tag in children_tags)
//track children status
- if (signal.data["override_status"])
+ if(signal.data["override_status"])
children_override[receive_tag] = signal.data["override_status"]
- if (recipient == id_tag)
- switch (command)
- if ("ready_for_docking")
+ if(recipient == id_tag)
+ switch(command)
+ if("ready_for_docking")
children_ready[receive_tag] = 1
- if ("ready_for_undocking")
+ if("ready_for_undocking")
children_ready[receive_tag] = 1
- if ("status_override_enabled")
+ if("status_override_enabled")
children_override[receive_tag] = 1
- if ("status_override_disabled")
+ if("status_override_disabled")
children_override[receive_tag] = 0
..(signal, receive_method, receive_param)
@@ -58,19 +58,19 @@
clear_children_ready_status()
//tell children to prepare for docking
- for (var/child_tag in children_tags)
+ for(var/child_tag in children_tags)
send_docking_command(child_tag, "prepare_for_docking")
/datum/computer/file/embedded_program/docking/multi/ready_for_docking()
//check children ready status
- for (var/child_tag in children_tags)
- if (!children_ready[child_tag])
+ for(var/child_tag in children_tags)
+ if(!children_ready[child_tag])
return 0
return 1
/datum/computer/file/embedded_program/docking/multi/finish_docking()
//tell children to finish docking
- for (var/child_tag in children_tags)
+ for(var/child_tag in children_tags)
send_docking_command(child_tag, "finish_docking")
//clear ready flags
@@ -81,19 +81,19 @@
clear_children_ready_status()
//tell children to prepare for undocking
- for (var/child_tag in children_tags)
+ for(var/child_tag in children_tags)
send_docking_command(child_tag, "prepare_for_undocking")
/datum/computer/file/embedded_program/docking/multi/ready_for_undocking()
//check children ready status
- for (var/child_tag in children_tags)
- if (!children_ready[child_tag])
+ for(var/child_tag in children_tags)
+ if(!children_ready[child_tag])
return 0
return 1
/datum/computer/file/embedded_program/docking/multi/finish_undocking()
//tell children to finish undocking
- for (var/child_tag in children_tags)
+ for(var/child_tag in children_tags)
send_docking_command(child_tag, "finish_undocking")
//clear ready flags
@@ -118,13 +118,13 @@
/datum/computer/file/embedded_program/airlock/multi_docking/New(var/obj/machinery/embedded_controller/M)
..(M)
- if (istype(M, /obj/machinery/embedded_controller/radio/airlock/docking_port_multi)) //if our parent controller is the right type, then we can auto-init stuff at construction
+ if(istype(M, /obj/machinery/embedded_controller/radio/airlock/docking_port_multi)) //if our parent controller is the right type, then we can auto-init stuff at construction
var/obj/machinery/embedded_controller/radio/airlock/docking_port_multi/controller = M
src.master_tag = controller.master_tag
/datum/computer/file/embedded_program/airlock/multi_docking/receive_user_command(command)
- if (command == "toggle_override")
- if (override_enabled)
+ if(command == "toggle_override")
+ if(override_enabled)
override_enabled = 0
broadcast_override_status()
else
@@ -132,7 +132,7 @@
broadcast_override_status()
return
- if (!docking_enabled|| override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled
+ if(!docking_enabled|| override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled
..(command)
/datum/computer/file/embedded_program/airlock/multi_docking/receive_signal(datum/signal/signal, receive_method, receive_param)
@@ -142,54 +142,54 @@
var/command = signal.data["command"]
var/recipient = signal.data["recipient"] //the intended recipient of the docking signal
- if (receive_tag != master_tag)
+ if(receive_tag != master_tag)
return //only respond to master
//track master's status
- if (signal.data["dock_status"])
+ if(signal.data["dock_status"])
master_status = signal.data["dock_status"]
- if (recipient != id_tag)
+ if(recipient != id_tag)
return //this signal is not for us
- switch (command)
- if ("prepare_for_docking")
+ switch(command)
+ if("prepare_for_docking")
docking_enabled = 1
docking_mode = 0
response_sent = 0
- if (!override_enabled)
+ if(!override_enabled)
begin_cycle_in()
- if ("prepare_for_undocking")
+ if("prepare_for_undocking")
docking_mode = 1
response_sent = 0
- if (!override_enabled)
+ if(!override_enabled)
stop_cycling()
close_doors()
disable_mech_regulation()
- if ("finish_docking")
- if (!override_enabled)
+ if("finish_docking")
+ if(!override_enabled)
enable_mech_regulation()
open_doors()
- if ("finish_undocking")
+ if("finish_undocking")
docking_enabled = 0
/datum/computer/file/embedded_program/airlock/multi_docking/process()
..()
- if (docking_enabled && !response_sent)
+ if(docking_enabled && !response_sent)
- switch (docking_mode)
- if (0) //docking
- if (ready_for_docking())
+ switch(docking_mode)
+ if(0) //docking
+ if(ready_for_docking())
send_signal_to_master("ready_for_docking")
response_sent = 1
- if (1) //undocking
- if (ready_for_undocking())
+ if(1) //undocking
+ if(ready_for_undocking())
send_signal_to_master("ready_for_undocking")
response_sent = 1
@@ -206,7 +206,7 @@
toggleDoor(memory["exterior_status"], tag_exterior_door, memory["secure"], "open")
/datum/computer/file/embedded_program/airlock/multi_docking/cycleDoors(var/target)
- if (!docking_enabled|| override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled
+ if(!docking_enabled|| override_enabled) //only allow the port to be used as an airlock if nothing is docked here or the override is enabled
..(target)
/datum/computer/file/embedded_program/airlock/multi_docking/proc/send_signal_to_master(var/command)
diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm
index 06a5266d17e..a4a656fa5d6 100644
--- a/code/game/machinery/embedded_controller/embedded_controller_base.dm
+++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm
@@ -27,8 +27,8 @@
src.updateDialog()
/obj/machinery/embedded_controller/attack_ghost(mob/user as mob)
- src.ui_interact(user)
-
+ src.ui_interact(user)
+
/obj/machinery/embedded_controller/attack_ai(mob/user as mob)
src.ui_interact(user)
@@ -55,6 +55,7 @@
unacidable = 1
/obj/machinery/embedded_controller/radio/initialize()
+ ..()
set_frequency(frequency)
/obj/machinery/embedded_controller/radio/update_icon()
@@ -77,4 +78,4 @@
/obj/machinery/embedded_controller/radio/proc/set_frequency(new_frequency)
radio_controller.remove_object(src, frequency)
frequency = new_frequency
- radio_connection = radio_controller.add_object(src, frequency, radio_filter)
\ No newline at end of file
+ radio_connection = radio_controller.add_object(src, frequency, radio_filter)
diff --git a/code/game/machinery/embedded_controller/embedded_program_base.dm b/code/game/machinery/embedded_controller/embedded_program_base.dm
index 06507d9d5f9..1fe527df13b 100644
--- a/code/game/machinery/embedded_controller/embedded_program_base.dm
+++ b/code/game/machinery/embedded_controller/embedded_program_base.dm
@@ -7,7 +7,7 @@
/datum/computer/file/embedded_program/New(var/obj/machinery/embedded_controller/M)
master = M
- if (istype(M, /obj/machinery/embedded_controller/radio))
+ if(istype(M, /obj/machinery/embedded_controller/radio))
var/obj/machinery/embedded_controller/radio/R = M
id_tag = R.id_tag
diff --git a/code/game/machinery/embedded_controller/simple_docking_controller.dm b/code/game/machinery/embedded_controller/simple_docking_controller.dm
index 1883d363987..996a56b92ac 100644
--- a/code/game/machinery/embedded_controller/simple_docking_controller.dm
+++ b/code/game/machinery/embedded_controller/simple_docking_controller.dm
@@ -21,7 +21,7 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "simple_docking_console.tmpl", name, 470, 290)
ui.set_initial_data(data)
ui.open()
@@ -55,7 +55,7 @@
..(M)
memory["door_status"] = list(state = "closed", lock = "locked") //assume closed and locked in case the doors dont report in
- if (istype(M, /obj/machinery/embedded_controller/radio/simple_docking_controller))
+ if(istype(M, /obj/machinery/embedded_controller/radio/simple_docking_controller))
var/obj/machinery/embedded_controller/radio/simple_docking_controller/controller = M
tag_door = controller.tag_door? controller.tag_door : "[id_tag]_hatch"
@@ -78,13 +78,13 @@
/datum/computer/file/embedded_program/docking/simple/receive_user_command(command)
switch(command)
if("force_door")
- if (override_enabled)
+ if(override_enabled)
if(memory["door_status"]["state"] == "open")
close_door()
else
open_door()
if("toggle_override")
- if (override_enabled)
+ if(override_enabled)
disable_override()
else
enable_override()
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 3426023f13c..45b515734f7 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -110,7 +110,9 @@ FIRE ALARM
else if(istype(W, /obj/item/weapon/crowbar))
to_chat(user, "You pry out the circuit! ")
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
- spawn(20)
+ if(do_after(user, 20, target = src))
+ if(buildstage != 1)
+ return
var/obj/item/weapon/firealarm_electronics/circuit = new /obj/item/weapon/firealarm_electronics()
circuit.loc = user.loc
buildstage = 0
@@ -174,14 +176,14 @@ FIRE ALARM
var/area/A = src.loc
var/d1
var/d2
- if (ishuman(user) || issilicon(user) || isobserver(user))
+ if(ishuman(user) || issilicon(user) || isobserver(user))
A = A.loc
- if (A.fire)
+ if(A.fire)
d1 = text("Reset - Lockdown ", src)
else
d1 = text("Alarm - Lockdown ", src)
- if (src.timing)
+ if(src.timing)
d2 = text("Stop Time Lock ", src)
else
d2 = text("Initiate Time Lock ", src)
@@ -192,11 +194,11 @@ FIRE ALARM
onclose(user, "firealarm")
else
A = A.loc
- if (A.fire)
+ if(A.fire)
d1 = text("[] ", src, stars("Reset - Lockdown"))
else
d1 = text("[] ", src, stars("Alarm - Lockdown"))
- if (src.timing)
+ if(src.timing)
d2 = text("[] ", src, stars("Stop Time Lock"))
else
d2 = text("[] ", src, stars("Initiate Time Lock"))
@@ -258,7 +260,7 @@ FIRE ALARM
time = min(max(round(src.time), 0), 120)
/obj/machinery/firealarm/proc/reset()
- if (!( src.working ))
+ if(!( src.working ))
return
var/area/A = get_area(src)
A.fire_reset()
@@ -267,7 +269,7 @@ FIRE ALARM
return
/obj/machinery/firealarm/proc/alarm(var/duration = 0)
- if (!( src.working))
+ if(!( src.working))
return
var/area/A = get_area(src)
for(var/obj/machinery/firealarm/FA in A)
@@ -308,7 +310,7 @@ Just a object used in constructing fire alarms
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
desc = "A circuit. It has a label on it, it says \"Can handle heat levels up to 40 degrees celsius!\""
- w_class = 2.0
+ w_class = 2
materials = list(MAT_METAL=50, MAT_GLASS=50)
/obj/machinery/partyalarm
@@ -330,7 +332,7 @@ Just a object used in constructing fire alarms
/obj/machinery/partyalarm/New()
var/area/A = get_area_master(src)
- if (!( istype(A, /area) ))
+ if(!( istype(A, /area) ))
return
master_area=A
@@ -343,13 +345,13 @@ Just a object used in constructing fire alarms
ASSERT(isarea(A))
var/d1
var/d2
- if (istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai))
+ if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai))
- if (A.party)
+ if(A.party)
d1 = text("No Party :( ", src)
else
d1 = text("PARTY!!! ", src)
- if (timing)
+ if(timing)
d2 = text("Stop Time Lock ", src)
else
d2 = text("Initiate Time Lock ", src)
@@ -359,11 +361,11 @@ Just a object used in constructing fire alarms
user << browse(dat, "window=partyalarm")
onclose(user, "partyalarm")
else
- if (A.fire)
+ if(A.fire)
d1 = text("[] ", src, stars("No Party :("))
else
d1 = text("[] ", src, stars("PARTY!!!"))
- if (timing)
+ if(timing)
d2 = text("[] ", src, stars("Stop Time Lock"))
else
d2 = text("[] ", src, stars("Initiate Time Lock"))
@@ -375,7 +377,7 @@ Just a object used in constructing fire alarms
return
/obj/machinery/partyalarm/proc/reset()
- if (!( working ))
+ if(!( working ))
return
var/area/A = get_area(src)
ASSERT(isarea(A))
@@ -383,7 +385,7 @@ Just a object used in constructing fire alarms
return
/obj/machinery/partyalarm/proc/alarm()
- if (!( working ))
+ if(!( working ))
return
var/area/A = get_area(src)
ASSERT(isarea(A))
@@ -392,20 +394,20 @@ Just a object used in constructing fire alarms
/obj/machinery/partyalarm/Topic(href, href_list)
..()
- if (usr.stat || stat & (BROKEN|NOPOWER))
+ if(usr.stat || stat & (BROKEN|NOPOWER))
return
- if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon/ai)))
+ if((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon/ai)))
usr.machine = src
- if (href_list["reset"])
+ if(href_list["reset"])
reset()
else
- if (href_list["alarm"])
+ if(href_list["alarm"])
alarm()
else
- if (href_list["time"])
+ if(href_list["time"])
timing = text2num(href_list["time"])
else
- if (href_list["tp"])
+ if(href_list["tp"])
var/tp = text2num(href_list["tp"])
time += tp
time = min(max(round(time), 0), 120)
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index 01f95d81ab6..655ffd11634 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -28,7 +28,7 @@
src.sd_set_light(2)
*/
/obj/machinery/flasher/power_change()
- if ( powered() )
+ if( powered() )
stat &= ~NOPOWER
icon_state = "[base_state]1"
// src.sd_set_light(2)
@@ -39,26 +39,26 @@
//Don't want to render prison breaks impossible
/obj/machinery/flasher/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/wirecutters))
+ if(istype(W, /obj/item/weapon/wirecutters))
add_fingerprint(user)
src.disable = !src.disable
- if (src.disable)
+ if(src.disable)
user.visible_message("\red [user] has disconnected the [src]'s flashbulb!", "\red You disconnect the [src]'s flashbulb!")
- if (!src.disable)
+ if(!src.disable)
user.visible_message("\red [user] has connected the [src]'s flashbulb!", "\red You connect the [src]'s flashbulb!")
//Let the AI trigger them directly.
/obj/machinery/flasher/attack_ai()
- if (src.anchored)
+ if(src.anchored)
return src.flash()
else
return
/obj/machinery/flasher/proc/flash()
- if (!(powered()))
+ if(!(powered()))
return
- if ((src.disable) || (src.last_flash && world.time < src.last_flash + 150))
+ if((src.disable) || (src.last_flash && world.time < src.last_flash + 150))
return
playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
@@ -67,7 +67,7 @@
use_power(1000)
for(var/mob/living/L in viewers(src, null))
- if (get_dist(src, L) > src.range)
+ if(get_dist(src, L) > src.range)
continue
if(L.flash_eyes(affect_silicon = 1))
@@ -85,24 +85,24 @@
..(severity)
/obj/machinery/flasher/portable/HasProximity(atom/movable/AM as mob|obj)
- if ((src.disable) || (src.last_flash && world.time < src.last_flash + 150))
+ if((src.disable) || (src.last_flash && world.time < src.last_flash + 150))
return
if(istype(AM, /mob/living/carbon))
var/mob/living/carbon/M = AM
- if ((M.m_intent != "walk") && (src.anchored))
+ if((M.m_intent != "walk") && (src.anchored))
src.flash()
/obj/machinery/flasher/portable/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/wrench))
+ if(istype(W, /obj/item/weapon/wrench))
add_fingerprint(user)
src.anchored = !src.anchored
- if (!src.anchored)
+ if(!src.anchored)
user.show_message(text("\red [src] can now be moved."))
src.overlays.Cut()
- else if (src.anchored)
+ else if(src.anchored)
user.show_message(text("\red [src] is now secured."))
src.overlays += "[base_state]-s"
diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm
index 7c5e152529f..53977708650 100644
--- a/code/game/machinery/floodlight.dm
+++ b/code/game/machinery/floodlight.dm
@@ -69,7 +69,7 @@
/obj/machinery/floodlight/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench))
- if (!anchored && !isinspace())
+ if(!anchored && !isinspace())
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
@@ -83,8 +83,8 @@
" You have loosened \the [src]'s casters. ", \
"You hear ratchet.")
anchored = 0
- if (istype(W, /obj/item/weapon/screwdriver))
- if (!open)
+ if(istype(W, /obj/item/weapon/screwdriver))
+ if(!open)
if(unlocked)
unlocked = 0
to_chat(user, "You screw the battery panel in place.")
@@ -92,7 +92,7 @@
unlocked = 1
to_chat(user, "You unscrew the battery panel.")
- if (istype(W, /obj/item/weapon/crowbar))
+ if(istype(W, /obj/item/weapon/crowbar))
if(unlocked)
if(open)
open = 0
@@ -103,7 +103,7 @@
open = 1
to_chat(user, "You remove the battery panel.")
- if (istype(W, /obj/item/weapon/stock_parts/cell))
+ if(istype(W, /obj/item/weapon/stock_parts/cell))
if(open)
if(cell)
to_chat(user, "There is a power cell already installed.")
diff --git a/code/game/machinery/guestpass.dm b/code/game/machinery/guestpass.dm
index bf1d69e7437..512ed47263a 100644
--- a/code/game/machinery/guestpass.dm
+++ b/code/game/machinery/guestpass.dm
@@ -11,19 +11,19 @@
var/reason = "NOT SPECIFIED"
/obj/item/weapon/card/id/guest/GetAccess()
- if (world.time > expiration_time)
+ if(world.time > expiration_time)
return access
else
return temp_access
/obj/item/weapon/card/id/guest/examine(mob/user)
..(user)
- if (world.time < expiration_time)
+ if(world.time < expiration_time)
to_chat(user, "This pass expires at [worldtime2text(expiration_time)]. ")
else
to_chat(user, "It expired at [worldtime2text(expiration_time)]. ")
to_chat(user, "It grants access to following areas: ")
- for (var/A in temp_access)
+ for(var/A in temp_access)
to_chat(user, "[get_access_desc(A)]. ")
to_chat(user, "Issuing reason: [reason]. ")
@@ -72,9 +72,9 @@
user.set_machine(src)
var/dat
- if (mode == 1) //Logs
+ if(mode == 1) //Logs
dat += "Activity log "
- for (var/entry in internal_log)
+ for(var/entry in internal_log)
dat += "[entry] "
dat += "Print "
dat += "Back "
@@ -86,15 +86,17 @@
dat += "Reason: [reason] "
dat += "Duration (minutes): [duration] m "
dat += "Access to areas: "
- if (giver && giver.access)
- for (var/A in get_changeable_accesses())
+ if(giver && giver.access)
+ for(var/A in get_changeable_accesses())
var/area = get_access_desc(A)
- if (A in accesses)
+ if(A in accesses)
area = "[area] "
dat += "[area] "
dat += "Issue pass "
- user << browse(dat, "window=guestpass;size=400x520")
+ var/datum/browser/popup = new(user, "guestpass", name, 400, 520)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "guestpass")
@@ -102,37 +104,37 @@
if(..())
return 1
usr.set_machine(src)
- if (href_list["mode"])
+ if(href_list["mode"])
mode = text2num(href_list["mode"])
- if (href_list["choice"])
+ if(href_list["choice"])
switch(href_list["choice"])
- if ("giv_name")
+ if("giv_name")
var/nam = strip_html_simple(input("Person pass is issued to", "Name", giv_name) as text|null)
- if (nam)
+ if(nam)
giv_name = nam
- if ("reason")
+ if("reason")
var/reas = strip_html_simple(input("Reason why pass is issued", "Reason", reason) as text|null)
if(reas)
reason = reas
- if ("duration")
+ if("duration")
var/dur = input("Duration (in minutes) during which pass is valid (up to 30 minutes).", "Duration") as num|null
- if (dur)
- if (dur > 0 && dur <= 30)
+ if(dur)
+ if(dur > 0 && dur <= 30)
duration = dur
else
to_chat(usr, "Invalid duration. ")
- if ("access")
+ if("access")
var/A = text2num(href_list["access"])
- if (A in accesses)
+ if(A in accesses)
accesses.Remove(A)
else
if(giver && giver.access && (A in get_changeable_accesses()))
accesses.Add(A)
- if (href_list["action"])
+ if(href_list["action"])
switch(href_list["action"])
- if ("id")
- if (giver)
+ if("id")
+ if(giver)
if(ishuman(usr))
giver.loc = usr.loc
if(!usr.get_active_hand())
@@ -144,15 +146,15 @@
accesses.Cut()
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.loc = src
giver = I
updateUsrDialog()
- if ("print")
+ if("print")
var/dat = "Activity log of guest pass terminal #[uid] "
- for (var/entry in internal_log)
+ for(var/entry in internal_log)
dat += "[entry] "
// to_chat(usr, "Printing the log, standby...")
//sleep(50)
@@ -161,13 +163,13 @@
P.name = "activity log"
P.info = dat
- if ("issue")
- if (giver)
+ if("issue")
+ if(giver)
var/number = add_zero("[rand(0,9999)]", 4)
var/entry = "\[[worldtime2text()]\] Pass #[number] issued by [giver.registered_name] ([giver.assignment]) to [giv_name]. Reason: [reason]. Grants access to following areas: "
- for (var/i=1 to accesses.len)
+ for(var/i=1 to accesses.len)
var/A = accesses[i]
- if (A)
+ if(A)
var/area = get_access_desc(A)
entry += "[i > 1 ? ", [area]" : "[area]"]"
entry += ". Expires at [worldtime2text(world.time + duration*10*60)]."
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index c8e16257858..abe99777410 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -81,7 +81,7 @@ var/const/HOLOPAD_MODE = 0
to_chat(user, "A request for AI presence was already sent recently. ")
/obj/machinery/hologram/holopad/attack_ai(mob/living/silicon/ai/user)
- if (!istype(user))
+ if(!istype(user))
return
/*There are pretty much only three ways to interact here.
I don't need to check for client since they're clicking on an object.
@@ -100,9 +100,9 @@ var/const/HOLOPAD_MODE = 0
create_holo(user)//Create one.
src.visible_message("A holographic image of [user] flicks to life right before your eyes!")
else
- to_chat(user, "\red ERROR: \black Image feed in progress.")
+ to_chat(user, "ERROR: Image feed in progress.")
else
- to_chat(user, "\red ERROR: \black Unable to project hologram.")
+ to_chat(user, "ERROR: Unable to project hologram.")
return
/*This is the proc for special two-way communication between AI and holopad/people talking near holopad.
@@ -123,7 +123,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
rendered = "Holopad received, [name_used] [verb], \"[text]\" "
master.show_message(rendered, 2)
return
-
+
/obj/machinery/hologram/holopad/hear_message(mob/living/M, text)
if(M&&hologram&&master)//Master is mostly a safety in case lag hits or something.
var/name_used = M.GetVoice()
@@ -165,7 +165,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
if((HOLOPAD_MODE == 0 && (get_dist(master.eyeobj, src) <= holo_range)))
return 1
- else if (HOLOPAD_MODE == 1)
+ else if(HOLOPAD_MODE == 1)
var/area/holo_area = get_area(src)
var/area/eye_area = get_area(master.eyeobj)
@@ -219,10 +219,10 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
if(1.0)
qdel(src)
if(2.0)
- if (prob(50))
+ if(prob(50))
qdel(src)
if(3.0)
- if (prob(5))
+ if(prob(5))
qdel(src)
return
diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm
index 687a07ced0f..d44ee2e3930 100644
--- a/code/game/machinery/holosign.dm
+++ b/code/game/machinery/holosign.dm
@@ -10,19 +10,19 @@
var/on_icon = "sign_on"
proc/toggle()
- if (stat & (BROKEN|NOPOWER))
+ if(stat & (BROKEN|NOPOWER))
return
lit = !lit
update_icon()
update_icon()
- if (!lit)
+ if(!lit)
icon_state = "sign_off"
else
icon_state = on_icon
power_change()
- if (stat & NOPOWER)
+ if(stat & NOPOWER)
lit = 0
update_icon()
@@ -67,7 +67,7 @@
icon_state = "light0"
for(var/obj/machinery/holosign/M in world)
- if (M.id == src.id)
+ if(M.id == src.id)
spawn( 0 )
M.toggle()
return
diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm
index d6e41d29fa2..7cb51574a60 100755
--- a/code/game/machinery/igniter.dm
+++ b/code/game/machinery/igniter.dm
@@ -25,9 +25,9 @@
return
/obj/machinery/igniter/process() //ugh why is this even in process()?
- if (src.on && !(stat & NOPOWER) )
+ if(src.on && !(stat & NOPOWER) )
var/turf/location = src.loc
- if (isturf(location))
+ if(isturf(location))
location.hotspot_expose(1000,500,1)
return 1
@@ -58,7 +58,7 @@
..()
/obj/machinery/sparker/power_change()
- if ( powered() && disable == 0 )
+ if( powered() && disable == 0 )
stat &= ~NOPOWER
icon_state = "[base_state]"
// src.sd_set_light(2)
@@ -70,13 +70,13 @@
/obj/machinery/sparker/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/device/detective_scanner))
return
- if (istype(W, /obj/item/weapon/screwdriver))
+ if(istype(W, /obj/item/weapon/screwdriver))
add_fingerprint(user)
src.disable = !src.disable
- if (src.disable)
+ if(src.disable)
user.visible_message("\red [user] has disabled the [src]!", "\red You disable the connection to the [src].")
icon_state = "[base_state]-d"
- if (!src.disable)
+ if(!src.disable)
user.visible_message("\red [user] has reconnected the [src]!", "\red You fix the connection to the [src].")
if(src.powered())
icon_state = "[base_state]"
@@ -84,16 +84,16 @@
icon_state = "[base_state]-p"
/obj/machinery/sparker/attack_ai()
- if (src.anchored)
+ if(src.anchored)
return src.spark()
else
return
/obj/machinery/sparker/proc/spark()
- if (!(powered()))
+ if(!(powered()))
return
- if ((src.disable) || (src.last_spark && world.time < src.last_spark + 50))
+ if((src.disable) || (src.last_spark && world.time < src.last_spark + 50))
return
@@ -104,7 +104,7 @@
src.last_spark = world.time
use_power(1000)
var/turf/location = src.loc
- if (isturf(location))
+ if(isturf(location))
location.hotspot_expose(1000,500,1)
return 1
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 5caff96d4ea..9c6b0fc548d 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -58,7 +58,7 @@
/obj/machinery/iv_drip/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/reagent_containers))
+ if(istype(W, /obj/item/weapon/reagent_containers))
if(!isnull(src.beaker))
to_chat(user, "There is already a reagent container loaded!")
return
@@ -124,14 +124,16 @@
var/datum/reagent/B = T.take_blood(beaker,amount)
- if (B)
+ if(B)
beaker.reagents.reagent_list |= B
beaker.reagents.update_total()
beaker.on_reagent_change()
beaker.reagents.handle_reactions()
update_icon()
-/obj/machinery/iv_drip/attack_hand(mob/user as mob)
+/obj/machinery/iv_drip/attack_hand(mob/living/carbon/user)
+ if(!istype(user))
+ return
if(src.beaker)
src.beaker.loc = get_turf(src)
src.beaker = null
@@ -157,7 +159,7 @@
/obj/machinery/iv_drip/examine(mob/user)
..(user)
- if (!(user in view(2)) && usr != src.loc) return
+ if(!(user in view(2)) && usr != src.loc) return
to_chat(usr, "The IV drip is [mode ? "injecting" : "taking blood"].")
diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm
index 4c271a08f44..ddf289d6189 100644
--- a/code/game/machinery/kitchen/gibber.dm
+++ b/code/game/machinery/kitchen/gibber.dm
@@ -281,12 +281,12 @@
playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1)
operating = 0
- for (var/obj/item/thing in contents) //Meat is spawned inside the gibber and thrown out afterwards.
+ for(var/obj/item/thing in contents) //Meat is spawned inside the gibber and thrown out afterwards.
thing.loc = get_turf(thing) // Drop it onto the turf for throwing.
thing.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15) // Being pelted with bits of meat and bone would hurt.
sleep(1)
- for (var/obj/effect/gibs in contents) //throw out the gibs too
+ for(var/obj/effect/gibs in contents) //throw out the gibs too
gibs.loc = get_turf(gibs) //drop onto turf for throwing
gibs.throw_at(get_edge_target_turf(src,gib_throw_dir),rand(1,5),15)
sleep(1)
diff --git a/code/game/machinery/kitchen/icecream_vat.dm b/code/game/machinery/kitchen/icecream_vat.dm
index a5e1cc1eafb..91db3bd7416 100644
--- a/code/game/machinery/kitchen/icecream_vat.dm
+++ b/code/game/machinery/kitchen/icecream_vat.dm
@@ -87,7 +87,9 @@ var/list/ingredients_source = list(
dat += "No beaker inserted. "
dat += "Refresh Close "
- user << browse(dat,"window=icecreamvat;size=600x400")
+ var/datum/browser/popup = new(user, "icecreamvat", name, 600, 400)
+ popup.set_content(dat)
+ popup.open(0)
/obj/machinery/icecream_vat/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if(istype(O, /obj/item/weapon/reagent_containers))
@@ -97,7 +99,7 @@ var/list/ingredients_source = list(
if(ingredients[ICECREAM_VANILLA] > 0)
var/flavour_name = get_icecream_flavour_string(dispense_flavour)
if(dispense_flavour < 11 && ingredients[dispense_flavour] > 0)
- src.visible_message("\icon[src] [user] scoops delicious [flavour_name] flavoured icecream into [I]. ")
+ src.visible_message("[bicon(src)] [user] scoops delicious [flavour_name] flavoured icecream into [I]. ")
ingredients[dispense_flavour] -= 1
ingredients[ICECREAM_VANILLA] -= 1
@@ -126,7 +128,7 @@ var/list/ingredients_source = list(
var/obj/item/weapon/reagent_containers/R = O
if(R.reagents)
src.visible_message("[user] has emptied all of [R] into [src]. ")
- for (var/datum/reagent/current_reagent in R.reagents.reagent_list)
+ for(var/datum/reagent/current_reagent in R.reagents.reagent_list)
if(ingredients_source[current_reagent.id])
add(ingredients_source[current_reagent.id], current_reagent.volume / 2)
else
diff --git a/code/game/machinery/kitchen/juicer.dm b/code/game/machinery/kitchen/juicer.dm
index 7b25e683941..895f4bad428 100644
--- a/code/game/machinery/kitchen/juicer.dm
+++ b/code/game/machinery/kitchen/juicer.dm
@@ -36,9 +36,9 @@
/obj/machinery/juicer/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
- if (istype(O,/obj/item/weapon/reagent_containers/glass) || \
+ if(istype(O,/obj/item/weapon/reagent_containers/glass) || \
istype(O,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass))
- if (beaker)
+ if(beaker)
return 1
else
if(!user.unEquip(O))
@@ -50,7 +50,7 @@
update_icon()
src.updateUsrDialog()
return 0
- if (!is_type_in_list(O, allowed_items))
+ if(!is_type_in_list(O, allowed_items))
to_chat(user, "It doesn't look like that contains any juice.")
return 1
if(!user.unEquip(O))
@@ -73,21 +73,21 @@
var/processing_chamber = ""
var/beaker_contents = ""
- for (var/i in allowed_items)
- for (var/obj/item/O in src.contents)
- if (!istype(O,i))
+ for(var/i in allowed_items)
+ for(var/obj/item/O in src.contents)
+ if(!istype(O,i))
continue
processing_chamber+= "some [O] "
break
- if (!processing_chamber)
+ if(!processing_chamber)
is_chamber_empty = 1
processing_chamber = "Nothing."
- if (!beaker)
+ if(!beaker)
beaker_contents = "\The [src] has no beaker attached."
- else if (!beaker.reagents.total_volume)
+ else if(!beaker.reagents.total_volume)
beaker_contents = "\The [src] has attached an empty beaker."
is_beaker_ready = 1
- else if (beaker.reagents.total_volume < beaker.reagents.maximum_volume)
+ else if(beaker.reagents.total_volume < beaker.reagents.maximum_volume)
beaker_contents = "\The [src] has attached a beaker with something."
is_beaker_ready = 1
else
@@ -98,11 +98,13 @@
[processing_chamber]
[beaker_contents]
"}
- if (is_beaker_ready && !is_chamber_empty && !(stat & (NOPOWER|BROKEN)))
+ if(is_beaker_ready && !is_chamber_empty && !(stat & (NOPOWER|BROKEN)))
dat += "Turn on! "
- if (beaker)
+ if(beaker)
dat += " Detach a beaker! "
- user << browse("Juicer [dat] ", "window=juicer")
+ var/datum/browser/popup = new(user, "juicer", name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "juicer")
return
@@ -112,10 +114,10 @@
return
usr.set_machine(src)
switch(href_list["action"])
- if ("juice")
+ if("juice")
juice()
- if ("detach")
+ if("detach")
detach()
src.updateUsrDialog()
return
@@ -124,9 +126,9 @@
set category = "Object"
set name = "Detach Beaker from the juicer"
set src in oview(1)
- if (usr.stat != 0)
+ if(usr.stat != 0)
return
- if (!beaker)
+ if(!beaker)
return
src.verbs -= /obj/machinery/juicer/verb/detach
beaker.forceMove(src.loc)
@@ -134,7 +136,7 @@
update_icon()
/obj/machinery/juicer/proc/get_juice_id(var/obj/item/weapon/reagent_containers/food/snacks/O)
- if (istype(O, /obj/item/weapon/reagent_containers/food/snacks/watermelonslice))
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/watermelonslice))
return "watermelonjuice"
else if(istype(O, /obj.item/weapon/reagent_containers/food/snacks/grown))
var/obj/item/weapon/reagent_containers/food/snacks/grown/G = O
@@ -144,9 +146,9 @@
return "water"
/obj/machinery/juicer/proc/get_juice_amount(var/obj/item/weapon/reagent_containers/food/snacks/grown/O)
- if (!istype(O))
+ if(!istype(O))
return 5
- else if (O.potency == -1)
+ else if(O.potency == -1)
return 5
else
return round(5*sqrt(O.potency))
@@ -155,14 +157,14 @@
power_change() //it is a portable machine
if(stat & (NOPOWER|BROKEN))
return
- if (!beaker || beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ if(!beaker || beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
return
playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1)
- for (var/obj/item/weapon/reagent_containers/food/snacks/O in src.contents)
+ for(var/obj/item/weapon/reagent_containers/food/snacks/O in src.contents)
var/r_id = get_juice_id(O)
beaker.reagents.add_reagent(r_id,get_juice_amount(O))
qdel(O)
- if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
/obj/structure/closet/crate/juice
diff --git a/code/game/machinery/kitchen/kitchen_machine.dm b/code/game/machinery/kitchen/kitchen_machine.dm
index 5c584d0468b..6f9e1a191fc 100644
--- a/code/game/machinery/kitchen/kitchen_machine.dm
+++ b/code/game/machinery/kitchen/kitchen_machine.dm
@@ -34,19 +34,19 @@
/obj/machinery/kitchen_machine/New()
reagents = new/datum/reagents(100)
reagents.my_atom = src
- if (!available_recipes)
+ if(!available_recipes)
available_recipes = new
acceptable_items = new
acceptable_reagents = new
- for (var/type in subtypesof(recipe_type))
+ for(var/type in subtypesof(recipe_type))
var/datum/recipe/recipe = new type
if(recipe.result) // Ignore recipe subtypes that lack a result
available_recipes += recipe
- for (var/item in recipe.items)
+ for(var/item in recipe.items)
acceptable_items |= item
- for (var/reagent in recipe.reagents)
+ for(var/reagent in recipe.reagents)
acceptable_reagents |= reagent
- if (recipe.items || recipe.fruit)
+ if(recipe.items || recipe.fruit)
max_n_of_items = max(max_n_of_items,recipe.count_n_items())
else
qdel(recipe)
@@ -83,7 +83,7 @@
"[user] starts to fix part of \the [src]. ", \
"You start to fix part of \the [src]. " \
)
- if (do_after(user,20, target = src))
+ if(do_after(user,20, target = src))
user.visible_message( \
"[user] fixes part of \the [src]. ", \
"You have fixed part of \the [src]. " \
@@ -94,7 +94,7 @@
"[user] starts to fix part of \the [src]. ", \
"You start to fix part of \the [src]. " \
)
- if (do_after(user,20, target = src))
+ if(do_after(user,20, target = src))
user.visible_message( \
"[user] fixes \the [src]. ", \
"You have fixed \the [src]. " \
@@ -112,7 +112,7 @@
"[user] starts to clean \the [src]. ", \
"You start to clean \the [src]. " \
)
- if (do_after(user,20, target = src))
+ if(do_after(user,20, target = src))
user.visible_message( \
"[user] has cleaned \the [src]. ", \
"You have cleaned \the [src]. " \
@@ -125,10 +125,10 @@
to_chat(user, "It's dirty! ")
return 1
else if(is_type_in_list(O,acceptable_items))
- if (contents.len>=max_n_of_items)
+ if(contents.len>=max_n_of_items)
to_chat(user, "This [src] is full of ingredients, you cannot put more. ")
return 1
- if (istype(O,/obj/item/stack) && O:amount>1)
+ if(istype(O,/obj/item/stack) && O:amount>1)
new O.type (src)
O:use(1)
user.visible_message( \
@@ -147,10 +147,10 @@
istype(O,/obj/item/weapon/reagent_containers/food/drinks) || \
istype(O,/obj/item/weapon/reagent_containers/food/condiment) \
)
- if (!O.reagents)
+ if(!O.reagents)
return 1
- for (var/datum/reagent/R in O.reagents.reagent_list)
- if (!(R.id in acceptable_reagents))
+ for(var/datum/reagent/R in O.reagents.reagent_list)
+ if(!(R.id in acceptable_reagents))
to_chat(user, "Your [O] contains components unsuitable for cookery. ")
return 1
//G.reagents.trans_to(src,G.amount_per_transfer_from_this)
@@ -188,53 +188,55 @@
var/list/items_counts = new
var/list/items_measures = new
var/list/items_measures_p = new
- for (var/obj/O in contents)
+ for(var/obj/O in contents)
var/display_name = O.name
- if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg))
+ if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg))
items_measures[display_name] = "egg"
items_measures_p[display_name] = "eggs"
- if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/tofu))
+ if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/tofu))
items_measures[display_name] = "tofu chunk"
items_measures_p[display_name] = "tofu chunks"
- if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/meat)) //any meat
+ if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/meat)) //any meat
items_measures[display_name] = "slab of meat"
items_measures_p[display_name] = "slabs of meat"
- if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/donkpocket))
+ if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/donkpocket))
display_name = "Turnovers"
items_measures[display_name] = "turnover"
items_measures_p[display_name] = "turnovers"
- if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/carpmeat))
+ if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/carpmeat))
items_measures[display_name] = "fillet of meat"
items_measures_p[display_name] = "fillets of meat"
items_counts[display_name]++
- for (var/O in items_counts)
+ for(var/O in items_counts)
var/N = items_counts[O]
- if (!(O in items_measures))
+ if(!(O in items_measures))
dat += {"[capitalize(O)]: [N] [lowertext(O)]\s "}
else
- if (N==1)
+ if(N==1)
dat += {"[capitalize(O)]: [N] [items_measures[O]] "}
else
dat += {"[capitalize(O)]: [N] [items_measures_p[O]] "}
- for (var/datum/reagent/R in reagents.reagent_list)
+ for(var/datum/reagent/R in reagents.reagent_list)
var/display_name = R.name
- if (R.id == "capsaicin")
+ if(R.id == "capsaicin")
display_name = "Hotsauce"
- if (R.id == "frostoil")
+ if(R.id == "frostoil")
display_name = "Coldsauce"
dat += {"[display_name]: [R.volume] unit\s "}
- if (items_counts.len==0 && reagents.reagent_list.len==0)
+ if(items_counts.len==0 && reagents.reagent_list.len==0)
dat = {"The [src] is empty "}
else
dat = {"Ingredients: [dat]"}
dat += {" \
- Turn on! \
- Eject ingredients! \
+ Turn on! \
+Eject ingredients! \
"}
- user << browse("[src] Controls [dat] ", "window=[src.name]")
+ var/datum/browser/popup = new(user, name, name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "[src.name]")
return
@@ -248,8 +250,8 @@
if(stat & (NOPOWER|BROKEN))
return
start()
- if (reagents.total_volume==0 && !(locate(/obj) in contents)) //dry run
- if (!wzhzhzh(10))
+ if(reagents.total_volume==0 && !(locate(/obj) in contents)) //dry run
+ if(!wzhzhzh(10))
abort()
return
stop()
@@ -258,10 +260,10 @@
var/datum/recipe/recipe = select_recipe(available_recipes,src)
var/obj/cooked
var/obj/byproduct
- if (!recipe)
+ if(!recipe)
dirty += 1
- if (prob(max(10,dirty*5)))
- if (!wzhzhzh(4))
+ if(prob(max(10,dirty*5)))
+ if(!wzhzhzh(4))
abort()
return
muck_start()
@@ -269,15 +271,15 @@
muck_finish()
fail()
return
- else if (has_extra_item())
- if (!wzhzhzh(4))
+ else if(has_extra_item())
+ if(!wzhzhzh(4))
abort()
return
broke()
fail()
return
else
- if (!wzhzhzh(10))
+ if(!wzhzhzh(10))
abort()
return
stop()
@@ -285,10 +287,10 @@
return
else
var/halftime = round(recipe.time/10/2)
- if (!wzhzhzh(halftime))
+ if(!wzhzhzh(halftime))
abort()
return
- if (!wzhzhzh(halftime))
+ if(!wzhzhzh(halftime))
abort()
fail()
return
@@ -304,16 +306,16 @@
return
/obj/machinery/kitchen_machine/proc/wzhzhzh(var/seconds as num)
- for (var/i=1 to seconds)
- if (stat & (NOPOWER|BROKEN))
+ for(var/i=1 to seconds)
+ if(stat & (NOPOWER|BROKEN))
return 0
use_power(500)
sleep(10)
return 1
/obj/machinery/kitchen_machine/proc/has_extra_item()
- for (var/obj/O in contents)
- if ( \
+ for(var/obj/O in contents)
+ if( \
!istype(O,/obj/item/weapon/reagent_containers/food) && \
!istype(O, /obj/item/weapon/grown) \
)
@@ -338,9 +340,9 @@
src.updateUsrDialog()
/obj/machinery/kitchen_machine/proc/dispose()
- for (var/obj/O in contents)
+ for(var/obj/O in contents)
O.forceMove(src.loc)
- if (src.reagents.total_volume)
+ if(src.reagents.total_volume)
src.dirty++
src.reagents.clear_reagents()
to_chat(usr, "You dispose of \the [src]'s contents. ")
@@ -373,11 +375,11 @@
/obj/machinery/kitchen_machine/proc/fail()
var/obj/item/weapon/reagent_containers/food/snacks/badrecipe/ffuu = new(src)
var/amount = 0
- for (var/obj/O in contents-ffuu)
+ for(var/obj/O in contents-ffuu)
amount++
- if (O.reagents)
+ if(O.reagents)
var/id = O.reagents.get_master_reagent_id()
- if (id)
+ if(id)
amount+=O.reagents.get_reagent_amount(id)
qdel(O)
src.reagents.clear_reagents()
@@ -395,9 +397,9 @@
return
switch(href_list["action"])
- if ("cook")
+ if("cook")
cook()
- if ("dispose")
+ if("dispose")
dispose()
- return
\ No newline at end of file
+ return
diff --git a/code/game/machinery/kitchen/monkeyrecycler.dm b/code/game/machinery/kitchen/monkeyrecycler.dm
index b95e4ae5318..dc283e65d6c 100644
--- a/code/game/machinery/kitchen/monkeyrecycler.dm
+++ b/code/game/machinery/kitchen/monkeyrecycler.dm
@@ -62,9 +62,9 @@
cycle_through = 0
to_chat(user, "You change the monkeycube type to [initial(cube_type.name)]. ")
- if (src.stat != 0) //NOPOWER etc
+ if(src.stat != 0) //NOPOWER etc
return
- if (istype(O, /obj/item/weapon/grab))
+ if(istype(O, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = O
var/grabbed = G.affecting
if(istype(grabbed, /mob/living/carbon/human))
@@ -91,7 +91,7 @@
return
/obj/machinery/monkey_recycler/attack_hand(var/mob/user as mob)
- if (src.stat != 0) //NOPOWER etc
+ if(src.stat != 0) //NOPOWER etc
return
if(grinded >= required_grind)
to_chat(user, "The machine hisses loudly as it condenses the grinded monkey meat. After a moment, it dispenses a brand new monkey cube. ")
diff --git a/code/game/machinery/kitchen/processor.dm b/code/game/machinery/kitchen/processor.dm
index 881c0536803..cf0aeba069e 100644
--- a/code/game/machinery/kitchen/processor.dm
+++ b/code/game/machinery/kitchen/processor.dm
@@ -45,7 +45,7 @@
if(!picked_slime)
return
var/datum/food_processor_process/P = select_recipe(picked_slime)
- if (!P)
+ if(!P)
return
visible_message("[picked_slime] is sucked into \the [src].")
@@ -58,10 +58,10 @@
var/time = 40
/datum/food_processor_process/proc/process_food(loc, what, obj/machinery/processor/processor)
- if (src.output && loc && processor)
+ if(src.output && loc && processor)
for(var/i = 0, i < processor.rating_amount, i++)
new src.output(loc)
- if (what)
+ if(what)
qdel(what)
/////////////////////////
@@ -118,7 +118,7 @@
/datum/food_processor_process/mob/monkey/process_food(loc, what, processor)
var/mob/living/carbon/human/monkey/O = what
- if (O.client) //grief-proof
+ if(O.client) //grief-proof
O.loc = loc
O.visible_message("Suddenly [O] jumps out from the processor! ", \
"You jump out of \the [src]. ", \
@@ -143,13 +143,13 @@
//END RECIPE DATUMS
/obj/machinery/processor/proc/select_recipe(var/X)
- for (var/Type in subtypesof(/datum/food_processor_process) - /datum/food_processor_process/mob)
+ for(var/Type in subtypesof(/datum/food_processor_process) - /datum/food_processor_process/mob)
var/datum/food_processor_process/P = new Type()
if(istype(X, /obj/item/weapon/reagent_containers/food/snacks/grown))
var/obj/item/weapon/reagent_containers/food/snacks/grown/G = X
if(G.seed.kitchen_tag != P.input)
continue
- else if (!istype(X, P.input))
+ else if(!istype(X, P.input))
continue
return P
return 0
@@ -173,13 +173,13 @@
var/obj/item/what = O
- if (istype(O, /obj/item/weapon/grab))
+ if(istype(O, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = O
what = G.affecting
var/datum/food_processor_process/P = select_recipe(what)
- if (!P)
+ if(!P)
to_chat(user, "That probably won't blend. ")
return 1
@@ -211,7 +211,7 @@
var/total_time = 0
for(var/O in src.contents)
var/datum/food_processor_process/P = select_recipe(O)
- if (!P)
+ if(!P)
log_debug("The [O] in processor([src]) does not have a suitable recipe, but it was somehow put inside of the processor anyways.")
continue
total_time += P.time
@@ -219,7 +219,7 @@
for(var/O in src.contents)
var/datum/food_processor_process/P = select_recipe(O)
- if (!P)
+ if(!P)
log_debug("The [O] in processor([src]) does not have a suitable recipe, but it was somehow put inside of the processor anyways.")
continue
P.process_food(src.loc, O, src)
diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm
index b17b09d5419..8f2c4e58cd9 100644
--- a/code/game/machinery/kitchen/smartfridge.dm
+++ b/code/game/machinery/kitchen/smartfridge.dm
@@ -322,7 +322,7 @@
data["secure"] = is_secure
var/list/items[0]
- for (var/i=1 to length(item_quants))
+ for(var/i=1 to length(item_quants))
var/K = item_quants[i]
var/count = item_quants[K]
if(count > 0)
@@ -377,7 +377,7 @@
if(!target)
return 0
- for (var/O in item_quants)
+ for(var/O in item_quants)
if(item_quants[O] <= 0) //Try to use a record that actually has something to dump.
continue
diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm
index 3bc2bec5ec4..08e88b9c8c9 100644
--- a/code/game/machinery/lightswitch.dm
+++ b/code/game/machinery/lightswitch.dm
@@ -39,7 +39,7 @@
src.area = locate(text2path("/area/[otherarea]"))
if(!name)
- name = "light switch ([area.name])"
+ name = "light switch([area.name])"
src.on = src.area.lightswitch
updateicon()
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 5ad3ba4a048..ae299d78a90 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -47,7 +47,7 @@ Class Variables:
Currently unused.
Class Procs:
- New() 'game/machinery/machine.dm'
+ initialize() 'game/machinery/machine.dm'
Destroy() 'game/machinery/machine.dm'
@@ -117,24 +117,25 @@ Class Procs:
var/use_log = list()
var/list/settagwhitelist = list()//WHITELIST OF VARIABLES THAT THE set_tag HREF CAN MODIFY, DON'T PUT SHIT YOU DON'T NEED ON HERE, AND IF YOU'RE GONNA USE set_tag (format_tag() proc), ADD TO THIS LIST.
-/obj/machinery/New()
+/obj/machinery/initialize()
addAtProcessing()
- return ..()
+ . = ..()
+ power_change()
/obj/machinery/proc/addAtProcessing()
- if (use_power)
+ if(use_power)
myArea = get_area_master(src)
machines += src
/obj/machinery/proc/removeAtProcessing()
- if (myArea)
+ if(myArea)
myArea = null
machines -= src
/obj/machinery/Destroy()
- if (src in machines)
+ if(src in machines)
removeAtProcessing()
return ..()
@@ -158,11 +159,11 @@ Class Procs:
qdel(src)
return
if(2.0)
- if (prob(50))
+ if(prob(50))
qdel(src)
return
if(3.0)
- if (prob(25))
+ if(prob(25))
qdel(src)
return
else
@@ -232,7 +233,7 @@ Class Procs:
if("unlink" in href_list)
var/idx = text2num(href_list["unlink"])
- if (!idx)
+ if(!idx)
return 1
var/obj/O = getLink(idx)
@@ -255,7 +256,7 @@ Class Procs:
if(!canLink(O,href_list))
to_chat(usr, "\red You can't link with that device.")
return 1
- if (isLinkedWith(O))
+ if(isLinkedWith(O))
to_chat(usr, "\red A red light flashes on \the [P]. The two devices are already linked.")
return 1
@@ -324,14 +325,13 @@ Class Procs:
////////////////////////////////////////////////////////////////////////////////////////////
-/obj/machinery/attack_ai(var/mob/user as mob)
- if(isrobot(user))
- // For some reason attack_robot doesn't work
- // This is to stop robots from using cameras to remotely control machines.
- if(user.client && user.client.eye == user)
- return src.attack_hand(user)
+/obj/machinery/attack_ai(mob/user)
+ if(isrobot(user))// For some reason attack_robot doesn't work
+ var/mob/living/silicon/robot/R = user
+ if(R.client && R.client.eye == R && !R.low_power_mode)// This is to stop robots from using cameras to remotely control machines; and from using machines when the borg has no power.
+ return attack_hand(user)
else
- return src.attack_hand(user)
+ return attack_hand(user)
/obj/machinery/attack_hand(mob/user as mob)
if(user.lying || user.stat)
@@ -341,7 +341,7 @@ Class Procs:
to_chat(user, "You don't have the dexterity to do this! ")
return 1
- if (ishuman(user))
+ if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H.getBrainLoss() >= 60)
visible_message("[H] stares cluelessly at [src] and drools. ")
@@ -362,6 +362,7 @@ Class Procs:
return ..()
/obj/machinery/CheckParts()
+ ..()
RefreshParts()
return
@@ -420,10 +421,10 @@ Class Procs:
/obj/machinery/proc/state(var/msg)
for(var/mob/O in hearers(src, null))
- O.show_message("\icon[src] [msg] ", 2)
+ O.show_message("[bicon(src)] [msg] ", 2)
/obj/machinery/proc/ping(text=null)
- if (!text)
+ if(!text)
text = "\The [src] pings."
state(text, "blue")
@@ -465,7 +466,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, "\icon[C] [C.name] ")
+ to_chat(user, "[bicon(C)] [C.name] ")
/obj/machinery/examine(mob/user)
..(user)
@@ -547,7 +548,7 @@ Class Procs:
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
- if (electrocute_mob(user, get_area(src), src, 0.7))
+ if(electrocute_mob(user, get_area(src), src, 0.7))
if(user.stunned)
return 1
return 0
diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm
index 0bd5fff9fba..7953f738a40 100644
--- a/code/game/machinery/mass_driver.dm
+++ b/code/game/machinery/mass_driver.dm
@@ -211,7 +211,7 @@
set name = "Rotate Frame"
set src in view(1)
- if ( usr.stat || usr.restrained() || (usr.status_flags & FAKEDEATH))
+ if( usr.stat || usr.restrained() || (usr.status_flags & FAKEDEATH))
return
src.dir = turn(src.dir, -90)
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index 79579e1bb66..5b6cfb5e73d 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -86,9 +86,9 @@
updateicon()
- else if (istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda))
+ else if(istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda))
if(open)
- if (src.allowed(user))
+ if(src.allowed(user))
src.locked = !src.locked
to_chat(user, "Controls are now [src.locked ? "locked" : "unlocked"]. ")
else
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index d991e7c5235..3a6ef2dbd81 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -12,6 +12,7 @@
var/is_admin_message = 0
var/icon/img = null
var/icon/backup_img
+ var/view_count = 0
/datum/feed_channel
var/channel_name=""
@@ -22,6 +23,7 @@
var/backup_author=""
var/censored=0
var/is_admin_channel=0
+ var/total_view_count = 0
//var/page = null //For newspapers
/datum/feed_message/proc/clear()
@@ -31,6 +33,7 @@
src.backup_author = ""
src.img = null
src.backup_img = null
+ view_count = 0
/datum/feed_channel/proc/clear()
src.channel_name = ""
@@ -40,6 +43,7 @@
src.backup_author = ""
src.censored = 0
src.is_admin_channel = 0
+ total_view_count = 0
/datum/feed_channel/proc/announce_news()
return "Breaking news from [channel_name]!"
@@ -98,6 +102,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
var/c_locked=0; //Will our new channel be locked to public submissions?
var/hitstaken = 0 //Death at 3 hits from an item with force>=15
var/datum/feed_channel/viewing_channel = null
+ var/silence = 0
light_range = 0
anchored = 1
@@ -199,8 +204,12 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+= {"Create Feed Channel
View Feed Channels
Submit new Feed story
- Print newspaper
- Re-scan User
+ Print newspaper "}
+ if(!silence)
+ dat+= "Silence unit "
+ else
+ dat+= "Unsilence unit "
+ dat+= {"Re-scan User
Exit "}
if(src.securityCaster)
var/wanted_already = 0
@@ -219,7 +228,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else
for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
if(CHANNEL.is_admin_channel)
- dat+="[CHANNEL.channel_name] "
+ dat+="[CHANNEL.channel_name] "
else
dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("*** ") : ()] "
/*for(var/datum/feed_channel/CHANNEL in src.channel_list)
@@ -254,11 +263,11 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
if(6)
dat+="ERROR: Could not submit Feed story to Network. "
if(src.channel_name=="")
- dat+="•Invalid receiving channel name. "
+ dat+="Invalid receiving channel name. "
if(src.scanned_user=="Unknown")
- dat+="•Channel author unverified. "
+ dat+="Channel author unverified. "
if(src.msg == "" || src.msg == "\[REDACTED\]")
- dat+="•Invalid message body. "
+ dat+="Invalid message body. "
dat+="Return "
if(7)
@@ -272,18 +281,18 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else
existing_authors += FC.author
if(src.scanned_user in existing_authors)
- dat+="•There already exists a Feed channel under your name. "
+ dat+="There already exists a Feed channel under your name. "
if(src.channel_name=="" || src.channel_name == "\[REDACTED\]")
- dat+="•Invalid channel name. "
+ dat+="Invalid channel name. "
var/check = 0
for(var/datum/feed_channel/FC in news_network.network_channels)
if(FC.channel_name == src.channel_name)
check = 1
break
if(check)
- dat+="•Channel name already in use. "
+ dat+="Channel name already in use. "
if(src.scanned_user=="Unknown")
- dat+="•Channel author unverified. "
+ dat+="Channel author unverified. "
dat+="Return "
if(8)
var/total_num=length(news_network.network_channels)
@@ -299,7 +308,9 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="Print Paper "
dat+="Cancel "
if(9)
- dat+="[src.viewing_channel.channel_name]: \[created by: [src.viewing_channel.author] \] "
+ dat+="[src.viewing_channel.channel_name]: \[created by: [src.viewing_channel.author] \] "
+ dat+="Feed view count: [viewing_channel.total_view_count] "
+ viewing_channel.total_view_count++
if(src.viewing_channel.censored)
dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice. "
dat+="No further feed story additions are allowed while the D-Notice is in effect. "
@@ -315,6 +326,8 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
dat+=" "
dat+="\[[MESSAGE.message_type] by [MESSAGE.author] \] "
+ dat+="Message view count: [MESSAGE.view_count] "
+ MESSAGE.view_count++
dat+="Refresh "
dat+="Back "
if(10)
@@ -394,11 +407,11 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
if(16)
dat+="ERROR: Wanted Issue rejected by Network. "
if(src.channel_name=="" || src.channel_name == "\[REDACTED\]")
- dat+="•Invalid name for person wanted. "
+ dat+="Invalid name for person wanted. "
if(src.scanned_user=="Unknown")
- dat+="•Issue author unverified. "
+ dat+="Issue author unverified. "
if(src.msg == "" || src.msg == "\[REDACTED\]")
- dat+="•Invalid description. "
+ dat+="Invalid description. "
dat+="Return "
if(17)
dat+="Wanted Issue successfully deleted from Circulation "
@@ -427,7 +440,9 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com"
- human_or_robot_user << browse(dat, "window=newscaster_main;size=400x600")
+ var/datum/browser/popup = new(user, "newscaster_main", name, 400, 600)
+ popup.set_content(dat)
+ popup.open(0)
onclose(human_or_robot_user, "newscaster_main")
/*if(src.isbroken) //debugging shit
@@ -441,11 +456,11 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
/obj/machinery/newscaster/Topic(href, href_list)
if(..())
return 1
-
+
usr.set_machine(src)
if(href_list["set_channel_name"])
src.channel_name = sanitizeSQL(strip_html_simple(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "")))
- while (findtext(src.channel_name," ") == 1)
+ while(findtext(src.channel_name," ") == 1)
src.channel_name = copytext(src.channel_name,2,lentext(src.channel_name)+1)
src.updateUsrDialog()
//src.update_icon()
@@ -497,7 +512,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else if(href_list["set_new_message"])
src.msg = strip_html(input(usr, "Write your feed story", "Network Channel Handler", ""))
- while (findtext(src.msg," ") == 1)
+ while(findtext(src.msg," ") == 1)
src.msg = copytext(src.msg,2,lentext(src.msg)+1)
src.updateUsrDialog()
@@ -546,6 +561,14 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
src.screen = 20
src.updateUsrDialog()
+ else if(href_list["silence_unit"])
+ silence=1
+ updateUsrDialog()
+
+ else if(href_list["unsilence_unit"])
+ silence=0
+ updateUsrDialog()
+
else if(href_list["menu_censor_story"])
src.screen=10
src.updateUsrDialog()
@@ -567,13 +590,13 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else if(href_list["set_wanted_name"])
src.channel_name = strip_html(input(usr, "Provide the name of the Wanted person", "Network Security Handler", ""))
- while (findtext(src.channel_name," ") == 1)
+ while(findtext(src.channel_name," ") == 1)
src.channel_name = copytext(src.channel_name,2,lentext(src.channel_name)+1)
src.updateUsrDialog()
else if(href_list["set_wanted_desc"])
src.msg = strip_html(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", ""))
- while (findtext(src.msg," ") == 1)
+ while(findtext(src.msg," ") == 1)
src.msg = copytext(src.msg,2,lentext(src.msg)+1)
src.updateUsrDialog()
@@ -685,7 +708,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
else if(href_list["setScreen"]) //Brings us to the main menu and resets all fields~
src.screen = text2num(href_list["setScreen"])
- if (src.screen == 0)
+ if(src.screen == 0)
src.scanned_user = "Unknown";
msg = "";
src.c_locked=0;
@@ -718,7 +741,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
qdel(src)
return
- if (isbroken)
+ if(isbroken)
playsound(src.loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, 1)
visible_message("[user.name] further abuses the shattered [src.name]. ", null, 5 )
else
@@ -759,7 +782,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
if(!camera)
return
var/datum/picture/selection = camera.selectpicture()
- if (!selection)
+ if(!selection)
return
var/obj/item/weapon/photo/P = new/obj/item/weapon/photo()
@@ -794,7 +817,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
switch(screen)
if(0) //Cover
dat+="The Griffon
"
- dat+="Nanotrasen-standard newspaper, for use on Nanotrasen© Space Facilities
"
+ dat+="Nanotrasen-standard newspaper, for use on Nanotrasen Space Facilities
"
if(isemptylist(src.news_content))
if(src.important_message)
dat+="Contents:** Important Security Announcement** \[page [src.pages+2]\] "
@@ -869,7 +892,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
obj/item/weapon/newspaper/Topic(href, href_list)
var/mob/living/U = usr
..()
- if ((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) ))
+ if((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) ))
U.set_machine(src)
if(href_list["next_page"])
if(curr_page==src.pages+1)
@@ -894,7 +917,7 @@ obj/item/weapon/newspaper/Topic(href, href_list)
src.curr_page--
playsound(src.loc, "pageturn", 50, 1)
- if (istype(src.loc, /mob))
+ if(istype(src.loc, /mob))
src.attack_self(src.loc)
@@ -905,9 +928,9 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob, pa
else
var/s = strip_html( input(user, "Write something", "Newspaper", "") )
s = sanitize(copytext(s, 1, MAX_MESSAGE_LEN))
- if (!s)
+ if(!s)
return
- if (!in_range(src, usr) && src.loc != usr)
+ if(!in_range(src, usr) && src.loc != usr)
return
src.scribble_page = src.curr_page
src.scribble = s
@@ -958,6 +981,7 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob, pa
/obj/machinery/newscaster/proc/newsAlert(var/news_call) //This isn't Agouri's work, for it is ugly and vile.
var/turf/T = get_turf(src) //Who the fuck uses spawn(600) anyway, jesus christ
if(news_call)
+
for(var/mob/O in hearers(world.view-1, T))
O.show_message("[src.name] beeps, \"[news_call]\" ",2)
src.alert = 1
@@ -965,7 +989,8 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob, pa
spawn(300)
src.alert = 0
src.update_icon()
- playsound(src.loc, 'sound/machines/twobeep.ogg', 75, 1)
+ if(!silence)
+ playsound(src.loc, 'sound/machines/twobeep.ogg', 75, 1)
else
for(var/mob/O in hearers(world.view-1, T))
O.show_message("[src.name] beeps, \"Attention! Wanted issue distributed!\" ",2)
diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm
index 6a4da6412f3..734bb09f60b 100644
--- a/code/game/machinery/overview.dm
+++ b/code/game/machinery/overview.dm
@@ -151,7 +151,7 @@
var/icon/I2 = imap[2+(ix + icx*iy)*2]
-// to_chat(world, "icon: \icon[I]")
+// to_chat(world, "icon: [bicon(I)]")
I.DrawBox(colour, rx, ry, rx+1, ry+1)
@@ -168,7 +168,7 @@
H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]"
-// to_chat(world, "\icon[I] at [H.screen_loc]")
+// to_chat(world, "[bicon(I)] at [H.screen_loc]")
H.name = (i==0)?"maprefresh":"map"
@@ -285,7 +285,7 @@
var/icon/I = imap[1+(ix + icx*iy)]
-// to_chat(world, "icon: \icon[I]")
+// to_chat(world, "icon: [bicon(I)]")
I.DrawBox(colour, rx, ry, rx, ry)
@@ -300,7 +300,7 @@
H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]"
-// to_chat(world, "\icon[I] at [H.screen_loc]")
+// to_chat(world, "[bicon(I)] at [H.screen_loc]")
H.name = (i==0)?"maprefresh":"map"
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index ad54eb2e8e9..afe79ca48e3 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -54,16 +54,16 @@
/obj/item/pipe/New(loc, pipe_type, dir, obj/machinery/atmospherics/make_from)
..()
- if (make_from)
+ if(make_from)
src.dir = make_from.dir
src.pipename = make_from.name
color = make_from.pipe_color
var/is_bent
- if (make_from.initialize_directions in list(NORTH|SOUTH, WEST|EAST))
+ if(make_from.initialize_directions in list(NORTH|SOUTH, WEST|EAST))
is_bent = 0
else
is_bent = 1
- if (istype(make_from, /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction))
+ if(istype(make_from, /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction))
src.pipe_type = PIPE_JUNCTION
else if(istype(make_from, /obj/machinery/atmospherics/pipe/simple/heat_exchanging))
src.pipe_type = PIPE_HE_STRAIGHT + is_bent
@@ -158,13 +158,13 @@
else
src.pipe_type = pipe_type
src.dir = dir
- if (pipe_type == PIPE_SUPPLY_STRAIGHT || pipe_type == PIPE_SUPPLY_BENT || pipe_type == PIPE_SUPPLY_MANIFOLD || pipe_type == PIPE_SUPPLY_MANIFOLD4W || pipe_type == PIPE_SUPPLY_CAP)
+ if(pipe_type == PIPE_SUPPLY_STRAIGHT || pipe_type == PIPE_SUPPLY_BENT || pipe_type == PIPE_SUPPLY_MANIFOLD || pipe_type == PIPE_SUPPLY_MANIFOLD4W || pipe_type == PIPE_SUPPLY_CAP)
connect_types = list(2)
src.color = PIPE_COLOR_BLUE
- else if (pipe_type == PIPE_SCRUBBERS_STRAIGHT || pipe_type == PIPE_SCRUBBERS_BENT || pipe_type == PIPE_SCRUBBERS_MANIFOLD || pipe_type == PIPE_SCRUBBERS_MANIFOLD4W || pipe_type == PIPE_SCRUBBERS_CAP)
+ else if(pipe_type == PIPE_SCRUBBERS_STRAIGHT || pipe_type == PIPE_SCRUBBERS_BENT || pipe_type == PIPE_SCRUBBERS_MANIFOLD || pipe_type == PIPE_SCRUBBERS_MANIFOLD4W || pipe_type == PIPE_SCRUBBERS_CAP)
connect_types = list(3)
src.color = PIPE_COLOR_RED
- else if (pipe_type == PIPE_UNIVERSAL)
+ else if(pipe_type == PIPE_UNIVERSAL)
connect_types = list(1,2,3)
update(make_from)
@@ -278,7 +278,7 @@
set name = "Rotate Pipe"
set src in view(1)
- if ( usr.stat || usr.restrained() )
+ if( usr.stat || usr.restrained() )
return
src.dir = turn(src.dir, -90)
@@ -292,10 +292,10 @@
set name = "Flip Pipe"
set src in view(1)
- if (usr.stat || usr.restrained())
+ if(usr.stat || usr.restrained())
return
- if (pipe_type in list(PIPE_GAS_FILTER, PIPE_GAS_MIXER, PIPE_TVALVE, PIPE_DTVALVE))
+ if(pipe_type in list(PIPE_GAS_FILTER, PIPE_GAS_MIXER, PIPE_TVALVE, PIPE_DTVALVE))
if(flipped)
icon_state = copytext(icon_state,3)
else
@@ -311,10 +311,10 @@
/obj/item/pipe/Move()
..()
- if (is_bent_pipe() \
+ if(is_bent_pipe() \
&& (src.dir in cardinal))
src.dir = src.dir|turn(src.dir, 90)
- else if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_UNIVERSAL, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE))
+ else if(pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_UNIVERSAL, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE))
if(dir==2)
dir = 1
else if(dir==8)
@@ -324,7 +324,7 @@
// returns all pipe's endpoints
/obj/item/pipe/proc/get_pipe_dir()
- if (!dir)
+ if(!dir)
return 0
var/direct = dir
@@ -374,7 +374,7 @@
// var/cw = turn(dir, -90)
// var/acw = turn(dir, 90)
- if (!(pipe_type in list(PIPE_HE_STRAIGHT, PIPE_HE_BENT, PIPE_JUNCTION)))
+ if(!(pipe_type in list(PIPE_HE_STRAIGHT, PIPE_HE_BENT, PIPE_JUNCTION)))
return get_pipe_dir()
switch(pipe_type)
if(PIPE_HE_STRAIGHT,PIPE_HE_BENT)
@@ -408,12 +408,12 @@
//Helper to clean up dir
/obj/item/pipe/proc/fixdir()
- if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE))
+ if(pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE))
if(dir==2)
dir = 1
else if(dir==8)
dir = 4
- else if (pipe_type in list(PIPE_MANIFOLD4W, PIPE_SUPPLY_MANIFOLD4W, PIPE_SCRUBBERS_MANIFOLD4W, PIPE_OMNI_MIXER, PIPE_OMNI_FILTER))
+ else if(pipe_type in list(PIPE_MANIFOLD4W, PIPE_SUPPLY_MANIFOLD4W, PIPE_SCRUBBERS_MANIFOLD4W, PIPE_OMNI_MIXER, PIPE_OMNI_FILTER))
dir = 2
/obj/item/pipe/attack_self(mob/user as mob)
@@ -422,10 +422,10 @@
/obj/item/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params)
..()
- if (!istype(W, /obj/item/weapon/wrench))
+ if(!istype(W, /obj/item/weapon/wrench))
return ..()
- if (!isturf(src.loc))
+ if(!isturf(src.loc))
return 1
fixdir()
@@ -461,7 +461,7 @@
if(PIPE_CONNECTOR) // connector
var/obj/machinery/atmospherics/unary/portables_connector/C = new( src.loc )
- if (pipename)
+ if(pipename)
C.name = pipename
C.construction(dir, pipe_dir, color)
@@ -500,13 +500,13 @@
if(PIPE_MVALVE) //manual valve
var/obj/machinery/atmospherics/binary/valve/V = new( src.loc)
- if (pipename)
+ if(pipename)
V.name = pipename
V.construction(dir, get_pdir(), color)
if(PIPE_DVALVE)
var/obj/machinery/atmospherics/binary/valve/digital/V = new( src.loc )
- if (pipename)
+ if(pipename)
V.name = pipename
V.construction(dir, get_pdir(), color)
@@ -526,13 +526,13 @@
if(PIPE_DTVALVE)
P = new /obj/machinery/atmospherics/trinary/tvalve/digital(src.loc)
P.flipped = flipped
- if (pipename)
+ if(pipename)
P.name = pipename
P.construction(unflip(dir), pipe_dir, color)
if(PIPE_SCRUBBER) //scrubber
var/obj/machinery/atmospherics/unary/vent_scrubber/S = new(src.loc)
- if (pipename)
+ if(pipename)
S.name = pipename
S.construction(dir, pipe_dir, color)
@@ -554,37 +554,37 @@
if(PIPE_PASSIVE_GATE) //passive gate
var/obj/machinery/atmospherics/binary/passive_gate/P = new(src.loc)
- if (pipename)
+ if(pipename)
P.name = pipename
P.construction(dir, pipe_dir, color)
if(PIPE_VOLUME_PUMP) //volume pump
var/obj/machinery/atmospherics/binary/volume_pump/P = new(src.loc)
- if (pipename)
+ if(pipename)
P.name = pipename
P.construction(dir, pipe_dir, color)
if(PIPE_HEAT_EXCHANGE) // heat exchanger
var/obj/machinery/atmospherics/unary/heat_exchanger/C = new( src.loc )
- if (pipename)
+ if(pipename)
C.name = pipename
C.construction(dir, pipe_dir, color)
if(PIPE_INJECTOR) // air injector
var/obj/machinery/atmospherics/unary/outlet_injector/P = new( src.loc )
- if (pipename)
+ if(pipename)
P.name = pipename
P.construction(dir, pipe_dir, color)
if(PIPE_DP_VENT)
var/obj/machinery/atmospherics/binary/dp_vent_pump/P = new(src.loc)
- if (pipename)
+ if(pipename)
P.name = pipename
P.construction(dir, pipe_dir, color)
if(PIPE_PASV_VENT)
var/obj/machinery/atmospherics/unary/passive_vent/P = new(src.loc)
- if (pipename)
+ if(pipename)
P.name = pipename
P.construction(dir, pipe_dir, color)
@@ -616,7 +616,7 @@
/obj/item/pipe_meter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params)
..()
- if (!istype(W, /obj/item/weapon/wrench))
+ if(!istype(W, /obj/item/weapon/wrench))
return ..()
if(!locate(/obj/machinery/atmospherics/pipe, src.loc))
to_chat(user, "\red You need to fasten it to a pipe")
@@ -636,7 +636,7 @@
/obj/item/pipe_gsensor/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
..()
- if (!istype(W, /obj/item/weapon/wrench))
+ if(!istype(W, /obj/item/weapon/wrench))
return ..()
new/obj/machinery/air_sensor( src.loc )
playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm
index 9214178e9e4..7a5ebc784b0 100644
--- a/code/game/machinery/pipe/pipe_dispenser.dm
+++ b/code/game/machinery/pipe/pipe_dispenser.dm
@@ -61,7 +61,9 @@
//What number the make points to is in the define # at the top of construction.dm in same folder
//which for some reason couldn't just be left defined, so it could be used here, top kek
- user << browse("[src] [dat] ", "window=pipedispenser")
+ var/datum/browser/popup = new(user, "pipedispenser", name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "pipedispenser")
return
@@ -99,16 +101,16 @@
/obj/machinery/pipedispenser/attackby(var/obj/item/W as obj, var/mob/user as mob, params)
src.add_fingerprint(usr)
- if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter) || istype(W, /obj/item/pipe_gsensor))
+ if(istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter) || istype(W, /obj/item/pipe_gsensor))
to_chat(usr, "\blue You put [W] back to [src].")
user.drop_item()
qdel(W)
return
- else if (istype(W, /obj/item/weapon/wrench))
- if (unwrenched==0)
+ else if(istype(W, /obj/item/weapon/wrench))
+ if(unwrenched==0)
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
to_chat(user, "\blue You begin to unfasten \the [src] from the floor...")
- if (do_after(user, 40, target = src))
+ if(do_after(user, 40, target = src))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src]. Now it can be pulled somewhere else.", \
@@ -116,12 +118,12 @@
src.anchored = 0
src.stat |= MAINT
src.unwrenched = 1
- if (usr.machine==src)
+ if(usr.machine==src)
usr << browse(null, "window=pipedispenser")
- else /*if (unwrenched==1)*/
+ else /*if(unwrenched==1)*/
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
to_chat(user, "\blue You begin to fasten \the [src] to the floor...")
- if (do_after(user, 20, target = src))
+ if(do_after(user, 20, target = src))
user.visible_message( \
"[user] fastens \the [src].", \
"\blue You have fastened \the [src]. Now it can dispense pipes.", \
@@ -155,10 +157,10 @@ Nah
if(!usr.canmove || usr.stat || usr.restrained())
return
- if (!istype(pipe) || get_dist(usr, src) > 1 || get_dist(src,pipe) > 1 )
+ if(!istype(pipe) || get_dist(usr, src) > 1 || get_dist(src,pipe) > 1 )
return
- if (pipe.anchored)
+ if(pipe.anchored)
return
qdel(pipe)
@@ -178,7 +180,9 @@ Nah
Chute
"}
- user << browse("[src] [dat] ", "window=pipedispenser")
+ var/datum/browser/popup = new(user, "pipedispenser", name, 400, 400)
+ popup.set_content(dat)
+ popup.open()
return
// 0=straight, 1=bent, 2=junction-j1, 3=junction-j2, 4=junction-y, 5=trunk
diff --git a/code/game/machinery/podmen.dm b/code/game/machinery/podmen.dm
index 54585c0eb26..c0ca39c3e12 100644
--- a/code/game/machinery/podmen.dm
+++ b/code/game/machinery/podmen.dm
@@ -57,7 +57,7 @@ Growing it to term with nothing injected will grab a ghost from the observers. *
to_chat(user, "Nothing happens.")
return
- if (!istype(source))
+ if(!istype(source))
return
if(source.ckey)
@@ -108,17 +108,17 @@ Growing it to term with nothing injected will grab a ghost from the observers. *
callHook("harvest_podman", list(podman))
switch(ticker.mode.name)
- if ("revolution")
- if (podman.mind in ticker.mode:revolutionaries)
+ if("revolution")
+ if(podman.mind in ticker.mode:revolutionaries)
ticker.mode:add_revolutionary(podman.mind)
ticker.mode:update_all_rev_icons() //So the icon actually appears
- if (podman.mind in ticker.mode:head_revolutionaries)
+ if(podman.mind in ticker.mode:head_revolutionaries)
ticker.mode:update_all_rev_icons()
- if ("nuclear emergency")
- if (podman.mind in ticker.mode:syndicates)
+ if("nuclear emergency")
+ if(podman.mind in ticker.mode:syndicates)
ticker.mode:update_all_synd_icons()
- if ("cult")
- if (podman.mind in ticker.mode:cult)
+ if("cult")
+ if(podman.mind in ticker.mode:cult)
ticker.mode:add_cultist(podman.mind)
ticker.mode:update_all_cult_icons() //So the icon actually appears
// -- End mode specific stuff
diff --git a/code/game/machinery/portable_tag_turret.dm b/code/game/machinery/portable_tag_turret.dm
index 963dc0c803a..deafad7f9b7 100644
--- a/code/game/machinery/portable_tag_turret.dm
+++ b/code/game/machinery/portable_tag_turret.dm
@@ -50,7 +50,7 @@
data["is_lethal"] = 0
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 300)
ui.set_initial_data(data)
ui.open()
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index fb1ef8c8740..83f2dfef93f 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -215,7 +215,7 @@ var/list/turret_icons
data["one_access"] = one_access
var/accesses[0]
var/list/access_list = get_all_accesses()
- for (var/access in access_list)
+ for(var/access in access_list)
var/name = get_access_desc(access)
var/active
if(one_access)
@@ -226,7 +226,7 @@ var/list/turret_icons
data["accesses"] = accesses
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 320)
ui.set_initial_data(data)
ui.open()
@@ -437,7 +437,7 @@ var/list/turret_icons
return
health -= force
- if (force > 5 && prob(45))
+ if(force > 5 && prob(45))
spark_system.start()
if(health <= 0)
die() //the death process :(
@@ -479,15 +479,15 @@ var/list/turret_icons
..()
/obj/machinery/porta_turret/ex_act(severity)
- switch (severity)
- if (1)
+ switch(severity)
+ if(1)
qdel(src)
- if (2)
- if (prob(25))
+ if(2)
+ if(prob(25))
qdel(src)
else
take_damage(initial(health) * 8) //should instakill most turrets
- if (3)
+ if(3)
take_damage(initial(health) * 8 / 3)
/obj/machinery/porta_turret/proc/die() //called when the turret dies, ie, health <= 0
diff --git a/code/game/machinery/programmable_unloader.dm b/code/game/machinery/programmable_unloader.dm
index f061f9906e6..a095d1cc93c 100644
--- a/code/game/machinery/programmable_unloader.dm
+++ b/code/game/machinery/programmable_unloader.dm
@@ -197,10 +197,10 @@
/obj/machinery/programmable/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I,/obj/item/weapon/wrench)) // code borrowed from pipe dispenser
- if (unwrenched==0)
+ if(unwrenched==0)
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
to_chat(user, "\blue You begin to unfasten \the [src] from the floor...")
- if (do_after(user, 40, target = src))
+ if(do_after(user, 40, target = src))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src]. Now it can be pulled somewhere else.", \
@@ -208,12 +208,12 @@
src.anchored = 0
src.stat |= MAINT
src.unwrenched = 1
- if (usr.machine==src)
+ if(usr.machine==src)
usr << browse(null, "window=pipedispenser")
else /* unwrenched */
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
to_chat(user, "\blue You begin to fasten \the [src] to the floor...")
- if (do_after(user, 20, target = src))
+ if(do_after(user, 20, target = src))
user.visible_message( \
"[user] fastens \the [src].", \
"\blue You fastened \the [src] into place.", \
@@ -283,7 +283,7 @@
return
/obj/machinery/programmable/process()
- if (!output || !input)
+ if(!output || !input)
return
if(!on || stat || sleep)
@@ -330,7 +330,7 @@
if(sleep)
return // something stopped the machine
- for (var/obj/A in input.contents)// I fully expect this to cause unreasonable lag
+ for(var/obj/A in input.contents)// I fully expect this to cause unreasonable lag
if(!A)
break
if(work > workmax)
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index be126aec5ff..6db7199a7f0 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -34,7 +34,7 @@
to_chat(user, "\red The [name] blinks red as you try to insert the item!")
return
- if (istype(G, /obj/item/weapon/gun/energy))
+ if(istype(G, /obj/item/weapon/gun/energy))
var/obj/item/weapon/gun/energy/E = G
if(!E.can_charge)
to_chat(user, "Your gun has no external power connector. ")
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index a1559c4fb3a..342b24fa055 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -71,14 +71,14 @@
qdel(src)
return
if(2.0)
- if (prob(50))
+ if(prob(50))
for(var/atom/movable/A as mob|obj in src)
A.forceMove(src.loc)
A.ex_act(severity)
qdel(src)
return
if(3.0)
- if (prob(25))
+ if(prob(25))
for(var/atom/movable/A as mob|obj in src)
A.forceMove(src.loc)
A.ex_act(severity)
@@ -131,7 +131,7 @@
icon_state = "borgcharger0"
/obj/machinery/recharge_station/attackby(obj/item/P as obj, mob/user as mob, params)
- if (istype(P, /obj/item/weapon/screwdriver))
+ if(istype(P, /obj/item/weapon/screwdriver))
if(src.occupant)
to_chat(user, "The maintenance panel is locked. ")
return
@@ -145,7 +145,7 @@
/obj/machinery/recharge_station/proc/process_occupant()
if(src.occupant)
- if (istype(occupant, /mob/living/silicon/robot))
+ if(istype(occupant, /mob/living/silicon/robot))
var/mob/living/silicon/robot/R = occupant
restock_modules()
if(repairs)
@@ -170,7 +170,7 @@
return
//for(var/obj/O in src)
// O.loc = src.loc
- if (src.occupant.client)
+ if(src.occupant.client)
src.occupant.client.eye = src.occupant.client.mob
src.occupant.client.perspective = MOB_PERSPECTIVE
src.occupant.loc = src.loc
@@ -216,17 +216,15 @@
if(istype(O,/obj/item/weapon/reagent_containers/food/condiment/enzyme))
if(O.reagents.get_reagent_amount("enzyme") < 50)
O.reagents.add_reagent("enzyme", 2 * coeff)
- //Medical
- if(istype(O,/obj/item/weapon/reagent_containers/glass/bottle/robot))
- var/obj/item/weapon/reagent_containers/glass/bottle/robot/B = O
- if(B.reagent && (B.reagents.get_reagent_amount(B.reagent) < B.volume))
- B.reagents.add_reagent(B.reagent, 2 * coeff)
//Janitor
if(istype(O, /obj/item/device/lightreplacer))
var/obj/item/device/lightreplacer/LR = O
var/i = 1
for(1, i <= coeff, i++)
LR.Charge(occupant)
+ if(istype(O,/obj/item/weapon/mop/advanced))
+ if(O.reagents.get_reagent_amount("water") < 40)
+ O.reagents.add_reagent("water", 0.5 * coeff)
if(R)
if(R.module)
R.module.respawn_consumable(R)
@@ -246,7 +244,7 @@
/obj/machinery/recharge_station/verb/move_eject()
set category = "Object"
set src in oview(1)
- if (usr.stat != 0)
+ if(usr.stat != 0)
return
src.go_out()
add_fingerprint(usr)
@@ -258,14 +256,14 @@
if(!user || !usr)
return
- if (usr.stat != CONSCIOUS)
+ if(usr.stat != CONSCIOUS)
return
if(get_dist(src, user) > 2 || get_dist(usr, user) > 1)
to_chat(usr, "They are too far away to put inside")
return
- if (panel_open)
+ if(panel_open)
to_chat(usr, "Close the maintenance panel first. ")
return
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index 2db551b67fa..c7ddfc84c38 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -194,7 +194,7 @@ var/const/SAFETY_COOLDOWN = 100
if(usr.stat || !usr.canmove || usr.restrained())
return
- if (src.anchored)
+ if(src.anchored)
to_chat(usr, "[src] is fastened to the floor!")
return 0
eat_dir = turn(eat_dir, 270)
@@ -210,7 +210,7 @@ var/const/SAFETY_COOLDOWN = 100
if(usr.stat || !usr.canmove || usr.restrained())
return
- if (src.anchored)
+ if(src.anchored)
to_chat(usr, "[src] is fastened to the floor!")
return 0
eat_dir = turn(eat_dir, 90)
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index bfd4939dc3b..9b2515e8914 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -72,11 +72,11 @@ var/list/obj/machinery/requests_console/allConsoles = list()
name = "[department] Requests Console"
allConsoles += src
- if (departmentType & RC_ASSIST)
+ if(departmentType & RC_ASSIST)
req_console_assistance |= department
- if (departmentType & RC_SUPPLY)
+ if(departmentType & RC_SUPPLY)
req_console_supplies |= department
- if (departmentType & RC_INFO)
+ if(departmentType & RC_INFO)
req_console_information |= department
set_light(1)
@@ -84,16 +84,16 @@ var/list/obj/machinery/requests_console/allConsoles = list()
/obj/machinery/requests_console/Destroy()
allConsoles -= src
var/lastDeptRC = 1
- for (var/obj/machinery/requests_console/Console in allConsoles)
- if (Console.department == department)
+ for(var/obj/machinery/requests_console/Console in allConsoles)
+ if(Console.department == department)
lastDeptRC = 0
break
if(lastDeptRC)
- if (departmentType & RC_ASSIST)
+ if(departmentType & RC_ASSIST)
req_console_assistance -= department
- if (departmentType & RC_SUPPLY)
+ if(departmentType & RC_SUPPLY)
req_console_supplies -= department
- if (departmentType & RC_INFO)
+ if(departmentType & RC_INFO)
req_console_information -= department
return ..()
@@ -130,7 +130,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
data["announceAuth"] = announceAuth
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "request_console.tmpl", "[department] Request Console", 520, 410)
ui.set_initial_data(data)
ui.open()
@@ -172,7 +172,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
var/log_msg = message
var/pass = 0
screen = RCS_SENTFAIL
- for (var/obj/machinery/message_server/MS in world)
+ for(var/obj/machinery/message_server/MS in world)
if(!MS.active) continue
MS.send_rc_message(ckey(href_list["department"]),department,log_msg,msgStamped,msgVerified,priority)
pass = 1
@@ -180,7 +180,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
screen = RCS_SENTPASS
message_log += "Message sent to [recipient] [message]"
else
- audible_message(text("\icon[src] *The Requests Console beeps: 'NOTICE: No server detected!'"),,4)
+ audible_message(text("[bicon(src)] *The Requests Console beeps: 'NOTICE: No server detected!'"),,4)
//Handle screen switching
if(href_list["setScreen"])
@@ -188,8 +188,8 @@ var/list/obj/machinery/requests_console/allConsoles = list()
if(tempScreen == RCS_ANNOUNCE && !announcementConsole)
return
if(tempScreen == RCS_VIEWMSGS)
- for (var/obj/machinery/requests_console/Console in allConsoles)
- if (Console.department == department)
+ for(var/obj/machinery/requests_console/Console in allConsoles)
+ if(Console.department == department)
Console.newmessagepriority = 0
Console.icon_state = "req_comp0"
Console.set_light(1)
@@ -207,7 +207,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
//err... hacking code, which has no reason for existing... but anyway... it was once supposed to unlock priority 3 messanging on that console (EXTREME priority...), but the code for that was removed.
/obj/machinery/requests_console/attackby(var/obj/item/weapon/O as obj, var/mob/user as mob)
/*
- if (istype(O, /obj/item/weapon/crowbar))
+ if(istype(O, /obj/item/weapon/crowbar))
if(open)
open = 0
icon_state="req_comp0"
@@ -217,7 +217,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
icon_state="req_comp_open"
else if(hackState == 1)
icon_state="req_comp_rewired"
- if (istype(O, /obj/item/weapon/screwdriver))
+ if(istype(O, /obj/item/weapon/screwdriver))
if(open)
if(hackState == 0)
hackState = 1
@@ -228,7 +228,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
else
to_chat(user, "You can't do much with that.")*/
- if (istype(O, /obj/item/weapon/card/id))
+ if(istype(O, /obj/item/weapon/card/id))
if(inoperable(MAINT)) return
if(screen == RCS_MESSAUTH)
var/obj/item/weapon/card/id/T = O
@@ -236,14 +236,14 @@ var/list/obj/machinery/requests_console/allConsoles = list()
updateUsrDialog()
if(screen == RCS_ANNOUNCE)
var/obj/item/weapon/card/id/ID = O
- if (access_RC_announce in ID.GetAccess())
+ if(access_RC_announce in ID.GetAccess())
announceAuth = 1
announcement.announcer = ID.assignment ? "[ID.assignment] [ID.registered_name]" : ID.registered_name
else
reset_message()
to_chat(user, "You are not authorized to send announcements. ")
updateUsrDialog()
- if (istype(O, /obj/item/weapon/stamp))
+ if(istype(O, /obj/item/weapon/stamp))
if(inoperable(MAINT)) return
if(screen == RCS_MESSAUTH)
var/obj/item/weapon/stamp/T = O
diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm
index 44455884bd8..78b873e6ca1 100644
--- a/code/game/machinery/robot_fabricator.dm
+++ b/code/game/machinery/robot_fabricator.dm
@@ -12,8 +12,8 @@
active_power_usage = 5000
/obj/machinery/robotic_fabricator/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
- if (istype(O, /obj/item/stack/sheet/metal))
- if (src.metal_amount < 150000.0)
+ if(istype(O, /obj/item/stack/sheet/metal))
+ if(src.metal_amount < 150000.0)
var/count = 0
src.overlays += "fab-load-metal"
spawn(15)
@@ -25,7 +25,7 @@
O:amount--
count++
- if (O:amount < 1)
+ if(O:amount < 1)
qdel(O)
to_chat(user, "You insert [count] metal sheet\s into the fabricator.")
@@ -35,17 +35,17 @@
to_chat(user, "The robot part maker is full. Please remove metal from the robot part maker in order to insert more.")
/obj/machinery/robotic_fabricator/power_change()
- if (powered())
+ if(powered())
stat &= ~NOPOWER
else
stat |= NOPOWER
/obj/machinery/robotic_fabricator/attack_hand(user as mob)
var/dat
- if (..())
+ if(..())
return
- if (src.operating)
+ if(src.operating)
dat = {"
Building [src.being_built.name].
Please wait until completion...
@@ -69,59 +69,59 @@ Please wait until completion...
return
/obj/machinery/robotic_fabricator/Topic(href, href_list)
- if (..())
+ if(..())
return
usr.set_machine(src)
src.add_fingerprint(usr)
- if (href_list["make"])
- if (!src.operating)
+ if(href_list["make"])
+ if(!src.operating)
var/part_type = text2num(href_list["make"])
var/build_type = ""
var/build_time = 200
var/build_cost = 25000
- switch (part_type)
- if (1)
+ switch(part_type)
+ if(1)
build_type = "/obj/item/robot_parts/l_arm"
build_time = 200
build_cost = 10000
- if (2)
+ if(2)
build_type = "/obj/item/robot_parts/r_arm"
build_time = 200
build_cost = 10000
- if (3)
+ if(3)
build_type = "/obj/item/robot_parts/l_leg"
build_time = 200
build_cost = 10000
- if (4)
+ if(4)
build_type = "/obj/item/robot_parts/r_leg"
build_time = 200
build_cost = 10000
- if (5)
+ if(5)
build_type = "/obj/item/robot_parts/chest"
build_time = 350
build_cost = 40000
- if (6)
+ if(6)
build_type = "/obj/item/robot_parts/head"
build_time = 350
build_cost = 5000
- if (7)
+ if(7)
build_type = "/obj/item/robot_parts/robot_suit"
build_time = 600
build_cost = 15000
var/building = text2path(build_type)
- if (!isnull(building))
- if (src.metal_amount >= build_cost)
+ if(!isnull(building))
+ if(src.metal_amount >= build_cost)
src.operating = 1
src.use_power = 2
@@ -133,7 +133,7 @@ Please wait until completion...
src.updateUsrDialog()
spawn (build_time)
- if (!isnull(src.being_built))
+ if(!isnull(src.being_built))
src.being_built.loc = get_turf(src)
src.being_built = null
src.use_power = 1
@@ -141,6 +141,6 @@ Please wait until completion...
src.overlays -= "fab-active"
return
- for (var/mob/M in viewers(1, src))
- if (M.client && M.machine == src)
+ for(var/mob/M in viewers(1, src))
+ if(M.client && M.machine == src)
src.attack_hand(M)
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index 323937075ad..a3f7ee5189a 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -13,7 +13,10 @@
/obj/machinery/shield/New()
src.dir = pick(1,2,3,4)
..()
+
+/obj/machinery/shield/initialize()
air_update_turf(1)
+ ..()
/obj/machinery/shield/Destroy()
opacity = 0
@@ -45,7 +48,7 @@
playsound(src.loc, 'sound/effects/EMPulse.ogg', 75, 1)
- if (src.health <= 0)
+ if(src.health <= 0)
visible_message("\blue The [src] dissipates")
qdel(src)
return
@@ -68,13 +71,13 @@
/obj/machinery/shield/ex_act(severity)
switch(severity)
if(1.0)
- if (prob(75))
+ if(prob(75))
qdel(src)
if(2.0)
- if (prob(50))
+ if(prob(50))
qdel(src)
if(3.0)
- if (prob(25))
+ if(prob(25))
qdel(src)
return
@@ -105,7 +108,7 @@
playsound(src.loc, 'sound/effects/EMPulse.ogg', 100, 1)
//Handle the destruction of the shield
- if (src.health <= 0)
+ if(src.health <= 0)
visible_message("\blue The [src] dissipates")
qdel(src)
return
@@ -151,8 +154,8 @@
update_icon()
for(var/turf/target_tile in range(2, src))
- if (istype(target_tile,/turf/space) && !(locate(/obj/machinery/shield) in target_tile))
- if (malfunction && prob(33) || !malfunction)
+ if(istype(target_tile,/turf/space) && !(locate(/obj/machinery/shield) in target_tile))
+ if(malfunction && prob(33) || !malfunction)
deployed_shields += new /obj/machinery/shield(target_tile)
/obj/machinery/shieldgen/proc/shields_down()
@@ -186,7 +189,7 @@
src.checkhp()
if(2.0)
src.health -= 30
- if (prob(15))
+ if(prob(15))
src.malfunction = 1
src.checkhp()
if(3.0)
@@ -214,15 +217,15 @@
to_chat(user, "The panel must be closed before operating this machine.")
return
- if (src.active)
- user.visible_message("\blue \icon[src] [user] deactivated the shield generator.", \
- "\blue \icon[src] You deactivate the shield generator.", \
+ if(src.active)
+ user.visible_message("\blue [bicon(src)] [user] deactivated the shield generator.", \
+ "\blue [bicon(src)] You deactivate the shield generator.", \
"You hear heavy droning fade out.")
src.shields_down()
else
if(anchored)
- user.visible_message("\blue \icon[src] [user] activated the shield generator.", \
- "\blue \icon[src] You activate the shield generator.", \
+ user.visible_message("\blue [bicon(src)] [user] activated the shield generator.", \
+ "\blue [bicon(src)] You activate the shield generator.", \
"You hear heavy droning.")
src.shields_up()
else
@@ -470,7 +473,7 @@
return
if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
- if (src.allowed(user))
+ if(src.allowed(user))
src.locked = !src.locked
to_chat(user, "Controls are now [src.locked ? "locked." : "unlocked."]")
else
@@ -602,7 +605,7 @@
if(istype(mover) && mover.checkpass(PASSGLASS))
return prob(20)
else
- if (istype(mover, /obj/item/projectile))
+ if(istype(mover, /obj/item/projectile))
return prob(10)
else
- return !src.density
\ No newline at end of file
+ return !src.density
diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm
index 8a4ef1bc330..9705ef9dedd 100644
--- a/code/game/machinery/slotmachine.dm
+++ b/code/game/machinery/slotmachine.dm
@@ -31,7 +31,7 @@
data["resultlvl"] = resultlvl
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "slotmachine.tmpl", name, 350, 200)
ui.set_initial_data(data)
ui.open()
@@ -43,9 +43,9 @@
if(href_list["ops"])
var/operation = text2num(href_list["ops"])
if(operation == 1) // Play
- if (working == 1)
+ if(working == 1)
return
- if (!account || account.money < 10)
+ if(!account || account.money < 10)
return
if(!account.charge(10, transaction_purpose = "Bet", dest_name = name))
return
@@ -55,39 +55,39 @@
var/roll = rand(1,1350)
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
spawn(25)
- if (roll == 1)
+ if(roll == 1)
visible_message("[src] says, 'JACKPOT! [usr.name] has won a MILLION CREDITS!'")
command_announcement.Announce("Congratulations to [usr.name] on winning the Jackpot of ONE MILLION CREDITS!", "Jackpot Winner")
result = "JACKPOT! You win one million credits!"
resultlvl = "highlight"
win_money(1000000, 'sound/goonstation/misc/airraid_loop.ogg')
- else if (roll > 1 && roll <= 5)
+ else if(roll > 1 && roll <= 5)
visible_message("[src] says, 'Big Winner! [usr.name] has won a hundred thousand credits!'")
command_announcement.Announce("Congratulations to [usr.name] on winning a hundred thousand credits!", "Big Winner")
result = "Big Winner! You win a hundred thousand credits!"
resultlvl = "good"
win_money(100000, 'sound/goonstation/misc/klaxon.ogg')
- else if (roll > 5 && roll <= 25)
+ else if(roll > 5 && roll <= 25)
visible_message("[src] says, 'Big Winner! [usr.name] has won ten thousand credits!'")
result = "You win ten thousand credits!"
resultlvl = "good"
win_money(10000, 'sound/goonstation/misc/klaxon.ogg')
- else if (roll > 25 && roll <= 50)
+ else if(roll > 25 && roll <= 50)
visible_message("[src] says, 'Winner! [usr.name] has won a thousand credits!'")
result = "You win a thousand credits!"
resultlvl = "good"
win_money(1000, 'sound/goonstation/misc/bell.ogg')
- else if (roll > 50 && roll <= 100)
+ else if(roll > 50 && roll <= 100)
visible_message("[src] says, 'Winner! [usr.name] has won a hundred credits!'")
result = "You win a hundred credits!"
resultlvl = "good"
win_money(100, 'sound/goonstation/misc/bell.ogg')
- else if (roll > 100 && roll <= 200)
+ else if(roll > 100 && roll <= 200)
visible_message("[src] says, 'Winner! [usr.name] has won fifty credits!'")
result = "You win fifty credits!"
resultlvl = "good"
win_money(50)
- else if (roll > 200 && roll <= 500)
+ else if(roll > 200 && roll <= 500)
visible_message("[src] says, 'Winner! [usr.name] has won ten credits!'")
result = "You win ten credits!"
resultlvl = "good"
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index 6ba798cebee..ce5ca3ce85d 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -107,9 +107,9 @@
/obj/machinery/space_heater/Topic(href, href_list)
- if (..())
+ if(..())
return 1
- if ((in_range(src, usr) && istype(src.loc, /turf)) || (istype(usr, /mob/living/silicon)))
+ if((in_range(src, usr) && istype(src.loc, /turf)) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
switch(href_list["op"])
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 9cb2c7db4d6..325977b44df 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -134,10 +134,10 @@
return 0
if(src.panelopen) //The maintenance panel is open. Time for some shady stuff
dat+= "Suit storage unit: Maintenance panel "
- dat+= "Maintenance panel controls "
+ dat+= "Maintenance panel controls "
dat+= "The panel is ridden with controls, button and meters, labeled in strange signs and symbols that you cannot understand. Probably the manufactoring world's language. Among other things, a few controls catch your eye. "
- dat+= text("A small dial with a \"ë\" symbol embroidded on it. It's pointing towards a gauge that reads [] . Turn towards [] ",(src.issuperUV ? "15nm" : "185nm"),src,(src.issuperUV ? "185nm" : "15nm") )
- dat+= text("A thick old-style button, with 2 grimy LED lights next to it. The [] LED is on. Press button ",(src.safetieson? "GREEN " : "RED "),src)
+ dat+= text("A small dial with a \"�\" symbol embroidded on it. It's pointing towards a gauge that reads []. Turn towards [] ",(src.issuperUV ? "15nm" : "185nm"),src,(src.issuperUV ? "185nm" : "15nm") )
+ dat+= text("A thick old-style button, with 2 grimy LED lights next to it. The [] LED is on.Press button ",(src.safetieson? "GREEN " : "RED "),src)
dat+= text("Close panel ", user)
//user << browse(dat, "window=ssu_m_panel;size=400x500")
//onclose(user, "ssu_m_panel")
@@ -150,26 +150,24 @@
else
if(!src.isbroken)
- dat+= "Suit storage unit "
- dat+= "U-Stor-It Suit Storage Unit, model DS1900 "
dat+= "Welcome to the Unit control panel. "
- dat+= text("Helmet storage compartment: [] ",(src.HELMET ? HELMET.name : "No helmet detected.") )
+ dat+= text("Helmet storage compartment: [] ",(src.HELMET ? HELMET.name : " No helmet detected.") )
if(HELMET && src.isopen)
dat+=text("Dispense helmet ",src)
- dat+= text("Suit storage compartment: [] ",(src.SUIT ? SUIT.name : " No exosuit detected.") )
+ dat+= text("Suit storage compartment: [] ",(src.SUIT ? SUIT.name : " No exosuit detected.") )
if(SUIT && src.isopen)
dat+=text("Dispense suit ",src)
- dat+= text("Breathmask storage compartment: [] ",(src.MASK ? MASK.name : " No breathmask detected.") )
+ dat+= text("Breathmask storage compartment: [] ",(src.MASK ? MASK.name : " No breathmask detected.") )
if(MASK && src.isopen)
dat+=text("Dispense mask ",src)
if(src.OCCUPANT)
dat+= "WARNING: Biological entity detected inside the Unit's storage. Please remove. "
dat+= "Eject extra load "
- dat+= text("Unit is: [] - [] Unit ",(src.isopen ? "Open" : "Closed"),src,(src.isopen ? "Close" : "Open"))
+ dat+= text(" Unit is: [] - [] Unit ",(src.isopen ? "Open" : "Closed"),src,(src.isopen ? "Close" : "Open"))
if(src.isopen)
dat+=" "
else
- dat+= text(" - *[] Unit* ",src,(src.islocked ? "Unlock" : "Lock") )
+ dat+= text(" - *[] Unit* ",src,(src.islocked ? "Unlock" : "Lock") )
dat+= text("Unit status: []",(src.islocked? "**LOCKED** " : "**UNLOCKED** ") )
dat+= text("Start Disinfection cycle ",src)
dat += text("Close control panel ", user)
@@ -182,7 +180,9 @@
//user << browse(dat, "window=suit_storage_unit;size=400x500")
//onclose(user, "suit_storage_unit")
- user << browse(dat, "window=suit_storage_unit;size=400x500")
+ var/datum/browser/popup = new(user, "suit_storage_unit", name, 400, 500)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "suit_storage_unit")
return
@@ -190,45 +190,45 @@
/obj/machinery/suit_storage_unit/Topic(href, href_list) //I fucking HATE this proc
if(..())
return 1
- if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai)))
+ if((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai)))
usr.set_machine(src)
- if (href_list["toggleUV"])
+ if(href_list["toggleUV"])
src.toggleUV(usr)
src.updateUsrDialog()
src.update_icon()
- if (href_list["togglesafeties"])
+ if(href_list["togglesafeties"])
src.togglesafeties(usr)
src.updateUsrDialog()
src.update_icon()
- if (href_list["dispense_helmet"])
+ if(href_list["dispense_helmet"])
src.dispense_helmet(usr)
src.updateUsrDialog()
src.update_icon()
- if (href_list["dispense_suit"])
+ if(href_list["dispense_suit"])
src.dispense_suit(usr)
src.updateUsrDialog()
src.update_icon()
- if (href_list["dispense_mask"])
+ if(href_list["dispense_mask"])
src.dispense_mask(usr)
src.updateUsrDialog()
src.update_icon()
- if (href_list["toggle_open"])
+ if(href_list["toggle_open"])
src.toggle_open(usr)
src.updateUsrDialog()
src.update_icon()
- if (href_list["toggle_lock"])
+ if(href_list["toggle_lock"])
src.toggle_lock(usr)
src.updateUsrDialog()
src.update_icon()
- if (href_list["start_UV"])
+ if(href_list["start_UV"])
src.start_UV(usr)
src.updateUsrDialog()
src.update_icon()
- if (href_list["eject_guy"])
+ if(href_list["eject_guy"])
src.eject_occupant(usr)
src.updateUsrDialog()
src.update_icon()
- /*if (href_list["refresh"])
+ /*if(href_list["refresh"])
src.updateUsrDialog()*/
src.add_fingerprint(usr)
return
@@ -430,15 +430,15 @@
/obj/machinery/suit_storage_unit/proc/eject_occupant(mob/user as mob)
- if (src.islocked)
+ if(src.islocked)
return
- if (!src.OCCUPANT)
+ if(!src.OCCUPANT)
return
// for(var/obj/O in src)
// O.loc = src.loc
- if (src.OCCUPANT.client)
+ if(src.OCCUPANT.client)
if(user != OCCUPANT)
to_chat(OCCUPANT, "The machine kicks you out! ")
if(user.loc != src.loc)
@@ -459,7 +459,7 @@
set category = "Object"
set src in oview(1)
- if (usr.stat != 0)
+ if(usr.stat != 0)
return
src.eject_occupant(usr)
add_fingerprint(usr)
@@ -473,15 +473,15 @@
set category = "Object"
set src in oview(1)
- if (usr.stat != 0)
+ if(usr.stat != 0)
return
- if (!src.isopen)
+ if(!src.isopen)
to_chat(usr, "The unit's doors are shut. ")
return
- if (!src.ispowered || src.isbroken)
+ if(!src.ispowered || src.isbroken)
to_chat(usr, "The unit is not operational. ")
return
- if ( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) )
+ if( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) )
to_chat(usr, "It's too cluttered inside for you to fit in! ")
return
visible_message("[usr] starts squeezing into the suit storage unit!")
@@ -515,24 +515,24 @@
to_chat(user, text("You [] the unit's maintenance panel. ",(src.panelopen ? "open up" : "close") ))
src.updateUsrDialog()
return
- if ( istype(I, /obj/item/weapon/grab) )
+ if( istype(I, /obj/item/weapon/grab) )
var/obj/item/weapon/grab/G = I
if( !(ismob(G.affecting)) )
return
- if (!src.isopen)
+ if(!src.isopen)
to_chat(usr, "The unit's doors are shut. ")
return
- if (!src.ispowered || src.isbroken)
+ if(!src.ispowered || src.isbroken)
to_chat(usr, "The unit is not operational. ")
return
- if ( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) ) //Unit needs to be absolutely empty
+ if( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) ) //Unit needs to be absolutely empty
to_chat(user, "The unit's storage area is too cluttered. ")
return
visible_message("[user] starts putting [G.affecting.name] into the Suit Storage Unit.")
if(do_after(user, 20, target = G:affecting))
if(!G || !G.affecting) return //derpcheck
var/mob/M = G.affecting
- if (M.client)
+ if(M.client)
M.client.perspective = EYE_PERSPECTIVE
M.client.eye = src
M.loc = src
@@ -690,7 +690,7 @@
if(do_after(user, 20, target = G:affecting))
if(!G || !G.affecting) return
var/mob/M = G.affecting
- if (M.client)
+ if(M.client)
M.client.perspective = EYE_PERSPECTIVE
M.client.eye = src
M.loc = src
@@ -838,7 +838,9 @@
dat += "The red light is [safeties ? "blinking" : "off"]. "
dat += "The yellow light is [locked ? "on" : "off"]. " */
- user << browse(dat, "window=suit_cycler")
+ var/datum/browser/popup = new(user, "suit_cycler", name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "suit_cycler")
return
@@ -909,22 +911,22 @@
if(radiation_level > 1)
suit.clean_blood()
-/* else if ((href_list["cutwire"]) && (src.panel_open))
+/* else if((href_list["cutwire"]) && (src.panel_open))
var/twire = text2num(href_list["cutwire"])
- if (!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) ))
+ if(!( istype(usr.get_active_hand(), /obj/item/weapon/wirecutters) ))
to_chat(usr, "You need wirecutters!")
return
- if (src.isWireColorCut(twire))
+ if(src.isWireColorCut(twire))
src.mend(twire)
else
src.cut(twire)
- else if ((href_list["pulsewire"]) && (src.panel_open))
+ else if((href_list["pulsewire"]) && (src.panel_open))
var/twire = text2num(href_list["pulsewire"])
- if (!istype(usr.get_active_hand(), /obj/item/device/multitool))
+ if(!istype(usr.get_active_hand(), /obj/item/device/multitool))
to_chat(usr, "You need a multitool!")
return
- if (src.isWireColorCut(twire))
+ if(src.isWireColorCut(twire))
to_chat(usr, "You can't pulse a cut wire.")
return
else
@@ -983,7 +985,7 @@
set category = "Object"
set src in oview(1)
- if (usr.stat != 0)
+ if(usr.stat != 0)
return
eject_occupant(usr)
@@ -994,10 +996,10 @@
to_chat(user, "\red The cycler is locked.")
return
- if (!occupant)
+ if(!occupant)
return
- if (occupant.client)
+ if(occupant.client)
occupant.client.eye = occupant.client.mob
occupant.client.perspective = MOB_PERSPECTIVE
@@ -1029,7 +1031,7 @@
safeties = 0
if(WIRE_SHOCK)
electrified = -1
- if (WIRE_SCANID)
+ if(WIRE_SCANID)
locked = 0
/obj/machinery/suit_cycler/proc/mend(var/wireColor)
@@ -1047,7 +1049,7 @@
safeties = !locked
if(WIRE_SHOCK)
electrified = 30
- if (WIRE_SCANID)
+ if(WIRE_SCANID)
locked = !locked
*/
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index 96db973ab21..db4cb0271c0 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -88,7 +88,7 @@
payload = null
else
to_chat(user, "There isn't anything in here to remove! ")
- else if (open_panel)
+ else if(open_panel)
to_chat(user, "The wires conneting the shell to the explosives are holding it down! ")
else
to_chat(user, "The cover is screwed on, it won't pry off! ")
@@ -126,14 +126,14 @@
newtime = Clamp(newtime, 120, 60000)
if(in_range(src, user) && isliving(user)) //No running off and setting bombs from across the station
timer = newtime
- src.loc.visible_message("\icon[src] timer set for [timer] seconds. ")
+ src.loc.visible_message("[bicon(src)] timer set for [timer] 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("\icon[src] Device error: User intervention required. ")
+ src.loc.visible_message("[bicon(src)] Device error: User intervention required. ")
return
else
- src.loc.visible_message("\icon[src] [timer] seconds until detonation, please clear the area. ")
+ src.loc.visible_message("[bicon(src)] [timer] seconds until detonation, please clear the area. ")
playsound(loc, 'sound/machines/click.ogg', 30, 1)
active = 1
update_icon()
@@ -180,7 +180,7 @@
icon = 'icons/obj/assemblies.dmi'
icon_state = "bombcore"
item_state = "eshield0"
- w_class = 3.0
+ w_class = 3
origin_tech = "syndicate=6;combat=5"
var/adminlog = null
@@ -223,7 +223,7 @@
var/obj/machinery/syndicatebomb/holder = src.loc
if(istype(holder))
attempts++
- holder.loc.visible_message("\icon[holder] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires... ")
+ holder.loc.visible_message("[bicon(holder)] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires... ")
reset()
else
qdel(src)
@@ -233,7 +233,7 @@
if(istype(holder))
attempts++
defusals++
- holder.loc.visible_message("\icon[holder] Alert: Bomb has been defused. Your score is now [defusals] for [attempts]! Resetting wires in 5 seconds... ")
+ holder.loc.visible_message("[bicon(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()
@@ -296,7 +296,7 @@
icon = 'icons/obj/assemblies.dmi'
icon_state = "bigred"
item_state = "electronic"
- w_class = 1.0
+ w_class = 1
origin_tech = "syndicate=2"
var/cooldown = 0
var/detonated = 0
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index 5d6aa95b56f..4d90971f003 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -234,7 +234,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
if(data == 1)
- for (var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"])
+ for(var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"])
if(R.receive_range(display_freq, level) > -1)
radios += R
@@ -242,7 +242,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
else if(data == 2)
- for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
+ for(var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
if(istype(R, /obj/item/device/radio/headset))
continue
@@ -255,7 +255,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
else if(data == 3)
for(var/antag_freq in ANTAG_FREQS)
var/datum/radio_frequency/antag_connection = radio_controller.return_frequency(antag_freq)
- for (var/obj/item/device/radio/R in antag_connection.devices["[RADIO_CHAT]"])
+ for(var/obj/item/device/radio/R in antag_connection.devices["[RADIO_CHAT]"])
if(R.receive_range(antag_freq, level) > -1)
radios += R
@@ -263,7 +263,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
else
- for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
+ for(var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
if(R.receive_range(display_freq, level) > -1)
radios += R
@@ -281,11 +281,11 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
var/list/heard_garbled = list() // garbled message (ie "f*c* **u, **i*er!")
var/list/heard_gibberish= list() // completely screwed over message (ie "F%! (O*# *#!<>&**%!")
- for (var/mob/R in receive)
+ for(var/mob/R in receive)
/* --- Loop through the receivers and categorize them --- */
- if (R.client && R.client.holder && !(R.client.prefs.toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
+ if(R.client && R.client.holder && !(R.client.prefs.toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
continue
if(istype(R, /mob/new_player)) // we don't want new players to hear messages. rare but generates runtimes.
@@ -302,10 +302,10 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// --- Can understand the speech ---
- if (!M || R.say_understands(M))
+ if(!M || R.say_understands(M))
// - Not human or wearing a voice mask -
- if (!M || !ishuman(M) || vmask)
+ if(!M || !ishuman(M) || vmask)
heard_masked += R
// - Human and not wearing voice mask -
@@ -316,7 +316,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
else
// - The speaker has a prespecified "voice message" to display if not understood -
- if (vmessage)
+ if(vmessage)
heard_voice += R
// - Just display a garbled message -
@@ -325,7 +325,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
/* ###### Begin formatting and sending the message ###### */
- if (length(heard_masked) || length(heard_normal) || length(heard_voice) || length(heard_garbled) || length(heard_gibberish))
+ if(length(heard_masked) || length(heard_normal) || length(heard_voice) || length(heard_garbled) || length(heard_gibberish))
/* --- Some miscellaneous variables to format the string output --- */
var/freq_text = get_frequency_name(display_freq)
@@ -333,7 +333,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
var/part_b_extra = ""
if(data == 3) // intercepted radio message
part_b_extra = " (Intercepted) "
- var/part_a = "\icon[radio]\[[freq_text]\][part_b_extra] " // goes in the actual output
+ var/part_a = "[bicon(radio)]\[[freq_text]\][part_b_extra] " // goes in the actual output
// --- Some more pre-message formatting ---
var/part_b = " " // Tweaked for security headsets -- TLE
@@ -387,34 +387,34 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
/* --- Process all the mobs that heard a masked voice (understood) --- */
- if (length(heard_masked))
- for (var/mob/R in heard_masked)
+ if(length(heard_masked))
+ for(var/mob/R in heard_masked)
R.hear_radio(message,verbage, speaking, part_a, part_b, M, 0, name, follow_target=follow_target)
/* --- Process all the mobs that heard the voice normally (understood) --- */
- if (length(heard_normal))
- for (var/mob/R in heard_normal)
+ if(length(heard_normal))
+ for(var/mob/R in heard_normal)
R.hear_radio(message, verbage, speaking, part_a, part_b, M, 0, realname, follow_target=follow_target)
/* --- Process all the mobs that heard the voice normally (did not understand) --- */
- if (length(heard_voice))
- for (var/mob/R in heard_voice)
+ if(length(heard_voice))
+ for(var/mob/R in heard_voice)
R.hear_radio(message,verbage, speaking, part_a, part_b, M,0, vname, follow_target=follow_target)
/* --- Process all the mobs that heard a garbled voice (did not understand) --- */
// Displays garbled message (ie "f*c* **u, **i*er!")
- if (length(heard_garbled))
- for (var/mob/R in heard_garbled)
+ if(length(heard_garbled))
+ for(var/mob/R in heard_garbled)
R.hear_radio(message, verbage, speaking, part_a, part_b, M, 1, vname, follow_target=follow_target)
/* --- Complete gibberish. Usually happens when there's a compressed message --- */
- if (length(heard_gibberish))
- for (var/mob/R in heard_gibberish)
+ if(length(heard_gibberish))
+ for(var/mob/R in heard_gibberish)
R.hear_radio(message, verbage, speaking, part_a, part_b, M, 1, follow_target=follow_target)
return 1
@@ -437,7 +437,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// --- Broadcast only to intercom devices ---
if(data == 1)
- for (var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"])
+ for(var/obj/item/device/radio/intercom/R in connection.devices["[RADIO_CHAT]"])
var/turf/position = get_turf(R)
if(position && position.z == level)
receive |= R.send_hear(display_freq, level)
@@ -446,7 +446,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// --- Broadcast only to intercoms and station-bounced radios ---
else if(data == 2)
- for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
+ for(var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
if(istype(R, /obj/item/device/radio/headset))
continue
@@ -460,7 +460,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
else if(data == 3)
for(var/freq in ANTAG_FREQS)
var/datum/radio_frequency/antag_connection = radio_controller.return_frequency(freq)
- for (var/obj/item/device/radio/R in antag_connection.devices["[RADIO_CHAT]"])
+ for(var/obj/item/device/radio/R in antag_connection.devices["[RADIO_CHAT]"])
var/turf/position = get_turf(R)
if(position && position.z == level)
receive |= R.send_hear(freq)
@@ -469,7 +469,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// --- Broadcast to ALL radio devices ---
else
- for (var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
+ for(var/obj/item/device/radio/R in connection.devices["[RADIO_CHAT]"])
var/turf/position = get_turf(R)
if(position && position.z == level)
receive |= R.send_hear(display_freq)
@@ -484,11 +484,11 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
var/list/heard_garbled = list() // garbled message (ie "f*c* **u, **i*er!")
var/list/heard_gibberish= list() // completely screwed over message (ie "F%! (O*# *#!<>&**%!")
- for (var/mob/R in receive)
+ for(var/mob/R in receive)
/* --- Loop through the receivers and categorize them --- */
- if (R.client && !(R.client.prefs.toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
+ if(R.client && !(R.client.prefs.toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
continue
@@ -500,7 +500,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// --- Can understand the speech ---
- if (R.say_understands(M))
+ if(R.say_understands(M))
heard_normal += R
@@ -513,7 +513,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
/* ###### Begin formatting and sending the message ###### */
- if (length(heard_normal) || length(heard_garbled) || length(heard_gibberish))
+ if(length(heard_normal) || length(heard_garbled) || length(heard_gibberish))
/* --- Some miscellaneous variables to format the string output --- */
var/part_a = "" // goes in the actual output
@@ -528,7 +528,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
// Create a radio headset for the sole purpose of using its icon
var/obj/item/device/radio/headset/radio = new
- var/part_b = " \icon[radio]\[[freq_text]\][part_b_extra] " // Tweaked for security headsets -- TLE
+ var/part_b = " [bicon(radio)]\[[freq_text]\][part_b_extra] " // Tweaked for security headsets -- TLE
var/part_blackbox_b = " \[[freq_text]\] "
var/part_c = " "
@@ -566,30 +566,30 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
/* --- Process all the mobs that heard the voice normally (understood) --- */
- if (length(heard_normal))
+ if(length(heard_normal))
var/rendered = "[part_a][source][part_b]\"[text]\"[part_c]"
- for (var/mob/R in heard_normal)
+ for(var/mob/R in heard_normal)
R.show_message(rendered, 2)
/* --- Process all the mobs that heard a garbled voice (did not understand) --- */
// Displays garbled message (ie "f*c* **u, **i*er!")
- if (length(heard_garbled))
+ if(length(heard_garbled))
var/quotedmsg = "\"[stars(text)]\""
var/rendered = "[part_a][source][part_b][quotedmsg][part_c]"
- for (var/mob/R in heard_garbled)
+ for(var/mob/R in heard_garbled)
R.show_message(rendered, 2)
/* --- Complete gibberish. Usually happens when there's a compressed message --- */
- if (length(heard_gibberish))
+ if(length(heard_gibberish))
var/quotedmsg = "\"[Gibberish(text, compression + 50)]\""
var/rendered = "[part_a][Gibberish(source, compression + 50)][part_b][quotedmsg][part_c]"
- for (var/mob/R in heard_gibberish)
+ for(var/mob/R in heard_gibberish)
R.show_message(rendered, 2)
//Use this to test if an obj can communicate with a Telecommunications Network
diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm
index 5e46a20dd6d..a97e5a7d4c2 100644
--- a/code/game/machinery/telecomms/logbrowser.dm
+++ b/code/game/machinery/telecomms/logbrowser.dm
@@ -224,12 +224,12 @@
if(istype(D, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
if(do_after(user, 20, target = src))
- if (src.stat & BROKEN)
+ if(src.stat & BROKEN)
to_chat(user, "\blue The broken glass falls out.")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
new /obj/item/weapon/shard(loc)
var/obj/item/weapon/circuitboard/comm_server/M = new /obj/item/weapon/circuitboard/comm_server( A )
- for (var/obj/C in src)
+ for(var/obj/C in src)
C.loc = src.loc
A.circuit = M
A.state = 3
@@ -240,7 +240,7 @@
to_chat(user, "\blue You disconnect the monitor.")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
var/obj/item/weapon/circuitboard/comm_server/M = new /obj/item/weapon/circuitboard/comm_server( A )
- for (var/obj/C in src)
+ for(var/obj/C in src)
C.loc = src.loc
A.circuit = M
A.state = 4
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index 290e3352ea8..787483ac45d 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -145,6 +145,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
listening_level = position.z
/obj/machinery/telecomms/initialize()
+ ..()
if(autolinkers.len)
// Links nearby machines
if(!long_range_link)
@@ -584,10 +585,3 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
var/name = "data packet (#)"
var/garbage_collector = 1 // if set to 0, will not be garbage collected
var/input_type = "Speech File"
-
-
-
-
-
-
-
diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm
index 16528b73d0e..57136b46dc9 100644
--- a/code/game/machinery/telecomms/telemonitor.dm
+++ b/code/game/machinery/telecomms/telemonitor.dm
@@ -130,12 +130,12 @@
if(istype(D, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
if(do_after(user, 20, target = src))
- if (src.stat & BROKEN)
+ if(src.stat & BROKEN)
to_chat(user, "\blue The broken glass falls out.")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
new /obj/item/weapon/shard(loc)
var/obj/item/weapon/circuitboard/comm_monitor/M = new /obj/item/weapon/circuitboard/comm_monitor( A )
- for (var/obj/C in src)
+ for(var/obj/C in src)
C.loc = src.loc
A.circuit = M
A.state = 3
@@ -146,7 +146,7 @@
to_chat(user, "\blue You disconnect the monitor.")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
var/obj/item/weapon/circuitboard/comm_monitor/M = new /obj/item/weapon/circuitboard/comm_monitor( A )
- for (var/obj/C in src)
+ for(var/obj/C in src)
C.loc = src.loc
A.circuit = M
A.state = 4
diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm
index a5ee6631037..dbbf6682e4e 100644
--- a/code/game/machinery/telecomms/traffic_control.dm
+++ b/code/game/machinery/telecomms/traffic_control.dm
@@ -342,12 +342,12 @@
if(istype(D, /obj/item/weapon/screwdriver))
playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
if(do_after(user, 20, target = src))
- if (src.stat & BROKEN)
+ if(src.stat & BROKEN)
to_chat(user, "\blue The broken glass falls out.")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
new /obj/item/weapon/shard(loc)
var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A )
- for (var/obj/C in src)
+ for(var/obj/C in src)
C.loc = src.loc
A.circuit = M
A.state = 3
@@ -358,7 +358,7 @@
to_chat(user, "\blue You disconnect the monitor.")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
var/obj/item/weapon/circuitboard/comm_traffic/M = new /obj/item/weapon/circuitboard/comm_traffic( A )
- for (var/obj/C in src)
+ for(var/obj/C in src)
C.loc = src.loc
A.circuit = M
A.state = 4
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index 9c1d90ce67a..63aeb4e25ee 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -20,11 +20,12 @@
return
/obj/machinery/computer/teleporter/initialize()
+ ..()
link_power_station()
update_icon()
/obj/machinery/computer/teleporter/Destroy()
- if (power_station)
+ if(power_station)
power_station.teleporter_console = null
power_station = null
return ..()
@@ -88,7 +89,7 @@
// Set up the Nano UI
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "teleporter_console.tmpl", "Teleporter Console UI", 400, 400)
ui.set_initial_data(data)
ui.open()
@@ -179,7 +180,7 @@
for(var/obj/item/device/radio/beacon/R in beacons)
var/turf/T = get_turf(R)
- if (!T)
+ if(!T)
continue
if((T.z in config.admin_levels) || T.z > 7)
continue
@@ -192,13 +193,13 @@
areaindex[tmpname] = 1
L[tmpname] = R
- for (var/obj/item/weapon/implant/tracking/I in tracked_implants)
- if (!I.implanted || !ismob(I.loc))
+ for(var/obj/item/weapon/implant/tracking/I in tracked_implants)
+ if(!I.implanted || !ismob(I.loc))
continue
else
var/mob/M = I.loc
- if (M.stat == 2)
- if (M.timeofdeath + 6000 < world.time)
+ if(M.stat == 2)
+ if(M.timeofdeath + 6000 < world.time)
continue
var/turf/T = get_turf(M)
if(!T) continue
@@ -222,7 +223,7 @@
return
for(var/obj/machinery/teleport/station/R in S)
var/turf/T = get_turf(R)
- if (!T || !R.teleporter_hub || !R.teleporter_console)
+ if(!T || !R.teleporter_hub || !R.teleporter_console)
continue
if((T.z in config.admin_levels) || T.z > 7)
continue
@@ -247,7 +248,7 @@
return
/proc/find_loc(obj/R as obj)
- if (!R) return null
+ if(!R) return null
var/turf/T = R.loc
while(!istype(T, /turf))
T = T.loc
@@ -270,6 +271,7 @@
active_power_usage = 2000
var/obj/machinery/teleport/station/power_station
var/calibrated //Calibration prevents mutation
+ var/admin_usage = 0 // if 1, works on z2. If 0, doesn't. Used for admin room teleport.
/obj/machinery/teleport/hub/New()
..()
@@ -293,10 +295,11 @@
RefreshParts()
/obj/machinery/teleport/hub/initialize()
+ ..()
link_power_station()
/obj/machinery/teleport/hub/Destroy()
- if (power_station)
+ if(power_station)
power_station.teleporter_hub = null
power_station = null
return ..()
@@ -317,7 +320,7 @@
return power_station
/obj/machinery/teleport/hub/Bumped(M as mob|obj)
- if(z == ZLEVEL_CENTCOMM)
+ if(z == ZLEVEL_CENTCOMM && !admin_usage)
to_chat(M, "You can't use this here.")
return
if(power_station && power_station.engaged && !panel_open)
@@ -350,12 +353,12 @@
/obj/machinery/teleport/hub/proc/teleport(atom/movable/M as mob|obj, turf/T)
var/obj/machinery/computer/teleporter/com = power_station.teleporter_console
- if (!com)
+ if(!com)
return
- if (!com.target)
+ if(!com.target)
visible_message("Cannot authenticate locked on coordinates. Please reinstate coordinate matrix. ")
return
- if (istype(M, /atom/movable))
+ if(istype(M, /atom/movable))
if(!calibrated && prob(25 - ((accurate) * 10))) //oh dear a problem
do_teleport(M, locate(rand((2*TRANSITIONEDGE), world.maxx - (2*TRANSITIONEDGE)), rand((2*TRANSITIONEDGE), world.maxy - (2*TRANSITIONEDGE)), 3), 2)
else
@@ -379,7 +382,7 @@
use_power = 1
idle_power_usage = 10
active_power_usage = 2000
-
+
var/target
var/tele_delay = 50
@@ -414,7 +417,7 @@
else
do_teleport(M, target)
use_power(5000)
-
+
if(tele_delay)
recalibrating = 1
update_icon()
@@ -471,6 +474,7 @@
link_console_and_hub()
/obj/machinery/teleport/station/initialize()
+ ..()
link_console_and_hub()
/obj/machinery/teleport/station/RefreshParts()
@@ -498,7 +502,7 @@
teleporter_hub.power_station = null
teleporter_hub.update_icon()
teleporter_hub = null
- if (teleporter_console)
+ if(teleporter_console)
teleporter_console.power_station = null
teleporter_console = null
return ..()
@@ -548,12 +552,12 @@
to_chat(user, "Close the maintenance panel first. ")
/obj/machinery/teleport/station/proc/toggle(mob/user)
- if (stat & (BROKEN|NOPOWER) || !teleporter_hub || !teleporter_console)
+ if(stat & (BROKEN|NOPOWER) || !teleporter_hub || !teleporter_console)
return
- if (teleporter_hub.panel_open)
+ if(teleporter_hub.panel_open)
to_chat(user, "Close the hub's maintenance panel first. ")
return
- if (teleporter_console.target)
+ if(teleporter_console.target)
src.engaged = !src.engaged
use_power(5000)
visible_message("Teleporter [engaged ? "" : "dis"]engaged! ")
diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm
index d117961ff88..f34e28dcd18 100644
--- a/code/game/machinery/transformer.dm
+++ b/code/game/machinery/transformer.dm
@@ -227,7 +227,7 @@
playsound(src.loc, 'sound/effects/alert.ogg', 50, 0)
sleep(5)
H.apply_effect((rand(150,200)),IRRADIATE,0)
- if (prob(5))
+ if(prob(5))
if(prob(75))
randmutb(H) // Applies bad mutation
domutcheck(H,null,1)
@@ -244,7 +244,7 @@
badcount++
for(var/obj/item/weapon/kitchen/knife/K in src.loc)
badcount++
- for(var/obj/item/weapon/c4/KK in src.loc)
+ for(var/obj/item/weapon/grenade/plastic/c4/KK in src.loc)
badcount++
for(var/obj/item/weapon/melee/ML in src.loc)
badcount++
diff --git a/code/game/machinery/turntable.dm b/code/game/machinery/turntable.dm
index bb69783db22..9b5f37d33bb 100644
--- a/code/game/machinery/turntable.dm
+++ b/code/game/machinery/turntable.dm
@@ -53,7 +53,7 @@
//for(var/mob/M in world)
// if(M.loc.loc == src.loc.loc && M.music == 0)
// to_chat(world, "Found the song...")
-// to_chat(M, S)
+// M << S
// M.music = 1
var/area/A = src.loc.loc
@@ -64,12 +64,12 @@
for(var/mob/M in world)
if((M.loc.loc in A) && M.music == 0)
// to_chat(world, "Found the song...")
- to_chat(M, S)
+ M << S
M.music = 1
else if(!(M.loc.loc in A) && M.music == 1)
var/sound/Soff = sound(null)
Soff.channel = 10
- to_chat(M, Soff)
+ M << Soff
M.music = 0
sleep(10)
return
@@ -85,7 +85,7 @@
//for(var/mob/M in world)
// if(M.loc.loc == src.loc.loc && M.music == 0)
// to_chat(world, "Found the song...")
-// to_chat(M, S)
+// M << S
// M.music = 1
var/area/A = src.loc.loc
for(var/obj/machinery/party/lasermachine/L in A)
@@ -95,12 +95,12 @@
for(var/mob/M in world)
if(M.loc.loc == src.loc.loc && M.music == 0)
// to_chat(world, "Found the song...")
- to_chat(M, S)
+ M << S
M.music = 1
else if(M.loc.loc != src.loc.loc && M.music == 1)
var/sound/Soff = sound(null)
Soff.channel = 10
- to_chat(M, Soff)
+ M << Soff
M.music = 0
sleep(10)
return
@@ -116,7 +116,7 @@
//for(var/mob/M in world)
// if(M.loc.loc == src.loc.loc && M.music == 0)
// to_chat(world, "Found the song...")
-// to_chat(M, S)
+// M << S
// M.music = 1
var/area/A = src.loc.loc
for(var/obj/machinery/party/lasermachine/L in A)
@@ -126,12 +126,12 @@
for(var/mob/M in world)
if(M.loc.loc == src.loc.loc && M.music == 0)
// to_chat(world, "Found the song...")
- to_chat(M, S)
+ M << S
M.music = 1
else if(M.loc.loc != src.loc.loc && M.music == 1)
var/sound/Soff = sound(null)
Soff.channel = 10
- to_chat(M, Soff)
+ M << Soff
M.music = 0
sleep(10)
return
@@ -143,7 +143,7 @@
S.channel = 10
S.wait = 1
for(var/mob/M in world)
- to_chat(M, S)
+ M << S
M.music = 0
playing = 0
var/area/A = src.loc.loc
diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm
index 0deb0d947a3..d27df18523a 100644
--- a/code/game/machinery/turret_control.dm
+++ b/code/game/machinery/turret_control.dm
@@ -45,6 +45,7 @@
return ..()
/obj/machinery/turretid/initialize()
+ ..()
if(!control_area)
control_area = get_area(src)
else if(istext(control_area))
@@ -136,7 +137,7 @@
data["settings"] = settings
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 300)
ui.set_initial_data(data)
ui.open()
@@ -184,7 +185,7 @@
TC.ailock = ailock
if(istype(control_area))
- for (var/obj/machinery/porta_turret/aTurret in control_area)
+ for(var/obj/machinery/porta_turret/aTurret in control_area)
aTurret.setState(TC)
update_icon()
@@ -199,8 +200,8 @@
if(stat & NOPOWER)
icon_state = "control_off"
set_light(0)
- else if (enabled)
- if (lethal)
+ else if(enabled)
+ if(lethal)
icon_state = "control_kill"
set_light(1.5, 1,"#990000")
else
diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm
index f0b6ce34ef7..2589f2620c4 100644
--- a/code/game/machinery/turrets.dm
+++ b/code/game/machinery/turrets.dm
@@ -97,8 +97,8 @@
icon_state = "grey_target_prism"
else
if( powered() )
- if (src.enabled)
- if (src.lasers)
+ if(src.enabled)
+ if(src.lasers)
icon_state = "orange_target_prism"
else
icon_state = "target_prism"
@@ -219,10 +219,10 @@
/obj/machinery/turret/proc/shootAt(var/atom/movable/target)
var/turf/T = get_turf(src)
var/turf/U = get_turf(target)
- if (!T || !U)
+ if(!T || !U)
return
var/obj/item/projectile/A
- if (src.lasers)
+ if(src.lasers)
switch(lasertype)
if(1)
A = new /obj/item/projectile/beam(loc)
@@ -236,7 +236,6 @@
A = new /obj/item/projectile/beam/lasertag/bluetag(loc)
if(6)
A = new /obj/item/projectile/beam/lasertag/redtag(loc)
- A.original = target
use_power(500)
else
A = new /obj/item/projectile/energy/electrode( loc )
@@ -245,36 +244,37 @@
playsound(get_turf(src), 'sound/weapons/Laser.ogg', 60, 1)
else
playsound(get_turf(src), 'sound/weapons/Taser.ogg', 60, 1)
+ A.original = target
A.current = T
A.yo = U.y - T.y
A.xo = U.x - T.x
A.fire()
- return
+ return A
/obj/machinery/turret/proc/isDown()
return (invisibility!=0)
/obj/machinery/turret/proc/popUp()
- if ((!isPopping()) || src.popping==-1)
+ if((!isPopping()) || src.popping==-1)
invisibility = 0
popping = 1
playsound(get_turf(src), 'sound/effects/turret/open.wav', 60, 1)
- if (src.cover!=null)
+ if(src.cover!=null)
flick("popup", src.cover)
src.cover.icon_state = "openTurretCover"
spawn(10)
- if (popping==1) popping = 0
+ if(popping==1) popping = 0
/obj/machinery/turret/proc/popDown()
- if ((!isPopping()) || src.popping==1)
+ if((!isPopping()) || src.popping==1)
popping = -1
playsound(get_turf(src), 'sound/effects/turret/open.wav', 60, 1)
- if (src.cover!=null)
+ if(src.cover!=null)
flick("popdown", src.cover)
src.cover.icon_state = "turretCover"
spawn(10)
- if (popping==-1)
+ if(popping==-1)
invisibility = INVISIBILITY_LEVEL_TWO
popping = 0
@@ -284,7 +284,7 @@
..()
if(prob(45) && Proj.damage > 0) src.spark_system.start()
qdel(Proj)
- if (src.health <= 0)
+ if(src.health <= 0)
src.die()
return
@@ -294,7 +294,7 @@
playsound(src.loc, 'sound/weapons/smash.ogg', 60, 1)
src.spark_system.start()
src.health -= W.force * 0.5
- if (src.health <= 0)
+ if(src.health <= 0)
src.die()
return
@@ -315,7 +315,7 @@
src.density = 0
src.stat |= BROKEN
src.icon_state = "destroyed_target_prism"
- if (cover!=null)
+ if(cover!=null)
qdel(cover)
sleep(3)
flick("explosion", src)
@@ -332,7 +332,7 @@
add_logs(M, src, "attacked", admin=0)
//src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey]) ")
src.health -= M.melee_damage_upper
- if (src.health <= 0)
+ if(src.health <= 0)
src.die()
else
to_chat(M, "That object is useless to you. ")
@@ -348,7 +348,7 @@
playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1)
visible_message("[M] has slashed at [src]! ")
src.health -= 15
- if (src.health <= 0)
+ if(src.health <= 0)
src.die()
else
to_chat(M, "\green That object is useless to you.")
@@ -359,22 +359,22 @@
/obj/machinery/turretid/Topic(href, href_list, var/nowindow = 0)
if(..(href, href_list))
return 1
- if (src.locked)
- if (!istype(usr, /mob/living/silicon))
+ if(src.locked)
+ if(!istype(usr, /mob/living/silicon))
to_chat(usr, "Control panel is locked!")
return
- if (href_list["toggleOn"])
+ if(href_list["toggleOn"])
src.enabled = !src.enabled
src.updateTurrets()
- else if (href_list["toggleLethal"])
+ else if(href_list["toggleLethal"])
src.lethal = !src.lethal
src.updateTurrets()
if(!nowindow)
src.attack_hand(usr)
/obj/machinery/turretid/proc/update_icons()
- if (src.enabled)
- if (src.lethal)
+ if(src.enabled)
+ if(src.lethal)
icon_state = "control_kill"
else
icon_state = "control_stun"
@@ -382,7 +382,7 @@
icon_state = "control_standby"
//CODE FIXED BUT REMOVED
// if(control_area) //USE: updates other controls in the area
-// for (var/obj/machinery/turretid/Turret_Control in world) //I'm not sure if this is what it was
+// for(var/obj/machinery/turretid/Turret_Control in world) //I'm not sure if this is what it was
// if( Turret_Control.control_area != src.control_area ) continue //supposed to do. Or whether the person
// Turret_Control.icon_state = icon_state //who coded it originally was just tired
// Turret_Control.enabled = enabled //or something. I don't see any situation
@@ -512,6 +512,8 @@
continue
if(faction in M.faction)
continue
+ if(ispAI(M))
+ continue
pos_targets += M
for(var/obj/mecha/M in oview(scan_range, src))
if(M.occupant)
@@ -542,17 +544,17 @@
if(!src)
return
var/turf/curloc = get_turf(src)
- if (!targloc || !curloc)
+ if(!targloc || !curloc)
return
- if (targloc == curloc)
+ if(targloc == curloc)
return
playsound(get_turf(src), firing_sound, 60, 1)
var/obj/item/projectile/A = new bullet_type(curloc)
+ A.original = target
A.current = curloc
A.yo = targloc.y - curloc.y
A.xo = targloc.x - curloc.x
- spawn(0)
- A.process()
+ A.fire()
return
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index e022e0c6a4b..b6fc160a6f6 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -159,7 +159,7 @@
qdel(src)
return
if(2.0)
- if (prob(50))
+ if(prob(50))
qdel(src)
return
if(3.0)
@@ -208,16 +208,21 @@
break
return total
-/obj/machinery/vending/attackby(obj/item/weapon/W, mob/user, params)
- if (currently_vending && vendor_account && !vendor_account.suspended)
+/obj/machinery/vending/attackby(obj/item/I, mob/user, params)
+ if(currently_vending && vendor_account && !vendor_account.suspended)
var/paid = 0
var/handled = 0
- if(istype(W, /obj/item/weapon/card/id))
- var/obj/item/weapon/card/id/C = W
+ if(istype(I, /obj/item/weapon/card/id))
+ var/obj/item/weapon/card/id/C = I
paid = pay_with_card(C)
handled = 1
- else if (istype(W, /obj/item/weapon/spacecash))
- var/obj/item/weapon/spacecash/C = W
+ if(istype(I, /obj/item/device/pda))
+ var/obj/item/device/pda/PDA = I
+ if(PDA.id)
+ paid = pay_with_card(PDA.id)
+ handled = 1
+ else if(istype(I, /obj/item/weapon/spacecash))
+ var/obj/item/weapon/spacecash/C = I
paid = pay_with_cash(C, user)
handled = 1
@@ -228,10 +233,10 @@
nanomanager.update_uis(src)
return // don't smack that machine with your 2 thalers
- if(default_unfasten_wrench(user, W, time = 60))
+ if(default_unfasten_wrench(user, I, time = 60))
return
- if(istype(W, /obj/item/weapon/screwdriver) && anchored)
+ if(istype(I, /obj/item/weapon/screwdriver) && anchored)
playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
panel_open = !panel_open
to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
@@ -242,9 +247,9 @@
return
if(panel_open)
- if(istype(W, /obj/item/device/multitool)||istype(W, /obj/item/weapon/wirecutters))
+ if(istype(I, /obj/item/device/multitool)||istype(I, /obj/item/weapon/wirecutters))
return attack_hand(user)
- if(component_parts && istype(W, /obj/item/weapon/crowbar))
+ if(component_parts && istype(I, /obj/item/weapon/crowbar))
var/datum/data/vending_product/machine = product_records
for(var/datum/data/vending_product/machine_content in machine)
while(machine_content.amount !=0)
@@ -253,21 +258,21 @@
machine_content.amount--
if(!machine_content.amount)
break
- default_deconstruction_crowbar(W)
- if(istype(W, /obj/item/weapon/coin) && premium.len > 0)
+ default_deconstruction_crowbar(I)
+ if(istype(I, /obj/item/weapon/coin) && premium.len > 0)
user.drop_item()
- W.loc = src
- coin = W
+ I.loc = src
+ coin = I
categories |= CAT_COIN
- to_chat(user, "\blue You insert the [W] into the [src]")
+ to_chat(user, "\blue You insert the [I] into the [src]")
nanomanager.update_uis(src)
return
- else if(istype(W, refill_canister) && refill_canister != null)
+ else if(istype(I, refill_canister) && refill_canister != null)
if(stat & (BROKEN|NOPOWER))
to_chat(user, "It does nothing. ")
else if(panel_open)
//if the panel is open we attempt to refill the machine
- var/obj/item/weapon/vending_refill/canister = W
+ var/obj/item/weapon/vending_refill/canister = I
if(canister.charges == 0)
to_chat(user, "This [canister.name] is empty! ")
else
@@ -296,7 +301,7 @@
if(currently_vending.price > cashmoney.get_total())
// This is not a status display message, since it's something the character
// themselves is meant to see BEFORE putting the money in
- to_chat(usr, "\icon[cashmoney] That is not enough money. ")
+ to_chat(usr, "[bicon(cashmoney)] That is not enough money. ")
return 0
// Bills (banknotes) cannot really have worth different than face value,
@@ -327,7 +332,7 @@
return pay_with_account(get_card_account(I))
/obj/machinery/vending/proc/pay_with_account(var/datum/money_account/customer_account)
- if (!customer_account)
+ if(!customer_account)
src.status_message = "Error: Unable to access account. Please contact technical support if problem persists."
src.status_error = 1
return 0
@@ -443,7 +448,7 @@
data["panel"] = 0
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "vending_machine.tmpl", src.name, 440, 600)
ui.set_initial_data(data)
ui.open()
@@ -462,7 +467,7 @@
to_chat(usr, "\blue You remove the [coin] from the [src]")
categories &= ~CAT_COIN
- if (href_list["pay"])
+ if(href_list["pay"])
if(currently_vending && vendor_account && !vendor_account.suspended)
var/paid = 0
var/handled = 0
@@ -480,8 +485,8 @@
nanomanager.update_uis(src)
return // don't smack that machine with your 2 credits
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
- if ((href_list["vend"]) && (src.vend_ready) && (!currently_vending))
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
+ if((href_list["vend"]) && (src.vend_ready) && (!currently_vending))
if(issilicon(usr) && !isrobot(usr))
to_chat(usr, "The vending machine refuses to interface with you, as you are not in its target demographic! ")
@@ -511,10 +516,10 @@
src.status_message = "Please swipe a card or insert cash to pay for the item."
src.status_error = 0
- else if (href_list["cancelpurchase"])
+ else if(href_list["cancelpurchase"])
src.currently_vending = null
- else if ((href_list["togglevoice"]) && (src.panel_open))
+ else if((href_list["togglevoice"]) && (src.panel_open))
src.shut_up = !src.shut_up
src.add_fingerprint(usr)
@@ -534,7 +539,7 @@
src.status_error = 0
nanomanager.update_uis(src)
- if (R.category & CAT_COIN)
+ if(R.category & CAT_COIN)
if(!coin)
to_chat(user, "\blue You need to insert a coin to get this item.")
return
@@ -559,7 +564,7 @@
src.last_reply = world.time
use_power(vend_power_usage) //actuators and stuff
- if (src.icon_vend) //Show the vending animation if needed
+ if(src.icon_vend) //Show the vending animation if needed
flick(src.icon_vend,src)
spawn(src.vend_delay)
new R.product_path(get_turf(src))
@@ -601,7 +606,7 @@
if(stat & NOPOWER)
return
- if (!message)
+ if(!message)
return
for(var/mob/O in hearers(src, null))
@@ -623,10 +628,10 @@
//Oh no we're malfunctioning! Dump out some product and break.
/obj/machinery/vending/proc/malfunction()
for(var/datum/data/vending_product/R in src.product_records)
- if (R.amount <= 0) //Try to use a record that actually has something to dump.
+ if(R.amount <= 0) //Try to use a record that actually has something to dump.
continue
var/dump_path = R.product_path
- if (!dump_path)
+ if(!dump_path)
continue
while(R.amount>0)
@@ -646,16 +651,16 @@
return 0
for(var/datum/data/vending_product/R in src.product_records)
- if (R.amount <= 0) //Try to use a record that actually has something to dump.
+ if(R.amount <= 0) //Try to use a record that actually has something to dump.
continue
var/dump_path = R.product_path
- if (!dump_path)
+ if(!dump_path)
continue
R.amount--
throw_item = new dump_path(src.loc)
break
- if (!throw_item)
+ if(!throw_item)
return 0
spawn(0)
throw_item.throw_at(target, 16, 3, src)
@@ -698,7 +703,7 @@
icon_deny = "boozeomat-deny"
products = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/gin = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 5,
- /obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla = 5,
+ /obj/item/weapon/reagent_containers/food/drinks/bottle/tequila = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth = 5,
/obj/item/weapon/reagent_containers/food/drinks/bottle/rum = 5,
@@ -1114,7 +1119,7 @@
icon_state = "engi"
icon_deny = "engi-deny"
req_access_txt = "11"
- products = list(/obj/item/clothing/under/rank/chief_engineer = 4,/obj/item/clothing/under/rank/engineer = 4,/obj/item/clothing/shoes/orange = 4,/obj/item/clothing/head/hardhat = 4,
+ products = list(/obj/item/clothing/under/rank/chief_engineer = 4,/obj/item/clothing/under/rank/engineer = 4,/obj/item/clothing/shoes/workboots = 4,/obj/item/clothing/head/hardhat = 4,
/obj/item/weapon/storage/belt/utility = 4,/obj/item/clothing/glasses/meson = 4,/obj/item/clothing/gloves/color/yellow = 4, /obj/item/weapon/screwdriver = 12,
/obj/item/weapon/crowbar = 12,/obj/item/weapon/wirecutters = 12,/obj/item/device/multitool = 12,/obj/item/weapon/wrench = 12,/obj/item/device/t_scanner = 12,
/obj/item/stack/cable_coil/heavyduty = 8, /obj/item/weapon/stock_parts/cell = 8, /obj/item/weapon/weldingtool = 8,/obj/item/clothing/head/welding = 8,
@@ -1152,7 +1157,7 @@
icon_state = "sustenance"
products = list(/obj/item/weapon/reagent_containers/food/snacks/tofu = 24,
/obj/item/weapon/reagent_containers/food/drinks/ice = 12,
- /obj/item/weapon/reagent_containers/food/snacks/candy_corn = 6)
+ /obj/item/weapon/reagent_containers/food/snacks/candy/candy_corn = 6)
contraband = list(/obj/item/weapon/kitchen/knife = 6)
/obj/machinery/vending/hatdispenser
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 6889cf67c42..e075457a9e5 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -145,7 +145,7 @@
G.desc = new_desc
if(new_shoe_icon_state && new_shoe_name)
for(var/obj/item/clothing/shoes/S in contents)
- if (S.chained == 1)
+ if(S.chained == 1)
S.chained = 0
S.slowdown = SHOES_SLOWDOWN
new /obj/item/weapon/restraints/handcuffs( src )
@@ -229,43 +229,43 @@
istype(W,/obj/item/weapon/bedsheet))
//YES, it's hardcoded... saves a var/can_be_washed for every single clothing item.
- if ( istype(W,/obj/item/clothing/suit/space ) )
+ if( istype(W,/obj/item/clothing/suit/space ) )
to_chat(user, "This item does not fit.")
return
- if ( istype(W,/obj/item/clothing/suit/syndicatefake ) )
+ if( istype(W,/obj/item/clothing/suit/syndicatefake ) )
to_chat(user, "This item does not fit.")
return
-// if ( istype(W,/obj/item/clothing/suit/powered ) )
+// if( istype(W,/obj/item/clothing/suit/powered ) )
// to_chat(user, "This item does not fit.")
// return
- if ( istype(W,/obj/item/clothing/suit/cyborg_suit ) )
+ if( istype(W,/obj/item/clothing/suit/cyborg_suit ) )
to_chat(user, "This item does not fit.")
return
- if ( istype(W,/obj/item/clothing/suit/bomb_suit ) )
+ if( istype(W,/obj/item/clothing/suit/bomb_suit ) )
to_chat(user, "This item does not fit.")
return
- if ( istype(W,/obj/item/clothing/suit/armor ) )
+ if( istype(W,/obj/item/clothing/suit/armor ) )
to_chat(user, "This item does not fit.")
return
- if ( istype(W,/obj/item/clothing/suit/armor ) )
+ if( istype(W,/obj/item/clothing/suit/armor ) )
to_chat(user, "This item does not fit.")
return
- if ( istype(W,/obj/item/clothing/mask/gas ) )
+ if( istype(W,/obj/item/clothing/mask/gas ) )
to_chat(user, "This item does not fit.")
return
- if ( istype(W,/obj/item/clothing/mask/cigarette ) )
+ if( istype(W,/obj/item/clothing/mask/cigarette ) )
to_chat(user, "This item does not fit.")
return
- if ( istype(W,/obj/item/clothing/head/syndicatefake ) )
+ if( istype(W,/obj/item/clothing/head/syndicatefake ) )
to_chat(user, "This item does not fit.")
return
-// if ( istype(W,/obj/item/clothing/head/powered ) )
+// if( istype(W,/obj/item/clothing/head/powered ) )
// to_chat(user, "This item does not fit.")
// return
- if ( istype(W,/obj/item/clothing/head/helmet ) )
+ if( istype(W,/obj/item/clothing/head/helmet ) )
to_chat(user, "This item does not fit.")
return
- if ( istype(W,/obj/item/clothing/gloves/furgloves ) )
+ if( istype(W,/obj/item/clothing/gloves/furgloves ) )
to_chat(user, "This item does not fit.")
return
if(W.flags & NODROP) //if "can't drop" item
@@ -273,7 +273,7 @@
return
if(contents.len < 5)
- if ( state in list(1, 3) )
+ if( state in list(1, 3) )
user.drop_item()
W.loc = src
state = 3
diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm
index a5a8e44e165..cfe94888123 100644
--- a/code/game/mecha/combat/durand.dm
+++ b/code/game/mecha/combat/durand.dm
@@ -71,7 +71,7 @@
/obj/mecha/combat/durand/Topic(href, href_list)
..()
- if (href_list["toggle_defence_mode"])
+ if(href_list["toggle_defence_mode"])
src.defence_mode()
return
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index 26d9d066fd8..09caf2fcaf0 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -113,6 +113,6 @@
/obj/mecha/combat/gygax/Topic(href, href_list)
..()
- if (href_list["toggle_leg_overload"])
+ if(href_list["toggle_leg_overload"])
src.overload()
return
\ No newline at end of file
diff --git a/code/game/mecha/combat/honker.dm b/code/game/mecha/combat/honker.dm
index d8ef8c8b9fe..4bfd5f9a161 100644
--- a/code/game/mecha/combat/honker.dm
+++ b/code/game/mecha/combat/honker.dm
@@ -139,7 +139,7 @@
obj/mecha/combat/honker/Topic(href, href_list)
..()
- if (href_list["play_sound"])
+ if(href_list["play_sound"])
switch(href_list["play_sound"])
if("sadtrombone")
playsound(src, 'sound/misc/sadtrombone.ogg', 50)
@@ -148,7 +148,7 @@ obj/mecha/combat/honker/Topic(href, href_list)
proc/rand_hex_color()
var/list/colors = list("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f")
var/color=""
- for (var/i=0;i<6;i++)
+ for(var/i=0;i<6;i++)
color = color+pick(colors)
return color
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index 0d7676d75b7..386afc0710c 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -188,10 +188,10 @@
/obj/mecha/combat/marauder/Topic(href, href_list)
..()
- if (href_list["toggle_thrusters"])
+ if(href_list["toggle_thrusters"])
src.toggle_thrusters()
- if (href_list["smoke"])
+ if(href_list["smoke"])
src.smoke()
- if (href_list["toggle_zoom"])
+ if(href_list["toggle_zoom"])
src.zoom()
return
\ No newline at end of file
diff --git a/code/game/mecha/combat/phazon.dm b/code/game/mecha/combat/phazon.dm
index a4edcb4a89a..595fa67ea00 100644
--- a/code/game/mecha/combat/phazon.dm
+++ b/code/game/mecha/combat/phazon.dm
@@ -85,9 +85,9 @@
/obj/mecha/combat/phazon/Topic(href, href_list)
..()
- if (href_list["switch_damtype"])
+ if(href_list["switch_damtype"])
src.switch_damtype()
- if (href_list["phasing"])
+ if(href_list["phasing"])
phasing = !phasing
send_byjax(src.occupant,"exosuit.browser","phasing_command","[phasing?"Dis":"En"]able phasing")
src.occupant_message("En":"#f00\">Dis"]abled phasing. ")
diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index 1967f1e6645..b7aeaed66cc 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -133,7 +133,7 @@
/obj/item/mecha_parts/mecha_equipment/proc/occupant_message(message)
if(chassis)
- chassis.occupant_message("\icon[src] [message]")
+ chassis.occupant_message("[bicon(src)] [message]")
return
/obj/item/mecha_parts/mecha_equipment/proc/log_message(message)
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index 98db55e0f25..bef015cb7fa 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -296,7 +296,7 @@
//meh
switch(mode)
if(0)
- if (istype(target, /turf/simulated/wall))
+ if(istype(target, /turf/simulated/wall))
if(istype(target, /turf/simulated/wall/r_wall) && !canRwall)
return 0
occupant_message("Deconstructing [target]...")
@@ -306,7 +306,7 @@
target:ChangeTurf(/turf/simulated/floor/plating)
playsound(target, 'sound/items/Deconstruct.ogg', 50, 1)
chassis.use_power(energy_drain)
- else if (istype(target, /turf/simulated/floor))
+ else if(istype(target, /turf/simulated/floor))
occupant_message("Deconstructing [target]...")
set_ready_state(0)
if(do_after_cooldown(target))
@@ -314,7 +314,7 @@
target:ChangeTurf(/turf/space)
playsound(target, 'sound/items/Deconstruct.ogg', 50, 1)
chassis.use_power(energy_drain)
- else if (istype(target, /obj/machinery/door/airlock))
+ else if(istype(target, /obj/machinery/door/airlock))
occupant_message("Deconstructing [target]...")
set_ready_state(0)
if(do_after_cooldown(target))
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index ae5595d69e5..6660692ce62 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -16,7 +16,7 @@
if(size > M.maxsize)
return 0
return 1
- else if (M.emagged == 1)
+ else if(M.emagged == 1)
return 1
return 0
@@ -29,9 +29,9 @@
var/turf/curloc = get_turf(chassis)
var/turf/targloc = get_turf(target)
- if (!targloc || !istype(targloc) || !curloc)
+ if(!targloc || !istype(targloc) || !curloc)
return 0
- if (targloc == curloc)
+ if(targloc == curloc)
return 0
set_ready_state(0)
@@ -166,7 +166,7 @@
to_chat(M, "HONK ")
M.sleeping = 0
M.stuttering = 20
- M.ear_deaf = 30
+ M.adjustEarDamage(0,30)
M.Weaken(3)
if(prob(30))
M.Stun(10)
@@ -222,7 +222,7 @@
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/Topic(href, href_list)
..()
- if (href_list["rearm"])
+ if(href_list["rearm"])
rearm()
return
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index 4eae22d7646..46c92271308 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -283,7 +283,7 @@
else
data["has_mech"] = 0
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "mech_bay_console.tmpl", "Mech Bay Control Console", 500, 325)
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index a88d1c49bad..22071dea277 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -153,7 +153,7 @@
I.loc = get_step(src,SOUTH)
I.materials[MAT_METAL] = get_resource_cost_w_coeff(D,MAT_METAL)
I.materials[MAT_GLASS] = get_resource_cost_w_coeff(D,MAT_GLASS)
- visible_message("\icon[src] \The [src] beeps, \"\The [I] is complete.\"")
+ visible_message("[bicon(src)] \The [src] beeps, \"\The [I] is complete.\"")
being_built = null
updateUsrDialog()
@@ -196,14 +196,14 @@
if(stat&(NOPOWER|BROKEN))
return 0
if(!check_resources(D))
- visible_message("\icon[src] \The [src] beeps, \"Not enough resources. Queue processing stopped.\"")
+ visible_message("[bicon(src)] \The [src] beeps, \"Not enough resources. Queue processing stopped.\"")
temp = {"Not enough resources to build next part.
Try again | Return "}
return 0
remove_from_queue(1)
build_part(D)
D = listgetindex(queue, 1)
- visible_message("\icon[src] \The [src] beeps, \"Queue processing finished successfully.\"")
+ visible_message("[bicon(src)] \The [src] beeps, \"Queue processing finished successfully.\"")
/obj/machinery/mecha_part_fabricator/proc/list_queue()
var/output = "Queue contains: "
@@ -240,7 +240,7 @@
temp += " Return "
updateUsrDialog()
- visible_message("\icon[src] \The [src] beeps, \"Successfully synchronized with R&D server.\"")
+ visible_message("[bicon(src)] \The [src] beeps, \"Successfully synchronized with R&D server.\"")
return
temp = "Unable to connect to local R&D Database. Please check your connections and try again.Return "
@@ -266,12 +266,12 @@
/obj/machinery/mecha_part_fabricator/interact(mob/user as mob)
var/dat, left_part
- if (..())
+ if(..())
return
user.set_machine(src)
var/turf/exit = get_step(src,SOUTH)
if(exit.density)
- visible_message("\icon[src] \The [src] beeps, \"Error! Part outlet is obstructed.\"")
+ visible_message("[bicon(src)] \The [src] beeps, \"Error! Part outlet is obstructed.\"")
return
if(temp)
left_part = temp
@@ -289,9 +289,8 @@
if("parts")
left_part += output_parts_list(part_set)
left_part += "Return "
- dat = {"
-
- [name]
+ dat = {"
+ [name]
+
+
+
+
+
+
+ What's a Fax?
+ When to Fax?
+ How to Fax?
+
+
+
+
+ Faxes are your main method of communicating with the NAS Trurl, better known as Central Command.
+ Faxes allow personnel on the station to maintain open lines of communication with the NAS Trurl, allowing for vital information to flow both ways.
+ Being written communications, proper grammar, syntax and typography is required, in addition to a signature and, if applicable, a stamp. Failure to sign faxes will lead to an automatic rejection.
+ We at NanoTrasen provide Fax Machines to every Head of Staff, in addition to the Magistrate, NanoTrasen Representative, and Internal Affairs Agents.
+ This means that we trust the recipients of these fax machines to only use them in the proper circumstances (see When to Fax? ).
+
+
+ While it is up to the discretion of each individual person to decide when to fax Central Command, there are some simple guidelines on when to do this.
+ Firstly, any situation that can reasonably be solved on-site, should be handled on-site. Knowledge of Standard Operating Procedure is mandatory for everyone with access to a fax machine.
+ Resolving issues on-site not only leads to more expedient problem-solving, it also frees up company resources and provides valuable work experience for all parties involved.
+ This means that you should work with the Heads of Staff concerning personnel and workplace issues, and attempt to resolve situations with them. If, for whatever reason, the relevent Head of Staff is not available or receptive, consider speaking with the Captain and/or NanoTrasen Representative.
+ If, for whatever reason, these issues cannot be solved on-site, either due to incompetence or just plain refusal to cooperate, faxing Central Command becomes a viable option.
+ Secondly, station status reports should be sent occasionally, but never at the start of the shift. Remember, we assign personnel to the station. We do not need a repeat of what we just signed off on.
+ Thirdly, staff/departmental evaluations are always welcome, especially in cases of noticeable (in)competence. Just as a brilliant coworker can be rewarded, an incompetent one can be punished.
+ Fourthly, do not issue faxes asking for sentences. You have an entire Security department and an associated Detective, not to mention on-site Space Law manuals.
+ Lastly, please pay attention to context. If the station is facing a massive emergency, such as a Class 7-10 Blob Organism, most, if not all, non-relevant faxes will be duly ignored.
+
+
+ Sending a fax is simple. Simply insert your ID into the fax machine, then log in.
+ Once logged in, insert a piece of paper and select the destination from the provided list. Remember, you can rename your fax from within the fax machine's menu.
+ You can send faxes to any other fax machine on the station, which can be a very useful tool when you need to issue broad communications to all of the Heads of Staff.
+ To send a fax to Central Command, simply select the correct destination, and send the fax. Keep in mind, the communication arrays need to recharge after sending a fax to Central Command, so make sure you sent everything you need.
+ Lastly, paper bundles can also be faxed as a single item, so feel free to bundle up all relevant documentation and send it in at once.
+
+
+
+
+
+ "}
+
/obj/item/weapon/book/manual/sop_science
name = "Science Standard Operating Procedures"
desc = "A set of guidelines aiming at the safe conduct of all scientific activities."
@@ -1483,7 +1542,7 @@
Attending Surgeon is to keep the Operating Room in an hygienic condition at all times, again , to prevent infection;
Attending Surgeon is to wash his/her hands between different patients, again, to prevent infection;
Attending Surgeon is to use either Anesthetics or Sedatives (for species that cannot breathe Anesthetics) during Surgical Procedures. Exception is made if the patient requests otherwise;
-
Attending Surgeon is not to remove any legal Implants (such as Loyalty or Tracking Implants) from the patient, unless requested by Security;
+
Attending Surgeon is not to remove any legal Implants (such as Mindshield or Tracking Implants) from the patient, unless requested by Security;
If a patient requests that a lost limb be replaced with an organic, rather than mechanical, substitute, said limb must be harvested from a compatible humanized Test Animal (such as Monkeys for Humans, or Farwas for Tajarans). Exception is made if the patient deliberately requests otherwise;
Attending Surgeon is not to bring any of the Surgical Tools outside of their respective Operating Room, and must in fact ensure the Operating Room maintains its proper inventory. This includes ensuring that the Anesthetics Equipment be kept inside the OR
@@ -2141,7 +2200,7 @@
Prisoner must then be borged, fired into space via mass driver, cremated, or placed in the morgue with a DNR Notice, at the discretion of the Magistrate, Captain or Head of Security.
-
+
Prisoner must be bucklecuffed to the electric chair or bed.
@@ -2150,7 +2209,7 @@
Prisoner must then be borged, fired into space via mass driver, cremated, or placed in the morgue with a DNR Notice, at the discretion of the Magistrate, Captain or Head of Security.
-
+
Prisoner must be brought to the Firing Range.
@@ -2164,7 +2223,7 @@
"}
-
+
/obj/item/weapon/book/manual/sop_general
name = "Standard Operating Procedures"
desc = "A set of guidelines aiming at the safe conduct of all station activities."
@@ -2212,7 +2271,7 @@
All clear.
- Default operating level. No immediate or clear threat to the station. All departments may carry out work as normal.
+ Default operating level. No immediate or clear threat to the station. All departments may carry out work as normal.
This alert level can be set at the Communications Console with a Captain level ID.
All threats to the station have passed. All weapons need to be holstered and privacy laws are once again fully enforced.
@@ -2230,10 +2289,10 @@
Crew:
Crew members may freely walk in the hallways
- Suit sensors are not mandatory.
+ Suit sensors are not mandatory.
-
+
There is a suspected threat.
Raised alert level. Suspected threat to the station. Issued by Central Command, the Captain, or a Head of Staff vote. This alert level can be set at the Communications Console with a Captain level ID.
@@ -2255,10 +2314,10 @@
Crew:
Employees are recommended to comply with all security requests.
- Suit sensors are mandatory, but coordinate positions are not required.
+ Suit sensors are mandatory, but coordinate positions are not required.
-
+
There is a confirmed threat.
Maximum alert level. Confirmed threat to the station or severe damage. Issued by Central Command, the Captain, or a Head of Staff vote. This alert level can only be set via the Keycard Authentication Devices in each Heads of Staff office and by swiping two Heads of Staff ID cards simultaneously.
@@ -2279,12 +2338,12 @@
Crew:
Suit sensors and coordinate positions are mandatory.
- All crew members must remain in their departments.
- Employees are required to comply with all security requests.
- Emergency Response Team may be authorised. All crew are to comply with their direction.
+ All crew members must remain in their departments.
+ Employees are required to comply with all security requests.
+ Emergency Response Team may be authorised. All crew are to comply with their direction.
-
+
Extremely hostile threat onboard the station.
GAMMA Security level has been set by Centcom.
@@ -2306,21 +2365,21 @@
Crew:
Employees are required to comply with all security requests.
- All civilians are to seek their nearest head for transportation to a safe location.
+ All civilians are to seek their nearest head for transportation to a safe location.
All personnel are required to defend the station and help security with dealing with the threat. All crew must follow direct orders from Security Personell or Head of Staff.
-
+
Authorisation from the relevant Department Head is required to be hired into a Department. If none exists, the HoP or Captain's authorisation is required.
Promotion to a Department Head requires authorisation from the Captain or Acting Captain.
CentComm Authorisation is required for hiring the following: Blueshield, Security Pod Pilot, Magistrate, Brig Physician, Nanotrasen Representative, Mechanic.
If no Department Head has yet been sent, any promotion to said position is on a temporary basis until one arrives.
- All Security personnel are to be loyalty implanted.
+ All Security personnel are to be mindshield implanted.
-
+
If a crew is to be dismissed, their ID is to be terminated.
@@ -2329,7 +2388,7 @@
Demotion or Dismissal must have due cause.
-
+
A medium or higher crime may be grounds for dismissal, at the department head's discretion.
@@ -2344,11 +2403,11 @@
Failure or refusal to hand in any items, ID, etc, of their previous job, is to be considered theft.
-
+
The following situations have specific SoP. Failure to follow these may result in demotion/dismissal, or detaining by security if failure to follow them presents a significant risk.
-
+
All personnel are required to assist with evacuation. All crew must be evacuated, regardless of conscious state.
@@ -2359,7 +2418,7 @@
Shortening time to shuttle launch may be authorised if a clear threat to life, limb, or shuttle integrity is present.
-
+
Definition: A Viral Outbreak is defined as a situation where a Viral Pathogen has infected a significant portion of the crew (>10%)
@@ -2376,7 +2435,7 @@
Once the Viral Outbreak is over, all personnel are to return to regular duties.
-
+
Immediate evacuation of all untrained personnel.
@@ -2384,7 +2443,7 @@
Atmospheric Technicians are to remove hazard.
-
+
All crew to move to central parts of the station.
@@ -2392,7 +2451,7 @@
Personel that are doing EVA maintenance should seek shelter immediately.
-
+
Observation of Singularity movement.
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index e3c65c2f35b..5e262ce4afa 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -19,7 +19,7 @@
to_chat(user, "You accidentally cut yourself with [src], like a doofus! ")
user.take_organ_damage(5,5)
active = !active
- if (active)
+ if(active)
force = force_on
throwforce = throwforce_on
hitsound = 'sound/weapons/blade1.ogg'
@@ -62,7 +62,8 @@
w_class = 3
w_class_on = 5
hitsound = "swing_hit"
- flags = CONDUCT | NOSHIELD
+ flags = CONDUCT
+ armour_penetration = 100
origin_tech = "combat=3"
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
attack_verb_on = list()
@@ -82,8 +83,9 @@
throw_speed = 3
throw_range = 5
hitsound = "swing_hit"
- flags = NOSHIELD
+ armour_penetration = 35
origin_tech = "magnets=3;syndicate=4"
+ block_chance = 50
sharp = 1
edge = 1
var/hacked = 0
@@ -93,9 +95,9 @@
if(item_color == null)
item_color = pick("red", "blue", "green", "purple")
-/obj/item/weapon/melee/energy/sword/IsShield()
+/obj/item/weapon/melee/energy/sword/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
if(active)
- return 1
+ return ..()
return 0
/obj/item/weapon/melee/energy/sword/cyborg
@@ -131,7 +133,7 @@
..()
item_color = null
-/obj/item/weapon/melee/energy/sword/cyborg/saw/IsShield()
+/obj/item/weapon/melee/energy/sword/cyborg/saw/hit_reaction()
return 0
/obj/item/weapon/melee/energy/sword/saber
@@ -204,7 +206,7 @@
throw_speed = 3
throw_range = 1
w_class = 4//So you can't hide it in your pocket or some such.
- flags = NOSHIELD
+ armour_penetration = 50
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
var/datum/effect/system/spark_spread/spark_system
@@ -215,6 +217,7 @@
spark_system.attach(src)
/obj/item/weapon/melee/energy/blade/dropped()
+ ..()
qdel(src)
/obj/item/weapon/melee/energy/blade/attack_self(mob/user)
diff --git a/code/game/objects/items/weapons/misc.dm b/code/game/objects/items/weapons/misc.dm
index ebe8ecb421d..2ff41257ea1 100644
--- a/code/game/objects/items/weapons/misc.dm
+++ b/code/game/objects/items/weapons/misc.dm
@@ -30,7 +30,7 @@
flags = CONDUCT
force = 5.0
throwforce = 7.0
- w_class = 2.0
+ w_class = 2
materials = list(MAT_METAL=50)
attack_verb = list("bludgeoned", "whacked", "disciplined", "thrashed")
@@ -40,7 +40,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "c_tube"
throwforce = 1
- w_class = 1.0
+ w_class = 1
throw_speed = 4
throw_range = 5
@@ -62,7 +62,7 @@
var/data = ""
var/base_url = "http://svn.slurm.us/public/spacestation13/misc/game_kit"
item_state = "sheet-metal"
- w_class = 5.0
+ w_class = 5
*/
/obj/item/weapon/gift
@@ -73,7 +73,7 @@
var/size = 3.0
var/obj/item/gift = null
item_state = "gift"
- w_class = 4.0
+ w_class = 4
/obj/item/weapon/kidanglobe
name = "Kidan homeworld globe"
diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm
index 7fad9cbbe5f..8b5baf79a35 100644
--- a/code/game/objects/items/weapons/mop.dm
+++ b/code/game/objects/items/weapons/mop.dm
@@ -9,14 +9,13 @@
throwforce = 5.0
throw_speed = 3
throw_range = 7
- w_class = 3.0
+ w_class = 3
attack_verb = list("mopped", "bashed", "bludgeoned", "whacked")
var/mopping = 0
var/mopcount = 0
var/mopcap = 5
var/mopspeed = 30
-
/obj/item/weapon/mop/New()
create_reagents(mopcap)
janitorial_equipment += src
@@ -34,7 +33,6 @@
reagents.reaction(A, TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly.
reagents.remove_any(1) //reaction() doesn't use up the reagents
-
/obj/item/weapon/mop/afterattack(atom/A, mob/user, proximity)
if(!proximity) return
@@ -80,4 +78,15 @@
force = 6
throwforce = 8
throw_range = 4
- mopspeed = 20
\ No newline at end of file
+ mopspeed = 20
+
+/obj/item/weapon/mop/advanced/cyborg
+ mopcap = 40
+
+/obj/item/weapon/mop/advanced/cyborg/New()
+ ..()
+ reagents.add_reagent("water", mopcap)
+
+/obj/item/weapon/mop/advanced/cyborg/examine(mob/user)
+ ..(user)
+ to_chat(user, "The mop's water tank has [round(reagents.get_reagent_amount("water"))] units of water left. ")
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm
index 866efe8763c..7e251532bd1 100644
--- a/code/game/objects/items/weapons/paint.dm
+++ b/code/game/objects/items/weapons/paint.dm
@@ -9,7 +9,7 @@ var/global/list/cached_icons = list()
icon_state = "paint_neutral"
item_state = "paintcan"
materials = list(MAT_METAL=200)
- w_class = 3.0
+ w_class = 3
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(10,20,30,50,70)
volume = 70
@@ -73,7 +73,7 @@ var/global/list/cached_icons = list()
icon_state = "paint_neutral"
color = "FFFFFF"
item_state = "paintcan"
- w_class = 3.0
+ w_class = 3
/obj/item/weapon/paint/red
name = "Red paint"
@@ -117,7 +117,7 @@ var/global/list/cached_icons = list()
attack_self(mob/user as mob)
var/t1 = input(user, "Please select a color:", "Locking Computer", null) in list( "red", "blue", "green", "yellow", "black", "white")
- if ((user.get_active_hand() != src || user.stat || user.restrained()))
+ if((user.get_active_hand() != src || user.stat || user.restrained()))
return
switch(t1)
if("red")
diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm
index 9e8f68faa73..88d3f202ac6 100644
--- a/code/game/objects/items/weapons/pneumaticCannon.dm
+++ b/code/game/objects/items/weapons/pneumaticCannon.dm
@@ -24,9 +24,9 @@
return
for(var/obj/item/I in loadedItems)
spawn(0)
- to_chat(user, "\icon [I] It has \the [I] loaded. ")
+ to_chat(user, "[bicon(I)] It has \the [I] loaded. ")
if(tank)
- to_chat(user, "\icon [tank] It has \the [tank] mounted onto it. ")
+ to_chat(user, "[bicon(tank)] It has \the [tank] mounted onto it. ")
/obj/item/weapon/pneumatic_cannon/attackby(obj/item/weapon/W, mob/user, params)
@@ -132,7 +132,7 @@
maxWeightClass = 7
gasPerThrow = 5
-/datum/table_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but
+/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but
name = "Pneumatic Cannon"
result = /obj/item/weapon/pneumatic_cannon/ghetto
tools = list(/obj/item/weapon/weldingtool,
diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm
index a34a8328457..92bb7ac4c07 100644
--- a/code/game/objects/items/weapons/power_cells.dm
+++ b/code/game/objects/items/weapons/power_cells.dm
@@ -139,17 +139,17 @@
/obj/item/weapon/stock_parts/cell/pulse //200 pulse shots
name = "pulse rifle power cell"
- maxcharge = 40000
+ maxcharge = 400000
rating = 3
chargerate = 1500
/obj/item/weapon/stock_parts/cell/pulse/carbine
name = "pulse carbine power cell"
- maxcharge = 4000
+ maxcharge = 40000
/obj/item/weapon/stock_parts/cell/pulse/pistol
name = "pulse pistol power cell"
- maxcharge = 1600
+ maxcharge = 16000
/obj/item/weapon/stock_parts/cell/ninja
name = "spider-clan power cell"
diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm
new file mode 100644
index 00000000000..8feab4632d7
--- /dev/null
+++ b/code/game/objects/items/weapons/powerfist.dm
@@ -0,0 +1,100 @@
+/obj/item/weapon/melee/powerfist
+ name = "power-fist"
+ desc = "A metal gauntlet with a piston-powered ram ontop for that extra 'ompfh' in your punch."
+ icon_state = "powerfist"
+ item_state = "powerfist"
+ flags = CONDUCT
+ attack_verb = list("whacked", "fisted", "power-punched")
+ force = 12
+ throwforce = 10
+ throw_range = 7
+ w_class = 3
+ origin_tech = "combat=5;powerstorage=3;syndicate=3"
+ var/click_delay = 1.5
+ var/fisto_setting = 1
+ var/gasperfist = 3
+ var/obj/item/weapon/tank/tank = null //Tank used for the gauntlet's piston-ram.
+
+
+/obj/item/weapon/melee/powerfist/Destroy()
+ if(tank)
+ qdel(tank)
+ tank = null
+ return ..()
+
+/obj/item/weapon/melee/powerfist/examine(mob/user)
+ ..()
+ if(!in_range(user, src))
+ to_chat(user, "You'll need to get closer to see any more. ")
+ return
+ if(tank)
+ to_chat(user, "\icon [tank] It has \the [tank] mounted onto it. ")
+
+/obj/item/weapon/melee/powerfist/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W, /obj/item/weapon/tank))
+ if(!tank)
+ var/obj/item/weapon/tank/IT = W
+ if(IT.volume <= 3)
+ to_chat(user, "\The [IT] is too small for \the [src]. ")
+ return
+ updateTank(W, 0, user)
+ else if(istype(W, /obj/item/weapon/wrench))
+ switch(fisto_setting)
+ if(1)
+ fisto_setting = 2
+ if(2)
+ fisto_setting = 3
+ if(3)
+ fisto_setting = 1
+ playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ to_chat(user, "You tweak \the [src]'s piston valve to [fisto_setting]. ")
+ else if(istype(W, /obj/item/weapon/screwdriver))
+ if(tank)
+ updateTank(tank, 1, user)
+
+
+/obj/item/weapon/melee/powerfist/proc/updateTank(obj/item/weapon/tank/thetank, removing = 0, mob/living/carbon/human/user)
+ if(removing)
+ if(!tank)
+ to_chat(user, "\The [src] currently has no tank attached to it. ")
+ return
+ to_chat(user, "You detach \the [thetank] from \the [src]. ")
+ tank.forceMove(get_turf(user))
+ user.put_in_hands(tank)
+ tank = null
+ if(!removing)
+ if(tank)
+ to_chat(user, "\The [src] already has a tank. ")
+ return
+ if(!user.unEquip(thetank))
+ return
+ to_chat(user, "You hook \the [thetank] up to \the [src]. ")
+ tank = thetank
+ thetank.forceMove(src)
+
+
+/obj/item/weapon/melee/powerfist/attack(mob/living/target, mob/living/user)
+ if(!tank)
+ to_chat(user, "\The [src] can't operate without a source of gas! ")
+ return
+ if(tank && !tank.air_contents.remove(gasperfist * fisto_setting))
+ to_chat(user, "\The [src]'s piston-ram lets out a weak hiss, it needs more gas! ")
+ playsound(loc, 'sound/effects/refill.ogg', 50, 1)
+ return
+
+ user.do_attack_animation(target)
+
+ target.apply_damage(force * fisto_setting, BRUTE)
+ target.visible_message("[user]'s powerfist lets out a loud hiss as they punch [target.name]! ", \
+ "You cry out in pain as [user]'s punch flings you backwards! ")
+ new/obj/effect/kinetic_blast(target.loc)
+ playsound(loc, 'sound/weapons/resonator_blast.ogg', 50, 1)
+ playsound(loc, 'sound/weapons/genhit2.ogg', 50, 1)
+
+ var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src)))
+ spawn(0)
+ target.throw_at(throw_target, 5 * fisto_setting, 0.2)
+
+ add_logs(target, user, "power fisted", src)
+
+ user.changeNext_move(CLICK_CD_MELEE * click_delay)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm
index 9f0c824dead..d213b6bcbb6 100644
--- a/code/game/objects/items/weapons/scissors.dm
+++ b/code/game/objects/items/weapons/scissors.dm
@@ -118,7 +118,7 @@
H.losebreath += 10 //30 Oxy damage over time
H.apply_damage(18, BRUTE, "head", sharp =1, edge =1, used_weapon = "scissors")
var/turf/location = get_turf(H)
- if (istype(location, /turf/simulated))
+ if(istype(location, /turf/simulated))
location.add_blood(H)
H.bloody_hands(H)
H.bloody_body(H)
diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm
index 589f91b8302..90c98c6fdac 100644
--- a/code/game/objects/items/weapons/scrolls.dm
+++ b/code/game/objects/items/weapons/scrolls.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/wizard.dmi'
icon_state = "scroll"
var/uses = 4.0
- w_class = 2.0
+ w_class = 2
item_state = "paper"
throw_speed = 4
throw_range = 20
@@ -29,15 +29,15 @@
/obj/item/weapon/teleportation_scroll/Topic(href, href_list)
..()
- if (usr.stat || usr.restrained() || src.loc != usr)
+ if(usr.stat || usr.restrained() || src.loc != usr)
return
var/mob/living/carbon/human/H = usr
- if (!( istype(H, /mob/living/carbon/human)))
+ if(!( istype(H, /mob/living/carbon/human)))
return 1
- if ((usr == src.loc || (in_range(src, usr) && istype(src.loc, /turf))))
+ if((usr == src.loc || (in_range(src, usr) && istype(src.loc, /turf))))
usr.set_machine(src)
- if (href_list["spell_teleport"])
- if (src.uses >= 1)
+ if(href_list["spell_teleport"])
+ if(src.uses >= 1)
teleportscroll(H)
attack_self(H)
return
@@ -49,7 +49,7 @@
A = input(user, "Area to jump to", "BOOYEA", A) in teleportlocs
var/area/thearea = teleportlocs[A]
- if (user.stat || user.restrained())
+ if(user.stat || user.restrained())
return
if(!((user == loc || (in_range(src, user) && istype(src.loc, /turf)))))
return
diff --git a/code/game/objects/items/weapons/shards.dm b/code/game/objects/items/weapons/shards.dm
index 4add062aabc..bcc09a86f16 100644
--- a/code/game/objects/items/weapons/shards.dm
+++ b/code/game/objects/items/weapons/shards.dm
@@ -7,7 +7,7 @@
sharp = 1
edge = 1
desc = "Could probably be used as ... a throwing weapon?"
- w_class = 1.0
+ w_class = 1
force = 5.0
throwforce = 10.0
item_state = "shard-glass"
@@ -53,7 +53,7 @@
/obj/item/weapon/shard/Crossed(AM as mob|obj)
if(isliving(AM))
var/mob/living/M = AM
- if (M.incorporeal_move || M.flying)//you are incorporal or flying..no shard stepping!
+ if(M.incorporeal_move || M.flying)//you are incorporal or flying..no shard stepping!
return
to_chat(M, "\red You step on \the [src]! ")
playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds
diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm
index a161755c285..809bf0d298d 100644
--- a/code/game/objects/items/weapons/shields.dm
+++ b/code/game/objects/items/weapons/shields.dm
@@ -1,5 +1,6 @@
/obj/item/weapon/shield
name = "shield"
+ block_chance = 50
/obj/item/weapon/shield/riot
name = "riot shield"
@@ -17,8 +18,10 @@
attack_verb = list("shoved", "bashed")
var/cooldown = 0 //shield bash cooldown. based on world.time
-/obj/item/weapon/shield/riot/IsShield()
- return 1
+/obj/item/weapon/shield/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
+ if(attack_type == THROWN_PROJECTILE_ATTACK)
+ final_block_chance += 30
+ return ..()
/obj/item/weapon/shield/riot/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/melee/baton))
@@ -41,12 +44,7 @@
icon_state = "buckler"
item_state = "buckler"
materials = list()
-
-/obj/item/weapon/shield/riot/buckler/IsShield()
- if(prob(60))
- return 1
- else
- return 0
+ block_chance = 30
/obj/item/weapon/shield/energy
name = "energy combat shield"
@@ -62,8 +60,8 @@
attack_verb = list("shoved", "bashed")
var/active = 0
-/obj/item/weapon/shield/energy/IsShield()
- return (active)
+/obj/item/weapon/shield/energy/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
+ return 0
/obj/item/weapon/shield/energy/IsReflect()
return (active)
@@ -109,8 +107,10 @@
w_class = 3
var/active = 0
-/obj/item/weapon/shield/riot/tele/IsShield()
- return (active)
+/obj/item/weapon/shield/riot/tele/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
+ if(active)
+ return ..()
+ return 0
/obj/item/weapon/shield/riot/tele/attack_self(mob/living/user)
active = !active
diff --git a/code/game/objects/items/weapons/signs.dm b/code/game/objects/items/weapons/signs.dm
index 7ad4f40b668..2155aeb69c6 100644
--- a/code/game/objects/items/weapons/signs.dm
+++ b/code/game/objects/items/weapons/signs.dm
@@ -4,7 +4,7 @@
name = "blank picket sign"
desc = "It's blank"
force = 5
- w_class = 4.0
+ w_class = 4
attack_verb = list("bashed","smacked")
var/delayed = 0 //used to do delays
@@ -35,7 +35,7 @@
sleep(8)
delayed = 0
-/datum/table_recipe/picket_sign
+/datum/crafting_recipe/picket_sign
name = "Picket Sign"
result = /obj/item/weapon/picket_sign
reqs = list(/obj/item/stack/rods = 1,
diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm
index 961547d362f..f21c0581888 100644
--- a/code/game/objects/items/weapons/soap.dm
+++ b/code/game/objects/items/weapons/soap.dm
@@ -4,7 +4,7 @@
gender = PLURAL
icon = 'icons/obj/items.dmi'
icon_state = "soap"
- w_class = 1.0
+ w_class = 1
throwforce = 0
throw_speed = 4
throw_range = 20
@@ -35,7 +35,7 @@
to_chat(user, "You 'clean' \the [target.name]. ")
if(istype(target, /turf/simulated))
new /obj/effect/decal/cleanable/blood/gibs/cleangibs(target)
- else if (istype(target,/mob/living/carbon))
+ else if(istype(target,/mob/living/carbon))
for(var/obj/item/carried_item in target.contents)
if(!istype(carried_item, /obj/item/weapon/implant))//If it's not an implant.
carried_item.add_blood(target)//Oh yes, there will be blood...
diff --git a/code/game/objects/items/weapons/staff.dm b/code/game/objects/items/weapons/staff.dm
index e36bed7a473..ffaadb59d59 100644
--- a/code/game/objects/items/weapons/staff.dm
+++ b/code/game/objects/items/weapons/staff.dm
@@ -7,8 +7,8 @@
throwforce = 5.0
throw_speed = 1
throw_range = 5
- w_class = 2.0
- flags = NOSHIELD
+ w_class = 2
+ armour_penetration = 100
attack_verb = list("bludgeoned", "whacked", "disciplined")
/obj/item/weapon/twohanded/staff/broom
@@ -72,5 +72,4 @@
throwforce = 5.0
throw_speed = 1
throw_range = 5
- w_class = 2.0
- flags = NOSHIELD
\ No newline at end of file
+ w_class = 2
diff --git a/code/game/objects/items/weapons/stock_parts.dm b/code/game/objects/items/weapons/stock_parts.dm
index 6e0500ffd38..e6e58196108 100644
--- a/code/game/objects/items/weapons/stock_parts.dm
+++ b/code/game/objects/items/weapons/stock_parts.dm
@@ -59,7 +59,7 @@
desc = "What?"
gender = PLURAL
icon = 'icons/obj/stock_parts.dmi'
- w_class = 2.0
+ w_class = 2
var/rating = 1
New()
src.pixel_x = rand(-5.0, 5)
diff --git a/code/game/objects/items/weapons/storage/artistic_toolbox.dm b/code/game/objects/items/weapons/storage/artistic_toolbox.dm
index 56a3279dde0..81ba661115a 100644
--- a/code/game/objects/items/weapons/storage/artistic_toolbox.dm
+++ b/code/game/objects/items/weapons/storage/artistic_toolbox.dm
@@ -73,7 +73,7 @@
..()
/obj/item/weapon/storage/toolbox/green/memetic/proc/consume(mob/M)
- if (!M)
+ if(!M)
return
hunger = 0
hunger_message_level = 0
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 6c59e98385f..fa8de4f51bf 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -10,7 +10,7 @@
item_state = "backpack"
lefthand_file = 'icons/mob/inhands/clothing_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing_righthand.dmi'
- w_class = 4.0
+ w_class = 4
slot_flags = SLOT_BACK //ERROOOOO
max_w_class = 3
max_combined_w_class = 21
@@ -63,13 +63,13 @@
. = ..()
proc/failcheck(mob/user as mob)
- if (prob(src.reliability)) return 1 //No failure
- if (prob(src.reliability))
+ if(prob(src.reliability)) return 1 //No failure
+ if(prob(src.reliability))
to_chat(user, "\red The Bluespace portal resists your attempt to add another item.")//light failure
else
to_chat(user, "\red The Bluespace generator malfunctions!")
- for (var/obj/O in src.contents) //it broke, delete what was in it
+ for(var/obj/O in src.contents) //it broke, delete what was in it
qdel(O)
crit_fail = 1
icon_state = "brokenpack"
@@ -85,7 +85,7 @@
desc = "Space Santa uses this to deliver toys to all the nice children in space on Christmas! Wow, it's pretty big!"
icon_state = "giftbag0"
item_state = "giftbag"
- w_class = 4.0
+ w_class = 4
max_w_class = 3
max_combined_w_class = 400 // can store a ton of shit!
@@ -322,6 +322,25 @@
new /obj/item/clothing/mask/muzzle(src)
new /obj/item/device/mmi/syndie(src)
+/obj/item/weapon/storage/backpack/duffel/syndie/surgery_fake //for maint spawns
+ name = "surgery dufflebag"
+ desc = "A suspicious looking dufflebag for holding surgery tools."
+ icon_state = "duffel-syndimed"
+ item_state = "duffle-syndimed"
+
+/obj/item/weapon/storage/backpack/duffel/syndie/surgery_fake/New()
+ ..()
+ new /obj/item/weapon/scalpel(src)
+ new /obj/item/weapon/hemostat(src)
+ new /obj/item/weapon/retractor(src)
+ new /obj/item/weapon/cautery(src)
+ new /obj/item/weapon/bonegel(src)
+ new /obj/item/weapon/bonesetter(src)
+ new /obj/item/weapon/FixOVein(src)
+ if(prob(50))
+ new /obj/item/weapon/circular_saw(src)
+ new /obj/item/weapon/surgicaldrill(src)
+
/obj/item/weapon/storage/backpack/duffel/captain
name = "captain's duffelbag"
desc = "A duffelbag designed to hold large quantities of condoms."
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 41bc851dff1..66cb11a9dd6 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -198,7 +198,7 @@
new /obj/item/seeds/grassseed(O.loc, O)
for(var/mob/M in range(1))
- if (M.s_active == src)
+ if(M.s_active == src)
src.close(M)
@@ -263,7 +263,7 @@
if(!inserted || !S.amount)
usr.unEquip(S)
usr.update_icons() //update our overlays
- if (usr.client && usr.s_active != src)
+ if(usr.client && usr.s_active != src)
usr.client.screen -= S
S.dropped(usr)
if(!S.amount)
@@ -296,7 +296,7 @@
var/row_num = 0
var/col_count = min(7,storage_slots) -1
- if (adjusted_contents > 7)
+ if(adjusted_contents > 7)
row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width.
src.standard_orient_objs(row_num, col_count, numbered_contents)
return
@@ -389,7 +389,7 @@
throwforce = 10.0
throw_speed = 3
throw_range = 5
- w_class = 4.0
+ w_class = 4
flags = CONDUCT
materials = list(MAT_METAL=3000)
@@ -432,17 +432,17 @@
/obj/item/weapon/storage/bag/tray/cyborg
/obj/item/weapon/storage/bag/tray/cyborg/afterattack(atom/target, mob/user as mob)
- if ( isturf(target) || istype(target,/obj/structure/table) )
+ if( isturf(target) || istype(target,/obj/structure/table) )
var foundtable = istype(target,/obj/structure/table/)
- if ( !foundtable ) //it must be a turf!
+ if( !foundtable ) //it must be a turf!
for(var/obj/structure/table/T in target)
foundtable = 1
break
var turf/dropspot
- if ( !foundtable ) // don't unload things onto walls or other silly places.
+ if( !foundtable ) // don't unload things onto walls or other silly places.
dropspot = user.loc
- else if ( isturf(target) ) // they clicked on a turf with a table in it
+ else if( isturf(target) ) // they clicked on a turf with a table in it
dropspot = target
else // they clicked on a table
dropspot = target.loc
@@ -462,8 +462,8 @@
if(I)
step(I, pick(NORTH,SOUTH,EAST,WEST))
sleep(rand(2,4))
- if ( droppedSomething )
- if ( foundtable )
+ if( droppedSomething )
+ if( foundtable )
user.visible_message("\blue [user] unloads their service tray.")
else
user.visible_message("\blue [user] drops all the items on their tray.")
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 07c8d836049..43d0897b2f9 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -26,7 +26,7 @@
if(!istype(over_object, /obj/screen))
return ..()
playsound(src.loc, "rustle", 50, 1, -5)
- if (!M.restrained() && !M.stat && can_use())
+ if(!M.restrained() && !M.stat && can_use())
switch(over_object.name)
if("r_hand")
M.unEquip(src)
@@ -68,10 +68,12 @@
new /obj/item/weapon/crowbar(src)
new /obj/item/weapon/wirecutters(src)
new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
+ update_icon()
/obj/item/weapon/storage/belt/utility/full/multitool/New()
..()
new /obj/item/device/multitool(src)
+ update_icon()
/obj/item/weapon/storage/belt/utility/atmostech/New()
..()
@@ -82,6 +84,7 @@
new /obj/item/weapon/wirecutters(src)
new /obj/item/device/t_scanner(src)
new /obj/item/weapon/extinguisher/mini(src)
+ update_icon()
@@ -124,6 +127,7 @@
new /obj/item/weapon/reagent_containers/food/pill/salicylic(src)
new /obj/item/weapon/reagent_containers/food/pill/salicylic(src)
new /obj/item/weapon/reagent_containers/food/pill/salicylic(src)
+ update_icon()
/obj/item/weapon/storage/belt/botany
@@ -183,6 +187,7 @@
/obj/item/weapon/storage/belt/security/sec/New()
..()
new /obj/item/device/flashlight/seclite(src)
+ update_icon()
/obj/item/weapon/storage/belt/security/response_team/New()
..()
@@ -191,6 +196,7 @@
new /obj/item/device/flash(src)
new /obj/item/weapon/melee/classic_baton/telescopic(src)
new /obj/item/weapon/grenade/flashbang(src)
+ update_icon()
/obj/item/weapon/storage/belt/soulstone
name = "soul stone belt"
@@ -211,6 +217,7 @@
new /obj/item/device/soulstone(src)
new /obj/item/device/soulstone(src)
new /obj/item/device/soulstone(src)
+ update_icon()
/obj/item/weapon/storage/belt/champion
@@ -262,6 +269,7 @@
new /obj/item/weapon/soap(src)
new /obj/item/weapon/grenade/chem_grenade/cleaner(src)
new /obj/item/weapon/grenade/chem_grenade/cleaner(src)
+ update_icon()
/obj/item/weapon/storage/belt/lazarus
name = "trainer's belt"
@@ -314,6 +322,7 @@
new /obj/item/ammo_casing/shotgun/beanbag(src)
new /obj/item/ammo_casing/shotgun/beanbag(src)
new /obj/item/ammo_casing/shotgun/beanbag(src)
+ update_icon()
/obj/item/weapon/storage/belt/bandolier/update_icon()
..()
@@ -365,6 +374,8 @@
for(var/obj/item/weapon/gun/magic/wand/W in contents) //All wands in this pack come in the best possible condition
W.max_charges = initial(W.max_charges)
W.charges = W.max_charges
+ update_icon()
+
/obj/item/weapon/storage/belt/fannypack
name = "fannypack"
@@ -442,13 +453,13 @@
can_hold = list()
proc/failcheck(mob/user as mob)
- if (prob(src.reliability)) return 1 //No failure
- if (prob(src.reliability))
+ if(prob(src.reliability)) return 1 //No failure
+ if(prob(src.reliability))
to_chat(user, "\red The Bluespace portal resists your attempt to add another item.")//light failure
else
to_chat(user, "\red The Bluespace generator malfunctions!")
- for (var/obj/O in src.contents) //it broke, delete what was in it
+ for(var/obj/O in src.contents) //it broke, delete what was in it
qdel(O)
crit_fail = 1
return 0
@@ -518,9 +529,9 @@
// As a last resort, the belt can be used as a plastic explosive with a fixed timer (15 seconds). Naturally, you'll lose all your gear...
// Of course, it could be worse. It could spawn a singularity!
/obj/item/weapon/storage/belt/bluespace/owlman/afterattack(atom/target as obj|turf, mob/user as mob, flag)
- if (!flag)
+ if(!flag)
return
- if (istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage) || istype(target, /obj/structure/table) || istype(target, /obj/structure/closet))
+ if(istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage) || istype(target, /obj/structure/table) || istype(target, /obj/structure/closet))
return
to_chat(user, "Planting explosives...")
user.visible_message("[user.name] is fiddling with their toolbelt.")
@@ -535,8 +546,8 @@
target = target
loc = null
var/location
- if (isturf(target)) location = target
- if (ismob(target))
+ if(isturf(target)) location = target
+ if(ismob(target))
target:attack_log += "\[[time_stamp()]\] Had the [name] planted on them by [user.real_name] ([user.ckey]) "
user.visible_message("\red [user.name] finished planting an explosive on [target.name]!")
target.overlays += image('icons/obj/assemblies.dmi', "plastic-explosive2")
@@ -546,12 +557,12 @@
if(ismob(target) || isobj(target))
location = target.loc // These things can move
explosion(location, -1, -1, 2, 3)
- if (istype(target, /turf/simulated/wall)) target:dismantle_wall(1)
+ if(istype(target, /turf/simulated/wall)) target:dismantle_wall(1)
else target.ex_act(1)
- if (isobj(target))
- if (target)
+ if(isobj(target))
+ if(target)
qdel(target)
- if (src)
+ if(src)
qdel(src)
*/
diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm
index 89c2adad79d..c66d9b56150 100644
--- a/code/game/objects/items/weapons/storage/bible.dm
+++ b/code/game/objects/items/weapons/storage/bible.dm
@@ -4,7 +4,7 @@
icon_state ="bible"
throw_speed = 1
throw_range = 5
- w_class = 3.0
+ w_class = 3
var/mob/affecting = null
var/deity_name = "Christ"
@@ -52,7 +52,7 @@
else
M.LAssailant = user
- if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
to_chat(user, "\red You don't have the dexterity to do this!")
return
if(!chaplain)
@@ -60,7 +60,7 @@
user.take_organ_damage(0,10)
return
- if ((CLUMSY in user.mutations) && prob(50))
+ if((CLUMSY in user.mutations) && prob(50))
to_chat(user, "\red The [src] slips out of your hand and hits your head.")
user.take_organ_damage(10)
user.Paralyse(20)
@@ -69,12 +69,12 @@
// if(..() == BLOCKED)
// return
- if (M.stat !=2)
+ if(M.stat !=2)
/*if((M.mind in ticker.mode.cult) && (prob(20)))
to_chat(M, "\red The power of [src.deity_name] clears your mind of heresy!")
to_chat(user, "\red You see how [M]'s eyes become clear, the cult no longer holds control over him!")
ticker.mode.remove_cultist(M.mind)*/
- if ((istype(M, /mob/living/carbon/human) && prob(60)))
+ if((istype(M, /mob/living/carbon/human) && prob(60)))
bless(M)
for(var/mob/O in viewers(M, null))
O.show_message(text("\red [] heals [] with the power of [src.deity_name]! ", user, M), 1)
@@ -96,7 +96,7 @@
/obj/item/weapon/storage/bible/afterattack(atom/A, mob/user as mob, proximity)
if(!proximity)
return
- if (istype(A, /turf/simulated/floor))
+ if(istype(A, /turf/simulated/floor))
to_chat(user, "You hit the floor with the bible. ")
if(user.mind && (user.mind.assigned_role == "Chaplain"))
call(/obj/effect/rune/proc/talismanreveal)(src)
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index ce1e6aad9bb..8348bef8bb1 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -39,22 +39,29 @@
New()
..()
contents = list()
- sleep(1)
new /obj/item/clothing/mask/breath( src )
new /obj/item/weapon/tank/emergency_oxygen( src )
new /obj/item/weapon/reagent_containers/hypospray/autoinjector( src )
return
-/obj/item/weapon/storage/box/engineer/
+/obj/item/weapon/storage/box/engineer
New()
..()
contents = list()
- sleep(1)
new /obj/item/clothing/mask/breath( src )
new /obj/item/weapon/tank/emergency_oxygen/engi( src )
new /obj/item/weapon/reagent_containers/hypospray/autoinjector( src )
return
+/obj/item/weapon/storage/box/survival_mining
+ New()
+ ..()
+ contents = list()
+ new /obj/item/clothing/mask/breath(src)
+ new /obj/item/weapon/tank/emergency_oxygen/engi(src)
+ new /obj/item/weapon/crowbar/red(src)
+ new /obj/item/weapon/reagent_containers/hypospray/autoinjector(src)
+
/obj/item/weapon/storage/box/gloves
name = "box of latex gloves"
desc = "Contains white gloves."
@@ -261,6 +268,19 @@
new /obj/item/weapon/implantcase/death_alarm(src)
new /obj/item/weapon/implanter(src)
+/obj/item/weapon/storage/box/tapes
+ name = "Tape Box"
+ desc = "A box of spare recording tapes"
+ icon_state = "box"
+
+ New()
+ ..()
+ new /obj/item/device/tape(src)
+ new /obj/item/device/tape(src)
+ new /obj/item/device/tape(src)
+ new /obj/item/device/tape(src)
+ new /obj/item/device/tape(src)
+ new /obj/item/device/tape(src)
/obj/item/weapon/storage/box/rxglasses
name = "prescription glasses"
@@ -603,7 +623,7 @@
icon_state = "syringe"
New()
..()
- for (var/i; i < storage_slots; i++)
+ for(var/i; i < storage_slots; i++)
new /obj/item/weapon/reagent_containers/hypospray/autoinjector(src)
/obj/item/weapon/storage/box/autoinjector/utility
diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm
index 390f7632ca3..543865aa592 100644
--- a/code/game/objects/items/weapons/storage/briefcase.dm
+++ b/code/game/objects/items/weapons/storage/briefcase.dm
@@ -8,7 +8,7 @@
force = 8.0
throw_speed = 2
throw_range = 4
- w_class = 4.0
+ w_class = 4
max_w_class = 3
max_combined_w_class = 21
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index 31ead836204..367874b0d7d 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -115,7 +115,7 @@
desc = "A box of crayons for all your rune drawing needs."
icon = 'icons/obj/crayons.dmi'
icon_state = "crayonbox"
- w_class = 2.0
+ w_class = 2
storage_slots = 6
icon_type = "crayon"
can_hold = list(
@@ -192,7 +192,6 @@
/obj/item/weapon/storage/fancy/cigarettes/update_icon()
icon_state = "[initial(icon_state)][contents.len]"
- desc = "There are [contents.len] cig\s left!"
return
/obj/item/weapon/storage/fancy/cigarettes/proc/lace_cigarette(var/obj/item/clothing/mask/cigarette/C as obj)
@@ -355,7 +354,7 @@
var/total_contents = src.contents.len - itemremoved
src.icon_state = "vialbox[total_contents]"
src.overlays.Cut()
- if (!broken)
+ if(!broken)
overlays += image(icon, src, "led[locked]")
if(locked)
overlays += image(icon, src, "cover")
@@ -386,4 +385,4 @@
new /obj/item/weapon/egg_scoop(src)
new /obj/item/weapon/fish_net(src)
new /obj/item/weapon/tank_brush(src)
- new /obj/item/weapon/fishfood(src)
\ No newline at end of file
+ new /obj/item/weapon/fishfood(src)
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index a11d00dbccd..82ee049d51d 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -31,7 +31,7 @@
New()
..()
- if (empty) return
+ if(empty) return
icon_state = pick("ointment","firefirstaid")
@@ -53,7 +53,7 @@
New()
..()
- if (empty) return
+ if(empty) return
new /obj/item/weapon/reagent_containers/food/pill/patch/styptic( src )
new /obj/item/weapon/reagent_containers/food/pill/patch/styptic( src )
new /obj/item/weapon/reagent_containers/food/pill/salicylic( src )
@@ -71,7 +71,7 @@
New()
..()
- if (empty) return
+ if(empty) return
icon_state = pick("antitoxin","antitoxfirstaid","antitoxfirstaid2","antitoxfirstaid3")
@@ -95,7 +95,7 @@
New()
..()
- if (empty) return
+ if(empty) return
new /obj/item/weapon/reagent_containers/food/pill/salbutamol( src )
new /obj/item/weapon/reagent_containers/food/pill/salbutamol( src )
new /obj/item/weapon/reagent_containers/food/pill/salbutamol( src )
@@ -114,7 +114,7 @@
New()
..()
- if (empty) return
+ if(empty) return
icon_state = pick("brute","brute2")
@@ -138,7 +138,7 @@
/obj/item/weapon/storage/firstaid/adv/New()
..()
- if (empty) return
+ if(empty) return
new /obj/item/weapon/reagent_containers/hypospray/autoinjector( src )
new /obj/item/stack/medical/advanced/bruise_pack(src)
new /obj/item/stack/medical/advanced/bruise_pack(src)
@@ -164,7 +164,7 @@
/obj/item/weapon/storage/firstaid/tactical/New()
..()
- if (empty) return
+ if(empty) return
new /obj/item/clothing/accessory/stethoscope( src )
new /obj/item/weapon/defibrillator/compact/combat/loaded(src)
new /obj/item/weapon/reagent_containers/hypospray/combat(src)
@@ -209,7 +209,7 @@
icon_state = "pill_canister"
icon = 'icons/obj/chemical.dmi'
item_state = "contsolid"
- w_class = 2.0
+ w_class = 2
can_hold = list("/obj/item/weapon/reagent_containers/food/pill","/obj/item/weapon/dice","/obj/item/weapon/paper")
allow_quick_gather = 1
use_to_pickup = 1
@@ -223,11 +223,11 @@
base_name = name
/obj/item/weapon/storage/pill_bottle/MouseDrop(obj/over_object as obj) //Quick pillbottle fix. -Agouri
- if (ishuman(usr)) //Can monkeys even place items in the pocket slots? Leaving this in just in case~
+ if(ishuman(usr)) //Can monkeys even place items in the pocket slots? Leaving this in just in case~
var/mob/M = usr
- if (!( istype(over_object, /obj/screen) ))
+ if(!( istype(over_object, /obj/screen) ))
return ..()
- if ((!( M.restrained() ) && !( M.stat ) /*&& M.pocket == src*/))
+ if((!( M.restrained() ) && !( M.stat ) /*&& M.pocket == src*/))
switch(over_object.name)
if("r_hand")
M.unEquip(src)
@@ -238,7 +238,7 @@
src.add_fingerprint(usr)
return
if(over_object == usr && in_range(src, usr) || usr.contents.Find(src))
- if (usr.s_active)
+ if(usr.s_active)
usr.s_active.close(usr)
src.show_to(usr)
return
diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm
index 33ddaf498f2..f3dab6ce8ea 100644
--- a/code/game/objects/items/weapons/storage/internal.dm
+++ b/code/game/objects/items/weapons/storage/internal.dm
@@ -30,24 +30,24 @@
//returns 1 if the master item's parent's MouseDrop() should be called, 0 otherwise. It's strange, but no other way of
//doing it without the ability to call another proc's parent, really.
/obj/item/weapon/storage/internal/proc/handle_mousedrop(mob/user as mob, obj/over_object as obj)
- if (ishuman(user)) //so monkeys can take off their backpacks -- Urist
+ if(ishuman(user)) //so monkeys can take off their backpacks -- Urist
- if (istype(user.loc,/obj/mecha)) // stops inventory actions in a mech
+ if(istype(user.loc,/obj/mecha)) // stops inventory actions in a mech
return 0
if(over_object == user && Adjacent(user)) // this must come before the screen objects only block
src.open(user)
return 0
- if (!( istype(over_object, /obj/screen) ))
+ if(!( istype(over_object, /obj/screen) ))
return 1
//makes sure master_item is equipped before putting it in hand, so that we can't drag it into our hand from miles away.
//there's got to be a better way of doing this...
- if (!(master_item.loc == user) || (master_item.loc && master_item.loc.loc == user))
+ if(!(master_item.loc == user) || (master_item.loc && master_item.loc.loc == user))
return 0
- if (!( user.restrained() ) && !( user.stat ))
+ if(!( user.restrained() ) && !( user.stat ))
switch(over_object.name)
if("r_hand")
user.unEquip(master_item)
@@ -76,12 +76,12 @@
return 0
src.add_fingerprint(user)
- if (master_item.loc == user)
+ if(master_item.loc == user)
src.open(user)
return 0
for(var/mob/M in range(1, master_item.loc))
- if (M.s_active == src)
+ if(M.s_active == src)
src.close(M)
return 1
diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm
index af927acf19a..7cc71918905 100644
--- a/code/game/objects/items/weapons/storage/lockbox.dm
+++ b/code/game/objects/items/weapons/storage/lockbox.dm
@@ -18,7 +18,7 @@
attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/card/id))
+ if(istype(W, /obj/item/weapon/card/id))
if(src.broken)
to_chat(user, "It appears to be broken. ")
return
@@ -81,7 +81,7 @@
storage_slots = 1
/obj/item/weapon/storage/lockbox/loyalty
- name = "Lockbox (Loyalty Implants)"
+ name = "Lockbox (Mindshield Implants)"
req_access = list(access_security)
New()
diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm
index dba3fb620e3..dad7b46a161 100644
--- a/code/game/objects/items/weapons/storage/secure.dm
+++ b/code/game/objects/items/weapons/storage/secure.dm
@@ -23,7 +23,7 @@
var/l_hacking = 0
var/emagged = 0
var/open = 0
- w_class = 3.0
+ w_class = 3
max_w_class = 2
max_combined_w_class = 14
@@ -33,19 +33,19 @@
attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(locked)
- if ((istype(W, /obj/item/weapon/melee/energy/blade)) && (!src.emagged))
+ if((istype(W, /obj/item/weapon/melee/energy/blade)) && (!src.emagged))
emag_act(user, W)
- if (istype(W, /obj/item/weapon/screwdriver))
- if (do_after(user, 20, target = src))
+ if(istype(W, /obj/item/weapon/screwdriver))
+ if(do_after(user, 20, target = src))
src.open =! src.open
user.show_message(text("\blue You [] the service panel.", (src.open ? "open" : "close")))
return
- if ((istype(W, /obj/item/device/multitool)) && (src.open == 1)&& (!src.l_hacking))
+ if((istype(W, /obj/item/device/multitool)) && (src.open == 1)&& (!src.l_hacking))
user.show_message(text("\red Now attempting to reset internal memory, please hold."), 1)
src.l_hacking = 1
- if (do_after(usr, 100, target = src))
- if (prob(40))
+ if(do_after(usr, 100, target = src))
+ if(prob(40))
src.l_setshort = 1
src.l_set = 0
user.show_message(text("\red Internal memory reset. Please give it a few seconds to reinitialize."), 1)
@@ -85,7 +85,7 @@
MouseDrop(over_object, src_location, over_location)
- if (locked)
+ if(locked)
src.add_fingerprint(usr)
return
..()
@@ -95,28 +95,28 @@
user.set_machine(src)
var/dat = text("[] \n\nLock Status: []",src, (src.locked ? "LOCKED" : "UNLOCKED"))
var/message = "Code"
- if ((src.l_set == 0) && (!src.emagged) && (!src.l_setshort))
+ if((src.l_set == 0) && (!src.emagged) && (!src.l_setshort))
dat += text("\n5-DIGIT PASSCODE NOT SET. ENTER NEW PASSCODE. ")
- if (src.emagged)
+ if(src.emagged)
dat += text("
\nLOCKING SYSTEM ERROR - 1701 ")
- if (src.l_setshort)
+ if(src.l_setshort)
dat += text("
\nALERT: MEMORY SYSTEM ERROR - 6040 201 ")
message = text("[]", src.code)
- if (!src.locked)
+ if(!src.locked)
message = "*****"
dat += text("
\n>[] \n1 -2 -3 \n4 -5 -6 \n7 -8 -9 \nR -0 -E \n", message, src, src, src, src, src, src, src, src, src, src, src, src)
user << browse(dat, "window=caselock;size=300x280")
Topic(href, href_list)
..()
- if ((usr.stat || usr.restrained()) || (get_dist(src, usr) > 1))
+ if((usr.stat || usr.restrained()) || (get_dist(src, usr) > 1))
return
- if (href_list["type"])
- if (href_list["type"] == "E")
- if ((src.l_set == 0) && (length(src.code) == 5) && (!src.l_setshort) && (src.code != "ERROR"))
+ if(href_list["type"])
+ if(href_list["type"] == "E")
+ if((src.l_set == 0) && (length(src.code) == 5) && (!src.l_setshort) && (src.code != "ERROR"))
src.l_code = src.code
src.l_set = 1
- else if ((src.code == src.l_code) && (src.emagged == 0) && (src.l_set == 1))
+ else if((src.code == src.l_code) && (src.emagged == 0) && (src.l_set == 1))
src.locked = 0
src.overlays = null
overlays += image('icons/obj/storage.dmi', icon_opened)
@@ -124,18 +124,18 @@
else
src.code = "ERROR"
else
- if ((href_list["type"] == "R") && (src.emagged == 0) && (!src.l_setshort))
+ if((href_list["type"] == "R") && (src.emagged == 0) && (!src.l_setshort))
src.locked = 1
src.overlays = null
src.code = null
src.close(usr)
else
src.code += text("[]", href_list["type"])
- if (length(src.code) > 5)
+ if(length(src.code) > 5)
src.code = "ERROR"
src.add_fingerprint(usr)
for(var/mob/M in viewers(1, src.loc))
- if ((M.client && M.machine == src))
+ if((M.client && M.machine == src))
src.attack_self(M)
return
return
@@ -165,7 +165,7 @@
force = 8.0
throw_speed = 2
throw_range = 4
- w_class = 4.0
+ w_class = 4
max_w_class = 3
max_combined_w_class = 21
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
@@ -176,17 +176,17 @@
new /obj/item/weapon/pen(src)
attack_hand(mob/user as mob)
- if ((src.loc == user) && (src.locked == 1))
+ if((src.loc == user) && (src.locked == 1))
to_chat(usr, "\red [src] is locked and cannot be opened!")
- else if ((src.loc == user) && (!src.locked))
+ else if((src.loc == user) && (!src.locked))
playsound(src.loc, "rustle", 50, 1, -5)
- if (user.s_active)
+ if(user.s_active)
user.s_active.close(user) //Close and re-open
src.show_to(user)
else
..()
for(var/mob/M in range(1))
- if (M.s_active == src)
+ if(M.s_active == src)
src.close(M)
src.orient2hud(user)
src.add_fingerprint(user)
@@ -213,7 +213,7 @@
icon_locking = "safeb"
icon_sparking = "safespark"
force = 8.0
- w_class = 5.0
+ w_class = 5
max_w_class = 8
anchored = 1.0
density = 0
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 9bbc26017be..e2324fcb434 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -8,7 +8,7 @@
/obj/item/weapon/storage
name = "storage"
icon = 'icons/obj/storage.dmi'
- w_class = 3.0
+ w_class = 3
var/silent = 0 // No message on putting items in
var/list/can_hold = new/list() //List of objects which this item can store (if set, it can't store anything else)
var/list/cant_hold = new/list() //List of objects which this item can't store (in effect only if can_hold isn't set)
@@ -26,10 +26,10 @@
var/use_sound = "rustle" //sound played when used. null for no sound.
/obj/item/weapon/storage/MouseDrop(obj/over_object as obj)
- if (ishuman(usr)) //so monkeys can take off their backpacks -- Urist
+ if(ishuman(usr)) //so monkeys can take off their backpacks -- Urist
var/mob/M = usr
- if (istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
+ if(istype(usr.loc,/obj/mecha)) // stops inventory actions in a mech
return
if(over_object == M && Adjacent(M)) // this must come before the screen objects only block
@@ -39,12 +39,12 @@
show_to(M)
return
- if ((istype(over_object, /obj/structure/table) || istype(over_object, /turf/simulated/floor)) \
+ if((istype(over_object, /obj/structure/table) || istype(over_object, /turf/simulated/floor)) \
&& contents.len && loc == usr && !usr.stat && !usr.restrained() && usr.canmove && over_object.Adjacent(usr) \
&& !istype(src, /obj/item/weapon/storage/lockbox))
var/turf/T = get_turf(over_object)
- if (istype(over_object, /turf/simulated/floor))
- if (get_turf(usr) != T)
+ if(istype(over_object, /turf/simulated/floor))
+ if(get_turf(usr) != T)
return // Can only empty containers onto the floor under you
if("Yes" != alert(usr,"Empty \the [src] onto \the [T]?","Confirm","Yes","No"))
return
@@ -59,12 +59,12 @@
update_icon() // For content-sensitive icons
return
- if (!( istype(over_object, /obj/screen) ))
+ if(!( istype(over_object, /obj/screen) ))
return ..()
- if (!(src.loc == usr) || (src.loc && src.loc.loc == usr))
+ if(!(src.loc == usr) || (src.loc && src.loc.loc == usr))
return
playsound(src.loc, "rustle", 50, 1, -5)
- if (!( M.restrained() ) && !( M.stat ))
+ if(!( M.restrained() ) && !( M.stat ))
switch(over_object.name)
if("r_hand")
if(!M.unEquip(src))
@@ -77,7 +77,7 @@
src.add_fingerprint(usr)
return
if(over_object == usr && in_range(src, usr) || usr.contents.Find(src))
- if (usr.s_active)
+ if(usr.s_active)
usr.s_active.close(usr)
src.show_to(usr)
return
@@ -94,7 +94,7 @@
L += S.return_inv()
for(var/obj/item/weapon/gift/G in src)
L += G.gift
- if (istype(G.gift, /obj/item/weapon/storage))
+ if(istype(G.gift, /obj/item/weapon/storage))
L += G.gift:return_inv()
for(var/obj/item/weapon/folder/F in src)
L += F.contents
@@ -128,11 +128,11 @@
return
/obj/item/weapon/storage/proc/open(mob/user as mob)
- if (src.use_sound)
+ if(src.use_sound)
playsound(src.loc, src.use_sound, 50, 1, -5)
orient2hud(user)
- if (user.s_active)
+ if(user.s_active)
user.s_active.close(user)
show_to(user)
@@ -153,7 +153,7 @@
O.layer = 20
O.plane = HUD_PLANE
cx++
- if (cx > mx)
+ if(cx > mx)
cx = tx
cy--
src.closer.screen_loc = "[mx+1],[my]"
@@ -173,7 +173,7 @@
ND.sample_object.layer = 20
ND.sample_object.plane = HUD_PLANE
cx++
- if (cx > (4+cols))
+ if(cx > (4+cols))
cx = 4
cy--
else
@@ -184,7 +184,7 @@
O.layer = 20
O.plane = HUD_PLANE
cx++
- if (cx > (4+cols))
+ if(cx > (4+cols))
cx = 4
cy--
src.closer.screen_loc = "[4+cols+1]:16,2:16"
@@ -224,7 +224,7 @@
//var/mob/living/carbon/human/H = user
var/row_num = 0
var/col_count = min(7,storage_slots) -1
- if (adjusted_contents > 7)
+ if(adjusted_contents > 7)
row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width.
src.standard_orient_objs(row_num, col_count, numbered_contents)
return
@@ -249,7 +249,7 @@
break
if(!ok)
if(!stop_messages)
- if (istype(W, /obj/item/weapon/hand_labeler))
+ if(istype(W, /obj/item/weapon/hand_labeler))
return 0
to_chat(usr, "[src] cannot hold [W]. ")
return 0
@@ -260,7 +260,7 @@
to_chat(usr, "[src] cannot hold [W]. ")
return 0
- if (W.w_class > max_w_class)
+ if(W.w_class > max_w_class)
if(!stop_messages)
to_chat(usr, "[W] is too big for this [src]. ")
return 0
@@ -301,18 +301,18 @@
W.loc = src
W.on_enter_storage(src)
if(usr)
- if (usr.client && usr.s_active != src)
+ if(usr.client && usr.s_active != src)
usr.client.screen -= W
W.dropped(usr)
add_fingerprint(usr)
if(!prevent_warning && !istype(W, /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow))
for(var/mob/M in viewers(usr, null))
- if (M == usr)
+ if(M == usr)
to_chat(usr, "You put the [W] into [src]. ")
- else if (M in range(1)) //If someone is standing close enough, they can tell what it is...
+ else if(M in range(1)) //If someone is standing close enough, they can tell what it is...
M.show_message("[usr] puts [W] into [src]. ")
- else if (W && W.w_class >= 3.0) //Otherwise they can only see large or normal items from a distance...
+ else if(W && W.w_class >= 3.0) //Otherwise they can only see large or normal items from a distance...
M.show_message("[usr] puts [W] into [src]. ")
src.orient2hud(usr)
@@ -331,8 +331,8 @@
F.update_icon(1)
for(var/mob/M in range(1, src.loc))
- if (M.s_active == src)
- if (M.client)
+ if(M.s_active == src)
+ if(M.client)
M.client.screen -= W
if(new_location)
@@ -373,9 +373,6 @@
handle_item_insertion(W)
return 1
-/obj/item/weapon/storage/dropped(mob/user as mob)
- return
-
/obj/item/weapon/storage/attack_hand(mob/user as mob)
playsound(src.loc, "rustle", 50, 1, -5)
@@ -392,14 +389,14 @@
return
src.orient2hud(user)
- if (src.loc == user)
- if (user.s_active)
+ if(src.loc == user)
+ if(user.s_active)
user.s_active.close(user)
src.show_to(user)
else
..()
for(var/mob/M in range(1))
- if (M.s_active == src)
+ if(M.s_active == src)
src.close(M)
src.add_fingerprint(user)
return
@@ -409,7 +406,7 @@
set category = "Object"
collection_mode = !collection_mode
- switch (collection_mode)
+ switch(collection_mode)
if(1)
to_chat(usr, "[src] now picks up all items in a tile at once.")
if(0)
@@ -488,19 +485,19 @@
return
//Otherwise we'll try to fold it.
- if ( contents.len )
+ if( contents.len )
return
- if ( !ispath(src.foldable) )
+ if( !ispath(src.foldable) )
return
var/found = 0
// Close any open UI windows first
for(var/mob/M in range(1))
- if (M.s_active == src)
+ if(M.s_active == src)
src.close(M)
- if ( M == user )
+ if( M == user )
found = 1
- if ( !found ) // User is too far away
+ if( !found ) // User is too far away
return
// Now make the cardboard
to_chat(user, "You fold [src] flat. ")
@@ -514,14 +511,14 @@
var/depth = 0
var/atom/cur_atom = src
- while (cur_atom && !(cur_atom in container.contents))
- if (isarea(cur_atom))
+ while(cur_atom && !(cur_atom in container.contents))
+ if(isarea(cur_atom))
return -1
- if (istype(cur_atom.loc, /obj/item/weapon/storage))
+ if(istype(cur_atom.loc, /obj/item/weapon/storage))
depth++
cur_atom = cur_atom.loc
- if (!cur_atom)
+ if(!cur_atom)
return -1 //inside something with a null loc.
return depth
@@ -532,14 +529,14 @@
var/depth = 0
var/atom/cur_atom = src
- while (cur_atom && !isturf(cur_atom))
- if (isarea(cur_atom))
+ while(cur_atom && !isturf(cur_atom))
+ if(isarea(cur_atom))
return -1
- if (istype(cur_atom.loc, /obj/item/weapon/storage))
+ if(istype(cur_atom.loc, /obj/item/weapon/storage))
depth++
cur_atom = cur_atom.loc
- if (!cur_atom)
+ if(!cur_atom)
return -1 //inside something with a null loc.
return depth
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index 22e46163fa3..fd44bacbf53 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -9,7 +9,7 @@
throwforce = 10.0
throw_speed = 2
throw_range = 7
- w_class = 4.0
+ w_class = 4
materials = list(MAT_METAL = 500)
origin_tech = "combat=1"
attack_verb = list("robusted")
@@ -17,7 +17,7 @@
New()
..()
- if (src.type == /obj/item/weapon/storage/toolbox)
+ if(src.type == /obj/item/weapon/storage/toolbox)
to_chat(world, "BAD: [src] ([src.type]) spawned at [src.x] [src.y] [src.z]")
qdel(src)
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index e5ebf843c6e..71d488672aa 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -1,7 +1,7 @@
/obj/item/weapon/storage/box/syndicate/
New()
..()
- switch (pickweight(list("bloodyspai" = 1, "stealth" = 1, "bond" = 1, "screwed" = 1, "guns" = 1, "murder" = 1, "implant" = 1, "hacker" = 1, "lordsingulo" = 1, "darklord" = 1)))
+ switch(pickweight(list("bloodyspai" = 1, "stealth" = 1, "bond" = 1, "screwed" = 1, "guns" = 1, "murder" = 1, "implant" = 1, "hacker" = 1, "lordsingulo" = 1, "darklord" = 1)))
if("bloodyspai")
new /obj/item/clothing/under/chameleon(src)
new /obj/item/clothing/mask/gas/voice(src)
@@ -37,7 +37,7 @@
new /obj/item/weapon/gun/projectile/revolver(src)
new /obj/item/ammo_box/a357(src)
new /obj/item/weapon/card/emag(src)
- new /obj/item/weapon/c4(src)
+ new /obj/item/weapon/grenade/plastic/c4(src)
new /obj/item/clothing/gloves/color/latex/nitrile(src)
new /obj/item/clothing/mask/gas/clown_hat(src)
new /obj/item/clothing/under/suit_jacket/really_black(src)
@@ -118,7 +118,16 @@
..()
new /obj/item/clothing/suit/space/rig/syndi/elite(src)
new /obj/item/clothing/head/helmet/space/rig/syndi/elite(src)
- return
+
+/obj/item/weapon/storage/box/syndie_kit/shielded_hardsuit
+ name = "Boxed Shielded Syndicate Hardsuit and Helmet"
+ can_hold = list("/obj/item/clothing/suit/space/rig/shielded/syndi", "/obj/item/clothing/head/helmet/space/rig/shielded/syndi")
+ max_w_class = 4
+
+/obj/item/weapon/storage/box/syndie_kit/shielded_hardsuit/New()
+ ..()
+ new /obj/item/clothing/suit/space/rig/shielded/syndi(src)
+ new /obj/item/clothing/head/helmet/space/rig/shielded/syndi(src)
/obj/item/weapon/storage/box/syndie_kit/conversion
name = "box (CK)"
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index db834beeb45..305befe2ecb 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -24,6 +24,7 @@
return
/obj/item/weapon/melee/baton/CheckParts()
+ ..()
bcell = locate(/obj/item/weapon/stock_parts/cell) in contents
update_icon()
@@ -132,6 +133,11 @@
/obj/item/weapon/melee/baton/proc/baton_stun(mob/living/L, mob/user)
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ if(H.check_shields(0, "[user]'s [name]", src, MELEE_ATTACK)) //No message; check_shields() handles that
+ playsound(L, 'sound/weapons/Genhit.ogg', 50, 1)
+ return
user.lastattacked = L
L.lastattacker = user
@@ -182,13 +188,6 @@
/obj/item/weapon/melee/baton/loaded/robot
hitcost = 1000
-
-/obj/item/weapon/melee/baton/loaded/ntcane
- name = "fancy cane"
- desc = "A cane with special engraving on it. It has a strange button on the handle..."
- icon_state = "cane_nt"
- item_state = "cane_nt"
-
//Makeshift stun baton. Replacement for stun gloves.
/obj/item/weapon/melee/baton/cattleprod
name = "stunprod"
@@ -207,4 +206,4 @@
else if(!bcell)
icon_state = "stunprod_nocell"
else
- icon_state = "stunprod"
\ No newline at end of file
+ icon_state = "stunprod"
diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm
index 63346476021..55f7c4d5eb8 100644
--- a/code/game/objects/items/weapons/swords_axes_etc.dm
+++ b/code/game/objects/items/weapons/swords_axes_etc.dm
@@ -46,11 +46,15 @@
return
if(!isliving(target))
return
- if (user.a_intent == I_HARM)
+ if(user.a_intent == I_HARM)
if(!..()) return
if(!isrobot(target)) return
else
if(cooldown <= 0)
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ if(H.check_shields(0, "[user]'s [name]", src, MELEE_ATTACK))
+ return 0
playsound(get_turf(src), 'sound/effects/woodhit.ogg', 75, 1, -1)
target.Weaken(3)
add_logs(target, user, "stunned", object="[src]")
@@ -68,6 +72,13 @@
else
return ..()
+/obj/item/weapon/melee/classic_baton/ntcane
+ name = "fancy cane"
+ desc = "A cane with special engraving on it. It seems well suited for fending off assailants..."
+ icon_state = "cane_nt"
+ item_state = "cane_nt"
+ needs_permit = 0
+
//Telescopic baton
/obj/item/weapon/melee/classic_baton/telescopic
name = "telescopic baton"
diff --git a/code/game/objects/items/weapons/syndie_uplink.dm b/code/game/objects/items/weapons/syndie_uplink.dm
index 173c9ff2960..3dd9a230ad1 100644
--- a/code/game/objects/items/weapons/syndie_uplink.dm
+++ b/code/game/objects/items/weapons/syndie_uplink.dm
@@ -10,7 +10,7 @@
var/mob/currentUser = null
var/obj/item/device/radio/origradio = null
flags = CONDUCT | ONBELT
- w_class = 2.0
+ w_class = 2
item_state = "radio"
throw_speed = 4
throw_range = 20
@@ -31,7 +31,7 @@
slot_flags = SLOT_BELT
item_state = "radio"
throwforce = 5
- w_class = 2.0
+ w_class = 2
throw_speed = 4
throw_range = 20
materials = list(MAT_METAL=100)
diff --git a/code/game/objects/items/weapons/table_rack_parts.dm b/code/game/objects/items/weapons/table_rack_parts.dm
index 4f5db94d4af..62c2f7aabfd 100644
--- a/code/game/objects/items/weapons/table_rack_parts.dm
+++ b/code/game/objects/items/weapons/table_rack_parts.dm
@@ -96,7 +96,7 @@
*/
/obj/item/weapon/rack_parts/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
..()
- if (istype(W, /obj/item/weapon/wrench))
+ if(istype(W, /obj/item/weapon/wrench))
new /obj/item/stack/sheet/metal(user.loc)
qdel(src)
diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm
index 68fe80fdbfb..af2c59c4759 100644
--- a/code/game/objects/items/weapons/tanks/jetpack.dm
+++ b/code/game/objects/items/weapons/tanks/jetpack.dm
@@ -4,76 +4,90 @@
name = "Jetpack (Empty)"
desc = "A tank of compressed gas for use as propulsion in zero-gravity areas. Use with caution."
icon_state = "jetpack"
- w_class = 4.0
+ w_class = 4
item_state = "jetpack"
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
var/datum/effect/system/ion_trail_follow/ion_trail
- var/on = 0.0
- var/stabilization_on = 0
+ actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
+ var/on = 0
+ var/stabilizers = 0
var/volume_rate = 500 //Needed for borg jetpack transfer
- action_button_name = "Toggle Jetpack"
/obj/item/weapon/tank/jetpack/New()
..()
- src.ion_trail = new /datum/effect/system/ion_trail_follow()
- src.ion_trail.set_up(src)
- return
+ ion_trail = new /datum/effect/system/ion_trail_follow()
+ ion_trail.set_up(src)
/obj/item/weapon/tank/jetpack/Destroy()
qdel(ion_trail)
ion_trail = null
return ..()
+/obj/item/weapon/tank/jetpack/ui_action_click(mob/user, actiontype)
+ if(actiontype == /datum/action/item_action/toggle_jetpack)
+ cycle(user)
+ else if(actiontype == /datum/action/item_action/jetpack_stabilization)
+ toggle_stabilization(user)
+ else
+ toggle_internals(user)
+
+/obj/item/weapon/tank/jetpack/proc/toggle_stabilization(mob/user)
+ if(on)
+ stabilizers = !stabilizers
+ to_chat(user, "You turn [src]'s stabilization [stabilizers ? "on" : "off"]. ")
+
+
/obj/item/weapon/tank/jetpack/examine(mob/user)
if(!..(user, 0))
return
if(air_contents.oxygen < 10)
- to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of air! "))
+ to_chat(user, "The meter on [src] indicates you are almost out of air! ")
playsound(user, 'sound/effects/alert.ogg', 50, 1)
-/obj/item/weapon/tank/jetpack/verb/toggle_rockets()
- set name = "Toggle Jetpack Stabilization"
- set category = "Object"
- src.stabilization_on = !( src.stabilization_on )
- to_chat(usr, "You toggle the stabilization [stabilization_on? "on":"off"].")
- return
+/obj/item/weapon/tank/jetpack/proc/cycle(mob/user)
+ if(user.incapacitated())
+ return
-
-/obj/item/weapon/tank/jetpack/verb/toggle()
- set name = "Toggle Jetpack"
- set category = "Object"
- on = !on
- if(on)
- icon_state = "[icon_state]-on"
-// item_state = "[item_state]-on"
- ion_trail.start()
+ if(!on)
+ turn_on()
+ to_chat(user, "You turn the jetpack on. ")
else
- icon_state = initial(icon_state)
-// item_state = initial(item_state)
- ion_trail.stop()
- return
+ turn_off()
+ to_chat(user, "You turn the jetpack off. ")
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
+
+
+/obj/item/weapon/tank/jetpack/proc/turn_on()
+ on = TRUE
+ icon_state = "[initial(icon_state)]-on"
+ ion_trail.start()
+
+/obj/item/weapon/tank/jetpack/proc/turn_off()
+ on = FALSE
+ stabilizers = FALSE
+ icon_state = initial(icon_state)
+ ion_trail.stop()
/obj/item/weapon/tank/jetpack/proc/allow_thrust(num, mob/living/user as mob)
- if(!(src.on))
+ if(!on)
return 0
- if((num < 0.005 || src.air_contents.total_moles() < num))
- src.ion_trail.stop()
+ if((num < 0.005 || air_contents.total_moles() < num))
+ turn_off()
return 0
- var/datum/gas_mixture/G = src.air_contents.remove(num)
-
- var/allgases = G.carbon_dioxide + G.nitrogen + G.oxygen + G.toxins //fuck trace gases -Pete
- if(allgases >= 0.005)
- . = 1
-
- qdel(G)
-
-/obj/item/weapon/tank/jetpack/ui_action_click()
- toggle()
+ var/datum/gas_mixture/removed = air_contents.remove(num)
+ if(removed.total_moles() < 0.005)
+ turn_off()
+ return 0
+ var/turf/T = get_turf(user)
+ T.assume_air(removed)
+ return 1
/obj/item/weapon/tank/jetpack/void
name = "Void Jetpack (Oxygen)"
@@ -124,8 +138,8 @@
/obj/item/weapon/tank/jetpack/carbondioxide/New()
..()
- src.ion_trail = new /datum/effect/system/ion_trail_follow()
- src.ion_trail.set_up(src)
+ ion_trail = new /datum/effect/system/ion_trail_follow()
+ ion_trail.set_up(src)
air_contents.carbon_dioxide = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
/obj/item/weapon/tank/jetpack/carbondioxide/examine(mob/user)
@@ -133,35 +147,32 @@
return
if(air_contents.carbon_dioxide < 10)
- to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of air! "))
+ to_chat(user, "The meter on [src] indicates you are almost out of air! ")
playsound(user, 'sound/effects/alert.ogg', 50, 1)
/obj/item/weapon/tank/jetpack/rig
name = "jetpack"
var/obj/item/weapon/rig/holder
+ actions_types = list(/datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization)
/obj/item/weapon/tank/jetpack/rig/examine()
to_chat(usr, "It's a jetpack. If you can see this, report it on the bug tracker.")
return 0
/obj/item/weapon/tank/jetpack/rig/allow_thrust(num, mob/living/user as mob)
-
- if(!(src.on))
+ if(!on)
return 0
if(!istype(holder) || !holder.air_supply)
return 0
- var/obj/item/weapon/tank/pressure_vessel = holder.air_supply
-
- if((num < 0.005 || pressure_vessel.air_contents.total_moles() < num))
- src.ion_trail.stop()
+ var/datum/gas_mixture/removed = holder.air_supply.air_contents.remove(num)
+ if(removed.total_moles() < 0.005)
+ turn_off()
return 0
- var/datum/gas_mixture/G = pressure_vessel.air_contents.remove(num)
+ var/turf/T = get_turf(user)
+ T.assume_air(removed)
- var/allgases = G.carbon_dioxide + G.nitrogen + G.oxygen + G.toxins
- if(allgases >= 0.005)
- . = 1
- qdel(G)
+ return 1
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
index 6767b88ac0d..485b800c105 100644
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -72,7 +72,7 @@
if(..(user, 0))
if(air_contents.oxygen < 1 && loc==usr)
to_chat(user, "\red The meter on the [src.name] indicates you are almost out of air! ")
- to_chat(user, sound('sound/effects/alert.ogg'))
+ user << sound('sound/effects/alert.ogg')
/obj/item/weapon/tank/air/New()
..()
@@ -100,9 +100,9 @@
/obj/item/weapon/tank/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
..()
- if (istype(W, /obj/item/weapon/flamethrower))
+ if(istype(W, /obj/item/weapon/flamethrower))
var/obj/item/weapon/flamethrower/F = W
- if ((!F.status)||(F.ptank)) return
+ if((!F.status)||(F.ptank)) return
src.master = F
F.ptank = src
user.unEquip(src)
@@ -124,7 +124,7 @@
if(..(user, 0))
if(air_contents.toxins < 0.2 && loc==usr)
to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of plasma! "))
- to_chat(user, sound('sound/effects/alert.ogg'))
+ user << sound('sound/effects/alert.ogg')
/*
* Emergency Oxygen
@@ -135,7 +135,7 @@
icon_state = "emergency"
flags = CONDUCT
slot_flags = SLOT_BELT
- w_class = 2.0
+ w_class = 2
force = 4.0
distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
volume = 3 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011)
@@ -151,7 +151,7 @@
if(..(user, 0))
if(air_contents.oxygen < 0.2 && loc==usr)
to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of air! "))
- to_chat(user, sound('sound/effects/alert.ogg'))
+ user << sound('sound/effects/alert.ogg')
/obj/item/weapon/tank/emergency_oxygen/engi
name = "extended-capacity emergency oxygen tank"
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index b86ccbff3cf..9415e49d3cd 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -16,6 +16,7 @@
throw_speed = 1
throw_range = 4
+ actions_types = list(/datum/action/item_action/set_internals)
var/datum/gas_mixture/air_contents = null
var/distribute_pressure = ONE_ATMOSPHERE
var/integrity = 3
@@ -24,9 +25,9 @@
/obj/item/weapon/tank/New()
..()
- src.air_contents = new /datum/gas_mixture()
- src.air_contents.volume = volume //liters
- src.air_contents.temperature = T20C
+ air_contents = new /datum/gas_mixture()
+ air_contents.volume = volume //liters
+ air_contents.temperature = T20C
processing_objects.Add(src)
return
@@ -39,42 +40,78 @@
return ..()
+
+/obj/item/weapon/tank/ui_action_click(mob/user)
+ toggle_internals(user)
+
+/obj/item/weapon/tank/proc/toggle_internals(mob/user)
+ var/mob/living/carbon/C = user
+ if(!istype(C))
+ return 0
+
+ if(C.internal == src)
+ to_chat(C, "You close \the [src] valve. ")
+ C.internal = null
+ C.update_internals_hud_icon(0)
+ else
+ var/can_open_valve = 0
+ if(C.wear_mask && C.wear_mask.flags & AIRTIGHT)
+ can_open_valve = 1
+ else if(ishuman(C))
+ var/mob/living/carbon/human/H = C
+ if(H.head && H.head.flags & AIRTIGHT)
+ can_open_valve = 1
+
+ if(can_open_valve)
+ if(C.internal)
+ to_chat(C, "You switch your internals to [src]. ")
+ else
+ to_chat(C, "You open \the [src] valve. ")
+ C.internal = src
+ C.update_internals_hud_icon(1)
+ else
+ to_chat(C, "You are not wearing a suitable mask or helmet. ")
+ return 0
+
+ C.update_action_buttons_icon()
+
+
/obj/item/weapon/tank/examine(mob/user)
var/obj/icon = src
- if (istype(src.loc, /obj/item/assembly))
- icon = src.loc
- if (!in_range(src, user))
- if (icon == src)
- to_chat(user, "\blue It's \a \icon[icon][src]! If you want any more information you'll need to get closer.")
+ if(istype(loc, /obj/item/assembly))
+ icon = loc
+ if(!in_range(src, user))
+ if(icon == src)
+ to_chat(user, "\blue It's \a [bicon(icon)][src]! If you want any more information you'll need to get closer.")
return
- var/celsius_temperature = src.air_contents.temperature-T0C
+ var/celsius_temperature = air_contents.temperature-T0C
var/descriptive
- if (celsius_temperature < 20)
+ if(celsius_temperature < 20)
descriptive = "cold"
- else if (celsius_temperature < 40)
+ else if(celsius_temperature < 40)
descriptive = "room temperature"
- else if (celsius_temperature < 80)
+ else if(celsius_temperature < 80)
descriptive = "lukewarm"
- else if (celsius_temperature < 100)
+ else if(celsius_temperature < 100)
descriptive = "warm"
- else if (celsius_temperature < 300)
+ else if(celsius_temperature < 300)
descriptive = "hot"
else
descriptive = "furiously hot"
- to_chat(user, "\blue \The \icon[icon][src] feels [descriptive]")
+ to_chat(user, "\blue \The [bicon(icon)][src] feels [descriptive]")
return
/obj/item/weapon/tank/blob_act()
if(prob(50))
- var/turf/location = src.loc
- if (!( istype(location, /turf) ))
+ var/turf/location = loc
+ if(!( istype(location, /turf) ))
qdel(src)
- if(src.air_contents)
+ if(air_contents)
location.assume_air(air_contents)
qdel(src)
@@ -82,18 +119,18 @@
/obj/item/weapon/tank/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
..()
- src.add_fingerprint(user)
- if (istype(src.loc, /obj/item/assembly))
- icon = src.loc
+ add_fingerprint(user)
+ if(istype(loc, /obj/item/assembly))
+ icon = loc
- if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1)
+ if((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1)
atmosanalyzer_scan(air_contents, user)
if(istype(W, /obj/item/device/assembly_holder))
bomb_assemble(W,user)
/obj/item/weapon/tank/attack_self(mob/user as mob)
- if (!(src.air_contents))
+ if(!(air_contents))
return
ui_interact(user)
@@ -130,7 +167,7 @@
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "tanks.tmpl", "Tank", 500, 300)
@@ -142,49 +179,23 @@
ui.set_auto_update(1)
/obj/item/weapon/tank/Topic(href, href_list)
- ..()
- if (usr.stat|| usr.restrained())
- return 0
- if (src.loc != usr)
- return 0
+ if(..())
+ return 1
- if (href_list["dist_p"])
- if (href_list["dist_p"] == "reset")
- src.distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE
- else if (href_list["dist_p"] == "max")
- src.distribute_pressure = TANK_MAX_RELEASE_PRESSURE
+ if(href_list["dist_p"])
+ if(href_list["dist_p"] == "reset")
+ distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE
+ else if(href_list["dist_p"] == "max")
+ distribute_pressure = TANK_MAX_RELEASE_PRESSURE
else
var/cp = text2num(href_list["dist_p"])
- src.distribute_pressure += cp
- src.distribute_pressure = min(max(round(src.distribute_pressure), 0), TANK_MAX_RELEASE_PRESSURE)
- if (href_list["stat"])
- if(istype(loc,/mob/living/carbon))
- var/mob/living/carbon/location = loc
- if(location.internal == src)
- location.internal = null
- location.internals.icon_state = "internal0"
- to_chat(usr, "\blue You close the tank release valve.")
- if (location.internals)
- location.internals.icon_state = "internal0"
- else
+ distribute_pressure += cp
+ distribute_pressure = min(max(round(distribute_pressure), 0), TANK_MAX_RELEASE_PRESSURE)
- var/can_open_valve
- if(location.wear_mask && (location.wear_mask.flags & AIRTIGHT))
- can_open_valve = 1
- else if(istype(location,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = location
- if(H.head && (H.head.flags & AIRTIGHT))
- can_open_valve = 1
+ if(href_list["stat"])
+ toggle_internals(usr)
- if(can_open_valve)
- location.internal = src
- to_chat(usr, "\blue You open \the [src] valve.")
- if (location.internals)
- location.internals.icon_state = "internal1"
- else
- to_chat(usr, "\blue You need something to connect to \the [src].")
-
- src.add_fingerprint(usr)
+ add_fingerprint(usr)
return 1
@@ -226,9 +237,9 @@
var/pressure = air_contents.return_pressure()
if(pressure > TANK_FRAGMENT_PRESSURE)
- if(!istype(src.loc,/obj/item/device/transfer_valve))
- message_admins("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast] (JMP )")
- log_game("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast] at [x], [y], [z]")
+ if(!istype(loc,/obj/item/device/transfer_valve))
+ message_admins("Explosive tank rupture! last key to touch the tank was [fingerprintslast] (JMP )")
+ log_game("Explosive tank rupture! last key to touch the tank was [fingerprintslast] at [x], [y], [z]")
// to_chat(world, "\blue[x],[y] tank is exploding: [pressure] kPa")
//Give the gas a chance to build up more pressure through reacting
air_contents.react()
@@ -241,8 +252,8 @@
// to_chat(world, "\blue Exploding Pressure: [pressure] kPa, intensity: [range]")
explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5))
- if(istype(src.loc,/obj/item/device/transfer_valve))
- qdel(src.loc)
+ if(istype(loc,/obj/item/device/transfer_valve))
+ qdel(loc)
else
qdel(src)
@@ -253,7 +264,7 @@
if(!T)
return
T.assume_air(air_contents)
- playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3)
+ playsound(loc, 'sound/effects/spray.ogg', 10, 1, -3)
qdel(src)
else
integrity--
diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm
index 1d9cce844ff..e6e88563d4b 100644
--- a/code/game/objects/items/weapons/tanks/watertank.dm
+++ b/code/game/objects/items/weapons/tanks/watertank.dm
@@ -5,10 +5,10 @@
icon = 'icons/obj/watertank.dmi'
icon_state = "waterbackpack"
item_state = "waterbackpack"
- w_class = 4.0
+ w_class = 4
slot_flags = SLOT_BACK
slowdown = 1
- action_button_name = "Toggle Mister"
+ actions_types = list(/datum/action/item_action/toggle_mister)
var/obj/item/weapon/noz
var/on = 0
@@ -22,10 +22,14 @@
/obj/item/weapon/watertank/ui_action_click()
toggle_mister()
+/obj/item/weapon/watertank/item_action_slot_check(slot, mob/user)
+ if(slot == slot_back)
+ return 1
+
/obj/item/weapon/watertank/verb/toggle_mister()
set name = "Toggle Mister"
set category = "Object"
- if (usr.get_item_by_slot(slot_back) != src)
+ if(usr.get_item_by_slot(slot_back) != src)
to_chat(usr, "The watertank needs to be on your back to use. ")
return
if(usr.incapacitated())
@@ -52,7 +56,8 @@
return new /obj/item/weapon/reagent_containers/spray/mister(src)
/obj/item/weapon/watertank/equipped(mob/user, slot)
- if (slot != slot_back)
+ ..()
+ if(slot != slot_back)
remove_noz()
/obj/item/weapon/watertank/proc/remove_noz()
@@ -62,7 +67,7 @@
return
/obj/item/weapon/watertank/Destroy()
- if (on)
+ if(on)
remove_noz()
qdel(noz)
noz = null
@@ -75,8 +80,8 @@
..()
/obj/item/weapon/watertank/MouseDrop(obj/over_object)
- if(ishuman(src.loc))
- var/mob/living/carbon/human/H = src.loc
+ if(ishuman(loc))
+ var/mob/living/carbon/human/H = loc
switch(over_object.name)
if("r_hand")
if(H.r_hand)
@@ -108,7 +113,7 @@
icon = 'icons/obj/watertank.dmi'
icon_state = "mister"
item_state = "mister"
- w_class = 4.0
+ w_class = 4
amount_per_transfer_from_this = 50
possible_transfer_amounts = list(25,50,100)
volume = 500
@@ -125,6 +130,7 @@
return
/obj/item/weapon/reagent_containers/spray/mister/dropped(mob/user as mob)
+ ..()
to_chat(user, "The mister snaps back onto the watertank. ")
tank.on = 0
loc = tank
@@ -133,7 +139,7 @@
return
/proc/check_tank_exists(parent_tank, var/mob/living/carbon/human/M, var/obj/O)
- if (!parent_tank || !istype(parent_tank, /obj/item/weapon/watertank)) //To avoid weird issues from admin spawns
+ if(!parent_tank || !istype(parent_tank, /obj/item/weapon/watertank)) //To avoid weird issues from admin spawns
M.unEquip(O)
qdel(0)
return 0
@@ -198,6 +204,7 @@
return new /obj/item/weapon/extinguisher/mini/nozzle(src)
/obj/item/weapon/watertank/atmos/dropped(mob/user as mob)
+ ..()
icon_state = "waterbackpackatmos"
if(istype(noz, /obj/item/weapon/extinguisher/mini/nozzle))
var/obj/item/weapon/extinguisher/mini/nozzle/N = noz
@@ -255,6 +262,7 @@
return
/obj/item/weapon/extinguisher/mini/nozzle/dropped(mob/user as mob)
+ ..()
to_chat(user, "The nozzle snaps back onto the tank! ")
tank.on = 0
loc = tank
diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm
index 99567b5952a..4728e8c730e 100644
--- a/code/game/objects/items/weapons/teleportation.dm
+++ b/code/game/objects/items/weapons/teleportation.dm
@@ -17,7 +17,7 @@
var/broadcasting = null
var/listening = 1.0
flags = CONDUCT
- w_class = 2.0
+ w_class = 2
item_state = "electronic"
throw_speed = 4
throw_range = 20
@@ -27,7 +27,7 @@
/obj/item/weapon/locator/attack_self(mob/user as mob)
add_fingerprint(usr)
var/dat
- if (temp)
+ if(temp)
dat = "[src.temp]Clear "
else
dat = {"
@@ -52,25 +52,25 @@ Frequency:
to_chat(usr, "\The [src] is malfunctioning. ")
return 1
- if (href_list["refresh"])
+ if(href_list["refresh"])
temp = "Persistent Signal Locator "
var/turf/sr = get_turf(src)
- if (sr)
+ if(sr)
temp += "Located Beacons: "
for(var/obj/item/device/radio/beacon/W in beacons)
- if (W.frequency == frequency && !W.syndicate)
- if (W && W.z == z)
+ if(W.frequency == frequency && !W.syndicate)
+ if(W && W.z == z)
var/turf/TB = get_turf(W)
temp += "[W.code]: [TB.x], [TB.y], [TB.z] "
temp += "Located Implants: "
- for (var/obj/item/weapon/implant/tracking/T in tracked_implants)
- if (!T.implanted || !T.imp_in)
+ for(var/obj/item/weapon/implant/tracking/T in tracked_implants)
+ if(!T.implanted || !T.imp_in)
continue
- if (T && T.z == z)
+ if(T && T.z == z)
temp += "[T.id]: [T.imp_in.x], [T.imp_in.y], [T.imp_in.z] "
temp += "You are at \[[sr.x],[sr.y],[sr.z]\] ."
@@ -78,11 +78,11 @@ Frequency:
else
temp += "Processing error: Unable to locate orbital position. "
else
- if (href_list["freq"])
+ if(href_list["freq"])
frequency += text2num(href_list["freq"])
frequency = sanitize_frequency(frequency)
else
- if (href_list["temp"])
+ if(href_list["temp"])
temp = null
attack_self(usr)
@@ -98,7 +98,7 @@ Frequency:
icon_state = "hand_tele"
item_state = "electronic"
throwforce = 0
- w_class = 2.0
+ w_class = 2
throw_speed = 3
throw_range = 5
materials = list(MAT_METAL=10000)
@@ -123,12 +123,12 @@ Frequency:
if(T.x>world.maxx-8 || T.x<8) continue //putting them at the edge is dumb
if(T.y>world.maxy-8 || T.y<8) continue
A = get_area(T)
- if (A.tele_proof == 1) continue // Telescience-proofed areas require a beacon.
+ if(A.tele_proof == 1) continue // Telescience-proofed areas require a beacon.
turfs += T
if(turfs.len)
L["None (Dangerous)"] = pick(turfs)
var/t1 = input(user, "Please select a teleporter to lock in on.", "Hand Teleporter") as null|anything in L
- if (!t1 || (user.get_active_hand() != src || user.stat || user.restrained()))
+ if(!t1 || (user.get_active_hand() != src || user.stat || user.restrained()))
return
if(active_portals >= 3)
user.show_message("\The [src] is recharging! ")
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 2a9b64748dd..1452273573a 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -24,7 +24,7 @@
slot_flags = SLOT_BELT
force = 5.0
throwforce = 7.0
- w_class = 2.0
+ w_class = 2
materials = list(MAT_METAL=150)
origin_tech = "materials=1;engineering=1"
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
@@ -41,7 +41,7 @@
flags = CONDUCT
slot_flags = SLOT_BELT
force = 5.0
- w_class = 1.0
+ w_class = 1
throwforce = 5.0
throw_speed = 3
throw_range = 5
@@ -56,29 +56,29 @@
/obj/item/weapon/screwdriver/New()
switch(pick("red","blue","purple","brown","green","cyan","yellow"))
- if ("red")
+ if("red")
icon_state = "screwdriver2"
item_state = "screwdriver"
- if ("blue")
+ if("blue")
icon_state = "screwdriver"
item_state = "screwdriver_blue"
- if ("purple")
+ if("purple")
icon_state = "screwdriver3"
item_state = "screwdriver_purple"
- if ("brown")
+ if("brown")
icon_state = "screwdriver4"
item_state = "screwdriver_brown"
- if ("green")
+ if("green")
icon_state = "screwdriver5"
item_state = "screwdriver_green"
- if ("cyan")
+ if("cyan")
icon_state = "screwdriver6"
item_state = "screwdriver_cyan"
- if ("yellow")
+ if("yellow")
icon_state = "screwdriver7"
item_state = "screwdriver_yellow"
- if (prob(75))
+ if(prob(75))
src.pixel_y = rand(0, 16)
return
@@ -104,7 +104,7 @@
force = 6.0
throw_speed = 3
throw_range = 7
- w_class = 2.0
+ w_class = 2
materials = list(MAT_METAL=80)
origin_tech = "materials=1;engineering=1"
attack_verb = list("pinched", "nipped")
@@ -119,7 +119,7 @@
item_state = "cutters_yellow"
/obj/item/weapon/wirecutters/attack(mob/living/carbon/human/C as mob, mob/user as mob)
- if(C.handcuffed)
+ if(istype(C) && C.handcuffed)
if(istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable))
usr.visible_message("\The [usr] cuts \the [C]'s restraints with \the [src]!",\
"You cut \the [C]'s restraints with \the [src]!",\
@@ -235,7 +235,7 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting]
- if (!S)
+ if(!S)
return
if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP || S.open == 2)
@@ -243,7 +243,7 @@
if(S.brute_dam)
if(S.brute_dam < ROBOLIMB_SELF_REPAIR_CAP)
- if (remove_fuel(0,null))
+ if(remove_fuel(0,null))
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
S.heal_damage(15,0,0,1)
user.visible_message("\The [user] patches some dents on \the [M]'s [S.name] with \the [src]. ")
@@ -345,7 +345,7 @@
if(!message)
to_chat(user, "You switch [src] off. ")
else
- to_chat(user, "[src] shuts off! ")
+ visible_message("[src] shuts off! ")
force = 3
damtype = "brute"
hitsound = "swing_hit"
@@ -365,7 +365,7 @@
/obj/item/weapon/weldingtool/proc/flamethrower_rods(obj/item/I, mob/user)
if(!status)
var/obj/item/stack/rods/R = I
- if (R.use(1))
+ if(R.use(1))
var/obj/item/weapon/flamethrower/F = new /obj/item/weapon/flamethrower(user.loc)
if(!remove_item_from_storage(F))
user.unEquip(src)
@@ -409,7 +409,7 @@
icon_state = "upindwelder"
item_state = "upindwelder"
max_fuel = 80
- w_class = 3.0
+ w_class = 3
materials = list(MAT_METAL=70, MAT_GLASS=120)
origin_tech = "engineering=3"
@@ -419,7 +419,7 @@
icon_state = "exwelder"
item_state = "exwelder"
max_fuel = 40
- w_class = 3.0
+ w_class = 3
materials = list(MAT_METAL=70, MAT_GLASS=120)
origin_tech = "engineering=4;plasmatech=3"
var/last_gen = 0
@@ -453,7 +453,7 @@
force = 5.0
throwforce = 7.0
item_state = "crowbar"
- w_class = 2.0
+ w_class = 2
materials = list(MAT_METAL=50)
origin_tech = "engineering=1"
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
@@ -479,7 +479,7 @@
icon = 'icons/obj/weapons.dmi'
icon_state = "kit"
flags = CONDUCT
- w_class = 2.0
+ w_class = 2
origin_tech = "combat=2"
var/open = 0
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 29bcb4f8fe2..7ecbef740cd 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -74,7 +74,7 @@
to_chat(user, "You dedicate your module to [name]. ")
else
to_chat(user, "You grab the [name] with both hands. ")
- if (wieldsound)
+ if(wieldsound)
playsound(loc, wieldsound, 50, 1)
var/obj/item/weapon/twohanded/offhand/O = new(user) ////Let's reserve his other hand~
O.name = "[name] - offhand"
@@ -90,12 +90,13 @@
return ..()
/obj/item/weapon/twohanded/dropped(mob/user)
+ ..()
//handles unwielding a twohanded weapon when dropped as well as clearing up the offhand
if(user)
var/obj/item/weapon/twohanded/O = user.get_inactive_hand()
if(istype(O))
O.unwield(user)
- return unwield(user)
+ return unwield(user)
/obj/item/weapon/twohanded/update_icon()
return
@@ -109,7 +110,7 @@
///////////OFFHAND///////////////
/obj/item/weapon/twohanded/offhand
- w_class = 5.0
+ w_class = 5
icon_state = "offhand"
name = "offhand"
flags = ABSTRACT
@@ -120,18 +121,10 @@
/obj/item/weapon/twohanded/offhand/wield()
qdel(src)
-/obj/item/weapon/twohanded/offhand/IsShield()//if the actual twohanded weapon is a shield, we count as a shield too!
- var/mob/user = loc
- if(!istype(user)) return 0
- var/obj/item/I = user.get_active_hand()
- if(I == src) I = user.get_inactive_hand()
- if(!I) return 0
- return I.IsShield()
-
///////////Two hand required objects///////////////
//This is for objects that require two hands to even pick up
/obj/item/weapon/twohanded/required/
- w_class = 5.0
+ w_class = 5
/obj/item/weapon/twohanded/required/attack_self()
return
@@ -165,7 +158,7 @@
throwforce = 15
sharp = 1
edge = 1
- w_class = 4.0
+ w_class = 4
slot_flags = SLOT_BACK
force_unwielded = 5
force_wielded = 24
@@ -200,14 +193,15 @@
throwforce = 5.0
throw_speed = 1
throw_range = 5
- w_class = 2.0
+ w_class = 2
force_unwielded = 3
force_wielded = 34
wieldsound = 'sound/weapons/saberon.ogg'
unwieldsound = 'sound/weapons/saberoff.ogg'
- flags = NOSHIELD
+ armour_penetration = 35
origin_tech = "magnets=3;syndicate=4"
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ block_chance = 75
sharp = 1
edge = 1
no_embed = 1 // Like with the single-handed esword, this shouldn't be embedding in people.
@@ -237,11 +231,10 @@
user.dir = i
sleep(1)
-/obj/item/weapon/twohanded/dualsaber/IsShield()
+/obj/item/weapon/twohanded/dualsaber/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
if(wielded)
- return 1
- else
- return 0
+ return ..()
+ return 0
/obj/item/weapon/twohanded/dualsaber/green/New()
blade_color = "green"
@@ -287,14 +280,14 @@
name = "spear"
desc = "A haphazardly-constructed yet still deadly weapon of ancient design."
force = 10
- w_class = 4.0
+ w_class = 4
slot_flags = SLOT_BACK
force_unwielded = 10
force_wielded = 18 // Was 13, Buffed - RR
throwforce = 20
throw_speed = 3
+ armour_penetration = 10
no_spin_thrown = 1 // Thrown spears that spin look dumb. -Fox
- flags = NOSHIELD
attack_verb = list("attacked", "poked", "jabbed", "torn", "gored")
/obj/item/weapon/twohanded/spear/update_icon()
@@ -364,12 +357,12 @@
throwforce = 15
throw_speed = 1
throw_range = 5
- w_class = 4.0 // can't fit in backpacks
+ w_class = 4 // can't fit in backpacks
force_unwielded = 15 //still pretty robust
force_wielded = 40 //you'll gouge their eye out! Or a limb...maybe even their entire body!
wieldsound = 'sound/weapons/chainsawstart.ogg'
hitsound = null
- flags = NOSHIELD
+ armour_penetration = 35
origin_tech = "materials=6;syndicate=4"
attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered")
sharp = 1
@@ -578,7 +571,7 @@
Z.ex_act(2)
charged = 3
playsound(user, 'sound/weapons/marauder.ogg', 50, 1)
- else if (istype(A, /obj/structure) || istype(A, /obj/mecha/))
+ else if(istype(A, /obj/structure) || istype(A, /obj/mecha/))
var/obj/Z = A
Z.ex_act(2)
charged = 3
diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm
index 9f22daf08f8..a6a53b03606 100644
--- a/code/game/objects/items/weapons/vending_items.dm
+++ b/code/game/objects/items/weapons/vending_items.dm
@@ -10,7 +10,7 @@
throwforce = 10.0
throw_speed = 1
throw_range = 7
- w_class = 4.0
+ w_class = 4
var/charges = 0 //how many restocking "charges" the refill has
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 8ff2f931159..b9c946c6210 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -5,7 +5,7 @@
icon_state = "toyhammer"
slot_flags = SLOT_BELT
throwforce = 0
- w_class = 1.0
+ w_class = 1
throw_speed = 7
throw_range = 15
attack_verb = list("banned")
@@ -50,13 +50,11 @@
edge = 1
w_class = 3
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ block_chance = 50
- IsShield()
- return 1
-
- suicide_act(mob/user)
- to_chat(viewers(user), "[user] is falling on the [src.name]! It looks like \he's trying to commit suicide. ")
- return(BRUTELOSS)
+/obj/item/weapon/claymore/suicide_act(mob/user)
+ user.visible_message("[user] is falling on the [src.name]! It looks like \he's trying to commit suicide. ")
+ return(BRUTELOSS)
/obj/item/weapon/claymore/ceremonial
name = "ceremonial claymore"
@@ -77,6 +75,7 @@
w_class = 3
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ block_chance = 50
/obj/item/weapon/katana/cursed
slot_flags = null
@@ -85,9 +84,6 @@
user.visible_message("[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku. ")
return(BRUTELOSS)
-/obj/item/weapon/katana/IsShield()
- return 1
-
/obj/item/weapon/harpoon
name = "harpoon"
sharp = 1
diff --git a/code/game/objects/items/weapons/wires.dm b/code/game/objects/items/weapons/wires.dm
index abae807c80a..2e9fcdbff1a 100644
--- a/code/game/objects/items/weapons/wires.dm
+++ b/code/game/objects/items/weapons/wires.dm
@@ -17,7 +17,7 @@
/obj/item/weapon/wire/proc/update()
- if (src.amount > 1)
+ if(src.amount > 1)
src.icon_state = "spool_wire"
src.desc = text("This is just spool of regular insulated wire. It consists of about [] unit\s of wire.", src.amount)
else
@@ -26,7 +26,7 @@
return
/obj/item/weapon/wire/attack_self(mob/user as mob)
- if (src.laying)
+ if(src.laying)
src.laying = 0
to_chat(user, "\blue You're done laying wire!")
else
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index a8579613604..4e318d26fed 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -19,10 +19,6 @@
var/being_shocked = 0
- // What reagents should be logged when transferred TO this object?
- // Reagent ID => friendly name
- var/list/reagents_to_log=list()
-
var/on_blueprints = FALSE //Are we visible on the station blueprints at roundstart?
var/force_blueprints = FALSE //forces the obj to be on the blueprints, regardless of when it was created.
@@ -103,18 +99,18 @@
var/is_in_use = 0
var/list/nearby = viewers(1, src)
for(var/mob/M in nearby)
- if ((M.client && M.machine == src))
+ if((M.client && M.machine == src))
is_in_use = 1
src.attack_hand(M)
- if (istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot))
- if (!(usr in nearby))
- if (usr.client && usr.machine==src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh.
+ if(istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot))
+ if(!(usr in nearby))
+ if(usr.client && usr.machine==src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh.
is_in_use = 1
src.attack_ai(usr)
// check for TK users
- if (istype(usr, /mob/living/carbon/human))
+ if(istype(usr, /mob/living/carbon/human))
if(istype(usr.l_hand, /obj/item/tk_grab) || istype(usr.r_hand, /obj/item/tk_grab/))
if(!(usr in nearby))
if(usr.client && usr.machine==src)
@@ -128,7 +124,7 @@
var/list/nearby = viewers(1, src)
var/is_in_use = 0
for(var/mob/M in nearby)
- if ((M.client && M.machine == src))
+ if((M.client && M.machine == src))
is_in_use = 1
src.interact(M)
var/ai_in_use = AutoUpdateAI(src)
diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm
index 7b54984399a..23f5707c766 100644
--- a/code/game/objects/random/random.dm
+++ b/code/game/objects/random/random.dm
@@ -9,7 +9,7 @@
// creates a new object and deletes itself
/obj/random/New()
..()
- if (!prob(spawn_nothing_percentage))
+ if(!prob(spawn_nothing_percentage))
spawn_item()
qdel(src)
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 2bcabd8ac15..70b3e3c1d67 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -66,7 +66,7 @@
/obj/structure/proc/do_climb(var/mob/living/user)
- if (!can_touch(user) || !climbable)
+ if(!can_touch(user) || !climbable)
return
for(var/obj/O in range(0, src))
@@ -89,7 +89,7 @@
climber = null
return
- if (!can_touch(user) || !climbable)
+ if(!can_touch(user) || !climbable)
climber = null
return
@@ -99,7 +99,7 @@
return
usr.loc = get_turf(src)
- if (get_turf(user) == get_turf(src))
+ if(get_turf(user) == get_turf(src))
usr.visible_message("[user] climbs onto \the [src]! ")
climber = null
@@ -150,16 +150,16 @@
return
/obj/structure/proc/can_touch(var/mob/user)
- if (!user)
+ if(!user)
return 0
if(!Adjacent(user))
return 0
- if (user.restrained() || user.buckled)
+ if(user.restrained() || user.buckled)
to_chat(user, "You need your hands and legs free for this. ")
return 0
- if (user.stat || user.paralysis || user.sleeping || user.lying || user.weakened)
+ if(user.stat || user.paralysis || user.sleeping || user.lying || user.weakened)
return 0
- if (issilicon(user))
+ if(issilicon(user))
to_chat(user, "You need hands for this. ")
return 0
return 1
diff --git a/code/game/objects/structures/barsign.dm b/code/game/objects/structures/barsign.dm
index 86aa341d39c..93f4bb7be9b 100644
--- a/code/game/objects/structures/barsign.dm
+++ b/code/game/objects/structures/barsign.dm
@@ -49,10 +49,10 @@
/obj/structure/sign/barsign/attack_hand(mob/user as mob)
- if (!src.allowed(user))
+ if(!src.allowed(user))
to_chat(user, "Access denied. ")
return
- if (broken)
+ if(broken)
to_chat(user, "The controls seem unresponsive. ")
return
pick_sign()
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index f7e178716c5..31958409954 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -14,7 +14,7 @@ LINEN BINS
throwforce = 1
throw_speed = 1
throw_range = 2
- w_class = 1.0
+ w_class = 1
item_color = "white"
slot_flags = SLOT_BACK
diff --git a/code/game/objects/structures/coathanger.dm b/code/game/objects/structures/coathanger.dm
index a91b5aa3564..3c68792fece 100644
--- a/code/game/objects/structures/coathanger.dm
+++ b/code/game/objects/structures/coathanger.dm
@@ -15,10 +15,10 @@
/obj/structure/coatrack/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
var/can_hang = 0
- for (var/T in allowed)
+ for(var/T in allowed)
if(istype(W,T))
can_hang = 1
- if (can_hang && !coat)
+ if(can_hang && !coat)
user.visible_message("[user] hangs [W] on \the [src].", "You hang [W] on the \the [src]")
coat = W
user.drop_item(src)
@@ -30,11 +30,11 @@
/obj/structure/coatrack/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
var/can_hang = 0
- for (var/T in allowed)
+ for(var/T in allowed)
if(istype(mover,T))
can_hang = 1
- if (can_hang && !coat)
+ if(can_hang && !coat)
src.visible_message("[mover] lands on \the [src].")
coat = mover
coat.loc = src
@@ -45,9 +45,9 @@
/obj/structure/coatrack/update_icon()
overlays.Cut()
- if (istype(coat, /obj/item/clothing/suit/storage/labcoat))
+ if(istype(coat, /obj/item/clothing/suit/storage/labcoat))
overlays += image(icon, icon_state = "coat_lab")
- if (istype(coat, /obj/item/clothing/suit/storage/labcoat/cmo))
+ if(istype(coat, /obj/item/clothing/suit/storage/labcoat/cmo))
overlays += image(icon, icon_state = "coat_cmo")
- if (istype(coat, /obj/item/clothing/suit/storage/det_suit))
+ if(istype(coat, /obj/item/clothing/suit/storage/det_suit))
overlays += image(icon, icon_state = "coat_det")
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 44048f5113c..de0ef28d255 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -66,8 +66,8 @@
loc.Exited(M)
M.loc = destination
loc.Entered(M, ignoreRest = 1)
- for (var/atom/movable/AM in loc)
- if (istype(AM, /obj/item))
+ for(var/atom/movable/AM in loc)
+ if(istype(AM, /obj/item))
continue
AM.Crossed(M)
@@ -149,7 +149,7 @@
qdel(src)
if(2)
if(prob(50))
- for (var/atom/movable/A as mob|obj in src)
+ for(var/atom/movable/A as mob|obj in src)
A.forceMove(loc)
A.ex_act(severity++)
new /obj/item/stack/sheet/metal(loc)
@@ -335,7 +335,7 @@
to_chat(user, "It won't budge! ")
if(!lastbang)
lastbang = 1
- for (var/mob/M in hearers(src, null))
+ for(var/mob/M in hearers(src, null))
to_chat(M, text("BANG, bang! ", max(0, 5 - get_dist(src, M))))
spawn(30)
lastbang = 0
@@ -384,10 +384,11 @@
/obj/structure/closet/container_resist(var/mob/living/L)
var/breakout_time = 2 //2 minutes by default
if(opened)
- if (L.loc == src)
+ if(L.loc == src)
L.forceMove(get_turf(src)) // Let's just be safe here
return //Door's open... wait, why are you in it's contents then?
if(!welded)
+ open() //for cardboard boxes
return //closed but not welded...
// else Meh, lets just keep it at 2 minutes for now
// breakout_time++ //Harder to get out of welded lockers than locked lockers
diff --git a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
index dad7aecb190..45c2f538e26 100644
--- a/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
+++ b/code/game/objects/structures/crates_lockers/closets/cardboardbox.dm
@@ -36,7 +36,7 @@
if(!L.stat)
L.do_alert_animation(L)
egged = 1
- to_chat(alerted, sound('sound/machines/chime.ogg'))
+ alerted << sound('sound/machines/chime.ogg')
..()
/mob/living/proc/do_alert_animation(atom/A)
diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
index 13c4c999ef5..715d16f9ebd 100644
--- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
@@ -21,7 +21,7 @@
if(fireaxe)
hasaxe = 1
- if (isrobot(user) || src.locked)
+ if(isrobot(user) || src.locked)
if(istype(O, /obj/item/device/multitool))
to_chat(user, "\red Resetting circuitry...")
playsound(user, 'sound/machines/lockreset.ogg', 50, 1)
@@ -53,7 +53,7 @@
src.localopened = 1
update_icon()
return
- if (istype(O, /obj/item/weapon/twohanded/fireaxe) && src.localopened)
+ if(istype(O, /obj/item/weapon/twohanded/fireaxe) && src.localopened)
if(!fireaxe)
if(O:wielded)
to_chat(user, "\red Unwield the axe first.")
@@ -155,7 +155,7 @@
set name = "Open/Close"
set category = "Object"
- if (isrobot(usr) || src.locked || src.smashed)
+ if(isrobot(usr) || src.locked || src.smashed)
if(src.locked)
to_chat(usr, "\red The cabinet won't budge!")
else if(src.smashed)
@@ -169,10 +169,10 @@
set name = "Remove Fire Axe"
set category = "Object"
- if (isrobot(usr))
+ if(isrobot(usr))
return
- if (localopened)
+ if(localopened)
if(fireaxe)
usr.put_in_hands(fireaxe)
fireaxe = null
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index 2b6660d077f..20a110f18d0 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -101,6 +101,8 @@
/obj/structure/closet/lawcloset/New()
..()
+ new /obj/item/weapon/storage/box/tapes(src)
+ new /obj/item/weapon/book/manual/faxes(src)
new /obj/item/clothing/under/lawyer/female(src)
new /obj/item/clothing/under/lawyer/black(src)
new /obj/item/clothing/under/lawyer/red(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index 51f01d874a8..74b811eae24 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -11,6 +11,7 @@
New()
..()
new /obj/item/clothing/under/rank/cargotech(src)
+ new /obj/item/clothing/under/rank/cargotech/skirt(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/device/radio/headset/headset_cargo(src)
new /obj/item/clothing/gloves/fingerless(src)
@@ -30,11 +31,10 @@
New()
..()
new /obj/item/clothing/under/rank/cargo(src)
+ new /obj/item/clothing/under/rank/cargo/skirt(src)
new /obj/item/clothing/shoes/brown(src)
new /obj/item/device/radio/headset/headset_cargo(src)
new /obj/item/clothing/gloves/fingerless(src)
-// new /obj/item/weapon/cartridge/quartermaster(src)
- new /obj/item/weapon/mining_voucher(src)
new /obj/item/clothing/suit/fire/firefighter(src)
new /obj/item/weapon/tank/emergency_oxygen(src)
new /obj/item/clothing/mask/gas(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm b/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm
index 50ad1500192..7c58f4a2b1a 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm
@@ -13,14 +13,12 @@
..()
new /obj/item/clothing/under/rank/chaplain(src)
new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/suit/nun(src)
- new /obj/item/clothing/head/nun_hood(src)
- new /obj/item/clothing/suit/chaplain_hoodie(src)
- new /obj/item/clothing/head/chaplain_hood(src)
+ new /obj/item/clothing/suit/hooded/nun(src)
+ new /obj/item/clothing/suit/hooded/chaplain_hoodie(src)
new /obj/item/clothing/suit/holidaypriest(src)
new /obj/item/clothing/under/wedding/bride_white(src)
new /obj/item/weapon/storage/backpack/cultpack (src)
- new /obj/item/clothing/head/helmet/knight/templar(src)
+ new /obj/item/clothing/head/helmet/riot/knight/templar(src)
new /obj/item/clothing/suit/armor/riot/knight/templar(src)
new /obj/item/weapon/storage/fancy/candle_box/eternal(src)
new /obj/item/weapon/storage/fancy/candle_box/eternal(src)
@@ -28,4 +26,4 @@
new /obj/item/clothing/gloves/ring/silver(src)
new /obj/item/clothing/gloves/ring/silver(src)
new /obj/item/clothing/gloves/ring/gold(src)
- new /obj/item/clothing/gloves/ring/gold(src)
\ No newline at end of file
+ new /obj/item/clothing/gloves/ring/gold(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 1746211e248..7c880918e41 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -15,9 +15,11 @@
else
new /obj/item/weapon/storage/backpack/satchel_eng(src)
new /obj/item/weapon/storage/backpack/duffel/engineering(src)
+ new /obj/item/clothing/head/beret/ce(src)
new /obj/item/areaeditor/blueprints(src)
new /obj/item/weapon/storage/box/permits(src)
new /obj/item/clothing/under/rank/chief_engineer(src)
+ new /obj/item/clothing/under/rank/chief_engineer/skirt(src)
new /obj/item/clothing/head/hardhat/white(src)
new /obj/item/clothing/glasses/welding/superior(src)
new /obj/item/clothing/gloves/color/yellow(src)
@@ -104,6 +106,7 @@
new /obj/item/weapon/storage/toolbox/mechanical(src)
new /obj/item/device/radio/headset/headset_eng(src)
new /obj/item/clothing/under/rank/engineer(src)
+ new /obj/item/clothing/under/rank/engineer/skirt(src)
new /obj/item/clothing/suit/storage/hazardvest(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/clothing/glasses/meson(src)
@@ -139,4 +142,4 @@
new /obj/item/weapon/tank/emergency_oxygen/engi(src)
new /obj/item/weapon/watertank/atmos(src)
new /obj/item/clothing/suit/fire/atmos(src)
- new /obj/item/clothing/head/hardhat/atmos(src)
\ No newline at end of file
+ new /obj/item/clothing/head/hardhat/atmos(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
index 896ab5e1dd1..a008e3843e9 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
@@ -70,8 +70,8 @@
New()
..()
for(var/i in 1 to 5)
- new /obj/item/weapon/reagent_containers/food/drinks/milk(src)
- new /obj/item/weapon/reagent_containers/food/drinks/soymilk(src)
+ new /obj/item/weapon/reagent_containers/food/condiment/milk(src)
+ new /obj/item/weapon/reagent_containers/food/condiment/soymilk(src)
for(var/i in 1 to 2)
new /obj/item/weapon/storage/fancy/egg_box(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/guncabinet.dm b/code/game/objects/structures/crates_lockers/closets/secure/guncabinet.dm
index 4a8c3a4195a..149793399ed 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/guncabinet.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/guncabinet.dm
@@ -26,19 +26,19 @@
else
var/lazors = 0
var/shottas = 0
- for (var/obj/item/weapon/gun/G in contents)
- if (istype(G, /obj/item/weapon/gun/energy))
+ for(var/obj/item/weapon/gun/G in contents)
+ if(istype(G, /obj/item/weapon/gun/energy))
lazors++
- if (istype(G, /obj/item/weapon/gun/projectile/))
+ if(istype(G, /obj/item/weapon/gun/projectile/))
shottas++
- if (lazors || shottas)
- for (var/i = 0 to 2)
+ if(lazors || shottas)
+ for(var/i = 0 to 2)
var/image/gun = image(icon(src.icon))
- if (lazors > 0 && (shottas <= 0 || prob(50)))
+ if(lazors > 0 && (shottas <= 0 || prob(50)))
lazors--
gun.icon_state = "laser"
- else if (shottas > 0)
+ else if(shottas > 0)
shottas--
gun.icon_state = "projectile"
@@ -49,7 +49,7 @@
if(broken)
overlays += icon(src.icon,"broken")
- else if (locked)
+ else if(locked)
overlays += icon(src.icon,"locked")
else
overlays += icon(src.icon,"open")
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index 17f208e28e9..c0603396325 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -156,13 +156,13 @@
new /obj/item/clothing/head/bio_hood/cmo(src)
new /obj/item/clothing/shoes/white(src)
switch(pick("blue", "green", "purple"))
- if ("blue")
+ if("blue")
new /obj/item/clothing/under/rank/medical/blue(src)
new /obj/item/clothing/head/surgery/blue(src)
- if ("green")
+ if("green")
new /obj/item/clothing/under/rank/medical/green(src)
new /obj/item/clothing/head/surgery/green(src)
- if ("purple")
+ if("purple")
new /obj/item/clothing/under/rank/medical/purple(src)
new /obj/item/clothing/head/surgery/purple(src)
new /obj/item/clothing/suit/storage/labcoat/cmo(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
index 0433ba0479f..51e3e8d06c3 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
@@ -53,11 +53,11 @@
new /obj/item/device/radio/headset( src )
/obj/structure/closet/secure_closet/personal/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (src.opened)
- if (istype(W, /obj/item/weapon/grab))
+ if(src.opened)
+ if(istype(W, /obj/item/weapon/grab))
src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
user.drop_item()
- if (W) W.forceMove(loc)
+ if(W) W.forceMove(loc)
else if(istype(W, /obj/item/weapon/card/id))
if(src.broken)
to_chat(user, "\red It appears to be broken.")
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index 488a422af86..cfecee359d6 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -46,7 +46,7 @@
new /obj/item/device/radio/headset/heads/rd(src)
new /obj/item/weapon/tank/air(src)
new /obj/item/clothing/mask/gas(src)
- new /obj/item/clothing/suit/armor/reactive(src)
+ new /obj/item/clothing/suit/armor/reactive/teleport(src)
new /obj/item/device/flash(src)
new /obj/item/device/laser_pointer(src)
new /obj/item/weapon/door_remote/research_director(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
index fe1e33d0999..db589c027e6 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
@@ -133,7 +133,7 @@
/obj/structure/closet/secure_closet/container_resist(var/mob/living/L)
var/breakout_time = 2 //2 minutes by default
if(opened)
- if (L.loc == src)
+ if(L.loc == src)
L.forceMove(get_turf(src)) // Let's just be safe here
return //Door's open... wait, why are you in it's contents then?
if(!locked && !welded)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 2b823041950..66c470882c8 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -14,6 +14,7 @@
new /obj/item/weapon/storage/backpack/captain(src)
else
new /obj/item/weapon/storage/backpack/satchel_cap(src)
+ new /obj/item/weapon/book/manual/faxes(src)
new /obj/item/weapon/storage/backpack/duffel/captain(src)
new /obj/item/clothing/suit/captunic(src)
new /obj/item/clothing/suit/captunic/capjacket(src)
@@ -42,6 +43,7 @@
New()
..()
+ new /obj/item/weapon/book/manual/faxes(src)
new /obj/item/clothing/glasses/sunglasses(src)
new /obj/item/clothing/head/hopcap(src)
new /obj/item/weapon/cartridge/hop(src)
@@ -51,7 +53,6 @@
new /obj/item/clothing/suit/armor/vest(src)
new /obj/item/weapon/gun/energy/gun(src)
new /obj/item/device/flash(src)
- new /obj/item/weapon/mining_voucher(src)
new /obj/item/clothing/accessory/petcollar(src)
new /obj/item/weapon/door_remote/civillian(src)
@@ -98,11 +99,13 @@
new /obj/item/weapon/storage/backpack/security(src)
else
new /obj/item/weapon/storage/backpack/satchel_sec(src)
+ new /obj/item/weapon/book/manual/faxes(src)
new /obj/item/weapon/cartridge/hos(src)
new /obj/item/device/radio/headset/heads/hos/alt(src)
new /obj/item/clothing/under/rank/head_of_security(src)
new /obj/item/clothing/under/rank/head_of_security/formal(src)
new /obj/item/clothing/under/rank/head_of_security/corp(src)
+ new /obj/item/clothing/under/rank/head_of_security/skirt(src)
new /obj/item/clothing/suit/armor/hos(src)
new /obj/item/clothing/suit/armor/hos/alt(src)
new /obj/item/clothing/head/HoS(src)
@@ -145,6 +148,7 @@
new /obj/item/clothing/under/rank/warden(src)
new /obj/item/clothing/under/rank/warden/formal(src)
new /obj/item/clothing/under/rank/warden/corp(src)
+ new /obj/item/clothing/under/rank/warden/skirt(src)
new /obj/item/clothing/glasses/hud/security/sunglasses(src)
new /obj/item/clothing/mask/gas/sechailer/warden(src)
new /obj/item/taperoll/police(src)
@@ -259,6 +263,7 @@
New()
..()
+ new /obj/item/weapon/book/manual/faxes(src)
new /obj/item/weapon/storage/briefcase(src)
new /obj/item/device/paicard(src)
new /obj/item/device/flash(src)
@@ -270,6 +275,8 @@
new /obj/item/clothing/under/lawyer/female(src)
new /obj/item/clothing/head/ntrep(src)
new /obj/item/clothing/shoes/sandal/fancy(src)
+ new /obj/item/weapon/storage/box/tapes(src)
+ new /obj/item/device/taperecorder(src)
/obj/structure/closet/secure_closet/security/cargo
@@ -315,8 +322,8 @@
..()
new /obj/item/clothing/under/det(src)
new /obj/item/clothing/suit/storage/det_suit(src)
- new /obj/item/clothing/suit/storage/forensics/blue(src)
- new /obj/item/clothing/suit/storage/forensics/red(src)
+ new /obj/item/clothing/suit/storage/det_suit/forensics/blue(src)
+ new /obj/item/clothing/suit/storage/det_suit/forensics/red(src)
new /obj/item/clothing/gloves/color/black(src)
new /obj/item/clothing/head/det_hat(src)
new /obj/item/clothing/shoes/brown(src)
@@ -347,7 +354,7 @@
/obj/structure/closet/secure_closet/injection
name = "lethal injections locker"
- req_access = list(access_captain)
+ req_access = list(access_security)
New()
diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm
index 8a701bedd72..3f49d3e3bde 100644
--- a/code/game/objects/structures/crates_lockers/closets/statue.dm
+++ b/code/game/objects/structures/crates_lockers/closets/statue.dm
@@ -22,7 +22,7 @@
L.client.perspective = EYE_PERSPECTIVE
L.client.eye = src
L.loc = src
- L.sdisabilities += MUTE
+ L.disabilities += MUTE
health = L.health + 100 //stoning damaged mobs will result in easier to shatter statues
intialTox = L.getToxLoss()
intialFire = L.getFireLoss()
@@ -54,7 +54,7 @@
M.adjustFireLoss(intialFire - M.getFireLoss())
M.adjustBruteLoss(intialBrute - M.getBruteLoss())
M.setOxyLoss(intialOxy)
- if (timer <= 0)
+ if(timer <= 0)
dump_contents()
processing_objects.Remove(src)
qdel(src)
@@ -77,7 +77,7 @@
for(var/mob/living/M in src)
M.loc = src.loc
- M.sdisabilities -= MUTE
+ M.disabilities -= MUTE
M.take_overall_damage((M.health - health - 100),0) //any new damage the statue incurred is transfered to the mob
if(M.client)
M.client.eye = M.client.mob
@@ -145,7 +145,7 @@
return
/obj/structure/closet/statue/proc/shatter(mob/user as mob)
- if (user)
+ if(user)
user.dust()
dump_contents()
visible_message("\red [src] shatters!. ")
diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
index c99790c4011..3fda5f8c603 100644
--- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
@@ -22,36 +22,36 @@
/obj/structure/closet/emcloset/New()
..()
- switch (pickweight(list("small" = 55, "aid" = 25, "tank" = 10, "both" = 10, "nothing" = 0, "delete" = 0)))
- if ("small")
+ switch(pickweight(list("small" = 55, "aid" = 25, "tank" = 10, "both" = 10, "nothing" = 0, "delete" = 0)))
+ if("small")
new /obj/item/weapon/tank/emergency_oxygen(src)
new /obj/item/weapon/tank/emergency_oxygen(src)
new /obj/item/clothing/mask/breath(src)
new /obj/item/clothing/mask/breath(src)
- if ("aid")
+ if("aid")
new /obj/item/weapon/tank/emergency_oxygen(src)
new /obj/item/weapon/storage/toolbox/emergency(src)
new /obj/item/clothing/mask/breath(src)
new /obj/item/weapon/storage/firstaid/o2(src)
- if ("tank")
+ if("tank")
new /obj/item/weapon/tank/emergency_oxygen/engi(src)
new /obj/item/clothing/mask/breath(src)
new /obj/item/weapon/tank/emergency_oxygen/engi(src)
new /obj/item/clothing/mask/breath(src)
- if ("both")
+ if("both")
new /obj/item/weapon/storage/toolbox/emergency(src)
new /obj/item/weapon/tank/emergency_oxygen/engi(src)
new /obj/item/clothing/mask/breath(src)
new /obj/item/weapon/storage/firstaid/o2(src)
- if ("nothing")
+ if("nothing")
// doot
// teehee - Ah, tg coders...
- if ("delete")
+ if("delete")
qdel(src)
//If you want to re-add fire, just add "fire" = 15 to the pick list.
- /*if ("fire")
+ /*if("fire")
new /obj/structure/closet/firecloset(src.loc)
qdel(src)*/
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index dfeb734391d..c23701575df 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -38,6 +38,9 @@
new /obj/item/clothing/under/rank/security/formal(src)
new /obj/item/clothing/under/rank/security/formal(src)
new /obj/item/clothing/under/rank/security/formal(src)
+ new /obj/item/clothing/under/rank/security/skirt(src)
+ new /obj/item/clothing/under/rank/security/skirt(src)
+ new /obj/item/clothing/under/rank/security/skirt(src)
new /obj/item/clothing/shoes/jackboots(src)
new /obj/item/clothing/shoes/jackboots(src)
new /obj/item/clothing/shoes/jackboots(src)
@@ -173,9 +176,12 @@
new /obj/item/clothing/under/rank/atmospheric_technician(src)
new /obj/item/clothing/under/rank/atmospheric_technician(src)
new /obj/item/clothing/under/rank/atmospheric_technician(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/shoes/black(src)
+ new /obj/item/clothing/under/rank/atmospheric_technician/skirt(src)
+ new /obj/item/clothing/under/rank/atmospheric_technician/skirt(src)
+ new /obj/item/clothing/under/rank/atmospheric_technician/skirt(src)
+ new /obj/item/clothing/shoes/workboots(src)
+ new /obj/item/clothing/shoes/workboots(src)
+ new /obj/item/clothing/shoes/workboots(src)
new /obj/item/clothing/head/hardhat/red(src)
new /obj/item/clothing/head/hardhat/red(src)
new /obj/item/clothing/head/hardhat/red(src)
@@ -195,9 +201,12 @@
new /obj/item/clothing/under/rank/engineer(src)
new /obj/item/clothing/under/rank/engineer(src)
new /obj/item/clothing/under/rank/engineer(src)
- new /obj/item/clothing/shoes/orange(src)
- new /obj/item/clothing/shoes/orange(src)
- new /obj/item/clothing/shoes/orange(src)
+ new /obj/item/clothing/under/rank/engineer/skirt(src)
+ new /obj/item/clothing/under/rank/engineer/skirt(src)
+ new /obj/item/clothing/under/rank/engineer/skirt(src)
+ new /obj/item/clothing/shoes/workboots(src)
+ new /obj/item/clothing/shoes/workboots(src)
+ new /obj/item/clothing/shoes/workboots(src)
new /obj/item/clothing/head/hardhat(src)
new /obj/item/clothing/head/hardhat(src)
new /obj/item/clothing/head/hardhat(src)
@@ -239,6 +248,8 @@
new /obj/item/clothing/under/rank/medical/green(src)
new /obj/item/clothing/head/surgery/green(src)
new /obj/item/clothing/under/rank/medical/purple(src)
+ new /obj/item/clothing/under/rank/medical/skirt(src)
+ new /obj/item/clothing/under/rank/medical/skirt(src)
new /obj/item/clothing/head/surgery/purple(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/clothing/shoes/black(src)
@@ -271,6 +282,9 @@
new /obj/item/clothing/under/rank/scientist(src)
new /obj/item/clothing/under/rank/scientist(src)
new /obj/item/clothing/under/rank/scientist(src)
+ new /obj/item/clothing/under/rank/scientist/skirt(src)
+ new /obj/item/clothing/under/rank/scientist/skirt(src)
+ new /obj/item/clothing/under/rank/scientist/skirt(src)
new /obj/item/clothing/suit/storage/labcoat(src)
new /obj/item/clothing/suit/storage/labcoat(src)
new /obj/item/clothing/suit/storage/labcoat(src)
@@ -293,6 +307,8 @@
new /obj/item/clothing/glasses/hud/diagnostic(src)
new /obj/item/clothing/under/rank/roboticist(src)
new /obj/item/clothing/under/rank/roboticist(src)
+ new /obj/item/clothing/under/rank/roboticist/skirt(src)
+ new /obj/item/clothing/under/rank/roboticist/skirt(src)
new /obj/item/clothing/suit/storage/labcoat(src)
new /obj/item/clothing/suit/storage/labcoat(src)
new /obj/item/clothing/shoes/black(src)
@@ -312,6 +328,8 @@
..()
new /obj/item/clothing/under/rank/chemist(src)
new /obj/item/clothing/under/rank/chemist(src)
+ new /obj/item/clothing/under/rank/chemist/skirt(src)
+ new /obj/item/clothing/under/rank/chemist/skirt(src)
new /obj/item/clothing/shoes/white(src)
new /obj/item/clothing/shoes/white(src)
new /obj/item/clothing/suit/storage/labcoat/chemist(src)
@@ -354,6 +372,8 @@
..()
new /obj/item/clothing/under/rank/virologist(src)
new /obj/item/clothing/under/rank/virologist(src)
+ new /obj/item/clothing/under/rank/virologist/skirt(src)
+ new /obj/item/clothing/under/rank/virologist/skirt(src)
new /obj/item/clothing/shoes/white(src)
new /obj/item/clothing/shoes/white(src)
new /obj/item/clothing/suit/storage/labcoat/virologist(src)
@@ -375,6 +395,8 @@
..()
new /obj/item/clothing/under/rank/medical(src)
new /obj/item/clothing/under/rank/medical(src)
+ new /obj/item/clothing/under/rank/medical/skirt(src)
+ new /obj/item/clothing/under/rank/medical/skirt(src)
new /obj/item/clothing/under/rank/medical/blue(src)
new /obj/item/clothing/under/rank/medical/green(src)
new /obj/item/clothing/under/rank/medical/purple(src)
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index c4129596892..c4178baec15 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -185,7 +185,7 @@
qdel(src)
return
if(3.0)
- if (prob(50))
+ if(prob(50))
qdel(src)
return
else
@@ -497,7 +497,7 @@
/obj/structure/closet/crate/large/close()
. = ..()
- if (.)//we can hold up to one large item
+ if(.)//we can hold up to one large item
var/found = 0
for(var/obj/structure/S in src.loc)
if(S == src)
@@ -524,7 +524,7 @@
/obj/structure/closet/crate/secure/large/close()
. = ..()
- if (.)//we can hold up to one large item
+ if(.)//we can hold up to one large item
var/found = 0
for(var/obj/structure/S in src.loc)
if(S == src)
diff --git a/code/game/objects/structures/crates_lockers/walllocker.dm b/code/game/objects/structures/crates_lockers/walllocker.dm
index d07ee623d38..25a41a8dde7 100644
--- a/code/game/objects/structures/crates_lockers/walllocker.dm
+++ b/code/game/objects/structures/crates_lockers/walllocker.dm
@@ -27,7 +27,7 @@
icon_opened = "emergopen"
/obj/structure/closet/walllocker/emerglocker/attack_hand(mob/user as mob)
- if (istype(user, /mob/living/silicon/ai)) //Added by Strumpetplaya - AI shouldn't be able to
+ if(istype(user, /mob/living/silicon/ai)) //Added by Strumpetplaya - AI shouldn't be able to
return //activate emergency lockers. This fixes that. (Does this make sense, the AI can't call attack_hand, can it? --Mloc)
if(!amount)
to_chat(usr, "It's empty.")
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 90a95253a96..6b732653a64 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -128,7 +128,7 @@ var/global/list/captain_display_cases = list()
..(user)
to_chat(user, "Peering through the glass, you see that it contains: ")
if(occupant)
- to_chat(user, "\icon[occupant] \A [occupant]. ")
+ to_chat(user, "[bicon(occupant)] \A [occupant]. ")
else
to_chat(user, "Nothing.")
@@ -140,17 +140,17 @@ var/global/list/captain_display_cases = list()
/obj/structure/displaycase/ex_act(severity)
switch(severity)
- if (1)
+ if(1)
new /obj/item/weapon/shard(loc)
- if (occupant)
+ if(occupant)
dump()
qdel(src)
- if (2)
- if (prob(50))
+ if(2)
+ if(prob(50))
src.health -= 15
src.healthcheck()
- if (3)
- if (prob(50))
+ if(3)
+ if(prob(50))
src.health -= 5
src.healthcheck()
@@ -162,15 +162,15 @@ var/global/list/captain_display_cases = list()
return
/obj/structure/displaycase/blob_act()
- if (prob(75))
+ if(prob(75))
new /obj/item/weapon/shard(loc)
if(occupant) dump()
qdel(src)
/obj/structure/displaycase/proc/healthcheck()
- if (src.health <= 0)
+ if(src.health <= 0)
health = 0
- if (!( src.destroyed ))
+ if(!( src.destroyed ))
src.density = 0
src.destroyed = 1
new /obj/item/weapon/shard(loc)
@@ -217,9 +217,9 @@ var/global/list/captain_display_cases = list()
return
locked = !locked
if(!locked)
- to_chat(user, "\icon[src] \The [src] clicks as locks release, and it slowly opens for you. ")
+ to_chat(user, "[bicon(src)] \The [src] clicks as locks release, and it slowly opens for you. ")
else
- to_chat(user, "\icon[src] You close \the [src] and swipe your card, locking it. ")
+ to_chat(user, "[bicon(src)] You close \the [src] and swipe your card, locking it. ")
update_icon()
return
if(istype(W,/obj/item/weapon/crowbar) && (!locked || destroyed))
@@ -273,7 +273,7 @@ var/global/list/captain_display_cases = list()
update_icon()
/obj/structure/displaycase/attack_hand(mob/user as mob)
- if (destroyed || (!locked && user.a_intent == I_HARM))
+ if(destroyed || (!locked && user.a_intent == I_HARM))
if(occupant)
dump()
to_chat(user, "You smash your fist into the delicate electronics at the bottom of the case, and deactivate the hover field. ")
@@ -305,7 +305,7 @@ var/global/list/captain_display_cases = list()
dump()
update_icon()
else
- to_chat(src, "\icon[src] \The [src] is empty! ")
+ to_chat(src, "[bicon(src)] \The [src] is empty! ")
else
user.visible_message("[user.name] gently runs his hands over \the [src] in appreciation of its contents.", \
"You gently run your hands over \the [src] in appreciation of its contents.", \
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index fef41df80b8..a88c36973de 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -150,7 +150,7 @@ obj/structure/door_assembly/multi_tile/Move()
if(istype(W, /obj/item/weapon/weldingtool) && ( (istext(glass)) || (glass == 1) || (!anchored) ))
var/obj/item/weapon/weldingtool/WT = W
- if (WT.remove_fuel(0, user))
+ if(WT.remove_fuel(0, user))
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
if(istext(glass))
user.visible_message("[user] welds the [glass] plating off the airlock assembly.", "You start to weld the [glass] plating off the airlock assembly.")
@@ -234,7 +234,7 @@ obj/structure/door_assembly/multi_tile/Move()
src.state = 1
src.name = "Wired Airlock Assembly"
var/obj/item/weapon/airlock_electronics/ae
- if (!electronics)
+ if(!electronics)
ae = new/obj/item/weapon/airlock_electronics( src.loc )
else
ae = electronics
@@ -243,8 +243,8 @@ obj/structure/door_assembly/multi_tile/Move()
else if(istype(W, /obj/item/stack/sheet) && !glass)
var/obj/item/stack/sheet/S = W
- if (S)
- if (S.amount>=1)
+ if(S)
+ if(S.amount>=1)
if(istype(S, /obj/item/stack/sheet/rglass))
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
@@ -272,7 +272,7 @@ obj/structure/door_assembly/multi_tile/Move()
var/path
if(istext(glass))
path = text2path("/obj/machinery/door/airlock/[glass]")
- else if (glass == 1)
+ else if(glass == 1)
path = text2path("/obj/machinery/door/airlock[glass_type]")
else
path = text2path("/obj/machinery/door/airlock[airlock_type]")
@@ -297,9 +297,9 @@ obj/structure/door_assembly/multi_tile/Move()
/obj/structure/door_assembly/proc/update_state()
icon_state = "door_as_[glass == 1 ? "g" : ""][istext(glass) ? glass : base_icon_state][state]"
name = ""
- switch (state)
+ switch(state)
if(0)
- if (anchored)
+ if(anchored)
name = "Secured "
if(1)
name = "Wired "
diff --git a/code/game/objects/structures/engicart.dm b/code/game/objects/structures/engicart.dm
index 76dbc81ca43..cce6c1c1bdb 100644
--- a/code/game/objects/structures/engicart.dm
+++ b/code/game/objects/structures/engicart.dm
@@ -80,7 +80,7 @@
else
to_chat(user, fail_msg)
else if(istype(I, /obj/item/weapon/wrench))
- if (!anchored && !isinspace())
+ if(!anchored && !isinspace())
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index d0521d33f0e..e5a89aa1fad 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -28,10 +28,10 @@
/obj/structure/extinguisher_cabinet/attack_hand(mob/user)
if(isrobot(user) || isalien(user))
return
- if (ishuman(user))
+ if(ishuman(user))
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
- if (user.hand)
+ if(user.hand)
temp = H.organs_by_name["l_hand"]
if(temp && !temp.is_usable())
to_chat(user, "You try to move your [temp.name], but cannot!")
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 30dec267502..2d1afd939d7 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -86,7 +86,7 @@
to_chat(user, "[src] is blocked! ")
return
if(istype(W, /obj/item/weapon/screwdriver))
- if (!istype(T, /turf/simulated/floor))
+ if(!istype(T, /turf/simulated/floor))
to_chat(user, "[src] bolts must be tightened on the floor! ")
return
user.visible_message("[user] tightens some bolts on the wall. ", "You tighten the bolts on the wall. ")
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index ab167113178..e4f8acd2c5b 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -191,20 +191,34 @@
icon_state = "fullgrass_[rand(1, 3)]"
-/obj/structure/flora/kirbyplants
+/obj/item/weapon/twohanded/required/kirbyplants
name = "potted plant"
icon = 'icons/obj/flora/plants.dmi'
icon_state = "plant-1"
anchored = 0
layer = 5
+ w_class = 5
+ force = 10
+ throwforce = 13
+ throw_speed = 2
+ throw_range = 4
-/obj/structure/flora/kirbyplants/New()
+/obj/item/weapon/twohanded/required/kirbyplants/New()
..()
icon_state = "plant-[rand(1,35)]"
if(prob(1))
icon_state = "plant-36"
-/obj/structure/flora/kirbyplants/dead
+/obj/item/weapon/twohanded/required/kirbyplants/equipped(mob/living/user)
+ var/image/I = image(icon = 'icons/obj/flora/plants.dmi' , icon_state = src.icon_state, loc = user)
+ I.override = 1
+ user.add_alt_appearance("sneaking_mission", I, player_list)
+
+/obj/item/weapon/twohanded/required/kirbyplants/dropped(mob/living/user)
+ ..()
+ user.remove_alt_appearance("sneaking_mission")
+
+/obj/item/weapon/twohanded/required/kirbyplants/dead
name = "\improper RD's potted plant"
desc = "A gift from the botanical staff, presented after the RD's reassignment. There's a tag on it that says \"Y'all come back now, y'hear?\"\nIt doesn't look very healthy..."
icon_state = "plant-dead"
@@ -274,10 +288,10 @@
/*
/obj/structure/bush/Bumped(M as mob)
- if (istype(M, /mob/living/simple_animal))
+ if(istype(M, /mob/living/simple_animal))
var/mob/living/simple_animal/A = M
A.loc = get_turf(src)
- else if (istype(M, /mob/living/carbon/monkey))
+ else if(istype(M, /mob/living/carbon/monkey))
var/mob/living/carbon/monkey/A = M
A.loc = get_turf(src)
*/
diff --git a/code/game/objects/structures/foodcart.dm b/code/game/objects/structures/foodcart.dm
index e2df39180d9..071200c8ca0 100644
--- a/code/game/objects/structures/foodcart.dm
+++ b/code/game/objects/structures/foodcart.dm
@@ -55,7 +55,7 @@
if(!success)
to_chat(user, fail_msg)
else if(istype(I, /obj/item/weapon/wrench))
- if (!anchored && !isinspace())
+ if(!anchored && !isinspace())
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 33a153dd90f..bcb2f5d53a3 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -41,7 +41,7 @@
else if(!anchored)
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
to_chat(user, "\blue Now securing the girder")
- if(get_turf(user, 40))
+ if(do_after(user, 40, target = src))
to_chat(user, "\blue You secured the girder!")
new/obj/structure/girder( src.loc )
qdel(src)
@@ -106,7 +106,7 @@
else
if(S.amount < 2) return ..()
to_chat(user, "\blue Now adding plating...")
- if (do_after(user,40, target = src))
+ if(do_after(user,40, target = src))
if(!src || !S || S.amount < 2) return
S.use(2)
to_chat(user, "\blue You added the plating!")
@@ -125,7 +125,7 @@
new /obj/structure/falsewall/reinforced (src.loc)
qdel(src)
else
- if (src.icon_state == "reinforced") //I cant believe someone would actually write this line of code...
+ if(src.icon_state == "reinforced") //I cant believe someone would actually write this line of code...
if(S.amount < 1) return ..()
to_chat(user, "\blue Now finalising reinforced wall.")
if(do_after(user, 50, target = src))
@@ -141,7 +141,7 @@
else
if(S.amount < 1) return ..()
to_chat(user, "\blue Now reinforcing girders")
- if (do_after(user,60, target = src))
+ if(do_after(user,60, target = src))
if(!src || !S || S.amount < 1) return
S.use(1)
to_chat(user, "\blue Girders reinforced!")
@@ -161,7 +161,7 @@
else
if(S.amount < 2) return ..()
to_chat(user, "\blue Now adding plating...")
- if (do_after(user,40, target = src))
+ if(do_after(user,40, target = src))
if(!src || !S || S.amount < 2) return
S.use(2)
to_chat(user, "\blue You added the plating!")
@@ -176,7 +176,7 @@
else if(istype(W, /obj/item/pipe))
var/obj/item/pipe/P = W
- if (P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds.
+ if(P.pipe_type in list(0, 1, 5)) //simple pipes, simple bends, and simple manifolds.
user.drop_item()
P.loc = src.loc
to_chat(user, "\blue You fit the pipe into the [src]!")
@@ -211,13 +211,13 @@
qdel(src)
return
if(2.0)
- if (prob(75))
+ if(prob(75))
var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
new remains(loc)
qdel(src)
return
if(3.0)
- if (prob(40))
+ if(prob(40))
var/remains = pick(/obj/item/stack/rods,/obj/item/stack/sheet/metal)
new remains(loc)
qdel(src)
@@ -282,12 +282,12 @@
qdel(src)
return
if(2.0)
- if (prob(30))
+ if(prob(30))
new /obj/effect/decal/remains/human(loc)
qdel(src)
return
if(3.0)
- if (prob(5))
+ if(prob(5))
new /obj/effect/decal/remains/human(loc)
qdel(src)
return
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 9c1a9e6867a..4cb2b20f99e 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -81,7 +81,7 @@
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
var/mob/living/carbon/slime/S = user
- if (!S.is_adult)
+ if(!S.is_adult)
return
playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
@@ -142,7 +142,10 @@
if(iswirecutter(W))
if(!shock(user, 100))
playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1)
- new /obj/item/stack/rods(loc, 2)
+ if(!destroyed)
+ new /obj/item/stack/rods(loc, 2)
+ else
+ new /obj/item/stack/rods(loc)
qdel(src)
else if((isscrewdriver(W)) && (istype(loc, /turf/simulated) || anchored))
if(!shock(user, 90))
diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm
index 299f776c4f7..d6d2c84ecd4 100644
--- a/code/game/objects/structures/inflatable.dm
+++ b/code/game/objects/structures/inflatable.dm
@@ -3,7 +3,7 @@
desc = "A folded membrane which rapidly expands into a large cubical shape on activation."
icon = 'icons/obj/inflatable.dmi'
icon_state = "folded_wall"
- w_class = 3.0
+ w_class = 3
/obj/item/inflatable/attack_self(mob/user)
playsound(loc, 'sound/items/zip.ogg', 75, 1)
@@ -25,7 +25,7 @@
var/health = 50.0
-/obj/structure/inflatable/New(location)
+/obj/structure/inflatable/initialize(location)
..()
air_update_turf(1)
@@ -89,14 +89,14 @@
/obj/structure/inflatable/attack_slime(mob/user as mob)
var/mob/living/carbon/slime/S = user
- if (!S.is_adult)
+ if(!S.is_adult)
return
attack_generic(user, rand(10, 15))
/obj/structure/inflatable/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(!istype(W))
return
- if (can_puncture(W))
+ if(can_puncture(W))
visible_message("\red [user] pierces [src] with [W]! ")
deflate(1)
if(W.damtype == BRUTE || W.damtype == BURN)
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index e51ea6eb3ac..e51a7e3aac2 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -90,7 +90,7 @@
reagents.reaction(src.loc)
src.reagents.clear_reagents()
else if(istype(I, /obj/item/weapon/wrench))
- if (!anchored && !isinspace())
+ if(!anchored && !isinspace())
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm
index 0f8cde25dbe..d661fb60b9e 100644
--- a/code/game/objects/structures/lamarr_cage.dm
+++ b/code/game/objects/structures/lamarr_cage.dm
@@ -12,16 +12,16 @@
/obj/structure/lamarr/ex_act(severity)
switch(severity)
- if (1)
+ if(1)
new /obj/item/weapon/shard(loc)
Break()
qdel(src)
- if (2)
- if (prob(50))
+ if(2)
+ if(prob(50))
src.health -= 15
src.healthcheck()
- if (3)
- if (prob(50))
+ if(3)
+ if(prob(50))
src.health -= 5
src.healthcheck()
@@ -34,14 +34,14 @@
/obj/structure/lamarr/blob_act()
- if (prob(75))
+ if(prob(75))
new /obj/item/weapon/shard(loc)
Break()
qdel(src)
/obj/structure/lamarr/proc/healthcheck()
- if (src.health <= 0)
- if (!( src.destroyed ))
+ if(src.health <= 0)
+ if(!( src.destroyed ))
src.density = 0
src.destroyed = 1
new /obj/item/weapon/shard(loc)
@@ -66,12 +66,12 @@
return
/obj/structure/lamarr/attack_hand(mob/user as mob)
- if (src.destroyed)
+ if(src.destroyed)
return
else
to_chat(usr, text("\blue You kick the lab cage."))
for(var/mob/O in oviewers())
- if ((O.client && !( O.blinded )))
+ if((O.client && !( O.blinded )))
to_chat(O, text("\red [] kicks the lab cage.", usr))
src.health -= 2
healthcheck()
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index d7704265861..bfb607585b0 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -18,14 +18,14 @@
icon = 'icons/obj/smoothlattice.dmi'
icon_state = "latticeblank"
updateOverlays()
- for (var/dir in cardinal)
+ for(var/dir in cardinal)
var/obj/structure/lattice/L
if(locate(/obj/structure/lattice, get_step(src, dir)))
L = locate(/obj/structure/lattice, get_step(src, dir))
L.updateOverlays()
/obj/structure/lattice/Destroy()
- for (var/dir in cardinal)
+ for(var/dir in cardinal)
var/obj/structure/lattice/L
if(locate(/obj/structure/lattice, get_step(src, dir)))
L = locate(/obj/structure/lattice, get_step(src, dir))
@@ -51,11 +51,11 @@
/obj/structure/lattice/attackby(obj/item/C as obj, mob/user as mob, params)
- if (istype(C, /obj/item/stack/tile/plasteel) || istype(C, /obj/item/stack/rods))
+ if(istype(C, /obj/item/stack/tile/plasteel) || istype(C, /obj/item/stack/rods))
var/turf/T = get_turf(src)
T.attackby(C, user) //BubbleWrap - hand this off to the underlying turf instead
return
- if (istype(C, /obj/item/weapon/weldingtool))
+ if(istype(C, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = C
if(WT.remove_fuel(0, user))
to_chat(user, "\blue Slicing lattice joints ...")
@@ -72,7 +72,7 @@
var/dir_sum = 0
- for (var/direction in cardinal)
+ for(var/direction in cardinal)
if(locate(/obj/structure/lattice, get_step(src, direction)))
dir_sum += direction
else
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index 01c9442ea33..9ce9e59e423 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -16,152 +16,155 @@
var/hardness = 1
var/oreAmount = 7
- New(location)
- ..()
- icon_state = mineralType
- name = "[mineralType] door"
- air_update_turf(1)
+/obj/structure/mineral_door/New(location)
+ ..()
+ icon_state = mineralType
+ name = "[mineralType] door"
- Destroy()
- density = 0
- air_update_turf(1)
- return ..()
+/obj/structure/mineral_door/initialize()
+ ..()
+ air_update_turf(1)
- Move()
- var/turf/T = loc
- ..()
- move_update_air(T)
+/obj/structure/mineral_door/Destroy()
+ density = 0
+ air_update_turf(1)
+ return ..()
- Bumped(atom/user)
- ..()
- if(!state)
- return TryToSwitchState(user)
- return
+/obj/structure/mineral_door/Move()
+ var/turf/T = loc
+ ..()
+ move_update_air(T)
- attack_ai(mob/user as mob) //those aren't machinery, they're just big fucking slabs of a mineral
- if(isAI(user)) //so the AI can't open it
- return
- else if(isrobot(user)) //but cyborgs can
- if(get_dist(user,src) <= 1) //not remotely though
- return TryToSwitchState(user)
-
- attack_hand(mob/user as mob)
+/obj/structure/mineral_door/Bumped(atom/user)
+ ..()
+ if(!state)
return TryToSwitchState(user)
+ return
- CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group) return 0
- if(istype(mover, /obj/effect/beam))
- return !opacity
- return !density
+/obj/structure/mineral_door/attack_ai(mob/user as mob) //those aren't machinery, they're just big fucking slabs of a mineral
+ if(isAI(user)) //so the AI can't open it
+ return
+ else if(isrobot(user)) //but cyborgs can
+ if(get_dist(user,src) <= 1) //not remotely though
+ return TryToSwitchState(user)
- CanAtmosPass()
- return !density
+/obj/structure/mineral_door/attack_hand(mob/user as mob)
+ return TryToSwitchState(user)
- proc/TryToSwitchState(atom/user)
- if(isSwitchingStates) return
- if(ismob(user))
- var/mob/M = user
- if(world.time - user.last_bumped <= 60) return //NOTE do we really need that?
- if(M.client)
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- if(!C.handcuffed)
- SwitchState()
- else
+/obj/structure/mineral_door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(air_group) return 0
+ if(istype(mover, /obj/effect/beam))
+ return !opacity
+ return !density
+
+/obj/structure/mineral_door/CanAtmosPass()
+ return !density
+
+/obj/structure/mineral_door/proc/TryToSwitchState(atom/user)
+ if(isSwitchingStates) return
+ if(ismob(user))
+ var/mob/M = user
+ if(world.time - user.last_bumped <= 60) return //NOTE do we really need that?
+ if(M.client)
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ if(!C.handcuffed)
SwitchState()
- else if(istype(user, /obj/mecha))
- SwitchState()
+ else
+ SwitchState()
+ else if(istype(user, /obj/mecha))
+ SwitchState()
- proc/SwitchState()
- if(state)
- Close()
- else
- Open()
-
- proc/Open()
- isSwitchingStates = 1
- playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 100, 1)
- flick("[mineralType]opening",src)
- sleep(10)
- density = 0
- opacity = 0
- state = 1
- update_icon()
- isSwitchingStates = 0
- air_update_turf(1)
-
- proc/Close()
- isSwitchingStates = 1
- playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 100, 1)
- flick("[mineralType]closing",src)
- sleep(10)
- density = 1
- opacity = 1
- state = 0
- update_icon()
- isSwitchingStates = 0
- air_update_turf(1)
+/obj/structure/mineral_door/proc/SwitchState()
+ if(state)
+ Close()
+ else
+ Open()
+/obj/structure/mineral_door/proc/Open()
+ isSwitchingStates = 1
+ playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 100, 1)
+ flick("[mineralType]opening",src)
+ sleep(10)
+ density = 0
+ opacity = 0
+ state = 1
update_icon()
- if(state)
- icon_state = "[mineralType]open"
- else
- icon_state = mineralType
+ isSwitchingStates = 0
+ air_update_turf(1)
- attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W,/obj/item/weapon/pickaxe))
- var/obj/item/weapon/pickaxe/digTool = W
- to_chat(user, "You start digging the [name].")
- if(do_after(user,digTool.digspeed*hardness, target = src) && src)
- to_chat(user, "You finished digging.")
- Dismantle()
- else if(istype(W,/obj/item/weapon)) //not sure, can't not just weapons get passed to this proc?
- hardness -= W.force/100
- to_chat(user, "You hit the [name] with your [W.name]!")
- CheckHardness()
- else
- attack_hand(user)
- return
+/obj/structure/mineral_door/proc/Close()
+ isSwitchingStates = 1
+ playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 100, 1)
+ flick("[mineralType]closing",src)
+ sleep(10)
+ density = 1
+ opacity = 1
+ state = 0
+ update_icon()
+ isSwitchingStates = 0
+ air_update_turf(1)
- proc/CheckHardness()
- if(hardness <= 0)
+/obj/structure/mineral_door/update_icon()
+ if(state)
+ icon_state = "[mineralType]open"
+ else
+ icon_state = mineralType
+
+/obj/structure/mineral_door/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+ if(istype(W,/obj/item/weapon/pickaxe))
+ var/obj/item/weapon/pickaxe/digTool = W
+ to_chat(user, "You start digging the [name].")
+ if(do_after(user,digTool.digspeed*hardness, target = src) && src)
+ to_chat(user, "You finished digging.")
+ Dismantle()
+ else if(istype(W,/obj/item/weapon)) //not sure, can't not just weapons get passed to this proc?
+ hardness -= W.force/100
+ to_chat(user, "You hit the [name] with your [W.name]!")
+ CheckHardness()
+ else
+ attack_hand(user)
+ return
+
+/obj/structure/mineral_door/proc/CheckHardness()
+ if(hardness <= 0)
+ Dismantle(1)
+
+/obj/structure/mineral_door/proc/Dismantle(devastated = 0)
+ if(!devastated)
+ if(mineralType == "metal")
+ var/ore = /obj/item/stack/sheet/metal
+ for(var/i = 1, i <= oreAmount, i++)
+ new ore(get_turf(src))
+ else
+ var/ore = text2path("/obj/item/stack/sheet/mineral/[mineralType]")
+ for(var/i = 1, i <= oreAmount, i++)
+ new ore(get_turf(src))
+ else
+ if(mineralType == "metal")
+ var/ore = /obj/item/stack/sheet/metal
+ for(var/i = 3, i <= oreAmount, i++)
+ new ore(get_turf(src))
+ else
+ var/ore = text2path("/obj/item/stack/sheet/mineral/[mineralType]")
+ for(var/i = 3, i <= oreAmount, i++)
+ new ore(get_turf(src))
+ qdel(src)
+
+/obj/structure/mineral_door/ex_act(severity = 1)
+ switch(severity)
+ if(1)
Dismantle(1)
-
- proc/Dismantle(devastated = 0)
- if(!devastated)
- if (mineralType == "metal")
- var/ore = /obj/item/stack/sheet/metal
- for(var/i = 1, i <= oreAmount, i++)
- new ore(get_turf(src))
- else
- var/ore = text2path("/obj/item/stack/sheet/mineral/[mineralType]")
- for(var/i = 1, i <= oreAmount, i++)
- new ore(get_turf(src))
- else
- if (mineralType == "metal")
- var/ore = /obj/item/stack/sheet/metal
- for(var/i = 3, i <= oreAmount, i++)
- new ore(get_turf(src))
- else
- var/ore = text2path("/obj/item/stack/sheet/mineral/[mineralType]")
- for(var/i = 3, i <= oreAmount, i++)
- new ore(get_turf(src))
- qdel(src)
-
- ex_act(severity = 1)
- switch(severity)
- if(1)
+ if(2)
+ if(prob(20))
Dismantle(1)
- if(2)
- if(prob(20))
- Dismantle(1)
- else
- hardness--
- CheckHardness()
- if(3)
- hardness -= 0.1
+ else
+ hardness--
CheckHardness()
- return
+ if(3)
+ hardness -= 0.1
+ CheckHardness()
+ return
/obj/structure/mineral_door/iron
mineralType = "metal"
@@ -285,4 +288,4 @@
CheckHardness()
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index d0e8d4c9c85..83220bb6a33 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -76,7 +76,7 @@
/obj/structure/mirror/attack_slime(mob/living/user as mob)
var/mob/living/carbon/slime/S = user
- if (!S.is_adult)
+ if(!S.is_adult)
return
user.do_attack_animation(src)
if(shattered)
diff --git a/code/game/objects/structures/misc.dm b/code/game/objects/structures/misc.dm
index 1b8737e1ddd..81511f16aa1 100644
--- a/code/game/objects/structures/misc.dm
+++ b/code/game/objects/structures/misc.dm
@@ -34,7 +34,7 @@
attack_hand(mob/user as mob)
- if (user.mind.special_role=="Ninja")
+ if(user.mind.special_role=="Ninja")
switch(alert("Phase Jaunt relay primed, target locked as [station_name()], initiate VOID-shift translocation? (Warning! Internals required!)",,"Yes","No"))
if("Yes")
diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm
index c8e600c658d..68589112080 100644
--- a/code/game/objects/structures/mop_bucket.dm
+++ b/code/game/objects/structures/mop_bucket.dm
@@ -23,15 +23,15 @@
/obj/structure/mopbucket/examine(mob/user)
if(..(user, 1))
- to_chat(usr, text("\icon[] [] contains [] units of water left!", src, src.name, src.reagents.total_volume))
+ to_chat(usr, "[bicon(src)] [src] contains [reagents.total_volume] units of water left!")
/obj/structure/mopbucket/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/mop))
- if (src.reagents.total_volume >= 2)
+ if(istype(W, /obj/item/weapon/mop))
+ if(src.reagents.total_volume >= 2)
src.reagents.trans_to(W, 2)
to_chat(user, "\blue You wet the mop")
playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1)
- if (src.reagents.total_volume < 1)
+ if(src.reagents.total_volume < 1)
to_chat(user, "\blue Out of water!")
return
@@ -41,10 +41,10 @@
qdel(src)
return
if(2.0)
- if (prob(50))
+ if(prob(50))
qdel(src)
return
if(3.0)
- if (prob(5))
+ if(prob(5))
qdel(src)
return
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index f9809b422ca..71a0c8379a9 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -55,14 +55,14 @@
qdel(src)
return
if(2.0)
- if (prob(50))
+ if(prob(50))
for(var/atom/movable/A as mob|obj in src)
A.forceMove(loc)
ex_act(severity)
qdel(src)
return
if(3.0)
- if (prob(5))
+ if(prob(5))
for(var/atom/movable/A as mob|obj in src)
A.forceMove(loc)
ex_act(severity)
@@ -75,9 +75,9 @@
/obj/structure/morgue/attack_hand(mob/user as mob)
- if (connected)
+ if(connected)
for(var/atom/movable/A as mob|obj in connected.loc)
- if (!( A.anchored ))
+ if(!( A.anchored ))
A.forceMove(src)
playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
qdel(connected)
@@ -88,7 +88,7 @@
step(connected, dir)
connected.layer = OBJ_LAYER
var/turf/T = get_step(src, dir)
- if (T.contents.Find(connected))
+ if(T.contents.Find(connected))
connected.connected = src
icon_state = "morgue0"
for(var/atom/movable/A as mob|obj in src)
@@ -103,14 +103,14 @@
return
/obj/structure/morgue/attackby(P as obj, mob/user as mob, params)
- if (istype(P, /obj/item/weapon/pen))
+ if(istype(P, /obj/item/weapon/pen))
var/t = input(user, "What would you like the label to be?", text("[]", name), null) as text
- if (user.get_active_hand() != P)
+ if(user.get_active_hand() != P)
return
- if ((!in_range(src, usr) && loc != user))
+ if((!in_range(src, usr) && loc != user))
return
t = sanitize(copytext(t,1,MAX_MESSAGE_LEN))
- if (t)
+ if(t)
name = text("Morgue- '[]'", t)
overlays += image(icon, "morgue_label")
else
@@ -120,13 +120,13 @@
return
/obj/structure/morgue/relaymove(mob/user as mob)
- if (user.stat)
+ if(user.stat)
return
connected = new /obj/structure/m_tray( loc )
step(connected, dir)
connected.layer = OBJ_LAYER
var/turf/T = get_step(src, dir)
- if (T.contents.Find(connected))
+ if(T.contents.Find(connected))
connected.connected = src
icon_state = "morgue0"
for(var/atom/movable/A as mob|obj in src)
@@ -147,7 +147,7 @@
var/mob/living/carbon/CM = L
if(!istype(CM))
return
- if (CM.stat || CM.restrained())
+ if(CM.stat || CM.restrained())
return
to_chat(CM, "You attempt to slide yourself out of \the [src]... ")
@@ -170,9 +170,9 @@
/obj/structure/m_tray/attack_hand(mob/user as mob)
- if (connected)
+ if(connected)
for(var/atom/movable/A as mob|obj in loc)
- if (!( A.anchored ))
+ if(!( A.anchored ))
A.forceMove(connected)
connected.connected = null
connected.update()
@@ -182,16 +182,16 @@
return
/obj/structure/m_tray/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
- if ((!( istype(O, /atom/movable) ) || O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src) || user.contents.Find(O)))
+ if((!( istype(O, /atom/movable) ) || O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src) || user.contents.Find(O)))
return
- if (!ismob(O) && !istype(O, /obj/structure/closet/body_bag))
+ if(!ismob(O) && !istype(O, /obj/structure/closet/body_bag))
return
- if (!ismob(user) || user.stat || user.lying || user.stunned)
+ if(!ismob(user) || user.stat || user.lying || user.stunned)
return
O.forceMove(loc)
- if (user != O)
+ if(user != O)
for(var/mob/B in viewers(user, 3))
- if ((B.client && !( B.blinded )))
+ if((B.client && !( B.blinded )))
to_chat(B, text("\red [] stuffs [] into []!", user, O, src))
return
@@ -235,10 +235,10 @@
var/locked = 0
/obj/structure/crematorium/proc/update()
- if (connected)
+ if(connected)
icon_state = "crema0"
else
- if (contents.len)
+ if(contents.len)
icon_state = "crema2"
else
icon_state = "crema1"
@@ -253,14 +253,14 @@
qdel(src)
return
if(2.0)
- if (prob(50))
+ if(prob(50))
for(var/atom/movable/A as mob|obj in src)
A.forceMove(loc)
ex_act(severity)
qdel(src)
return
if(3.0)
- if (prob(5))
+ if(prob(5))
for(var/atom/movable/A as mob|obj in src)
A.forceMove(loc)
ex_act(severity)
@@ -273,23 +273,23 @@
/obj/structure/crematorium/attack_hand(mob/user as mob)
- if (cremating)
+ if(cremating)
to_chat(usr, "\red It's locked.")
return
- if ((connected) && (locked == 0))
+ if((connected) && (locked == 0))
for(var/atom/movable/A as mob|obj in connected.loc)
- if (!( A.anchored ))
+ if(!( A.anchored ))
A.forceMove(src)
playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
qdel(connected)
connected = null
- else if (locked == 0)
+ else if(locked == 0)
playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
connected = new /obj/structure/c_tray( loc )
step(connected, SOUTH)
connected.layer = OBJ_LAYER
var/turf/T = get_step(src, SOUTH)
- if (T.contents.Find(connected))
+ if(T.contents.Find(connected))
connected.connected = src
icon_state = "crema0"
for(var/atom/movable/A as mob|obj in src)
@@ -302,14 +302,14 @@
update()
/obj/structure/crematorium/attackby(P as obj, mob/user as mob, params)
- if (istype(P, /obj/item/weapon/pen))
+ if(istype(P, /obj/item/weapon/pen))
var/t = input(user, "What would you like the label to be?", text("[]", name), null) as text
- if (user.get_active_hand() != P)
+ if(user.get_active_hand() != P)
return
- if ((!in_range(src, usr) > 1 && loc != user))
+ if((!in_range(src, usr) > 1 && loc != user))
return
t = sanitize(copytext(t,1,MAX_MESSAGE_LEN))
- if (t)
+ if(t)
name = text("Crematorium- '[]'", t)
else
name = "Crematorium"
@@ -317,13 +317,13 @@
return
/obj/structure/crematorium/relaymove(mob/user as mob)
- if (user.stat || locked)
+ if(user.stat || locked)
return
connected = new /obj/structure/c_tray( loc )
step(connected, SOUTH)
connected.layer = OBJ_LAYER
var/turf/T = get_step(src, SOUTH)
- if (T.contents.Find(connected))
+ if(T.contents.Find(connected))
connected.connected = src
icon_state = "crema0"
for(var/atom/movable/A as mob|obj in src)
@@ -339,12 +339,12 @@
return //don't let you cremate something twice or w/e
if(contents.len <= 0)
- for (var/mob/M in viewers(src))
+ for(var/mob/M in viewers(src))
M.show_message("You hear a hollow crackle. ", 1)
return
else
- for (var/mob/M in viewers(src))
+ for(var/mob/M in viewers(src))
M.show_message("You hear a roar as the crematorium activates. ", 1)
cremating = 1
@@ -354,7 +354,7 @@
for(var/mob/living/M in search_contents_for(/mob/living))
if(!M || !isnull(M.gcDestroyed))
continue
- if (M.stat!=2)
+ if(M.stat!=2)
M.emote("scream")
if(istype(user))
M.attack_log += "\[[time_stamp()]\] Has been cremated by [user.name] ([user.ckey]) "
@@ -385,7 +385,7 @@
var/mob/living/carbon/CM = L
if(!istype(CM))
return
- if (CM.stat || CM.restrained())
+ if(CM.stat || CM.restrained())
return
to_chat(CM, "You attempt to slide yourself out of \the [src]... ")
@@ -406,9 +406,9 @@
throwpass = 1
/obj/structure/c_tray/attack_hand(mob/user as mob)
- if (connected)
+ if(connected)
for(var/atom/movable/A as mob|obj in loc)
- if (!( A.anchored ))
+ if(!( A.anchored ))
A.forceMove(connected)
//Foreach goto(26)
connected.connected = null
@@ -419,16 +419,16 @@
return
/obj/structure/c_tray/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
- if ((!( istype(O, /atom/movable) ) || O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src) || user.contents.Find(O)))
+ if((!( istype(O, /atom/movable) ) || O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src) || user.contents.Find(O)))
return
- if (!ismob(O) && !istype(O, /obj/structure/closet/body_bag))
+ if(!ismob(O) && !istype(O, /obj/structure/closet/body_bag))
return
- if (!ismob(user) || user.stat || user.lying || user.stunned)
+ if(!ismob(user) || user.stat || user.lying || user.stunned)
return
O.forceMove(loc)
- if (user != O)
+ if(user != O)
for(var/mob/B in viewers(user, 3))
- if ((B.client && !( B.blinded )))
+ if((B.client && !( B.blinded )))
to_chat(B, text("\red [] stuffs [] into []!", user, O, src))
//Foreach goto(99)
return
@@ -441,58 +441,32 @@
/obj/machinery/crema_switch/attack_hand(mob/user as mob)
if(allowed(usr))
- for (var/obj/structure/crematorium/C in world)
- if (C.id == id)
- if (!C.cremating)
+ for(var/obj/structure/crematorium/C in world)
+ if(C.id == id)
+ if(!C.cremating)
C.cremate(user)
else
to_chat(usr, "\red Access denied.")
return
-/hook/Login/proc/update_morgue(var/client/client, var/mob/L)
- //Update morgues on login/logout
- if (L.stat == DEAD)
- var/obj/structure/morgue/Morgue = null
- var/mob/living/carbon/human/C = null
- if (istype(L,/mob/dead/observer)) //We're a ghost, let's find our corpse
- var/mob/dead/observer/G = L
- if(!G.mind) //This'll probably break morgue sprites, but the line under the next If statement causes runtimes with Assume Direct Control.
- return
- if (G.can_reenter_corpse && G.mind.current)
- C = G.mind.current
- else if (istype(L,/mob/living/carbon/human))
- C = L
+/mob/proc/update_morgue()
+ if(stat == DEAD)
+ var/obj/structure/morgue/morgue
+ var/mob/living/C = src
+ var/mob/dead/observer/G = src
+ if(istype(G) && G.can_reenter_corpse && G.mind) //We're a ghost, let's find our corpse
+ C = G.mind.current
+ if(istype(C)) //We found our corpse, is it inside a morgue?
+ morgue = get(C.loc, /obj/structure/morgue)
+ if(morgue)
+ morgue.update()
- if (C) //We found our corpse, is it inside a morgue?
- if (istype(C.loc,/obj/structure/morgue))
- Morgue = C.loc
- else if (istype(C.loc,/obj/structure/closet/body_bag))
- var/obj/structure/closet/body_bag/B = C.loc
- if (istype(B.loc,/obj/structure/morgue))
- Morgue = B.loc
- if (Morgue)
- Morgue.update()
+/hook/mob_login/proc/update_morgue(var/client/client, var/mob/mob)
+ //Update morgues on login
+ mob.update_morgue()
+ return 1
-/hook/Logout/proc/update_morgue(var/client/client, var/mob/L)
- //Update morgues on login/logout
- if (L.stat == DEAD)
- var/obj/structure/morgue/Morgue = null
- var/mob/living/carbon/human/C = null
- if (istype(L,/mob/dead/observer)) //We're a ghost, let's find our corpse
- var/mob/dead/observer/G = L
- if(!G.mind) //This'll probably break morgue sprites, but the line under the next If statement causes runtimes with Assume Direct Control.
- return 1
- if (G.can_reenter_corpse && G.mind.current)
- C = G.mind.current
- else if (istype(L,/mob/living/carbon/human))
- C = L
-
- if (C) //We found our corpse, is it inside a morgue?
- if (istype(C.loc,/obj/structure/morgue))
- Morgue = C.loc
- else if (istype(C.loc,/obj/structure/closet/body_bag))
- var/obj/structure/closet/body_bag/B = C.loc
- if (istype(B.loc,/obj/structure/morgue))
- Morgue = B.loc
- if (Morgue)
- Morgue.update()
\ No newline at end of file
+/hook/mob_logout/proc/update_morgue(var/client/client, var/mob/mob)
+ //Update morgues on logout
+ mob.update_morgue()
+ return 1
diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm
index 9750d449bca..563f9c5faa9 100644
--- a/code/game/objects/structures/musician.dm
+++ b/code/game/objects/structures/musician.dm
@@ -58,7 +58,7 @@
// and play
var/turf/source = get_turf(instrumentObj)
for(var/mob/M in hearers(15, source))
- if(!M.client || !(M.client.prefs.toggles & SOUND_INSTRUMENTS))
+ if(!M.client || !(M.client.prefs.sound & SOUND_INSTRUMENTS))
continue
M.playsound_local(source, soundfile, 100, falloff = 5)
@@ -129,7 +129,7 @@
return
ui = nanomanager.try_update_ui(user, instrumentObj, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, instrumentObj, ui_key, "song.tmpl", instrumentObj.name, 700, 500)
ui.set_initial_data(data)
ui.open()
@@ -298,11 +298,11 @@
song.Topic(href, href_list)
/obj/structure/piano/attackby(obj/item/O as obj, mob/user as mob, params)
- if (istype(O, /obj/item/weapon/wrench))
- if (!anchored && !isinspace())
+ if(istype(O, /obj/item/weapon/wrench))
+ if(!anchored && !isinspace())
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
to_chat(user, " You begin to tighten \the [src] to the floor... ")
- if (do_after(user, 20, target = src))
+ if(do_after(user, 20, target = src))
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
" You have tightened \the [src]'s casters. Now it can be played again. ", \
@@ -311,7 +311,7 @@
else if(anchored)
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
to_chat(user, " You begin to loosen \the [src]'s casters... ")
- if (do_after(user, 40, target = src))
+ if(do_after(user, 40, target = src))
user.visible_message( \
"[user] loosens \the [src]'s casters.", \
" You have loosened \the [src]. Now it can be pulled somewhere else. ", \
diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
index 3f5decad98e..d58888d6e24 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
@@ -47,7 +47,7 @@
/obj/structure/stool/bed/nest/user_buckle_mob(mob/living/M, mob/living/user)
- if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || usr.stat || M.buckled || istype(user, /mob/living/silicon/pai) )
+ if( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || usr.stat || M.buckled || istype(user, /mob/living/silicon/pai) )
return
if(M.get_int_organ(/obj/item/organ/internal/xenos/plasmavessel))
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index ecf2324673d..f13bffb9d44 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -16,7 +16,7 @@
var/movable = 0 // For mobility checks
/obj/structure/stool/bed/MouseDrop(atom/over_object)
- ..(over_object, 1)
+ ..(over_object, skip_fucking_stool_shit = 1)
/obj/structure/stool/psychbed
name = "psych bed"
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index 952f442b4f2..b8ce126bbfa 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -149,6 +149,15 @@
anchored = 0
movable = 1
+/obj/structure/stool/bed/chair/comfy/attackby(obj/item/weapon/W, mob/user, params)
+ if(iswrench(W))
+ playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ new /obj/item/stack/sheet/metal(get_turf(src))
+ new /obj/item/stack/sheet/metal(get_turf(src))
+ qdel(src)
+ else
+ ..()
+
/obj/structure/stool/bed/chair/office/Bump(atom/A)
..()
if(!buckled_mob) return
diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm
index efdadfbb7c2..da69c025bb8 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm
@@ -11,12 +11,12 @@
qdel(src)
return
if(2.0)
- if (prob(70))
+ if(prob(70))
new /obj/item/stack/sheet/metal(src.loc)
qdel(src)
return
if(3.0)
- if (prob(50))
+ if(prob(50))
new /obj/item/stack/sheet/metal(src.loc)
qdel(src)
return
@@ -34,17 +34,17 @@
qdel(src)
return
-/obj/structure/stool/MouseDrop(atom/over_object, skip_fucking_stool_shit = 0)
+/obj/structure/stool/MouseDrop(atom/over_object, src_location, over_location, src_control, over_control, params, skip_fucking_stool_shit = 0)
if(skip_fucking_stool_shit)
return ..(over_object)
- if (istype(over_object, /mob/living/carbon/human))
+ if(istype(over_object, /mob/living/carbon/human))
var/mob/living/carbon/human/H = over_object
- if (H==usr && !H.restrained() && !H.stat && in_range(src, over_object))
+ if(H==usr && !H.restrained() && !H.stat && in_range(src, over_object))
var/obj/item/weapon/stool/S = new/obj/item/weapon/stool()
S.origin = src
src.loc = S
H.put_in_hands(S)
- H.visible_message("\red [H] grabs [src] from the floor!", "\red You grab [src] from the floor!")
+ H.visible_message("[H] grabs [src] from the floor! ", "You grab [src] from the floor! ")
/obj/item/weapon/stool
name = "stool"
@@ -53,19 +53,19 @@
icon_state = "stool"
force = 10
throwforce = 10
- w_class = 5.0
+ w_class = 5
var/obj/structure/stool/origin = null
/obj/item/weapon/stool/attack_self(mob/user as mob)
..()
origin.loc = get_turf(src)
user.unEquip(src)
- user.visible_message("\blue [user] puts [src] down.", "\blue You put [src] down.")
+ user.visible_message("[user] puts [src] down. ", "You put [src] down. ")
qdel(src)
/obj/item/weapon/stool/attack(mob/M as mob, mob/user as mob)
- if (prob(5) && istype(M,/mob/living))
- user.visible_message("\red [user] breaks [src] over [M]'s back!.")
+ if(prob(5) && istype(M,/mob/living))
+ user.visible_message("[user] breaks [src] over [M]'s back!. ")
user.unEquip(src)
var/obj/item/stack/sheet/metal/m = new/obj/item/stack/sheet/metal
m.loc = get_turf(src)
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 8bab5ac467b..b21fa103427 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -58,14 +58,14 @@
var/subtype = null
for(var/direction in list(turn(dir,90), turn(dir,-90)) )
var/obj/structure/table/T = locate(/obj/structure/table,get_step(src,direction))
- if (T && T.flipped)
+ if(T && T.flipped)
type++
if(type == 1)
subtype = direction == turn(dir,90) ? "-" : "+"
var/base = "table"
- if (istype(src, /obj/structure/table/woodentable))
+ if(istype(src, /obj/structure/table/woodentable))
base = "wood"
- if (istype(src, /obj/structure/table/reinforced))
+ if(istype(src, /obj/structure/table/reinforced))
base = "rtable"
icon_state = "[base]flip[type][type == 1 ? subtype : ""]"
@@ -79,11 +79,11 @@
qdel(src)
return
if(2.0)
- if (prob(50))
+ if(prob(50))
qdel(src)
return
if(3.0)
- if (prob(25))
+ if(prob(25))
destroy()
else
return
@@ -138,8 +138,8 @@
return 1
if(locate(/obj/structure/table) in get_turf(mover))
return 1
- if (flipped)
- if (get_dir(loc, target) == dir)
+ if(flipped)
+ if(get_dir(loc, target) == dir)
return !density
else
return 1
@@ -154,13 +154,13 @@
//checks if projectile 'P' from turf 'from' can hit whatever is behind the table. Returns 1 if it can, 0 if bullet stops.
/obj/structure/table/proc/check_cover(obj/item/projectile/P, turf/from)
var/turf/cover = flipped ? get_turf(src) : get_step(loc, get_dir(from, loc))
- if (get_dist(P.starting, loc) <= 1) //Tables won't help you if people are THIS close
+ if(get_dist(P.starting, loc) <= 1) //Tables won't help you if people are THIS close
return 1
- if (get_turf(P.original) == cover)
+ if(get_turf(P.original) == cover)
var/chance = 20
- if (ismob(P.original))
+ if(ismob(P.original))
var/mob/M = P.original
- if (M.lying)
+ if(M.lying)
chance += 20 //Lying down lets you catch less bullets
if(flipped)
if(get_dir(loc, from) == dir) //Flipped tables catch mroe bullets
@@ -169,7 +169,7 @@
return 1 //But only from one side
if(prob(chance))
health -= P.damage/2
- if (health > 0)
+ if(health > 0)
visible_message("[P] hits \the [src]! ")
return 0
else
@@ -181,8 +181,8 @@
/obj/structure/table/CheckExit(atom/movable/O as mob|obj, target as turf)
if(istype(O) && O.checkpass(PASSTABLE))
return 1
- if (flipped)
- if (get_dir(loc, target) == dir)
+ if(flipped)
+ if(get_dir(loc, target) == dir)
return !density
else
return 1
@@ -190,13 +190,13 @@
/obj/structure/table/MouseDrop_T(obj/O as obj, mob/user as mob)
..()
- if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O))
+ if((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O))
return
if(isrobot(user))
return
if(!user.drop_item())
return
- if (O.loc != src.loc)
+ if(O.loc != src.loc)
step(O, get_dir(O, src))
return
@@ -221,11 +221,11 @@
qdel(I)
/obj/structure/table/attackby(obj/item/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/grab))
+ if(istype(W, /obj/item/weapon/grab))
tablepush(W, user)
return
- if (istype(W, /obj/item/weapon/wrench))
+ if(istype(W, /obj/item/weapon/wrench))
user.visible_message("[user] is disassembling \a [src]. ", "You start disassembling \the [src]. ")
playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
if(do_after(user, 50, target = src))
@@ -267,11 +267,11 @@
if(T && !T.flipped)
return 0
T = locate() in get_step(src.loc,direction)
- if (!T || T.flipped)
+ if(!T || T.flipped)
return 1
- if (istype(T,/obj/structure/table/reinforced/))
+ if(istype(T,/obj/structure/table/reinforced/))
var/obj/structure/table/reinforced/R = T
- if (R.status == 2)
+ if(R.status == 2)
return 0
return T.straight_table_check(direction)
@@ -281,7 +281,7 @@
set category = null
set src in oview(1)
- if (!can_touch(usr) || ismouse(usr))
+ if(!can_touch(usr) || ismouse(usr))
return
if(!flip(get_cardinal_dir(usr,src)))
@@ -301,13 +301,13 @@
set category = "Object"
set src in oview(1)
- if (!unflip())
+ if(!unflip())
to_chat(usr, "It won't budge. ")
return
/obj/structure/table/proc/flip(var/direction)
- if (flipped)
+ if(flipped)
return 0
if( !straight_table_check(turn(direction,90)) || !straight_table_check(turn(direction,-90)) )
@@ -317,8 +317,8 @@
verbs +=/obj/structure/table/proc/do_put
var/list/targets = list(get_step(src,dir),get_step(src,turn(dir, 45)),get_step(src,turn(dir, -45)))
- for (var/atom/movable/A in get_turf(src))
- if (!A.anchored)
+ for(var/atom/movable/A in get_turf(src))
+ if(!A.anchored)
spawn(0)
A.throw_at(pick(targets),1,1)
@@ -337,14 +337,14 @@
return 1
/obj/structure/table/proc/unflip()
- if (!flipped)
+ if(!flipped)
return 0
var/can_flip = 1
- for (var/mob/A in oview(src,0))//src.loc)
- if (istype(A))
+ for(var/mob/A in oview(src,0))//src.loc)
+ if(istype(A))
can_flip = 0
- if (!can_flip)
+ if(!can_flip)
return 0
verbs -=/obj/structure/table/proc/do_put
@@ -482,33 +482,33 @@
canSmoothWith = list(/obj/structure/table/reinforced, /obj/structure/table)
/obj/structure/table/reinforced/flip(var/direction)
- if (status == 2)
+ if(status == 2)
return 0
else
return ..()
/obj/structure/table/reinforced/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/weldingtool))
+ if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0, user))
if(src.status == 2)
to_chat(user, "\blue Now weakening the reinforced table")
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
- if (do_after(user, 50, target = src))
+ if(do_after(user, 50, target = src))
if(!src || !WT.isOn()) return
to_chat(user, "\blue Table weakened")
src.status = 1
else
to_chat(user, "\blue Now strengthening the reinforced table")
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
- if (do_after(user, 50, target = src))
+ if(do_after(user, 50, target = src))
if(!src || !WT.isOn()) return
to_chat(user, "\blue Table strengthened")
src.status = 2
return
return
- if (istype(W, /obj/item/weapon/wrench))
+ if(istype(W, /obj/item/weapon/wrench))
if(src.status == 2)
return
@@ -571,18 +571,18 @@
. = . || mover.checkpass(PASSTABLE)
/obj/structure/rack/MouseDrop_T(obj/O as obj, mob/user as mob)
- if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O))
+ if((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O))
return
if(isrobot(user))
return
if(!user.drop_item())
return
- if (O.loc != src.loc)
+ if(O.loc != src.loc)
step(O, get_dir(O, src))
return
/obj/structure/rack/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/wrench))
+ if(istype(W, /obj/item/weapon/wrench))
new /obj/item/weapon/rack_parts( src.loc )
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
qdel(src)
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index efef25723a5..5d8c98be329 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -174,11 +174,11 @@
on = !on
update_icon()
if(on)
- if (M.loc == loc)
+ if(M.loc == loc)
wash(M)
check_heat(M)
M.water_act(100, convertHeat(), src)
- for (var/atom/movable/G in src.loc)
+ for(var/atom/movable/G in src.loc)
G.clean_blood()
G.water_act(100, convertHeat(), src)
@@ -283,9 +283,9 @@
washears = !(H.head.flags_inv & HIDEEARS)
if(H.wear_mask)
- if (washears)
+ if(washears)
washears = !(H.wear_mask.flags_inv & HIDEEARS)
- if (washglasses)
+ if(washglasses)
washglasses = !(H.wear_mask.flags_inv & HIDEEYES)
if(H.head)
@@ -382,10 +382,10 @@
if(!Adjacent(user))
return
- if (ishuman(user))
+ if(ishuman(user))
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
- if (user.hand)
+ if(user.hand)
temp = H.organs_by_name["l_hand"]
if(temp && !temp.is_usable())
to_chat(user, "You try to move your [temp.name], but cannot!")
@@ -434,7 +434,7 @@
var/wateract = 0
wateract = (O.wash(user, src))
busy = 0
- if (wateract)
+ if(wateract)
O.water_act(20,310.15,src)
/obj/structure/sink/kitchen
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index 529dbb447a8..47e0823f549 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -76,7 +76,7 @@ obj/structure/windoor_assembly/Destroy()
if("01")
if(istype(W, /obj/item/weapon/weldingtool) && !anchored )
var/obj/item/weapon/weldingtool/WT = W
- if (WT.remove_fuel(0,user))
+ if(WT.remove_fuel(0,user))
user.visible_message("[user] dissassembles the windoor assembly. ", "You start to dissassemble the windoor assembly. ")
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
@@ -307,7 +307,7 @@ obj/structure/windoor_assembly/Destroy()
set src in oview(1)
if(usr.stat || !usr.canmove || usr.restrained())
return
- if (src.anchored)
+ if(src.anchored)
to_chat(usr, "It is fastened to the floor; therefore, you can't rotate it!")
return 0
//if(src.state != "01")
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index b4ae7069768..77a38aa056a 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -130,7 +130,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!"))
user.visible_message("[user] smashes through [src]! ")
destroy()
- else if (user.a_intent == I_HARM)
+ else if(user.a_intent == I_HARM)
user.changeNext_move(CLICK_CD_MELEE)
playsound(get_turf(src), 'sound/effects/glassknock.ogg', 80, 1)
user.visible_message("\red [user.name] bangs against the [src.name]!", \
@@ -171,27 +171,27 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
/obj/structure/window/attack_slime(mob/living/user as mob)
var/mob/living/carbon/slime/S = user
- if (!S.is_adult)
+ if(!S.is_adult)
return
attack_generic(user, rand(10, 15))
/obj/structure/window/attackby(obj/item/weapon/W as obj, mob/living/user as mob, params)
if(!istype(W)) return//I really wish I did not need this
- if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
+ if(istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
var/obj/item/weapon/grab/G = W
if(istype(G.affecting,/mob/living))
var/mob/living/M = G.affecting
var/state = G.state
qdel(W) //gotta delete it here because if window breaks, it won't get deleted
- switch (state)
+ switch(state)
if(1)
M.visible_message("[user] slams [M] against \the [src]! ")
M.apply_damage(7)
hit(10)
if(2)
M.visible_message("[user] bashes [M] against \the [src]! ")
- if (prob(50))
+ if(prob(50))
M.Weaken(1)
M.apply_damage(10)
hit(25)
@@ -232,16 +232,16 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
for(var/i=0;i=G.max_amount)
continue
G.attackby(NG, user, params)
- if (reinf)
+ if(reinf)
var/obj/item/stack/rods/NR = new (src.loc)
- for (var/obj/item/stack/rods/R in src.loc)
+ for(var/obj/item/stack/rods/R in src.loc)
if(R==NR)
continue
if(R.amount>=R.max_amount)
@@ -341,10 +341,13 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
ini_dir = dir
if(!color && !istype(src,/obj/structure/window/plasmabasic) && !istype(src,/obj/structure/window/plasmareinforced))
color = color_windows(src)
- air_update_turf(1)
update_nearby_icons()
return
+/obj/structure/window/initialize()
+ air_update_turf(1)
+ return ..()
+
/obj/structure/window/Destroy()
density = 0
air_update_turf(1)
@@ -405,10 +408,13 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
/obj/structure/window/plasmabasic/New(Loc,re=0)
..()
ini_dir = dir
- air_update_turf(1)
update_nearby_icons()
return
+/obj/structure/window/plasmabasic/initialize()
+ ..()
+ air_update_turf(1)
+
/obj/structure/window/plasmabasic/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
if(exposed_temperature > T0C + 32000)
hit(round(exposed_volume / 1000), 0)
@@ -436,10 +442,13 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
/obj/structure/window/plasmareinforced/New(Loc,re=0)
..()
ini_dir = dir
- air_update_turf(1)
update_nearby_icons()
return
+/obj/structure/window/plasmareinforced/initialize()
+ ..()
+ air_update_turf(1)
+
/obj/structure/window/plasmareinforced/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
return
@@ -508,7 +517,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
update_icon()
for(var/obj/structure/window/reinforced/polarized/W in range(src,range))
- if (W.id == src.id || !W.id)
+ if(W.id == src.id || !W.id)
spawn(0)
W.toggle()
return
@@ -519,4 +528,4 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
toggle_tint()
/obj/machinery/button/windowtint/update_icon()
- icon_state = "light[active]"
\ No newline at end of file
+ icon_state = "light[active]"
diff --git a/code/game/response_team.dm b/code/game/response_team.dm
index d9b8cfcc375..93c0368f268 100644
--- a/code/game/response_team.dm
+++ b/code/game/response_team.dm
@@ -9,6 +9,7 @@ var/list/response_team_members = list()
var/responseteam_age = 21 // Minimum account age to play as an ERT member
var/datum/response_team/active_team = null
var/send_emergency_team
+var/ert_request_answered = 0
/client/proc/response_team()
set name = "Dispatch CentComm Response Team"
@@ -47,6 +48,7 @@ var/send_emergency_team
if(!ert_type)
return
+ ert_request_answered = 1
message_admins("[key_name_admin(usr)] is dispatching an Emergency Response Team", 1)
log_admin("[key_name(usr)] used Dispatch Emergency Response Team..")
trigger_armed_response_team(ert_type)
@@ -59,100 +61,87 @@ var/send_emergency_team
else
return pick_ert_type()
if("Code Red")
- if(alert("Confirm: Deploy code 'RED' medium ERT ?", "Emergency Response Team", "Confirm", "Cancel") == "Confirm")
+ if(alert("Confirm: Deploy code 'RED' medium ERT?", "Emergency Response Team", "Confirm", "Cancel") == "Confirm")
return new /datum/response_team/red
else
return pick_ert_type()
if("Code Gamma")
- if(alert("Confirm: Deploy code 'GAMMA' elite ERT ?", "Emergency Response Team", "Confirm", "Cancel") == "Confirm")
+ if(alert("Confirm: Deploy code 'GAMMA' elite ERT?", "Emergency Response Team", "Confirm", "Cancel") == "Confirm")
return new /datum/response_team/gamma
else
return pick_ert_type()
return 0
-/mob/dead/observer/verb/JoinResponseTeam()
- set category = "Ghost"
- set name = "Join Emergency Response Team"
- set desc = "Join the Emergency Response Team. Only possible if it has been called by the crew."
-
- if(!istype(usr,/mob/dead/observer) && !istype(usr,/mob/new_player))
- to_chat(usr, "You need to be an observer or new player to use this.")
- return
+/mob/dead/observer/proc/JoinResponseTeam()
if(!send_emergency_team)
- to_chat(usr, "No emergency response team is currently being sent.")
- return
+ to_chat(src, "No emergency response team is currently being sent.")
+ return 0
- if(jobban_isbanned(usr, ROLE_ERT))
- to_chat(usr, "You are jobbanned from the emergency reponse team! ")
- return
+ if(jobban_isbanned(src, ROLE_ERT))
+ to_chat(src, "You are jobbanned from the emergency reponse team! ")
+ return 0
- var/player_age_check = check_client_age(usr.client, responseteam_age)
+ var/player_age_check = check_client_age(src.client, responseteam_age)
if(player_age_check && config.use_age_restriction_for_antags)
- to_chat(usr, "This role is not yet available to you. You need to wait another [player_age_check] days. ")
- return
+ to_chat(src, "This role is not yet available to you. You need to wait another [player_age_check] days. ")
+ return 0
if(src.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
- to_chat(usr, "\blue Upon using the antagHUD you forfeited the ability to join the round. ")
- return
+ to_chat(src, "\blue Upon using the antagHUD you forfeited the ability to join the round. ")
+ return 0
if(response_team_members.len > 6)
- to_chat(usr, "The emergency response team is already full!")
- return
+ to_chat(src, "The emergency response team is already full!")
+ return 0
- for (var/obj/effect/landmark/L in landmarks_list)
- if (L.name == "Response Team")
+ for(var/obj/effect/landmark/L in landmarks_list)
+ if(L.name == "Response Team")
L.name = null
-
- if(alert(usr, "Would you like to join the Emergency Response Team?", "Emergency Response Team", "Yes", "No") == "No")
- L.name = "Response Team"
- return
-
if(!src.client)
return
- var/client/C = src.client
- var/mob/living/carbon/human/new_commando = C.create_response_team(L.loc)
- qdel(L)
- new_commando.mind.key = usr.key
- new_commando.key = usr.key
- new_commando.update_icons()
-
- return
+ spawn(-1)
+ var/client/C = src.client
+ var/mob/living/carbon/human/new_commando = C.create_response_team(L.loc)
+ qdel(L)
+ new_commando.mind.key = src.key
+ new_commando.key = src.key
+ new_commando.update_icons()
+ return 1
/proc/trigger_armed_response_team(var/datum/response_team/response_team_type)
active_team = response_team_type
- active_team.announce_team()
send_emergency_team = 1
- sleep(600 * 5)
- send_emergency_team = 0 // Can no longer join the ERT.
-
-/*
- var/area/security/nuke_storage/nukeloc = locate() //To find the nuke in the vault
- var/obj/machinery/nuclearbomb/nuke = locate() in nukeloc
- if(!nuke)
- nuke = locate() in world
- var/obj/item/weapon/paper/P = new
- P.info = "Your orders, Commander, are to use all means necessary to return the station to a survivable condition. To this end, you have been provided with the best tools we can give for Security, Medical, Engineering and Janitorial duties. The nuclear authorization code is: [ nuke ? nuke.r_code : "UNKNOWN"] . Be warned, if you detonate this without good reason, we will hold you to account for damages. Memorise this code, and then destroy this message."
- P.name = "ERT Orders and Emergency Nuclear Code"
- var/obj/item/weapon/stamp/centcom/stamp = new
- P.stamp(stamp)
- qdel(stamp)
- for (var/obj/effect/landmark/A in world)
- if (A.name == "nukecode")
- P.loc = A.loc
- qdel(A)
- continue
-*/
+ var/list/ert_candidates = pollCandidates("Join the Emergency Response Team?",, responseteam_age, 600)
+ if(!ert_candidates.len)
+ active_team.cannot_send_team()
+ send_emergency_team = 0
+ return
+ var/teamsize = 0
+ for(var/mob/dead/observer/M in ert_candidates)
+ teamsize += M.JoinResponseTeam()
+ send_emergency_team = 0
+ if (!teamsize)
+ active_team.cannot_send_team()
+ return
+ active_team.announce_team()
/client/proc/create_response_team(obj/spawn_location)
var/mob/living/carbon/human/M = new(null)
var/obj/item/organ/external/head/head_organ = M.get_organ("head")
response_team_members |= M
- var/new_gender = alert(usr, "Please select your gender.", "Character Generation", "Male", "Female")
- if (new_gender)
+ var/new_gender = alert(src, "Please select your gender.", "ERT Character Generation", "Male", "Female")
+
+ var/class = 0
+ while(!class)
+ class = input(src, "Which loadout would you like to choose?") in active_team.get_slot_list()
+ if(!active_team.check_slot_available(class)) // Because the prompt does not update automatically when a slot gets filled.
+ class = 0
+
+ if(new_gender)
if(new_gender == "Male")
M.change_gender(MALE)
else
@@ -201,12 +190,6 @@ var/send_emergency_team
ticker.minds += M.mind //Adds them to regular mind list.
M.loc = spawn_location
- var/class = 0
- while (!class)
- class = input("Which loadout would you like to choose?") in active_team.get_slot_list()
- if(!active_team.check_slot_available(class)) // Because the prompt does not update automatically when a slot gets filled.
- class = 0
-
active_team.equip_officer(class, M)
return M
@@ -258,7 +241,7 @@ var/send_emergency_team
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/engineer(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/responseteam(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_in_backpack)
var/obj/item/weapon/card/id/W = new(src)
W.assignment = "Emergency Response Team Member"
@@ -273,7 +256,7 @@ var/send_emergency_team
pda.ownjob = "Emergency Response Team Member"
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
pda.icon_state = "pda-engineer"
- M.equip_to_slot_or_del(pda, slot_wear_pda)
+ M.equip_to_slot_or_del(pda, slot_belt)
if("Security")
@@ -282,7 +265,7 @@ var/send_emergency_team
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/security(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/responseteam(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/response_team(M), slot_belt)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/response_team(M), slot_in_backpack)
var/obj/item/weapon/card/id/W = new(src)
W.assignment = "Emergency Response Team Member"
@@ -297,7 +280,7 @@ var/send_emergency_team
pda.ownjob = "Emergency Response Team Member"
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
pda.icon_state = "pda-security"
- M.equip_to_slot_or_del(pda, slot_wear_pda)
+ M.equip_to_slot_or_del(pda, slot_belt)
if("Medic")
@@ -319,7 +302,7 @@ var/send_emergency_team
pda.ownjob = "Emergency Response Team Member"
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
pda.icon_state = "pda-medical"
- M.equip_to_slot_or_del(pda, slot_wear_pda)
+ M.equip_to_slot_or_del(pda, slot_belt)
if("Commander")
@@ -346,18 +329,20 @@ var/send_emergency_team
pda.owner = M.real_name
pda.ownjob = "Emergency Response Team Leader"
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
- M.equip_to_slot_or_del(pda, slot_wear_pda)
+ M.equip_to_slot_or_del(pda, slot_belt)
+/datum/response_team/proc/cannot_send_team()
+ command_announcement.Announce("[station_name()], we are unfortunately unable to send you an Emergency Response Team at this time.", "ERT Unavailable")
/datum/response_team/proc/announce_team()
- command_announcement.Announce("Attention, [station_name()]. We are attempting to assemble a team of highly trained assistants to aid(?) you. Standby.", "Central Command")
+ command_announcement.Announce("Attention, [station_name()]. We are sending a team of highly trained assistants to aid(?) you. Standby.", "ERT En-Route")
// -- AMBER TEAM --
/datum/response_team/amber
/datum/response_team/amber/announce_team()
- command_announcement.Announce("Attention, [station_name()]. We are attempting to assemble a code AMBER light Emergency Response Team. Standby.", "Central Command")
+ command_announcement.Announce("Attention, [station_name()]. We are sending a code AMBER light Emergency Response Team. Standby.", "ERT En-Route")
/datum/response_team/amber/equip_officer(var/officer_type, var/mob/living/carbon/human/M)
..()
@@ -397,13 +382,12 @@ var/send_emergency_team
M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/ert/medical(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/medical/response_team(M), slot_belt)
-
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/ert/medical(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/o2(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/brute(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/medical/response_team(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/CMO(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
@@ -414,12 +398,11 @@ var/send_emergency_team
M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest/ert/command(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt)
-
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/ert/command(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/lockbox/loyalty(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
@@ -429,7 +412,7 @@ var/send_emergency_team
/datum/response_team/red
/datum/response_team/red/announce_team()
- command_announcement.Announce("Attention, [station_name()]. We are attempting to assemble a code RED Emergency Response Team. Standby.", "Central Command")
+ command_announcement.Announce("Attention, [station_name()]. We are sending a code RED Emergency Response Team. Standby.", "ERT En-Route")
/datum/response_team/red/equip_officer(var/officer_type, var/mob/living/carbon/human/M)
..()
@@ -479,7 +462,6 @@ var/send_emergency_team
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/medical(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/health_advanced(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/weapon/defibrillator/compact/loaded(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/medical(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_in_backpack)
@@ -488,6 +470,7 @@ var/send_emergency_team
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/surgery(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/defibrillator/compact/loaded(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/CMO(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
@@ -498,12 +481,12 @@ var/send_emergency_team
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/commander(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_belt)
-
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/commander(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/lockbox/loyalty(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_in_backpack)
+
M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
@@ -513,7 +496,7 @@ var/send_emergency_team
/datum/response_team/gamma
/datum/response_team/gamma/announce_team()
- command_announcement.Announce("Attention, [station_name()]. We are attempting to assemble a code GAMMA elite Emergency Response Team. Standby.", "Central Command")
+ command_announcement.Announce("Attention, [station_name()]. We are sending a code GAMMA elite Emergency Response Team. Standby.", "ERT En-Route")
/datum/response_team/gamma/equip_officer(var/officer_type, var/mob/living/carbon/human/M)
..()
@@ -561,12 +544,12 @@ var/send_emergency_team
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/medical(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/night(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/weapon/defibrillator/compact/loaded(M), slot_belt)
-
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/medical(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/surgery(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/defibrillator/compact/loaded(M), slot_in_backpack)
+
M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(src), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
@@ -579,13 +562,13 @@ var/send_emergency_team
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/commander(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/night(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_belt)
-
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/ert/commander(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/lockbox/loyalty(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/nuclear(M), slot_in_backpack)
+
M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
diff --git a/code/game/skincmd.dm b/code/game/skincmd.dm
index fd9131538e4..7d27a1ce6df 100644
--- a/code/game/skincmd.dm
+++ b/code/game/skincmd.dm
@@ -8,6 +8,6 @@
set hidden = 1
var/ref = copytext(data, 1, findtext(data, ";"))
- if (src.skincmds[ref] != null)
+ if(src.skincmds[ref] != null)
var/obj/a = src.skincmds[ref]
a.SkinCmd(src, copytext(data, findtext(data, ";") + 1))
\ No newline at end of file
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 1890a0966e7..7bf3af10e9c 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -25,7 +25,7 @@ var/list/ricochet = list('sound/weapons/effects/ric1.ogg', 'sound/weapons/effect
var/turf/turf_source = get_turf(source)
// Looping through the player list has the added bonus of working for mobs inside containers
- for (var/P in player_list)
+ for(var/P in player_list)
var/mob/M = P
if(!M || !M.client)
continue
@@ -48,7 +48,7 @@ var/const/FALLOFF_SOUNDS = 0.5
S.channel = 0 //Any channel
S.volume = vol
S.environment = -1
- if (vary)
+ if(vary)
if(frequency)
S.frequency = frequency
else
@@ -69,20 +69,20 @@ var/const/FALLOFF_SOUNDS = 0.5
var/datum/gas_mixture/hearer_env = T.return_air()
var/datum/gas_mixture/source_env = turf_source.return_air()
- if (hearer_env && source_env)
+ if(hearer_env && source_env)
var/pressure = min(hearer_env.return_pressure(), source_env.return_pressure())
- if (pressure < ONE_ATMOSPHERE)
+ if(pressure < ONE_ATMOSPHERE)
pressure_factor = max((pressure - SOUND_MINIMUM_PRESSURE)/(ONE_ATMOSPHERE - SOUND_MINIMUM_PRESSURE), 0)
else //in space
pressure_factor = 0
- if (distance <= 1)
+ if(distance <= 1)
pressure_factor = max(pressure_factor, 0.15) //hearing through contact
S.volume *= pressure_factor
- if (S.volume <= 0)
+ if(S.volume <= 0)
return //no volume means no sound
var/dx = turf_source.x - T.x // Hearing from the right/left
@@ -108,29 +108,29 @@ var/const/FALLOFF_SOUNDS = 0.5
/proc/get_sfx(soundin)
if(istext(soundin))
switch(soundin)
- if ("shatter")
+ if("shatter")
soundin = pick(shatter_sound)
- if ("explosion")
+ if("explosion")
soundin = pick(explosion_sound)
- if ("sparks")
+ if("sparks")
soundin = pick(spark_sound)
- if ("rustle")
+ if("rustle")
soundin = pick(rustle_sound)
- if ("bodyfall")
+ if("bodyfall")
soundin = pick(bodyfall_sound)
- if ("punch")
+ if("punch")
soundin = pick(punch_sound)
- if ("clownstep")
+ if("clownstep")
soundin = pick(clown_sound)
- if ("jackboot")
+ if("jackboot")
soundin = pick(jackboot_sound)
- if ("swing_hit")
+ if("swing_hit")
soundin = pick(swing_hit_sound)
- if ("hiss")
+ if("hiss")
soundin = pick(hiss_sound)
- if ("pageturn")
+ if("pageturn")
soundin = pick(page_sound)
- if ("gunshot")
+ if("gunshot")
soundin = pick(gun_sound)
if("computer_ambience")
soundin = pick(computer_ambience)
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index be8828a2dc9..3bce2fcfe3d 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -89,7 +89,7 @@
bloodcolor = M.feet_blood_color
M.track_blood--
- if (bloodDNA)
+ if(bloodDNA)
src.AddTracks(/obj/effect/decal/cleanable/blood/tracks/footprints,bloodDNA,M.dir,0,bloodcolor) // Coming
var/turf/simulated/from = get_step(M,reverse_direction(M.dir))
if(istype(from) && from)
@@ -97,25 +97,24 @@
bloodDNA = null
- switch (src.wet)
+ switch(src.wet)
if(TURF_WET_WATER)
- if (!(M.slip("wet floor", 4, 2, 0, 1)))
+ if(!(M.slip("wet floor", 4, 2, 0, 1)))
M.inertia_dir = 0
return
if(TURF_WET_LUBE) //lube
- if(M.slip("floor", 0, 7, 4, 0, 1))
- M.take_organ_damage(2) // Was 5 -- TLE
+ M.slip("floor", 0, 5, 3, 0, 1)
if(TURF_WET_ICE) // Ice
- if (!(prob(30) && M.slip("icy floor", 4, 2, 1, 1)))
+ if(!(prob(30) && M.slip("icy floor", 4, 2, 1, 1)))
M.inertia_dir = 0
//returns 1 if made bloody, returns 0 otherwise
/turf/simulated/add_blood(mob/living/carbon/human/M)
- if (!..())
+ if(!..())
return 0
var/obj/effect/decal/cleanable/blood/B = locate() in contents //check for existing blood splatter
diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm
index f150be57ba6..3c73c0789e7 100644
--- a/code/game/turfs/simulated/floor.dm
+++ b/code/game/turfs/simulated/floor.dm
@@ -48,8 +48,8 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
//turf/simulated/floor/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
-// if ((istype(mover, /obj/machinery/vehicle) && !(src.burnt)))
-// if (!( locate(/obj/machinery/mass_driver, src) ))
+// if((istype(mover, /obj/machinery/vehicle) && !(src.burnt)))
+// if(!( locate(/obj/machinery/mass_driver, src) ))
// return 0
// return ..()
@@ -75,7 +75,7 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
src.hotspot_expose(1000,CELL_VOLUME)
if(prob(33)) new /obj/item/stack/sheet/metal(src)
if(3.0)
- if (prob(50))
+ if(prob(50))
src.break_tile()
src.hotspot_expose(1000,CELL_VOLUME)
return
@@ -129,16 +129,17 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3","
/turf/simulated/floor/proc/make_plating()
return ChangeTurf(/turf/simulated/floor/plating)
-/turf/simulated/floor/ChangeTurf(turf/simulated/floor/T)
+/turf/simulated/floor/ChangeTurf(turf/simulated/floor/T, defer_change = FALSE, keep_icon = TRUE)
if(!istype(src,/turf/simulated/floor)) return ..() //fucking turfs switch the fucking src of the fucking running procs
if(!ispath(T,/turf/simulated/floor)) return ..()
var/old_icon = icon_regular_floor
var/old_plating = icon_plating
var/old_dir = dir
var/turf/simulated/floor/W = ..()
- W.icon_regular_floor = old_icon
- W.icon_plating = old_plating
- W.dir = old_dir
+ if(keep_icon)
+ W.icon_regular_floor = old_icon
+ W.icon_plating = old_plating
+ W.dir = old_dir
W.update_icon()
return W
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index 764ca6055d4..dcc05e5acfe 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -30,13 +30,13 @@
to_chat(user, "Repair the plating first! ")
return 1
var/obj/item/stack/rods/R = C
- if (R.get_amount() < 2)
+ if(R.get_amount() < 2)
to_chat(user, "You need two rods to make a reinforced floor! ")
return 1
else
to_chat(user, "You begin reinforcing the floor... ")
if(do_after(user, 30, target = src))
- if (R.get_amount() >= 2 && !istype(src, /turf/simulated/floor/engine))
+ if(R.get_amount() >= 2 && !istype(src, /turf/simulated/floor/engine))
ChangeTurf(/turf/simulated/floor/engine)
playsound(src, 'sound/items/Deconstruct.ogg', 80, 1)
R.use(2)
diff --git a/code/game/turfs/simulated/shuttle.dm b/code/game/turfs/simulated/shuttle.dm
index a169d588dd2..ac520ca8c0f 100644
--- a/code/game/turfs/simulated/shuttle.dm
+++ b/code/game/turfs/simulated/shuttle.dm
@@ -62,4 +62,4 @@
/turf/simulated/shuttle/floor4/vox //Vox skipjack floors
name = "skipjack floor"
oxygen = 0
- nitrogen = MOLES_N2STANDARD + MOLES_O2STANDARD
\ No newline at end of file
+ nitrogen = MOLES_N2STANDARD + MOLES_O2STANDARD
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 7f4ac1704d9..4d7c8ccd5da 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -140,7 +140,7 @@
if(!devastated)
playsound(src, 'sound/items/Welder.ogg', 100, 1)
new /obj/structure/girder(src)
- if (mineral == "metal")
+ if(mineral == "metal")
new /obj/item/stack/sheet/metal( src )
new /obj/item/stack/sheet/metal( src )
else
@@ -148,7 +148,7 @@
new M( src )
new M( src )
else
- if (mineral == "metal")
+ if(mineral == "metal")
new /obj/item/stack/sheet/metal( src )
new /obj/item/stack/sheet/metal( src )
new /obj/item/stack/sheet/metal( src )
@@ -258,8 +258,8 @@
/turf/simulated/wall/attack_hand(mob/user as mob)
user.changeNext_move(CLICK_CD_MELEE)
- if (HULK in user.mutations)
- if (prob(hardness) || rotting)
+ if(HULK in user.mutations)
+ if(prob(hardness) || rotting)
playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
to_chat(user, text("You smash through the wall. "))
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
@@ -287,7 +287,7 @@
/turf/simulated/wall/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
user.changeNext_move(CLICK_CD_MELEE)
- if (!user.IsAdvancedToolUser())
+ if(!user.IsAdvancedToolUser())
to_chat(user, "You don't have the dexterity to do this! ")
return
@@ -376,7 +376,7 @@
visible_message("[user] slices apart \the [src]! ","You hear metal being sliced apart. ")
//DRILLING
- else if (istype(W, /obj/item/weapon/pickaxe/drill/diamonddrill))
+ else if(istype(W, /obj/item/weapon/pickaxe/drill/diamonddrill))
to_chat(user, "You begin to drill though the wall. ")
@@ -385,7 +385,7 @@
dismantle_wall()
visible_message("[user] drills through \the [src]! ","You hear the grinding of metal. ")
- else if (istype(W, /obj/item/weapon/pickaxe/drill/jackhammer))
+ else if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer))
to_chat(user, "You begin to disintegrates the wall. ")
diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm
index 8a36ea5af6b..d4f0767d755 100644
--- a/code/game/turfs/simulated/walls_mineral.dm
+++ b/code/game/turfs/simulated/walls_mineral.dm
@@ -134,7 +134,7 @@
/*
/turf/simulated/wall/mineral/proc/shock()
- if (electrocute_mob(user, C, src))
+ if(electrocute_mob(user, C, src))
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm
index 1d792647042..27154fd00fb 100644
--- a/code/game/turfs/simulated/walls_reinforced.dm
+++ b/code/game/turfs/simulated/walls_reinforced.dm
@@ -15,7 +15,7 @@
/turf/simulated/wall/r_wall/attackby(obj/item/W as obj, mob/user as mob, params)
user.changeNext_move(CLICK_CD_MELEE)
- if (!user.IsAdvancedToolUser())
+ if(!user.IsAdvancedToolUser())
to_chat(user, "You don't have the dexterity to do this! ")
return
@@ -90,7 +90,7 @@
return
if(1)
- if (istype(W, /obj/item/weapon/screwdriver))
+ if(istype(W, /obj/item/weapon/screwdriver))
to_chat(user, "You begin removing the support lines. ")
playsound(src, 'sound/items/Screwdriver.ogg', 100, 1)
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index efe3bdb6e55..48f892caff0 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -116,9 +116,9 @@
A.z = target_z
A.x = world.maxx - 2
spawn (0)
- if ((A && A.loc))
+ if((A && A.loc))
A.loc.Entered(A)
- else if (src.x >= world.maxx)
+ else if(src.x >= world.maxx)
if(istype(A, /obj/effect/meteor))
qdel(A)
return
@@ -141,9 +141,9 @@
A.z = target_z
A.x = 3
spawn (0)
- if ((A && A.loc))
+ if((A && A.loc))
A.loc.Entered(A)
- else if (src.y <= 1)
+ else if(src.y <= 1)
if(istype(A, /obj/effect/meteor))
qdel(A)
return
@@ -165,10 +165,10 @@
A.z = target_z
A.y = world.maxy - 2
spawn (0)
- if ((A && A.loc))
+ if((A && A.loc))
A.loc.Entered(A)
- else if (src.y >= world.maxy)
+ else if(src.y >= world.maxy)
if(istype(A, /obj/effect/meteor)||istype(A, /obj/effect/space_dust))
qdel(A)
return
@@ -190,7 +190,7 @@
A.z = target_z
A.y = 3
spawn (0)
- if ((A && A.loc))
+ if((A && A.loc))
A.loc.Entered(A)
return
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 8541a638040..d76791e7f97 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -86,7 +86,7 @@
return 0
/turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area)
- if (!mover)
+ if(!mover)
return 1
@@ -109,7 +109,7 @@
large_dense += border_obstacle
//Then, check the turf itself
- if (!src.CanPass(mover, src))
+ if(!src.CanPass(mover, src))
mover.Bump(src, 1)
return 0
@@ -156,9 +156,11 @@
qdel(L)
//Creates a new turf
-/turf/proc/ChangeTurf(var/path)
- if(!path) return
- if(path == type) return src
+/turf/proc/ChangeTurf(path, defer_change = FALSE, keep_icon = TRUE)
+ if(!path)
+ return
+ if(!use_preloader && path == type) // Don't no-op if the map loader requires it to be reconstructed
+ return src
var/old_opacity = opacity
var/old_dynamic_lighting = dynamic_lighting
var/list/old_affecting_lights = affecting_lights
@@ -167,12 +169,10 @@
if(air_master)
air_master.remove_from_active(src)
-
var/turf/W = new path(src)
+ if(!defer_change)
+ W.AfterChange()
- if(istype(W, /turf/simulated))
- W:Assimilate_Air()
- W.RemoveLattice()
W.blueprint_data = old_blueprint_data
for(var/turf/space/S in range(W,1))
@@ -189,13 +189,22 @@
else
lighting_clear_overlays()
- W.levelupdate()
- W.CalculateAdjacentTurfs()
+ return W
- if(!can_have_cabling())
+// I'm including `ignore_air` because BYOND lacks positional-only arguments
+/turf/proc/AfterChange(ignore_air, keep_cabling = FALSE) //called after a turf has been replaced in ChangeTurf()
+ levelupdate()
+ CalculateAdjacentTurfs()
+
+ if(!keep_cabling && !can_have_cabling())
for(var/obj/structure/cable/C in contents)
qdel(C)
- return W
+
+/turf/simulated/AfterChange(ignore_air, keep_cabling = FALSE)
+ ..()
+ RemoveLattice()
+ if(!ignore_air)
+ Assimilate_Air()
//////Assimilate Air//////
/turf/simulated/proc/Assimilate_Air()
@@ -404,4 +413,4 @@
/turf/proc/add_blueprints_preround(atom/movable/AM)
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
- add_blueprints(AM)
\ No newline at end of file
+ add_blueprints(AM)
diff --git a/code/game/turfs/unsimulated/beach.dm b/code/game/turfs/unsimulated/beach.dm
index 89881767844..970467c2ced 100644
--- a/code/game/turfs/unsimulated/beach.dm
+++ b/code/game/turfs/unsimulated/beach.dm
@@ -68,6 +68,7 @@
icon = 'icons/turf/floors/seadrop-o.dmi'
layer = MOB_LAYER + 0.1
smooth = SMOOTH_TRUE
+ anchored = 1
canSmoothWith = list(
/turf/unsimulated/beach/water/drop, /turf/unsimulated/beach/water/drop/dense,
/turf/unsimulated/beach/water, /turf/unsimulated/beach/water/dense,
diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm
index f63535fb082..8df18294f04 100644
--- a/code/game/turfs/unsimulated/floor.dm
+++ b/code/game/turfs/unsimulated/floor.dm
@@ -4,6 +4,7 @@
icon_state = "Floor3"
/turf/unsimulated/floor/grass
+ name = "grass patch"
icon_state = "grass1"
/turf/unsimulated/floor/grass/New()
@@ -16,18 +17,44 @@
icon_state = "snow"
/turf/unsimulated/floor/chasm
- name = "sinkhole"
+ name = "chasm"
desc = "It's difficult to see the bottom."
- density = 1
+ density = 0
icon = 'icons/turf/floors/Chasms.dmi'
icon_state = "Fill"
- smooth = SMOOTH_TRUE
- canSmoothWith = null
+ smooth = SMOOTH_MORE
+ canSmoothWith = list(/turf/unsimulated/floor/chasm)
-/turf/unsimulated/floor/chasm/New()
- spawn(1)
- smooth_icon(src)
- smooth_icon_neighbors(src)
+/turf/unsimulated/floor/chasm/Entered(mob/living/M, atom/OL, ignoreRest = 0)
+ // "fall" south
+ if(istype(M))
+ spawn(1)
+ if(step(M, SOUTH))
+ M.emote("scream")
+
+/turf/unsimulated/floor/chasm/dense
+ density = 1
+
+/turf/unsimulated/floor/lava
+ name = "lava"
+ desc = "That looks... a bit dangerous"
+ icon = 'icons/turf/floors/lava.dmi'
+ icon_state = "smooth"
+ smooth = SMOOTH_MORE
+ canSmoothWith = list(/turf/unsimulated/floor/lava)
+ var/lava_damage = 250
+ var/lava_fire = 20
+ light_range = 2
+ light_color = "#FFC040"
+
+/turf/unsimulated/floor/lava/Entered(mob/living/M, atom/OL, ignoreRest = 0)
+ if(istype(M))
+ M.apply_damage(lava_damage, BURN)
+ M.adjust_fire_stacks(lava_fire)
+ M.IgniteMob()
+
+/turf/unsimulated/floor/lava/dense
+ density = 1
/turf/unsimulated/floor/abductor
name = "alien floor"
@@ -40,4 +67,24 @@
/turf/unsimulated/floor/vox
icon_state = "dark"
nitrogen = 100
- oxygen = 0
\ No newline at end of file
+ oxygen = 0
+
+/turf/unsimulated/floor/carpet
+ name = "Carpet"
+ icon = 'icons/turf/floors/carpet.dmi'
+ icon_state = "carpet"
+ smooth = SMOOTH_TRUE
+ canSmoothWith = null
+
+ footstep_sounds = list(
+ "human" = list('sound/effects/footstep/carpet_human.ogg'),
+ "xeno" = list('sound/effects/footstep/carpet_xeno.ogg')
+ )
+
+/turf/unsimulated/floor/wood
+ icon_state = "wood"
+
+ footstep_sounds = list(
+ "human" = list('sound/effects/footstep/wood_all.ogg'), //@RonaldVanWonderen of Freesound.org
+ "xeno" = list('sound/effects/footstep/wood_all.ogg') //@RonaldVanWonderen of Freesound.org
+ )
diff --git a/code/game/turfs/unsimulated/walls.dm b/code/game/turfs/unsimulated/walls.dm
index 571983f0966..42a8b133a24 100644
--- a/code/game/turfs/unsimulated/walls.dm
+++ b/code/game/turfs/unsimulated/walls.dm
@@ -25,6 +25,11 @@ turf/unsimulated/wall/splashscreen
/turf/unsimulated/wall/other
icon_state = "r_wall"
+/turf/unsimulated/wall/metal
+ icon = 'icons/turf/walls/wall.dmi'
+ icon_state = "wall"
+ smooth = SMOOTH_TRUE
+
/turf/unsimulated/wall/abductor
icon_state = "alien1"
explosion_block = 50
\ No newline at end of file
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 48bb773c453..e5f02a0a45a 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -63,7 +63,8 @@ var/global/admin_ooc_colour = "#b82e00"
var/display_name = src.key
if(prefs.unlock_content)
if(prefs.toggles & MEMBER_PUBLIC)
- display_name = " [display_name]"
+ var/icon/byond = icon('icons/member_content.dmi', "blag")
+ display_name = "[bicon(byond)][display_name]"
if(holder)
if(holder.fakekey)
if(C.holder)
@@ -74,7 +75,7 @@ var/global/admin_ooc_colour = "#b82e00"
/proc/toggle_ooc()
config.ooc_allowed = ( !config.ooc_allowed )
- if (config.ooc_allowed)
+ if(config.ooc_allowed)
to_chat(world, "The OOC channel has been globally enabled! ")
else
to_chat(world, "The OOC channel has been globally disabled! ")
diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm
index 857fcadb48a..afc8db25b65 100644
--- a/code/game/verbs/suicide.dm
+++ b/code/game/verbs/suicide.dm
@@ -52,11 +52,11 @@
/mob/living/carbon/human/verb/suicide()
set hidden = 1
- if (stat == DEAD)
+ if(stat == DEAD)
to_chat(src, "You're already dead!")
return
- if (!ticker)
+ if(!ticker)
to_chat(src, "You can't commit suicide before the game starts!")
return
@@ -65,7 +65,7 @@
to_chat(src, "You try to bring yourself to commit suicide, but - something prevents you!")
return
- if (suiciding)
+ if(suiciding)
to_chat(src, "You're already committing suicide! Be patient!")
return
@@ -88,15 +88,15 @@
/mob/living/carbon/brain/verb/suicide()
set hidden = 1
- if (stat == 2)
+ if(stat == 2)
to_chat(src, "You're already dead!")
return
- if (!ticker)
+ if(!ticker)
to_chat(src, "You can't commit suicide before the game starts!")
return
- if (suiciding)
+ if(suiciding)
to_chat(src, "You're already committing suicide! Be patient!")
return
@@ -113,11 +113,11 @@
/mob/living/silicon/ai/verb/suicide()
set hidden = 1
- if (stat == 2)
+ if(stat == 2)
to_chat(src, "You're already dead!")
return
- if (suiciding)
+ if(suiciding)
to_chat(src, "You're already committing suicide! Be patient!")
return
@@ -133,11 +133,11 @@
/mob/living/silicon/robot/verb/suicide()
set hidden = 1
- if (stat == 2)
+ if(stat == 2)
to_chat(src, "You're already dead!")
return
- if (suiciding)
+ if(suiciding)
to_chat(src, "You're already committing suicide! Be patient!")
return
@@ -161,7 +161,7 @@
var/obj/item/device/paicard/card = loc
card.removePersonality()
var/turf/T = get_turf_or_move(card.loc)
- for (var/mob/M in viewers(T))
+ for(var/mob/M in viewers(T))
M.show_message("\blue [src] flashes a message across its screen, \"Wiping core files. Please acquire a new personality to continue using pAI device functions.\"", 3, "\blue [src] bleeps electronically.", 2)
death(0, 1)
else
@@ -170,11 +170,11 @@
/mob/living/carbon/alien/humanoid/verb/suicide()
set hidden = 1
- if (stat == 2)
+ if(stat == 2)
to_chat(src, "You're already dead!")
return
- if (suiciding)
+ if(suiciding)
to_chat(src, "You're already committing suicide! Be patient!")
return
@@ -190,11 +190,11 @@
/mob/living/carbon/slime/verb/suicide()
set hidden = 1
- if (stat == 2)
+ if(stat == 2)
to_chat(src, "You're already dead!")
return
- if (suiciding)
+ if(suiciding)
to_chat(src, "You're already committing suicide! Be patient!")
return
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index 3be9262d1ad..4e822710cd0 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -27,7 +27,7 @@
entry += " - Observing "
else
entry += " - DEAD "
- else if (istype(C.mob, /mob/new_player))
+ else if(istype(C.mob, /mob/new_player))
entry += " - New Player "
else
entry += " - DEAD "
@@ -122,7 +122,7 @@
if(!C.holder.fakekey)
msg += "\t[C] is a [C.holder.rank]\n"
num_admins_online++
- else if (check_rights(R_MOD|R_MENTOR, 0, C.mob) && !check_rights(R_ADMIN, 0, C.mob))
+ else if(check_rights(R_MOD|R_MENTOR, 0, C.mob) && !check_rights(R_ADMIN, 0, C.mob))
modmsg += "\t[C] is a [C.holder.rank]\n"
num_mods_online++
diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm
index 1c5365a6b96..3027864ace6 100644
--- a/code/modules/admin/DB ban/functions.dm
+++ b/code/modules/admin/DB ban/functions.dm
@@ -17,6 +17,7 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration =
var/kickbannedckey //Defines whether this proc should kick the banned person, if they are connected (if banned_mob is defined).
//some ban types kick players after this proc passes (tempban, permaban), but some are specific to db_ban, so
//they should kick within this proc.
+ var/isjobban // For job bans, which need to be inserted into the job ban lists
switch(bantype)
if(BANTYPE_PERMA)
bantype_str = "PERMABAN"
@@ -31,9 +32,11 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration =
bantype_str = "JOB_PERMABAN"
duration = -1
bantype_pass = 1
+ isjobban = 1
if(BANTYPE_JOB_TEMP)
bantype_str = "JOB_TEMPBAN"
bantype_pass = 1
+ isjobban = 1
if(BANTYPE_APPEARANCE)
bantype_str = "APPEARANCE_BAN"
duration = -1
@@ -134,11 +137,15 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration =
if(banned_mob && banned_mob.client && banned_mob.client.ckey == banckey)
del(banned_mob.client)
+ if(isjobban)
+ jobban_client_fullban(ckey, job)
+
datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "")
if(!check_rights(R_BAN)) return
var/bantype_str
+ var/isjobban // For job bans, which need to be removed from the job ban lists
if(bantype)
var/bantype_pass = 0
switch(bantype)
@@ -151,9 +158,11 @@ datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "")
if(BANTYPE_JOB_PERMA)
bantype_str = "JOB_PERMABAN"
bantype_pass = 1
+ isjobban = 1
if(BANTYPE_JOB_TEMP)
bantype_str = "JOB_TEMPBAN"
bantype_pass = 1
+ isjobban = 1
if(BANTYPE_APPEARANCE)
bantype_str = "APPEARANCE_BAN"
bantype_pass = 1
@@ -206,6 +215,8 @@ datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "")
return
DB_ban_unban_by_id(ban_id)
+ if(isjobban)
+ jobban_unban_client(ckey, job)
datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null)
@@ -215,18 +226,20 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null)
to_chat(usr, "Cancelled")
return
- var/DBQuery/query = dbcon.NewQuery("SELECT ckey, duration, reason FROM [format_table_name("ban")] WHERE id = [banid]")
+ var/DBQuery/query = dbcon.NewQuery("SELECT ckey, duration, reason, job FROM [format_table_name("ban")] WHERE id = [banid]")
query.Execute()
var/eckey = usr.ckey //Editing admin ckey
var/pckey //(banned) Player ckey
var/duration //Old duration
var/reason //Old reason
+ var/job //Old job
if(query.NextRow())
pckey = query.item[1]
duration = query.item[2]
reason = query.item[3]
+ job = query.item[4]
else
to_chat(usr, "Invalid ban id. Contact the database admin")
return
@@ -259,6 +272,8 @@ datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null)
if("unban")
if(alert("Unban [pckey]?", "Unban?", "Yes", "No") == "Yes")
DB_ban_unban_by_id(banid)
+ if(job && length(job))
+ jobban_unban_client(pckey, job)
return
else
to_chat(usr, "Cancelled")
@@ -396,7 +411,6 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
output += " "
output += " Match(min. 3 characters to search by key or ip, and 7 to search by cid) "
output += ""
- output += "Please note that all jobban bans or unbans are in-effect the following round. "
output += "This search shows only last 100 bans."
if(adminckey || playerckey || playerip || playercid || dbbantype)
diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm
index c8ae67d4cab..3d7b11390eb 100644
--- a/code/modules/admin/IsBanned.dm
+++ b/code/modules/admin/IsBanned.dm
@@ -1,10 +1,10 @@
//Blocks an attempt to connect before even creating our client datum thing.
world/IsBanned(key,address,computer_id)
- if (!key || !address || !computer_id)
+ if(!key || !address || !computer_id)
log_access("Failed Login (invalid data): [key] [address]-[computer_id]")
return list("reason"="invalid login data", "desc"="Error: Could not check ban status, please try again. Error message: Your computer provided invalid or blank information to the server on connection (BYOND Username, IP, and Computer ID). Provided information for reference: Username: '[key]' IP: '[address]' Computer ID: '[computer_id]'. If you continue to get this error, please restart byond or contact byond support.")
- if (text2num(computer_id) == 2147483647) //this cid causes stickybans to go haywire
+ if(text2num(computer_id) == 2147483647) //this cid causes stickybans to go haywire
log_access("Failed Login (invalid cid): [key] [address]-[computer_id]")
return list("reason"="invalid login data", "desc"="Error: Could not check ban status, Please try again. Error message: Your computer provided an invalid Computer ID.")
var/admin = 0
@@ -34,7 +34,7 @@ world/IsBanned(key,address,computer_id)
//Ban Checking
. = CheckBan(ckey(key), computer_id, address)
if(.)
- if (admin)
+ if(admin)
log_admin("The admin [key] has been allowed to bypass a matching ban on [.["key"]]")
message_admins("The admin [key] has been allowed to bypass a matching ban on [.["key"]] ")
addclientmessage(ckey,"You have been allowed to bypass a matching ban on [.["key"]]. ")
@@ -71,13 +71,13 @@ world/IsBanned(key,address,computer_id)
var/duration = query.item[7]
var/bantime = query.item[8]
var/bantype = query.item[9]
- if (bantype == "ADMIN_PERMABAN" || bantype == "ADMIN_TEMPBAN")
+ if(bantype == "ADMIN_PERMABAN" || bantype == "ADMIN_TEMPBAN")
//admin bans MUST match on ckey to prevent cid-spoofing attacks
// as well as dynamic ip abuse
- if (pckey != ckey)
+ if(pckey != ckey)
continue
- if (admin)
- if (bantype == "ADMIN_PERMABAN" || bantype == "ADMIN_TEMPBAN")
+ if(admin)
+ if(bantype == "ADMIN_PERMABAN" || bantype == "ADMIN_TEMPBAN")
log_admin("The admin [key] is admin banned, and has been disallowed access")
message_admins("The admin [key] is admin banned, and has been disallowed access ")
else
@@ -102,11 +102,11 @@ world/IsBanned(key,address,computer_id)
return .
. = ..() //default pager ban stuff
- if (.)
+ if(.)
//byond will not trigger isbanned() for "global" host bans,
//ie, ones where the "apply to this game only" checkbox is not checked (defaults to not checked)
//So it's safe to let admins walk thru host/sticky bans here
- if (admin)
+ if(admin)
log_admin("The admin [key] has been allowed to bypass a matching host/sticky ban")
message_admins("The admin [key] has been allowed to bypass a matching host/sticky ban ")
addclientmessage(ckey,"You have been allowed to bypass a matching host/sticky ban. ")
diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm
index 64e6ad6dec4..172e826a0bb 100644
--- a/code/modules/admin/NewBan.dm
+++ b/code/modules/admin/NewBan.dm
@@ -15,8 +15,8 @@ var/savefile/Banlist
Banlist.cd = "/base"
if( "[ckey][id]" in Banlist.dir )
Banlist.cd = "[ckey][id]"
- if (Banlist["temp"])
- if (!GetExp(Banlist["minutes"]))
+ if(Banlist["temp"])
+ if(!GetExp(Banlist["minutes"]))
ClearTempbans()
return 0
else
@@ -27,7 +27,7 @@ var/savefile/Banlist
.["reason"] = "ckey/id"
return .
else
- for (var/A in Banlist.dir)
+ for(var/A in Banlist.dir)
Banlist.cd = "/base/[A]"
var/matches
if( ckey == Banlist["key"] )
@@ -43,7 +43,7 @@ var/savefile/Banlist
if(matches)
if(Banlist["temp"])
- if (!GetExp(Banlist["minutes"]))
+ if(!GetExp(Banlist["minutes"]))
ClearTempbans()
return 0
else
@@ -66,13 +66,13 @@ var/savefile/Banlist
Banlist = new("data/banlist.bdb")
log_admin("Loading Banlist")
- if (!length(Banlist.dir)) log_admin("Banlist is empty.")
+ if(!length(Banlist.dir)) log_admin("Banlist is empty.")
- if (!Banlist.dir.Find("base"))
+ if(!Banlist.dir.Find("base"))
log_admin("Banlist missing base dir.")
Banlist.dir.Add("base")
Banlist.cd = "/base"
- else if (Banlist.dir.Find("base"))
+ else if(Banlist.dir.Find("base"))
Banlist.cd = "/base"
ClearTempbans()
@@ -82,16 +82,16 @@ var/savefile/Banlist
UpdateTime()
Banlist.cd = "/base"
- for (var/A in Banlist.dir)
+ for(var/A in Banlist.dir)
Banlist.cd = "/base/[A]"
- if (!Banlist["key"] || !Banlist["id"])
+ if(!Banlist["key"] || !Banlist["id"])
RemoveBan(A)
log_admin("Invalid Ban.")
message_admins("Invalid Ban.")
continue
- if (!Banlist["temp"]) continue
- if (CMinutes >= Banlist["minutes"]) RemoveBan(A)
+ if(!Banlist["temp"]) continue
+ if(CMinutes >= Banlist["minutes"]) RemoveBan(A)
return 1
@@ -100,25 +100,25 @@ var/savefile/Banlist
var/bantimestamp
- if (temp)
+ if(temp)
UpdateTime()
bantimestamp = CMinutes + minutes
Banlist.cd = "/base"
- if ( Banlist.dir.Find("[ckey][computerid]") )
- to_chat(usr, text("\red Ban already exists."))
+ if( Banlist.dir.Find("[ckey][computerid]") )
+ to_chat(usr, "Ban already exists. ")
return 0
else
Banlist.dir.Add("[ckey][computerid]")
Banlist.cd = "/base/[ckey][computerid]"
- to_chat(Banlist["key"], ckey)
- to_chat(Banlist["id"], computerid)
- to_chat(Banlist["ip"], address)
- to_chat(Banlist["reason"], reason)
- to_chat(Banlist["bannedby"], bannedby)
- to_chat(Banlist["temp"], temp)
- if (temp)
- to_chat(Banlist["minutes"], bantimestamp)
+ Banlist["key"] << ckey
+ Banlist["id"] << computerid
+ Banlist["ip"] << address
+ Banlist["reason"] << reason
+ Banlist["bannedby"] << bannedby
+ Banlist["temp"] << temp
+ if(temp)
+ Banlist["minutes"] << bantimestamp
if(!temp)
add_note(ckey, "Permanently banned - [reason]", null, bannedby, 0)
else
@@ -134,7 +134,7 @@ var/savefile/Banlist
Banlist["id"] >> id
Banlist.cd = "/base"
- if (!Banlist.dir.Remove(foldername)) return 0
+ if(!Banlist.dir.Remove(foldername)) return 0
if(!usr)
log_admin("Ban Expired: [key]")
@@ -145,9 +145,9 @@ var/savefile/Banlist
message_admins("[key_name_admin(usr)] unbanned: [key]")
feedback_inc("ban_unban",1)
usr.client.holder.DB_ban_unban( ckey(key), BANTYPE_ANY_FULLBAN)
- for (var/A in Banlist.dir)
+ for(var/A in Banlist.dir)
Banlist.cd = "/base/[A]"
- if (key == Banlist["key"] /*|| id == Banlist["id"]*/)
+ if(key == Banlist["key"] /*|| id == Banlist["id"]*/)
Banlist.cd = "/base"
Banlist.dir.Remove(A)
continue
@@ -157,13 +157,13 @@ var/savefile/Banlist
/proc/GetExp(minutes as num)
UpdateTime()
var/exp = minutes - CMinutes
- if (exp <= 0)
+ if(exp <= 0)
return 0
else
var/timeleftstring
- if (exp >= 1440) //1440 = 1 day in minutes
+ if(exp >= 1440) //1440 = 1 day in minutes
timeleftstring = "[round(exp / 1440, 0.1)] Days"
- else if (exp >= 60) //60 = 1 hour in minutes
+ else if(exp >= 60) //60 = 1 hour in minutes
timeleftstring = "[round(exp / 60, 0.1)] Hours"
else
timeleftstring = "[exp] Minutes"
@@ -174,7 +174,7 @@ var/savefile/Banlist
var/dat
//var/dat = "Unban Player: \blue(U) = Unban , (E) = Edit Ban\green (Total"
Banlist.cd = "/base"
- for (var/A in Banlist.dir)
+ for(var/A in Banlist.dir)
count++
Banlist.cd = "/base/[A]"
var/ref = "\ref[src]"
@@ -211,23 +211,23 @@ var/savefile/Banlist
Banlist.cd = "/base"
Banlist.dir.Add("trash[i]trashid[i]")
Banlist.cd = "/base/trash[i]trashid[i]"
- to_chat(Banlist["key"], "trash[i]")
+ Banlist["key"] << "trash[i]"
else
Banlist.cd = "/base"
Banlist.dir.Add("[last]trashid[i]")
Banlist.cd = "/base/[last]trashid[i]"
- to_chat(Banlist["key"], last)
- to_chat(Banlist["id"], "trashid[i]")
- to_chat(Banlist["reason"], "Trashban[i].")
- to_chat(Banlist["temp"], a)
- to_chat(Banlist["minutes"], CMinutes + rand(1,2000))
- to_chat(Banlist["bannedby"], "trashmin")
+ Banlist["key"] << last
+ Banlist["id"] << "trashid[i]"
+ Banlist["reason"] << "Trashban[i]."
+ Banlist["temp"] << a
+ Banlist["minutes"] << CMinutes + rand(1,2000)
+ Banlist["bannedby"] << "trashmin"
last = "trash[i]"
Banlist.cd = "/base"
/proc/ClearAllBans()
Banlist.cd = "/base"
- for (var/A in Banlist.dir)
+ for(var/A in Banlist.dir)
RemoveBan(A)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 7e5edf7c8bb..233cc931831 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -8,8 +8,9 @@ var/global/nologevent = 0
msg = "ADMIN LOG: [msg] "
log_adminwarn(msg)
for(var/client/C in admins)
- if(R_SERVER & C.holder.rights)
- to_chat(C, msg)
+ if(R_ADMIN & C.holder.rights)
+ if(C.prefs && !(C.prefs.toggles & CHAT_NO_ADMINLOGS))
+ to_chat(C, msg)
/proc/msg_admin_attack(var/text) //Toggleable Attack Messages
log_attack(text)
@@ -103,7 +104,7 @@ var/global/nologevent = 0
Subtle message
"}
- if (M.client)
+ if(M.client)
if(!istype(M, /mob/new_player))
body += " "
body += "Transformation: "
@@ -191,7 +192,7 @@ var/global/nologevent = 0
Shade
"}
- if (M.client)
+ if(M.client)
body += {"
Other actions:
@@ -243,7 +244,7 @@ var/global/nologevent = 0
if(!check_rights(R_EVENT))
return
- if (!istype(src,/datum/admins))
+ if(!istype(src,/datum/admins))
src = usr.client.holder
var/dat
@@ -576,7 +577,7 @@ var/global/nologevent = 0
return
config.looc_allowed = !(config.looc_allowed)
- if (config.looc_allowed)
+ if(config.looc_allowed)
to_chat(world, "The LOOC channel has been globally enabled! ")
else
to_chat(world, "The LOOC channel has been globally disabled! ")
@@ -592,7 +593,7 @@ var/global/nologevent = 0
return
config.dsay_allowed = !(config.dsay_allowed)
- if (config.dsay_allowed)
+ if(config.dsay_allowed)
to_chat(world, "Deadchat has been globally enabled! ")
else
to_chat(world, "Deadchat has been globally disabled! ")
@@ -643,7 +644,7 @@ var/global/nologevent = 0
return
enter_allowed = !( enter_allowed )
- if (!( enter_allowed ))
+ if(!( enter_allowed ))
to_chat(world, "New players may no longer enter the game. ")
else
to_chat(world, "New players may now enter the game. ")
@@ -661,7 +662,7 @@ var/global/nologevent = 0
return
config.allow_ai = !( config.allow_ai )
- if (!( config.allow_ai ))
+ if(!( config.allow_ai ))
to_chat(world, "The AI job is no longer chooseable. ")
else
to_chat(world, "The AI job is chooseable now. ")
@@ -679,7 +680,7 @@ var/global/nologevent = 0
return
abandon_allowed = !( abandon_allowed )
- if (abandon_allowed)
+ if(abandon_allowed)
to_chat(world, "You may now respawn. ")
else
to_chat(world, "You may no longer respawn :( ")
@@ -709,13 +710,13 @@ var/global/nologevent = 0
if(!check_rights(R_SERVER))
return
- if (!ticker || ticker.current_state != GAME_STATE_PREGAME)
+ if(!ticker || ticker.current_state != GAME_STATE_PREGAME)
ticker.delay_end = !ticker.delay_end
log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].")
message_admins("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1)
return //alert("Round end delayed", null, null, null, null, null)
going = !( going )
- if (!( going ))
+ if(!( going ))
to_chat(world, "The game start has been delayed. ")
log_admin("[key_name(usr)] delayed the game.")
else
@@ -728,34 +729,34 @@ var/global/nologevent = 0
/proc/is_special_character(mob/M as mob) // returns 1 for specail characters and 2 for heroes of gamemode
if(!ticker || !ticker.mode)
return 0
- if (!istype(M))
+ if(!istype(M))
return 0
if((M.mind in ticker.mode.head_revolutionaries) || (M.mind in ticker.mode.revolutionaries))
- if (ticker.mode.config_tag == "revolution")
+ if(ticker.mode.config_tag == "revolution")
return 2
return 1
if(M.mind in ticker.mode.cult)
- if (ticker.mode.config_tag == "cult")
+ if(ticker.mode.config_tag == "cult")
return 2
return 1
if(M.mind in ticker.mode.malf_ai)
- if (ticker.mode.config_tag == "malfunction")
+ if(ticker.mode.config_tag == "malfunction")
return 2
return 1
if(M.mind in ticker.mode.syndicates)
- if (ticker.mode.config_tag == "nuclear")
+ if(ticker.mode.config_tag == "nuclear")
return 2
return 1
if(M.mind in ticker.mode.wizards)
- if (ticker.mode.config_tag == "wizard")
+ if(ticker.mode.config_tag == "wizard")
return 2
return 1
if(M.mind in ticker.mode.changelings)
- if (ticker.mode.config_tag == "changeling")
+ if(ticker.mode.config_tag == "changeling")
return 2
return 1
if(M.mind in ticker.mode.abductors)
- if (ticker.mode.config_tag == "abduction")
+ if(ticker.mode.config_tag == "abduction")
return 2
return 1
if(isrobot(M))
@@ -829,7 +830,7 @@ var/global/nologevent = 0
return
guests_allowed = !( guests_allowed )
- if (!( guests_allowed ))
+ if(!( guests_allowed ))
to_chat(world, "Guests may no longer enter the game. ")
else
to_chat(world, "Guests may now enter the game. ")
@@ -846,7 +847,7 @@ var/global/nologevent = 0
else if(isrobot(S))
var/mob/living/silicon/robot/R = S
to_chat(usr, "CYBORG [key_name(S, usr)]'s [R.connected_ai?"(Slaved to: [R.connected_ai])":"(Independent)"] laws: ")
- else if (ispAI(S))
+ else if(ispAI(S))
var/mob/living/silicon/pai/P = S
to_chat(usr, "pAI [key_name(S, usr)]'s laws: ")
to_chat(usr, "[P.pai_law0]")
@@ -856,7 +857,7 @@ var/global/nologevent = 0
else
to_chat(usr, "SILICON [key_name(S, usr)]'s laws: ")
- if (S.laws == null)
+ if(S.laws == null)
to_chat(usr, "[key_name(S, usr)]'s laws are null. Contact a coder.")
else
S.laws.show_laws(usr)
@@ -888,7 +889,7 @@ var/gamma_ship_location = 1 // 0 = station , 1 = space
/proc/move_gamma_ship()
var/area/fromArea
var/area/toArea
- if (gamma_ship_location == 1)
+ if(gamma_ship_location == 1)
fromArea = locate(/area/shuttle/gamma/space)
toArea = locate(/area/shuttle/gamma/station)
else
@@ -905,7 +906,7 @@ var/gamma_ship_location = 1 // 0 = station , 1 = space
for(var/obj/machinery/alarm/A in toArea)
A.first_run()
- if (gamma_ship_location)
+ if(gamma_ship_location)
gamma_ship_location = 0
else
gamma_ship_location = 1
@@ -955,18 +956,18 @@ var/gamma_ship_location = 1 // 0 = station , 1 = space
return //extra sanity check to make sure only observers are shoved into things
//same as assume-direct-control perm requirements.
- if (!check_rights(R_VAREDIT,0)) //no varedit, check if they have r_admin and r_debug
+ if(!check_rights(R_VAREDIT,0)) //no varedit, check if they have r_admin and r_debug
if(!check_rights(R_ADMIN|R_DEBUG,0)) //if they don't have r_admin and r_debug, return
return 0 //otherwise, if they have no varedit, but do have r_admin and r_debug, execute the rest of the code
- if (!frommob.ckey)
+ if(!frommob.ckey)
return 0
if(istype(tothing, /obj/item))
var/mob/living/toitem = tothing
var/ask = alert("Are you sure you want to allow [frommob.name]([frommob.key]) to possess [toitem.name]?", "Place ghost in control of item?", "Yes", "No")
- if (ask != "Yes")
+ if(ask != "Yes")
return 1
if(!frommob || !toitem) //make sure the mobs don't go away while we waited for a response
@@ -986,12 +987,12 @@ var/gamma_ship_location = 1 // 0 = station , 1 = space
var/mob/living/tomob = tothing
var/question = ""
- if (tomob.ckey)
+ if(tomob.ckey)
question = "This mob already has a user ([tomob.key]) in control of it! "
question += "Are you sure you want to place [frommob.name]([frommob.key]) in control of [tomob.name]?"
var/ask = alert(question, "Place ghost in control of mob?", "Yes", "No")
- if (ask != "Yes")
+ if(ask != "Yes")
return 1
if(!frommob || !tomob) //make sure the mobs don't go away while we waited for a response
diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm
index 7f709f431ba..3eb12b11e68 100644
--- a/code/modules/admin/admin_investigate.dm
+++ b/code/modules/admin/admin_investigate.dm
@@ -23,20 +23,20 @@
if(!message) return
var/F = investigate_subject2file(subject)
if(!F) return
- to_chat(F, "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message] ")
+ investigate_log_subjects |= subject
+ F << "[time_stamp()] \ref[src] ([x],[y],[z]) || [src] [message] "
//ADMINVERBS
-/client/proc/investigate_show( subject in list("hrefs","notes","pda","singulo","atmos","watchlist","ntsl","gold core","cult", "experimentor", "wires") )
+/client/proc/investigate_show( subject in investigate_log_subjects )
set name = "Investigate"
set category = "Admin"
if(!holder) return
switch(subject)
- if("singulo") //general one-round-only stuff
- var/F = investigate_subject2file(subject)
- if(!F)
- to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed. ")
- return
- src << browse(F,"window=investigate[subject];size=800x300")
+ if("notes")
+ show_note()
+
+ if("watchlist")
+ watchlist_show()
if("hrefs") //persistant logs and stuff
if(config && config.log_hrefs)
@@ -49,50 +49,9 @@
to_chat(src, "Error: admin_investigate: Href Logging is not on. ")
return
- if("pda") //general one-round-only stuff
+ else //general one-round-only stuff
var/F = investigate_subject2file(subject)
if(!F)
to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed. ")
return
src << browse(F,"window=investigate[subject];size=800x300")
-
- if("cult")
- var/F = investigate_subject2file(subject)
- if(!F)
- to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed. ")
- return
- src << browse(F,"window=investigate[subject];size=800x300")
-
- if("atmos")
- var/F = investigate_subject2file(subject)
- if(!F)
- to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed. ")
- return
- src << browse(F,"window=investigate[subject];size=800x300")
-
- if("ntsl")
- var/F = investigate_subject2file(subject)
- if(!F)
- to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed. ")
- return
- src << browse(F,"window=investigate[subject];size=800x300")
-
- if("experimentor")
- var/F = investigate_subject2file(subject)
- if(!F)
- to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed. ")
- return
- src << browse(F,"window=investigate[subject];size=800x300")
-
- if("wires")
- var/F = investigate_subject2file(subject)
- if(!F)
- to_chat(src, "Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed. ")
- return
- src << browse(F,"window=investigate[subject];size=800x300")
-
- if("watchlist")
- watchlist_show()
-
- if("notes")
- show_note()
\ No newline at end of file
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 92eafe2c245..f96a4833ef6 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -56,6 +56,7 @@ var/list/admin_verbs_admin = list(
/datum/admins/proc/show_player_notes,
/client/proc/free_slot, /*frees slot for chosen job*/
/client/proc/toggleattacklogs,
+ /client/proc/toggleadminlogs,
/client/proc/toggledebuglogs,
/client/proc/update_mob_sprite,
/client/proc/toggledrones,
@@ -72,7 +73,8 @@ var/list/admin_verbs_admin = list(
/client/proc/change_human_appearance_admin, /* Allows an admin to change the basic appearance of human-based mobs */
/client/proc/change_human_appearance_self, /* Allows the human-based mob itself change its basic appearance */
/client/proc/debug_variables,
- /client/proc/show_snpc_verbs
+ /client/proc/show_snpc_verbs,
+ /client/proc/reset_all_tcs /*resets all telecomms scripts*/
)
var/list/admin_verbs_ban = list(
/client/proc/unban_panel,
@@ -614,7 +616,7 @@ var/list/admin_verbs_snpc = list(
var/message = input("What do you want the message to be?", "Make Sound") as text|null
if(!message)
return
- for (var/mob/V in hearers(O))
+ for(var/mob/V in hearers(O))
V.show_message(message, 2)
log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z] make a sound")
message_admins("\blue [key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z] make a sound")
@@ -642,7 +644,7 @@ var/list/admin_verbs_snpc = list(
if(mob.control_object)
if(!msg)
return
- for (var/mob/V in hearers(mob.control_object))
+ for(var/mob/V in hearers(mob.control_object))
V.show_message("[mob.control_object.name] says: \"" + msg + "\"", 2)
log_admin("[key_name(usr)] used oSay on [mob.control_object]: [msg]")
message_admins("[key_name_admin(usr)] used oSay on [mob.control_object]: [msg]")
@@ -856,14 +858,14 @@ var/list/admin_verbs_snpc = list(
return
var/list/jobs = list()
- for (var/datum/job/J in job_master.occupations)
- if (J.current_positions >= J.total_positions && J.total_positions != -1)
+ for(var/datum/job/J in job_master.occupations)
+ if(J.current_positions >= J.total_positions && J.total_positions != -1)
jobs += J.title
- if (!jobs.len)
+ if(!jobs.len)
to_chat(usr, "There are no fully staffed jobs.")
return
var/job = input("Please select job slot to free", "Free Job Slot") as null|anything in jobs
- if (job)
+ if(job)
job_master.FreeRole(job)
log_admin("[key_name(usr)] has freed a job slot for [job].")
message_admins("[key_name_admin(usr)] has freed a job slot for [job].")
@@ -877,11 +879,25 @@ var/list/admin_verbs_snpc = list(
prefs.toggles ^= CHAT_ATTACKLOGS
prefs.save_preferences(src)
- if (prefs.toggles & CHAT_ATTACKLOGS)
+ if(prefs.toggles & CHAT_ATTACKLOGS)
to_chat(usr, "You now will get attack log messages")
else
to_chat(usr, "You now won't get attack log messages")
+/client/proc/toggleadminlogs()
+ set name = "Toggle Admin Log Messages"
+ set category = "Preferences"
+
+ if(!check_rights(R_ADMIN))
+ return
+
+ prefs.toggles ^= CHAT_NO_ADMINLOGS
+ prefs.save_preferences(src)
+ if(prefs.toggles & CHAT_NO_ADMINLOGS)
+ to_chat(usr, "You now won't get admin log messages.")
+ else
+ to_chat(usr, "You now will get admin log messages.")
+
/client/proc/toggledrones()
set name = "Toggle Maintenance Drones"
set category = "Server"
@@ -902,7 +918,7 @@ var/list/admin_verbs_snpc = list(
prefs.toggles ^= CHAT_DEBUGLOGS
prefs.save_preferences(src)
- if (prefs.toggles & CHAT_DEBUGLOGS)
+ if(prefs.toggles & CHAT_DEBUGLOGS)
to_chat(usr, "You now will get debug log messages")
else
to_chat(usr, "You now won't get debug log messages")
@@ -932,7 +948,7 @@ var/list/admin_verbs_snpc = list(
var/confirm = alert("Are you sure you want to send the global message?", "Confirm Man Up Global", "Yes", "No")
if(confirm == "Yes")
- for (var/mob/T as mob in mob_list)
+ for(var/mob/T as mob in mob_list)
to_chat(T, "Man up. Deal with it. Move on. ")
T << 'sound/voice/ManUp1.ogg'
diff --git a/code/modules/admin/banappearance.dm b/code/modules/admin/banappearance.dm
index 7244e1152af..b039f6bd634 100644
--- a/code/modules/admin/banappearance.dm
+++ b/code/modules/admin/banappearance.dm
@@ -4,12 +4,12 @@ var/appearanceban_runonce //Updates legacy bans with new info
var/appearance_keylist[0] //to store the keys
/proc/appearance_fullban(mob/M, reason)
- if (!M || !M.key) return
+ if(!M || !M.key) return
appearance_keylist.Add(text("[M.ckey] ## [reason]"))
appearance_savebanfile()
/proc/appearance_client_fullban(ckey)
- if (!ckey) return
+ if(!ckey) return
appearance_keylist.Add(text("[ckey]"))
appearance_savebanfile()
@@ -47,7 +47,7 @@ DEBUG
log_admin("Loading appearance_rank")
S["runonce"] >> appearanceban_runonce
- if (!length(appearance_keylist))
+ if(!length(appearance_keylist))
appearance_keylist=list()
log_admin("appearance_keylist was empty")
else
@@ -86,7 +86,7 @@ DEBUG
/proc/appearance_remove(X)
- for (var/i = 1; i <= length(appearance_keylist); i++)
+ for(var/i = 1; i <= length(appearance_keylist); i++)
if( findtext(appearance_keylist[i], "[X]") )
appearance_keylist.Remove(appearance_keylist[i])
appearance_savebanfile()
diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm
index 34365264674..1f385093683 100644
--- a/code/modules/admin/banjob.dm
+++ b/code/modules/admin/banjob.dm
@@ -1,38 +1,48 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
var/jobban_runonce // Updates legacy bans with new info
-var/jobban_keylist[0] //to store the keys & ranks
+var/jobban_keylist[0] // Linear list of jobban strings, kept around for the legacy system
+var/jobban_assoclist[0] // Associative list, for efficiency
+
+// Matches string-based jobbans into ckey, rank, and reason groups
+var/regex/jobban_regex = regex("(\[\\S]+) - (\[^#]+\[^# ])(?: ## (.+))?")
+
+/proc/jobban_assoc_insert(ckey, rank, reason)
+ if(!ckey || !rank)
+ return
+ if(!jobban_assoclist[ckey])
+ jobban_assoclist[ckey] = list()
+ jobban_assoclist[ckey][rank] = reason || "Reason Unspecified"
/proc/jobban_fullban(mob/M, rank, reason)
- if (!M || !M.key) return
+ if(!M || !M.key)
+ return
jobban_keylist.Add(text("[M.ckey] - [rank] ## [reason]"))
- jobban_savebanfile()
+ jobban_assoc_insert(M.ckey, rank, reason)
+ if(config.ban_legacy_system)
+ jobban_savebanfile()
/proc/jobban_client_fullban(ckey, rank)
- if (!ckey || !rank) return
+ if(!ckey || !rank)
+ return
jobban_keylist.Add(text("[ckey] - [rank]"))
- jobban_savebanfile()
+ jobban_assoc_insert(ckey, rank)
+ if(config.ban_legacy_system)
+ jobban_savebanfile()
//returns a reason if M is banned from rank, returns 0 otherwise
/proc/jobban_isbanned(mob/M, rank)
- if(M && rank)
+ if(!M || !rank)
+ return 0
- //if(_jobban_isbanned(M, rank)) return "Reason Unspecified" //for old jobban
- if (guest_jobbans(rank))
- if(config.guest_jobban && IsGuestKey(M.key))
- return "Guest Job-ban"
-// if(config.usewhitelist && !check_whitelist(M))
-// return "Karma Job"
+ if(config.guest_jobban && guest_jobbans(rank))
+ if(IsGuestKey(M.key))
+ return "Guest Job-ban"
- for (var/s in jobban_keylist)
- if( findtext(s,"[M.ckey] - [rank]") == 1 )
- var/startpos = findtext(s, "## ")+3
- if(startpos && startpos> jobban_runonce
- if (!length(jobban_keylist))
+ if(!length(jobban_keylist))
jobban_keylist=list()
log_admin("jobban_keylist was empty")
+
+ for(var/s in jobban_keylist)
+ if(jobban_regex.Find(s))
+ jobban_assoc_insert(jobban_regex.group[1], jobban_regex.group[2], jobban_regex.group[3])
+ else
+ log_debug("Skipping malformed job ban: [s]")
else
if(!establish_db_connection())
log_to_dd("Database connection failed. Reverting to the legacy ban system.")
@@ -71,42 +87,56 @@ DEBUG
return
//Job permabans
- var/DBQuery/query = dbcon.NewQuery("SELECT ckey, job FROM [format_table_name("ban")] WHERE bantype = 'JOB_PERMABAN' AND isnull(unbanned)")
- query.Execute()
+ var/DBQuery/permabans = dbcon.NewQuery("SELECT ckey, job FROM [format_table_name("ban")] WHERE bantype = 'JOB_PERMABAN' AND isnull(unbanned)")
+ permabans.Execute()
+ // Job tempbans
+ var/DBQuery/tempbans = dbcon.NewQuery("SELECT ckey, job FROM [format_table_name("ban")] WHERE bantype = 'JOB_TEMPBAN' AND isnull(unbanned) AND expiration_time > Now()")
+ tempbans.Execute()
- while(query.NextRow())
- var/ckey = query.item[1]
- var/job = query.item[2]
-
- jobban_keylist.Add("[ckey] - [job]")
-
- //Job tempbans
- var/DBQuery/query1 = dbcon.NewQuery("SELECT ckey, job FROM [format_table_name("ban")] WHERE bantype = 'JOB_TEMPBAN' AND isnull(unbanned) AND expiration_time > Now()")
- query1.Execute()
-
- while(query1.NextRow())
- var/ckey = query1.item[1]
- var/job = query1.item[2]
+ while(TRUE)
+ var/ckey
+ var/job
+ if(permabans.NextRow())
+ ckey = permabans.item[1]
+ job = permabans.item[2]
+ else if(tempbans.NextRow())
+ ckey = tempbans.item[1]
+ job = tempbans.item[2]
+ else
+ break
jobban_keylist.Add("[ckey] - [job]")
+ jobban_assoc_insert(ckey, job)
/proc/jobban_savebanfile()
var/savefile/S=new("data/job_full.ban")
- to_chat(S["keys[0]"], jobban_keylist)
+ S["keys[0]"] << jobban_keylist
/proc/jobban_unban(mob/M, rank)
jobban_remove("[M.ckey] - [rank]")
- jobban_savebanfile()
+/proc/jobban_unban_client(ckey, rank)
+ jobban_remove("[ckey] - [rank]")
/proc/ban_unban_log_save(var/formatted_log)
text2file(formatted_log,"data/ban_unban_log.txt")
/proc/jobban_remove(X)
- for (var/i = 1; i <= length(jobban_keylist); i++)
+ for(var/i = 1; i <= length(jobban_keylist); i++)
if( findtext(jobban_keylist[i], "[X]") )
+ // This need to be here, instead of jobban_unban, due to direct calls to jobban_remove
+ if(jobban_regex.Find(X))
+ var/ckey = jobban_regex.group[1]
+ var/rank = jobban_regex.group[2]
+ if(jobban_assoclist[ckey] && jobban_assoclist[ckey][rank])
+ jobban_assoclist[ckey] -= rank
+ else
+ log_debug("Attempted to remove non-existent job ban: [X]")
+ else
+ log_debug("Failed to remove malformed job ban from associative list: [X]")
jobban_keylist.Remove(jobban_keylist[i])
- jobban_savebanfile()
+ if(config.ban_legacy_system)
+ jobban_savebanfile()
return 1
return 0
diff --git a/code/modules/admin/buildmode.dm b/code/modules/admin/buildmode.dm
index 455bea43014..34fcd5738c2 100644
--- a/code/modules/admin/buildmode.dm
+++ b/code/modules/admin/buildmode.dm
@@ -92,7 +92,7 @@
qdel(I)
/obj/effect/buildmode_line
- var/image/I
+ var/image/I
var/client/cl
/obj/effect/buildmode_line/New(var/client/c, var/atom/atom_a, var/atom/atom_b, var/linename)
@@ -101,13 +101,13 @@
I = image('icons/misc/mark.dmi', src, "line", 19.0)
var/x_offset = ((atom_b.x * 32) + atom_b.pixel_x) - ((atom_a.x * 32) + atom_a.pixel_x)
var/y_offset = ((atom_b.y * 32) + atom_b.pixel_y) - ((atom_a.y * 32) + atom_a.pixel_y)
-
+
var/matrix/M = matrix()
M.Translate(0, 16)
M.Scale(1, sqrt((x_offset * x_offset) + (y_offset * y_offset)) / 32)
M.Turn(90 - Atan2(x_offset, y_offset)) // So... You pass coords in order x,y to this version of atan2. It should be called acsc2.
M.Translate(atom_a.pixel_x, atom_a.pixel_y)
-
+
transform = M
cl = c
cl.images += I
@@ -242,6 +242,7 @@
if(FILL_BUILDMODE)
to_chat(user, "*********************************************************** ")
to_chat(user, "Left Mouse Button on turf/obj/mob = Select corner ")
+ to_chat(user, "Left Mouse Button + Alt on turf/obj/mob = Delete region ")
to_chat(user, "Right Mouse Button on buildmode button = Select object type ")
to_chat(user, "*********************************************************** ")
if(LINK_BUILDMODE)
@@ -509,16 +510,20 @@
cornerB = select_tile(get_turf(object))
if(left_click) //rectangular
if(cornerA && cornerB)
- if(!objholder)
- to_chat(user, "Select object type first. ")
+ if(alt_click)
+ empty_region(block(get_turf(cornerA),get_turf(cornerB)))
+ deselect_region()
else
- for(var/turf/T in block(get_turf(cornerA),get_turf(cornerB)))
- if(ispath(objholder,/turf))
- T.ChangeTurf(objholder)
- else
- var/obj/A = new objholder(T)
- A.dir = build_dir
- deselect_region()
+ if(!objholder)
+ to_chat(user, "Select object type first. ")
+ else
+ for(var/turf/T in block(get_turf(cornerA),get_turf(cornerB)))
+ if(ispath(objholder,/turf))
+ T.ChangeTurf(objholder)
+ else
+ var/obj/A = new objholder(T)
+ A.dir = build_dir
+ deselect_region()
return
//Something wrong - Reset
@@ -567,13 +572,13 @@
if(P.id_tag && P.id_tag != 1 && alert(holder, "Warning: This will unlink something else from the door. Continue?", "Buildmode", "Yes", "No") == "No")
goto(line_jump)
P.id_tag = M.id
-
+
line_jump // For the goto
valid_links = 0
for(var/obj/effect/buildmode_line/L in link_lines)
qdel(L)
link_lines -= L
-
+
if(istype(link_obj, /obj/machinery/door_control))
var/obj/machinery/door_control/M = link_obj
for(var/obj/machinery/door/airlock/P in range(M.range,M))
diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm
index 4a892d893da..af3853c1d05 100644
--- a/code/modules/admin/create_mob.dm
+++ b/code/modules/admin/create_mob.dm
@@ -1,6 +1,6 @@
/var/create_mob_html = null
/datum/admins/proc/create_mob(var/mob/user)
- if (!create_mob_html)
+ if(!create_mob_html)
var/mobjs = null
mobjs = jointext(typesof(/mob), ";")
create_mob_html = file2text('html/create_object.html')
diff --git a/code/modules/admin/create_object.dm b/code/modules/admin/create_object.dm
index c5cb9f42152..bec74191121 100644
--- a/code/modules/admin/create_object.dm
+++ b/code/modules/admin/create_object.dm
@@ -2,7 +2,7 @@ var/create_object_html = null
var/list/create_object_forms = list(/obj, /obj/structure, /obj/machinery, /obj/effect, /obj/item, /obj/mecha, /obj/item/weapon, /obj/item/clothing, /obj/item/stack, /obj/item/device, /obj/item/weapon/reagent_containers, /obj/item/weapon/gun)
/datum/admins/proc/create_object(var/mob/user)
- if (!create_object_html)
+ if(!create_object_html)
var/objectjs = null
objectjs = jointext(typesof(/obj), ";")
create_object_html = file2text('html/create_object.html')
@@ -14,7 +14,7 @@ var/list/create_object_forms = list(/obj, /obj/structure, /obj/machinery, /obj/e
var/path = input("Select the path of the object you wish to create.", "Path", /obj) in create_object_forms
var/html_form = create_object_forms[path]
- if (!html_form)
+ if(!html_form)
var/objectjs = jointext(typesof(path), ";")
html_form = file2text('html/create_object.html')
html_form = replacetext(html_form, "null /* object types */", "\"[objectjs]\"")
diff --git a/code/modules/admin/create_turf.dm b/code/modules/admin/create_turf.dm
index fdaa103b5d5..5edffa65cbf 100644
--- a/code/modules/admin/create_turf.dm
+++ b/code/modules/admin/create_turf.dm
@@ -1,6 +1,6 @@
/var/create_turf_html = null
/datum/admins/proc/create_turf(var/mob/user)
- if (!create_turf_html)
+ if(!create_turf_html)
var/turfjs = null
turfjs = jointext(typesof(/turf), ";")
create_turf_html = file2text('html/create_object.html')
diff --git a/code/modules/admin/newbanjob.dm b/code/modules/admin/newbanjob.dm
deleted file mode 100644
index 71d61567962..00000000000
--- a/code/modules/admin/newbanjob.dm
+++ /dev/null
@@ -1,274 +0,0 @@
-var/savefile/Banlistjob
-
-
-/proc/_jobban_isbanned(var/client/clientvar, var/rank)
- if(!clientvar) return 1
- ClearTempbansjob()
- var/id = clientvar.computer_id
- var/key = clientvar.ckey
- if (guest_jobbans(rank))
- if(config.guest_jobban && IsGuestKey(key))
- return 1
- Banlistjob.cd = "/base"
- if (Banlistjob.dir.Find("[key][id][rank]"))
- return 1
-
- Banlistjob.cd = "/base"
- for (var/A in Banlistjob.dir)
- Banlistjob.cd = "/base/[A]"
- if ((id == Banlistjob["id"] || key == Banlistjob["key"]) && rank == Banlistjob["rank"])
- return 1
- return 0
-
-/proc/LoadBansjob()
-
- Banlistjob = new("data/job_fullnew.bdb")
- log_admin("Loading Banlistjob")
-
- if (!length(Banlistjob.dir)) log_admin("Banlistjob is empty.")
-
- if (!Banlistjob.dir.Find("base"))
- log_admin("Banlistjob missing base dir.")
- Banlistjob.dir.Add("base")
- Banlistjob.cd = "/base"
- else if (Banlistjob.dir.Find("base"))
- Banlistjob.cd = "/base"
-
- ClearTempbansjob()
- return 1
-
-/proc/ClearTempbansjob()
- UpdateTime()
-
- Banlistjob.cd = "/base"
- for (var/A in Banlistjob.dir)
- Banlistjob.cd = "/base/[A]"
- //if (!Banlistjob["key"] || !Banlistjob["id"])
- // RemoveBanjob(A, "full")
- // log_admin("Invalid Ban.")
- // message_admins("Invalid Ban.")
- // continue
-
- if (!Banlistjob["temp"]) continue
- if (CMinutes >= Banlistjob["minutes"]) RemoveBanjob(A)
-
- return 1
-
-
-/proc/AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, rank)
- UpdateTime()
- var/bantimestamp
- if (temp)
- UpdateTime()
- bantimestamp = CMinutes + minutes
- if(rank == "Heads")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Personnel")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Captain")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Security")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer")
- return 1
- if(rank == "Security")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Security")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Warden")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Detective")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Security Officer")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Cyborg")
- return 1
- if(rank == "Engineering")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Station Engineer")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Life Support Specialist")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Cyborg")
- return 1
- if(rank == "Research")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Scientist")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Geneticist")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director")
- return 1
- if(rank == "Medical")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Geneticist")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Medical Doctor")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chemist")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Cyborg")
- return 1
- if(rank == "CE_Station_Engineer")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Station Engineer")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer")
- return 1
- if(rank == "CE_Atmospheric_Tech")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Life Support Specialist")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer")
- return 1
- if(rank == "CE_Shaft_Miner")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Shaft Miner")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer")
- return 1
- if(rank == "Chemist_RD_CMO")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chemist")
- return 1
- if(rank == "Geneticist_RD_CMO")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Geneticist")
- return 1
- if(rank == "MD_CMO")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Medical Doctor")
- return 1
- if(rank == "Scientist_RD")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Scientist")
- return 1
- if(rank == "AI_Cyborg")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Cyborg")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "AI")
- return 1
- if(rank == "Detective_HoS")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Detective")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Security")
- return 1
- if(rank == "Virologist_RD_CMO")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Medical Officer")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director")
- AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Virologist")
- return 1
-
- Banlistjob.cd = "/base"
- if ( Banlistjob.dir.Find("[ckey][computerid][rank]") )
- to_chat(usr, text("\red Banjob already exists."))
- return 0
- else
- Banlistjob.dir.Add("[ckey][computerid][rank]")
- Banlistjob.cd = "/base/[ckey][computerid][rank]"
- to_chat(Banlistjob["key"], ckey)
- to_chat(Banlistjob["id"], computerid)
- to_chat(Banlistjob["rank"], rank)
- to_chat(Banlistjob["reason"], reason)
- to_chat(Banlistjob["bannedby"], bannedby)
- to_chat(Banlistjob["temp"], temp)
- if (temp)
- to_chat(Banlistjob["minutes"], bantimestamp)
-
- return 1
-
-/proc/RemoveBanjob(foldername)
- var/key
- var/id
- var/rank
- Banlistjob.cd = "/base/[foldername]"
- Banlistjob["key"] >> key
- Banlistjob["id"] >> id
- Banlistjob["rank"] >> rank
- Banlistjob.cd = "/base"
-
- if (!Banlistjob.dir.Remove(foldername)) return 0
-
- if(!usr)
- log_admin("Banjob Expired: [key]")
- message_admins("Banjob Expired: [key]")
- else
- log_admin("[key_name_admin(usr)] unjobbanned [key] from [rank]")
- message_admins("[key_name_admin(usr)] unjobbanned:[key] from [rank]")
- ban_unban_log_save("[key_name_admin(usr)] unjobbanned [key] from [rank]")
- feedback_inc("ban_job_unban",1)
- feedback_add_details("ban_job_unban","- [rank]")
-
- for (var/A in Banlistjob.dir)
- Banlistjob.cd = "/base/[A]"
- if ((key == Banlistjob["key"] || id == Banlistjob["id"]) && (rank == Banlistjob["rank"]))
- Banlistjob.cd = "/base"
- Banlistjob.dir.Remove(A)
- continue
-
- return 1
-
-/proc/GetBanExpjob(minutes as num)
- UpdateTime()
- var/exp = minutes - CMinutes
- if (exp <= 0)
- return 0
- else
- var/timeleftstring
- if (exp >= 1440) //1440 = 1 day in minutes
- timeleftstring = "[round(exp / 1440, 0.1)] Days"
- else if (exp >= 60) //60 = 1 hour in minutes
- timeleftstring = "[round(exp / 60, 0.1)] Hours"
- else
- timeleftstring = "[exp] Minutes"
- return timeleftstring
-
-/datum/admins/proc/unjobbanpanel()
- var/count = 0
- var/dat
- //var/dat = "Unban Player: \blue(U) = Unban , (E) = Edit Ban\green (Total"
- Banlistjob.cd = "/base"
- for (var/A in Banlistjob.dir)
- count++
- Banlistjob.cd = "/base/[A]"
- dat += text("(U) Key: [Banlistjob["key"]] Rank: [Banlistjob["rank"]] ([Banlistjob["temp"] ? "[GetBanExpjob(Banlistjob["minutes"]) ? GetBanExpjob(Banlistjob["minutes"]) : "Removal pending" ]" : "Permaban"]) (By: [Banlistjob["bannedby"]]) (Reason: [Banlistjob["reason"]]) ")
-
- dat += "
"
- dat = "Bans: (U) = Unban , - ([count] Bans) [dat]"
- usr << browse(dat, "window=unbanp;size=875x400")
-
-/*/datum/admins/proc/permjobban(ckey, computerid, reason, bannedby, temp, minutes, rank)
- if(AddBanjob(ckey, computerid, reason, usr.ckey, 0, 0, job))
- to_chat(M, "\redYou have been banned from [job] by [usr.client.ckey].\nReason: [reason]. ")
- to_chat(M, "\red This is a permanent ban.")
- if(config.banappeals)
- to_chat(M, "\red To try to resolve this matter head to [config.banappeals]")
- else
- to_chat(M, "\red No ban appeals URL has been set.")
- log_admin("[usr.client.ckey] has banned from [job] [ckey].\nReason: [reason]\nThis is a permanent ban.")
- message_admins("\blue[usr.client.ckey] has banned from [job] [ckey].\nReason: [reason]\nThis is a permanent ban.")
-/datum/admins/proc/timejobban(ckey, computerid, reason, bannedby, temp, minutes, rank)
- if(AddBanjob(ckey, computerid, reason, usr.ckey, 1, mins, job))
- to_chat(M, "\redYou have been jobbanned from [job] by [usr.client.ckey].\nReason: [reason]. ")
- to_chat(M, "\red This is a temporary ban, it will be removed in [mins] minutes.")
- if(config.banappeals)
- to_chat(M, "\red To try to resolve this matter head to [config.banappeals]")
- else
- to_chat(M, "\red No ban appeals URL has been set.")
- log_admin("[usr.client.ckey] has jobbanned from [job] [ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")
- message_admins("\blue[usr.client.ckey] has banned from [job] [ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")*/
-//////////////////////////////////// DEBUG ////////////////////////////////////
-
-/proc/CreateBansjob()
-
- UpdateTime()
-
- var/i
- var/last
-
- for(i=0, i<1001, i++)
- var/a = pick(1,0)
- var/b = pick(1,0)
- if(b)
- Banlistjob.cd = "/base"
- Banlistjob.dir.Add("trash[i]trashid[i]")
- Banlistjob.cd = "/base/trash[i]trashid[i]"
- to_chat(Banlistjob["key"], "trash[i]")
- else
- Banlistjob.cd = "/base"
- Banlistjob.dir.Add("[last]trashid[i]")
- Banlistjob.cd = "/base/[last]trashid[i]"
- to_chat(Banlistjob["key"], last)
- to_chat(Banlistjob["id"], "trashid[i]")
- to_chat(Banlistjob["reason"], "Trashban[i].")
- to_chat(Banlistjob["temp"], a)
- to_chat(Banlistjob["minutes"], CMinutes + rand(1,2000))
- to_chat(Banlistjob["bannedby"], "trashmin")
- last = "trash[i]"
-
- Banlistjob.cd = "/base"
-
-/proc/ClearAllBansjob()
- Banlistjob.cd = "/base"
- for (var/A in Banlistjob.dir)
- RemoveBanjob(A, "full")
diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm
index d91f04aa4df..b840cad783d 100644
--- a/code/modules/admin/permissionverbs/permissionedit.dm
+++ b/code/modules/admin/permissionverbs/permissionedit.dm
@@ -156,7 +156,7 @@
/datum/admins/proc/updateranktodb(ckey,newrank)
establish_db_connection()
- if (!dbcon.IsConnected())
+ if(!dbcon.IsConnected())
return
var/sql_ckey = sanitizeSQL(ckey)
var/sql_admin_rank = sanitizeSQL(newrank)
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 3ad363e2f68..42be00bea23 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -1,6 +1,6 @@
/datum/admins/proc/player_panel_new()//The new one
- if (!usr.client.holder)
+ if(!usr.client.holder)
return
var/dat = "Admin Player Panel "
@@ -29,7 +29,7 @@
var maintable_data = document.getElementById('maintable_data');
var ltr = maintable_data.getElementsByTagName("tr");
- for ( var i = 0; i < ltr.length; ++i )
+ for( var i = 0; i < ltr.length; ++i )
{
try{
var tr = ltr\[i\];
@@ -42,7 +42,7 @@
var search = lsearch\[0\];
//var inner_span = li.getElementsByTagName("span")\[1\] //Should only ever contain one element.
//document.write(""+search.innerText+" "+filter+" "+search.innerText.indexOf(filter))
- if ( search.innerText.toLowerCase().indexOf(filter) == -1 )
+ if( search.innerText.toLowerCase().indexOf(filter) == -1 )
{
//document.write("a");
//ltr.removeChild(tr);
@@ -329,7 +329,7 @@
//The old one
/datum/admins/proc/player_panel_old()
- if (!usr.client.holder)
+ if(!usr.client.holder)
return
var/dat = "
Player Menu "
dat += "Name Real Name Assigned Job Key Options PM Traitor? "
@@ -399,10 +399,10 @@
/datum/admins/proc/check_antagonists()
if(!check_rights(R_ADMIN)) return
- if (ticker && ticker.current_state >= GAME_STATE_PLAYING)
+ if(ticker && ticker.current_state >= GAME_STATE_PLAYING)
var/dat = "Round Status Round Status "
dat += "Current Game Mode: [ticker.mode.name] "
- dat += "Round Duration: [round(world.time / 36000)]:[add_zero(num2text(world.time / 600 % 60), 2)]:[add_zero(num2text(world.time / 10 % 60), 2)] "
+ dat += "Round Duration: [round(ROUND_TIME / 36000)]:[add_zero(num2text(ROUND_TIME / 600 % 60), 2)]:[add_zero(num2text(ROUND_TIME / 10 % 60), 2)] "
dat += "Emergency shuttle "
if(shuttle_master.emergency.mode < SHUTTLE_CALL)
dat += "Call Shuttle "
@@ -540,12 +540,12 @@
return txt
/datum/admins/proc/check_role_table_row(mob/M, show_objectives)
- if (!istype(M))
+ if(!istype(M))
return "Not found! "
var/txt = check_antagonists_line(M, close = 0)
- if (show_objectives)
+ if(show_objectives)
txt += {"
Show Objective
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
index 99595d9a02c..e2b6ab56d62 100644
--- a/code/modules/admin/secrets.dm
+++ b/code/modules/admin/secrets.dm
@@ -14,7 +14,7 @@
dat += ""
dat += " "
switch(current_tab)
- if (0) // Debug
+ if(0) // Debug
if(check_rights(R_ADMIN,0))
dat += {"
Admin Secrets
@@ -67,7 +67,7 @@
"}
- if (1)
+ if(1)
if(check_rights((R_EVENT|R_SERVER),0))
dat += {"
@@ -83,10 +83,13 @@
Security Level - Gamma
Security Level - Epsilon
Security Level - Delta
+ Create Weather
+ Weather - Ash Storm
+ Weather - Advanced Darkness
"}
- if (2)
+ if(2)
if(check_rights((R_SERVER|R_EVENT),0))
dat += {"
@@ -104,6 +107,7 @@
Dodgeball (TDM)!
Round-enders
The floor is lava! (DANGEROUS: extremely lame)
+ The floor is fake-lava! (non-harmful)
Turn all humans into monkeys
Make all items look like guns
Warp all Players to Prison
diff --git a/code/modules/admin/sql_notes.dm b/code/modules/admin/sql_notes.dm
index df02b6f0c9c..338993af58c 100644
--- a/code/modules/admin/sql_notes.dm
+++ b/code/modules/admin/sql_notes.dm
@@ -33,7 +33,7 @@
return
var/admin_sql_ckey = sanitizeSQL(adminckey)
if(!server)
- if (config && config.server_name)
+ if(config && config.server_name)
server = config.server_name
server = sanitizeSQL(server)
var/DBQuery/query_noteadd = dbcon.NewQuery("INSERT INTO [format_table_name("notes")] (ckey, timestamp, notetext, adminckey, server) VALUES ('[target_sql_ckey]', '[timestamp]', '[notetext]', '[admin_sql_ckey]', '[server]')")
diff --git a/code/modules/admin/stickyban.dm b/code/modules/admin/stickyban.dm
index a772edc2608..bddebcff602 100644
--- a/code/modules/admin/stickyban.dm
+++ b/code/modules/admin/stickyban.dm
@@ -2,32 +2,32 @@
if(!check_rights(R_BAN))
return
- switch (action)
- if ("show")
+ switch(action)
+ if("show")
stickyban_show()
return
- if ("add")
+ if("add")
var/list/ban = list()
var/ckey
ban["admin"] = usr.key
ban["type"] = list("sticky")
ban["reason"] = "(InGameBan)([usr.key])" //this will be displayed in dd only
- if (data["ckey"])
+ if(data["ckey"])
ckey = ckey(data["ckey"])
else
ckey = input(usr,"Ckey","Ckey","") as text|null
- if (!ckey)
+ if(!ckey)
return
ckey = ckey(ckey)
- if (get_stickyban_from_ckey(ckey))
+ if(get_stickyban_from_ckey(ckey))
to_chat(usr, "Error: Can not add a stickyban: User already has a current sticky ban ")
- if (data["reason"])
+ if(data["reason"])
ban["message"] = data["reason"]
else
var/reason = input(usr,"Reason","Reason","Ban Evasion") as text|null
- if (!reason)
+ if(!reason)
return
ban["message"] = "[reason]"
@@ -36,18 +36,18 @@
log_admin("[key_name(usr)] has stickybanned [ckey].\nReason: [ban["message"]]")
message_admins("[key_name_admin(usr)] has stickybanned [ckey].\nReason: [ban["message"]] ")
- if ("remove")
- if (!data["ckey"])
+ if("remove")
+ if(!data["ckey"])
return
var/ckey = data["ckey"]
var/ban = get_stickyban_from_ckey(ckey)
- if (!ban)
+ if(!ban)
to_chat(usr, "Error: No sticky ban for [ckey] found! ")
return
- if (alert("Are you sure you want to remove the sticky ban on [ckey]?","Are you sure","Yes","No") == "No")
+ if(alert("Are you sure you want to remove the sticky ban on [ckey]?","Are you sure","Yes","No") == "No")
return
- if (!get_stickyban_from_ckey(ckey))
+ if(!get_stickyban_from_ckey(ckey))
to_chat(usr, "Error: The ban disappeared. ")
return
world.SetConfig("ban", ckey, null)
@@ -55,46 +55,46 @@
log_admin("[key_name(usr)] removed [ckey]'s stickyban")
message_admins("[key_name_admin(usr)] removed [ckey]'s stickyban ")
- if ("remove_alt")
- if (!data["ckey"])
+ if("remove_alt")
+ if(!data["ckey"])
return
var/ckey = data["ckey"]
- if (!data["alt"])
+ if(!data["alt"])
return
var/alt = ckey(data["alt"])
var/ban = get_stickyban_from_ckey(ckey)
- if (!ban)
+ if(!ban)
to_chat(usr, "Error: No sticky ban for [ckey] found! ")
return
var/found = 0
//we have to do it this way because byond keeps the case in its sticky ban matches WHY!!!
- for (var/key in ban["keys"])
- if (ckey(key) == alt)
+ for(var/key in ban["keys"])
+ if(ckey(key) == alt)
found = 1
break
- if (!found)
+ if(!found)
to_chat(usr, "Error: [alt] is not linked to [ckey]'s sticky ban! ")
return
- if (alert("Are you sure you want to disassociate [alt] from [ckey]'s sticky ban? \nNote: Nothing stops byond from re-linking them","Are you sure","Yes","No") == "No")
+ if(alert("Are you sure you want to disassociate [alt] from [ckey]'s sticky ban? \nNote: Nothing stops byond from re-linking them","Are you sure","Yes","No") == "No")
return
//we have to do this again incase something changes
ban = get_stickyban_from_ckey(ckey)
- if (!ban)
+ if(!ban)
to_chat(usr, "Error: The ban disappeared. ")
return
found = 0
- for (var/key in ban["keys"])
- if (ckey(key) == alt)
+ for(var/key in ban["keys"])
+ if(ckey(key) == alt)
ban["keys"] -= key
found = 1
break
- if (!found)
+ if(!found)
to_chat(usr, "Error: [alt] link to [ckey]'s sticky ban disappeared. ")
return
@@ -103,21 +103,21 @@
log_admin("[key_name(usr)] has disassociated [alt] from [ckey]'s sticky ban")
message_admins("[key_name_admin(usr)] has disassociated [alt] from [ckey]'s sticky ban ")
- if ("edit")
- if (!data["ckey"])
+ if("edit")
+ if(!data["ckey"])
return
var/ckey = data["ckey"]
var/ban = get_stickyban_from_ckey(ckey)
- if (!ban)
+ if(!ban)
to_chat(usr, "Error: No sticky ban for [ckey] found!")
return
var/oldreason = ban["message"]
var/reason = input(usr,"Reason","Reason","[ban["message"]]") as text|null
- if (!reason || reason == oldreason)
+ if(!reason || reason == oldreason)
return
//we have to do this again incase something changed while we waited for input
ban = get_stickyban_from_ckey(ckey)
- if (!ban)
+ if(!ban)
to_chat(usr, "Error: The ban disappeared. ")
return
ban["message"] = "[reason]"
@@ -133,13 +133,13 @@
/datum/admins/proc/stickyban_gethtml(ckey, ban)
. = "\[-\] [ckey] "
. += "[ban["message"]] \[Edit\] "
- if (ban["admin"])
+ if(ban["admin"])
. += "[ban["admin"]] "
else
. += "LEGACY "
. += "Caught keys \n"
- for (var/key in ban["keys"])
- if (ckey(key) == ckey)
+ for(var/key in ban["keys"])
+ if(ckey(key) == ckey)
continue
. += "\[-\] [key] "
. += " \n"
@@ -168,17 +168,17 @@
usr << browse(html,"window=stickybans;size=700x400")
/proc/get_stickyban_from_ckey(var/ckey)
- if (!ckey)
+ if(!ckey)
return null
ckey = ckey(ckey)
. = null
- for (var/key in world.GetConfig("ban"))
- if (ckey(key) == ckey)
+ for(var/key in world.GetConfig("ban"))
+ if(ckey(key) == ckey)
. = stickyban2list(world.GetConfig("ban",key))
break
/proc/stickyban2list(var/ban)
- if (!ban)
+ if(!ban)
return null
. = params2list(ban)
.["keys"] = splittext(.["keys"], ",")
@@ -187,16 +187,16 @@
.["computer_id"] = splittext(.["computer_id"], ",")
/proc/list2stickyban(var/list/ban)
- if (!ban || !islist(ban))
+ if(!ban || !islist(ban))
return null
. = ban.Copy()
- if (.["keys"])
+ if(.["keys"])
.["keys"] = jointext(.["keys"], ",")
- if (.["type"])
+ if(.["type"])
.["type"] = jointext(.["type"], ",")
- if (.["IP"])
+ if(.["IP"])
.["IP"] = jointext(.["IP"], ",")
- if (.["computer_id"])
+ if(.["computer_id"])
.["computer_id"] = jointext(.["computer_id"], ",")
. = list2params(.)
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
index b46e5401528..27048b441dd 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
@@ -412,7 +412,7 @@
else if(expression[start + 1] == "\[" && islist(v))
var/list/L = v
var/index = SDQL_expression(source, expression[start + 2])
- if (isnum(index) && (!IsInteger(index) || L.len < index))
+ if(isnum(index) && (!IsInteger(index) || L.len < index))
to_chat(world, "Invalid list index: [index] ")
return null
return L[index]
@@ -424,7 +424,7 @@
for(var/arg in arguments)
new_args[++new_args.len] = SDQL_expression(source, arg)
- if (object == world) // Global proc.
+ if(object == world) // Global proc.
procname = "/proc/[procname]"
return call(procname)(arglist(new_args))
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm
index 5aa2aa0dc93..0d0573e3760 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2_parser.dm
@@ -358,7 +358,7 @@
else if(token(i + 1) == "\[") // list index
var/list/expression = list()
i = expression(i + 2, expression)
- if (token(i) != "]")
+ if(token(i) != "]")
parse_error("Missing ] at the end of list access.")
L += "\["
diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm
index 5cbb8dd26d5..2512171e80d 100644
--- a/code/modules/admin/verbs/adminjump.dm
+++ b/code/modules/admin/verbs/adminjump.dm
@@ -24,7 +24,8 @@
admin_forcemove(usr, T)
log_admin("[key_name(usr)] jumped to [A]")
- message_admins("[key_name_admin(usr)] jumped to [A]")
+ if(!isobserver(usr))
+ message_admins("[key_name_admin(usr)] jumped to [A]")
feedback_add_details("admin_verb","JA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/jumptoturf(var/turf/T in world)
@@ -35,7 +36,8 @@
return
log_admin("[key_name(usr)] jumped to [T.x], [T.y], [T.z] in [T.loc]")
- message_admins("[key_name_admin(usr)] jumped to [T.x], [T.y], [T.z] in [T.loc]", 1)
+ if(!isobserver(usr))
+ message_admins("[key_name_admin(usr)] jumped to [T.x], [T.y], [T.z] in [T.loc]", 1)
admin_forcemove(usr, T)
feedback_add_details("admin_verb","JT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
@@ -48,7 +50,8 @@
return
log_admin("[key_name(usr)] jumped to [key_name(M)]")
- message_admins("[key_name_admin(usr)] jumped to [key_name_admin(M)]", 1)
+ if(!isobserver(usr))
+ message_admins("[key_name_admin(usr)] jumped to [key_name_admin(M)]", 1)
if(src.mob)
var/mob/A = src.mob
var/turf/T = get_turf(M)
@@ -69,7 +72,8 @@
if(T)
admin_forcemove(usr, T)
feedback_add_details("admin_verb","JC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- message_admins("[key_name_admin(usr)] jumped to coordinates [tx], [ty], [tz]")
+ if(!isobserver(usr))
+ message_admins("[key_name_admin(usr)] jumped to coordinates [tx], [ty], [tz]")
/client/proc/jumptokey()
set category = "Admin"
@@ -87,7 +91,8 @@
return
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)]", 1)
+ if(!isobserver(usr))
+ message_admins("[key_name_admin(usr)] jumped to [key_name_admin(M)]", 1)
admin_forcemove(usr, M.loc)
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index e533a4716b6..319830d0235 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -99,7 +99,7 @@
adminhelp(msg) //admin we are replying to has vanished, adminhelp instead
return
- if (src.handle_spam_prevention(msg,MUTE_ADMINHELP))
+ if(src.handle_spam_prevention(msg,MUTE_ADMINHELP))
return
//clean the message if it's not sent by a high-rank admin
diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm
index 3f116b0a0d5..784f924966f 100644
--- a/code/modules/admin/verbs/adminsay.dm
+++ b/code/modules/admin/verbs/adminsay.dm
@@ -27,7 +27,7 @@
msg = sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))
log_admin("MOD: [key_name(src)] : [msg]")
- if (!msg)
+ if(!msg)
return
var/spanclass = "mod_channel"
diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm
index e1225275e17..85591ee3159 100644
--- a/code/modules/admin/verbs/atmosdebug.dm
+++ b/code/modules/admin/verbs/atmosdebug.dm
@@ -6,37 +6,41 @@
to_chat(src, "Only administrators may use this command.")
return
feedback_add_details("admin_verb","CP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
+
if(alert("WARNING: This command should not be run on a live server. Do you want to continue?", "Check Piping", "No", "Yes") == "No")
return
to_chat(usr, "Checking for disconnected pipes...")
//all plumbing - yes, some things might get stated twice, doesn't matter.
- for (var/obj/machinery/atmospherics/plumbing in world)
- if (plumbing.nodealert)
+ for(var/obj/machinery/atmospherics/plumbing in world)
+ if(plumbing.nodealert)
to_chat(usr, "Unconnected [plumbing.name] located at [plumbing.x],[plumbing.y],[plumbing.z] ([get_area(plumbing.loc)])")
//Manifolds
- for (var/obj/machinery/atmospherics/pipe/manifold/pipe in world)
- if (!pipe.node1 || !pipe.node2 || !pipe.node3)
+ for(var/obj/machinery/atmospherics/pipe/manifold/pipe in world)
+ if(!pipe.node1 || !pipe.node2 || !pipe.node3)
to_chat(usr, "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])")
//Pipes
- for (var/obj/machinery/atmospherics/pipe/simple/pipe in world)
- if (!pipe.node1 || !pipe.node2)
+ for(var/obj/machinery/atmospherics/pipe/simple/pipe in world)
+ if(!pipe.node1 || !pipe.node2)
to_chat(usr, "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])")
to_chat(usr, "Checking for overlapping pipes...")
- next_turf:
- for(var/turf/T in world)
- for(var/dir in cardinal)
- var/check = 0
- for(var/obj/machinery/atmospherics/pipe in T)
- if(dir & pipe.initialize_directions)
- check++
- if(check > 1)
+ for(var/turf/T in world)
+ for(var/dir in cardinal)
+ var/list/check = list(0, 0, 0)
+ var/done = 0
+ for(var/obj/machinery/atmospherics/pipe in T)
+ if(dir & pipe.initialize_directions)
+ for(var/ct in pipe.connect_types)
+ check[ct]++
+ if(check[ct] > 1)
to_chat(usr, "Overlapping pipe ([pipe.name]) located at [T.x],[T.y],[T.z] ([get_area(T)])")
- continue next_turf
+ done = 1
+ break
+ if(done)
+ break
to_chat(usr, "Done")
/client/proc/powerdebug()
@@ -47,13 +51,13 @@
return
feedback_add_details("admin_verb","CPOW") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- for (var/datum/powernet/PN in powernets)
- if (!PN.nodes || !PN.nodes.len)
+ for(var/datum/powernet/PN in powernets)
+ if(!PN.nodes || !PN.nodes.len)
if(PN.cables && (PN.cables.len > 1))
var/obj/structure/cable/C = PN.cables[1]
to_chat(usr, "Powernet with no nodes! (number [PN.number]) - example cable at [C.x], [C.y], [C.z] in area [get_area(C.loc)]")
- if (!PN.cables || (PN.cables.len < 10))
+ if(!PN.cables || (PN.cables.len < 10))
if(PN.cables && (PN.cables.len > 1))
var/obj/structure/cable/C = PN.cables[1]
to_chat(usr, "Powernet with fewer than 10 cables! (number [PN.number]) - example cable at [C.x], [C.y], [C.z] in area [get_area(C.loc)]")
diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm
index 570d73e19a8..3449350e11f 100644
--- a/code/modules/admin/verbs/cinematic.dm
+++ b/code/modules/admin/verbs/cinematic.dm
@@ -1,17 +1,17 @@
-/client/proc/cinematic(var/cinematic as anything in list("explosion",null))
- set name = "Play cinematic"
+/client/proc/cinematic(cinematic as anything in list("explosion", null))
+ set name = "cinematic"
set category = "Debug"
- set desc = "Shows a cinematic, will work like a normal nuke" // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted.
- if(alert("Are you sure you want to run [cinematic]?","Confirmation","Yes","No")=="No") return
- if(!ticker) return
+ set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted.
+ set hidden = 1
+ if(!ticker)
+ return
switch(cinematic)
if("explosion")
- var/parameter = input(src,"station_missed = ?","Enter Parameter",0) as num
+ var/parameter = input(src, "station_missed = ?", "Enter Parameter", 0) as num
var/override
switch(parameter)
if(1)
- override = input(src,"mode = ?","Enter Parameter",null) as anything in list("nuclear emergency","no override")
+ override = input(src, "mode = ?","Enter Parameter", null) as anything in list("nuclear emergency", "fake", "no override")
if(0)
- override = input(src,"mode = ?","Enter Parameter",null) as anything in list("blob","nuclear emergency","AI malfunction","no override")
- ticker.station_explosion_cinematic(parameter,override)
- return
\ No newline at end of file
+ override = input(src, "mode = ?","Enter Parameter", null) as anything in list("blob", "nuclear emergency", "AI malfunction", "no override")
+ ticker.station_explosion_cinematic(parameter, override)
\ No newline at end of file
diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm
index 74596c333cc..690cac87536 100644
--- a/code/modules/admin/verbs/deadsay.dm
+++ b/code/modules/admin/verbs/deadsay.dm
@@ -17,24 +17,24 @@
to_chat(src, "You have deadchat muted. ")
return
- if (handle_spam_prevention(msg,MUTE_DEADCHAT))
+ if(handle_spam_prevention(msg,MUTE_DEADCHAT))
return
var/stafftype = null
- if (check_rights(R_MENTOR, 0))
+ if(check_rights(R_MENTOR, 0))
stafftype = "MENTOR"
- if (check_rights(R_MOD, 0))
+ if(check_rights(R_MOD, 0))
stafftype = "MOD"
- if (check_rights(R_ADMIN, 0))
+ if(check_rights(R_ADMIN, 0))
stafftype = "ADMIN"
msg = sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))
log_admin("[key_name(src)] : [msg]")
- if (!msg)
+ if(!msg)
return
var/prefix = "[stafftype] ([src.key])"
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index b85d19451fe..c04940a3cfa 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -194,7 +194,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
return
var/turf/T = mob.loc
- if (!( istype(T, /turf) ))
+ if(!( istype(T, /turf) ))
return
var/datum/gas_mixture/env = T.return_air()
@@ -399,12 +399,12 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!check_rights(R_EVENT))
return
- if (!ticker)
+ if(!ticker)
alert("Wait until the game starts")
return
- if (istype(M, /mob/living/carbon/human))
+ if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
- if (H.wear_id)
+ if(H.wear_id)
var/obj/item/weapon/card/id/id = H.wear_id
if(istype(H.wear_id, /obj/item/device/pda))
var/obj/item/device/pda/pda = H.wear_id
@@ -595,64 +595,75 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
"space pirate",
"soviet admiral",
"tunnel clown",
+ "survivor",
"masked killer",
"singuloth knight",
"dark lord",
"assassin",
+ "spy",
"death commando",
- "syndicate commando",
+ "syndicate agent",
+ "syndicate operative",
+ "syndicate strike team",
+ "syndicate officer",
"chrono legionnaire",
- "special ops officer",
- "special ops formal",
"blue wizard",
"red wizard",
"marisa wizard",
"emergency response team member",
"emergency response team leader",
- "nanotrasen officer",
- "nanotrasen captain",
+ "nt vip guest",
+ "nt navy officer", // now in jobs list
+ "nt navy captain",
+ "nt special ops officer", // now in jobs list
+ "nt special ops formal",
)
- var/dostrip = input("Do you want to strip [M] before equipping them? (0=no, 1=yes)", "STRIPTEASE") as null|anything in list(0,1)
- if(isnull(dostrip))
- return
+ var/dostrip = 0
+ switch(alert("Strip [M] before dressing?", "Strip?", "Yes", "No", "Cancel"))
+ if("Yes")
+ dostrip = 1
+ if("Cancel")
+ return
var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in dresspacks
- if (isnull(dresscode))
+ if(isnull(dresscode))
return
-
var/datum/job/jobdatum
- if (dresscode == "as job...")
+ if(dresscode == "as job...")
var/jobname = input("Select job", "Robust quick dress shop") as null|anything in get_all_jobs()
jobdatum = job_master.GetJob(jobname)
- feedback_add_details("admin_verb","SEQ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+ feedback_add_details("admin_verb", "SEQ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
if(dostrip)
- for (var/obj/item/I in M)
- if (istype(I, /obj/item/weapon/implant))
+ for(var/obj/item/I in M)
+ if(istype(I, /obj/item/weapon/implant))
continue
if(istype(I, /obj/item/organ))
continue
qdel(I)
switch(dresscode)
- if ("strip")
+ if("strip")
//do nothing
- if ("as job...")
+ if("as job...")
if(jobdatum)
dresscode = "[jobdatum.title]"
jobdatum.equip(M)
+ equip_special_id(M,jobdatum.access,jobdatum.title, jobdatum.idtype)
- if ("standard space gear")
+ if("standard space gear")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
-
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
var /obj/item/weapon/tank/jetpack/J = new /obj/item/weapon/tank/jetpack/oxygen(M)
M.equip_to_slot_or_del(J, slot_back)
- J.toggle()
+ J.turn_on()
M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask)
J.Topic(null, list("stat" = 1))
- if ("Engineer RIG","CE RIG","Mining RIG","Syndi RIG","Wizard RIG","Medical RIG","Atmos RIG")
+ equip_special_id(M,get_all_accesses(), "Space Explorer", /obj/item/weapon/card/id)
+
+ if("Engineer RIG", "CE RIG", "Mining RIG", "Syndi RIG", "Wizard RIG", "Medical RIG", "Atmos RIG")
if(dresscode=="Engineer RIG")
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig(M), slot_head)
@@ -676,61 +687,53 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/atmos(M), slot_head)
var /obj/item/weapon/tank/jetpack/J = new /obj/item/weapon/tank/jetpack/oxygen(M)
M.equip_to_slot_or_del(J, slot_back)
- J.toggle()
+ J.turn_on()
M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask)
+ equip_special_id(M,get_all_accesses(), "RIG Tester", /obj/item/weapon/card/id)
J.Topic(null, list("stat" = 1))
- if ("tournament standard red","tournament standard green") //we think stunning weapon is too overpowered to use it on tournaments. --rastaf0
- if (dresscode=="tournament standard red")
+ if("tournament standard red", "tournament standard green") //we think stunning weapon is too overpowered to use it on tournaments. --rastaf0
+ if(dresscode=="tournament standard red")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/red(M), slot_w_uniform)
else
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/green(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
-
M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/thunderdome(M), slot_head)
-
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/destroyer(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/smokebomb(M), slot_r_store)
-
- if ("tournament gangster") //gangster are supposed to fight each other. --rastaf0
+ if("tournament gangster") //gangster are supposed to fight each other. --rastaf0
M.equip_to_slot_or_del(new /obj/item/clothing/under/det(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
-
M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_suit(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/head/det_hat(M), slot_head)
-
-
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/proto(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_l_store)
- if ("tournament chef") //Steven Seagal FTW
+ if("tournament chef") //Steven Seagal FTW
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/chef(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(M), slot_head)
-
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/rollingpin(M), slot_r_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_s_store)
- if ("tournament janitor")
+ if("tournament janitor")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
var/obj/item/weapon/storage/backpack/backpack = new(M)
for(var/obj/item/I in backpack)
del(I)
M.equip_to_slot_or_del(backpack, slot_back)
-
M.equip_to_slot_or_del(new /obj/item/weapon/mop(M), slot_r_hand)
var/obj/item/weapon/reagent_containers/glass/bucket/bucket = new(M)
bucket.reagents.add_reagent("water", 70)
M.equip_to_slot_or_del(bucket, slot_l_hand)
-
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
@@ -741,51 +744,61 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/stack/tile/plasteel(M), slot_in_backpack)
- if ("pirate")
+ if("pirate")
M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand)
+ equip_special_id(M,get_all_accesses(), "Pirate", /obj/item/weapon/card/id)
- if ("space pirate")
+ if("space pirate")
M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/pirate(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/pirate(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
-
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand)
+ equip_special_id(M,get_all_accesses(), "Space Pirate", /obj/item/weapon/card/id)
- if ("soviet soldier")
+ if("soviet soldier")
M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head)
+ equip_special_id(M,get_all_accesses(), "Soviet Soldier", /obj/item/weapon/card/id)
- if("tunnel clown")//Tunnel clowns rule!
+ if("tunnel clown")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/clothing/head/chaplain_hood(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/monocle(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/chaplain_hoodie(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_r_store)
-
- var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s ID Card (Tunnel Clown!)"
- W.access = get_all_accesses()
- W.assignment = "Tunnel Clown!"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
-
+ equip_special_id(M,get_all_accesses(), "Tunnel Clown", /obj/item/weapon/card/id)
+ M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
M.equip_to_slot_or_del(fire_axe, slot_r_hand)
+ if("survivor")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
+ equip_special_id(M,get_all_accesses(), "Survivor", /obj/item/weapon/card/id)
+ for(var/obj/item/carried_item in M.contents)
+ if(!istype(carried_item, /obj/item/weapon/implant))
+ carried_item.add_blood(M)
+
if("masked killer")
M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_wear_mask)
@@ -795,46 +808,40 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/knife(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store)
-
+ M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
+ equip_special_id(M,get_all_accesses(), "Masked Killer", /obj/item/weapon/card/id/syndicate, "syndie")
var/obj/item/weapon/twohanded/fireaxe/fire_axe = new(M)
M.equip_to_slot_or_del(fire_axe, slot_r_hand)
-
for(var/obj/item/carried_item in M.contents)
- if(!istype(carried_item, /obj/item/weapon/implant))//If it's not an implant.
+ if(!istype(carried_item, /obj/item/weapon/implant))
carried_item.add_blood(M)//Oh yes, there will be blood...
if("dark lord")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_l_hand)
-
var/obj/item/clothing/head/chaplain_hood/hood = new(M)
hood.name = "dark lord hood"
M.equip_to_slot_or_del(hood, slot_head)
-
var/obj/item/clothing/suit/chaplain_hoodie/robe = new(M)
robe.name = "dark lord robes"
M.equip_to_slot_or_del(robe, slot_wear_suit)
-
- var/obj/item/weapon/card/id/syndicate/W = new(M)
- W.name = "[M.real_name]'s ID Card (Dark Lord)"
- W.icon_state = "syndie"
- W.access = get_all_accesses()
- W.assignment = "Dark Lord"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
+ equip_special_id(M,get_all_accesses(), "Dark Lord", /obj/item/weapon/card/id/syndicate, "syndie")
if("assassin")
M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wcoat(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store)
-
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(M)
for(var/obj/item/briefcase_item in sec_briefcase)
qdel(briefcase_item)
@@ -843,163 +850,236 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
sec_briefcase.contents += new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow
sec_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/mateba
sec_briefcase.contents += new /obj/item/ammo_box/a357
- sec_briefcase.contents += new /obj/item/weapon/c4
+ sec_briefcase.contents += new /obj/item/weapon/grenade/plastic/c4
+ // briefcase must be unlocked by setting the code.
M.equip_to_slot_or_del(sec_briefcase, slot_l_hand)
-
+ var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M)
+ DUST.implant(M)
var/obj/item/device/pda/heads/pda = new(M)
pda.owner = M.real_name
pda.ownjob = "Reaper"
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
-
M.equip_to_slot_or_del(pda, slot_belt)
+ equip_special_id(M,get_all_accesses(), "Reaper", /obj/item/weapon/card/id/syndicate, "syndie")
- var/obj/item/weapon/card/id/syndicate/W = new(M)
- W.name = "[M.real_name]'s ID Card (Reaper)"
- W.icon_state = "syndie"
- W.access = get_all_accesses()
- W.assignment = "Reaper"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
+ if("spy")
+ M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/really_black(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/suppressor(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/chameleon(M), slot_glasses)
+ var/obj/item/clothing/gloves/combat/G = new /obj/item/clothing/gloves/combat(src)
+ G.name = "black gloves"
+ M.equip_to_slot_or_del(G, slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/pen/sleepy(M), slot_r_store)
+ var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M)
+ DUST.implant(M)
+ var/obj/item/weapon/implant/dust/STOR = new /obj/item/weapon/implant/storage(M)
+ STOR.implant(M)
+ var/obj/item/device/pda/heads/pda = new(M)
+ pda.owner = M.real_name
+ pda.ownjob = "Spy"
+ pda.name = "PDA-[M.real_name] ([pda.ownjob])"
+ M.equip_to_slot_or_del(pda, slot_belt)
+ equip_special_id(M,get_all_accesses(), "Spy", /obj/item/weapon/card/id/syndicate, "syndie")
- if("death commando")//Was looking to add this for a while.
+ if("death commando")
M.equip_death_commando()
- if("syndicate commando")
+ if("syndicate agent")
+ M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
+ M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
+ M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/device/flashlight(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/card/emag(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
+ M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
+ equip_special_id(M,get_syndicate_access("Syndicate Operative"), "Syndicate Agent", /obj/item/weapon/card/id/syndicate, "syndie")
+ var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(M)
+ U.hidden_uplink.uplink_owner="[M.key]"
+ U.hidden_uplink.uses = 20
+ M.equip_to_slot_or_del(U, slot_r_store)
+
+ if("syndicate operative")
+ M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
+ M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
+ M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/weapon/gun/projectile/automatic/pistol(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/ammo_box/magazine/m10mm(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/weapon/crowbar/red(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/clothing/glasses/night(M), slot_glasses)
+ M.equip_or_collect(new /obj/item/weapon/storage/belt/military(M), slot_belt)
+ M.equip_or_collect(new /obj/item/weapon/grenade/plastic/c4(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_l_store)
+ M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/device/flashlight(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/clothing/mask/gas/syndicate(M), slot_wear_mask)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/syndi(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/syndi(M), slot_head)
+ var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(M)
+ R.set_frequency(SYND_FREQ)
+ M.equip_to_slot_or_del(R, slot_l_ear)
+ var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(M)
+ U.hidden_uplink.uplink_owner="[M.key]"
+ U.hidden_uplink.uses = 20
+ M.equip_to_slot_or_del(U, slot_r_store)
+ M.equip_or_collect(new /obj/item/weapon/tank/jetpack/oxygen/harness(M), slot_in_backpack)
+ equip_special_id(M,get_syndicate_access("Syndicate Operative"), "Syndicate Operative", /obj/item/weapon/card/id/syndicate, "syndie")
+ var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(M)
+ E.implant(M)
+
+ if("syndicate strike team")
M.equip_syndicate_commando()
- if("nanotrasen officer")
+ if("syndicate officer")
+ M.equip_or_collect(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
+ M.equip_or_collect(new /obj/item/clothing/shoes/combat(M), slot_shoes)
+ M.equip_or_collect(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/pill/initropidril(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/clothing/glasses/thermal(M), slot_glasses)
+ M.equip_or_collect(new /obj/item/weapon/storage/belt/military(M), slot_belt)
+ M.equip_or_collect(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_l_store)
+ M.equip_or_collect(new /obj/item/weapon/reagent_containers/food/snacks/syndidonkpocket(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/clothing/mask/gas/syndicate(M), slot_wear_mask)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/red/strike(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/red/strike(M), slot_head)
+ var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(M)
+ R.set_frequency(SYND_FREQ)
+ M.equip_to_slot_or_del(R, slot_l_ear)
+ var/obj/item/device/radio/uplink/U = new /obj/item/device/radio/uplink(M)
+ U.hidden_uplink.uplink_owner="[M.key]"
+ U.hidden_uplink.uses = 50
+ M.equip_to_slot_or_del(U, slot_r_store)
+ M.equip_or_collect(new /obj/item/weapon/tank/jetpack/oxygen/harness(M), slot_in_backpack)
+ equip_special_id(M,get_all_accesses() + get_syndicate_access("Syndicate Commando"), "Syndicate Officer", /obj/item/weapon/card/id/syndicate, "commander")
+ var/obj/item/weapon/implant/dust/DUST = new /obj/item/weapon/implant/dust(M)
+ DUST.implant(M)
+ if("nt vip guest")
+ M.equip_or_collect(new /obj/item/clothing/under/suit_jacket/really_black(M), slot_w_uniform)
+ M.equip_or_collect(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ M.equip_or_collect(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
+ M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_or_collect(new /obj/item/clothing/head/that(M), slot_head)
+ M.equip_or_collect(new /obj/item/device/radio/headset/ert(M), slot_l_ear)
+ M.equip_or_collect(new /obj/item/device/pda/(M), slot_belt)
+ equip_special_id(M,get_centcom_access("VIP Guest"), "VIP Guest", /obj/item/weapon/card/id/centcom)
+
+ if("nt navy officer")
+ M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/officer(M), slot_w_uniform)
M.equip_or_collect(new /obj/item/clothing/shoes/centcom(M), slot_shoes)
M.equip_or_collect(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
- M.equip_or_collect(new /obj/item/device/radio/headset/heads/captain/alt(M), slot_l_ear)
+ M.equip_or_collect(new /obj/item/device/radio/headset/centcom(M), slot_l_ear)
M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/officer(M), slot_head)
+ M.equip_or_collect(new /obj/item/device/pda/centcom(M), slot_belt)
+ M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
+ M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
+ var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
+ L.imp_in = M
+ L.implanted = 1
+ M.sec_hud_set_implants()
+ equip_special_id(M,get_centcom_access("Nanotrasen Navy Officer"), "Nanotrasen Navy Officer", /obj/item/weapon/card/id/centcom)
- var/obj/item/device/pda/centcom/pda = new(M)
- pda.owner = M.real_name
- pda.ownjob = "Nanotrasen Navy Officer"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
-
- M.equip_or_collect(pda, slot_r_store)
- M.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store)
- M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt)
-
- var/obj/item/weapon/card/id/centcom/W = new(M)
- W.name = "[M.real_name]'s ID Card (Nanotrasen Navy Officer)"
- W.assignment = "Nanotrasen Navy Officer"
- W.access = get_centcom_access(W.assignment)
- W.registered_name = M.real_name
- M.equip_or_collect(W, slot_wear_id)
-
- if("nanotrasen captain")
+ if("nt navy captain")
M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform)
M.equip_or_collect(new /obj/item/clothing/shoes/centcom(M), slot_shoes)
M.equip_or_collect(new /obj/item/clothing/gloves/color/white(M), slot_gloves)
- M.equip_or_collect(new /obj/item/device/radio/headset/heads/captain/alt(M), slot_l_ear)
+ M.equip_or_collect(new /obj/item/device/radio/headset/centcom(M), slot_l_ear)
M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/captain(M), slot_head)
+ M.equip_or_collect(new /obj/item/device/pda/centcom(M), slot_belt)
+ M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
+ M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
+ var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
+ L.imp_in = M
+ L.implanted = 1
+ M.sec_hud_set_implants()
+ equip_special_id(M,get_centcom_access("Nanotrasen Navy Captain"), "Nanotrasen Navy Captain", /obj/item/weapon/card/id/centcom)
- var/obj/item/device/pda/centcom/pda = new(M)
- pda.owner = M.real_name
- pda.ownjob = "Nanotrasen Navy Captain"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
+ if("emergency response team member", "emergency response team leader")
+ var/datum/response_team/equip_team = null
+ switch(alert("Level", "Emergency Response Team", "Amber", "Red", "Gamma"))
+ if("Amber")
+ equip_team = new /datum/response_team/amber
+ if("Red")
+ equip_team = new /datum/response_team/red
+ if("Gamma")
+ equip_team = new /datum/response_team/gamma
+ if(!equip_team)
+ return
+ if(dresscode == "emergency response team leader")
+ equip_team.equip_officer("Commander", M)
+ else
+ switch(alert("Loadout Type", "Emergency Response Team", "Security", "Engineer", "Medic"))
+ if("Commander")
+ equip_team.equip_officer("Commander", M)
+ if("Security")
+ equip_team.equip_officer("Security", M)
+ if("Engineer")
+ equip_team.equip_officer("Engineer", M)
+ if("Medic")
+ equip_team.equip_officer("Medic", M)
+ else
+ to_chat(src, "Invalid ERT Loadout selected")
- M.equip_or_collect(pda, slot_r_store)
- M.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store)
- M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt)
-
- var/obj/item/weapon/card/id/centcom/W = new(M)
- W.name = "[M.real_name]'s ID Card (Nanotrasen Navy Captain)"
- W.access = get_all_accesses()
- W.assignment = "Nanotrasen Navy Captain"
- W.access = get_centcom_access(W.assignment)
- W.registered_name = M.real_name
- M.equip_or_collect(W, slot_wear_id)
-
- if("emergency response team member")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/alt(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert(M), slot_back)
-
- var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s ID Card (Emergency Response Team - Member)"
- W.icon_state = "ERT_empty"
- W.assignment = "Emergency Response Team Member"
- W.access = get_centcom_access(W.assignment)
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
-
- var/obj/item/device/pda/centcom/pda = new(M)
- pda.owner = M.real_name
- pda.ownjob = "Emergency Response Team"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
-
- if("emergency response team leader")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/alt(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/commander(M), slot_back)
-
- var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s ID Card (Emergency Response Team - Leader)"
- W.icon_state = "ERT_leader"
- W.assignment = "Emergency Response Team Leader"
- W.access = get_centcom_access(W.assignment)
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
-
- var/obj/item/device/pda/centcom/pda = new(M)
- pda.owner = M.real_name
- pda.ownjob = "Emergency Response Team Leader"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
-
- if("special ops officer")
+ if("nt special ops officer")
M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate/combat(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset/centcom(src), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head) // job has /obj/item/clothing/head/beret/centcom/officer/navy
+ M.equip_to_slot_or_del(new /obj/item/device/pda/centcom(M), slot_belt)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) // job has /obj/item/clothing/glasses/hud/security/sunglasses
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad/officer(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/alt(src), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_l_store)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
+ equip_special_id(M,get_centcom_access("Special Operations Officer"), "Special Operations Officer", /obj/item/weapon/card/id/centcom)
+ // The following items are unique to this outfit - the special ops officer job does not spawn with them.
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/dualsaber/red(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/pinpointer/advpinpointer(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(src), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/zipties(src), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/syndie/advance(src), slot_in_backpack)
-
-
- var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s ID Card"
- W.icon_state = "commander"
- W.assignment = "Special Operations Officer"
- W.access = get_centcom_access(W.assignment)
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
-
- if("special ops formal")
- M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/alt(src), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/zipties(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/advance(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/implanter/loyalty(M), slot_in_backpack)
+
+ if("nt special ops formal")
+ M.equip_or_collect(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform)
+ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset/centcom(src), slot_l_ear)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/cyber(M), slot_glasses) // special
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/matches(M), slot_r_store)
- M.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_l_store)
+ M.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_in_backpack)
var/obj/item/device/pda/centcom/pda = new(M)
pda.owner = M.real_name
@@ -1008,18 +1088,10 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
pda.desc = "A portable microcomputer by Thinktronic Systems, LTD. This is model is a special edition designed for military field work."
- M.equip_or_collect(pda, slot_wear_pda)
-
- M.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store)
- M.equip_or_collect(new /obj/item/weapon/melee/classic_baton/telescopic(M), slot_r_store)
-
- var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s ID Card (Special Operations Officer)"
- W.icon_state = "commander"
- W.assignment = "Special Operations Officer"
- W.access = get_centcom_access(W.assignment)
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
+ M.equip_or_collect(pda, slot_belt)
+ M.equip_or_collect(new /obj/item/weapon/implanter/dust(M), slot_in_backpack)
+ M.equip_or_collect(new /obj/item/weapon/implanter/death_alarm(M), slot_in_backpack)
+ equip_special_id(M,get_centcom_access("Special Operations Officer"), "Special Operations Officer", /obj/item/weapon/card/id/centcom)
if("singuloth knight")
M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate/combat(M), slot_w_uniform)
@@ -1033,16 +1105,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/claymore/ceremonial(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/tank/oxygen(M), slot_s_store)
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/knighthammer(M), slot_back)
-
-
- var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s ID Card (Singuloth Knight)"
- W.icon_state = "syndie"
- W.access = get_all_accesses()
- W.access += get_all_centcom_access()
- W.assignment = "Singuloth Knight"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
+ equip_special_id(M,get_all_accesses(), "Singuloth Knight", /obj/item/weapon/card/id)
if("blue wizard")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
@@ -1055,6 +1118,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
+ equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id)
if("red wizard")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
@@ -1067,6 +1131,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
+ equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id)
if("marisa wizard")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
@@ -1079,6 +1144,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/twohanded/staff(M), slot_l_hand)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
+ equip_special_id(M,get_all_accesses(), "Wizard", /obj/item/weapon/card/id)
if("soviet admiral")
M.equip_to_slot_or_del(new /obj/item/clothing/head/hgpiratecap(M), slot_head)
@@ -1090,14 +1156,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
- var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s ID Card"
- W.icon_state = "commander"
- W.access = get_all_accesses()
- W.access += get_all_centcom_access()
- W.assignment = "Admiral"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
+ equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Admiral", /obj/item/weapon/card/id, "commander")
+ //W.icon_state = "commander"
if("chrono legionnaire")
M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/chronos(M), slot_head)
@@ -1109,12 +1169,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
M.equip_to_slot_or_del(new /obj/item/weapon/chrono_eraser(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(src), slot_s_store)
- var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s ID Card"
- W.icon_state = "syndie"
- W.assignment = "Chrono Legionnaire"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
+ equip_special_id(M,get_all_accesses() + get_all_centcom_access(), "Chrono Legionnaire", /obj/item/weapon/card/id/syndicate, "syndie")
M.regenerate_icons()
@@ -1122,6 +1177,19 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
message_admins("\blue [key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode].", 1)
return
+/client/proc/equip_special_id(var/mob/living/carbon/human/H, var/list/theaccess = null, var/jobtext, var/obj/item/weapon/card/id/id_type = /obj/item/weapon/card/id, var/special_icon = null)
+ if(!check_rights(R_EVENT))
+ return
+
+ var/obj/item/weapon/card/id/W = new id_type(H)
+ if(special_icon)
+ W.icon_state = special_icon
+ W.name = "[H.real_name]'s ID Card ([jobtext])"
+ W.access = theaccess
+ W.assignment = "[jobtext]"
+ W.registered_name = H.real_name
+ H.equip_to_slot_or_del(W, slot_wear_id)
+
/client/proc/startSinglo()
set category = "Debug"
set name = "Start Singularity"
diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm
index 70505b8abdf..9b9a7c6caae 100644
--- a/code/modules/admin/verbs/diagnostics.dm
+++ b/code/modules/admin/verbs/diagnostics.dm
@@ -83,20 +83,20 @@
"_default" = "NO_FILTER"
)
var/output = "Radio Report "
- for (var/fq in radio_controller.frequencies)
+ for(var/fq in radio_controller.frequencies)
output += "Freq: [fq] "
var/list/datum/radio_frequency/fqs = radio_controller.frequencies[fq]
- if (!fqs)
+ if(!fqs)
output += " ERROR "
continue
- for (var/filter in fqs.devices)
+ for(var/filter in fqs.devices)
var/list/f = fqs.devices[filter]
- if (!f)
+ if(!f)
output += " [filters[filter]]: ERROR "
continue
output += " [filters[filter]]: [f.len] "
- for (var/device in f)
- if (isobj(device))
+ for(var/device in f)
+ if(isobj(device))
output += " [device] ([device:x],[device:y],[device:z] in area [get_area(device:loc)]) "
else
output += " [device] "
diff --git a/code/modules/admin/verbs/freeze.dm b/code/modules/admin/verbs/freeze.dm
index f6d31d6bede..3537dd3d6df 100644
--- a/code/modules/admin/verbs/freeze.dm
+++ b/code/modules/admin/verbs/freeze.dm
@@ -93,7 +93,7 @@ var/global/list/frozen_mob_list = list()
return
else
if(usr)
- if (usr.client)
+ if(usr.client)
if(usr.client.holder)
var/adminomaly = new/obj/effect/overlay/adminoverlay
if(M.can_move == 1)
diff --git a/code/modules/admin/verbs/honksquad.dm b/code/modules/admin/verbs/honksquad.dm
index dd37a828302..0833ccdb669 100644
--- a/code/modules/admin/verbs/honksquad.dm
+++ b/code/modules/admin/verbs/honksquad.dm
@@ -50,7 +50,7 @@ var/global/sent_honksquad = 0
//Spawns HONKsquad and equips them.
for(var/obj/effect/landmark/L in landmarks_list)
if(honksquad_number<=0) break
- if (L.name == "HONKsquad")
+ if(L.name == "HONKsquad")
honk_leader_selected = honksquad_number == 1?1:0
var/mob/living/carbon/human/new_honksquad = create_honksquad(L, honk_leader_selected)
@@ -59,7 +59,7 @@ var/global/sent_honksquad = 0
new_honksquad.key = pick(commandos)
commandos -= new_honksquad.key
new_honksquad.internal = new_honksquad.s_store
- new_honksquad.internals.icon_state = "internal1"
+ new_honksquad.update_internals_hud_icon(1)
//So they don't forget their code or mission.
new_honksquad.mind.store_memory("Mission: \red [input].")
@@ -111,7 +111,7 @@ var/global/sent_honksquad = 0
equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(src), slot_w_uniform)
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(src), slot_shoes)
- equip_to_slot_or_del(new /obj/item/device/pda/clown(src), slot_wear_pda)
+ equip_to_slot_or_del(new /obj/item/device/pda/clown(src), slot_belt)
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/food/snacks/grown/banana(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/bikehorn(src), slot_in_backpack)
diff --git a/code/modules/admin/verbs/map_template_loadverb.dm b/code/modules/admin/verbs/map_template_loadverb.dm
index fc010de8a43..f447810d860 100644
--- a/code/modules/admin/verbs/map_template_loadverb.dm
+++ b/code/modules/admin/verbs/map_template_loadverb.dm
@@ -1,10 +1,9 @@
/client/proc/map_template_load()
set category = "Debug"
- set name = "Map Template - Place"
+ set name = "Map template - Place"
if(!holder)
return
-
var/datum/map_template/template
var/map = input(usr, "Choose a Map Template to place at your CURRENT LOCATION","Place Map Template") as null|anything in map_templates
@@ -16,22 +15,27 @@
if(!T)
return
+ if(!template.fits_in_map_bounds(T, centered = TRUE))
+ to_chat(usr, "Map is too large to fit in bounds. Map's dimensions: ([template.width], [template.height])")
+ return
+
var/list/preview = list()
for(var/S in template.get_affected_turfs(T,centered = TRUE))
preview += image('icons/turf/overlays.dmi',S,"greenOverlay")
usr.client.images += preview
if(alert(usr,"Confirm location.","Template Confirm","Yes","No") == "Yes")
- template.load(T, centered = TRUE)
- message_admins("[key_name_admin(usr)] has placed a map template ([template.name]) at (JMP) ")
+ var/timer = start_watch()
+ message_admins("[key_name_admin(usr)] has started to place the map template ([template.name]) at (JMP) ")
+ if(template.load(T, centered = TRUE))
+ message_admins("[key_name_admin(usr)] has placed a map template ([template.name]) at (JMP) . Took [stop_watch(timer)]s. ")
+ else
+ to_chat(usr, "Failed to place map")
usr.client.images -= preview
/client/proc/map_template_upload()
set category = "Debug"
set name = "Map Template - Upload"
- if(!holder)
- return
-
var/map = input(usr, "Choose a Map Template to upload to template storage","Upload Map Template") as null|file
if(!map)
return
@@ -39,7 +43,12 @@
to_chat(usr, "Bad map file: [map]")
return
+ var/timer = start_watch()
+ message_admins("[key_name_admin(usr)] has begun uploading a map template ([map]) ")
var/datum/map_template/M = new(map=map, rename="[map]")
- M.preload_size(map)
- map_templates[M.name] = M
- message_admins("[key_name_admin(usr)] has uploaded a map template ([map])")
+ if(M.preload_size(map))
+ to_chat(usr, "Map template '[map]' ready to place ([M.width]x[M.height])")
+ map_templates[M.name] = M
+ message_admins("[key_name_admin(usr)] has uploaded a map template ([map]). Took [stop_watch(timer)]s. ")
+ else
+ to_chat(usr, "Map template '[map]' failed to load properly")
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index c59cd417c91..6578898a0bd 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -86,7 +86,7 @@ var/intercom_range_display_status = 0
if(!(locate(/obj/structure/grille,T)))
var/window_check = 0
for(var/obj/structure/window/W in T)
- if (W.dir == turn(C1.dir,180) || W.is_fulltile() )
+ if(W.dir == turn(C1.dir,180) || W.is_fulltile() )
window_check = 1
break
if(!window_check)
@@ -115,7 +115,7 @@ var/intercom_range_display_status = 0
for(var/obj/item/device/radio/intercom/I in world)
for(var/turf/T in orange(7,I))
var/obj/effect/debugging/marker/F = new/obj/effect/debugging/marker(T)
- if (!(F in view(7,I.loc)))
+ if(!(F in view(7,I.loc)))
qdel(F)
feedback_add_details("admin_verb","mIRD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/verbs/massmodvar.dm
index 185d513d2fc..c416f224cf9 100644
--- a/code/modules/admin/verbs/massmodvar.dm
+++ b/code/modules/admin/verbs/massmodvar.dm
@@ -34,7 +34,7 @@
return
var/list/names = list()
- for (var/V in O.vars)
+ for(var/V in O.vars)
names += V
names = sortList(names)
@@ -72,7 +72,7 @@
else if(isicon(var_value))
to_chat(usr, "Variable appears to be ICON .")
- var_value = "\icon[var_value]"
+ var_value = "[bicon(var_value)]"
default = "icon"
else if(istype(var_value,/atom) || istype(var_value,/datum))
@@ -123,7 +123,7 @@
var/original_name
- if (!istype(O, /atom))
+ if(!istype(O, /atom))
original_name = "\ref[O] ([O])"
else
original_name = O:name
@@ -135,33 +135,33 @@
if(method)
if(istype(O, /mob))
for(var/mob/M in mob_list)
- if ( istype(M , O.type) )
+ if( istype(M , O.type) )
M.vars[variable] = O.vars[variable]
else if(istype(O, /obj))
for(var/obj/A in world)
- if ( istype(A , O.type) )
+ if( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
for(var/turf/A in world)
- if ( istype(A , O.type) )
+ if( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
else
if(istype(O, /mob))
for(var/mob/M in mob_list)
- if (M.type == O.type)
+ if(M.type == O.type)
M.vars[variable] = O.vars[variable]
else if(istype(O, /obj))
for(var/obj/A in world)
- if (A.type == O.type)
+ if(A.type == O.type)
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
for(var/turf/A in world)
- if (A.type == O.type)
+ if(A.type == O.type)
A.vars[variable] = O.vars[variable]
if("edit referenced object")
@@ -175,32 +175,32 @@
if(method)
if(istype(O, /mob))
for(var/mob/M in mob_list)
- if ( istype(M , O.type) )
+ if( istype(M , O.type) )
M.vars[variable] = O.vars[variable]
else if(istype(O, /obj))
for(var/obj/A in world)
- if ( istype(A , O.type) )
+ if( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
for(var/turf/A in world)
- if ( istype(A , O.type) )
+ if( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
else
if(istype(O, /mob))
for(var/mob/M in mob_list)
- if (M.type == O.type)
+ if(M.type == O.type)
M.vars[variable] = O.vars[variable]
else if(istype(O, /obj))
for(var/obj/A in world)
- if (A.type == O.type)
+ if(A.type == O.type)
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
for(var/turf/A in world)
- if (A.type == O.type)
+ if(A.type == O.type)
A.vars[variable] = O.vars[variable]
if("num")
@@ -216,7 +216,7 @@
if(method)
if(istype(O, /mob))
for(var/mob/M in mob_list)
- if ( istype(M , O.type) )
+ if( istype(M , O.type) )
if(variable=="light_range")
M.set_light(new_value)
else
@@ -224,7 +224,7 @@
else if(istype(O, /obj))
for(var/obj/A in world)
- if ( istype(A , O.type) )
+ if( istype(A , O.type) )
if(variable=="light_range")
A.set_light(new_value)
else
@@ -232,7 +232,7 @@
else if(istype(O, /turf))
for(var/turf/A in world)
- if ( istype(A , O.type) )
+ if( istype(A , O.type) )
if(variable=="light_range")
A.set_light(new_value)
else
@@ -241,7 +241,7 @@
else
if(istype(O, /mob))
for(var/mob/M in mob_list)
- if (M.type == O.type)
+ if(M.type == O.type)
if(variable=="light_range")
M.set_light(new_value)
else
@@ -249,7 +249,7 @@
else if(istype(O, /obj))
for(var/obj/A in world)
- if (A.type == O.type)
+ if(A.type == O.type)
if(variable=="light_range")
A.set_light(new_value)
else
@@ -257,7 +257,7 @@
else if(istype(O, /turf))
for(var/turf/A in world)
- if (A.type == O.type)
+ if(A.type == O.type)
if(variable=="light_range")
A.set_light(new_value)
else
@@ -271,32 +271,32 @@
if(method)
if(istype(O, /mob))
for(var/mob/M in mob_list)
- if ( istype(M , O.type) )
+ if( istype(M , O.type) )
M.vars[variable] = O.vars[variable]
else if(istype(O, /obj))
for(var/obj/A in world)
- if ( istype(A , O.type) )
+ if( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
for(var/turf/A in world)
- if ( istype(A , O.type) )
+ if( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
else
if(istype(O, /mob))
for(var/mob/M in mob_list)
- if (M.type == O.type)
+ if(M.type == O.type)
M.vars[variable] = O.vars[variable]
else if(istype(O, /obj))
for(var/obj/A in world)
- if (A.type == O.type)
+ if(A.type == O.type)
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
for(var/turf/A in world)
- if (A.type == O.type)
+ if(A.type == O.type)
A.vars[variable] = O.vars[variable]
if("file")
@@ -307,32 +307,32 @@
if(method)
if(istype(O, /mob))
for(var/mob/M in mob_list)
- if ( istype(M , O.type) )
+ if( istype(M , O.type) )
M.vars[variable] = O.vars[variable]
else if(istype(O.type, /obj))
for(var/obj/A in world)
- if ( istype(A , O.type) )
+ if( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
else if(istype(O.type, /turf))
for(var/turf/A in world)
- if ( istype(A , O.type) )
+ if( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
else
if(istype(O, /mob))
for(var/mob/M in mob_list)
- if (M.type == O.type)
+ if(M.type == O.type)
M.vars[variable] = O.vars[variable]
else if(istype(O.type, /obj))
for(var/obj/A in world)
- if (A.type == O.type)
+ if(A.type == O.type)
A.vars[variable] = O.vars[variable]
else if(istype(O.type, /turf))
for(var/turf/A in world)
- if (A.type == O.type)
+ if(A.type == O.type)
A.vars[variable] = O.vars[variable]
if("icon")
@@ -342,33 +342,33 @@
if(method)
if(istype(O, /mob))
for(var/mob/M in mob_list)
- if ( istype(M , O.type) )
+ if( istype(M , O.type) )
M.vars[variable] = O.vars[variable]
else if(istype(O, /obj))
for(var/obj/A in world)
- if ( istype(A , O.type) )
+ if( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
for(var/turf/A in world)
- if ( istype(A , O.type) )
+ if( istype(A , O.type) )
A.vars[variable] = O.vars[variable]
else
if(istype(O, /mob))
for(var/mob/M in mob_list)
- if (M.type == O.type)
+ if(M.type == O.type)
M.vars[variable] = O.vars[variable]
else if(istype(O, /obj))
for(var/obj/A in world)
- if (A.type == O.type)
+ if(A.type == O.type)
A.vars[variable] = O.vars[variable]
else if(istype(O, /turf))
for(var/turf/A in world)
- if (A.type == O.type)
+ if(A.type == O.type)
A.vars[variable] = O.vars[variable]
log_admin("[key_name(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]")
diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm
index 966e584f15e..0be55889bc2 100644
--- a/code/modules/admin/verbs/modifyvariables.dm
+++ b/code/modules/admin/verbs/modifyvariables.dm
@@ -17,7 +17,7 @@ var/list/forbidden_varedit_object_types = list(
set category = "Debug"
set name = "Edit Ticker Variables"
- if (ticker == null)
+ if(ticker == null)
to_chat(src, "Game hasn't started yet.")
else
src.modify_variables(ticker)
@@ -308,7 +308,7 @@ var/list/forbidden_varedit_object_types = list(
else
var/list/names = list()
- for (var/V in O.vars)
+ for(var/V in O.vars)
names += V
names = sortList(names)
@@ -328,7 +328,7 @@ var/list/forbidden_varedit_object_types = list(
if(default == "num")
dir = 1
else if(default == "icon")
- var_value = "\icon[var_value]"
+ var_value = "[bicon(var_value)]"
to_chat(usr, "Variable contains: [var_value]")
if(dir)
@@ -347,7 +347,7 @@ var/list/forbidden_varedit_object_types = list(
var/original_name
- if (!istype(O, /atom))
+ if(!istype(O, /atom))
original_name = "\ref[O] ([O])"
else
original_name = O:name
@@ -465,7 +465,7 @@ var/list/forbidden_varedit_object_types = list(
else if(isicon(variable))
to_chat(usr, "Variable appears to be ICON .")
- variable = "\icon[variable]"
+ variable = "[bicon(variable)]"
class = "icon"
else if(istype(variable,/matrix))
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index c4c09197d4e..997f33fd137 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -62,7 +62,7 @@ client/proc/one_click_antag()
if(player_old_enough_antag(applicant.client,ROLE_TRAITOR))
if(!applicant.stat)
if(applicant.mind)
- if (!applicant.mind.special_role)
+ if(!applicant.mind.special_role)
if(!jobban_isbanned(applicant, "traitor") && !jobban_isbanned(applicant, "Syndicate"))
if(!(applicant.mind.assigned_role in temp.restricted_jobs))
if(!(applicant.client.prefs.species in temp.protected_species))
@@ -96,7 +96,7 @@ client/proc/one_click_antag()
if(player_old_enough_antag(applicant.client,ROLE_CHANGELING))
if(!applicant.stat)
if(applicant.mind)
- if (!applicant.mind.special_role)
+ if(!applicant.mind.special_role)
if(!jobban_isbanned(applicant, "changeling") && !jobban_isbanned(applicant, "Syndicate"))
if(!(applicant.mind.assigned_role in temp.restricted_jobs))
if(!(applicant.client.prefs.species in temp.protected_species))
@@ -276,13 +276,13 @@ client/proc/one_click_antag()
if(closet_spawn)
new /obj/structure/closet/syndicate/nuclear(closet_spawn.loc)
- for (var/obj/effect/landmark/A in /area/syndicate_station/start)//Because that's the only place it can BE -Sieve
- if (A.name == "Syndicate-Gear-Closet")
+ for(var/obj/effect/landmark/A in /area/syndicate_station/start)//Because that's the only place it can BE -Sieve
+ if(A.name == "Syndicate-Gear-Closet")
new /obj/structure/closet/syndicate/personal(A.loc)
qdel(A)
continue
- if (A.name == "Syndicate-Bomb")
+ if(A.name == "Syndicate-Bomb")
new /obj/effect/spawner/newbomb/timer/syndicate(A.loc)
qdel(A)
continue
@@ -302,7 +302,7 @@ client/proc/one_click_antag()
var/I = image('icons/mob/mob.dmi', loc = synd_mind_1.current, icon_state = "synd")
synd_mind.current.client.images += I
- for (var/obj/machinery/nuclearbomb/bomb in world)
+ for(var/obj/machinery/nuclearbomb/bomb in world)
bomb.r_code = nuke_code // All the nukes are set to this code.
return 1
@@ -355,10 +355,10 @@ client/proc/one_click_antag()
if(candidates.len)
var/numagents = 6
//Spawns commandos and equips them.
- for (var/obj/effect/landmark/L in /area/syndicate_mothership/elite_squad)
+ for(var/obj/effect/landmark/L in /area/syndicate_mothership/elite_squad)
if(numagents<=0)
break
- if (L.name == "Syndicate-Commando")
+ if(L.name == "Syndicate-Commando")
syndicate_leader_selected = numagents == 1?1:0
var/mob/living/carbon/human/new_syndicate_commando = create_syndicate_death_commando(L, syndicate_leader_selected)
@@ -374,7 +374,7 @@ client/proc/one_click_antag()
new_syndicate_commando.key = theghost.key
new_syndicate_commando.internal = new_syndicate_commando.s_store
- new_syndicate_commando.internals.icon_state = "internal1"
+ new_syndicate_commando.update_internals_hud_icon(1)
//So they don't forget their code or mission.
@@ -385,8 +385,8 @@ client/proc/one_click_antag()
if(numagents >= 6)
return 0
- for (var/obj/effect/landmark/L in /area/shuttle/syndicate_elite)
- if (L.name == "Syndicate-Commando-Bomb")
+ for(var/obj/effect/landmark/L in /area/shuttle/syndicate_elite)
+ if(L.name == "Syndicate-Commando-Bomb")
new /obj/effect/spawner/newbomb/timer/syndicate(L.loc)
return 1
@@ -468,7 +468,7 @@ client/proc/one_click_antag()
var/max_raiders = 1
var/raiders = max_raiders
//Spawns vox raiders and equips them.
- for (var/obj/effect/landmark/L in world)
+ for(var/obj/effect/landmark/L in world)
if(L.name == "voxstart")
if(raiders<=0)
break
@@ -550,7 +550,7 @@ client/proc/one_click_antag()
if(player_old_enough_antag(applicant.client,ROLE_VAMPIRE))
if(!applicant.stat)
if(applicant.mind)
- if (!applicant.mind.special_role)
+ if(!applicant.mind.special_role)
if(!jobban_isbanned(applicant, "vampire") && !jobban_isbanned(applicant, "Syndicate"))
if(!(applicant.job in temp.restricted_jobs))
if(!(applicant.client.prefs.species in temp.protected_species))
@@ -599,7 +599,7 @@ client/proc/one_click_antag()
var/teamOneMembers = 5
var/teamTwoMembers = 5
var/datum/preferences/A = new()
- for (var/obj/effect/landmark/L in world)
+ for(var/obj/effect/landmark/L in world)
if(L.name == "tdome1")
if(teamOneMembers<=0)
break
diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm
index 4eeab674a88..6723299c5a8 100644
--- a/code/modules/admin/verbs/onlyone.dm
+++ b/code/modules/admin/verbs/onlyone.dm
@@ -27,8 +27,8 @@
to_chat(H, "Objective #[obj_count] : [OBJ.explanation_text]")
obj_count++
- for (var/obj/item/I in H)
- if (istype(I, /obj/item/weapon/implant))
+ for(var/obj/item/I in H)
+ if(istype(I, /obj/item/weapon/implant))
continue
if(istype(I, /obj/item/organ))
continue
@@ -55,7 +55,7 @@
message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ONE! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1)
log_admin("[key_name(usr)] used there can be only one.")
nologevent = 1
- to_chat(world, sound('sound/music/THUNDERDOME.ogg'))
+ world << sound('sound/music/THUNDERDOME.ogg')
/client/proc/only_me()
if(!ticker)
@@ -101,4 +101,4 @@
message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ME! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1)
log_admin("[key_name(usr)] used there can be only me.")
nologevent = 1
- to_chat(world, sound('sound/music/THUNDERDOME.ogg'))
+ world << sound('sound/music/THUNDERDOME.ogg')
diff --git a/code/modules/admin/verbs/onlyoneteam.dm b/code/modules/admin/verbs/onlyoneteam.dm
index 5072b43383e..a88270077d6 100644
--- a/code/modules/admin/verbs/onlyoneteam.dm
+++ b/code/modules/admin/verbs/onlyoneteam.dm
@@ -15,8 +15,8 @@
var/datum/preferences/A = new() // Randomize appearance
A.copy_to(H)
- for (var/obj/item/I in H)
- if (istype(I, /obj/item/weapon/implant))
+ for(var/obj/item/I in H)
+ if(istype(I, /obj/item/weapon/implant))
continue
if(istype (I, /obj/item/organ))
continue
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index 170d96754ea..c35b4d7596e 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -13,7 +13,7 @@
return
var/image/cross = image('icons/obj/storage.dmi',"bible")
- msg = "\blue \icon[cross] PRAY: [key_name(src, 1)] (? ) (PP ) (VV ) (SM ) ([admin_jump_link(src, "holder")]) (CA ) (SC ): [msg]"
+ msg = "\blue [bicon(cross)] PRAY: [key_name(src, 1)] (? ) (PP ) (VV ) (SM ) ([admin_jump_link(src, "holder")]) (CA ) (SC ): [msg]"
for(var/client/X in admins)
if(check_rights(R_EVENT,0,X.mob))
@@ -50,9 +50,11 @@
if(X.prefs.sound & SOUND_ADMINHELP)
X << 'sound/effects/adminhelp.ogg'
-/proc/ERT_Announce(var/text , var/mob/Sender)
+/proc/ERT_Announce(var/text , var/mob/Sender, var/repeat_warning)
var/msg = sanitize(copytext(text, 1, MAX_MESSAGE_LEN))
- msg = "\blue ERT REQUEST: [key_name(Sender, 1)] (PP ) (VV ) (SM ) ([admin_jump_link(Sender, "holder")]) (CA ) (BSA ) (REPLY ): [msg]"
+ msg = "ERT REQUEST: [key_name(Sender, 1)] (PP ) (VV ) (SM ) ([admin_jump_link(Sender, "holder")]) (CA ) (BSA ) (RESPOND ): [msg] "
+ if(repeat_warning)
+ msg += "WARNING: ERT request has gone 5 minutes with no reply! "
for(var/client/X in admins)
if(check_rights(R_EVENT,0,X.mob))
to_chat(X, msg)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index c236432e9d2..c44ff5c1af6 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -23,7 +23,7 @@
if(!check_rights(R_ADMIN))
return
- if (ismob(M))
+ if(ismob(M))
if(istype(M, /mob/living/silicon/ai))
alert("The AI can't be sent to prison you jerk!", null, null, null, null, null)
return
@@ -56,10 +56,10 @@
var/msg = input("Message:", text("Subtle PM to [M.key]")) as text
- if (!msg)
+ if(!msg)
return
if(usr)
- if (usr.client)
+ if(usr.client)
if(usr.client.holder)
to_chat(M, "\bold You hear a voice in your head... \italic [msg]")
@@ -108,7 +108,7 @@
var/msg = input("Message:", text("Enter the text you wish to appear to everyone:")) as text
- if (!msg)
+ if(!msg)
return
to_chat(world, "[msg]")
log_admin("GlobalNarrate: [key_name(usr)] : [msg]")
@@ -407,7 +407,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if("Death Commando")//Leaves them at late-join spawn.
new_character.equip_death_commando()
new_character.internal = new_character.s_store
- new_character.internals.icon_state = "internal1"
+ new_character.update_internals_hud_icon(1)
else//They may also be a cyborg or AI.
switch(new_character.mind.assigned_role)
if("Cyborg")//More rigging to make em' work and check if they're traitor.
@@ -561,7 +561,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if("No")
to_chat(world, "\red [from] available at all communications consoles.")
- for (var/obj/machinery/computer/communications/C in machines)
+ for(var/obj/machinery/computer/communications/C in machines)
if(! (C.stat & (BROKEN|NOPOWER) ) )
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc )
P.name = "[from]"
@@ -581,7 +581,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if("No")
to_chat(world, "\red New Nanotrasen Update available at all communication consoles.")
- for (var/obj/machinery/computer/communications/C in machines)
+ for(var/obj/machinery/computer/communications/C in machines)
if(! (C.stat & (BROKEN|NOPOWER) ) )
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc )
P.name = "'[command_name()] Update.'"
@@ -590,7 +590,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
C.messagetitle.Add("[command_name()] Update")
C.messagetext.Add(P.info)
-// to_chat(world, sound('sound/AI/commandreport.ogg'))
+// world << sound('sound/AI/commandreport.ogg')
log_admin("[key_name(src)] has created a communications report: [input]")
message_admins("[key_name_admin(src)] has created a communications report", 1)
feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -603,7 +603,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(!check_rights(R_ADMIN))
return
- if (alert(src, "Are you sure you want to delete:\n[O]\nat ([O.x], [O.y], [O.z])?", "Confirmation", "Yes", "No") == "Yes")
+ if(alert(src, "Are you sure you want to delete:\n[O]\nat ([O.x], [O.y], [O.z])?", "Confirmation", "Yes", "No") == "Yes")
log_admin("[key_name(usr)] deleted [O] at ([O.x],[O.y],[O.z])")
message_admins("[key_name_admin(usr)] deleted [O] at ([O.x],[O.y],[O.z])", 1)
feedback_add_details("admin_verb","DEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -643,9 +643,9 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/flames = input("Range of flames. -1 to none", text("Input")) as num|null
if(flames == null) return
- if ((devastation != -1) || (heavy != -1) || (light != -1) || (flash != -1) || (flames != -1))
- if ((devastation > 20) || (heavy > 20) || (light > 20) || (flames > 20))
- if (alert(src, "Are you sure you want to do this? It will laaag.", "Confirmation", "Yes", "No") == "No")
+ if((devastation != -1) || (heavy != -1) || (light != -1) || (flash != -1) || (flames != -1))
+ if((devastation > 20) || (heavy > 20) || (light > 20) || (flames > 20))
+ if(alert(src, "Are you sure you want to do this? It will laaag.", "Confirmation", "Yes", "No") == "No")
return
explosion(O, devastation, heavy, light, flash, null, null,flames)
@@ -668,7 +668,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/light = input("Range of light pulse.", text("Input")) as num|null
if(light == null) return
- if (heavy || light)
+ if(heavy || light)
empulse(O, heavy, light)
log_admin("[key_name(usr)] created an EM pulse ([heavy], [light]) at ([O.x],[O.y],[O.z])")
@@ -710,7 +710,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
if(confirm == "Yes")
- if (istype(mob, /mob/dead/observer)) // so they don't spam gibs everywhere
+ if(istype(mob, /mob/dead/observer)) // so they don't spam gibs everywhere
return
else
mob.gib()
@@ -791,7 +791,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set category = "Admin"
set name = "Toggle Deny Shuttle"
- if (!ticker)
+ if(!ticker)
return
if(!check_rights(R_ADMIN))
@@ -824,7 +824,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(!check_rights(R_SERVER|R_EVENT))
return
- if (ticker && ticker.mode)
+ if(ticker && ticker.mode)
to_chat(usr, "Nope you can't do this, the game's already started. This only works before rounds!")
return
@@ -868,6 +868,30 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("Admin [key_name_admin(usr)] has disabled random events.", 1)
feedback_add_details("admin_verb","TRE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/client/proc/reset_all_tcs()
+ set category = "Admin"
+ set name = "Reset Telecomms Scripts"
+ set desc = "Blanks all telecomms scripts from all telecomms servers"
+
+ if(!holder || !holder.rights || !holder.rights & R_ADMIN)
+ to_chat(usr, "Admin only. ")
+ return
+
+ var/confirm = alert(src, "You sure you want to blank all NTSL scripts?", "Confirm", "Yes", "No")
+ if(confirm != "Yes")
+ return
+
+ for(var/obj/machinery/telecomms/server/S in telecomms_list)
+ var/datum/TCS_Compiler/C = S.Compiler
+ S.rawcode = ""
+ C.Compile("")
+ for(var/obj/machinery/computer/telecomms/traffic/T in machines)
+ T.storedcode = ""
+ log_admin("[key_name(usr)] blanked all telecomms scripts.")
+ message_admins("[key_name_admin(usr)] blanked all telecomms scripts.")
+ feedback_add_details("admin_verb","RAT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+
/client/proc/toggle_ert_calling()
set category = "Event"
set name = "Toggle ERT"
@@ -886,4 +910,3 @@ Traitors and the like can also be revived with the previous role mostly intact.
to_chat(usr, "\red ERT has been Disabled .")
log_admin("Admin [key_name(src)] has disabled ERT calling.")
message_admins("Admin [key_name_admin(usr)] has disabled ERT calling.", 1)
-
diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm
index 142bb8203cd..e76545f4748 100644
--- a/code/modules/admin/verbs/striketeam.dm
+++ b/code/modules/admin/verbs/striketeam.dm
@@ -55,7 +55,7 @@ var/global/sent_strike_team = 0
//Spawns commandos and equips them.
for(var/obj/effect/landmark/L in landmarks_list)
if(commando_number<=0) break
- if (L.name == "Commando")
+ if(L.name == "Commando")
leader_selected = commando_number == 1?1:0
var/mob/living/carbon/human/new_commando = create_death_commando(L, leader_selected)
@@ -64,7 +64,7 @@ var/global/sent_strike_team = 0
new_commando.key = pick(commandos)
commandos -= new_commando.key
new_commando.internal = new_commando.s_store
- new_commando.internals.icon_state = "internal1"
+ new_commando.update_internals_hud_icon(1)
//So they don't forget their code or mission.
if(nuke_code)
@@ -76,8 +76,8 @@ var/global/sent_strike_team = 0
commando_number--
//Spawns the rest of the commando gear.
- for (var/obj/effect/landmark/L in landmarks_list)
- if (L.name == "Commando_Manual")
+ for(var/obj/effect/landmark/L in landmarks_list)
+ if(L.name == "Commando_Manual")
//new /obj/item/weapon/gun/energy/pulse_rifle(L.loc)
var/obj/item/weapon/paper/P = new(L.loc)
P.info = "Good morning soldier! . This compact guide will familiarize you with standard operating procedure. There are three basic rules to follow: #1 Work as a team. #2 Accomplish your objective at all costs. #3 Leave no witnesses. You are fully equipped and stocked for your mission--before departing on the Spec. Ops. Shuttle due South, make sure that all operatives are ready. Actual mission objective will be relayed to you by Central Command through your headsets. If deemed appropriate, Central Command will also allow members of your team to equip assault power-armor for the mission. You will find the armor storage due West of your position. Once you are ready to leave, utilize the Special Operations shuttle console and toggle the hull doors via the other console.
In the event that the team does not accomplish their assigned objective in a timely manner, or finds no other way to do so, attached below are instructions on how to operate a Nanotrasen Nuclear Device. Your operations LEADER is provided with a nuclear authentication disk and a pin-pointer for this reason. You may easily recognize them by their rank: Lieutenant, Captain, or Major. The nuclear device itself will be present somewhere on your destination.
Hello and thank you for choosing Nanotrasen for your nuclear information needs. Today's crash course will deal with the operation of a Fission Class Nanotrasen made Nuclear Device. First and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE. Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done to unbolt it one must completely log in which at this time may not be possible. To make the device functional: #1 Place bomb in designated detonation zone #2 Extend and anchor bomb (attack with hand). #3 Insert Nuclear Auth. Disk into slot. #4 Type numeric code into keypad ([nuke_code]). Note: If you make a mistake press R to reset the device. #5 Press the E button to log onto the device. You now have activated the device. To deactivate the buttons at anytime, for example when you have already prepped the bomb for detonation, remove the authentication disk OR press the R on the keypad. Now the bomb CAN ONLY be detonated using the timer. A manual detonation is not an option. Note: Toggle off the SAFETY . Use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate. Note: THE BOMB IS STILL SET AND WILL DETONATE Now before you remove the disk if you need to move the bomb you can: Toggle off the anchor, move it, and re-anchor.
The nuclear authorization code is: [nuke_code ? nuke_code : "None provided"]
Good luck, soldier!
"
@@ -87,8 +87,8 @@ var/global/sent_strike_team = 0
P.stamp(stamp)
qdel(stamp)
- for (var/obj/effect/landmark/L in landmarks_list)
- if (L.name == "Commando-Bomb")
+ for(var/obj/effect/landmark/L in landmarks_list)
+ if(L.name == "Commando-Bomb")
new /obj/effect/spawner/newbomb/timer/syndicate(L.loc)
qdel(L)
@@ -125,7 +125,7 @@ var/global/sent_strike_team = 0
var/obj/item/device/radio/R = new /obj/item/device/radio/headset/alt(src)
R.set_frequency(DTH_FREQ)
equip_to_slot_or_del(R, slot_l_ear)
- if (leader_selected == 0)
+ if(leader_selected == 0)
equip_to_slot_or_del(new /obj/item/clothing/under/color/green(src), slot_w_uniform)
else
equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(src), slot_w_uniform)
@@ -143,8 +143,8 @@ var/global/sent_strike_team = 0
equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_in_backpack)
- if (!leader_selected)
- equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_in_backpack)
+ if(!leader_selected)
+ equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/x4(src), slot_in_backpack)
else
equip_to_slot_or_del(new /obj/item/weapon/pinpointer(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/disk/nuclear(src), slot_in_backpack)
diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm
index 054b5469d9b..3669ba2ba13 100644
--- a/code/modules/admin/verbs/striketeam_syndicate.dm
+++ b/code/modules/admin/verbs/striketeam_syndicate.dm
@@ -32,7 +32,7 @@ var/global/sent_syndicate_strike_team = 0
sent_syndicate_strike_team = 1
- //if (emergency_shuttle.can_recall())
+ //if(emergency_shuttle.can_recall())
// emergency_shuttle.recall() //why, exactly? Admins can do this themselves.
var/syndicate_commando_number = syndicate_commandos_possible //for selecting a leader
@@ -62,7 +62,7 @@ var/global/sent_syndicate_strike_team = 0
//Spawns commandos and equips them.
for(var/obj/effect/landmark/L in landmarks_list)
if(syndicate_commando_number<=0) break
- if (L.name == "Syndicate-Commando")
+ if(L.name == "Syndicate-Commando")
syndicate_leader_selected = syndicate_commando_number == 1?1:0
var/mob/living/carbon/human/new_syndicate_commando = create_syndicate_death_commando(L, syndicate_leader_selected)
@@ -71,7 +71,7 @@ var/global/sent_syndicate_strike_team = 0
new_syndicate_commando.key = pick(commandos)
commandos -= new_syndicate_commando.key
new_syndicate_commando.internal = new_syndicate_commando.s_store
- new_syndicate_commando.internals.icon_state = "internal1"
+ new_syndicate_commando.update_internals_hud_icon(1)
//So they don't forget their code or mission.
if(nuke_code)
@@ -83,15 +83,15 @@ var/global/sent_syndicate_strike_team = 0
syndicate_commando_number--
//Spawns the rest of the commando gear.
-// for (var/obj/effect/landmark/L)
- // if (L.name == "Commando_Manual")
+// for(var/obj/effect/landmark/L)
+ // if(L.name == "Commando_Manual")
//new /obj/item/weapon/gun/energy/pulse_rifle(L.loc)
// var/obj/item/weapon/paper/P = new(L.loc)
// P.info = "Good morning soldier! . This compact guide will familiarize you with standard operating procedure. There are three basic rules to follow: #1 Work as a team. #2 Accomplish your objective at all costs. #3 Leave no witnesses. You are fully equipped and stocked for your mission--before departing on the Spec. Ops. Shuttle due South, make sure that all operatives are ready. Actual mission objective will be relayed to you by Central Command through your headsets. If deemed appropriate, Central Command will also allow members of your team to equip assault power-armor for the mission. You will find the armor storage due West of your position. Once you are ready to leave, utilize the Special Operations shuttle console and toggle the hull doors via the other console.
In the event that the team does not accomplish their assigned objective in a timely manner, or finds no other way to do so, attached below are instructions on how to operate a Nanotrasen Nuclear Device. Your operations LEADER is provided with a nuclear authentication disk and a pin-pointer for this reason. You may easily recognize them by their rank: Lieutenant, Captain, or Major. The nuclear device itself will be present somewhere on your destination.
Hello and thank you for choosing Nanotrasen for your nuclear information needs. Today's crash course will deal with the operation of a Fission Class Nanotrasen made Nuclear Device. First and foremost, DO NOT TOUCH ANYTHING UNTIL THE BOMB IS IN PLACE. Pressing any button on the compacted bomb will cause it to extend and bolt itself into place. If this is done to unbolt it one must completely log in which at this time may not be possible. To make the device functional: #1 Place bomb in designated detonation zone #2 Extend and anchor bomb (attack with hand). #3 Insert Nuclear Auth. Disk into slot. #4 Type numeric code into keypad ([nuke_code]). Note: If you make a mistake press R to reset the device. #5 Press the E button to log onto the device. You now have activated the device. To deactivate the buttons at anytime, for example when you have already prepped the bomb for detonation, remove the authentication disk OR press the R on the keypad. Now the bomb CAN ONLY be detonated using the timer. A manual detonation is not an option. Note: Toggle off the SAFETY . Use the - - and + + to set a detonation time between 5 seconds and 10 minutes. Then press the timer toggle button to start the countdown. Now remove the authentication disk so that the buttons deactivate. Note: THE BOMB IS STILL SET AND WILL DETONATE Now before you remove the disk if you need to move the bomb you can: Toggle off the anchor, move it, and re-anchor.
The nuclear authorization code is: [nuke_code ? nuke_code : "None provided"]
Good luck, soldier!
"
// P.name = "Spec. Ops. Manual"
- for (var/obj/effect/landmark/L in landmarks_list)
- if (L.name == "Syndicate-Commando-Bomb")
+ for(var/obj/effect/landmark/L in landmarks_list)
+ if(L.name == "Syndicate-Commando-Bomb")
new /obj/effect/spawner/newbomb/timer/syndicate(L.loc)
qdel(L)
@@ -131,12 +131,12 @@ var/global/sent_syndicate_strike_team = 0
equip_to_slot_or_del(R, slot_l_ear)
equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(src), slot_w_uniform)
equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/syndie/advance(src), slot_shoes)
- if (!syndicate_leader_selected)
+ if(!syndicate_leader_selected)
equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/strike(src), slot_wear_suit)
else
equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/red/strike(src), slot_wear_suit)
equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(src), slot_gloves)
- if (!syndicate_leader_selected)
+ if(!syndicate_leader_selected)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/strike(src), slot_head)
else
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/red/strike(src), slot_head)
@@ -148,10 +148,10 @@ var/global/sent_syndicate_strike_team = 0
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m45(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(src), slot_in_backpack)
- equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_in_backpack)
+ equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/x4(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_in_backpack)
- if (!syndicate_leader_selected)
- equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_in_backpack)
+ if(!syndicate_leader_selected)
+ equip_to_slot_or_del(new /obj/item/weapon/grenade/plastic/x4(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/card/emag(src), slot_in_backpack)
else
equip_to_slot_or_del(new /obj/item/weapon/pinpointer(src), slot_in_backpack)
diff --git a/code/modules/admin/verbs/vox_raiders.dm b/code/modules/admin/verbs/vox_raiders.dm
index b2cc9336bf5..251ec478381 100644
--- a/code/modules/admin/verbs/vox_raiders.dm
+++ b/code/modules/admin/verbs/vox_raiders.dm
@@ -48,7 +48,7 @@ var/global/vox_tick = 1
equip_to_slot_or_del(new /obj/item/weapon/circular_saw(src), slot_l_store)
equip_to_slot_or_del(new /obj/item/weapon/gun/dartgun/vox/medical, slot_r_hand)
- equip_to_slot_or_del(new /obj/item/clothing/mask/breath(src), slot_wear_mask)
+ equip_to_slot_or_del(new /obj/item/clothing/mask/breath/vox(src), slot_wear_mask)
equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(src), slot_back)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_r_store)
@@ -75,6 +75,6 @@ var/global/vox_tick = 1
*/
vox_tick++
- if (vox_tick > 4) vox_tick = 1
+ if(vox_tick > 4) vox_tick = 1
return 1
diff --git a/code/modules/alarm/alarm_handler.dm b/code/modules/alarm/alarm_handler.dm
index bfa2b5f44ed..9878a4b5e5e 100644
--- a/code/modules/alarm/alarm_handler.dm
+++ b/code/modules/alarm/alarm_handler.dm
@@ -54,7 +54,7 @@
return alarms
/datum/alarm_handler/proc/check_alarm_cleared(var/datum/alarm/alarm)
- if ((alarm.end_time && world.time > alarm.end_time) || !alarm.sources.len)
+ if((alarm.end_time && world.time > alarm.end_time) || !alarm.sources.len)
alarms -= alarm
alarms_assoc -= alarm.origin
on_alarm_change(alarm, ALARM_CLEARED)
diff --git a/code/modules/arcade/arcade_base.dm b/code/modules/arcade/arcade_base.dm
index 2835d2451e3..d886fa3f4be 100644
--- a/code/modules/arcade/arcade_base.dm
+++ b/code/modules/arcade/arcade_base.dm
@@ -84,7 +84,7 @@
/obj/machinery/arcade/proc/pay_with_cash(var/obj/item/weapon/spacecash/cashmoney, var/mob/user)
if(cashmoney.get_total() < token_price)
- to_chat(user, "\icon[cashmoney] That is not enough money. ")
+ to_chat(user, "[bicon(cashmoney)] That is not enough money. ")
return 0
visible_message("[usr] inserts a credit chip into [src]. ")
var/left = cashmoney.get_total() - token_price
@@ -97,7 +97,7 @@
/obj/machinery/arcade/proc/pay_with_card(var/obj/item/weapon/card/id/I, var/mob/user)
visible_message("[usr] swipes a card through [src]. ")
var/datum/money_account/customer_account = attempt_account_access_nosec(I.associated_account_number)
- if (!customer_account)
+ if(!customer_account)
to_chat(user, "Error: Unable to access account. Please contact technical support if problem persists.")
return 0
diff --git a/code/modules/arcade/arcade_prize.dm b/code/modules/arcade/arcade_prize.dm
index f57a64de03c..d3457696268 100644
--- a/code/modules/arcade/arcade_prize.dm
+++ b/code/modules/arcade/arcade_prize.dm
@@ -67,7 +67,7 @@
throwforce = 0
throw_speed = 1
throw_range = 1
- w_class = 1.0
+ w_class = 1
max_amount = 9999 //Dang that's a lot of tickets
/obj/item/stack/tickets/New(var/loc, var/amount=null)
diff --git a/code/modules/arcade/prize_counter.dm b/code/modules/arcade/prize_counter.dm
index 5f66881cea6..e45d3d1bfe0 100644
--- a/code/modules/arcade/prize_counter.dm
+++ b/code/modules/arcade/prize_counter.dm
@@ -171,7 +171,7 @@ td.cost.toomuch {
if(href_list["eject"])
print_tickets()
- if (href_list["buy"])
+ if(href_list["buy"])
var/itemID = text2num(href_list["buy"])
var/datum/prize_item/item = global_prizes.prizes[itemID]
var/sure = alert(usr,"Are you sure you wish to purchase [item.name] for [item.cost] tickets?","You sure?","Yes","No") in list("Yes","No")
diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm
index 9a61921764d..84e10835215 100644
--- a/code/modules/assembly/assembly.dm
+++ b/code/modules/assembly/assembly.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/assemblies/new_assemblies.dmi'
icon_state = ""
flags = CONDUCT
- w_class = 2.0
+ w_class = 2
materials = list(MAT_METAL=100)
throwforce = 2
throw_speed = 3
diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm
index 3171755b34c..f6019ace266 100644
--- a/code/modules/assembly/bomb.dm
+++ b/code/modules/assembly/bomb.dm
@@ -3,7 +3,7 @@
icon = 'icons/obj/tank.dmi'
item_state = "assembly"
throwforce = 5
- w_class = 3.0
+ w_class = 3
throw_speed = 2
throw_range = 4
flags = CONDUCT //Copied this from old code, so this may or may not be necessary
@@ -61,7 +61,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("\icon[src] *beep* *beep*", "*beep* *beep*")
+ visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
sleep(10)
if(!src)
return
@@ -141,7 +141,7 @@
if(strength >=1)
explosion(ground_zero, 0, round(strength,1), round(strength*2,1), round(strength*3,1))
- else if (strength >=0.5)
+ else if(strength >=0.5)
explosion(ground_zero, -1, 0, 1, 2)
else
ground_zero.assume_air(air_contents)
@@ -150,7 +150,7 @@
else if(air_contents.temperature > (T0C + 100))
strength = (fuel_moles/25)
- if (strength >=1)
+ if(strength >=1)
explosion(ground_zero, -1, 0, round(strength,1), round(strength*3,1))
else
ground_zero.assume_air(air_contents)
diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm
index f1a3f402336..5c67f780a5f 100644
--- a/code/modules/assembly/health.dm
+++ b/code/modules/assembly/health.dm
@@ -55,7 +55,7 @@
health_scan = M.health
if(health_scan <= alarm_health)
pulse()
- audible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
+ audible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
toggle_scan()
return
return
@@ -76,7 +76,9 @@
var/dat = text("Health Sensor [scanning?"On":"Off"] ")
if(scanning && health_scan)
dat += " Health: [health_scan]"
- user << browse(dat, "window=hscan")
+ var/datum/browser/popup = new(user, "hscan", name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "hscan")
return
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index 6333fbca635..f4cafef9c97 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -5,7 +5,7 @@
item_state = "assembly"
flags = CONDUCT
throwforce = 5
- w_class = 2.0
+ w_class = 2
throw_speed = 3
throw_range = 10
@@ -68,8 +68,8 @@
examine(mob/user)
..(user)
- if ((in_range(src, user) || src.loc == user))
- if (src.secured)
+ if((in_range(src, user) || src.loc == user))
+ if(src.secured)
to_chat(user, "\The [src] is ready!")
else
to_chat(user, "\The [src] can be attached!")
@@ -202,11 +202,11 @@
qdel(src)
return
if(2.0)
- if (prob(50))
+ if(prob(50))
qdel(src)
return
if(3.0)
- if (prob(25))
+ if(prob(25))
qdel(src)
return
return
diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm
index a5485a59078..e6505e385ad 100644
--- a/code/modules/assembly/igniter.dm
+++ b/code/modules/assembly/igniter.dm
@@ -25,12 +25,12 @@
if(!..()) return 0//Cooldown check
var/turf/location = get_turf(loc)
if(location) location.hotspot_expose(1000,1000)
- if (istype(src.loc,/obj/item/device/assembly_holder))
- if (istype(src.loc.loc, /obj/structure/reagent_dispensers/fueltank/))
+ if(istype(src.loc,/obj/item/device/assembly_holder))
+ if(istype(src.loc.loc, /obj/structure/reagent_dispensers/fueltank/))
var/obj/structure/reagent_dispensers/fueltank/tank = src.loc.loc
- if (tank)
+ if(tank)
tank.boom()
- if (istype(src.loc.loc, /obj/item/weapon/reagent_containers/glass/beaker/))
+ if(istype(src.loc.loc, /obj/item/weapon/reagent_containers/glass/beaker/))
var/obj/item/weapon/reagent_containers/glass/beaker/beakerbomb = src.loc.loc
if(beakerbomb)
beakerbomb.heat_beaker()
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index a2810d04e98..2a23732a90b 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -124,7 +124,7 @@
if(!secured || !on || cooldown > 0)
return 0
pulse(0)
- audible_message("\icon[src] *beep* *beep*", null, 3)
+ audible_message("[bicon(src)] *beep* *beep*", null, 3)
cooldown = 2
spawn(10)
process_cooldown()
@@ -139,7 +139,9 @@
Refresh
Close "}
- user << browse(dat, "window=infra")
+ var/datum/browser/popup = new(user, "infra", name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "infra")
/obj/item/device/assembly/infra/Topic(href, href_list)
diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm
index 880dc2d2218..267d1600523 100644
--- a/code/modules/assembly/proximity.dm
+++ b/code/modules/assembly/proximity.dm
@@ -42,15 +42,15 @@
HasProximity(atom/movable/AM as mob|obj)
- if (istype(AM, /obj/effect/beam)) return
- if (AM.move_speed < 12) sense()
+ if(istype(AM, /obj/effect/beam)) return
+ if(AM.move_speed < 12) sense()
return
sense()
if((!secured)||(!scanning)||(cooldown > 0)) return 0
pulse(0)
- visible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
+ visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
cooldown = 2
spawn(10)
process_cooldown()
@@ -68,6 +68,7 @@
dropped()
+ ..()
spawn(0)
sense()
return
@@ -114,7 +115,9 @@
dat += "[scanning?"Armed":"Unarmed"] (Movement sensor active when armed!)"
dat += "Refresh "
dat += "Close "
- user << browse(dat, "window=prox")
+ var/datum/browser/popup = new(user, "prox", name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "prox")
return
diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm
index 6c5c9e4e5bb..3aa24a2d014 100644
--- a/code/modules/assembly/shock_kit.dm
+++ b/code/modules/assembly/shock_kit.dm
@@ -6,7 +6,7 @@
var/obj/item/clothing/head/helmet/part1 = null
var/obj/item/device/radio/electropack/part2 = null
var/status = 0
- w_class = 5.0
+ w_class = 5
flags = CONDUCT
/obj/item/assembly/shock_kit/Destroy()
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index 7a5835a3f9d..c021fec7ef9 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -51,7 +51,7 @@
/obj/item/device/assembly/signaler/interact(mob/user as mob, flag1)
var/t1 = "-------"
-// if ((src.b_stat && !( flag1 )))
+// if((src.b_stat && !( flag1 )))
// t1 = text("------- \nGreen Wire: [] \nRed Wire: [] \nBlue Wire: [] \n", (src.wires & 4 ? text("Cut Wire ", src) : text("Mend Wire ", src)), (src.wires & 2 ? text("Cut Wire ", src) : text("Mend Wire ", src)), (src.wires & 1 ? text("Cut Wire ", src) : text("Mend Wire ", src)))
// else
// t1 = "-------" Speaker: [src.listening ? "Engaged " : "Disengaged "]
@@ -81,7 +81,9 @@
[t1]
"}
- user << browse(dat, "window=radio")
+ var/datum/browser/popup = new(user, "radio", name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "radio")
return
@@ -94,7 +96,7 @@
onclose(usr, "radio")
return
- if (href_list["freq"])
+ if(href_list["freq"])
var/new_frequency = (frequency + text2num(href_list["freq"]))
if(new_frequency < RADIO_LOW_FREQ || new_frequency > RADIO_HIGH_FREQ)
new_frequency = sanitize_frequency(new_frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ)
@@ -150,7 +152,7 @@
pulse(1)
for(var/mob/O in hearers(1, src.loc))
- O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
+ O.show_message("[bicon(src)] *beep* *beep*", 3, "*beep* *beep*", 2)
return
/obj/item/device/assembly/signaler/proc/set_frequency(new_frequency)
diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm
index 6797ba8f340..b5a197d6dd4 100644
--- a/code/modules/assembly/timer.dm
+++ b/code/modules/assembly/timer.dm
@@ -44,7 +44,7 @@
if((!secured)||(cooldown > 0)) return 0
pulse(0)
if(loc)
- loc.visible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
+ loc.visible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*")
cooldown = 2
spawn(10)
process_cooldown()
@@ -96,7 +96,9 @@
Refresh
Close "}
- user << browse(dat, "window=timer")
+ var/datum/browser/popup = new(user, "timer", name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "timer")
return
diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm
index 4c15b5f860e..af9138724e6 100644
--- a/code/modules/assembly/voice.dm
+++ b/code/modules/assembly/voice.dm
@@ -30,12 +30,12 @@
recorded_type = type
listening = 0
var/turf/T = get_turf(src) //otherwise it won't work in hand
- T.visible_message("\icon[src] beeps, \"Activation message is [type ? "the sound when one [recorded]" : "'[recorded]'."]\"")
+ T.visible_message("[bicon(src)] beeps, \"Activation message is [type ? "the sound when one [recorded]" : "'[recorded]'."]\"")
else
if(findtext(msg, recorded) && type == recorded_type)
pulse(0)
var/turf/T = get_turf(src) //otherwise it won't work in hand
- T.visible_message("\icon[src] \red beeps!")
+ T.visible_message("[bicon(src)] \red beeps!")
activate()
return // previously this toggled listning when not in a holder, that's a little silly. It was only called in attack_self that way.
@@ -46,7 +46,7 @@
listening = !listening
var/turf/T = get_turf(src)
- T.visible_message("\icon[src] beeps, \"[listening ? "Now" : "No longer"] recording input.\"")
+ T.visible_message("[bicon(src)] beeps, \"[listening ? "Now" : "No longer"] recording input.\"")
return 1
diff --git a/code/modules/atmos_automation/console.dm b/code/modules/atmos_automation/console.dm
index c567a45e108..201a6f63e4d 100644
--- a/code/modules/atmos_automation/console.dm
+++ b/code/modules/atmos_automation/console.dm
@@ -61,7 +61,7 @@
if(!(A.returntype in valid_returntypes))
continue
choices[A.name]=A
- if (choices.len==0)
+ if(choices.len==0)
testing("Unable to find automations with returntype in [english_list(valid_returntypes)]!")
return 0
var/label=input(user, "Select new automation:", "Automations", "Cancel") as null|anything in choices
diff --git a/code/modules/awaymissions/bluespaceartillery.dm b/code/modules/awaymissions/bluespaceartillery.dm
index 670d8143390..00263352325 100644
--- a/code/modules/awaymissions/bluespaceartillery.dm
+++ b/code/modules/awaymissions/bluespaceartillery.dm
@@ -32,7 +32,7 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "bluespace_artillery.tmpl", "Bluespace Control", 400, 260)
ui.set_initial_data(data)
ui.open()
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 4612979c125..b2864d1c7cc 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -7,6 +7,7 @@
/obj/effect/landmark/corpse
name = "Unknown"
var/mobname = "Unknown" //Unused now but it'd fuck up maps to remove it now
+ var/mob_species = null //Set to make a mob of another race, currently used only in ruins
var/corpseuniform = null //Set this to an object path to have the slot filled with said object on the corpse.
var/corpsesuit = null
var/corpseshoes = null
@@ -37,6 +38,8 @@
M.real_name = src.name
M.death(1) //Kills the new mob
M.timeofdeath = timeofdeath
+ if(src.mob_species)
+ M.set_species(src.mob_species)
if(src.corpseuniform)
M.equip_to_slot_or_del(new src.corpseuniform(M), slot_w_uniform)
if(src.corpsesuit)
@@ -159,7 +162,7 @@
corpseradio = /obj/item/device/radio/headset/headset_eng
corpseuniform = /obj/item/clothing/under/rank/engineer
corpseback = /obj/item/weapon/storage/backpack/industrial
- corpseshoes = /obj/item/clothing/shoes/orange
+ corpseshoes = /obj/item/clothing/shoes/workboots
corpsebelt = /obj/item/weapon/storage/belt/utility/full
corpsegloves = /obj/item/clothing/gloves/color/yellow
corpsehelmet = /obj/item/clothing/head/hardhat
@@ -285,3 +288,10 @@
corpseid = 1
corpseidjob = "Commander"
corpseidaccess = "Captain"
+
+/obj/effect/landmark/corpse/abductor //Connected to ruins, for some reason?
+ name = "abductor"
+ mobname = "???"
+ mob_species = "abductor"
+ corpseuniform = /obj/item/clothing/under/color/grey
+ corpseshoes = /obj/item/clothing/shoes/combat
diff --git a/code/modules/awaymissions/exile.dm b/code/modules/awaymissions/exile.dm
index 4e6a69d591b..8e2592b010b 100644
--- a/code/modules/awaymissions/exile.dm
+++ b/code/modules/awaymissions/exile.dm
@@ -32,7 +32,7 @@
/obj/structure/closet/secure_closet/exile
name = "exile implants"
- req_access = list(access_hos)
+ req_access = list(access_armory)
/obj/structure/closet/secure_closet/exile/New()
..()
diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm
index 39ac1f49676..5045b5369a1 100644
--- a/code/modules/awaymissions/gateway.dm
+++ b/code/modules/awaymissions/gateway.dm
@@ -149,7 +149,7 @@ obj/machinery/gateway/centerstation/process()
/obj/machinery/gateway/centerstation/attackby(obj/item/device/W as obj, mob/user as mob, params)
if(istype(W,/obj/item/device/multitool))
- to_chat(user, "\black The gate is already calibrated, there is no work for you to do here.")
+ to_chat(user, "The gate is already calibrated, there is no work for you to do here.")
return
/////////////////////////////////////Away////////////////////////
@@ -236,10 +236,10 @@ obj/machinery/gateway/centerstation/process()
if(!ready) return
if(!active) return
if(istype(M, /mob/living/carbon))
- if (exilecheck(M)) return
+ if(exilecheck(M)) return
if(istype(M, /obj))
for(var/mob/living/carbon/F in M)
- if (exilecheck(F)) return
+ if(exilecheck(F)) return
M.forceMove(get_step(stationgate.loc, SOUTH))
M.dir = SOUTH
diff --git a/code/modules/awaymissions/map_rng.dm b/code/modules/awaymissions/map_rng.dm
new file mode 100644
index 00000000000..147d41171c4
--- /dev/null
+++ b/code/modules/awaymissions/map_rng.dm
@@ -0,0 +1,51 @@
+/obj/effect/landmark/map_loader
+ name = "map loader"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "x2"
+ invisibility = 101
+ anchored = 1
+ density = 0
+ opacity = 0
+ var/template_name = null
+ var/datum/map_template/template = null
+ var/centered = 1
+ var/loaded = 0
+
+/obj/effect/landmark/map_loader/New(turf/loc, tname)
+ ..()
+
+ if(tname)
+ template_name = tname
+ if(template_name)
+ template = map_templates[template_name]
+
+/obj/effect/landmark/map_loader/initialize()
+ ..()
+ if(template)
+ load(template)
+
+/obj/effect/landmark/map_loader/set_tag()
+ return
+
+/obj/effect/landmark/map_loader/proc/load(datum/map_template/t)
+ if(!t)
+ return
+ if(loaded) // I wanna be super sure this loads only once
+ return
+ loaded = 1
+ var/turf/pos = get_turf(src)
+ // Hop to nullspace so we don't get re-initialized by the map we're loading
+ loc = null
+ t.load(pos, centered = centered)
+ t.loaded++
+ qdel(src)
+
+/obj/effect/landmark/map_loader/random
+ var/template_list = ""
+
+/obj/effect/landmark/map_loader/random/initialize()
+ ..()
+ if(template_list)
+ template_name = safepick(splittext(template_list, ";"))
+ template = map_templates[template_name]
+ load(template)
diff --git a/code/modules/awaymissions/maploader/reader.dm b/code/modules/awaymissions/maploader/reader.dm
index e58714de9f3..fcfd8d2e600 100644
--- a/code/modules/awaymissions/maploader/reader.dm
+++ b/code/modules/awaymissions/maploader/reader.dm
@@ -2,10 +2,22 @@
//SS13 Optimized Map loader
//////////////////////////////////////////////////////////////
+//As of 3.6.2016
//global datum that will preload variables on atoms instanciation
var/global/use_preloader = FALSE
var/global/dmm_suite/preloader/_preloader = new
+/dmm_suite
+ // These regexes are global - meaning that starting the maploader again mid-load will
+ // reset progress - which means we need to track our index per-map, or we'll
+ // eternally recurse
+ // /"([a-zA-Z]+)" = \(((?:.|\n)*?)\)\n(?!\t)|\((\d+),(\d+),(\d+)\) = \{"([a-zA-Z\n]*)"\}/g
+ var/static/regex/dmmRegex = new/regex({""(\[a-zA-Z]+)" = \\(((?:.|\n)*?)\\)\n(?!\t)|\\((\\d+),(\\d+),(\\d+)\\) = \\{"(\[a-zA-Z\n]*)"\\}"}, "g")
+ // /^[\s\n]+"?|"?[\s\n]+$|^"|"$/g
+ var/static/regex/trimQuotesRegex = new/regex({"^\[\\s\n]+"?|"?\[\\s\n]+$|^"|"$"}, "g")
+ // /^[\s\n]+|[\s\n]+$/
+ var/static/regex/trimRegex = new/regex("^\[\\s\n]+|\[\\s\n]+$", "g")
+ var/static/list/modelCache = list()
/**
* Construct the model map and control the loading process
@@ -16,87 +28,156 @@ var/global/dmm_suite/preloader/_preloader = new
* e.g aa = /turf/unsimulated/wall{icon_state = "rock"}
* 2) Read the map line by line, parsing the result (using parse_grid)
*
+ * If `measureOnly` is set, then no atoms will be created, and all this will do
+ * is return the bounds after parsing the file
+ *
+ * If you need to freeze init while you're working, you can use the spacial allocator's
+ * "add_dirt" and "remove_dirt" which will put initializations on hold until you say
+ * the word. This is important for loading large maps such as the cyberiad, where
+ * atmos will attempt to start before it's ready, causing runtimes galore if init is
+ * allowed to romp unchecked.
*/
-/dmm_suite/load_map(dmm_file as file, x_offset = 0 as num, y_offset = 0 as num, z_offset as num, do_sleep = 1 as num)
- if(!z_offset)//what z_level we are creating the map on
+/dmm_suite/load_map(dmm_file as file, x_offset as num, y_offset as num, z_offset as num, cropMap as num, measureOnly as num)
+ var/tfile = dmm_file//the map file we're creating
+ var/fname = "Lambda"
+ if(isfile(tfile))
+ fname = "[tfile]"
+ tfile = file2text(tfile)
+
+ if(!x_offset)
+ x_offset = 1
+ if(!y_offset)
+ y_offset = 1
+ if(!z_offset)
z_offset = world.maxz + 1
- var/quote = ascii2text(34)
- var/tfile = file2text(dmm_file)//the map file we're creating
- var/tfile_len = length(tfile)
- var/lpos = 1 // the models definition index
-
- ///////////////////////////////////////////////////////////////////////////////////////
- //first let's map model keys (e.g "aa") to their contents (e.g /turf/space{variables})
- ///////////////////////////////////////////////////////////////////////////////////////
+ var/list/bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF)
var/list/grid_models = list()
- var/key_len = length(copytext(tfile,2,findtext(tfile,quote,2,0)))//the length of the model key (e.g "aa" or "aba")
+ var/key_len = 0
- //proceed line by line
- for(lpos=1; lpos world.maxz)
+ if(cropMap)
+ continue
+ else
+ zlevels.increase_max_zlevel_to(zcrd) //create a new z_level if needed
- var/y_depth = z_depth / (x_depth+1)//x_depth + 1 because we're counting the '\n' characters in z_depth
- if(world.maxy 1)
+ gridLines.Cut(1, leadingBlanks) // Remove all leading blank lines.
- //fill the current square using the model map
- xcrd=0
+ if(!gridLines.len) // Skip it if only blank lines exist.
+ continue
- for(var/mpos in 1 to x_depth step key_len)
- xcrd++
- var/model_key = copytext(grid_line,mpos,mpos+key_len)
- parse_grid(grid_models[model_key], xcrd + x_offset, ycrd + y_offset, zcrd + z_offset, do_sleep)
+ if(gridLines.len && gridLines[gridLines.len] == "")
+ gridLines.Cut(gridLines.len) // Remove only one blank line at the end.
- //reached end of current map
- if(gpos+x_depth+1>z_depth)
- break
+ bounds[MAP_MINY] = min(bounds[MAP_MINY], ycrd)
+ ycrd += gridLines.len - 1 // Start at the top and work down
- ycrd--
- if(do_sleep)
- sleep(-1)
+ if(!cropMap && ycrd > world.maxy)
+ if(!measureOnly)
+ world.maxy = ycrd // Expand Y here. X is expanded in the loop below
+ bounds[MAP_MAXY] = max(bounds[MAP_MAXY], ycrd)
+ else
+ bounds[MAP_MAXY] = max(bounds[MAP_MAXY], min(ycrd, world.maxy))
- //reached End Of File
- if(findtext(tfile,quote+"}",zpos,0)+2==tfile_len)
- break
- if(do_sleep)
- sleep(-1)
+ var/maxx = xcrdStart
+ if(measureOnly)
+ for(var/line in gridLines)
+ maxx = max(maxx, xcrdStart + length(line) / key_len - 1)
+ else
+ for(var/line in gridLines)
+ if(ycrd <= world.maxy && ycrd >= 1)
+ xcrd = xcrdStart
+ for(var/tpos = 1 to length(line) - key_len + 1 step key_len)
+ if(xcrd > world.maxx)
+ if(cropMap)
+ break
+ else
+ world.maxx = xcrd
+
+ if(xcrd >= 1)
+ var/model_key = copytext(line, tpos, tpos + key_len)
+ if(!grid_models[model_key])
+ throw EXCEPTION("Undefined model key in DMM: [model_key]. Map file: [fname].")
+ parse_grid(grid_models[model_key], xcrd, ycrd, zcrd, LM)
+ // After this call, it is NOT safe to reference `dmmRegex` without another call to
+ // "Find" - we might've hit a map loader here and changed its state
+ CHECK_TICK
+
+ maxx = max(maxx, xcrd)
+ ++xcrd
+ --ycrd
+
+ bounds[MAP_MAXX] = max(bounds[MAP_MAXX], cropMap ? min(maxx, world.maxx) : maxx)
+
+ CHECK_TICK
+ catch(var/exception/e)
+ _preloader.reset()
+ throw e
+
+ _preloader.reset()
+ log_debug("Loaded map in [stop_watch(watch)]s.")
+ qdel(LM)
+ if(bounds[MAP_MINX] == 1.#INF) // Shouldn't need to check every item
+ log_debug("Min x: bounds[MAP_MINX]")
+ log_debug("Min y: bounds[MAP_MINY]")
+ log_debug("Min z: bounds[MAP_MINZ]")
+ log_debug("Max x: bounds[MAP_MAXX]")
+ log_debug("Max y: bounds[MAP_MAXY]")
+ log_debug("Max z: bounds[MAP_MAXZ]")
+ return null
+ else
+ if(!measureOnly)
+ for(var/t in block(locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]), locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ])))
+ var/turf/T = t
+ //we do this after we load everything in. if we don't; we'll have weird atmos bugs regarding atmos adjacent turfs
+ T.AfterChange(1,keep_cabling = TRUE)
+ return bounds
/**
* Fill a given tile with its area/turf/objects/mobs
@@ -115,48 +196,60 @@ var/global/dmm_suite/preloader/_preloader = new
* 4) Instanciates the atom with its variables
*
*/
-/dmm_suite/proc/parse_grid(model as text, xcrd as num, ycrd as num, zcrd as num, do_sleep = 1)
+/dmm_suite/proc/parse_grid(model as text,xcrd as num,ycrd as num,zcrd as num, dmm_suite/loaded_map/LM)
/*Method parse_grid()
- Accepts a text string containing a comma separated list of type paths of the
same construction as those contained in a .dmm file, and instantiates them.
*/
- var/list/members = list()//will contain all members (paths) in model (in our example : /turf/unsimulated/wall and /area/mine/explored)
- var/list/members_attributes = list()//will contain lists filled with corresponding variables, if any (in our example : list(icon_state = "rock") and list())
+ var/list/members //will contain all members (paths) in model (in our example : /turf/unsimulated/wall and /area/mine/explored)
+ var/list/members_attributes //will contain lists filled with corresponding variables, if any (in our example : list(icon_state = "rock") and list())
+ var/list/cached = modelCache[model]
+ var/index
+ if(cached)
+ members = cached[1]
+ members_attributes = cached[2]
+ else
+ /////////////////////////////////////////////////////////
+ //Constructing members and corresponding variables lists
+ ////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////
- //Constructing members and corresponding variables lists
- ////////////////////////////////////////////////////////
+ members = list()
+ members_attributes = list()
+ index = 1
- var/index=1
- var/old_position = 1
- var/dpos
+ var/old_position = 1
+ var/dpos
- do
- //finding next member (e.g /turf/unsimulated/wall{icon_state = "rock"} or /area/mine/explored)
- dpos= find_next_delimiter_position(model,old_position,",","{","}")//find next delimiter (comma here) that's not within {...}
+ do
+ //finding next member (e.g /turf/unsimulated/wall{icon_state = "rock"} or /area/mine/explored)
+ dpos = find_next_delimiter_position(model, old_position, ",", "{", "}") //find next delimiter (comma here) that's not within {...}
- var/full_def = copytext(model,old_position,dpos)//full definition, e.g : /obj/foo/bar{variables=derp}
- var/atom_def = text2path(copytext(full_def,1,findtext(full_def,"{")))//path definition, e.g /obj/foo/bar
- members.Add(atom_def)
- old_position = dpos + 1
+ var/full_def = trim_text(copytext(model, old_position, dpos)) //full definition, e.g : /obj/foo/bar{variables=derp}
+ var/variables_start = findtext(full_def, "{")
+ var/atom_def = text2path(trim_text(copytext(full_def, 1, variables_start))) //path definition, e.g /obj/foo/bar
+ old_position = dpos + 1
- //transform the variables in text format into a list (e.g {var1="derp"; var2; var3=7} => list(var1="derp", var2, var3=7))
- var/list/fields = list()
+ if(!atom_def) // Skip the item if the path does not exist. Fix your crap, mappers!
+ continue
+ members.Add(atom_def)
- var/variables_start = findtext(full_def,"{")
- if(variables_start)//if there's any variable
- full_def = copytext(full_def,variables_start+1,length(full_def))//removing the last '}'
- fields = readlist(full_def, ";")
+ //transform the variables in text format into a list (e.g {var1="derp"; var2; var3=7} => list(var1="derp", var2, var3=7))
+ var/list/fields = list()
- //then fill the members_attributes list with the corresponding variables
- members_attributes.len++
- members_attributes[index++] = fields
+ if(variables_start)//if there's any variable
+ full_def = copytext(full_def,variables_start+1,length(full_def))//removing the last '}'
+ fields = readlist(full_def, ";")
- if(do_sleep)
- sleep(-1)
- while(dpos != 0)
+ //then fill the members_attributes list with the corresponding variables
+ members_attributes.len++
+ members_attributes[index++] = fields
+
+ CHECK_TICK
+ while(dpos != 0)
+
+ modelCache[model] = list(members, members_attributes)
////////////////
@@ -165,24 +258,25 @@ var/global/dmm_suite/preloader/_preloader = new
//The next part of the code assumes there's ALWAYS an /area AND a /turf on a given tile
- //in case of multiples turfs on one tile,
- //will contains the images of all underlying turfs, to simulate the DMM multiple tiles piling
- var/list/turfs_underlays = list()
-
//first instance the /area and remove it from the members list
index = members.len
+
+ var/turf/crds = locate(xcrd,ycrd,zcrd)
if(members[index] != /area/template_noop)
+ // We assume `members[index]` is an area path, as above, yes? I will operate
+ // on that assumption.
+ if(!ispath(members[index], /area))
+ throw EXCEPTION("Oh no, I thought this was an area!")
+
var/atom/instance
_preloader.setup(members_attributes[index])//preloader for assigning set variables on atom creation
+ instance = LM.area_path_to_real_area(members[index])
- instance = locate(members[index])
- var/turf/crds = locate(xcrd,ycrd,zcrd)
if(crds)
instance.contents.Add(crds)
if(use_preloader && instance)
_preloader.load(instance)
- members.Remove(members[index])
//then instance the /turf and, if multiple tiles are presents, simulates the DMM underlays piling effect
@@ -198,18 +292,20 @@ var/global/dmm_suite/preloader/_preloader = new
if(T)
//if others /turf are presents, simulates the underlays piling effect
index = first_turf_index + 1
- while(index <= members.len)
- turfs_underlays.Insert(1,image(T.icon,null,T.icon_state,T.layer,T.dir))//add the current turf image to the underlays list
- var/turf/UT = instance_atom(members[index],members_attributes[index],xcrd,ycrd,zcrd)//instance new turf
- add_underlying_turf(UT,T,turfs_underlays)//simulates the DMM piling effect
- T = UT
+ while(index <= members.len - 1) // Last item is an /area
+ var/underlay
+ if(istype(T, /turf)) // I blame this on the stupid clown who coded the BYOND map editor
+ underlay = T.appearance
+ T = instance_atom(members[index],members_attributes[index],xcrd,ycrd,zcrd)//instance new turf
+ if(ispath(members[index],/turf))
+ T.underlays += underlay
+
index++
//finally instance all remainings objects/mobs
- for(index in 1 to first_turf_index - 1)
+ for(index in 1 to first_turf_index-1)
instance_atom(members[index],members_attributes[index],xcrd,ycrd,zcrd)
- if(do_sleep)
- sleep(-1)
+ CHECK_TICK
////////////////
//Helpers procs
@@ -222,7 +318,13 @@ var/global/dmm_suite/preloader/_preloader = new
var/turf/T = locate(x,y,z)
if(T)
- instance = new path (T)//first preloader pass
+ if(ispath(path, /turf))
+ T.ChangeTurf(path, 1, 0)
+ instance = T
+ else if(ispath(path, /area))
+
+ else
+ instance = new path (T)//first preloader pass
if(use_preloader && instance)//second preloader pass, for those atoms that don't ..() in New()
_preloader.load(instance)
@@ -232,16 +334,11 @@ var/global/dmm_suite/preloader/_preloader = new
//text trimming (both directions) helper proc
//optionally removes quotes before and after the text (for variable name)
/dmm_suite/proc/trim_text(what as text,trim_quotes=0)
- while(length(what) && (findtext(what," ",1,2)))
- what=copytext(what,2,0)
- while(length(what) && (findtext(what," ",length(what),0)))
- what=copytext(what,1,length(what))
if(trim_quotes)
- while(length(what) && (findtext(what,quote,1,2)))
- what=copytext(what,2,0)
- while(length(what) && (findtext(what,quote,length(what),0)))
- what=copytext(what,1,length(what))
- return what
+ return trimQuotesRegex.Replace(what, "")
+ else
+ return trimRegex.Replace(what, "")
+
//find the position of the next delimiter,skipping whatever is comprised between opening_escape and closing_escape
//returns 0 if reached the last delimiter
@@ -313,14 +410,6 @@ var/global/dmm_suite/preloader/_preloader = new
return to_return
-//simulates the DM multiple turfs on one tile underlaying
-/dmm_suite/proc/add_underlying_turf(turf/placed,turf/underturf, list/turfs_underlays)
- if(underturf.density)
- placed.density = 1
- if(underturf.opacity)
- placed.opacity = 1
- placed.underlays += turfs_underlays
-
//atom creation method that preloads variables at creation
/atom/New()
if(use_preloader && (src.type == _preloader.target_path))//in case the instanciated atom is creating other atoms in New()
@@ -336,6 +425,7 @@ var/global/dmm_suite/preloader/_preloader = new
//Preloader datum
//////////////////
+// This ain't re-entrant, but we had this before the maploader update
/dmm_suite/preloader
parent_type = /datum
var/list/attributes
@@ -349,11 +439,41 @@ var/global/dmm_suite/preloader/_preloader = new
/dmm_suite/preloader/proc/load(atom/what)
for(var/attribute in attributes)
- what.vars[attribute] = attributes[attribute]
+ var/value = attributes[attribute]
+ if(islist(value))
+ value = deepCopyList(value)
+ what.vars[attribute] = value
use_preloader = FALSE
+// If the map loader fails, make this safe
+/dmm_suite/preloader/proc/reset()
+ use_preloader = FALSE
+ attributes = list()
+ target_path = null
+
+// A datum for use within the context of loading a single map,
+// so that one can have separate "unpowered" areas for ruins or whatever,
+// yet have a single area type for use of mapping, instead of creating
+// a new area type for each new ruin
+/dmm_suite/loaded_map
+ parent_type = /datum
+ var/list/area_list = list()
+ var/index = 1 // To store the state of the regex
+
+/dmm_suite/loaded_map/proc/area_path_to_real_area(area/A)
+ if(!ispath(A, /area))
+ throw EXCEPTION("Wrong argument to `area_path_to_real_area`")
+
+ if(!(A in area_list))
+ if(initial(A.there_can_be_many))
+ area_list[A] = new A
+ else
+ area_list[A] = locate(A)
+
+ return area_list[A]
+
/area/template_noop
name = "Area Passthrough"
/turf/template_noop
- name = "Turf Passthrough"
\ No newline at end of file
+ name = "Turf Passthrough"
diff --git a/code/modules/awaymissions/maploader/swapmaps.dm b/code/modules/awaymissions/maploader/swapmaps.dm
index 8dc9f9f6c99..7115cfcbf13 100644
--- a/code/modules/awaymissions/maploader/swapmaps.dm
+++ b/code/modules/awaymissions/maploader/swapmaps.dm
@@ -326,7 +326,7 @@ swapmap
x2+=x1-1
y2+=y1-1
z2+=z1-1
- world.maxz=max(z2,world.maxz) // stretch z if necessary
+ zlevels.increase_max_zlevel_to(z2) // stretch z if necessary
if(!ischunk)
swapmaps_loaded[src]=null
swapmaps_byname[id]=src
@@ -373,7 +373,7 @@ swapmap
mz=max(mz,M.z2)
world.maxx=mx
world.maxy=my
- world.maxz=mz
+ zlevels.cut_levels_downto(mz)
// save and delete
proc/Unload()
diff --git a/code/modules/awaymissions/mission_code/spacehotel.dm b/code/modules/awaymissions/mission_code/spacehotel.dm
new file mode 100644
index 00000000000..b7670737193
--- /dev/null
+++ b/code/modules/awaymissions/mission_code/spacehotel.dm
@@ -0,0 +1,308 @@
+#define PAY_INTERVAL 6000 // amount of ticks between payment
+
+/area/awaymission/spacehotel
+ name = "Deep Space Hotel 419"
+ requires_power = 0
+
+/area/awaymission/spacehotel/kitchen
+ name = "Hotel Kitchen"
+ icon_state = "kitchen"
+
+/area/awaymission/spacehotel/reception
+ name = "Hotel Reception"
+ icon_state = "entry"
+
+// "Directional" map template loader for N or S hotel room
+/obj/effect/landmark/map_loader/hotel_room
+ icon = 'icons/testing/turf_analysis.dmi'
+ icon_state = "arrow"
+
+/obj/item/weapon/paper/crumpled/hotel_scrap_1
+ name = "paper scrap"
+ info = "I can't believe this shitty hotel assigned me a purple-themed room. Why does the shower dump grape drink everywhere?? "
+
+/obj/item/weapon/paper/hotel_scrap_2
+ name = "Journal Entry #2"
+ info = "Day 7: Today, I stepped into my bathroom, only to discover that it had become a mountainside wilderness. I tried to wash my hands with snow, but it didn't particularly pan out. I contacting the front desk regarding the issue, but the receptionist just stared at me with dead eyes and spouted unrepeatable curses at me. However, I convinced them to reassign me to an upgraded suite."
+
+/obj/item/weapon/paper/hotel_scrap_3
+ name = "Journal Entry #3"
+ info = "Day 26: Well, that sucked royally. The queen-sized bed was nice, but the hottub in my room was, well, my wife described it as \"a portal to hell\". I don't know, I guess the lava and weird blood gave it that impression, but it was pretty nicely warm. However, \"we\" decided to get assigned to a new room. Whatever."
+
+/obj/item/weapon/paper/hotel_scrap_4
+ name = "Diary Page"
+ info = "Day 7 of Bad Vacation Thanks Qzxor this shit vacation is ending today. The novelty of the trashy pool wore off 2 days in and I'm not allowed in the bar. The tiny box they called a room that, we had to cram into, just had a poster and a couple of beds. Only one bedsheet to spare. Shower had brown water and sink just dumped its water back out the ceiling, somehow. PS: The receptionist isn't paying attention to us when we try to check out. Apparently, we're staying another day."
+
+/obj/item/weapon/paper/hotel_scrap_5
+ name = "Journal Entry #5"
+ info = "Day 185: I feel like the restaurant's chef is just making random dishes to mess with me. I request something from the menu, and he throws out something nobody asked for on the counter. The bartender isn't much better. At least both of them can make some nice food and drinks. I would complain to the management... but they never seem to care."
+
+/obj/item/weapon/paper/crumpled/hotel_scrap_6
+ name = "Journal Entry #6"
+ info = "Day 386: AMBGAT MEZLBNU . Something wrong. Can't stop hugging plushies."
+
+/obj/item/weapon/paper/crumpled/hotel_scrap_7
+ name = "Journal Entry #8"
+ info = "ASGATDHU NAMSPA KER OKS O OKDOFLI OSDSFKO OASKDAFO AOSDKF OINAIS ISJDDEF OSKFEREAODIK OSI ODIFOSA OEKRRO ASODFKAO PSSDOF SDFK OSDKF OSDKFSASPODFIOSASD UHGU DFYG FPO ASDFOS DFOASSD FAPSO FSPDFOIER OPWASDSA PS DODIOF OSDI pizza OKSDFO AL OKEWORK CVBUASO SDFO AOE RAOWEIK SODDFI "
+
+/obj/item/weapon/paper/hotel_scrap_8
+ name = "Mysterious Note"
+ icon_state = "paper_talisman"
+ info = "There is only one way to leave.
"
+
+/obj/item/weapon/paper/pamphlet/hotel
+ name = "space hotel pamphlet"
+ info = "Welcome to Deep Space Hotel 419! Thank you for choosing our hotel. Simply hand your credit or debit card to the concierge and get your room key! To check out, hand your credit card back.Conditions: The hotel is not responsible for any losses due to time or space anomalies. The hotel is not responsible for events that occur outside of the hotel station, including, but not limited to, events that occur inside of dimensional pockets. The hotel is not responsible for overcharging your account. The hotel is not responsible for missing persons. The hotel is not responsible for mind-altering effects due to drugs, magic, demons, or space worms. "
+
+/obj/effect/landmark/map_loader/hotel_room/initialize()
+ ..()
+ // load and randomly assign rooms
+ var/global/list/south_room_templates = list()
+ var/global/list/north_room_templates = list()
+ var/static/path = "_maps/map_files/templates/spacehotel/"
+ var/global/loaded = 0
+ if(!loaded)
+ loaded = 1
+ for(var/map in flist(path))
+ if(cmptext(copytext(map, length(map) - 3), ".dmm"))
+ var/datum/map_template/T = new(path = "[path][map]", rename = "[map]")
+ if(copytext(map, 1, 3) == "n_")
+ north_room_templates += T
+ else if(copytext(map, 1, 3) == "s_")
+ south_room_templates += T
+ else
+ // omnidirectional rooms are randomly assigned
+ if(prob(50))
+ north_room_templates += T
+ else
+ south_room_templates += T
+
+ var/datum/map_template/M = safepick(dir == NORTH ? north_room_templates : south_room_templates)
+ if(M)
+ template = M
+ if(dir == NORTH)
+ north_room_templates -= M
+ else
+ south_room_templates -= M
+ load(M)
+
+// The door to a hotel room, but also metadata for the room itself
+/obj/machinery/door/unpowered/hotel_door
+ name = "Room Door"
+ icon = 'icons/obj/doors/Doorsand.dmi'
+ icon_state = "door_closed"
+ autoclose = 1
+ atom_say_verb = "beeps"
+ var/doorOpen = 'sound/machines/airlock.ogg'
+ var/doorClose = 'sound/machines/airlock.ogg'
+ var/doorDeni = 'sound/machines/DeniedBeep.ogg'
+ var/id // the room number, eg 101
+ var/obj/item/weapon/card/hotel_card/card// room's key card
+ var/mob/living/occupant = null // the current room occupant
+ var/datum/money_account/account // Account we're pulling from
+ var/roomtimer // timer PS handle for updating room
+
+/obj/machinery/door/unpowered/hotel_door/New()
+ ..()
+ if(id)
+ name = "Room [id]"
+
+ // in case we spawned after hotel
+ var/obj/effect/hotel_controller/H
+ H = H.controller
+ if(H)
+ H.add_room(src)
+
+/obj/machinery/door/unpowered/hotel_door/Destroy()
+ if(roomtimer)
+ deltimer(roomtimer)
+ roomtimer = null
+ qdel(card)
+ card = null
+ return ..()
+
+/obj/machinery/door/unpowered/hotel_door/examine(mob/user)
+ ..()
+ to_chat(user, "This room is currently [occupant ? "" : "un"]occupied.")
+
+/obj/machinery/door/unpowered/hotel_door/allowed(mob/living/carbon/user)
+ for(var/obj/item/weapon/card/hotel_card/C in user.get_all_slots())
+ if(C == card && occupant)
+ atom_say("Welcome, [occupant.real_name]!")
+ return 1
+ return 0
+
+/obj/machinery/door/unpowered/hotel_door/update_icon()
+ overlays.Cut()
+ if(density)
+ icon_state = "door_closed"
+ else
+ icon_state = "door_open"
+
+/obj/machinery/door/unpowered/hotel_door/do_animate(animation)
+ switch(animation)
+ if("opening")
+ playsound(loc, doorOpen, 30, 1)
+ flick("door_opening", src)
+ if("closing")
+ playsound(loc, doorClose, 30, 1)
+ flick("door_closing", src)
+ if("deny")
+ playsound(src.loc, doorDeni, 50, 0, 3)
+ flick("door_deny", src)
+
+/obj/machinery/door/unpowered/hotel_door/autoclose()
+ if(!density && !operating && autoclose)
+ close()
+
+/obj/machinery/door/unpowered/hotel_door/emag_act(mob/user)
+ if(isliving(user) && density)
+ var/obj/effect/hotel_controller/H
+ if(H.controller)
+ H.controller.deploy_sec(user)
+ ..()
+
+/obj/item/weapon/card/hotel_card
+ name = "Key Card"
+ icon_state = "guest"
+ color = "#0CF"
+ var/id
+
+/obj/item/weapon/card/hotel_card/New(loc, ID)
+ ..()
+ if(ID)
+ id = ID
+ if(id)
+ name = "Key Card - [id]"
+ desc = "A key card to room [id]. Use it to open the door."
+
+/obj/item/weapon/card/hotel_card/Destroy()
+ var/mob/user = get(loc, /mob)
+ if(user)
+ to_chat(user, "\The [src] suddenly disappears in a flash!")
+ return ..()
+
+/obj/effect/hotel_controller
+ var/global/obj/effect/hotel_controller/controller
+
+ name = "Deep Space Hotel 419"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "x"
+ invisibility = 101
+ anchored = 1
+ density = 0
+ opacity = 0
+ var/list/room_doors[0] // assoc list of [room id]=hotel_door
+ var/list/vacant_rooms[0] // list of vacant room doors
+ var/list/guests[0] // assoc list of [guest mob]=room id
+
+ var/obj/item/device/radio/radio // for shouting at deadbeats
+
+/obj/effect/hotel_controller/New()
+ ..()
+ if(controller)
+ qdel(src)
+ controller = src
+
+ radio = new()
+ radio.broadcasting = 0
+ radio.listening = 0
+
+ // get room doors
+ for(var/obj/machinery/door/unpowered/hotel_door/D in get_area(src))
+ add_room(D)
+
+/obj/effect/hotel_controller/proc/add_room(obj/machinery/door/unpowered/hotel_door/D)
+ room_doors["[D.id]"] = D
+ vacant_rooms += D
+
+/obj/effect/hotel_controller/Destroy()
+ room_doors.Cut()
+ vacant_rooms.Cut()
+ guests.Cut()
+
+ if(radio)
+ qdel(radio)
+ radio = null
+
+ return ..()
+
+// to check a person into a room; no financial stuff; returns the keycard
+/obj/effect/hotel_controller/proc/checkin(roomid, mob/living/carbon/occupant, obj/item/weapon/card/id/id)
+ if(!istype(occupant))
+ return null
+ var/obj/machinery/door/unpowered/hotel_door/D = room_doors["[roomid]"]
+ if(!D || D.occupant || (occupant in guests))
+ return null
+
+ D.account = get_card_account(id, occupant)
+ if(!D.account)
+ return null
+ if(!D.account.charge(100, transaction_purpose = "10 minutes", dest_name = name))
+ return null
+
+ D.occupant = occupant
+ D.roomtimer = addtimer(src, "process_room", PAY_INTERVAL, 0, roomid)
+ vacant_rooms -= D
+ guests[occupant] = roomid
+
+ var/obj/item/weapon/card/hotel_card/C = new(ID = roomid)
+ D.card = C
+ return C
+
+/obj/effect/hotel_controller/proc/process_room(roomid)
+ var/obj/machinery/door/unpowered/hotel_door/D = room_doors["[roomid]"]
+ if(!D || !D.occupant)
+ return
+
+ if(D.account.charge(100, transaction_purpose = "10 minutes", dest_name = name))
+ D.roomtimer = addtimer(src, "process_room", PAY_INTERVAL, 0, roomid)
+ else
+ force_checkout(roomid)
+
+// Checks a person out of a room; no financial stuff
+/obj/effect/hotel_controller/proc/checkout(roomid)
+ var/obj/machinery/door/unpowered/hotel_door/D = room_doors["[roomid]"]
+ if(!D || !D.occupant)
+ return 0
+
+ guests -= D.occupant
+ D.occupant = null
+ D.account = null
+ deltimer(D.roomtimer)
+ D.roomtimer = null
+ qdel(D.card)
+ vacant_rooms += D
+ return 1
+
+// The person's card bounced mid-stay
+/obj/effect/hotel_controller/proc/force_checkout(roomid)
+ var/obj/machinery/door/unpowered/hotel_door/D = room_doors["[roomid]"]
+ if(!D || !D.occupant)
+ return 0
+
+ var/mob/deadbeat = D.occupant
+
+ radio.autosay("[deadbeat], your card has been rejected. You have 30 seconds to check out.", name, zlevel = list(z))
+ spawn(300)
+ if(D.occupant == deadbeat)
+ // they still haven't checked out...
+ deploy_sec(deadbeat)
+ checkout(roomid)
+
+/obj/effect/hotel_controller/proc/deploy_sec(mob/living/target)
+ if(!istype(target) || !istype(get_area(target), /area/awaymission/spacehotel))
+ return
+
+ var/list/secs[0]
+ for(var/mob/living/carbon/human/interactive/away/hotel/guard/M in get_area(src))
+ if(!M.retal)
+ secs += M
+ var/mob/living/carbon/human/interactive/away/hotel/guard/S = safepick(secs)
+ if(!S)
+ return
+
+ S.retal_target = target
+ S.retal = 1
+
+#undef CHECKOUT_TIME
diff --git a/code/modules/awaymissions/mission_code/spacehotel_npcs.dm b/code/modules/awaymissions/mission_code/spacehotel_npcs.dm
new file mode 100644
index 00000000000..d113731837d
--- /dev/null
+++ b/code/modules/awaymissions/mission_code/spacehotel_npcs.dm
@@ -0,0 +1,118 @@
+/mob/living/carbon/human/interactive/away/hotel
+ away_area = /area/awaymission/spacehotel
+ override_under = /obj/item/clothing/under/mafia
+ chattyness = SNPC_CHANCE_TALK / 4
+
+/mob/living/carbon/human/interactive/away/hotel/New(loc)
+ ..(loc, "Skrell")
+
+/mob/living/carbon/human/interactive/away/hotel/doSetup()
+ ..()
+ MYID.access += access_syndicate
+ RPID.access += access_syndicate
+
+/mob/living/carbon/human/interactive/away/hotel/guard
+ default_job = /datum/job/officer
+
+/mob/living/carbon/human/interactive/away/hotel/guard/doSetup()
+ ..("Guard")
+
+/mob/living/carbon/human/interactive/away/hotel/chef
+ default_job = /datum/job/chef
+ away_area = /area/awaymission/spacehotel/kitchen
+ override_under = /obj/item/clothing/under/mafia/vest
+
+/mob/living/carbon/human/interactive/away/hotel/bartender
+ default_job = /datum/job/bartender
+ override_under = /obj/item/clothing/under/mafia/vest
+
+/mob/living/carbon/human/interactive/away/hotel/concierge
+ override_under = /obj/item/clothing/under/mafia/white
+ away_area = /area/awaymission/spacehotel/reception
+ var/list/known_guests[0]
+ var/obj/effect/hotel_controller/hotel
+ var/obj/item/weapon/card/id/last_seen_id = null
+
+/mob/living/carbon/human/interactive/away/hotel/concierge/random()
+ ..()
+ equip_or_collect(new /obj/item/weapon/clipboard(src), slot_l_hand)
+
+/mob/living/carbon/human/interactive/away/hotel/concierge/doSetup()
+ ..("Concierge")
+
+/mob/living/carbon/human/interactive/away/hotel/concierge/setup_job()
+ favoured_types = list(/obj/item/weapon/paper, /obj/item/weapon/clipboard)
+ functions += list("stamping", "concierge")
+ restrictedJob = 1
+
+/mob/living/carbon/human/interactive/away/hotel/concierge/proc/concierge()
+ if(!hotel)
+ hotel = hotel.controller
+ if(!hotel)
+ return
+
+ var/verbs_use = pick_list(speak_file, "verbs_use")
+ var/verbs_touch = pick_list(speak_file, "verbs_touch")
+ var/verbs_move = pick_list(speak_file, "verbs_move")
+ var/nouns_generic = pick_list(speak_file, "nouns_generic")
+ var/adjective_insult = pick_list(speak_file, "adjective_insult")
+ var/adjective_objects = pick_list(speak_file, "adjective_objects")
+ var/adjective_generic = pick_list(speak_file, "adjective_generic")
+ var/curse_words = pick_list(speak_file, "curse_words")
+
+ var/found = 0
+ for(var/mob/living/carbon/human/H in nearby - known_guests)
+ pointed(H)
+ known_guests += H
+ found = 1
+ if(found)
+ say("Welcome to [hotel], [nouns_generic]! Please check in by [ing_verb(verbs_move)] and [ing_verb(verbs_use)] your [adjective_objects] ID onto the table.")
+ return
+
+ var/obj/item/weapon/card/id
+ var/id_seen = 0
+ for(var/obj/item/weapon/card/id/I in get_area(src))
+ id_seen = 1
+ if(I != last_seen_id)
+ id = I
+ if(!id_seen)
+ last_seen_id = null
+ return
+ if(!id)
+ return
+ var/turf/idloc = get_turf(id)
+ if(!Adjacent(idloc))
+ tryWalk(idloc)
+ else
+ // is the last jerk that touched it over here?
+ var/mob/id_owner
+ for(var/mob/living/carbon/human/H in nearby)
+ if(H.ckey == id.fingerprintslast)
+ id_owner = H
+ break
+
+ if(!id_owner)
+ say("Whose card is this?")
+ pointed(id)
+ return
+
+ last_seen_id = id
+ // Checking in or out?
+ if(id_owner in hotel.guests)
+ // Check out
+ say ("Hope you enjoyed your [adjective_objects] stay at our [adjective_generic] hotel!")
+ hotel.checkout(hotel.guests[id_owner])
+ else
+ // pick a room
+ var/obj/machinery/door/unpowered/hotel_door/D = safepick(hotel.vacant_rooms)
+ if(!D)
+ say("Sorry, all the [adjective_objects] are occupied currently.")
+ else
+ // Check in
+ say("$100 per 10 minutes. The cost will be automatically [past_verb(verbs_touch)] while you're checked in.")
+
+ var/obj/item/weapon/card/hotel_card/K = hotel.checkin(D.id, id_owner, id)
+ if(K)
+ K.forceMove(idloc)
+ else
+ say("Your [adjective_insult] [curse_words] card was rejected.")
\ No newline at end of file
diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm
index 5f644146c5e..dcb10c651c0 100644
--- a/code/modules/awaymissions/mission_code/stationCollision.dm
+++ b/code/modules/awaymissions/mission_code/stationCollision.dm
@@ -175,7 +175,7 @@ var/sc_safecode5 = "[rand(0,9)]"
/obj/singularity/narsie/sc_Narsie/consume(var/atom/A)
if(is_type_in_list(A, uneatable))
return 0
- if (istype(A,/mob/living))
+ if(istype(A,/mob/living))
var/mob/living/L = A
L.gib()
else if(istype(A,/obj/))
diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm
index d28d67f1f35..3db7ff86668 100644
--- a/code/modules/awaymissions/mission_code/wildwest.dm
+++ b/code/modules/awaymissions/mission_code/wildwest.dm
@@ -65,7 +65,7 @@
else if(is_special_character(user))
to_chat(user, "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away.")
- else if (!insistinga)
+ else if(!insistinga)
to_chat(user, "Your first touch makes the Wish Granter stir, listening to you. Are you really sure you want to do this?")
insistinga++
@@ -172,7 +172,7 @@
if(istype(M, /mob/living/carbon/human))
for(var/mob/O in viewers(world.view, src.loc))
- to_chat(O, "[M] triggered the \icon[src] [src] ")
+ to_chat(O, "[M] triggered the [bicon(src)] [src] ")
triggered = 1
call(src,triggerproc)(M)
diff --git a/code/modules/awaymissions/snpc.dm b/code/modules/awaymissions/snpc.dm
new file mode 100644
index 00000000000..bd7046e3b2c
--- /dev/null
+++ b/code/modules/awaymissions/snpc.dm
@@ -0,0 +1,83 @@
+/mob/living/carbon/human/interactive/away
+ var/away_area = /area/awaymission // their overriden job area
+ var/override_under = null // optional type for uniform, else default for job
+ var/squad_member = 0 // was spawned by squad
+ var/home_z
+
+/mob/living/carbon/human/interactive/away/New()
+ ..()
+ TRAITS |= TRAIT_ROBUST
+ faction += "away"
+
+/mob/living/carbon/human/interactive/away/random()
+ if(ispath(override_under, /obj/item/clothing/under))
+ equip_to_slot(new override_under(src), slot_w_uniform)
+ ..()
+
+/mob/living/carbon/human/interactive/away/doSetup()
+ ..()
+ var/datum/data/pda/app/messenger/M = MYPDA.find_program(/datum/data/pda/app/messenger)
+ M.toff = 1
+ var/datum/data/pda/app/chatroom/C = MYPDA.find_program(/datum/data/pda/app/chatroom)
+ C.toff = 1
+
+/mob/living/carbon/human/interactive/away/job2area()
+ return away_area
+
+/mob/living/carbon/human/interactive/away/doProcess()
+ if(!home_z)
+ home_z = get_turf(z)
+ if(home_z != get_turf(z))
+ gib()
+ ..()
+
+/obj/effect/spawner/snpc_squad
+ name = "squad spawner"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "x"
+ density = 0
+ opacity = 0
+ invisibility = 101
+ var/squad_type = /mob/living/carbon/human/interactive/away
+ var/squad_size = 3
+
+ var/global/list/squads[0]
+ var/list/squad
+
+/obj/effect/spawner/snpc_squad/New()
+ processing_objects += src
+
+ squad = squads[squad_type]
+ if(!squad)
+ squad = list()
+ squads[squad_type] = squad
+ squad += src
+
+/obj/effect/spawner/snpc_squad/Destroy()
+ squad = null
+ processing_objects -= src
+ return ..()
+
+/obj/effect/spawner/snpc_squad/process()
+ // check squad memebers
+ var/living = 0
+ for(var/mob/living/carbon/human/interactive/away/A in squad)
+ if(!A.stat)
+ living++
+ else
+ // see if anyone's looking, if not, despawn
+ var/can_despawn = 1
+ for(var/mob/living/M in viewers(A, world.view + 1))
+ if(M.client)
+ living++ // dead guy that can be seen still takes up a slot
+ can_despawn = 0
+ break
+ if(can_despawn)
+ squad -= A
+ qdel(A)
+
+ // spawn new ones
+ if(living < squad_size && !length(viewers(src, world.view)))
+ var/mob/living/carbon/human/interactive/away/A = new squad_type(loc)
+ squad += A
+ A.squad_member = 1
\ No newline at end of file
diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm
index 321e4033f0e..7fff68cf031 100644
--- a/code/modules/awaymissions/zlevel.dm
+++ b/code/modules/awaymissions/zlevel.dm
@@ -1,14 +1,27 @@
+var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away_mission_config.txt")
+
+// Call this before you remove the last dirt on a z level - that way, all objects
+// will have proper atmos and other important enviro things
/proc/late_setup_level(turfs, smoothTurfs)
+ var/total_timer = start_watch()
+ var/subtimer = start_watch()
if(!smoothTurfs)
smoothTurfs = turfs
+ log_debug("Setting up atmos")
if(air_master)
air_master.setup_allturfs(turfs)
+ log_debug("\tTook [stop_watch(subtimer)]s")
+
+ subtimer = start_watch()
+ log_debug("Initializing lighting")
for(var/turf/T in turfs)
if(T.dynamic_lighting)
T.lighting_build_overlays()
- for(var/obj/structure/cable/PC in T)
- makepowernet_for(PC)
+ log_debug("\tTook [stop_watch(subtimer)]s")
+
+ subtimer = start_watch()
+ log_debug("Smoothing tiles")
for(var/turf/T in smoothTurfs)
if(T.smooth)
smooth_icon(T)
@@ -16,59 +29,47 @@
var/atom/A = R
if(A.smooth)
smooth_icon(A)
+ if(istype(T, /turf/simulated/mineral)) // For the listening post, among other maps
+ var/turf/simulated/mineral/MT = T
+ MT.add_edges()
+ log_debug("\tTook [stop_watch(subtimer)]s")
+ log_debug("Late setup finished - took [stop_watch(total_timer)]s")
+
+/proc/empty_rect(low_x,low_y, hi_x,hi_y, z)
+ var/timer = start_watch()
+ log_debug("Emptying region: ([low_x], [low_y]) to ([hi_x], [hi_y]) on z '[z]'")
+ empty_region(block(locate(low_x, low_y, z), locate(hi_x, hi_y, z)))
+ log_debug("Took [stop_watch(timer)]s")
+
+/proc/empty_region(list/turfs)
+ for(var/thing in turfs)
+ var/turf/T = thing
+ for(var/otherthing in T)
+ qdel(otherthing)
+ T.ChangeTurf(/turf/space)
/proc/createRandomZlevel()
if(awaydestinations.len) //crude, but it saves another var!
return
- var/list/potentialRandomZlevels = list()
- log_startup_progress("Searching for away missions...")
- var/list/Lines
- if(fexists("config/away_mission_config.txt"))
- Lines = file2list("config/away_mission_config.txt")
- else
- Lines = file2list("config/example/away_mission_config.txt")
-
- if(!Lines.len) return
- for (var/t in Lines)
- if (!t)
- continue
-
- t = trim(t)
- if (length(t) == 0)
- continue
- else if (copytext(t, 1, 2) == "#")
- continue
-
- var/pos = findtext(t, " ")
- var/name = null
- // var/value = null
-
- if (pos)
- name = lowertext(copytext(t, 1, pos))
- // value = copytext(t, pos + 1)
- else
- name = lowertext(t)
-
- if (!name)
- continue
-
- potentialRandomZlevels.Add(t)
-
-
- if(potentialRandomZlevels.len)
+ if(potentialRandomZlevels && potentialRandomZlevels.len)
var/watch = start_watch()
log_startup_progress("Loading away mission...")
var/map = pick(potentialRandomZlevels)
var/file = file(map)
if(isfile(file))
- maploader.load_map(file, do_sleep = 0)
- late_setup_level(block(locate(1, 1, world.maxz), locate(world.maxx, world.maxy, world.maxz)))
+ var/zlev = zlevels.add_new_zlevel()
+ zlevels.add_dirt(zlev)
+ maploader.load_map(file, z_offset = zlev)
+ late_setup_level(block(locate(1, 1, zlev), locate(world.maxx, world.maxy, zlev)))
+ zlevels.remove_dirt(zlev)
log_to_dd(" Away mission loaded: [map]")
+ //map_transition_config.Add(AWAY_MISSION_LIST)
+
for(var/obj/effect/landmark/L in landmarks_list)
- if (L.name != "awaystart")
+ if(L.name != "awaystart")
continue
awaydestinations.Add(L)
@@ -76,4 +77,140 @@
else
log_startup_progress(" No away missions found.")
- return
\ No newline at end of file
+ return
+
+/proc/createALLZlevels()
+ if(awaydestinations.len) //crude, but it saves another var!
+ return
+
+ if(potentialRandomZlevels && potentialRandomZlevels.len)
+ var/watch = start_watch()
+ log_startup_progress("Loading away missions...")
+
+ for(var/map in potentialRandomZlevels)
+ var/file = file(map)
+ if(isfile(file))
+ log_startup_progress("Loading away mission: [map]")
+ var/zlev = zlevels.add_new_zlevel()
+ zlevels.add_dirt(zlev)
+ maploader.load_map(file, z_offset = zlev)
+ late_setup_level(block(locate(1, 1, zlev), locate(world.maxx, world.maxy, zlev)))
+ zlevels.remove_dirt(zlev)
+ log_to_dd(" Away mission loaded: [map]")
+
+ //map_transition_config.Add(AWAY_MISSION_LIST)
+
+ for(var/obj/effect/landmark/L in landmarks_list)
+ if(L.name != "awaystart")
+ continue
+ awaydestinations.Add(L)
+
+ log_startup_progress(" Away mission loaded in [stop_watch(watch)]s.")
+ watch = start_watch()
+
+ else
+ log_startup_progress(" No away missions found.")
+ return
+
+/proc/generateMapList(filename)
+ var/list/potentialMaps = list()
+ var/list/Lines = file2list(filename)
+
+ if(!Lines.len)
+ return
+ for(var/t in Lines)
+ if(!t)
+ continue
+
+ t = trim(t)
+ if(length(t) == 0)
+ continue
+ else if(copytext(t, 1, 2) == "#")
+ continue
+
+ var/pos = findtext(t, " ")
+ var/name = null
+
+ if(pos)
+ name = lowertext(copytext(t, 1, pos))
+
+ else
+ name = lowertext(t)
+
+ if(!name)
+ continue
+
+ potentialMaps.Add(t)
+
+ return potentialMaps
+
+
+/proc/seedRuins(z_level = 1, budget = 0, whitelist = /area/space, list/potentialRuins = space_ruins_templates)
+ var/overall_sanity = 100
+ var/ruins = potentialRuins.Copy()
+ var/initialbudget = budget
+ var/watch = start_watch()
+
+ log_startup_progress("Loading ruins...")
+
+ while(budget > 0 && overall_sanity > 0)
+ // Pick a ruin
+ var/datum/map_template/ruin/ruin = ruins[pick(ruins)]
+ // Can we afford it
+ if(ruin.cost > budget)
+ overall_sanity--
+ continue
+ // If so, try to place it
+ var/sanity = 100
+ // And if we can't fit it anywhere, give up, try again
+
+ while(sanity > 0)
+ sanity--
+ var/turf/T = locate(rand(25, world.maxx - 25), rand(25, world.maxy - 25), z_level)
+ var/valid = 1
+
+ for(var/turf/check in ruin.get_affected_turfs(T,1))
+ var/area/new_area = get_area(check)
+ if(!(istype(new_area, whitelist)))
+ valid = 0
+ break
+
+ if(!valid)
+ continue
+
+ log_to_dd(" Ruin \"[ruin.name]\" loaded in [stop_watch(watch)]s at ([T.x], [T.y], [T.z]).")
+
+ var/obj/effect/ruin_loader/R = new /obj/effect/ruin_loader(T)
+ R.Load(ruins,ruin)
+ budget -= ruin.cost
+ if(!ruin.allow_duplicates)
+ ruins -= ruin.name
+ break
+
+ to_chat(world, " Loaded ruins. Or not. ") //So the players don't know if we loaded ruins, but we do have a message
+
+ if(initialbudget == budget) //Kill me
+ log_to_dd(" No ruins loaded.")
+
+
+/obj/effect/ruin_loader
+ name = "random ruin"
+ desc = "If you got lucky enough to see this..."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "syndballoon"
+ invisibility = 0
+
+/obj/effect/ruin_loader/proc/Load(list/potentialRuins = space_ruins_templates, datum/map_template/template = null)
+ var/list/possible_ruins = list()
+ for(var/A in potentialRuins)
+ var/datum/map_template/T = potentialRuins[A]
+ if(!T.loaded)
+ possible_ruins += T
+ if(!template && possible_ruins.len)
+ template = safepick(possible_ruins)
+ if(!template)
+ return 0
+ template.load(get_turf(src),centered = 1)
+ template.loaded++
+ qdel(src)
+ return 1
diff --git a/code/modules/awaymissions/zvis.dm b/code/modules/awaymissions/zvis.dm
new file mode 100644
index 00000000000..06d60f3389f
--- /dev/null
+++ b/code/modules/awaymissions/zvis.dm
@@ -0,0 +1,369 @@
+/area/awaymission/upperlevel
+ name = "Open Space"
+ color = "#888"
+ lighting_use_dynamic = 0
+ requires_power = 0
+
+// Used by /turf/unsimulated/floor/upperlevel as a reference for where the other floor is
+/obj/effect/levelref
+ name = "level reference"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "x2"
+ invisibility = 101
+
+ var/id = null
+ var/obj/effect/levelref/other = null
+ var/offset_x
+ var/offset_y
+ var/offset_z
+ var/global/list/levels[0]
+
+/obj/effect/levelref/New()
+ ..()
+ levels += src
+
+/obj/effect/levelref/initialize()
+ ..()
+ for(var/obj/effect/levelref/O in levels)
+ if(id == O.id && O != src)
+ other = O
+ update_offset()
+ O.other = src
+ O.update_offset()
+ for(var/turf/unsimulated/floor/upperlevel/U in get_area(loc))
+ U.init(src)
+ return
+
+/obj/effect/levelref/Destroy()
+ levels -= src
+ return ..()
+
+/obj/effect/levelref/proc/update_offset()
+ offset_x = other.x - x
+ offset_y = other.y - y
+ offset_z = other.z - z
+
+// Used by /turf/unsimulated/floor/upperlevel and /obj/effect/view_portal/visual
+// to know if the world changed on the remote side
+/obj/effect/portal_sensor
+ invisibility = 101
+ var/light_hash = -1
+ var/triggered_this_tick = 0
+ var/datum/owner // owner that receive signals
+ var/list/params[0] // what to send to the main object to indicate which sensor
+ var/trigger_limit = 5 // number of time we're allowed to trigger per ptick
+
+/obj/effect/portal_sensor/New(loc, o, ...)
+ ..()
+ owner = o
+ if(args.len >= 3)
+ params = args.Copy(3)
+ processing_objects += src
+ trigger()
+
+/obj/effect/portal_sensor/Destroy()
+ processing_objects -= src
+ return ..()
+
+/obj/effect/portal_sensor/Crossed(A)
+ trigger()
+
+/obj/effect/portal_sensor/Uncrossed(A)
+ trigger()
+
+/obj/effect/portal_sensor/process()
+ check_light()
+ if(triggered_this_tick >= trigger_limit)
+ call(owner, "trigger")(arglist(params))
+ triggered_this_tick = 0
+
+/obj/effect/portal_sensor/proc/trigger()
+ triggered_this_tick++
+ if(triggered_this_tick < trigger_limit)
+ call(owner, "trigger")(arglist(params))
+
+/obj/effect/portal_sensor/proc/check_light()
+ var/turf/T = loc
+ if(istype(T) && T.lighting_overlay && !T.lighting_overlay.needs_update)
+ var/atom/movable/lighting_overlay/O = T.lighting_overlay
+ var/hash = O.lum_r + O.lum_g + O.lum_b
+ if(hash != light_hash)
+ light_hash = hash
+ trigger()
+ else
+ if(light_hash != -1)
+ light_hash = -1
+ trigger()
+
+// for second floor showing floor below
+/turf/unsimulated/floor/upperlevel
+ icon = 'icons/turf/areas.dmi'
+ icon_state = "dark128"
+ layer = AREA_LAYER + 0.5
+ appearance_flags = TILE_BOUND | KEEP_TOGETHER
+ var/turf/lower_turf
+ var/obj/effect/portal_sensor/sensor
+
+/turf/unsimulated/floor/upperlevel/New()
+ ..()
+ var/obj/effect/levelref/R = locate() in get_area(src)
+ if(R && R.other)
+ init(R)
+
+/turf/unsimulated/floor/upperlevel/Destroy()
+ qdel(sensor)
+ sensor = null
+ return ..()
+
+/turf/unsimulated/floor/upperlevel/proc/init(var/obj/effect/levelref/R)
+ lower_turf = locate(x + R.offset_x, y + R.offset_y, z + R.offset_z)
+ if(lower_turf)
+ sensor = new(lower_turf, src)
+
+/turf/unsimulated/floor/upperlevel/Entered(atom/movable/AM, atom/OL, ignoreRest = 0)
+ if(isliving(AM) || istype(AM, /obj))
+ if(isliving(AM))
+ var/mob/living/M = AM
+ M.emote("scream")
+ M.SpinAnimation(5, 1)
+ AM.forceMove(lower_turf)
+
+/turf/unsimulated/floor/upperlevel/attack_ghost(mob/user)
+ user.forceMove(lower_turf)
+
+/turf/unsimulated/floor/upperlevel/proc/trigger()
+ name = lower_turf.name
+ desc = lower_turf.desc
+
+ // render each atom
+ underlays.Cut()
+ for(var/X in list(lower_turf) + lower_turf.contents)
+ var/atom/A = X
+ if(A && A.invisibility <= SEE_INVISIBLE_LIVING)
+ var/image/I = image(A, layer = AREA_LAYER + A.layer * 0.01, dir = A.dir)
+ I.pixel_x = A.pixel_x
+ I.pixel_y = A.pixel_y
+ underlays += I
+
+// remote end of narnia portal
+/obj/effect/view_portal
+ name = "portal target"
+ icon = 'icons/mob/screen_gen.dmi'
+ icon_state = "x2"
+ invisibility = 101
+ anchored = 1
+
+ var/id = null // id of other portal turf we connect to
+
+ var/obj/effect/view_portal/other = null
+ var/global/list/portals[0]
+
+/obj/effect/view_portal/New()
+ ..()
+ portals += src
+
+/obj/effect/view_portal/initialize()
+ ..()
+ if(id)
+ for(var/obj/effect/view_portal/O in portals)
+ if(id == O.id && O != src && can_link(O))
+ other = O
+ O.other = src
+ linkup()
+ O.linkup()
+ if(other)
+ return
+
+/obj/effect/view_portal/Destroy()
+ portals -= src
+ return ..()
+
+/obj/effect/view_portal/proc/can_link(obj/effect/view_portal/P)
+ return P.type == /obj/effect/view_portal/visual && !P.other
+
+/obj/effect/view_portal/proc/linkup()
+ // allow it to link to multiple visual nodes
+ other = null
+
+// near end of nania portal
+/obj/effect/view_portal/visual
+ name = "???"
+ desc = "You'll have to get closer to clearly see what this is."
+
+ icon = 'icons/turf/floors.dmi'
+ icon_state = "loadingarea"
+ opacity = 1
+ density = 1
+ invisibility = 0
+ appearance_flags = TILE_BOUND | KEEP_TOGETHER
+ var/dist = 6 // dist that we render out
+ var/radius = 3 // dist we render on other axis, in each direction
+ var/frustrum = 0 // if 1, get wider and wider at each step outward
+ var/teleport = 1 // should teleport?
+
+ var/list/render_block
+ var/list/sensors[0]
+ var/list/tiles[0]
+
+ var/list/near_render_block
+ var/turf/near_viewpoint
+
+/obj/effect/view_portal/visual/Destroy()
+ for(var/T in sensors)
+ qdel(sensors[T])
+ sensors.Cut()
+ sensors = null
+ for(var/T in tiles)
+ qdel(tiles[T])
+ tiles.Cut()
+ tiles = null
+ render_block = null
+ near_render_block = null
+ near_viewpoint = null
+ return ..()
+
+/obj/effect/view_portal/visual/can_link(obj/effect/view_portal/P)
+ return P.type == /obj/effect/view_portal
+
+/obj/effect/view_portal/visual/linkup()
+ icon = null
+ icon_state = null
+ var/turf/Tloc = get_turf(loc)
+ if(Tloc)
+ Tloc.icon = null
+ Tloc.icon_state = null
+ Tloc.dynamic_lighting = 0
+ layer = AREA_LAYER + 0.5
+
+ // setup references
+ var/crossdir = angle2dir((dir2angle(dir) + 90) % 360)
+ near_viewpoint = get_step(get_turf(src), GetOppositeDir(dir))
+
+ // setup far turfs
+ var/turf/T1 = get_turf(other)
+ var/turf/T2 = T1
+
+ for(var/i in 1 to radius)
+ T1 = get_step(T1, crossdir)
+ T2 = get_step(T2, GetOppositeDir(crossdir))
+ if(frustrum)
+ // make a trapazoid, with length dist, short end radius*2 long,
+ // and 45 degree angles
+ render_block = block(T1, T2)
+ for(var/i in 1 to dist)
+ T1 = get_step(get_step(T1, dir), crossdir)
+ T2 = get_step(get_step(T2, dir), GetOppositeDir(crossdir))
+ render_block += block(T1, T2)
+ else
+ // else make a box dist x radius*2
+ for(var/i in 1 to dist)
+ T2 = get_step(T2, dir)
+ render_block = block(T1, T2)
+ for(var/turf/T in render_block)
+ sensors[T] = new /obj/effect/portal_sensor(T, src, 0, T)
+
+// setup turfs on this side of the portal to cover the map streaming
+// has to be done later for view() to be correct (so it happens when the walls exist)
+/obj/effect/view_portal/visual/proc/setup_near()
+ var/nvs = dir & (EAST|WEST) ? near_viewpoint.x - x : near_viewpoint.y - y
+ if(nvs)
+ nvs = SIGN(nvs)
+ // need a mob for view() to work correctly
+ var/mob/M = new(near_viewpoint)
+ M.see_invisible = SEE_INVISIBLE_LIVING
+ near_render_block = view(M, world.view)
+ qdel(M)
+ for(var/A in near_render_block)
+ var/turf/T = A
+ if(istype(T))
+ var/ts = dir & (EAST|WEST) ? T.x - x : T.y - y
+ if(ts)
+ ts = SIGN(ts)
+ if(nvs == ts)
+ sensors[T] = new /obj/effect/portal_sensor(T, src, 1, T)
+ else
+ near_render_block -= T
+ else
+ near_render_block -= T
+
+/obj/effect/view_portal/visual/Bumped(atom/movable/thing)
+ if((istype(thing, /obj) || isliving(thing)) && other && teleport)
+ if(!near_render_block)
+ setup_near()
+
+ var/mob/living/M = thing
+ // make the person glide onto the dest, giving a smooth transition
+ var/ox = thing.x - x
+ var/oy = thing.y - y
+ if(istype(M) && M.client)
+ M.notransform = 1
+ // cover up client-side map loading
+ M.screen_loc = "CENTER"
+ M.client.screen += M
+ for(var/T in tiles)
+ M.client.screen += tiles[T]
+
+ // wait a tick for the screen to replicate across network
+ // or this whole exercise of covering the transition is pointless
+ spawn(1)
+ thing.forceMove(locate(other.x + ox, other.y + oy, other.z))
+ sleep(1)
+ if(istype(M) && M.client)
+ for(var/T in tiles)
+ M.client.screen -= tiles[T]
+ M.client.screen -= M
+ M.screen_loc = initial(M.screen_loc)
+ thing.forceMove(get_turf(other.loc))
+ if(istype(M) && M.client)
+ M.notransform = 0
+
+/obj/effect/view_portal/visual/attack_ghost(mob/user)
+ user.forceMove(get_turf(other.loc))
+
+/obj/effect/view_portal/visual/proc/trigger(near, turf/T)
+ var/obj/effect/view_portal_dummy/D = tiles[T]
+ if(D)
+ D.overlays.Cut()
+ else
+ D = new(src, near, T)
+ tiles[T] = D
+
+ // render atoms to overlays of a dummy object
+ if(D.name != T.name)
+ D.name = T.name
+ D.desc = T.desc
+ for(var/AX in list(T) + T.contents)
+ var/atom/A = AX
+ if(A && A.invisibility <= SEE_INVISIBLE_LIVING)
+ var/image/I = image(A, layer = D.layer + A.layer * 0.01, dir = A.dir)
+ I.pixel_x = A.pixel_x
+ I.pixel_y = A.pixel_y
+ D.overlays += I
+
+// tile of rendered other side for narnia portal
+/obj/effect/view_portal_dummy
+ var/obj/effect/view_portal/visual/owner
+
+/obj/effect/view_portal_dummy/New(obj/effect/view_portal/visual/V, near, turf/T)
+ ..()
+ if(!near)
+ loc = V.loc
+ owner = V
+
+ var/ox
+ var/oy
+ if(near)
+ ox = (T.x - V.near_viewpoint.x)
+ oy = (T.y - V.near_viewpoint.y)
+ layer = AREA_LAYER + 0.4
+ else
+ ox = T.x - V.other.x + V.x - V.near_viewpoint.x
+ oy = T.y - V.other.y + V.y - V.near_viewpoint.y
+ pixel_x = 32 * (T.x - V.other.x)
+ pixel_y = 32 * (T.y - V.other.y)
+ layer = AREA_LAYER + 0.5
+ if(abs(ox) <= world.view && abs(oy) <= world.view)
+ screen_loc = "CENTER[ox >= 0 ? "+" : ""][ox],CENTER[oy >= 0 ? "+" : ""][oy]"
+
+/obj/effect/view_portal_dummy/attack_ghost(mob/user)
+ owner.attack_ghost(user)
diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm
index ac4a426fe08..f51f83cafb2 100644
--- a/code/modules/client/asset_cache.dm
+++ b/code/modules/client/asset_cache.dm
@@ -46,10 +46,10 @@ You can set verify to TRUE if you want send() to sleep until the client has the
client << browse_rsc(asset_cache[asset_name], asset_name)
if(!verify || !winexists(client, "asset_cache_browser")) // Can't access the asset cache browser, rip.
- if (client)
+ if(client)
client.cache += asset_name
return 1
- if (!client)
+ if(!client)
return 0
client.sending |= asset_name
@@ -91,17 +91,17 @@ You can set verify to TRUE if you want send() to sleep until the client has the
var/list/unreceived = asset_list - (client.cache + client.sending)
if(!unreceived || !unreceived.len)
return 0
- if (unreceived.len >= ASSET_CACHE_TELL_CLIENT_AMOUNT)
+ if(unreceived.len >= ASSET_CACHE_TELL_CLIENT_AMOUNT)
to_chat(client, "Sending Resources...")
for(var/asset in unreceived)
- if (asset in asset_cache)
+ if(asset in asset_cache)
client << browse_rsc(asset_cache[asset], asset)
if(!verify || !winexists(client, "asset_cache_browser")) // Can't access the asset cache browser, rip.
- if (client)
+ if(client)
client.cache += unreceived
return 1
- if (!client)
+ if(!client)
return 0
client.sending |= unreceived
var/job = ++client.last_asset_job
@@ -129,9 +129,9 @@ You can set verify to TRUE if you want send() to sleep until the client has the
//The proc calls procs that sleep for long times.
proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE)
for(var/file in files)
- if (!client)
+ if(!client)
break
- if (register_asset)
+ if(register_asset)
register_asset(file,files[file])
send_asset(client,file)
sleep(-1) //queuing calls like this too quickly can cause issues in some client versions
@@ -159,7 +159,7 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE)
//get a assetdatum or make a new one
/proc/get_asset_datum(var/type)
- if (!(type in asset_datums))
+ if(!(type in asset_datums))
return new type()
return asset_datums[type]
@@ -240,14 +240,14 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE)
/datum/asset/nanoui/register()
// Crawl the directories to find files.
- for (var/path in common_dirs)
+ for(var/path in common_dirs)
var/list/filenames = flist(path)
for(var/filename in filenames)
if(copytext(filename, length(filename)) != "/") // Ignore directories.
if(fexists(path + filename))
common[filename] = fcopy_rsc(path + filename)
register_asset(filename, common[filename])
- for (var/path in uncommon_dirs)
+ for(var/path in uncommon_dirs)
var/list/filenames = flist(path)
for(var/filename in filenames)
if(copytext(filename, length(filename)) != "/") // Ignore directories.
@@ -260,3 +260,18 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE)
send_asset_list(client, uncommon)
send_asset_list(client, common)
+
+/datum/asset/chem_master
+ var/assets = list()
+ var/verify = FALSE
+
+/datum/asset/chem_master/register()
+ for(var/i = 1 to 20)
+ assets["pill[i].png"] = icon('icons/obj/chemical.dmi', "pill[i]")
+ for(var/i = 1 to 20)
+ assets["bottle[i].png"] = icon('icons/obj/chemical.dmi', "bottle[i]")
+ for(var/asset_name in assets)
+ register_asset(asset_name, assets[asset_name])
+
+/datum/asset/chem_master/send(client)
+ send_asset_list(client,assets,verify)
\ No newline at end of file
diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm
index 30e4793c747..c1cbd07daee 100644
--- a/code/modules/client/client defines.dm
+++ b/code/modules/client/client defines.dm
@@ -84,4 +84,8 @@
var/datum/click_intercept/click_intercept = null
//datum that controls the displaying and hiding of tooltips
- var/datum/tooltip/tooltips
\ No newline at end of file
+ var/datum/tooltip/tooltips
+
+ // Their chat window, sort of important.
+ // See /goon/code/datums/browserOutput.dm
+ var/datum/chatOutput/chatOutput
\ No newline at end of file
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 756e5c6b156..0d56f0d1122 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -8,6 +8,8 @@
#define UPLOAD_LIMIT 10485760 //Restricts client uploads to the server to 10MB //Boosted this thing. What's the worst that can happen?
#define MIN_CLIENT_VERSION 0 //Just an ambiguously low version for now, I don't want to suddenly stop people playing.
//I would just like the code ready should it ever need to be used.
+#define SUGGESTED_CLIENT_VERSION 510 // only integers (e.g: 510, 511) useful here. Does not properly handle minor versions (e.g: 510.58, 511.848)
+
/*
When somebody clicks a link in game, this Topic is called first.
It does the stuff in this proc and then is redirected to the Topic() proc for the src=[0xWhatever]
@@ -43,6 +45,9 @@
completed_asset_jobs += job
return
+ if(href_list["_src_"] == "chat")
+ return chatOutput.Topic(href, href_list)
+
//Reduces spamming of links by dropping calls that happen during the delay period
if(next_allowed_topic_time > world.time)
return
@@ -203,6 +208,11 @@
if("prefs") return prefs.process_link(usr,href_list)
if("vars") return view_var_Topic(href,href_list,hsrc)
+
+ switch(href_list["action"])
+ if("openLink")
+ src << link(href_list["link"])
+
..() //redirect to hsrc.Topic()
/client/proc/is_content_unlocked()
@@ -245,12 +255,15 @@
//CONNECT//
///////////
/client/New(TopicData)
+ chatOutput = new /datum/chatOutput(src) // Right off the bat.
TopicData = null //Prevent calls to client.Topic from connect
if(connection != "seeker") //Invalid connection type.
return null
- if(byond_version < MIN_CLIENT_VERSION) //Out of date client.
+ if(byond_version < MIN_CLIENT_VERSION) // Too out of date to play at all. Unfortunately, we can't send them a message here.
return null
+ if(byond_version < SUGGESTED_CLIENT_VERSION) // Update is suggested, but not required.
+ to_chat(src,"Your BYOND client (v: [byond_version]) is out of date. This can cause glitches. We highly suggest you download the latest client from http://www.byond.com/ before playing. ")
if(IsGuestKey(key))
alert(src,"This server doesn't allow guest accounts to play. Please go to http://www.byond.com/ and register for a key.","Guest","OK")
@@ -283,6 +296,7 @@
prefs.last_id = computer_id //these are gonna be used for banning
. = ..() //calls mob.Login()
+ chatOutput.start()
if(custom_event_msg && custom_event_msg != "")
to_chat(src, "Custom Event ")
@@ -307,8 +321,8 @@
log_client_to_db()
- if (ckey in clientmessages)
- for (var/message in clientmessages[ckey])
+ if(ckey in clientmessages)
+ for(var/message in clientmessages[ckey])
to_chat(src, message)
clientmessages.Remove(ckey)
@@ -348,7 +362,7 @@
/client/proc/log_client_to_db()
- if ( IsGuestKey(src.key) )
+ if( IsGuestKey(src.key) )
return
establish_db_connection()
diff --git a/code/modules/client/message.dm b/code/modules/client/message.dm
index 6406a7d051a..a5c78008b4f 100644
--- a/code/modules/client/message.dm
+++ b/code/modules/client/message.dm
@@ -2,8 +2,8 @@ var/list/clientmessages = list()
proc/addclientmessage(var/ckey, var/message)
ckey = ckey(ckey)
- if (!ckey || !message)
+ if(!ckey || !message)
return
- if (!(ckey in clientmessages))
+ if(!(ckey in clientmessages))
clientmessages[ckey] = list()
clientmessages[ckey] += message
diff --git a/code/modules/client/preference/loadout/gear_tweaks.dm b/code/modules/client/preference/loadout/gear_tweaks.dm
new file mode 100644
index 00000000000..6458a51b9a3
--- /dev/null
+++ b/code/modules/client/preference/loadout/gear_tweaks.dm
@@ -0,0 +1,113 @@
+/datum/gear_tweak/proc/get_contents(var/metadata)
+ return
+
+/datum/gear_tweak/proc/get_metadata(var/user, var/metadata)
+ return
+
+/datum/gear_tweak/proc/get_default()
+ return
+
+/datum/gear_tweak/proc/tweak_gear_data(var/metadata, var/datum/gear_data)
+ return
+
+/datum/gear_tweak/proc/tweak_item(var/obj/item/I, var/metadata)
+ return
+
+/*
+* Color adjustment
+*/
+
+var/datum/gear_tweak/color/gear_tweak_free_color_choice = new()
+
+/datum/gear_tweak/color
+ var/list/valid_colors
+
+/datum/gear_tweak/color/New(var/list/colors)
+ valid_colors = colors
+ ..()
+
+/datum/gear_tweak/color/get_contents(var/metadata)
+ return "Color: ⚫ "
+
+/datum/gear_tweak/color/get_default()
+ return valid_colors ? valid_colors[1] : COLOR_GRAY
+
+/datum/gear_tweak/color/get_metadata(var/user, var/metadata)
+ if(valid_colors)
+ return input(user, "Choose an item color.", "Character Preference", metadata) as null|anything in valid_colors
+ return input(user, "Choose an item color.", "Global Preference", metadata) as color|null
+
+/datum/gear_tweak/color/tweak_item(var/obj/item/I, var/metadata)
+ if(valid_colors && !(metadata in valid_colors))
+ return
+ I.color = metadata
+
+/*
+* Path adjustment
+*/
+
+/datum/gear_tweak/path
+ var/list/valid_paths
+
+/datum/gear_tweak/path/New(var/list/paths)
+ valid_paths = paths
+ ..()
+
+/datum/gear_tweak/path/get_contents(var/metadata)
+ return "Type: [metadata]"
+
+/datum/gear_tweak/path/get_default()
+ return valid_paths[1]
+
+/datum/gear_tweak/path/get_metadata(var/user, var/metadata)
+ return input(user, "Choose a type.", "Character Preference", metadata) as null|anything in valid_paths
+
+/datum/gear_tweak/path/tweak_gear_data(var/metadata, var/datum/gear_data/gear_data)
+ if(!(metadata in valid_paths))
+ return
+ gear_data.path = valid_paths[metadata]
+
+/*
+* Content adjustment
+*/
+
+/datum/gear_tweak/contents
+ var/list/valid_contents
+
+/datum/gear_tweak/contents/New()
+ valid_contents = args.Copy()
+ ..()
+
+/datum/gear_tweak/contents/get_contents(var/metadata)
+ return "Contents: [english_list(metadata, and_text = ", ")]"
+
+/datum/gear_tweak/contents/get_default()
+ . = list()
+ for(var/i = 1 to valid_contents.len)
+ . += "Random"
+
+/datum/gear_tweak/contents/get_metadata(var/user, var/list/metadata)
+ . = list()
+ for(var/i = metadata.len to valid_contents.len)
+ metadata += "Random"
+ for(var/i = 1 to valid_contents.len)
+ var/entry = input(user, "Choose an entry.", "Character Preference", metadata[i]) as null|anything in (valid_contents[i] + list("Random", "None"))
+ if(entry)
+ . += entry
+ else
+ return metadata
+
+/datum/gear_tweak/contents/tweak_item(var/obj/item/I, var/list/metadata)
+ if(metadata.len != valid_contents.len)
+ return
+ for(var/i = 1 to valid_contents.len)
+ var/path
+ var/list/contents = valid_contents[i]
+ if(metadata[i] == "Random")
+ path = pick(contents)
+ path = contents[path]
+ else if(metadata[i] == "None")
+ continue
+ else
+ path = contents[metadata[i]]
+ new path(I)
diff --git a/code/modules/client/preference/loadout/loadout.dm b/code/modules/client/preference/loadout/loadout.dm
new file mode 100644
index 00000000000..010fc54564c
--- /dev/null
+++ b/code/modules/client/preference/loadout/loadout.dm
@@ -0,0 +1,79 @@
+var/list/loadout_categories = list()
+var/list/gear_datums = list()
+
+/datum/loadout_category
+ var/category = ""
+ var/list/gear = list()
+
+/datum/loadout_category/New(cat)
+ category = cat
+ ..()
+
+/hook/startup/proc/populate_gear_list()
+ //create a list of gear datums to sort
+ for(var/geartype in subtypesof(/datum/gear))
+ var/datum/gear/G = geartype
+
+ var/use_name = initial(G.display_name)
+ var/use_category = initial(G.sort_category)
+
+ if(G == initial(G.subtype_path))
+ continue
+
+ if(!use_name)
+ error("Loadout - Missing display name: [G]")
+ continue
+ if(!initial(G.cost))
+ error("Loadout - Missing cost: [G]")
+ continue
+ if(!initial(G.path))
+ error("Loadout - Missing path definition: [G]")
+ continue
+
+ if(!loadout_categories[use_category])
+ loadout_categories[use_category] = new /datum/loadout_category(use_category)
+ var/datum/loadout_category/LC = loadout_categories[use_category]
+ gear_datums[use_name] = new geartype
+ LC.gear[use_name] = gear_datums[use_name]
+
+ loadout_categories = sortAssoc(loadout_categories)
+ for(var/loadout_category in loadout_categories)
+ var/datum/loadout_category/LC = loadout_categories[loadout_category]
+ LC.gear = sortAssoc(LC.gear)
+ return 1
+
+/datum/gear
+ var/display_name //Name/index. Must be unique.
+ var/description //Description of this gear. If left blank will default to the description of the pathed item.
+ var/path //Path to item.
+ var/cost = 1 //Number of points used. Items in general cost 1 point, storage/armor/gloves/special use costs 2 points.
+ var/slot //Slot to equip to.
+ var/list/allowed_roles //Roles that can spawn with this item.
+ var/whitelisted //Term to check the whitelist for..
+ var/sort_category = "General"
+ var/list/gear_tweaks = list() //List of datums which will alter the item after it has been spawned.
+ var/subtype_path = /datum/gear //for skipping organizational subtypes (optional)
+ var/subtype_cost_overlap = TRUE //if subtypes can take points at the same time
+
+/datum/gear/New()
+ ..()
+ if(!description)
+ var/obj/O = path
+ description = initial(O.desc)
+
+/datum/gear_data
+ var/path
+ var/location
+
+/datum/gear_data/New(npath, nlocation)
+ path = npath
+ location = nlocation
+
+/datum/gear/proc/spawn_item(location, metadata)
+ var/datum/gear_data/gd = new(path, location)
+ for(var/datum/gear_tweak/gt in gear_tweaks)
+ gt.tweak_gear_data(metadata["[gt]"], gd)
+ var/item = new gd.path(gd.location)
+ for(var/datum/gear_tweak/gt in gear_tweaks)
+ gt.tweak_item(item, metadata["[gt]"])
+ return item
\ No newline at end of file
diff --git a/code/modules/client/preference/loadout/loadout_accessories.dm b/code/modules/client/preference/loadout/loadout_accessories.dm
new file mode 100644
index 00000000000..b86d5c44ed1
--- /dev/null
+++ b/code/modules/client/preference/loadout/loadout_accessories.dm
@@ -0,0 +1,95 @@
+/datum/gear/accessory
+ subtype_path = /datum/gear/accessory
+ slot = slot_tie
+ sort_category = "Accessories"
+
+/datum/gear/accessory/scarf
+ display_name = "scarf"
+ path = /obj/item/clothing/accessory/scarf
+
+/datum/gear/accessory/scarf/red
+ display_name = "scarf, red"
+ path = /obj/item/clothing/accessory/scarf/red
+
+/datum/gear/accessory/scarf/green
+ display_name = "scarf, green"
+ path = /obj/item/clothing/accessory/scarf/green
+
+/datum/gear/accessory/scarf/darkblue
+ display_name = "scarf, dark blue"
+ path = /obj/item/clothing/accessory/scarf/darkblue
+
+/datum/gear/accessory/scarf/purple
+ display_name = "scarf, purple"
+ path = /obj/item/clothing/accessory/scarf/purple
+
+/datum/gear/accessory/scarf/yellow
+ display_name = "scarf, yellow"
+ path = /obj/item/clothing/accessory/scarf/yellow
+
+/datum/gear/accessory/scarf/orange
+ display_name = "scarf, orange"
+ path = /obj/item/clothing/accessory/scarf/orange
+
+/datum/gear/accessory/scarf/lightblue
+ display_name = "scarf, light blue"
+ path = /obj/item/clothing/accessory/scarf/lightblue
+
+/datum/gear/accessory/scarf/white
+ display_name = "scarf, white"
+ path = /obj/item/clothing/accessory/scarf/white
+
+/datum/gear/accessory/scarf/black
+ display_name = "scarf, black"
+ path = /obj/item/clothing/accessory/scarf/black
+
+/datum/gear/accessory/scarf/zebra
+ display_name = "scarf, zebra"
+ path = /obj/item/clothing/accessory/scarf/zebra
+
+/datum/gear/accessory/scarf/christmas
+ display_name = "scarf, christmas"
+ path = /obj/item/clothing/accessory/scarf/christmas
+
+/datum/gear/accessory/scarf/stripedred
+ display_name = "scarf, striped red"
+ path = /obj/item/clothing/accessory/stripedredscarf
+
+/datum/gear/accessory/scarf/stripedgreen
+ display_name = "scarf, striped green"
+ path = /obj/item/clothing/accessory/stripedgreenscarf
+
+/datum/gear/accessory/scarf/stripedblue
+ display_name = "scarf, striped blue"
+ path = /obj/item/clothing/accessory/stripedbluescarf
+
+/datum/gear/accessory/holobadge
+ display_name = "holobadge, pin"
+ path = /obj/item/clothing/accessory/holobadge
+ allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot")
+
+/datum/gear/accessory/holobadge_n
+ display_name = "holobadge, cord"
+ path = /obj/item/clothing/accessory/holobadge/cord
+ allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot")
+
+/datum/gear/accessory/tieblue
+ display_name = "tie, blue"
+ path = /obj/item/clothing/accessory/blue
+
+/datum/gear/accessory/tiered
+ display_name = "tie, red"
+ path = /obj/item/clothing/accessory/red
+
+/datum/gear/accessory/tieblack
+ display_name = "tie, black"
+ path = /obj/item/clothing/accessory/black
+
+/datum/gear/accessory/tiehorrible
+ display_name = "tie, vomit green"
+ path = /obj/item/clothing/accessory/horrible
+
+/datum/gear/accessory/stethoscope
+ display_name = "stethoscope"
+ path = /obj/item/clothing/accessory/stethoscope
+ allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Paramedic", "Brig Physician")
diff --git a/code/modules/client/preference/loadout/loadout_cosmetics.dm b/code/modules/client/preference/loadout/loadout_cosmetics.dm
new file mode 100644
index 00000000000..0b47a299ce6
--- /dev/null
+++ b/code/modules/client/preference/loadout/loadout_cosmetics.dm
@@ -0,0 +1,20 @@
+/datum/gear/lipstick
+ display_name = "lipstick, black"
+ path = /obj/item/weapon/lipstick/black
+ sort_category = "Cosmetics"
+
+/datum/gear/lipstick/jade
+ display_name = "lipstick, jade"
+ path = /obj/item/weapon/lipstick/jade
+
+/datum/gear/lipstick/purple
+ display_name = "lipstick, purple"
+ path = /obj/item/weapon/lipstick/purple
+
+/datum/gear/lipstick/red
+ display_name = "lipstick, red"
+ path = /obj/item/weapon/lipstick
+
+/datum/gear/monocle
+ display_name = "monocle"
+ path = /obj/item/clothing/glasses/monocle
\ No newline at end of file
diff --git a/code/modules/client/preference/loadout/loadout_general.dm b/code/modules/client/preference/loadout/loadout_general.dm
new file mode 100644
index 00000000000..40d581d030e
--- /dev/null
+++ b/code/modules/client/preference/loadout/loadout_general.dm
@@ -0,0 +1,40 @@
+/datum/gear/dice
+ display_name = "a d20"
+ path = /obj/item/weapon/dice/d20
+
+/datum/gear/uplift
+ display_name = "a pack of Uplifts"
+ path = /obj/item/weapon/storage/fancy/cigarettes/cigpack_uplift
+
+/datum/gear/robust
+ display_name = "a pack of Robusts"
+ path = /obj/item/weapon/storage/fancy/cigarettes/cigpack_robust
+
+/datum/gear/carp
+ display_name = "a pack of Carps"
+ path = /obj/item/weapon/storage/fancy/cigarettes/cigpack_carp
+
+/datum/gear/midori
+ display_name = "a pack of Midoris"
+ path = /obj/item/weapon/storage/fancy/cigarettes/cigpack_midori
+
+/datum/gear/lighter
+ display_name = "a cheap lighter"
+ path = /obj/item/weapon/lighter
+
+/datum/gear/rock
+ display_name = "a pet rock"
+ path = /obj/item/toy/pet_rock
+
+/datum/gear/sechud
+ display_name = "a classic security HUD"
+ path = /obj/item/clothing/glasses/hud/security
+ allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot")
+
+/datum/gear/matches
+ display_name = "a box of matches"
+ path = /obj/item/weapon/storage/box/matches
+
+/datum/gear/cards
+ display_name = "a deck of cards"
+ path = /obj/item/toy/cards/deck
diff --git a/code/modules/client/preference/loadout/loadout_hat.dm b/code/modules/client/preference/loadout/loadout_hat.dm
new file mode 100644
index 00000000000..5580d76f1e5
--- /dev/null
+++ b/code/modules/client/preference/loadout/loadout_hat.dm
@@ -0,0 +1,114 @@
+/datum/gear/hat
+ subtype_path = /datum/gear/hat
+ slot = slot_head
+ sort_category = "Headwear"
+
+/datum/gear/hat/hhat_yellow
+ display_name = "hardhat, yellow"
+ path = /obj/item/clothing/head/hardhat
+ allowed_roles = list("Chief Engineer", "Station Engineer", "Mechanic", "Life Support Specialist")
+
+/datum/gear/hat/hhat_orange
+ display_name = "hardhat, orange"
+ path = /obj/item/clothing/head/hardhat/orange
+ allowed_roles = list("Chief Engineer", "Station Engineer", "Mechanic", "Life Support Specialist")
+
+/datum/gear/hat/hhat_blue
+ display_name = "hardhat, blue"
+ path = /obj/item/clothing/head/hardhat/dblue
+ allowed_roles = list("Chief Engineer", "Station Engineer", "Mechanic", "Life Support Specialist")
+
+/datum/gear/hat/that
+ display_name = "top hat"
+ path = /obj/item/clothing/head/that
+
+/datum/gear/hat/flatcap
+ display_name = "flat cap"
+ path = /obj/item/clothing/head/flatcap
+
+/datum/gear/hat/fez
+ display_name = "fez"
+ path = /obj/item/clothing/head/fez
+
+/datum/gear/hat/bfedora
+ display_name = "fedora, black"
+ path = /obj/item/clothing/head/fedora
+
+/datum/gear/hat/wfedora
+ display_name = "fedora, white"
+ path = /obj/item/clothing/head/fedora/whitefedora
+
+/datum/gear/hat/brfedora
+ display_name = "fedora, brown"
+ path = /obj/item/clothing/head/fedora/brownfedora
+
+/datum/gear/hat/beretsec
+ display_name = "security beret"
+ path = /obj/item/clothing/head/beret/sec
+ allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot")
+
+/datum/gear/hat/capcsec
+ display_name = "security corporate cap"
+ path = /obj/item/clothing/head/soft/sec/corp
+ allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot")
+
+/datum/gear/hat/capsec
+ display_name = "security cap"
+ path = /obj/item/clothing/head/soft/sec
+ allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot")
+
+/datum/gear/hat/capred
+ display_name = "cap, red"
+ path = /obj/item/clothing/head/soft/red
+
+/datum/gear/hat/capblue
+ display_name = "cap, blue"
+ path = /obj/item/clothing/head/soft/blue
+
+/datum/gear/hat/capgreen
+ display_name = "cap, green"
+ path = /obj/item/clothing/head/soft/green
+
+/datum/gear/hat/capblack
+ display_name = "cap, black"
+ path = /obj/item/clothing/head/soft/black
+
+/datum/gear/hat/cappurple
+ display_name = "cap, purple"
+ path = /obj/item/clothing/head/soft/purple
+
+/datum/gear/hat/capwhite
+ display_name = "cap, white"
+ path = /obj/item/clothing/head/soft/mime
+
+/datum/gear/hat/caporange
+ display_name = "cap, orange"
+ path = /obj/item/clothing/head/soft/orange
+
+/datum/gear/hat/capgrey
+ display_name = "cap, grey"
+ path = /obj/item/clothing/head/soft/grey
+
+/datum/gear/hat/capyellow
+ display_name = "cap, yellow"
+ path = /obj/item/clothing/head/soft/yellow
+
+/datum/gear/hat/cowboyhat
+ display_name = "cowboy hat"
+ path = /obj/item/clothing/head/cowboyhat
+
+/datum/gear/hat/pr_beret
+ display_name = "beret, purple"
+ path = /obj/item/clothing/head/beret/purple_normal
+
+/datum/gear/hat/bl_beret
+ display_name = "beret, black"
+ path = /obj/item/clothing/head/beret/black
+
+/datum/gear/hat/blu_beret
+ display_name = "beret, blue"
+ path = /obj/item/clothing/head/beret/blue
+
+/datum/gear/hat/red_beret
+ display_name = "beret, red"
+ path = /obj/item/clothing/head/beret
diff --git a/code/modules/client/preference/loadout/loadout_shoes.dm b/code/modules/client/preference/loadout/loadout_shoes.dm
new file mode 100644
index 00000000000..97e64e74f83
--- /dev/null
+++ b/code/modules/client/preference/loadout/loadout_shoes.dm
@@ -0,0 +1,8 @@
+/datum/gear/shoes
+ subtype_path = /datum/gear/shoes
+ slot = slot_shoes
+ sort_category = "Shoes"
+
+/datum/gear/shoes/sandals
+ display_name = "sandals"
+ path = /obj/item/clothing/shoes/sandal
\ No newline at end of file
diff --git a/code/modules/client/preference/loadout/loadout_suit.dm b/code/modules/client/preference/loadout/loadout_suit.dm
new file mode 100644
index 00000000000..29f0c15c71c
--- /dev/null
+++ b/code/modules/client/preference/loadout/loadout_suit.dm
@@ -0,0 +1,146 @@
+/datum/gear/suit
+ subtype_path = /datum/gear/suit
+ slot = slot_wear_suit
+ cost = 2
+ sort_category = "External Wear"
+
+//WINTER COATS
+/datum/gear/suit/coat
+ subtype_path = /datum/gear/suit/coat
+
+/datum/gear/suit/coat/grey
+ display_name = "winter coat"
+ path = /obj/item/clothing/suit/hooded/wintercoat
+
+/datum/gear/suit/coat/job
+ subtype_path = /datum/gear/suit/coat/job
+ subtype_cost_overlap = FALSE
+
+/datum/gear/suit/coat/job/sec
+ display_name = "winter coat, security"
+ path = /obj/item/clothing/suit/hooded/wintercoat/security
+ allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Security Pod Pilot")
+
+/datum/gear/suit/coat/job/captain
+ display_name = "winter coat, captain"
+ path = /obj/item/clothing/suit/hooded/wintercoat/captain
+ allowed_roles = list("Captain")
+
+/datum/gear/suit/coat/job/med
+ display_name = "winter coat, medical"
+ path = /obj/item/clothing/suit/hooded/wintercoat/medical
+ allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Psychiatrist", "Paramedic", "Virologist", "Brig Physician")
+
+/datum/gear/suit/coat/job/sci
+ display_name = "winter coat, science"
+ path = /obj/item/clothing/suit/hooded/wintercoat/science
+ allowed_roles = list("Scientist", "Research Director")
+
+/datum/gear/suit/coat/job/engi
+ display_name = "winter coat, engineering"
+ path = /obj/item/clothing/suit/hooded/wintercoat/engineering
+ allowed_roles = list("Chief Engineer", "Station Engineer", "Mechanic")
+
+/datum/gear/suit/coat/job/atmos
+ display_name = "winter coat, atmospherics"
+ path = /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos
+ allowed_roles = list("Chief Engineer", "Life Support Specialist")
+
+/datum/gear/suit/coat/job/hydro
+ display_name = "winter coat, hydroponics"
+ path = /obj/item/clothing/suit/hooded/wintercoat/hydro
+ allowed_roles = list("Botanist")
+
+/datum/gear/suit/coat/job/cargo
+ display_name = "winter coat, cargo"
+ path = /obj/item/clothing/suit/hooded/wintercoat/cargo
+ allowed_roles = list("Quartermaster", "Cargo Technician")
+
+/datum/gear/suit/coat/job/miner
+ display_name = "winter coat, miner"
+ path = /obj/item/clothing/suit/hooded/wintercoat/miner
+ allowed_roles = list("Miner")
+
+//LABCOATS
+/datum/gear/suit/labcoat_emt
+ display_name = "labcoat, paramedic"
+ path = /obj/item/clothing/suit/storage/labcoat/emt
+ allowed_roles = list("Chief Medical Officer", "Paramedic")
+
+//JACKETS
+/datum/gear/suit/leather_jacket
+ display_name = "leather jacket"
+ path = /obj/item/clothing/suit/jacket/leather
+
+/datum/gear/suit/br_tcoat
+ display_name = "trenchcoat, brown"
+ path = /obj/item/clothing/suit/browntrenchcoat
+
+/datum/gear/suit/bl_tcoat
+ display_name = "trenchcoat, black"
+ path = /obj/item/clothing/suit/blacktrenchcoat
+
+/datum/gear/suit/bomber_jacket
+ display_name = "bomber jacket"
+ path = /obj/item/clothing/suit/jacket
+
+/datum/gear/suit/ol_miljacket
+ display_name = "military jacket, olive"
+ path = /obj/item/clothing/suit/jacket/miljacket
+
+/datum/gear/suit/nv_miljacket
+ display_name = "military jacket, navy"
+ path = /obj/item/clothing/suit/jacket/miljacket/navy
+
+/datum/gear/suit/ds_miljacket
+ display_name = "military jacket, desert"
+ path = /obj/item/clothing/suit/jacket/miljacket/desert
+
+/datum/gear/suit/wh_miljacket
+ display_name = "military jacket, white"
+ path = /obj/item/clothing/suit/jacket/miljacket/white
+
+/datum/gear/suit/secjacket
+ display_name = "security jacket"
+ path = /obj/item/clothing/suit/armor/secjacket
+ allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Security Pod Pilot")
+
+/datum/gear/suit/poncho
+ display_name = "poncho, classic"
+ path = /obj/item/clothing/suit/poncho
+
+/datum/gear/suit/grponcho
+ display_name = "poncho, green"
+ path = /obj/item/clothing/suit/poncho/green
+
+/datum/gear/suit/rdponcho
+ display_name = "poncho, red"
+ path = /obj/item/clothing/suit/poncho/red
+
+/datum/gear/suit/tphoodie
+ display_name = "hoodie, Tharsis Polytech"
+ path = /obj/item/clothing/suit/hooded/hoodie/tp
+
+/datum/gear/suit/nthoodie
+ display_name = "hoodie, Nanotrasen"
+ path = /obj/item/clothing/suit/hooded/hoodie/nt
+
+/datum/gear/suit/lamhoodie
+ display_name = "hoodie, Lunar Academy of Medicine"
+ path = /obj/item/clothing/suit/hooded/hoodie/lam
+
+/datum/gear/suit/cuthoodie
+ display_name = "hoodie, Canaan University of Technology"
+ path = /obj/item/clothing/suit/hooded/hoodie/cut
+
+/datum/gear/suit/mithoodie
+ display_name = "hoodie, Martian Institute of Technology"
+ path = /obj/item/clothing/suit/hooded/hoodie/mit
+
+/datum/gear/suit/bluehoodie
+ display_name = "hoodie, blue"
+ path = /obj/item/clothing/suit/hooded/hoodie/blue
+
+/datum/gear/suit/blackhoodie
+ display_name = "hoodie, black"
+ path = /obj/item/clothing/suit/hooded/hoodie
diff --git a/code/modules/client/preference/loadout/loadout_uniform.dm b/code/modules/client/preference/loadout/loadout_uniform.dm
new file mode 100644
index 00000000000..5bef51bdc1d
--- /dev/null
+++ b/code/modules/client/preference/loadout/loadout_uniform.dm
@@ -0,0 +1,196 @@
+// Uniform slot
+/datum/gear/uniform
+ subtype_path = /datum/gear/uniform
+ slot = slot_w_uniform
+ cost = 2
+ sort_category = "Uniforms and Casual Dress"
+
+/datum/gear/uniform/skirt
+ subtype_path = /datum/gear/uniform/skirt
+
+/datum/gear/uniform/skirt/blue
+ display_name = "plaid skirt, blue"
+ path = /obj/item/clothing/under/dress/plaid_blue
+
+/datum/gear/uniform/skirt/purple
+ display_name = "plaid skirt, purple"
+ path = /obj/item/clothing/under/dress/plaid_purple
+
+/datum/gear/uniform/skirt/red
+ display_name = "plaid skirt, red"
+ path = /obj/item/clothing/under/dress/plaid_red
+
+/datum/gear/uniform/skirt/black
+ display_name = "skirt, black"
+ path = /obj/item/clothing/under/blackskirt
+
+/datum/gear/uniform/skirt/job
+ subtype_path = /datum/gear/uniform/skirt/job
+ subtype_cost_overlap = FALSE
+
+/datum/gear/uniform/skirt/job/ce
+ display_name = "skirt, ce"
+ path = /obj/item/clothing/under/rank/chief_engineer/skirt
+ allowed_roles = list("Chief Engineer")
+
+/datum/gear/uniform/skirt/job/atmos
+ display_name = "skirt, atmos"
+ path = /obj/item/clothing/under/rank/atmospheric_technician/skirt
+ allowed_roles = list("Chief Engineer","Atmospheric Technician")
+
+/datum/gear/uniform/skirt/job/eng
+ display_name = "skirt, engineer"
+ path = /obj/item/clothing/under/rank/engineer/skirt
+ allowed_roles = list("Chief Engineer","Station Engineer")
+
+/datum/gear/uniform/skirt/job/roboticist
+ display_name = "skirt, roboticist"
+ path = /obj/item/clothing/under/rank/roboticist/skirt
+ allowed_roles = list("Research Director","Roboticist")
+
+/datum/gear/uniform/skirt/job/cmo
+ display_name = "skirt, cmo"
+ path = /obj/item/clothing/under/rank/chief_medical_officer
+ allowed_roles = list("Chief Medical Officer")
+
+/datum/gear/uniform/skirt/job/chem
+ display_name = "skirt, chemist"
+ path = /obj/item/clothing/under/rank/chemist/skirt
+ allowed_roles = list("Chief Medical Officer","Chemist")
+
+/datum/gear/uniform/skirt/job/viro
+ display_name = "skirt, virologist"
+ path = /obj/item/clothing/under/rank/virologist/skirt
+ allowed_roles = list("Chief Medical Officer","Medical Doctor")
+
+/datum/gear/uniform/skirt/job/med
+ display_name = "skirt, medical"
+ path = /obj/item/clothing/under/rank/medical/skirt
+ allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic")
+
+/datum/gear/uniform/skirt/job/sci
+ display_name = "skirt, scientist"
+ path = /obj/item/clothing/under/rank/scientist/skirt
+ allowed_roles = list("Research Director","Scientist")
+
+/datum/gear/uniform/skirt/job/cargo
+ display_name = "skirt, cargo"
+ path = /obj/item/clothing/under/rank/cargotech/skirt
+ allowed_roles = list("Quartermaster","Cargo Technician")
+
+/datum/gear/uniform/skirt/job/qm
+ display_name = "skirt, QM"
+ path = /obj/item/clothing/under/rank/cargo/skirt
+ allowed_roles = list("Quartermaster")
+
+/datum/gear/uniform/skirt/job/warden
+ display_name = "skirt, warden"
+ path = /obj/item/clothing/under/rank/warden/skirt
+ allowed_roles = list("Head of Security", "Warden")
+
+/datum/gear/uniform/skirt/job/security
+ display_name = "skirt, security"
+ path = /obj/item/clothing/under/rank/security/skirt
+ allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
+
+/datum/gear/uniform/skirt/job/head_of_security
+ display_name = "skirt, hos"
+ path = /obj/item/clothing/under/rank/head_of_security/skirt
+ allowed_roles = list("Head of Security")
+
+/datum/gear/uniform/sec
+ subtype_path = /datum/gear/uniform/sec
+
+/datum/gear/uniform/sec/formal
+ display_name = "security uniform, formal"
+ path = /obj/item/clothing/under/rank/security/formal
+ allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Security Pod Pilot")
+
+datum/gear/uniform/secorporate
+ display_name = "security uniform, corporate "
+ path = /obj/item/clothing/under/rank/security/corp
+ allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot")
+
+/datum/gear/uniform/sec/dispatch
+ display_name = "security uniform, dispatch"
+ path = /obj/item/clothing/under/rank/dispatch
+ allowed_roles = list("Head of Security", "Warden", "Security Officer", "Security Pod Pilot")
+
+/datum/gear/uniform/sec/casual
+ display_name = "security uniform, casual"
+ path = /obj/item/clothing/under/rank/security2
+ allowed_roles = list("Head of Security", "Warden", "Security Officer", "Detective", "Security Pod Pilot")
+
+/datum/gear/uniform/shorts
+ subtype_path = /datum/gear/uniform/shorts
+
+/datum/gear/uniform/shorts/red
+ display_name = "shorts, red"
+ path = /obj/item/clothing/under/shorts/red
+
+/datum/gear/uniform/shorts/green
+ display_name = "shorts, green"
+ path = /obj/item/clothing/under/shorts/green
+
+/datum/gear/uniform/shorts/blue
+ display_name = "shorts, blue"
+ path = /obj/item/clothing/under/shorts/blue
+
+/datum/gear/uniform/shorts/black
+ display_name = "shorts, black"
+ path = /obj/item/clothing/under/shorts/black
+
+/datum/gear/uniform/shorts/grey
+ display_name = "shorts, grey"
+ path = /obj/item/clothing/under/shorts/grey
+
+/datum/gear/uniform/pants
+ subtype_path = /datum/gear/uniform/pants
+
+/datum/gear/uniform/pants/jeans
+ display_name = "jeans, classic"
+ path = /obj/item/clothing/under/pants/classicjeans
+
+/datum/gear/uniform/pants/mjeans
+ display_name = "jeans, mustang"
+ path = /obj/item/clothing/under/pants/mustangjeans
+
+/datum/gear/uniform/pants/bljeans
+ display_name = "jeans, black"
+ path = /obj/item/clothing/under/pants/blackjeans
+
+/datum/gear/uniform/pants/yfjeans
+ display_name = "jeans, Young Folks"
+ path = /obj/item/clothing/under/pants/youngfolksjeans
+
+/datum/gear/uniform/pants/whitepants
+ display_name = "pants, white"
+ path = /obj/item/clothing/under/pants/white
+
+/datum/gear/uniform/pants/redpants
+ display_name = "pants, red"
+ path = /obj/item/clothing/under/pants/red
+
+/datum/gear/uniform/pants/blackpants
+ display_name = "pants, black"
+ path = /obj/item/clothing/under/pants/black
+
+/datum/gear/uniform/pants/tanpants
+ display_name = "pants, tan"
+ path = /obj/item/clothing/under/pants/tan
+
+/datum/gear/uniform/pants/bluepants
+ display_name = "pants, blue"
+ path = /obj/item/clothing/under/pants/blue
+
+/datum/gear/uniform/pants/trackpants
+ display_name = "trackpants"
+ path = /obj/item/clothing/under/pants/track
+
+/datum/gear/uniform/pants/khakipants
+ display_name = "pants, khaki"
+ path = /obj/item/clothing/under/pants/khaki
+
+/datum/gear/uniform/pants/caopants
+ display_name = "pants, camo"
+ path = /obj/item/clothing/under/pants/camo
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preference/preferences.dm
similarity index 92%
rename from code/modules/client/preferences.dm
rename to code/modules/client/preference/preferences.dm
index eafc7b59bd6..c28f472020d 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preference/preferences.dm
@@ -1,1899 +1,2020 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
-
-var/list/preferences_datums = list()
-
-var/global/list/special_role_times = list( //minimum age (in days) for accounts to play these roles
- ROLE_PAI = 0,
- ROLE_POSIBRAIN = 0,
- ROLE_GUARDIAN = 0,
- ROLE_TRAITOR = 7,
- ROLE_CHANGELING = 14,
- ROLE_SHADOWLING = 14,
- ROLE_WIZARD = 14,
- ROLE_REV = 14,
- ROLE_VAMPIRE = 14,
- ROLE_BLOB = 14,
- ROLE_REVENANT = 14,
- ROLE_OPERATIVE = 21,
- ROLE_CULTIST = 21,
- ROLE_RAIDER = 21,
- ROLE_ALIEN = 21,
- ROLE_DEMON = 21,
- ROLE_SENTIENT = 21,
-// ROLE_GANG = 21,
- ROLE_BORER = 21,
- ROLE_NINJA = 21,
- ROLE_MUTINEER = 21,
- ROLE_MALF = 30,
- ROLE_ABDUCTOR = 30,
-)
-
-/proc/player_old_enough_antag(client/C, role)
- if(available_in_days_antag(C, role) == 0)
- return 1 //Available in 0 days = available right now = player is old enough to play.
- return 0
-
-/proc/available_in_days_antag(client/C, role)
- if(!C)
- return 0
- if(!role)
- return 0
- if(!config.use_age_restriction_for_antags)
- return 0
- if(!isnum(C.player_age))
- return 0 //This is only a number if the db connection is established, otherwise it is text: "Requires database", meaning these restrictions cannot be enforced
- var/minimal_player_age_antag = special_role_times[num2text(role)]
- if(!isnum(minimal_player_age_antag))
- return 0
-
- return max(0, minimal_player_age_antag - C.player_age)
-
-/proc/check_client_age(client/C, var/days) // If days isn't provided, returns the age of the client. If it is provided, it returns the days until the player_age is equal to or greater than the days variable
- if(!days)
- return C.player_age
- else
- return max(0, days - C.player_age)
- return 0
-
-//used for alternate_option
-#define GET_RANDOM_JOB 0
-#define BE_CIVILIAN 1
-#define RETURN_TO_LOBBY 2
-
-#define MAX_SAVE_SLOTS 20 // Save slots for regular players
-#define MAX_SAVE_SLOTS_MEMBER 20 // Save slots for BYOND members
-
-#define TAB_CHAR 0
-#define TAB_GAME 1
-
-/datum/preferences
- //doohickeys for savefiles
-// var/path
- var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used
-// var/savefile_version = 0
- var/max_save_slots = MAX_SAVE_SLOTS
-
- //non-preference stuff
- var/warns = 0
- var/muted = 0
- var/last_ip
- var/last_id
-
- //game-preferences
- var/lastchangelog = "" //Saved changelog filesize to detect if there was a change
- var/ooccolor = "#b82e00"
- var/be_special = list() //Special role selection
- var/UI_style = "Midnight"
- var/nanoui_fancy = TRUE
- var/toggles = TOGGLES_DEFAULT
- var/sound = SOUND_DEFAULT
- var/show_ghostitem_attack = TRUE
- var/UI_style_color = "#ffffff"
- var/UI_style_alpha = 255
-
-
- //character preferences
- var/real_name //our character's name
- var/be_random_name = 0 //whether we are a random name every round
- var/gender = MALE //gender of character (well duh)
- var/age = 30 //age of character
- var/spawnpoint = "Arrivals Shuttle" //where this character will spawn (0-2).
- var/b_type = "A+" //blood type (not-chooseable)
- var/underwear = "Nude" //underwear type
- var/undershirt = "Nude" //undershirt type
- var/socks = "Nude" //socks type
- var/backbag = 2 //backpack type
- var/ha_style = "None" //Head accessory style
- var/r_headacc = 0 //Head accessory colour
- var/g_headacc = 0 //Head accessory colour
- var/b_headacc = 0 //Head accessory colour
- var/m_style = "None" //Marking style
- var/r_markings = 0 //Marking colour
- var/g_markings = 0 //Marking colour
- var/b_markings = 0 //Marking colour
- var/h_style = "Bald" //Hair type
- var/r_hair = 0 //Hair color
- var/g_hair = 0 //Hair color
- var/b_hair = 0 //Hair color
- var/f_style = "Shaved" //Face hair type
- var/r_facial = 0 //Face hair color
- var/g_facial = 0 //Face hair color
- var/b_facial = 0 //Face hair color
- var/s_tone = 0 //Skin tone
- var/r_skin = 0 //Skin color
- var/g_skin = 0 //Skin color
- var/b_skin = 0 //Skin color
- var/r_eyes = 0 //Eye color
- var/g_eyes = 0 //Eye color
- var/b_eyes = 0 //Eye color
- var/species = "Human"
- var/language = "None" //Secondary language
-
- var/body_accessory = null
-
- var/speciesprefs = 0//I hate having to do this, I really do (Using this for oldvox code, making names universal I guess
-
- //Mob preview
- var/icon/preview_icon = null
- var/icon/preview_icon_front = null
- var/icon/preview_icon_side = null
-
- //Jobs, uses bitflags
- var/job_support_high = 0
- var/job_support_med = 0
- var/job_support_low = 0
-
- var/job_medsci_high = 0
- var/job_medsci_med = 0
- var/job_medsci_low = 0
-
- var/job_engsec_high = 0
- var/job_engsec_med = 0
- var/job_engsec_low = 0
-
- var/job_karma_high = 0
- var/job_karma_med = 0
- var/job_karma_low = 0
-
- //Keeps track of preferrence for not getting any wanted jobs
- var/alternate_option = 0
-
- // maps each organ to either null(intact), "cyborg" or "amputated"
- // will probably not be able to do this for head and torso ;)
- var/list/organ_data = list()
- var/list/rlimb_data = list()
-
- var/list/player_alt_titles = new() // the default name of a job like "Medical Doctor"
-// var/accent = "en-us"
-// var/voice = "m1"
-// var/pitch = 50
-// var/talkspeed = 175
- var/flavor_text = ""
- var/med_record = ""
- var/sec_record = ""
- var/gen_record = ""
- var/disabilities = 0
-
- var/nanotrasen_relation = "Neutral"
-
- // 0 = character settings, 1 = game preferences
- var/current_tab = TAB_CHAR
-
- // OOC Metadata:
- var/metadata = ""
- var/slot_name = ""
-
- // Whether or not to use randomized character slots
- var/randomslot = 0
-
- // jukebox volume
- var/volume = 100
-
- // BYOND membership
- var/unlock_content = 0
-
-/datum/preferences/New(client/C)
- b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+")
- if(istype(C))
- if(!IsGuestKey(C.key))
- unlock_content = C.IsByondMember()
- if(unlock_content)
- max_save_slots = MAX_SAVE_SLOTS_MEMBER
- var/loaded_preferences_successfully = load_preferences(C)
- if(loaded_preferences_successfully)
- if(load_character(C))
- return
- //we couldn't load character data so just randomize the character appearance + name
- random_character() //let's create a random character then - rather than a fat, bald and naked man.
- real_name = random_name(gender)
- if(!loaded_preferences_successfully)
- save_preferences(C)
- save_character(C) //let's save this new random character so it doesn't keep generating new ones.
-
-/datum/preferences/proc/color_square(r, g, b)
- return "___ "
-
-// Hello I am a proc full of snowflake species checks how are you
-/datum/preferences/proc/ShowChoices(mob/user)
- if(!user || !user.client)
- return
- update_preview_icon()
- user << browse_rsc(preview_icon_front, "previewicon.png")
- user << browse_rsc(preview_icon_side, "previewicon2.png")
-
- var/dat = ""
- dat += ""
- dat += "Character Settings "
- dat += "Game Preferences "
- dat += " "
- dat += " "
-
- switch(current_tab)
- if(TAB_CHAR) // Character Settings
- dat += " "
- dat += ""
- dat += ""
- dat += "Identity "
- if(appearance_isbanned(user))
- dat += "You are banned from using custom names and appearances. \
- You can continue to adjust your characters, but you will be randomised once you join the game.\
- "
- dat += "Gender: [gender == MALE ? "Male" : "Female"] "
- dat += "Age: [age] "
- dat += "Body: (®) "
- dat += "Species: [species] "
- if(species == "Vox")
- dat += "N2 Tank: [speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"] "
- dat += "Secondary Language: [language] "
- dat += "Blood Type: [b_type] "
- if(species in list("Human", "Drask", "Vox"))
- dat += "Skin Tone: [species == "Vox" ? "[s_tone]" : "[-s_tone + 35]/220"] "
- dat += "Disabilities: \[Set\] "
- dat += "Nanotrasen Relation: [nanotrasen_relation] "
- dat += "Set Flavor Text "
- if(lentext(flavor_text) <= 40)
- if(!lentext(flavor_text)) dat += "\[...\] "
- else dat += "[flavor_text] "
- else dat += "[TextPreview(flavor_text)]... "
-
- dat += "Hair & Accessories "
-
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
- var/headaccessoryname = "Head Accessory: "
- if(species == "Unathi")
- headaccessoryname = "Horns: "
- dat += "[headaccessoryname] "
- dat += "[ha_style] "
- dat += "Color [color_square(r_headacc, g_headacc, b_headacc)] "
-
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have body markings.
- dat += "Body Markings: "
- dat += "[m_style] "
- dat += "Color [color_square(r_markings, g_markings, b_markings)] "
-
- dat += "Hair: "
- dat += "[h_style] "
- dat += "Color [color_square(r_hair, g_hair, b_hair)] "
-
- dat += "Facial Hair: "
- dat += "[f_style ? "[f_style]" : "Shaved"] "
- dat += "Color [color_square(r_facial, g_facial, b_facial)] "
-
- if(species != "Machine")
- dat += "Eyes: "
- dat += "Color [color_square(r_eyes, g_eyes, b_eyes)] "
-
- if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins
- dat += "Body Color: "
- dat += "Color [color_square(r_skin, g_skin, b_skin)] "
-
- if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
- dat += "Body Accessory: "
- dat += "[body_accessory ? "[body_accessory]" : "None"] "
-
- dat += " "
- dat += "Occupation Choices "
- dat += "Set Occupation Preferences "
- if(jobban_isbanned(user, "Records"))
- dat += "You are banned from using character records. "
- else
- dat += "Character Records "
-
- dat += "Limbs "
- dat += "Limbs and Parts: Adjust "
- if(species != "Slime People" && species != "Machine")
- dat += "Internal Organs: Adjust "
-
- //display limbs below
- var/ind = 0
- for(var/name in organ_data)
- var/status = organ_data[name]
- var/organ_name = null
- switch(name)
- if("chest") organ_name = "torso"
- if("groin") organ_name = "lower body"
- if("head") organ_name = "head"
- if("l_arm") organ_name = "left arm"
- if("r_arm") organ_name = "right arm"
- if("l_leg") organ_name = "left leg"
- if("r_leg") organ_name = "right leg"
- if("l_foot") organ_name = "left foot"
- if("r_foot") organ_name = "right foot"
- if("l_hand") organ_name = "left hand"
- if("r_hand") organ_name = "right hand"
- if("heart") organ_name = "heart"
- if("eyes") organ_name = "eyes"
-
- if(status in list("cyborg", "amputated", "mechanical", "assisted"))
- ++ind
- if(ind > 1) dat += ", "
-
- switch(status)
- if("cyborg")
- var/datum/robolimb/R
- if(rlimb_data[name] && all_robolimbs[rlimb_data[name]])
- R = all_robolimbs[rlimb_data[name]]
- else
- R = basic_robolimb
- dat += "\t[R.company] [organ_name] prosthesis"
- if("amputated") dat += "\tAmputated [organ_name]"
- if("mechanical") dat += "\tMechanical [organ_name]"
- if("assisted")
- switch(organ_name)
- if("heart") dat += "\tPacemaker-assisted [organ_name]"
- if("voicebox") dat += "\tSurgically altered [organ_name]"
- if("eyes") dat += "\tRetinal overlayed [organ_name]"
- else dat += "\tMechanically assisted [organ_name]"
- if(!ind) dat += "\[...\] "
- else dat += " "
-
- dat += "Clothing "
- dat += "Underwear: [underwear] "
- dat += "Undershirt: [undershirt] "
- dat += "Socks: [socks] "
- dat += "Backpack Type: [backbaglist[backbag]] "
-
- dat += "
"
-
- if(TAB_GAME) // General Preferences
- dat += ""
-
- dat += ""
- if(!IsGuestKey(user.key))
- dat += "Undo - "
- dat += "Save Setup - "
-
- dat += "Reset Setup "
- dat += " "
-
- var/datum/browser/popup = new(user, "preferences", "Character Setup
", 820, 640)
- popup.set_content(dat)
- popup.open(0)
-
-/datum/preferences/proc/SetChoices(mob/user, limit = 12, list/splitJobs = list("Civilian","Research Director","AI","Bartender"), width = 760, height = 790)
- if(!job_master)
- return
-
- //limit - The amount of jobs allowed per column. Defaults to 17 to make it look nice.
- //splitJobs - Allows you split the table by job. You can make different tables for each department by including their heads. Defaults to CE to make it look nice.
- //width - Screen' width. Defaults to 550 to make it look nice.
- //height - Screen's height. Defaults to 500 to make it look nice.
-
-
- var/HTML = ""
- HTML += ""
- HTML += "Choose occupation chances Unavailable occupations are crossed out. "
- HTML += "\[Done\] " // Easier to press up here.
- HTML += "Left-click to raise an occupation preference, right-click to lower it.
"
- HTML += ""
- HTML += "" // Table within a table for alignment, also allows you to easily add more colomns.
- HTML += ""
- var/index = -1
-
- //The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows.
- var/datum/job/lastJob
- if (!job_master) return
- for(var/datum/job/job in job_master.occupations)
-
- index += 1
- if((index >= limit) || (job.title in splitJobs))
- if((index < limit) && (lastJob != null))
- //If the cells were broken up by a job in the splitJob list then it will fill in the rest of the cells with
- //the last job's selection color. Creating a rather nice effect.
- for(var/i = 0, i < (limit - index), i += 1)
- HTML += "    "
- HTML += "
"
- index = 0
-
- HTML += ""
- var/rank = job.title
- lastJob = job
- if(!is_job_whitelisted(user, rank))
- HTML += "[rank] \[KARMA] "
- continue
- if(jobban_isbanned(user, rank))
- HTML += "[rank] \[BANNED] "
- continue
- if(!job.player_old_enough(user.client))
- var/available_in_days = job.available_in_days(user.client)
- HTML += "[rank] \[IN [(available_in_days)] DAYS] "
- continue
- if((job_support_low & CIVILIAN) && (rank != "Civilian"))
- HTML += "[rank] "
- continue
- if((rank in command_positions) || (rank == "AI"))//Bold head jobs
- HTML += "[rank] "
- else
- HTML += "[rank] "
-
- HTML += ""
-
- var/prefLevelLabel = "ERROR"
- var/prefLevelColor = "pink"
- var/prefUpperLevel = -1 // level to assign on left click
- var/prefLowerLevel = -1 // level to assign on right click
-
- if(GetJobDepartment(job, 1) & job.flag)
- prefLevelLabel = "High"
- prefLevelColor = "slateblue"
- prefUpperLevel = 4
- prefLowerLevel = 2
- else if(GetJobDepartment(job, 2) & job.flag)
- prefLevelLabel = "Medium"
- prefLevelColor = "green"
- prefUpperLevel = 1
- prefLowerLevel = 3
- else if(GetJobDepartment(job, 3) & job.flag)
- prefLevelLabel = "Low"
- prefLevelColor = "orange"
- prefUpperLevel = 2
- prefLowerLevel = 4
- else
- prefLevelLabel = "NEVER"
- prefLevelColor = "red"
- prefUpperLevel = 3
- prefLowerLevel = 1
-
-
- HTML += ""
-
-// HTML += " "
-
- if(rank == "Civilian")//Civilian is special
- if(job_support_low & CIVILIAN)
- HTML += " \[Yes] "
- else
- HTML += " \[No] "
- if(job.alt_titles)
- HTML += "\[[GetPlayerAltTitle(job)]\] "
- HTML += ""
- continue
-/*
- if(GetJobDepartment(job, 1) & job.flag)
- HTML += " \[High] "
- else if(GetJobDepartment(job, 2) & job.flag)
- HTML += " \[Medium] "
- else if(GetJobDepartment(job, 3) & job.flag)
- HTML += " \[Low] "
- else
- HTML += " \[NEVER] "
- */
- HTML += "[prefLevelLabel] "
-
- if(job.alt_titles)
- HTML += "\[[GetPlayerAltTitle(job)]\] "
-
-
- HTML += ""
-
- for(var/i = 1, i < (limit - index), i += 1) // Finish the column so it is even
- HTML += "    "
-
- HTML += "
"
-
- HTML += "
"
-
- switch(alternate_option)
- if(GET_RANDOM_JOB)
- HTML += "Get random job if preferences unavailable "
- if(BE_CIVILIAN)
- HTML += "Be a civilian if preferences unavailable "
- if(RETURN_TO_LOBBY)
- HTML += "Return to lobby if preferences unavailable "
-
- HTML += "\[Reset\] "
- HTML += " "
-
- user << browse(null, "window=preferences")
-// user << browse(HTML, "window=mob_occupation;size=[width]x[height]")
- var/datum/browser/popup = new(user, "mob_occupation", "Occupation Preferences
", width, height)
- popup.set_window_options("can_close=0")
- popup.set_content(HTML)
- popup.open(0)
- return
-
-/datum/preferences/proc/SetJobPreferenceLevel(var/datum/job/job, var/level)
- if (!job)
- return 0
-
- if (level == 1) // to high
- // remove any other job(s) set to high
- job_support_med |= job_support_high
- job_engsec_med |= job_engsec_high
- job_medsci_med |= job_medsci_high
- job_karma_med |= job_karma_high
- job_support_high = 0
- job_engsec_high = 0
- job_medsci_high = 0
- job_karma_high = 0
-
- if (job.department_flag == SUPPORT)
- job_support_low &= ~job.flag
- job_support_med &= ~job.flag
- job_support_high &= ~job.flag
-
- switch(level)
- if (1)
- job_support_high |= job.flag
- if (2)
- job_support_med |= job.flag
- if (3)
- job_support_low |= job.flag
-
- return 1
- else if (job.department_flag == ENGSEC)
- job_engsec_low &= ~job.flag
- job_engsec_med &= ~job.flag
- job_engsec_high &= ~job.flag
-
- switch(level)
- if (1)
- job_engsec_high |= job.flag
- if (2)
- job_engsec_med |= job.flag
- if (3)
- job_engsec_low |= job.flag
-
- return 1
- else if (job.department_flag == MEDSCI)
- job_medsci_low &= ~job.flag
- job_medsci_med &= ~job.flag
- job_medsci_high &= ~job.flag
-
- switch(level)
- if (1)
- job_medsci_high |= job.flag
- if (2)
- job_medsci_med |= job.flag
- if (3)
- job_medsci_low |= job.flag
-
- return 1
- else if (job.department_flag == KARMA)
- job_karma_low &= ~job.flag
- job_karma_med &= ~job.flag
- job_karma_high &= ~job.flag
-
- switch(level)
- if (1)
- job_karma_high |= job.flag
- if (2)
- job_karma_med |= job.flag
- if (3)
- job_karma_low |= job.flag
-
- return 1
-
- return 0
-
-/datum/preferences/proc/UpdateJobPreference(mob/user, role, desiredLvl)
- var/datum/job/job = job_master.GetJob(role)
-
- if(!job)
- user << browse(null, "window=mob_occupation")
- ShowChoices(user)
- return
-
- if (!isnum(desiredLvl))
- to_chat(user, "\red UpdateJobPreference - desired level was not a number. Please notify coders!")
- ShowChoices(user)
- return
-
- if(role == "Civilian")
- if(job_support_low & job.flag)
- job_support_low &= ~job.flag
- else
- job_support_low |= job.flag
- SetChoices(user)
- return 1
-
- SetJobPreferenceLevel(job, desiredLvl)
- SetChoices(user)
-
- return 1
-
-/datum/preferences/proc/ShowDisabilityState(mob/user,flag,label)
- if(flag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey"))
- return "[species] cannot be fat. "
- return "[label]: [disabilities & flag ? "Yes" : "No"] "
-
-/datum/preferences/proc/SetDisabilities(mob/user)
- var/HTML = ""
-
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:474: HTML += ""
- HTML += {"
- Choose disabilities "}
- // END AUTOFIX
- HTML += ShowDisabilityState(user,DISABILITY_FLAG_NEARSIGHTED,"Needs Glasses")
- HTML += ShowDisabilityState(user,DISABILITY_FLAG_FAT,"Obese")
- HTML += ShowDisabilityState(user,DISABILITY_FLAG_EPILEPTIC,"Seizures")
- HTML += ShowDisabilityState(user,DISABILITY_FLAG_DEAF,"Deaf")
- HTML += ShowDisabilityState(user,DISABILITY_FLAG_BLIND,"Blind")
- HTML += ShowDisabilityState(user,DISABILITY_FLAG_MUTE,"Mute")
-
-
- // AUTOFIXED BY fix_string_idiocy.py
- // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:481: HTML += " "
- HTML += {"
- \[Done\]
- \[Reset\]
- "}
- // END AUTOFIX
- user << browse(null, "window=preferences")
- user << browse(HTML, "window=disabil;size=350x300")
- return
-
-/datum/preferences/proc/SetRecords(mob/user)
- var/HTML = ""
- HTML += ""
- HTML += "Set Character Records "
-
- HTML += "Medical Records "
-
- if(lentext(med_record) <= 40)
- HTML += "[med_record]"
- else
- HTML += "[copytext(med_record, 1, 37)]..."
-
- HTML += "Employment Records "
-
- if(lentext(gen_record) <= 40)
- HTML += "[gen_record]"
- else
- HTML += "[copytext(gen_record, 1, 37)]..."
-
- HTML += "Security Records "
-
- if(lentext(sec_record) <= 40)
- HTML += "[sec_record] "
- else
- HTML += "[copytext(sec_record, 1, 37)]... "
-
- HTML += " "
- HTML += "\[Done\] "
- HTML += " "
-
- user << browse(null, "window=preferences")
- user << browse(HTML, "window=records;size=350x300")
- return
-
-/datum/preferences/proc/GetPlayerAltTitle(datum/job/job)
- return player_alt_titles.Find(job.title) > 0 \
- ? player_alt_titles[job.title] \
- : job.title
-
-/datum/preferences/proc/SetPlayerAltTitle(datum/job/job, new_title)
- // remove existing entry
- if(player_alt_titles.Find(job.title))
- player_alt_titles -= job.title
- // add one if it's not default
- if(job.title != new_title)
- player_alt_titles[job.title] = new_title
-
-/datum/preferences/proc/SetJob(mob/user, role)
- var/datum/job/job = job_master.GetJob(role)
- if(!job)
- user << browse(null, "window=mob_occupation")
- ShowChoices(user)
- return
-
- if(role == "Civilian")
- if(job_support_low & job.flag)
- job_support_low &= ~job.flag
- else
- job_support_low |= job.flag
- SetChoices(user)
- return 1
-
- if(GetJobDepartment(job, 1) & job.flag)
- SetJobDepartment(job, 1)
- else if(GetJobDepartment(job, 2) & job.flag)
- SetJobDepartment(job, 2)
- else if(GetJobDepartment(job, 3) & job.flag)
- SetJobDepartment(job, 3)
- else//job = Never
- SetJobDepartment(job, 4)
-
- SetChoices(user)
- return 1
-
-/datum/preferences/proc/ResetJobs()
- job_support_high = 0
- job_support_med = 0
- job_support_low = 0
-
- job_medsci_high = 0
- job_medsci_med = 0
- job_medsci_low = 0
-
- job_engsec_high = 0
- job_engsec_med = 0
- job_engsec_low = 0
-
- job_karma_high = 0
- job_karma_med = 0
- job_karma_low = 0
-
-
-/datum/preferences/proc/GetJobDepartment(var/datum/job/job, var/level)
- if(!job || !level) return 0
- switch(job.department_flag)
- if(SUPPORT)
- switch(level)
- if(1)
- return job_support_high
- if(2)
- return job_support_med
- if(3)
- return job_support_low
- if(MEDSCI)
- switch(level)
- if(1)
- return job_medsci_high
- if(2)
- return job_medsci_med
- if(3)
- return job_medsci_low
- if(ENGSEC)
- switch(level)
- if(1)
- return job_engsec_high
- if(2)
- return job_engsec_med
- if(3)
- return job_engsec_low
- if(KARMA)
- switch(level)
- if(1)
- return job_karma_high
- if(2)
- return job_karma_med
- if(3)
- return job_karma_low
- return 0
-
-/datum/preferences/proc/SetJobDepartment(var/datum/job/job, var/level)
- if(!job || !level) return 0
- switch(level)
- if(1)//Only one of these should ever be active at once so clear them all here
- job_support_high = 0
- job_medsci_high = 0
- job_engsec_high = 0
- job_karma_high = 0
- return 1
- if(2)//Set current highs to med, then reset them
- job_support_med |= job_support_high
- job_medsci_med |= job_medsci_high
- job_engsec_med |= job_engsec_high
- job_karma_med |= job_karma_high
- job_support_high = 0
- job_medsci_high = 0
- job_engsec_high = 0
- job_karma_high = 0
-
- switch(job.department_flag)
- if(SUPPORT)
- switch(level)
- if(2)
- job_support_high = job.flag
- job_support_med &= ~job.flag
- if(3)
- job_support_med |= job.flag
- job_support_low &= ~job.flag
- else
- job_support_low |= job.flag
- if(MEDSCI)
- switch(level)
- if(2)
- job_medsci_high = job.flag
- job_medsci_med &= ~job.flag
- if(3)
- job_medsci_med |= job.flag
- job_medsci_low &= ~job.flag
- else
- job_medsci_low |= job.flag
- if(ENGSEC)
- switch(level)
- if(2)
- job_engsec_high = job.flag
- job_engsec_med &= ~job.flag
- if(3)
- job_engsec_med |= job.flag
- job_engsec_low &= ~job.flag
- else
- job_engsec_low |= job.flag
- if(KARMA)
- switch(level)
- if(2)
- job_karma_high = job.flag
- job_karma_med &= ~job.flag
- if(3)
- job_karma_med |= job.flag
- job_karma_low &= ~job.flag
- else
- job_karma_low |= job.flag
- return 1
-
-/datum/preferences/proc/process_link(mob/user, list/href_list)
- if(!user) return
-
- if(href_list["preference"] == "job")
- switch(href_list["task"])
- if("close")
- user << browse(null, "window=mob_occupation")
- ShowChoices(user)
- if("reset")
- ResetJobs()
- SetChoices(user)
- if("random")
- if(alternate_option == GET_RANDOM_JOB || alternate_option == BE_CIVILIAN)
- alternate_option += 1
- else if(alternate_option == RETURN_TO_LOBBY)
- alternate_option = 0
- else
- return 0
- SetChoices(user)
- if ("alt_title")
- var/datum/job/job = locate(href_list["job"])
- if (job)
- var/choices = list(job.title) + job.alt_titles
- var/choice = input("Pick a title for [job.title].", "Character Generation", GetPlayerAltTitle(job)) as anything in choices | null
- if(choice)
- SetPlayerAltTitle(job, choice)
- SetChoices(user)
- if("input")
- SetJob(user, href_list["text"])
- if("setJobLevel")
- UpdateJobPreference(user, href_list["text"], text2num(href_list["level"]))
- else
- SetChoices(user)
- return 1
- else if(href_list["preference"] == "disabilities")
-
- switch(href_list["task"])
- if("close")
- user << browse(null, "window=disabil")
- ShowChoices(user)
- if("reset")
- disabilities=0
- SetDisabilities(user)
- if("input")
- var/dflag=text2num(href_list["disability"])
- if(dflag >= 0)
- if(!(dflag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey")))
- disabilities ^= text2num(href_list["disability"]) //MAGIC
- SetDisabilities(user)
- else
- SetDisabilities(user)
- return 1
-
- else if(href_list["preference"] == "records")
- if(text2num(href_list["record"]) >= 1)
- SetRecords(user)
- return
- else
- user << browse(null, "window=records")
- if(href_list["task"] == "med_record")
- var/medmsg = input(usr,"Set your medical notes here.","Medical Records",html_decode(med_record)) as message
-
- if(medmsg != null)
- medmsg = copytext(medmsg, 1, MAX_PAPER_MESSAGE_LEN)
- medmsg = html_encode(medmsg)
-
- med_record = medmsg
- SetRecords(user)
-
- if(href_list["task"] == "sec_record")
- var/secmsg = input(usr,"Set your security notes here.","Security Records",html_decode(sec_record)) as message
-
- if(secmsg != null)
- secmsg = copytext(secmsg, 1, MAX_PAPER_MESSAGE_LEN)
- secmsg = html_encode(secmsg)
-
- sec_record = secmsg
- SetRecords(user)
- if(href_list["task"] == "gen_record")
- var/genmsg = input(usr,"Set your employment notes here.","Employment Records",html_decode(gen_record)) as message
-
- if(genmsg != null)
- genmsg = copytext(genmsg, 1, MAX_PAPER_MESSAGE_LEN)
- genmsg = html_encode(genmsg)
-
- gen_record = genmsg
- SetRecords(user)
-
- switch(href_list["task"])
- if("random")
- switch(href_list["preference"])
- if("name")
- real_name = random_name(gender,species)
- if("age")
- age = rand(AGE_MIN, AGE_MAX)
- if("hair")
- if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
- r_hair = rand(0,255)
- g_hair = rand(0,255)
- b_hair = rand(0,255)
- if("h_style")
- h_style = random_hair_style(gender, species)
- if("facial")
- if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
- r_facial = rand(0,255)
- g_facial = rand(0,255)
- b_facial = rand(0,255)
- if("f_style")
- f_style = random_facial_hair_style(gender, species)
- if("underwear")
- underwear = random_underwear(gender)
- ShowChoices(user)
- if("undershirt")
- undershirt = random_undershirt(gender)
- ShowChoices(user)
- if("socks")
- socks = random_socks(gender)
- ShowChoices(user)
- if("eyes")
- r_eyes = rand(0,255)
- g_eyes = rand(0,255)
- b_eyes = rand(0,255)
- if("s_tone")
- if(species in list("Human", "Drask", "Vox"))
- s_tone = random_skin_tone(species)
- if("s_color")
- if(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Wryn", "Vulpkanin", "Machine"))
- r_skin = rand(0,255)
- g_skin = rand(0,255)
- b_skin = rand(0,255)
- if("bag")
- backbag = rand(1,4)
- /*if("skin_style")
- h_style = random_skin_style(gender)*/
- if("all")
- random_character()
- if("input")
- switch(href_list["preference"])
- if("name")
- var/raw_name = input(user, "Choose your character's name:", "Character Preference") as text|null
- if (!isnull(raw_name)) // Check to ensure that the user entered text (rather than cancel.)
- var/new_name = reject_bad_name(raw_name)
- if(new_name)
- real_name = new_name
- else
- to_chat(user, "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and . ")
-
- if("age")
- var/new_age = input(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX])", "Character Preference") as num|null
- if(new_age)
- age = max(min(round(text2num(new_age)), AGE_MAX),AGE_MIN)
- if("species")
-
- var/list/new_species = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin")
- var/prev_species = species
-// var/whitelisted = 0
-
- if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it!
- for(var/S in whitelisted_species)
- if(is_alien_whitelisted(user,S))
- new_species += S
-// whitelisted = 1
-// if(!whitelisted)
-// alert(user, "You cannot change your species as you need to be whitelisted. If you wish to be whitelisted contact an admin in-game, on the forums, or on IRC.")
- else //Not using the whitelist? Aliens for everyone!
- new_species += whitelisted_species
-
- species = input("Please select a species", "Character Generation", null) in new_species
-
- if(prev_species != species)
- //grab one of the valid hair styles for the newly chosen species
- var/list/valid_hairstyles = list()
- for(var/hairstyle in hair_styles_list)
- var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
- if(gender == MALE && S.gender == FEMALE)
- continue
- if(gender == FEMALE && S.gender == MALE)
- continue
- if(!(species in S.species_allowed))
- continue
-
- valid_hairstyles[hairstyle] = hair_styles_list[hairstyle]
-
- if(valid_hairstyles.len)
- h_style = pick(valid_hairstyles)
- else
- //this shouldn't happen
- h_style = hair_styles_list["Bald"]
-
- //grab one of the valid facial hair styles for the newly chosen species
- var/list/valid_facialhairstyles = list()
- for(var/facialhairstyle in facial_hair_styles_list)
- var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
- if(gender == MALE && S.gender == FEMALE)
- continue
- if(gender == FEMALE && S.gender == MALE)
- continue
- if(!(species in S.species_allowed))
- continue
-
- valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
-
- if(valid_facialhairstyles.len)
- f_style = pick(valid_facialhairstyles)
- else
- //this shouldn't happen
- f_style = facial_hair_styles_list["Shaved"]
-
- // Don't wear another species' underwear!
- var/datum/sprite_accessory/S = underwear_list[underwear]
- if(!(species in S.species_allowed))
- underwear = random_underwear(gender, species)
-
- S = undershirt_list[undershirt]
- if(!(species in S.species_allowed))
- undershirt = random_undershirt(gender, species)
-
- S = socks_list[socks]
- if(!(species in S.species_allowed))
- socks = random_socks(gender, species)
-
- //reset hair colour and skin colour
- r_hair = 0//hex2num(copytext(new_hair, 2, 4))
- g_hair = 0//hex2num(copytext(new_hair, 4, 6))
- b_hair = 0//hex2num(copytext(new_hair, 6, 8))
-
- s_tone = 0
-
- if(!(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")))
- r_skin = 0
- g_skin = 0
- b_skin = 0
-
- ha_style = "None" // No Vulp ears on Unathi
- m_style = "None" // No Unathi markings on Tajara
-
- body_accessory = null //no vulptail on humans damnit
-
- //Reset prosthetics.
- organ_data = list()
- rlimb_data = list()
- if("speciesprefs")//oldvox code
- speciesprefs = !speciesprefs
-
- if("language")
-// var/languages_available
- var/list/new_languages = list("None")
-/*
- if(config.usealienwhitelist)
- for(var/L in all_languages)
- var/datum/language/lang = all_languages[L]
- if((!(lang.flags & RESTRICTED)) && (is_alien_whitelisted(user, L)||(!( lang.flags & WHITELISTED ))))
- new_languages += lang
- languages_available = 1
-
- if(!(languages_available))
- alert(user, "There are not currently any available secondary languages.")
- else
-*/
- for(var/L in all_languages)
- var/datum/language/lang = all_languages[L]
- if(!(lang.flags & RESTRICTED))
- new_languages += lang.name
-
- language = input("Please select a secondary language", "Character Generation", null) in new_languages
-
- 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
- if(new_metadata)
- metadata = sanitize(copytext(new_metadata,1,MAX_MESSAGE_LEN))
-
- if("b_type")
- var/new_b_type = input(user, "Choose your character's blood-type:", "Character Preference") as null|anything in list( "A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-" )
- if(new_b_type)
- b_type = new_b_type
-
- if("hair")
- if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
- var/input = "Choose your character's hair colour:"
- var/new_hair = input(user, input, "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null
- if(new_hair)
- r_hair = hex2num(copytext(new_hair, 2, 4))
- g_hair = hex2num(copytext(new_hair, 4, 6))
- b_hair = hex2num(copytext(new_hair, 6, 8))
-
- if("h_style")
- var/list/valid_hairstyles = list()
- for(var/hairstyle in hair_styles_list)
- var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
- if(species == "Machine") //Species that can use prosthetic heads.
- var/obj/item/organ/external/head/H = new()
- if(S.name == "Bald")
- valid_hairstyles[hairstyle] = S
- if(!rlimb_data["head"]) //Handle situations where the head is default.
- H.model = "Morpheus Cyberkinetics"
- else
- H.model = rlimb_data["head"]
- var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(species in S.species_allowed)
- if(robohead.is_monitor && (robohead.company in S.models_allowed)) //If the Machine character has the default Morpheus screen head or another screen head
- //and said head is in the hair style's allowed models list...
- valid_hairstyles[hairstyle] = S //Allow them to select the hairstyle.
- continue
- else
- if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human hairstyles).
- continue
- else if(!robohead.is_monitor && ("Human" in S.species_allowed))
- valid_hairstyles[hairstyle] = S
- continue
- else
- if(!(species in S.species_allowed))
- continue
-
- valid_hairstyles[hairstyle] = S
-
- var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles
- if(new_h_style)
- h_style = new_h_style
-
- if("headaccessory")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories.
- var/input = "Choose the colour of your your character's head accessory:"
- var/new_head_accessory = input(user, input, "Character Preference", rgb(r_headacc, g_headacc, b_headacc)) as color|null
- if(new_head_accessory)
- r_headacc = hex2num(copytext(new_head_accessory, 2, 4))
- g_headacc = hex2num(copytext(new_head_accessory, 4, 6))
- b_headacc = hex2num(copytext(new_head_accessory, 6, 8))
-
- if("ha_style")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories.
- var/list/valid_head_accessory_styles = list()
- for(var/head_accessory_style in head_accessory_styles_list)
- var/datum/sprite_accessory/H = head_accessory_styles_list[head_accessory_style]
- if(!(species in H.species_allowed))
- continue
-
- valid_head_accessory_styles[head_accessory_style] = head_accessory_styles_list[head_accessory_style]
-
- var/new_head_accessory_style = input(user, "Choose the style of your character's head accessory:", "Character Preference") as null|anything in valid_head_accessory_styles
- if(new_head_accessory_style)
- ha_style = new_head_accessory_style
-
- if("markings")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings.
- var/input = "Choose the colour of your your character's markings:"
- var/new_markings = input(user, input, "Character Preference", rgb(r_markings, g_markings, b_markings)) as color|null
- if(new_markings)
- r_markings = hex2num(copytext(new_markings, 2, 4))
- g_markings = hex2num(copytext(new_markings, 4, 6))
- b_markings = hex2num(copytext(new_markings, 6, 8))
-
- if("m_style")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings.
- var/list/valid_markings = list()
- for(var/markingstyle in marking_styles_list)
- var/datum/sprite_accessory/M = marking_styles_list[markingstyle]
- if(!(species in M.species_allowed))
- continue
-
- if(species == "Machine") //Species that can use prosthetic heads.
- var/obj/item/organ/external/head/H = new()
- if(!rlimb_data["head"]) //Handle situations where the head is default.
- H.model = "Morpheus Cyberkinetics"
- else
- H.model = rlimb_data["head"]
- var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(robohead.is_monitor && M.name != "None") //If the character can have prosthetic heads and they have the default Morpheus head (or another monitor-head), no optic markings.
- continue
- else if(!robohead.is_monitor && M.name != "None") //Otherwise, if they DON'T have the default head and the head's not a monitor but the head's not in the style's list of allowed models, skip.
- if(!(robohead.company in M.models_allowed))
- continue
-
- valid_markings[markingstyle] = marking_styles_list[markingstyle]
-
- var/new_marking_style = input(user, "Choose the style of your character's markings:", "Character Preference", m_style) as null|anything in valid_markings
- if(new_marking_style)
- m_style = new_marking_style
-
- if("body_accessory")
- var/list/possible_body_accessories = list()
- if(check_rights(R_ADMIN, 1, user))
- possible_body_accessories = body_accessory_by_name.Copy()
- else
- for(var/B in body_accessory_by_name)
- var/datum/body_accessory/accessory = body_accessory_by_name[B]
- if(!istype(accessory))
- possible_body_accessories += "None" //the only null entry should be the "None" option
- continue
- if(species in accessory.allowed_species)
- possible_body_accessories += B
-
- var/new_body_accessory = input(user, "Choose your body accessory:", "Character Preference") as null|anything in possible_body_accessories
- if(new_body_accessory)
- body_accessory = (new_body_accessory == "None") ? null : new_body_accessory
-
- if("facial")
- if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
- var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(r_facial, g_facial, b_facial)) as color|null
- if(new_facial)
- r_facial = hex2num(copytext(new_facial, 2, 4))
- g_facial = hex2num(copytext(new_facial, 4, 6))
- b_facial = hex2num(copytext(new_facial, 6, 8))
-
- if("f_style")
- var/list/valid_facialhairstyles = list()
- for(var/facialhairstyle in facial_hair_styles_list)
- var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
- if(S.name == "Shaved")
- valid_facialhairstyles[facialhairstyle] = S
- if(gender == MALE && S.gender == FEMALE)
- continue
- if(gender == FEMALE && S.gender == MALE)
- continue
- if(species == "Machine") //Species that can use prosthetic heads.
- var/obj/item/organ/external/head/H = new()
- if(!rlimb_data["head"]) //Handle situations where the head is default.
- H.model = "Morpheus Cyberkinetics"
- else
- H.model = rlimb_data["head"]
- var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(species in S.species_allowed)
- if(robohead.is_monitor) //If the Machine character has the default Morpheus screen head or another screen head and they're allowed to have the style, let them have it.
- valid_facialhairstyles[facialhairstyle] = S
- continue
- else
- if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human facial hairstyles).
- continue
- else if(!robohead.is_monitor && ("Human" in S.species_allowed))
- valid_facialhairstyles[facialhairstyle] = S
- continue
- else
- if(!(species in S.species_allowed))
- continue
-
- valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
-
- var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facialhairstyles
- if(new_f_style)
- f_style = new_f_style
-
- if("underwear")
- var/list/underwear_options
- if(gender == MALE)
- underwear_options = underwear_m
- else
- underwear_options = underwear_f
-
- var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in underwear_options
- if(new_underwear)
- underwear = new_underwear
- ShowChoices(user)
-
- if("undershirt")
- var/new_undershirt
- if(gender == MALE)
- new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_m
- else
- new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_f
- if(new_undershirt)
- undershirt = new_undershirt
- ShowChoices(user)
-
- if("socks")
- var/list/valid_sockstyles = list()
- for(var/sockstyle in socks_list)
- var/datum/sprite_accessory/S = socks_list[sockstyle]
- if(gender == MALE && S.gender == FEMALE)
- continue
- if(gender == FEMALE && S.gender == MALE)
- continue
- if(!(species in S.species_allowed))
- continue
- valid_sockstyles[sockstyle] = socks_list[sockstyle]
- var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in valid_sockstyles
- ShowChoices(user)
- if(new_socks)
- socks = new_socks
-
- if("eyes")
- var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(r_eyes, g_eyes, b_eyes)) as color|null
- if(new_eyes)
- r_eyes = hex2num(copytext(new_eyes, 2, 4))
- g_eyes = hex2num(copytext(new_eyes, 4, 6))
- b_eyes = hex2num(copytext(new_eyes, 6, 8))
-
- if("s_tone")
- if(species == "Human" || species == "Drask")
- var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference") as num|null
- if(new_s_tone)
- s_tone = 35 - max(min(round(new_s_tone), 220), 1)
- else if(species == "Vox")
- var/skin_c = input(user, "Choose your Vox's skin color:\n(1 = Default Green, 2 = Dark Green, 3 = Brown, 4 = Grey, \n5 = Emerald, 6 = Azure)", "Character Preference") as num|null
- if(skin_c)
- s_tone = max(min(round(skin_c), 6), 1)
-
- if("skin")
- if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
- var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null
- if(new_skin)
- r_skin = hex2num(copytext(new_skin, 2, 4))
- g_skin = hex2num(copytext(new_skin, 4, 6))
- b_skin = hex2num(copytext(new_skin, 6, 8))
-
- if("ooccolor")
- var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference", ooccolor) as color|null
- if(new_ooccolor)
- ooccolor = new_ooccolor
-
- if("bag")
- var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist
- if(new_backbag)
- backbag = backbaglist.Find(new_backbag)
-
- if("nt_relation")
- var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference") as null|anything in list("Loyal", "Supportive", "Neutral", "Skeptical", "Opposed")
- if(new_relation)
- nanotrasen_relation = new_relation
-
- 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
-
- if(msg != null)
- msg = copytext(msg, 1, MAX_MESSAGE_LEN)
- msg = html_encode(msg)
-
- flavor_text = msg
-
- if("limbs")
- var/valid_limbs = list("Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand")
- if(species == "Machine")
- valid_limbs = list("Torso", "Lower Body", "Head", "Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand")
- var/limb_name = input(user, "Which limb do you want to change?") as null|anything in valid_limbs
- if(!limb_name) return
-
- var/limb = null
- var/second_limb = null // if you try to change the arm, the hand should also change
- var/third_limb = null // if you try to unchange the hand, the arm should also change
- var/valid_limb_states = list("Normal", "Amputated", "Prosthesis")
- var/no_amputate = 0
-
- switch(limb_name)
- if("Torso")
- limb = "chest"
- second_limb = "groin"
- no_amputate = 1
- if("Lower Body")
- limb = "groin"
- no_amputate = 1
- if("Head")
- limb = "head"
- no_amputate = 1
- if("Left Leg")
- limb = "l_leg"
- second_limb = "l_foot"
- if("Right Leg")
- limb = "r_leg"
- second_limb = "r_foot"
- if("Left Arm")
- limb = "l_arm"
- second_limb = "l_hand"
- if("Right Arm")
- limb = "r_arm"
- second_limb = "r_hand"
- if("Left Foot")
- limb = "l_foot"
- if(species != "Machine")
- third_limb = "l_leg"
- if("Right Foot")
- limb = "r_foot"
- if(species != "Machine")
- third_limb = "r_leg"
- if("Left Hand")
- limb = "l_hand"
- if(species != "Machine")
- third_limb = "l_arm"
- if("Right Hand")
- limb = "r_hand"
- if(species != "Machine")
- third_limb = "r_arm"
-
- var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in valid_limb_states
- if(!new_state) return
-
- switch(new_state)
- if("Normal")
- if(limb == "head")
- m_style = "None"
- h_style = random_hair_style(gender, species)
- f_style = facial_hair_styles_list["Shaved"]
- organ_data[limb] = null
- rlimb_data[limb] = null
- if(third_limb)
- organ_data[third_limb] = null
- rlimb_data[third_limb] = null
- if("Amputated")
- if(!no_amputate)
- organ_data[limb] = "amputated"
- rlimb_data[limb] = null
- if(second_limb)
- organ_data[second_limb] = "amputated"
- rlimb_data[second_limb] = null
- if("Prosthesis")
- var/choice
- var/subchoice
- var/datum/robolimb/R = new()
- var/in_model
- var/robolimb_companies = list()
- for(var/limb_type in typesof(/datum/robolimb)) //This loop populates a list of companies that offer the limb the user selected previously as one of their cybernetic products.
- R = new limb_type()
- if(!R.unavailable_at_chargen && (limb in R.parts) && R.has_subtypes) //Ensures users can only choose companies that offer the parts they want, that singular models get added to the list as well companies that offer more than one model, and...
- robolimb_companies[R.company] = R //List only main brands that have the parts we're looking for.
- R = new() //Re-initialize R.
-
- choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in robolimb_companies //Choose from a list of companies that offer the part the user wants.
- if(!choice)
- return
- R.company = choice
- R = all_robolimbs[R.company]
- if(R.has_subtypes == 1) //If the company the user selected provides more than just one base model, lets handle it.
- var/list/robolimb_models = list()
- for(var/limb_type in typesof(R)) //Handling the different models of parts that manufacturers can provide.
- var/datum/robolimb/L = new limb_type()
- if(limb in L.parts) //Make sure that only models that provide the parts the user needs populate the list.
- robolimb_models[L.company] = L
- if(robolimb_models.len == 1) //If there's only one model available in the list, autoselect it to avoid having to bother the user with a dialog that provides only one option.
- subchoice = L.company //If there ends up being more than one model populating the list, subchoice will be overwritten later anyway, so this isn't a problem.
- if(second_limb in L.parts) //If the child limb of the limb the user selected is also present in the model's parts list, state it's been found so the second limb can be set later.
- in_model = 1
- if(robolimb_models.len > 1) //If there's more than one model in the list that can provide the part the user wants, let them choose.
- subchoice = input(user, "Which model of [choice] [limb_name] do you wish to use?") as null|anything in robolimb_models
- if(subchoice)
- choice = subchoice
- if(limb == "head")
- ha_style = "None"
- h_style = hair_styles_list["Bald"]
- f_style = facial_hair_styles_list["Shaved"]
- m_style = "None"
- rlimb_data[limb] = choice
- organ_data[limb] = "cyborg"
- if(second_limb)
- if(subchoice)
- if(in_model)
- rlimb_data[second_limb] = choice
- organ_data[second_limb] = "cyborg"
- else
- rlimb_data[second_limb] = choice
- organ_data[second_limb] = "cyborg"
-
- if("organs")
- var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes")
- if(!organ_name) return
-
- var/organ = null
- switch(organ_name)
- if("Heart")
- organ = "heart"
- if("Eyes")
- organ = "eyes"
-
- var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in list("Normal","Assisted","Mechanical")
- if(!new_state) return
-
- switch(new_state)
- if("Normal")
- organ_data[organ] = null
- if("Assisted")
- organ_data[organ] = "assisted"
- if("Mechanical")
- organ_data[organ] = "mechanical"
-
-/*
- if("skin_style")
- var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3")
- if(!skin_style_name) return
-*/
-
-/* if("spawnpoint")
- var/list/spawnkeys = list()
- for(var/S in spawntypes)
- spawnkeys += S
- var/choice = input(user, "Where would you like to spawn when latejoining?") as null|anything in spawnkeys
- if(!choice || !spawntypes[choice])
- spawnpoint = "Arrivals Shuttle"
- return
- spawnpoint = choice */
-
- else
- switch(href_list["preference"])
- if("publicity")
- if(unlock_content)
- toggles ^= MEMBER_PUBLIC
-
- if("gender")
- if(gender == MALE)
- gender = FEMALE
- else
- gender = MALE
- underwear = random_underwear(gender)
-
- if("hear_adminhelps")
- sound ^= SOUND_ADMINHELP
-
- if("ui")
- switch(UI_style)
- if("Midnight")
- UI_style = "Plasmafire"
- if("Plasmafire")
- UI_style = "Retro"
- if("Retro")
- UI_style = "Slimecore"
- if("Slimecore")
- UI_style = "Operative"
- if("Operative")
- UI_style = "White"
- else
- UI_style = "Midnight"
-
- if(ishuman(usr)) //mid-round preference changes, for aesthetics
- var/mob/living/carbon/human/H = usr
- H.remake_hud()
-
- if("nanoui")
- nanoui_fancy = !nanoui_fancy
-
- if("ghost_att_anim")
- show_ghostitem_attack = !show_ghostitem_attack
-
- if("UIcolor")
- var/UI_style_color_new = input(user, "Choose your UI color, dark colors are not recommended!", UI_style_color) as color|null
- if(!UI_style_color_new) return
- UI_style_color = UI_style_color_new
-
- if(ishuman(usr)) //mid-round preference changes, for aesthetics
- var/mob/living/carbon/human/H = usr
- H.remake_hud()
-
- if("UIalpha")
- var/UI_style_alpha_new = input(user, "Select a new alpha(transparence) parameter for UI, between 50 and 255", UI_style_alpha) as num
- if(!UI_style_alpha_new | !(UI_style_alpha_new <= 255 && UI_style_alpha_new >= 50)) return
- UI_style_alpha = UI_style_alpha_new
-
- if(ishuman(usr)) //mid-round preference changes, for aesthetics
- var/mob/living/carbon/human/H = usr
- H.remake_hud()
-
- if("be_special")
- var/r = href_list["role"]
- if(!(r in special_roles))
- var/cleaned_r = sql_sanitize_text(r)
- if(r != cleaned_r) // up to no good
- message_admins("[user] attempted an href exploit! (This could have possibly lead to a \"Bobby Tables\" exploit, so they're probably up to no good). String: [r] ID: [last_id] IP: [last_ip]")
- to_chat(user, "Stop right there, criminal scum ")
- else
- be_special ^= r
-
- if("name")
- be_random_name = !be_random_name
-
- if("randomslot")
- randomslot = !randomslot
-
- if("hear_midis")
- sound ^= SOUND_MIDI
-
- if("lobby_music")
- sound ^= SOUND_LOBBY
- if(sound & SOUND_LOBBY)
- to_chat(user, sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1))
- else
- to_chat(user, sound(null, repeat = 0, wait = 0, volume = 85, channel = 1))
-
- if("ghost_ears")
- toggles ^= CHAT_GHOSTEARS
-
- if("ghost_sight")
- toggles ^= CHAT_GHOSTSIGHT
-
- if("ghost_radio")
- toggles ^= CHAT_GHOSTRADIO
-
- if("ghost_radio")
- toggles ^= CHAT_GHOSTRADIO
-
- if("save")
- save_preferences(user)
- save_character(user)
-
- if("reload")
- load_preferences(user)
- load_character(user)
-
- if("open_load_dialog")
- if(!IsGuestKey(user.key))
- open_load_dialog(user)
- return 1
-
- if("close_load_dialog")
- close_load_dialog(user)
-
- if("changeslot")
- if(!load_character(user,text2num(href_list["num"])))
- random_character()
- real_name = random_name(gender)
- save_character(user)
- close_load_dialog(user)
-
- if("tab")
- if (href_list["tab"])
- current_tab = text2num(href_list["tab"])
-
- ShowChoices(user)
- return 1
-
-/datum/preferences/proc/copy_to(mob/living/carbon/human/character)
- var/datum/species/S = all_species[species]
- character.change_species(species) // Yell at me if this causes everything to melt
- if(be_random_name)
- real_name = random_name(gender,species)
-
- if(config.humans_need_surnames)
- var/firstspace = findtext(real_name, " ")
- var/name_length = length(real_name)
- if(!firstspace) //we need a surname
- real_name += " [pick(last_names)]"
- else if(firstspace == name_length)
- real_name += "[pick(last_names)]"
-
- character.add_language(language)
-
- character.real_name = real_name
- character.dna.real_name = real_name
- character.name = character.real_name
-
- character.flavor_text = flavor_text
- if(character.ckey && !jobban_isbanned(character, "Records"))
- character.med_record = med_record
- character.sec_record = sec_record
- character.gen_record = gen_record
-
- character.change_gender(gender)
- character.age = age
- character.b_type = b_type
-
- character.r_eyes = r_eyes
- character.g_eyes = g_eyes
- character.b_eyes = b_eyes
-
- //Head-specific
- var/obj/item/organ/external/head/H = character.get_organ("head")
- H.r_hair = r_hair
- H.g_hair = g_hair
- H.b_hair = b_hair
-
- H.r_facial = r_facial
- H.g_facial = g_facial
- H.b_facial = b_facial
-
- H.h_style = h_style
- H.f_style = f_style
- //End of head-specific.
-
- character.r_skin = r_skin
- character.g_skin = g_skin
- character.b_skin = b_skin
-
- character.s_tone = s_tone
-
- // Destroy/cyborgize organs
- for(var/name in organ_data)
-
- var/status = organ_data[name]
- var/obj/item/organ/external/O = character.organs_by_name[name]
- if(O)
- if(status == "amputated")
- character.organs_by_name[O.limb_name] = null
- character.organs -= O
- if(O.children) // This might need to become recursive.
- for(var/obj/item/organ/external/child in O.children)
- character.organs_by_name[child.limb_name] = null
- character.organs -= child
-
- else if(status == "cyborg")
- if(rlimb_data[name])
- O.robotize(rlimb_data[name])
- else
- O.robotize()
- else
- var/obj/item/organ/internal/I = character.get_int_organ_tag(name)
- if(I)
- if(status == "assisted")
- I.mechassist()
- else if(status == "mechanical")
- I.robotize()
-
- character.dna.b_type = b_type
- if(disabilities & DISABILITY_FLAG_FAT && character.species.flags & CAN_BE_FAT)
- character.dna.SetSEState(FATBLOCK,1,1)
- character.mutations += FAT
- character.mutations += OBESITY
- character.overeatduration = 600
-
- if(disabilities & DISABILITY_FLAG_NEARSIGHTED)
- character.dna.SetSEState(GLASSESBLOCK,1,1)
- character.disabilities|=NEARSIGHTED
-
- if(disabilities & DISABILITY_FLAG_EPILEPTIC)
- character.dna.SetSEState(EPILEPSYBLOCK,1,1)
- character.disabilities|=EPILEPSY
-
- if(disabilities & DISABILITY_FLAG_DEAF)
- character.dna.SetSEState(DEAFBLOCK,1,1)
- character.sdisabilities|=DEAF
-
- if(disabilities & DISABILITY_FLAG_BLIND)
- character.dna.SetSEState(BLINDBLOCK,1,1)
- character.sdisabilities|=BLIND
-
- if(disabilities & DISABILITY_FLAG_MUTE)
- character.dna.SetSEState(MUTEBLOCK,1,1)
- character.sdisabilities |= MUTE
-
- S.handle_dna(character)
-
- if(character.dna.dirtySE)
- character.dna.UpdateSE()
- domutcheck(character)
-
- // Wheelchair necessary?
- var/obj/item/organ/external/l_foot = character.get_organ("l_foot")
- var/obj/item/organ/external/r_foot = character.get_organ("r_foot")
- if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
- var/obj/structure/stool/bed/chair/wheelchair/W = new /obj/structure/stool/bed/chair/wheelchair (character.loc)
- character.buckled = W
- character.update_canmove()
- W.dir = character.dir
- W.buckled_mob = character
- W.add_fingerprint(character)
-
- character.underwear = underwear
- character.undershirt = undershirt
- character.socks = socks
-
- if(character.species.bodyflags & HAS_HEAD_ACCESSORY)
- H.r_headacc = r_headacc
- H.g_headacc = g_headacc
- H.b_headacc = b_headacc
- H.ha_style = ha_style
- if(character.species.bodyflags & HAS_MARKINGS)
- character.r_markings = r_markings
- character.g_markings = g_markings
- character.b_markings = b_markings
- character.m_style = m_style
-
- if(body_accessory)
- character.body_accessory = body_accessory_by_name["[body_accessory]"]
-
- if(backbag > 4 || backbag < 1)
- backbag = 1 //Same as above
- character.backbag = backbag
-
- //Debugging report to track down a bug, which randomly assigned the plural gender to people.
- if(character.gender in list(PLURAL, NEUTER))
- if(isliving(src)) //Ghosts get neuter by default
- message_admins("[key_name_admin(character)] has spawned with their gender as plural or neuter. Please notify coders.")
- character.change_gender(MALE)
-
- character.dna.ready_dna(character, flatten_SE = 0)
- character.sync_organ_dna(assimilate=1)
- character.UpdateAppearance()
-
- // Do the initial caching of the player's body icons.
- character.force_update_limbs()
- character.update_eyes()
- character.regenerate_icons()
-
-/datum/preferences/proc/open_load_dialog(mob/user)
-
- var/DBQuery/query = dbcon.NewQuery("SELECT slot,real_name FROM [format_table_name("characters")] WHERE ckey='[user.ckey]' ORDER BY slot")
-
- var/dat = ""
- dat += ""
- dat += "Select a character slot to load "
- var/name
-
- for(var/i=1, i<=max_save_slots, i++)
- if(!query.Execute())
- var/err = query.ErrorMsg()
- log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n")
- message_admins("SQL ERROR during character slot loading. Error : \[[err]\]\n")
- return
- while(query.NextRow())
- if(i==text2num(query.item[1]))
- name = query.item[2]
- if(!name) name = "Character[i]"
- if(i==default_slot)
- name = "[name] "
- dat += "[name] "
- name = null
-
- dat += " "
- dat += "Close "
- dat += " "
-// user << browse(dat, "window=saves;size=300x390")
- var/datum/browser/popup = new(user, "saves", "Character Saves
", 300, 390)
- popup.set_content(dat)
- popup.open(0)
-
-/datum/preferences/proc/close_load_dialog(mob/user)
- user << browse(null, "window=saves")
+//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
+
+var/list/preferences_datums = list()
+
+var/global/list/special_role_times = list( //minimum age (in days) for accounts to play these roles
+ ROLE_PAI = 0,
+ ROLE_POSIBRAIN = 0,
+ ROLE_GUARDIAN = 0,
+ ROLE_TRAITOR = 7,
+ ROLE_CHANGELING = 14,
+ ROLE_SHADOWLING = 14,
+ ROLE_WIZARD = 14,
+ ROLE_REV = 14,
+ ROLE_VAMPIRE = 14,
+ ROLE_BLOB = 14,
+ ROLE_REVENANT = 14,
+ ROLE_OPERATIVE = 21,
+ ROLE_CULTIST = 21,
+ ROLE_RAIDER = 21,
+ ROLE_ALIEN = 21,
+ ROLE_DEMON = 21,
+ ROLE_SENTIENT = 21,
+// ROLE_GANG = 21,
+ ROLE_BORER = 21,
+ ROLE_NINJA = 21,
+ ROLE_MUTINEER = 21,
+ ROLE_MALF = 30,
+ ROLE_ABDUCTOR = 30,
+)
+
+/proc/player_old_enough_antag(client/C, role)
+ if(available_in_days_antag(C, role) == 0)
+ return 1 //Available in 0 days = available right now = player is old enough to play.
+ return 0
+
+/proc/available_in_days_antag(client/C, role)
+ if(!C)
+ return 0
+ if(!role)
+ return 0
+ if(!config.use_age_restriction_for_antags)
+ return 0
+ if(!isnum(C.player_age))
+ return 0 //This is only a number if the db connection is established, otherwise it is text: "Requires database", meaning these restrictions cannot be enforced
+ var/minimal_player_age_antag = special_role_times[num2text(role)]
+ if(!isnum(minimal_player_age_antag))
+ return 0
+
+ return max(0, minimal_player_age_antag - C.player_age)
+
+/proc/check_client_age(client/C, var/days) // If days isn't provided, returns the age of the client. If it is provided, it returns the days until the player_age is equal to or greater than the days variable
+ if(!days)
+ return C.player_age
+ else
+ return max(0, days - C.player_age)
+ return 0
+
+//used for alternate_option
+#define GET_RANDOM_JOB 0
+#define BE_CIVILIAN 1
+#define RETURN_TO_LOBBY 2
+
+#define MAX_SAVE_SLOTS 20 // Save slots for regular players
+#define MAX_SAVE_SLOTS_MEMBER 20 // Save slots for BYOND members
+
+#define MAX_GEAR_COST config.max_loadout_points
+
+#define TAB_CHAR 0
+#define TAB_GAME 1
+#define TAB_GEAR 2
+
+/datum/preferences
+ //doohickeys for savefiles
+// var/path
+ var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used
+// var/savefile_version = 0
+ var/max_save_slots = MAX_SAVE_SLOTS
+
+ //non-preference stuff
+ var/warns = 0
+ var/muted = 0
+ var/last_ip
+ var/last_id
+
+ //game-preferences
+ var/lastchangelog = "" //Saved changlog filesize to detect if there was a change
+ var/ooccolor = "#b82e00"
+ var/be_special = list() //Special role selection
+ var/UI_style = "Midnight"
+ var/nanoui_fancy = TRUE
+ var/toggles = TOGGLES_DEFAULT
+ var/sound = SOUND_DEFAULT
+ var/show_ghostitem_attack = TRUE
+ var/UI_style_color = "#ffffff"
+ var/UI_style_alpha = 255
+
+
+ //character preferences
+ var/real_name //our character's name
+ var/be_random_name = 0 //whether we are a random name every round
+ var/gender = MALE //gender of character (well duh)
+ var/age = 30 //age of character
+ var/spawnpoint = "Arrivals Shuttle" //where this character will spawn (0-2).
+ var/b_type = "A+" //blood type (not-chooseable)
+ var/underwear = "Nude" //underwear type
+ var/undershirt = "Nude" //undershirt type
+ var/socks = "Nude" //socks type
+ var/backbag = 2 //backpack type
+ var/ha_style = "None" //Head accessory style
+ var/r_headacc = 0 //Head accessory colour
+ var/g_headacc = 0 //Head accessory colour
+ var/b_headacc = 0 //Head accessory colour
+ var/m_style = "None" //Marking style
+ var/r_markings = 0 //Marking colour
+ var/g_markings = 0 //Marking colour
+ var/b_markings = 0 //Marking colour
+ var/h_style = "Bald" //Hair type
+ var/r_hair = 0 //Hair color
+ var/g_hair = 0 //Hair color
+ var/b_hair = 0 //Hair color
+ var/f_style = "Shaved" //Face hair type
+ var/r_facial = 0 //Face hair color
+ var/g_facial = 0 //Face hair color
+ var/b_facial = 0 //Face hair color
+ var/s_tone = 0 //Skin tone
+ var/r_skin = 0 //Skin color
+ var/g_skin = 0 //Skin color
+ var/b_skin = 0 //Skin color
+ var/r_eyes = 0 //Eye color
+ var/g_eyes = 0 //Eye color
+ var/b_eyes = 0 //Eye color
+ var/species = "Human"
+ var/language = "None" //Secondary language
+
+ var/body_accessory = null
+
+ var/speciesprefs = 0//I hate having to do this, I really do (Using this for oldvox code, making names universal I guess
+
+ //Mob preview
+ var/icon/preview_icon = null
+ var/icon/preview_icon_front = null
+ var/icon/preview_icon_side = null
+
+ //Jobs, uses bitflags
+ var/job_support_high = 0
+ var/job_support_med = 0
+ var/job_support_low = 0
+
+ var/job_medsci_high = 0
+ var/job_medsci_med = 0
+ var/job_medsci_low = 0
+
+ var/job_engsec_high = 0
+ var/job_engsec_med = 0
+ var/job_engsec_low = 0
+
+ var/job_karma_high = 0
+ var/job_karma_med = 0
+ var/job_karma_low = 0
+
+ //Keeps track of preferrence for not getting any wanted jobs
+ var/alternate_option = 0
+
+ // maps each organ to either null(intact), "cyborg" or "amputated"
+ // will probably not be able to do this for head and torso ;)
+ var/list/organ_data = list()
+ var/list/rlimb_data = list()
+
+ var/list/player_alt_titles = new() // the default name of a job like "Medical Doctor"
+// var/accent = "en-us"
+// var/voice = "m1"
+// var/pitch = 50
+// var/talkspeed = 175
+ var/flavor_text = ""
+ var/med_record = ""
+ var/sec_record = ""
+ var/gen_record = ""
+ var/disabilities = 0
+
+ var/nanotrasen_relation = "Neutral"
+
+ // 0 = character settings, 1 = game preferences
+ var/current_tab = TAB_CHAR
+
+ // OOC Metadata:
+ var/metadata = ""
+ var/slot_name = ""
+
+ // Whether or not to use randomized character slots
+ var/randomslot = 0
+
+ // jukebox volume
+ var/volume = 100
+
+ // BYOND membership
+ var/unlock_content = 0
+
+ //Gear stuff
+ var/list/gear = list()
+ var/gear_tab = "General"
+
+/datum/preferences/New(client/C)
+ b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+")
+ if(istype(C))
+ if(!IsGuestKey(C.key))
+ unlock_content = C.IsByondMember()
+ if(unlock_content)
+ max_save_slots = MAX_SAVE_SLOTS_MEMBER
+ var/loaded_preferences_successfully = load_preferences(C)
+ if(loaded_preferences_successfully)
+ if(load_character(C))
+ return
+ //we couldn't load character data so just randomize the character appearance + name
+ random_character() //let's create a random character then - rather than a fat, bald and naked man.
+ real_name = random_name(gender)
+ if(!loaded_preferences_successfully)
+ save_preferences(C)
+ save_character(C) //let's save this new random character so it doesn't keep generating new ones.
+
+/datum/preferences/proc/color_square(r, g, b)
+ return "___ "
+
+// Hello I am a proc full of snowflake species checks how are you
+/datum/preferences/proc/ShowChoices(mob/user)
+ if(!user || !user.client)
+ return
+ update_preview_icon()
+ user << browse_rsc(preview_icon_front, "previewicon.png")
+ user << browse_rsc(preview_icon_side, "previewicon2.png")
+
+ var/dat = ""
+ dat += ""
+ dat += "Character Settings "
+ dat += "Game Preferences "
+ dat += "Loadout "
+ dat += " "
+ dat += " "
+
+ switch(current_tab)
+ if(TAB_CHAR) // Character Settings
+ dat += " "
+ dat += ""
+ dat += ""
+ dat += "Identity "
+ if(appearance_isbanned(user))
+ dat += "You are banned from using custom names and appearances. \
+ You can continue to adjust your characters, but you will be randomised once you join the game.\
+ "
+ dat += "Gender: [gender == MALE ? "Male" : "Female"] "
+ dat += "Age: [age] "
+ dat += "Body: (®) "
+ dat += "Species: [species] "
+ if(species == "Vox")
+ dat += "N2 Tank: [speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"] "
+ dat += "Secondary Language: [language] "
+ dat += "Blood Type: [b_type] "
+ if(species in list("Human", "Drask", "Vox"))
+ dat += "Skin Tone: [species == "Vox" ? "[s_tone]" : "[-s_tone + 35]/220"] "
+ dat += "Disabilities: \[Set\] "
+ dat += "Nanotrasen Relation: [nanotrasen_relation] "
+ dat += "Set Flavor Text "
+ if(lentext(flavor_text) <= 40)
+ if(!lentext(flavor_text)) dat += "\[...\] "
+ else dat += "[flavor_text] "
+ else dat += "[TextPreview(flavor_text)]... "
+
+ dat += "Hair & Accessories "
+
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
+ var/headaccessoryname = "Head Accessory: "
+ if(species == "Unathi")
+ headaccessoryname = "Horns: "
+ dat += "[headaccessoryname] "
+ dat += "[ha_style] "
+ dat += "Color [color_square(r_headacc, g_headacc, b_headacc)] "
+
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have body markings.
+ dat += "Body Markings: "
+ dat += "[m_style] "
+ dat += "Color [color_square(r_markings, g_markings, b_markings)] "
+
+ dat += "Hair: "
+ dat += "[h_style] "
+ dat += "Color [color_square(r_hair, g_hair, b_hair)] "
+
+ dat += "Facial Hair: "
+ dat += "[f_style ? "[f_style]" : "Shaved"] "
+ dat += "Color [color_square(r_facial, g_facial, b_facial)] "
+
+ if(species != "Machine")
+ dat += "Eyes: "
+ dat += "Color [color_square(r_eyes, g_eyes, b_eyes)] "
+
+ if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins
+ dat += "Body Color: "
+ dat += "Color [color_square(r_skin, g_skin, b_skin)] "
+
+ if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
+ dat += "Body Accessory: "
+ dat += "[body_accessory ? "[body_accessory]" : "None"] "
+
+ dat += " "
+ dat += "Occupation Choices "
+ dat += "Set Occupation Preferences "
+ if(jobban_isbanned(user, "Records"))
+ dat += "You are banned from using character records. "
+ else
+ dat += "Character Records "
+
+ dat += "Limbs "
+ dat += "Limbs and Parts: Adjust "
+ if(species != "Slime People" && species != "Machine")
+ dat += "Internal Organs: Adjust "
+
+ //display limbs below
+ var/ind = 0
+ for(var/name in organ_data)
+ var/status = organ_data[name]
+ var/organ_name = null
+ switch(name)
+ if("chest") organ_name = "torso"
+ if("groin") organ_name = "lower body"
+ if("head") organ_name = "head"
+ if("l_arm") organ_name = "left arm"
+ if("r_arm") organ_name = "right arm"
+ if("l_leg") organ_name = "left leg"
+ if("r_leg") organ_name = "right leg"
+ if("l_foot") organ_name = "left foot"
+ if("r_foot") organ_name = "right foot"
+ if("l_hand") organ_name = "left hand"
+ if("r_hand") organ_name = "right hand"
+ if("heart") organ_name = "heart"
+ if("eyes") organ_name = "eyes"
+
+ if(status in list("cyborg", "amputated", "mechanical", "assisted"))
+ ++ind
+ if(ind > 1) dat += ", "
+
+ switch(status)
+ if("cyborg")
+ var/datum/robolimb/R
+ if(rlimb_data[name] && all_robolimbs[rlimb_data[name]])
+ R = all_robolimbs[rlimb_data[name]]
+ else
+ R = basic_robolimb
+ dat += "\t[R.company] [organ_name] prosthesis"
+ if("amputated") dat += "\tAmputated [organ_name]"
+ if("mechanical") dat += "\tMechanical [organ_name]"
+ if("assisted")
+ switch(organ_name)
+ if("heart") dat += "\tPacemaker-assisted [organ_name]"
+ if("voicebox") dat += "\tSurgically altered [organ_name]"
+ if("eyes") dat += "\tRetinal overlayed [organ_name]"
+ else dat += "\tMechanically assisted [organ_name]"
+ if(!ind) dat += "\[...\] "
+ else dat += " "
+
+ dat += "Clothing "
+ dat += "Underwear: [underwear] "
+ dat += "Undershirt: [undershirt] "
+ dat += "Socks: [socks] "
+ dat += "Backpack Type: [backbaglist[backbag]] "
+
+ dat += "
"
+
+ if(TAB_GAME) // General Preferences
+ dat += ""
+
+ if(TAB_GEAR)
+ var/total_cost = 0
+ var/list/type_blacklist = list()
+ if(gear && gear.len)
+ for(var/i = 1, i <= gear.len, i++)
+ var/datum/gear/G = gear_datums[gear[i]]
+ if(G)
+ if(!G.subtype_cost_overlap)
+ if(G.subtype_path in type_blacklist)
+ continue
+ type_blacklist += G.subtype_path
+ total_cost += G.cost
+
+ var/fcolor = "#3366CC"
+ if(total_cost < MAX_GEAR_COST)
+ fcolor = "#E67300"
+ dat += ""
+ dat += "[total_cost]/[MAX_GEAR_COST] loadout points spent. \[Clear Loadout \] "
+ dat += ""
+
+ var/firstcat = 1
+ for(var/category in loadout_categories)
+ if(firstcat)
+ firstcat = 0
+ else
+ dat += " |"
+ if(category == gear_tab)
+ dat += " [category] "
+ else
+ dat += " [category] "
+ dat += " "
+
+ var/datum/loadout_category/LC = loadout_categories[gear_tab]
+ dat += " "
+ dat += "[LC.category] "
+ dat += " "
+ for(var/gear_name in LC.gear)
+ var/datum/gear/G = LC.gear[gear_name]
+ var/ticked = (G.display_name in gear)
+ dat += "[G.display_name] "
+ dat += "[G.cost] "
+ if(G.allowed_roles)
+ dat += "Restrictions: "
+ for(var/role in G.allowed_roles)
+ dat += role + " "
+ dat += " "
+ dat += " [G.description] "
+ if(ticked)
+ . += ""
+ for(var/datum/gear_tweak/tweak in G.gear_tweaks)
+ . += " [tweak.get_contents(get_tweak_metadata(G, tweak))] "
+ . += " "
+ dat += "
"
+
+ dat += ""
+ if(!IsGuestKey(user.key))
+ dat += "Undo - "
+ dat += "Save Setup - "
+
+ dat += "Reset Setup "
+ dat += " "
+
+ var/datum/browser/popup = new(user, "preferences", "Character Setup
", 820, 640)
+ popup.set_content(dat)
+ popup.open(0)
+
+
+/datum/preferences/proc/get_gear_metadata(var/datum/gear/G)
+ . = gear[G.display_name]
+ if(!.)
+ . = list()
+ gear[G.display_name] = .
+
+/datum/preferences/proc/get_tweak_metadata(var/datum/gear/G, var/datum/gear_tweak/tweak)
+ var/list/metadata = get_gear_metadata(G)
+ . = metadata["[tweak]"]
+ if(!.)
+ . = tweak.get_default()
+ metadata["[tweak]"] = .
+
+/datum/preferences/proc/set_tweak_metadata(var/datum/gear/G, var/datum/gear_tweak/tweak, var/new_metadata)
+ var/list/metadata = get_gear_metadata(G)
+ metadata["[tweak]"] = new_metadata
+
+
+/datum/preferences/proc/SetChoices(mob/user, limit = 12, list/splitJobs = list("Civilian","Research Director","AI","Bartender"), width = 760, height = 790)
+ if(!job_master)
+ return
+
+ //limit - The amount of jobs allowed per column. Defaults to 17 to make it look nice.
+ //splitJobs - Allows you split the table by job. You can make different tables for each department by including their heads. Defaults to CE to make it look nice.
+ //width - Screen' width. Defaults to 550 to make it look nice.
+ //height - Screen's height. Defaults to 500 to make it look nice.
+
+
+ var/HTML = ""
+ HTML += ""
+ HTML += "Choose occupation chances Unavailable occupations are crossed out. "
+ HTML += "\[Done\] " // Easier to press up here.
+ HTML += "Left-click to raise an occupation preference, right-click to lower it.
"
+ HTML += ""
+ HTML += "" // Table within a table for alignment, also allows you to easily add more colomns.
+ HTML += ""
+ var/index = -1
+
+ //The job before the current job. I only use this to get the previous jobs color when I'm filling in blank rows.
+ var/datum/job/lastJob
+ if(!job_master) return
+ for(var/datum/job/job in job_master.occupations)
+
+ if(job.admin_only)
+ continue
+
+ index += 1
+ if((index >= limit) || (job.title in splitJobs))
+ if((index < limit) && (lastJob != null))
+ //If the cells were broken up by a job in the splitJob list then it will fill in the rest of the cells with
+ //the last job's selection color. Creating a rather nice effect.
+ for(var/i = 0, i < (limit - index), i += 1)
+ HTML += "    "
+ HTML += "
"
+ index = 0
+
+ HTML += ""
+ var/rank = job.title
+ lastJob = job
+ if(!is_job_whitelisted(user, rank))
+ HTML += "[rank] \[KARMA] "
+ continue
+ if(jobban_isbanned(user, rank))
+ HTML += "[rank] \[BANNED] "
+ continue
+ if(!job.player_old_enough(user.client))
+ var/available_in_days = job.available_in_days(user.client)
+ HTML += "[rank] \[IN [(available_in_days)] DAYS] "
+ continue
+ if((job_support_low & CIVILIAN) && (rank != "Civilian"))
+ HTML += "[rank] "
+ continue
+ if((rank in command_positions) || (rank == "AI"))//Bold head jobs
+ HTML += "[rank] "
+ else
+ HTML += "[rank] "
+
+ HTML += ""
+
+ var/prefLevelLabel = "ERROR"
+ var/prefLevelColor = "pink"
+ var/prefUpperLevel = -1 // level to assign on left click
+ var/prefLowerLevel = -1 // level to assign on right click
+
+ if(GetJobDepartment(job, 1) & job.flag)
+ prefLevelLabel = "High"
+ prefLevelColor = "slateblue"
+ prefUpperLevel = 4
+ prefLowerLevel = 2
+ else if(GetJobDepartment(job, 2) & job.flag)
+ prefLevelLabel = "Medium"
+ prefLevelColor = "green"
+ prefUpperLevel = 1
+ prefLowerLevel = 3
+ else if(GetJobDepartment(job, 3) & job.flag)
+ prefLevelLabel = "Low"
+ prefLevelColor = "orange"
+ prefUpperLevel = 2
+ prefLowerLevel = 4
+ else
+ prefLevelLabel = "NEVER"
+ prefLevelColor = "red"
+ prefUpperLevel = 3
+ prefLowerLevel = 1
+
+
+ HTML += ""
+
+// HTML += " "
+
+ if(rank == "Civilian")//Civilian is special
+ if(job_support_low & CIVILIAN)
+ HTML += " \[Yes] "
+ else
+ HTML += " \[No] "
+ if(job.alt_titles)
+ HTML += "\[[GetPlayerAltTitle(job)]\] "
+ HTML += ""
+ continue
+/*
+ if(GetJobDepartment(job, 1) & job.flag)
+ HTML += " \[High] "
+ else if(GetJobDepartment(job, 2) & job.flag)
+ HTML += " \[Medium] "
+ else if(GetJobDepartment(job, 3) & job.flag)
+ HTML += " \[Low] "
+ else
+ HTML += " \[NEVER] "
+ */
+ HTML += "[prefLevelLabel] "
+
+ if(job.alt_titles)
+ HTML += "\[[GetPlayerAltTitle(job)]\] "
+
+
+ HTML += ""
+
+ for(var/i = 1, i < (limit - index), i += 1) // Finish the column so it is even
+ HTML += "    "
+
+ HTML += "
"
+
+ HTML += "
"
+
+ switch(alternate_option)
+ if(GET_RANDOM_JOB)
+ HTML += "Get random job if preferences unavailable "
+ if(BE_CIVILIAN)
+ HTML += "Be a civilian if preferences unavailable "
+ if(RETURN_TO_LOBBY)
+ HTML += "Return to lobby if preferences unavailable "
+
+ HTML += "\[Reset\] "
+ HTML += " "
+
+ user << browse(null, "window=preferences")
+// user << browse(HTML, "window=mob_occupation;size=[width]x[height]")
+ var/datum/browser/popup = new(user, "mob_occupation", "Occupation Preferences
", width, height)
+ popup.set_window_options("can_close=0")
+ popup.set_content(HTML)
+ popup.open(0)
+ return
+
+/datum/preferences/proc/SetJobPreferenceLevel(var/datum/job/job, var/level)
+ if(!job)
+ return 0
+
+ if(level == 1) // to high
+ // remove any other job(s) set to high
+ job_support_med |= job_support_high
+ job_engsec_med |= job_engsec_high
+ job_medsci_med |= job_medsci_high
+ job_karma_med |= job_karma_high
+ job_support_high = 0
+ job_engsec_high = 0
+ job_medsci_high = 0
+ job_karma_high = 0
+
+ if(job.department_flag == SUPPORT)
+ job_support_low &= ~job.flag
+ job_support_med &= ~job.flag
+ job_support_high &= ~job.flag
+
+ switch(level)
+ if(1)
+ job_support_high |= job.flag
+ if(2)
+ job_support_med |= job.flag
+ if(3)
+ job_support_low |= job.flag
+
+ return 1
+ else if(job.department_flag == ENGSEC)
+ job_engsec_low &= ~job.flag
+ job_engsec_med &= ~job.flag
+ job_engsec_high &= ~job.flag
+
+ switch(level)
+ if(1)
+ job_engsec_high |= job.flag
+ if(2)
+ job_engsec_med |= job.flag
+ if(3)
+ job_engsec_low |= job.flag
+
+ return 1
+ else if(job.department_flag == MEDSCI)
+ job_medsci_low &= ~job.flag
+ job_medsci_med &= ~job.flag
+ job_medsci_high &= ~job.flag
+
+ switch(level)
+ if(1)
+ job_medsci_high |= job.flag
+ if(2)
+ job_medsci_med |= job.flag
+ if(3)
+ job_medsci_low |= job.flag
+
+ return 1
+ else if(job.department_flag == KARMA)
+ job_karma_low &= ~job.flag
+ job_karma_med &= ~job.flag
+ job_karma_high &= ~job.flag
+
+ switch(level)
+ if(1)
+ job_karma_high |= job.flag
+ if(2)
+ job_karma_med |= job.flag
+ if(3)
+ job_karma_low |= job.flag
+
+ return 1
+
+ return 0
+
+/datum/preferences/proc/UpdateJobPreference(mob/user, role, desiredLvl)
+ var/datum/job/job = job_master.GetJob(role)
+
+ if(!job)
+ user << browse(null, "window=mob_occupation")
+ ShowChoices(user)
+ return
+
+ if(!isnum(desiredLvl))
+ to_chat(user, "\red UpdateJobPreference - desired level was not a number. Please notify coders!")
+ ShowChoices(user)
+ return
+
+ if(role == "Civilian")
+ if(job_support_low & job.flag)
+ job_support_low &= ~job.flag
+ else
+ job_support_low |= job.flag
+ SetChoices(user)
+ return 1
+
+ SetJobPreferenceLevel(job, desiredLvl)
+ SetChoices(user)
+
+ return 1
+
+/datum/preferences/proc/ShowDisabilityState(mob/user,flag,label)
+ if(flag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey"))
+ return "[species] cannot be fat. "
+ return "[label]: [disabilities & flag ? "Yes" : "No"] "
+
+/datum/preferences/proc/SetDisabilities(mob/user)
+ var/HTML = ""
+
+ // AUTOFIXED BY fix_string_idiocy.py
+ // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:474: HTML += ""
+ HTML += {"
+ Choose disabilities "}
+ // END AUTOFIX
+ HTML += ShowDisabilityState(user,DISABILITY_FLAG_NEARSIGHTED,"Needs Glasses")
+ HTML += ShowDisabilityState(user,DISABILITY_FLAG_FAT,"Obese")
+ HTML += ShowDisabilityState(user,DISABILITY_FLAG_EPILEPTIC,"Seizures")
+ HTML += ShowDisabilityState(user,DISABILITY_FLAG_DEAF,"Deaf")
+ HTML += ShowDisabilityState(user,DISABILITY_FLAG_BLIND,"Blind")
+ HTML += ShowDisabilityState(user,DISABILITY_FLAG_MUTE,"Mute")
+
+
+ // AUTOFIXED BY fix_string_idiocy.py
+ // C:\Users\Rob\Documents\Projects\vgstation13\code\modules\client\preferences.dm:481: HTML += " "
+ HTML += {"
+ \[Done\]
+ \[Reset\]
+ "}
+ // END AUTOFIX
+ user << browse(null, "window=preferences")
+ user << browse(HTML, "window=disabil;size=350x300")
+ return
+
+/datum/preferences/proc/SetRecords(mob/user)
+ var/HTML = ""
+ HTML += ""
+ HTML += "Set Character Records "
+
+ HTML += "Medical Records "
+
+ if(lentext(med_record) <= 40)
+ HTML += "[med_record]"
+ else
+ HTML += "[copytext(med_record, 1, 37)]..."
+
+ HTML += "Employment Records "
+
+ if(lentext(gen_record) <= 40)
+ HTML += "[gen_record]"
+ else
+ HTML += "[copytext(gen_record, 1, 37)]..."
+
+ HTML += "Security Records "
+
+ if(lentext(sec_record) <= 40)
+ HTML += "[sec_record] "
+ else
+ HTML += "[copytext(sec_record, 1, 37)]... "
+
+ HTML += " "
+ HTML += "\[Done\] "
+ HTML += " "
+
+ user << browse(null, "window=preferences")
+ user << browse(HTML, "window=records;size=350x300")
+ return
+
+/datum/preferences/proc/GetPlayerAltTitle(datum/job/job)
+ return player_alt_titles.Find(job.title) > 0 \
+ ? player_alt_titles[job.title] \
+ : job.title
+
+/datum/preferences/proc/SetPlayerAltTitle(datum/job/job, new_title)
+ // remove existing entry
+ if(player_alt_titles.Find(job.title))
+ player_alt_titles -= job.title
+ // add one if it's not default
+ if(job.title != new_title)
+ player_alt_titles[job.title] = new_title
+
+/datum/preferences/proc/SetJob(mob/user, role)
+ var/datum/job/job = job_master.GetJob(role)
+ if(!job)
+ user << browse(null, "window=mob_occupation")
+ ShowChoices(user)
+ return
+
+ if(role == "Civilian")
+ if(job_support_low & job.flag)
+ job_support_low &= ~job.flag
+ else
+ job_support_low |= job.flag
+ SetChoices(user)
+ return 1
+
+ if(GetJobDepartment(job, 1) & job.flag)
+ SetJobDepartment(job, 1)
+ else if(GetJobDepartment(job, 2) & job.flag)
+ SetJobDepartment(job, 2)
+ else if(GetJobDepartment(job, 3) & job.flag)
+ SetJobDepartment(job, 3)
+ else//job = Never
+ SetJobDepartment(job, 4)
+
+ SetChoices(user)
+ return 1
+
+/datum/preferences/proc/ResetJobs()
+ job_support_high = 0
+ job_support_med = 0
+ job_support_low = 0
+
+ job_medsci_high = 0
+ job_medsci_med = 0
+ job_medsci_low = 0
+
+ job_engsec_high = 0
+ job_engsec_med = 0
+ job_engsec_low = 0
+
+ job_karma_high = 0
+ job_karma_med = 0
+ job_karma_low = 0
+
+
+/datum/preferences/proc/GetJobDepartment(var/datum/job/job, var/level)
+ if(!job || !level) return 0
+ switch(job.department_flag)
+ if(SUPPORT)
+ switch(level)
+ if(1)
+ return job_support_high
+ if(2)
+ return job_support_med
+ if(3)
+ return job_support_low
+ if(MEDSCI)
+ switch(level)
+ if(1)
+ return job_medsci_high
+ if(2)
+ return job_medsci_med
+ if(3)
+ return job_medsci_low
+ if(ENGSEC)
+ switch(level)
+ if(1)
+ return job_engsec_high
+ if(2)
+ return job_engsec_med
+ if(3)
+ return job_engsec_low
+ if(KARMA)
+ switch(level)
+ if(1)
+ return job_karma_high
+ if(2)
+ return job_karma_med
+ if(3)
+ return job_karma_low
+ return 0
+
+/datum/preferences/proc/SetJobDepartment(var/datum/job/job, var/level)
+ if(!job || !level) return 0
+ switch(level)
+ if(1)//Only one of these should ever be active at once so clear them all here
+ job_support_high = 0
+ job_medsci_high = 0
+ job_engsec_high = 0
+ job_karma_high = 0
+ return 1
+ if(2)//Set current highs to med, then reset them
+ job_support_med |= job_support_high
+ job_medsci_med |= job_medsci_high
+ job_engsec_med |= job_engsec_high
+ job_karma_med |= job_karma_high
+ job_support_high = 0
+ job_medsci_high = 0
+ job_engsec_high = 0
+ job_karma_high = 0
+
+ switch(job.department_flag)
+ if(SUPPORT)
+ switch(level)
+ if(2)
+ job_support_high = job.flag
+ job_support_med &= ~job.flag
+ if(3)
+ job_support_med |= job.flag
+ job_support_low &= ~job.flag
+ else
+ job_support_low |= job.flag
+ if(MEDSCI)
+ switch(level)
+ if(2)
+ job_medsci_high = job.flag
+ job_medsci_med &= ~job.flag
+ if(3)
+ job_medsci_med |= job.flag
+ job_medsci_low &= ~job.flag
+ else
+ job_medsci_low |= job.flag
+ if(ENGSEC)
+ switch(level)
+ if(2)
+ job_engsec_high = job.flag
+ job_engsec_med &= ~job.flag
+ if(3)
+ job_engsec_med |= job.flag
+ job_engsec_low &= ~job.flag
+ else
+ job_engsec_low |= job.flag
+ if(KARMA)
+ switch(level)
+ if(2)
+ job_karma_high = job.flag
+ job_karma_med &= ~job.flag
+ if(3)
+ job_karma_med |= job.flag
+ job_karma_low &= ~job.flag
+ else
+ job_karma_low |= job.flag
+ return 1
+
+/datum/preferences/proc/process_link(mob/user, list/href_list)
+ if(!user) return
+
+ if(href_list["preference"] == "job")
+ switch(href_list["task"])
+ if("close")
+ user << browse(null, "window=mob_occupation")
+ ShowChoices(user)
+ if("reset")
+ ResetJobs()
+ SetChoices(user)
+ if("random")
+ if(alternate_option == GET_RANDOM_JOB || alternate_option == BE_CIVILIAN)
+ alternate_option += 1
+ else if(alternate_option == RETURN_TO_LOBBY)
+ alternate_option = 0
+ else
+ return 0
+ SetChoices(user)
+ if("alt_title")
+ var/datum/job/job = locate(href_list["job"])
+ if(job)
+ var/choices = list(job.title) + job.alt_titles
+ var/choice = input("Pick a title for [job.title].", "Character Generation", GetPlayerAltTitle(job)) as anything in choices | null
+ if(choice)
+ SetPlayerAltTitle(job, choice)
+ SetChoices(user)
+ if("input")
+ SetJob(user, href_list["text"])
+ if("setJobLevel")
+ UpdateJobPreference(user, href_list["text"], text2num(href_list["level"]))
+ else
+ SetChoices(user)
+ return 1
+ else if(href_list["preference"] == "disabilities")
+
+ switch(href_list["task"])
+ if("close")
+ user << browse(null, "window=disabil")
+ ShowChoices(user)
+ if("reset")
+ disabilities=0
+ SetDisabilities(user)
+ if("input")
+ var/dflag=text2num(href_list["disability"])
+ if(dflag >= 0)
+ if(!(dflag==DISABILITY_FLAG_FAT && species!=("Human" || "Tajaran" || "Grey")))
+ disabilities ^= text2num(href_list["disability"]) //MAGIC
+ SetDisabilities(user)
+ else
+ SetDisabilities(user)
+ return 1
+
+ else if(href_list["preference"] == "records")
+ if(text2num(href_list["record"]) >= 1)
+ SetRecords(user)
+ return
+ else
+ user << browse(null, "window=records")
+ if(href_list["task"] == "med_record")
+ var/medmsg = input(usr,"Set your medical notes here.","Medical Records",html_decode(med_record)) as message
+
+ if(medmsg != null)
+ medmsg = copytext(medmsg, 1, MAX_PAPER_MESSAGE_LEN)
+ medmsg = html_encode(medmsg)
+
+ med_record = medmsg
+ SetRecords(user)
+
+ if(href_list["task"] == "sec_record")
+ var/secmsg = input(usr,"Set your security notes here.","Security Records",html_decode(sec_record)) as message
+
+ if(secmsg != null)
+ secmsg = copytext(secmsg, 1, MAX_PAPER_MESSAGE_LEN)
+ secmsg = html_encode(secmsg)
+
+ sec_record = secmsg
+ SetRecords(user)
+ if(href_list["task"] == "gen_record")
+ var/genmsg = input(usr,"Set your employment notes here.","Employment Records",html_decode(gen_record)) as message
+
+ if(genmsg != null)
+ genmsg = copytext(genmsg, 1, MAX_PAPER_MESSAGE_LEN)
+ genmsg = html_encode(genmsg)
+
+ gen_record = genmsg
+ SetRecords(user)
+
+ if(href_list["preference"] == "gear")
+ if(href_list["toggle_gear"])
+ var/datum/gear/TG = gear_datums[href_list["toggle_gear"]]
+ if(TG.display_name in gear)
+ gear -= TG.display_name
+ else
+ var/total_cost = 0
+ var/list/type_blacklist = list()
+ for(var/gear_name in gear)
+ var/datum/gear/G = gear_datums[gear_name]
+ if(istype(G))
+ if(!G.subtype_cost_overlap)
+ if(G.subtype_path in type_blacklist)
+ continue
+ type_blacklist += G.subtype_path
+ total_cost += G.cost
+
+ if((total_cost + TG.cost) <= MAX_GEAR_COST)
+ gear += TG.display_name
+
+ else if(href_list["gear"] && href_list["tweak"])
+ var/datum/gear/gear = gear_datums[href_list["gear"]]
+ var/datum/gear_tweak/tweak = locate(href_list["tweak"])
+ if(!tweak || !istype(gear) || !(tweak in gear.gear_tweaks))
+ return
+ var/metadata = tweak.get_metadata(user, get_tweak_metadata(gear, tweak))
+ if(!metadata || !CanUseTopic(user))
+ return
+ set_tweak_metadata(gear, tweak, metadata)
+ else if(href_list["select_category"])
+ gear_tab = href_list["select_category"]
+ else if(href_list["clear_loadout"])
+ gear.Cut()
+
+ ShowChoices(user)
+ return
+
+ switch(href_list["task"])
+ if("random")
+ switch(href_list["preference"])
+ if("name")
+ real_name = random_name(gender,species)
+ if("age")
+ age = rand(AGE_MIN, AGE_MAX)
+ if("hair")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
+ r_hair = rand(0,255)
+ g_hair = rand(0,255)
+ b_hair = rand(0,255)
+ if("h_style")
+ h_style = random_hair_style(gender, species)
+ if("facial")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
+ r_facial = rand(0,255)
+ g_facial = rand(0,255)
+ b_facial = rand(0,255)
+ if("f_style")
+ f_style = random_facial_hair_style(gender, species)
+ if("underwear")
+ underwear = random_underwear(gender)
+ ShowChoices(user)
+ if("undershirt")
+ undershirt = random_undershirt(gender)
+ ShowChoices(user)
+ if("socks")
+ socks = random_socks(gender)
+ ShowChoices(user)
+ if("eyes")
+ r_eyes = rand(0,255)
+ g_eyes = rand(0,255)
+ b_eyes = rand(0,255)
+ if("s_tone")
+ if(species in list("Human", "Drask", "Vox"))
+ s_tone = random_skin_tone()
+ if("s_color")
+ if(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Wryn", "Vulpkanin", "Machine"))
+ r_skin = rand(0,255)
+ g_skin = rand(0,255)
+ b_skin = rand(0,255)
+ if("bag")
+ backbag = rand(1,4)
+ /*if("skin_style")
+ h_style = random_skin_style(gender)*/
+ if("all")
+ random_character()
+ if("input")
+ switch(href_list["preference"])
+ if("name")
+ var/raw_name = input(user, "Choose your character's name:", "Character Preference") as text|null
+ if(!isnull(raw_name)) // Check to ensure that the user entered text (rather than cancel.)
+ var/new_name = reject_bad_name(raw_name)
+ if(new_name)
+ real_name = new_name
+ else
+ to_chat(user, "Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and . ")
+
+ if("age")
+ var/new_age = input(user, "Choose your character's age:\n([AGE_MIN]-[AGE_MAX])", "Character Preference") as num|null
+ if(new_age)
+ age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN)
+ if("species")
+
+ var/list/new_species = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin")
+ var/prev_species = species
+// var/whitelisted = 0
+
+ if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it!
+ for(var/S in whitelisted_species)
+ if(is_alien_whitelisted(user,S))
+ new_species += S
+// whitelisted = 1
+// if(!whitelisted)
+// alert(user, "You cannot change your species as you need to be whitelisted. If you wish to be whitelisted contact an admin in-game, on the forums, or on IRC.")
+ else //Not using the whitelist? Aliens for everyone!
+ new_species += whitelisted_species
+
+ species = input("Please select a species", "Character Generation", null) in new_species
+
+ if(prev_species != species)
+ //grab one of the valid hair styles for the newly chosen species
+ var/list/valid_hairstyles = list()
+ for(var/hairstyle in hair_styles_list)
+ var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
+ if(gender == MALE && S.gender == FEMALE)
+ continue
+ if(gender == FEMALE && S.gender == MALE)
+ continue
+ if(!(species in S.species_allowed))
+ continue
+
+ valid_hairstyles[hairstyle] = hair_styles_list[hairstyle]
+
+ if(valid_hairstyles.len)
+ h_style = pick(valid_hairstyles)
+ else
+ //this shouldn't happen
+ h_style = hair_styles_list["Bald"]
+
+ //grab one of the valid facial hair styles for the newly chosen species
+ var/list/valid_facialhairstyles = list()
+ for(var/facialhairstyle in facial_hair_styles_list)
+ var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
+ if(gender == MALE && S.gender == FEMALE)
+ continue
+ if(gender == FEMALE && S.gender == MALE)
+ continue
+ if(!(species in S.species_allowed))
+ continue
+
+ valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
+
+ if(valid_facialhairstyles.len)
+ f_style = pick(valid_facialhairstyles)
+ else
+ //this shouldn't happen
+ f_style = facial_hair_styles_list["Shaved"]
+
+ // Don't wear another species' underwear!
+ var/datum/sprite_accessory/S = underwear_list[underwear]
+ if(!S || !(species in S.species_allowed))
+ underwear = random_underwear(gender, species)
+
+ S = undershirt_list[undershirt]
+ if(!S || !(species in S.species_allowed))
+ undershirt = random_undershirt(gender, species)
+
+ S = socks_list[socks]
+ if(!S || !(species in S.species_allowed))
+ socks = random_socks(gender, species)
+
+ //reset hair colour and skin colour
+ r_hair = 0//hex2num(copytext(new_hair, 2, 4))
+ g_hair = 0//hex2num(copytext(new_hair, 4, 6))
+ b_hair = 0//hex2num(copytext(new_hair, 6, 8))
+
+ s_tone = 0
+
+ if(!(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")))
+ r_skin = 0
+ g_skin = 0
+ b_skin = 0
+
+ ha_style = "None" // No Vulp ears on Unathi
+ m_style = "None" // No Unathi markings on Tajara
+
+ body_accessory = null //no vulptail on humans damnit
+
+ //Reset prosthetics.
+ organ_data = list()
+ rlimb_data = list()
+ if("speciesprefs")//oldvox code
+ speciesprefs = !speciesprefs
+
+ if("language")
+// var/languages_available
+ var/list/new_languages = list("None")
+/*
+ if(config.usealienwhitelist)
+ for(var/L in all_languages)
+ var/datum/language/lang = all_languages[L]
+ if((!(lang.flags & RESTRICTED)) && (is_alien_whitelisted(user, L)||(!( lang.flags & WHITELISTED ))))
+ new_languages += lang
+ languages_available = 1
+
+ if(!(languages_available))
+ alert(user, "There are not currently any available secondary languages.")
+ else
+*/
+ for(var/L in all_languages)
+ var/datum/language/lang = all_languages[L]
+ if(!(lang.flags & RESTRICTED))
+ new_languages += lang.name
+
+ language = input("Please select a secondary language", "Character Generation", null) in new_languages
+
+ 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
+ if(new_metadata)
+ metadata = sanitize(copytext(new_metadata,1,MAX_MESSAGE_LEN))
+
+ if("b_type")
+ var/new_b_type = input(user, "Choose your character's blood-type:", "Character Preference") as null|anything in list( "A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-" )
+ if(new_b_type)
+ b_type = new_b_type
+
+ if("hair")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
+ var/input = "Choose your character's hair colour:"
+ var/new_hair = input(user, input, "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null
+ if(new_hair)
+ r_hair = hex2num(copytext(new_hair, 2, 4))
+ g_hair = hex2num(copytext(new_hair, 4, 6))
+ b_hair = hex2num(copytext(new_hair, 6, 8))
+
+ if("h_style")
+ var/list/valid_hairstyles = list()
+ for(var/hairstyle in hair_styles_list)
+ var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
+ if(species == "Machine") //Species that can use prosthetic heads.
+ var/obj/item/organ/external/head/H = new()
+ if(S.name == "Bald")
+ valid_hairstyles[hairstyle] = S
+ if(!rlimb_data["head"]) //Handle situations where the head is default.
+ H.model = "Morpheus Cyberkinetics"
+ else
+ H.model = rlimb_data["head"]
+ var/datum/robolimb/robohead = all_robolimbs[H.model]
+ if(species in S.species_allowed)
+ if(robohead.is_monitor && (robohead.company in S.models_allowed)) //If the Machine character has the default Morpheus screen head or another screen head
+ //and said head is in the hair style's allowed models list...
+ valid_hairstyles[hairstyle] = S //Allow them to select the hairstyle.
+ continue
+ else
+ if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human hairstyles).
+ continue
+ else if(!robohead.is_monitor && ("Human" in S.species_allowed))
+ valid_hairstyles[hairstyle] = S
+ continue
+ else
+ if(!(species in S.species_allowed))
+ continue
+
+ valid_hairstyles[hairstyle] = S
+
+ var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles
+ if(new_h_style)
+ h_style = new_h_style
+
+ if("headaccessory")
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories.
+ var/input = "Choose the colour of your your character's head accessory:"
+ var/new_head_accessory = input(user, input, "Character Preference", rgb(r_headacc, g_headacc, b_headacc)) as color|null
+ if(new_head_accessory)
+ r_headacc = hex2num(copytext(new_head_accessory, 2, 4))
+ g_headacc = hex2num(copytext(new_head_accessory, 4, 6))
+ b_headacc = hex2num(copytext(new_head_accessory, 6, 8))
+
+ if("ha_style")
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories.
+ var/list/valid_head_accessory_styles = list()
+ for(var/head_accessory_style in head_accessory_styles_list)
+ var/datum/sprite_accessory/H = head_accessory_styles_list[head_accessory_style]
+ if(!(species in H.species_allowed))
+ continue
+
+ valid_head_accessory_styles[head_accessory_style] = head_accessory_styles_list[head_accessory_style]
+
+ var/new_head_accessory_style = input(user, "Choose the style of your character's head accessory:", "Character Preference") as null|anything in valid_head_accessory_styles
+ if(new_head_accessory_style)
+ ha_style = new_head_accessory_style
+
+ if("markings")
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings.
+ var/input = "Choose the colour of your your character's markings:"
+ var/new_markings = input(user, input, "Character Preference", rgb(r_markings, g_markings, b_markings)) as color|null
+ if(new_markings)
+ r_markings = hex2num(copytext(new_markings, 2, 4))
+ g_markings = hex2num(copytext(new_markings, 4, 6))
+ b_markings = hex2num(copytext(new_markings, 6, 8))
+
+ if("m_style")
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings.
+ var/list/valid_markings = list()
+ for(var/markingstyle in marking_styles_list)
+ var/datum/sprite_accessory/M = marking_styles_list[markingstyle]
+ if(!(species in M.species_allowed))
+ continue
+
+ if(species == "Machine") //Species that can use prosthetic heads.
+ var/obj/item/organ/external/head/H = new()
+ if(!rlimb_data["head"]) //Handle situations where the head is default.
+ H.model = "Morpheus Cyberkinetics"
+ else
+ H.model = rlimb_data["head"]
+ var/datum/robolimb/robohead = all_robolimbs[H.model]
+ if(robohead.is_monitor && M.name != "None") //If the character can have prosthetic heads and they have the default Morpheus head (or another monitor-head), no optic markings.
+ continue
+ else if(!robohead.is_monitor && M.name != "None") //Otherwise, if they DON'T have the default head and the head's not a monitor but the head's not in the style's list of allowed models, skip.
+ if(!(robohead.company in M.models_allowed))
+ continue
+
+ valid_markings[markingstyle] = marking_styles_list[markingstyle]
+
+ var/new_marking_style = input(user, "Choose the style of your character's markings:", "Character Preference", m_style) as null|anything in valid_markings
+ if(new_marking_style)
+ m_style = new_marking_style
+
+ if("body_accessory")
+ var/list/possible_body_accessories = list()
+ if(check_rights(R_ADMIN, 1, user))
+ possible_body_accessories = body_accessory_by_name.Copy()
+ else
+ for(var/B in body_accessory_by_name)
+ var/datum/body_accessory/accessory = body_accessory_by_name[B]
+ if(!istype(accessory))
+ possible_body_accessories += "None" //the only null entry should be the "None" option
+ continue
+ if(species in accessory.allowed_species)
+ possible_body_accessories += B
+
+ var/new_body_accessory = input(user, "Choose your body accessory:", "Character Preference") as null|anything in possible_body_accessories
+ if(new_body_accessory)
+ body_accessory = (new_body_accessory == "None") ? null : new_body_accessory
+
+ if("facial")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
+ var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(r_facial, g_facial, b_facial)) as color|null
+ if(new_facial)
+ r_facial = hex2num(copytext(new_facial, 2, 4))
+ g_facial = hex2num(copytext(new_facial, 4, 6))
+ b_facial = hex2num(copytext(new_facial, 6, 8))
+
+ if("f_style")
+ var/list/valid_facialhairstyles = list()
+ for(var/facialhairstyle in facial_hair_styles_list)
+ var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
+ if(S.name == "Shaved")
+ valid_facialhairstyles[facialhairstyle] = S
+ if(gender == MALE && S.gender == FEMALE)
+ continue
+ if(gender == FEMALE && S.gender == MALE)
+ continue
+ if(species == "Machine") //Species that can use prosthetic heads.
+ var/obj/item/organ/external/head/H = new()
+ if(!rlimb_data["head"]) //Handle situations where the head is default.
+ H.model = "Morpheus Cyberkinetics"
+ else
+ H.model = rlimb_data["head"]
+ var/datum/robolimb/robohead = all_robolimbs[H.model]
+ if(species in S.species_allowed)
+ if(robohead.is_monitor) //If the Machine character has the default Morpheus screen head or another screen head and they're allowed to have the style, let them have it.
+ valid_facialhairstyles[facialhairstyle] = S
+ continue
+ else
+ if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human facial hairstyles).
+ continue
+ else if(!robohead.is_monitor && ("Human" in S.species_allowed))
+ valid_facialhairstyles[facialhairstyle] = S
+ continue
+ else
+ if(!(species in S.species_allowed))
+ continue
+
+ valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
+
+ var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facialhairstyles
+ if(new_f_style)
+ f_style = new_f_style
+
+ if("underwear")
+ var/list/underwear_options
+ if(gender == MALE)
+ underwear_options = underwear_m
+ else
+ underwear_options = underwear_f
+
+ var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in underwear_options
+ if(new_underwear)
+ underwear = new_underwear
+ ShowChoices(user)
+
+ if("undershirt")
+ var/new_undershirt
+ if(gender == MALE)
+ new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_m
+ else
+ new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_f
+ if(new_undershirt)
+ undershirt = new_undershirt
+ ShowChoices(user)
+
+ if("socks")
+ var/list/valid_sockstyles = list()
+ for(var/sockstyle in socks_list)
+ var/datum/sprite_accessory/S = socks_list[sockstyle]
+ if(gender == MALE && S.gender == FEMALE)
+ continue
+ if(gender == FEMALE && S.gender == MALE)
+ continue
+ if(!(species in S.species_allowed))
+ continue
+ valid_sockstyles[sockstyle] = socks_list[sockstyle]
+ var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in valid_sockstyles
+ ShowChoices(user)
+ if(new_socks)
+ socks = new_socks
+
+ if("eyes")
+ var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(r_eyes, g_eyes, b_eyes)) as color|null
+ if(new_eyes)
+ r_eyes = hex2num(copytext(new_eyes, 2, 4))
+ g_eyes = hex2num(copytext(new_eyes, 4, 6))
+ b_eyes = hex2num(copytext(new_eyes, 6, 8))
+
+ if("s_tone")
+ if(species == "Human" || species == "Drask")
+ var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference") as num|null
+ if(new_s_tone)
+ s_tone = 35 - max(min(round(new_s_tone), 220), 1)
+ else if(species == "Vox")
+ var/skin_c = input(user, "Choose your Vox's skin color:\n(1 = Default Green, 2 = Dark Green, 3 = Brown, 4 = Grey, \n5 = Emerald, 6 = Azure)", "Character Preference") as num|null
+ if(skin_c)
+ s_tone = max(min(round(skin_c), 6), 1)
+
+ if("skin")
+ if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
+ var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null
+ if(new_skin)
+ r_skin = hex2num(copytext(new_skin, 2, 4))
+ g_skin = hex2num(copytext(new_skin, 4, 6))
+ b_skin = hex2num(copytext(new_skin, 6, 8))
+
+
+ if("ooccolor")
+ var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference", ooccolor) as color|null
+ if(new_ooccolor)
+ ooccolor = new_ooccolor
+
+ if("bag")
+ var/new_backbag = input(user, "Choose your character's style of bag:", "Character Preference") as null|anything in backbaglist
+ if(new_backbag)
+ backbag = backbaglist.Find(new_backbag)
+
+ if("nt_relation")
+ var/new_relation = input(user, "Choose your relation to NT. Note that this represents what others can find out about your character by researching your background, not what your character actually thinks.", "Character Preference") as null|anything in list("Loyal", "Supportive", "Neutral", "Skeptical", "Opposed")
+ if(new_relation)
+ nanotrasen_relation = new_relation
+
+ 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
+
+ if(msg != null)
+ msg = copytext(msg, 1, MAX_MESSAGE_LEN)
+ msg = html_encode(msg)
+
+ flavor_text = msg
+
+ if("limbs")
+ var/valid_limbs = list("Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand")
+ if(species == "Machine")
+ valid_limbs = list("Torso", "Lower Body", "Head", "Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand")
+ var/limb_name = input(user, "Which limb do you want to change?") as null|anything in valid_limbs
+ if(!limb_name) return
+
+ var/limb = null
+ var/second_limb = null // if you try to change the arm, the hand should also change
+ var/third_limb = null // if you try to unchange the hand, the arm should also change
+ var/valid_limb_states = list("Normal", "Amputated", "Prosthesis")
+ var/no_amputate = 0
+
+ switch(limb_name)
+ if("Torso")
+ limb = "chest"
+ second_limb = "groin"
+ no_amputate = 1
+ if("Lower Body")
+ limb = "groin"
+ no_amputate = 1
+ if("Head")
+ limb = "head"
+ no_amputate = 1
+ if("Left Leg")
+ limb = "l_leg"
+ second_limb = "l_foot"
+ if("Right Leg")
+ limb = "r_leg"
+ second_limb = "r_foot"
+ if("Left Arm")
+ limb = "l_arm"
+ second_limb = "l_hand"
+ if("Right Arm")
+ limb = "r_arm"
+ second_limb = "r_hand"
+ if("Left Foot")
+ limb = "l_foot"
+ if(species != "Machine")
+ third_limb = "l_leg"
+ if("Right Foot")
+ limb = "r_foot"
+ if(species != "Machine")
+ third_limb = "r_leg"
+ if("Left Hand")
+ limb = "l_hand"
+ if(species != "Machine")
+ third_limb = "l_arm"
+ if("Right Hand")
+ limb = "r_hand"
+ if(species != "Machine")
+ third_limb = "r_arm"
+
+ var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in valid_limb_states
+ if(!new_state) return
+
+ switch(new_state)
+ if("Normal")
+ if(limb == "head")
+ m_style = "None"
+ h_style = random_hair_style(gender, species)
+ f_style = facial_hair_styles_list["Shaved"]
+ organ_data[limb] = null
+ rlimb_data[limb] = null
+ if(third_limb)
+ organ_data[third_limb] = null
+ rlimb_data[third_limb] = null
+ if("Amputated")
+ if(!no_amputate)
+ organ_data[limb] = "amputated"
+ rlimb_data[limb] = null
+ if(second_limb)
+ organ_data[second_limb] = "amputated"
+ rlimb_data[second_limb] = null
+ if("Prosthesis")
+ var/choice
+ var/subchoice
+ var/datum/robolimb/R = new()
+ var/in_model
+ var/robolimb_companies = list()
+ for(var/limb_type in typesof(/datum/robolimb)) //This loop populates a list of companies that offer the limb the user selected previously as one of their cybernetic products.
+ R = new limb_type()
+ if(!R.unavailable_at_chargen && (limb in R.parts) && R.has_subtypes) //Ensures users can only choose companies that offer the parts they want, that singular models get added to the list as well companies that offer more than one model, and...
+ robolimb_companies[R.company] = R //List only main brands that have the parts we're looking for.
+ R = new() //Re-initialize R.
+
+ choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in robolimb_companies //Choose from a list of companies that offer the part the user wants.
+ if(!choice)
+ return
+ R.company = choice
+ R = all_robolimbs[R.company]
+ if(R.has_subtypes == 1) //If the company the user selected provides more than just one base model, lets handle it.
+ var/list/robolimb_models = list()
+ for(var/limb_type in typesof(R)) //Handling the different models of parts that manufacturers can provide.
+ var/datum/robolimb/L = new limb_type()
+ if(limb in L.parts) //Make sure that only models that provide the parts the user needs populate the list.
+ robolimb_models[L.company] = L
+ if(robolimb_models.len == 1) //If there's only one model available in the list, autoselect it to avoid having to bother the user with a dialog that provides only one option.
+ subchoice = L.company //If there ends up being more than one model populating the list, subchoice will be overwritten later anyway, so this isn't a problem.
+ if(second_limb in L.parts) //If the child limb of the limb the user selected is also present in the model's parts list, state it's been found so the second limb can be set later.
+ in_model = 1
+ if(robolimb_models.len > 1) //If there's more than one model in the list that can provide the part the user wants, let them choose.
+ subchoice = input(user, "Which model of [choice] [limb_name] do you wish to use?") as null|anything in robolimb_models
+ if(subchoice)
+ choice = subchoice
+ if(limb == "head")
+ ha_style = "None"
+ h_style = hair_styles_list["Bald"]
+ f_style = facial_hair_styles_list["Shaved"]
+ m_style = "None"
+ rlimb_data[limb] = choice
+ organ_data[limb] = "cyborg"
+ if(second_limb)
+ if(subchoice)
+ if(in_model)
+ rlimb_data[second_limb] = choice
+ organ_data[second_limb] = "cyborg"
+ else
+ rlimb_data[second_limb] = choice
+ organ_data[second_limb] = "cyborg"
+
+ if("organs")
+ var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes")
+ if(!organ_name) return
+
+ var/organ = null
+ switch(organ_name)
+ if("Heart")
+ organ = "heart"
+ if("Eyes")
+ organ = "eyes"
+
+ var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in list("Normal","Assisted","Mechanical")
+ if(!new_state) return
+
+ switch(new_state)
+ if("Normal")
+ organ_data[organ] = null
+ if("Assisted")
+ organ_data[organ] = "assisted"
+ if("Mechanical")
+ organ_data[organ] = "mechanical"
+
+/*
+ if("skin_style")
+ var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3")
+ if(!skin_style_name) return
+*/
+
+/* if("spawnpoint")
+ var/list/spawnkeys = list()
+ for(var/S in spawntypes)
+ spawnkeys += S
+ var/choice = input(user, "Where would you like to spawn when latejoining?") as null|anything in spawnkeys
+ if(!choice || !spawntypes[choice])
+ spawnpoint = "Arrivals Shuttle"
+ return
+ spawnpoint = choice */
+
+ else
+ switch(href_list["preference"])
+ if("publicity")
+ if(unlock_content)
+ toggles ^= MEMBER_PUBLIC
+
+ if("gender")
+ if(gender == MALE)
+ gender = FEMALE
+ else
+ gender = MALE
+ underwear = random_underwear(gender)
+
+ if("hear_adminhelps")
+ sound ^= SOUND_ADMINHELP
+
+ if("ui")
+ switch(UI_style)
+ if("Midnight")
+ UI_style = "Plasmafire"
+ if("Plasmafire")
+ UI_style = "Retro"
+ if("Retro")
+ UI_style = "Slimecore"
+ if("Slimecore")
+ UI_style = "Operative"
+ if("Operative")
+ UI_style = "White"
+ else
+ UI_style = "Midnight"
+
+ if(ishuman(usr)) //mid-round preference changes, for aesthetics
+ var/mob/living/carbon/human/H = usr
+ H.remake_hud()
+
+ if("nanoui")
+ nanoui_fancy = !nanoui_fancy
+
+ if("ghost_att_anim")
+ show_ghostitem_attack = !show_ghostitem_attack
+
+ if("UIcolor")
+ var/UI_style_color_new = input(user, "Choose your UI color, dark colors are not recommended!", UI_style_color) as color|null
+ if(!UI_style_color_new) return
+ UI_style_color = UI_style_color_new
+
+ if(ishuman(usr)) //mid-round preference changes, for aesthetics
+ var/mob/living/carbon/human/H = usr
+ H.remake_hud()
+
+ if("UIalpha")
+ var/UI_style_alpha_new = input(user, "Select a new alpha(transparence) parameter for UI, between 50 and 255", UI_style_alpha) as num
+ if(!UI_style_alpha_new | !(UI_style_alpha_new <= 255 && UI_style_alpha_new >= 50)) return
+ UI_style_alpha = UI_style_alpha_new
+
+ if(ishuman(usr)) //mid-round preference changes, for aesthetics
+ var/mob/living/carbon/human/H = usr
+ H.remake_hud()
+
+ if("be_special")
+ var/r = href_list["role"]
+ if(!(r in special_roles))
+ var/cleaned_r = sql_sanitize_text(r)
+ if(r != cleaned_r) // up to no good
+ message_admins("[user] attempted an href exploit! (This could have possibly lead to a \"Bobby Tables\" exploit, so they're probably up to no good). String: [r] ID: [last_id] IP: [last_ip]")
+ to_chat(user, "Stop right there, criminal scum ")
+ else
+ be_special ^= r
+
+ if("name")
+ be_random_name = !be_random_name
+
+ if("randomslot")
+ randomslot = !randomslot
+
+ if("hear_midis")
+ sound ^= SOUND_MIDI
+
+ if("lobby_music")
+ sound ^= SOUND_LOBBY
+ if(sound & SOUND_LOBBY)
+ user << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1)
+ else
+ user << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)
+
+ if("ghost_ears")
+ toggles ^= CHAT_GHOSTEARS
+
+ if("ghost_sight")
+ toggles ^= CHAT_GHOSTSIGHT
+
+ if("ghost_radio")
+ toggles ^= CHAT_GHOSTRADIO
+
+ if("ghost_radio")
+ toggles ^= CHAT_GHOSTRADIO
+
+ if("save")
+ save_preferences(user)
+ save_character(user)
+
+ if("reload")
+ load_preferences(user)
+ load_character(user)
+
+ if("open_load_dialog")
+ if(!IsGuestKey(user.key))
+ open_load_dialog(user)
+ return 1
+
+ if("close_load_dialog")
+ close_load_dialog(user)
+
+ if("changeslot")
+ if(!load_character(user,text2num(href_list["num"])))
+ random_character()
+ real_name = random_name(gender)
+ save_character(user)
+ close_load_dialog(user)
+
+ if("tab")
+ if(href_list["tab"])
+ current_tab = text2num(href_list["tab"])
+
+ ShowChoices(user)
+ return 1
+
+/datum/preferences/proc/copy_to(mob/living/carbon/human/character)
+ var/datum/species/S = all_species[species]
+ character.change_species(species) // Yell at me if this causes everything to melt
+ if(be_random_name)
+ real_name = random_name(gender,species)
+
+ if(config.humans_need_surnames)
+ var/firstspace = findtext(real_name, " ")
+ var/name_length = length(real_name)
+ if(!firstspace) //we need a surname
+ real_name += " [pick(last_names)]"
+ else if(firstspace == name_length)
+ real_name += "[pick(last_names)]"
+
+ character.add_language(language)
+
+ character.real_name = real_name
+ character.dna.real_name = real_name
+ character.name = character.real_name
+
+ character.flavor_text = flavor_text
+ character.med_record = med_record
+ character.sec_record = sec_record
+ character.gen_record = gen_record
+
+ character.change_gender(gender)
+ character.age = age
+ character.b_type = b_type
+
+ character.r_eyes = r_eyes
+ character.g_eyes = g_eyes
+ character.b_eyes = b_eyes
+
+ //Head-specific
+ var/obj/item/organ/external/head/H = character.get_organ("head")
+ H.r_hair = r_hair
+ H.g_hair = g_hair
+ H.b_hair = b_hair
+
+ H.r_facial = r_facial
+ H.g_facial = g_facial
+ H.b_facial = b_facial
+
+ H.h_style = h_style
+ H.f_style = f_style
+ //End of head-specific.
+
+ character.r_skin = r_skin
+ character.g_skin = g_skin
+ character.b_skin = b_skin
+
+ character.s_tone = s_tone
+
+ // Destroy/cyborgize organs
+ for(var/name in organ_data)
+
+ var/status = organ_data[name]
+ var/obj/item/organ/external/O = character.organs_by_name[name]
+ if(O)
+ if(status == "amputated")
+ character.organs_by_name[O.limb_name] = null
+ character.organs -= O
+ if(O.children) // This might need to become recursive.
+ for(var/obj/item/organ/external/child in O.children)
+ character.organs_by_name[child.limb_name] = null
+ character.organs -= child
+
+ else if(status == "cyborg")
+ if(rlimb_data[name])
+ O.robotize(rlimb_data[name])
+ else
+ O.robotize()
+ else
+ var/obj/item/organ/internal/I = character.get_int_organ_tag(name)
+ if(I)
+ if(status == "assisted")
+ I.mechassist()
+ else if(status == "mechanical")
+ I.robotize()
+
+ character.dna.b_type = b_type
+ if(disabilities & DISABILITY_FLAG_FAT && character.species.flags & CAN_BE_FAT)
+ character.dna.SetSEState(FATBLOCK,1,1)
+ character.mutations += FAT
+ character.mutations += OBESITY
+ character.overeatduration = 600
+
+ if(disabilities & DISABILITY_FLAG_NEARSIGHTED)
+ character.dna.SetSEState(GLASSESBLOCK,1,1)
+ character.disabilities|=NEARSIGHTED
+
+ if(disabilities & DISABILITY_FLAG_EPILEPTIC)
+ character.dna.SetSEState(EPILEPSYBLOCK,1,1)
+ character.disabilities|=EPILEPSY
+
+ if(disabilities & DISABILITY_FLAG_DEAF)
+ character.dna.SetSEState(DEAFBLOCK,1,1)
+ character.disabilities|=DEAF
+
+ if(disabilities & DISABILITY_FLAG_BLIND)
+ character.dna.SetSEState(BLINDBLOCK,1,1)
+ character.disabilities|=BLIND
+
+ if(disabilities & DISABILITY_FLAG_MUTE)
+ character.dna.SetSEState(MUTEBLOCK,1,1)
+ character.disabilities |= MUTE
+
+ S.handle_dna(character)
+
+ if(character.dna.dirtySE)
+ character.dna.UpdateSE()
+ domutcheck(character)
+
+ // Wheelchair necessary?
+ var/obj/item/organ/external/l_foot = character.get_organ("l_foot")
+ var/obj/item/organ/external/r_foot = character.get_organ("r_foot")
+ if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
+ var/obj/structure/stool/bed/chair/wheelchair/W = new /obj/structure/stool/bed/chair/wheelchair (character.loc)
+ character.buckled = W
+ character.update_canmove()
+ W.dir = character.dir
+ W.buckled_mob = character
+ W.add_fingerprint(character)
+
+ character.underwear = underwear
+ character.undershirt = undershirt
+ character.socks = socks
+
+ if(character.species.bodyflags & HAS_HEAD_ACCESSORY)
+ H.r_headacc = r_headacc
+ H.g_headacc = g_headacc
+ H.b_headacc = b_headacc
+ H.ha_style = ha_style
+ if(character.species.bodyflags & HAS_MARKINGS)
+ character.r_markings = r_markings
+ character.g_markings = g_markings
+ character.b_markings = b_markings
+ character.m_style = m_style
+
+ if(body_accessory)
+ character.body_accessory = body_accessory_by_name["[body_accessory]"]
+
+ if(backbag > 4 || backbag < 1)
+ backbag = 1 //Same as above
+ character.backbag = backbag
+
+ //Debugging report to track down a bug, which randomly assigned the plural gender to people.
+ if(character.gender in list(PLURAL, NEUTER))
+ if(isliving(src)) //Ghosts get neuter by default
+ message_admins("[key_name_admin(character)] has spawned with their gender as plural or neuter. Please notify coders.")
+ character.change_gender(MALE)
+
+ character.dna.ready_dna(character, flatten_SE = 0)
+ character.sync_organ_dna(assimilate=1)
+ character.UpdateAppearance()
+
+ // Do the initial caching of the player's body icons.
+ character.force_update_limbs()
+ character.update_eyes()
+ character.regenerate_icons()
+
+/datum/preferences/proc/open_load_dialog(mob/user)
+
+ var/DBQuery/query = dbcon.NewQuery("SELECT slot,real_name FROM [format_table_name("characters")] WHERE ckey='[user.ckey]' ORDER BY slot")
+
+ var/dat = ""
+ dat += ""
+ dat += "Select a character slot to load "
+ var/name
+
+ for(var/i=1, i<=max_save_slots, i++)
+ if(!query.Execute())
+ var/err = query.ErrorMsg()
+ log_game("SQL ERROR during character slot loading. Error : \[[err]\]\n")
+ message_admins("SQL ERROR during character slot loading. Error : \[[err]\]\n")
+ return
+ while(query.NextRow())
+ if(i==text2num(query.item[1]))
+ name = query.item[2]
+ if(!name) name = "Character[i]"
+ if(i==default_slot)
+ name = "[name] "
+ dat += "[name] "
+ name = null
+
+ dat += " "
+ dat += "Close "
+ dat += " "
+// user << browse(dat, "window=saves;size=300x390")
+ var/datum/browser/popup = new(user, "saves", "Character Saves
", 300, 390)
+ popup.set_content(dat)
+ popup.open(0)
+
+/datum/preferences/proc/close_load_dialog(mob/user)
+ user << browse(null, "window=saves")
\ No newline at end of file
diff --git a/code/modules/client/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm
similarity index 98%
rename from code/modules/client/preferences_mysql.dm
rename to code/modules/client/preference/preferences_mysql.dm
index 15abdab0360..f72ac076dff 100644
--- a/code/modules/client/preferences_mysql.dm
+++ b/code/modules/client/preference/preferences_mysql.dm
@@ -59,7 +59,7 @@
/datum/preferences/proc/save_preferences(client/C)
// Might as well scrub out any malformed be_special list entries while we're here
- for (var/role in be_special)
+ for(var/role in be_special)
if(!(role in special_roles))
log_to_dd("[C.key] had a malformed role entry: '[role]'. Removing!")
be_special -= role
@@ -158,7 +158,8 @@
nanotrasen_relation,
speciesprefs,
socks,
- body_accessory
+ body_accessory,
+ gear
FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' AND slot='[slot]'"})
if(!query.Execute())
var/err = query.ErrorMsg()
@@ -236,6 +237,7 @@
//socks
socks = query.item[58]
body_accessory = query.item[59]
+ gear = params2list(query.item[60])
//Sanitize
metadata = sanitize_text(metadata, initial(metadata))
@@ -298,6 +300,7 @@
if(!player_alt_titles) player_alt_titles = new()
if(!organ_data) src.organ_data = list()
if(!rlimb_data) src.rlimb_data = list()
+ if(!gear) gear = list()
return 1
@@ -305,12 +308,15 @@
var/organlist
var/rlimblist
var/playertitlelist
+ var/gearlist
if(!isemptylist(organ_data))
organlist = list2params(organ_data)
if(!isemptylist(rlimb_data))
rlimblist = list2params(rlimb_data)
if(!isemptylist(player_alt_titles))
playertitlelist = list2params(player_alt_titles)
+ if(!isemptylist(gear))
+ gearlist = list2params(gear)
var/DBQuery/firstquery = dbcon.NewQuery("SELECT slot FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' ORDER BY slot")
firstquery.Execute()
@@ -374,7 +380,8 @@
nanotrasen_relation='[nanotrasen_relation]',
speciesprefs='[speciesprefs]',
socks='[socks]',
- body_accessory='[body_accessory]'
+ body_accessory='[body_accessory]',
+ gear='[gearlist]'
WHERE ckey='[C.ckey]'
AND slot='[default_slot]'"}
)
@@ -405,7 +412,7 @@
flavor_text, med_record, sec_record, gen_record,
player_alt_titles,
disabilities, organ_data, rlimb_data, nanotrasen_relation, speciesprefs,
- socks, body_accessory)
+ socks, body_accessory, gear)
VALUES
('[C.ckey]', '[default_slot]', '[sql_sanitize_text(metadata)]', '[sql_sanitize_text(real_name)]', '[be_random_name]','[gender]',
@@ -426,7 +433,7 @@
'[sql_sanitize_text(html_encode(flavor_text))]', '[sql_sanitize_text(html_encode(med_record))]', '[sql_sanitize_text(html_encode(sec_record))]', '[sql_sanitize_text(html_encode(gen_record))]',
'[playertitlelist]',
'[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]',
- '[socks]', '[body_accessory]')
+ '[socks]', '[body_accessory]', '[gearlist]')
"}
)
diff --git a/code/modules/client/preferences_spawnpoints.dm b/code/modules/client/preference/preferences_spawnpoints.dm
similarity index 100%
rename from code/modules/client/preferences_spawnpoints.dm
rename to code/modules/client/preference/preferences_spawnpoints.dm
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preference/preferences_toggles.dm
similarity index 92%
rename from code/modules/client/preferences_toggles.dm
rename to code/modules/client/preference/preferences_toggles.dm
index afb70577dd0..541dee07242 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preference/preferences_toggles.dm
@@ -1,216 +1,216 @@
-//toggles
-/client/verb/toggle_ghost_ears()
- set name = "Show/Hide GhostEars"
- set category = "Preferences"
- set desc = ".Toggle Between seeing all mob speech, and only speech of nearby mobs"
- prefs.toggles ^= CHAT_GHOSTEARS
- to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].")
- prefs.save_preferences(src)
- feedback_add_details("admin_verb","TGE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/toggle_ghost_sight()
- set name = "Show/Hide GhostSight"
- set category = "Preferences"
- set desc = ".Toggle Between seeing all mob emotes, and only emotes of nearby mobs"
- prefs.toggles ^= CHAT_GHOSTSIGHT
- to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].")
- prefs.save_preferences(src)
- feedback_add_details("admin_verb","TGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/toggle_ghost_radio()
- set name = "Enable/Disable GhostRadio"
- set category = "Preferences"
- set desc = ".Toggle between hearing all radio chatter, or only from nearby speakers"
- prefs.toggles ^= CHAT_GHOSTRADIO
- to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTRADIO) ? "hear all radio chat in the world" : "only hear from nearby speakers"].")
- prefs.save_preferences(src)
- feedback_add_details("admin_verb","TGR")
-
-/client/proc/toggle_hear_radio()
- set name = "Show/Hide RadioChatter"
- set category = "Preferences"
- set desc = "Toggle seeing radiochatter from radios and speakers"
- if(!holder) return
- prefs.toggles ^= CHAT_RADIO
- prefs.save_preferences(src)
- to_chat(usr, "You will [(prefs.toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from radios or speakers")
- feedback_add_details("admin_verb","THR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/toggleadminhelpsound()
- set name = "Hear/Silence Adminhelps"
- set category = "Preferences"
- set desc = "Toggle hearing a notification when admin PMs are recieved"
- if(!holder) return
- prefs.sound ^= SOUND_ADMINHELP
- prefs.save_preferences(src)
- to_chat(usr, "You will [(prefs.sound & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive.")
- feedback_add_details("admin_verb","AHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/deadchat() // Deadchat toggle is usable by anyone.
- set name = "Show/Hide Deadchat"
- set category = "Preferences"
- set desc ="Toggles seeing deadchat"
- prefs.toggles ^= CHAT_DEAD
- prefs.save_preferences(src)
-
- if(src.holder)
- to_chat(src, "You will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.")
- else
- to_chat(src, "As a ghost, you will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.")
-
- feedback_add_details("admin_verb","TDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/proc/toggleprayers()
- set name = "Show/Hide Prayers"
- set category = "Preferences"
- set desc = "Toggles seeing prayers"
- prefs.toggles ^= CHAT_PRAYER
- prefs.save_preferences(src)
- to_chat(src, "You will [(prefs.toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.")
- feedback_add_details("admin_verb","TP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/togglescoreboard()
- set name = "Hide/Display End Round Scoreboard"
- set category = "Preferences"
- set desc = "Toggles displaying end of round scoreboard"
- prefs.toggles ^= DISABLE_SCOREBOARD
- prefs.save_preferences(src)
- to_chat(src, "You will [(prefs.toggles & DISABLE_SCOREBOARD) ? "no longer" : "now"] see the end of round scoreboard.")
- feedback_add_details("admin_verb","TScoreboard") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/togglekarmareminder()
- set name = "Hide/Display End Round Karma Reminder"
- set category = "Preferences"
- set desc = "Toggles displaying end of round karma reminder"
- prefs.toggles ^= DISABLE_KARMA_REMINDER
- prefs.save_preferences(src)
- to_chat(src, "You will [(prefs.toggles & DISABLE_KARMA_REMINDER) ? "no longer" : "now"] see the end of round karma reminder.")
- feedback_add_details("admin_verb","TKarmabugger") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/toggletitlemusic()
- set name = "Hear/Silence LobbyMusic"
- set category = "Preferences"
- set desc = "Toggles hearing the GameLobby music"
- prefs.sound ^= SOUND_LOBBY
- prefs.save_preferences(src)
- if(prefs.sound & SOUND_LOBBY)
- to_chat(src, "You will now hear music in the game lobby.")
- if(istype(mob, /mob/new_player))
- playtitlemusic()
- else
- to_chat(src, "You will no longer hear music in the game lobby.")
- if(istype(mob, /mob/new_player))
- to_chat(src, sound(null, repeat = 0, wait = 0, volume = 85, channel = 1))// stop the jamsz
-
- feedback_add_details("admin_verb","TLobby") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/togglemidis()
- set name = "Hear/Silence Midis"
- set category = "Preferences"
- set desc = "Toggles hearing sounds uploaded by admins"
- prefs.sound ^= SOUND_MIDI
- prefs.save_preferences(src)
- if(prefs.sound & SOUND_MIDI)
- to_chat(src, "You will now hear any sounds uploaded by admins.")
- else
- var/sound/break_sound = sound(null, repeat = 0, wait = 0, channel = 777)
- break_sound.priority = 250
- to_chat(src, break_sound)//breaks the client's sound output on channel 777
-
- to_chat(src, "You will no longer hear sounds uploaded by admins; any currently playing midis have been disabled.")
- feedback_add_details("admin_verb","TMidi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/listen_ooc()
- set name = "Show/Hide OOC"
- set category = "Preferences"
- set desc = "Toggles seeing OutOfCharacter chat"
- prefs.toggles ^= CHAT_OOC
- prefs.save_preferences(src)
- to_chat(src, "You will [(prefs.toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.")
- feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-
-/client/verb/listen_looc()
- set name = "Show/Hide LOOC"
- set category = "Preferences"
- set desc = "Toggles seeing Local OutOfCharacter chat"
- prefs.toggles ^= CHAT_LOOC
- prefs.save_preferences(src)
- to_chat(src, "You will [(prefs.toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel.")
- feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-
-/client/verb/Toggle_Soundscape() //All new ambience should be added here so it works with this verb until someone better at things comes up with a fix that isn't awful
- set name = "Hear/Silence Ambience"
- set category = "Preferences"
- set desc = "Toggles hearing ambient sound effects"
- prefs.sound ^= SOUND_AMBIENCE
- prefs.save_preferences(src)
- if(prefs.sound & SOUND_AMBIENCE)
- to_chat(src, "You will now hear ambient sounds.")
- else
- to_chat(src, "You will no longer hear ambient sounds.")
- to_chat(src, sound(null, repeat = 0, wait = 0, volume = 0, channel = 1))
- feedback_add_details("admin_verb","TAmbi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/Toggle_Buzz() //No more headaches because headphones bump up shipambience.ogg to insanity levels.
- set name = "Hear/Silence White Noise"
- set category = "Preferences"
- set desc = "Toggles hearing ambient white noise"
- prefs.sound ^= SOUND_BUZZ
- prefs.save_preferences(src)
- if(prefs.sound & SOUND_BUZZ)
- to_chat(src, "You will now hear ambient white noise.")
- else
- to_chat(src, "You will no longer hear ambient white noise.")
- to_chat(src, sound(null, repeat = 0, wait = 0, volume = 0, channel = 2))
- feedback_add_details("admin_verb","TBuzz") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-
-/client/verb/Toggle_Heartbeat() //to toggle off heartbeat sounds, in case they get too annoying
- set name = "Hear/Silence Heartbeat"
- set category = "Preferences"
- set desc = "Toggles hearing heart beating sound effects"
- prefs.sound ^= SOUND_HEARTBEAT
- prefs.save_preferences(src)
- if(prefs.sound & SOUND_HEARTBEAT)
- to_chat(src, "You will now hear heartbeat sounds.")
- else
- to_chat(src, "You will no longer hear heartbeat sounds.")
- to_chat(src, sound(null, repeat = 0, wait = 0, volume = 0, channel = 1))
- to_chat(src, sound(null, repeat = 0, wait = 0, volume = 0, channel = 2))
- feedback_add_details("admin_verb","Thb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-// This needs a toggle because you people are awful and spammed terrible music
-/client/verb/toggle_instruments()
- set name = "Hear/Silence Instruments"
- set category = "Preferences"
- set desc = "Toggles hearing musical instruments like the violin and piano"
- prefs.toggles ^= SOUND_INSTRUMENTS
- prefs.save_preferences(src)
- if(prefs.toggles & SOUND_INSTRUMENTS)
- to_chat(src, "You will now hear people playing musical instruments.")
- else
- to_chat(src, "You will no longer hear musical instruments.")
- feedback_add_details("admin_verb","TInstru") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-/client/verb/toggle_media()
- set name = "Hear/Silence Streaming"
- set category = "Preferences"
- set desc = "Toggle hearing streaming media (radios, jukeboxes, etc)"
-
- prefs.sound ^= SOUND_STREAMING
- prefs.save_preferences(src)
- to_chat(usr, "You will [(prefs.sound & SOUND_STREAMING) ? "now" : "no longer"] hear streamed media.")
- if(!media) return
- if(prefs.sound & SOUND_STREAMING)
- media.update_music()
- else
- media.stop_music()
-
-/client/verb/setup_character()
- set name = "Game Preferences"
- set category = "Preferences"
- set desc = "Allows you to access the Setup Character screen. Changes to your character won't take effect until next round, but other changes will."
- prefs.current_tab = 1
+//toggles
+/client/verb/toggle_ghost_ears()
+ set name = "Show/Hide GhostEars"
+ set category = "Preferences"
+ set desc = ".Toggle Between seeing all mob speech, and only speech of nearby mobs"
+ prefs.toggles ^= CHAT_GHOSTEARS
+ to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"].")
+ prefs.save_preferences(src)
+ feedback_add_details("admin_verb","TGE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/toggle_ghost_sight()
+ set name = "Show/Hide GhostSight"
+ set category = "Preferences"
+ set desc = ".Toggle Between seeing all mob emotes, and only emotes of nearby mobs"
+ prefs.toggles ^= CHAT_GHOSTSIGHT
+ to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"].")
+ prefs.save_preferences(src)
+ feedback_add_details("admin_verb","TGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/toggle_ghost_radio()
+ set name = "Enable/Disable GhostRadio"
+ set category = "Preferences"
+ set desc = ".Toggle between hearing all radio chatter, or only from nearby speakers"
+ prefs.toggles ^= CHAT_GHOSTRADIO
+ to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTRADIO) ? "hear all radio chat in the world" : "only hear from nearby speakers"].")
+ prefs.save_preferences(src)
+ feedback_add_details("admin_verb","TGR")
+
+/client/proc/toggle_hear_radio()
+ set name = "Show/Hide RadioChatter"
+ set category = "Preferences"
+ set desc = "Toggle seeing radiochatter from radios and speakers"
+ if(!holder) return
+ prefs.toggles ^= CHAT_RADIO
+ prefs.save_preferences(src)
+ to_chat(usr, "You will [(prefs.toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from radios or speakers")
+ feedback_add_details("admin_verb","THR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/toggleadminhelpsound()
+ set name = "Hear/Silence Adminhelps"
+ set category = "Preferences"
+ set desc = "Toggle hearing a notification when admin PMs are recieved"
+ if(!holder) return
+ prefs.sound ^= SOUND_ADMINHELP
+ prefs.save_preferences(src)
+ to_chat(usr, "You will [(prefs.sound & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive.")
+ feedback_add_details("admin_verb","AHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/deadchat() // Deadchat toggle is usable by anyone.
+ set name = "Show/Hide Deadchat"
+ set category = "Preferences"
+ set desc ="Toggles seeing deadchat"
+ prefs.toggles ^= CHAT_DEAD
+ prefs.save_preferences(src)
+
+ if(src.holder)
+ to_chat(src, "You will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.")
+ else
+ to_chat(src, "As a ghost, you will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat.")
+
+ feedback_add_details("admin_verb","TDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/proc/toggleprayers()
+ set name = "Show/Hide Prayers"
+ set category = "Preferences"
+ set desc = "Toggles seeing prayers"
+ prefs.toggles ^= CHAT_PRAYER
+ prefs.save_preferences(src)
+ to_chat(src, "You will [(prefs.toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat.")
+ feedback_add_details("admin_verb","TP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/togglescoreboard()
+ set name = "Hide/Display End Round Scoreboard"
+ set category = "Preferences"
+ set desc = "Toggles displaying end of round scoreboard"
+ prefs.toggles ^= DISABLE_SCOREBOARD
+ prefs.save_preferences(src)
+ to_chat(src, "You will [(prefs.toggles & DISABLE_SCOREBOARD) ? "no longer" : "now"] see the end of round scoreboard.")
+ feedback_add_details("admin_verb","TScoreboard") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/togglekarmareminder()
+ set name = "Hide/Display End Round Karma Reminder"
+ set category = "Preferences"
+ set desc = "Toggles displaying end of round karma reminder"
+ prefs.toggles ^= DISABLE_KARMA_REMINDER
+ prefs.save_preferences(src)
+ to_chat(src, "You will [(prefs.toggles & DISABLE_KARMA_REMINDER) ? "no longer" : "now"] see the end of round karma reminder.")
+ feedback_add_details("admin_verb","TKarmabugger") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/toggletitlemusic()
+ set name = "Hear/Silence LobbyMusic"
+ set category = "Preferences"
+ set desc = "Toggles hearing the GameLobby music"
+ prefs.sound ^= SOUND_LOBBY
+ prefs.save_preferences(src)
+ if(prefs.sound & SOUND_LOBBY)
+ to_chat(src, "You will now hear music in the game lobby.")
+ if(istype(mob, /mob/new_player))
+ playtitlemusic()
+ else
+ to_chat(src, "You will no longer hear music in the game lobby.")
+ if(istype(mob, /mob/new_player))
+ src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)// stop the jamsz
+
+ feedback_add_details("admin_verb","TLobby") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/togglemidis()
+ set name = "Hear/Silence Midis"
+ set category = "Preferences"
+ set desc = "Toggles hearing sounds uploaded by admins"
+ prefs.sound ^= SOUND_MIDI
+ prefs.save_preferences(src)
+ if(prefs.sound & SOUND_MIDI)
+ to_chat(src, "You will now hear any sounds uploaded by admins.")
+ else
+ var/sound/break_sound = sound(null, repeat = 0, wait = 0, channel = 777)
+ break_sound.priority = 250
+ src << break_sound //breaks the client's sound output on channel 777
+
+ to_chat(src, "You will no longer hear sounds uploaded by admins; any currently playing midis have been disabled.")
+ feedback_add_details("admin_verb","TMidi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/listen_ooc()
+ set name = "Show/Hide OOC"
+ set category = "Preferences"
+ set desc = "Toggles seeing OutOfCharacter chat"
+ prefs.toggles ^= CHAT_OOC
+ prefs.save_preferences(src)
+ to_chat(src, "You will [(prefs.toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel.")
+ feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+
+/client/verb/listen_looc()
+ set name = "Show/Hide LOOC"
+ set category = "Preferences"
+ set desc = "Toggles seeing Local OutOfCharacter chat"
+ prefs.toggles ^= CHAT_LOOC
+ prefs.save_preferences(src)
+ to_chat(src, "You will [(prefs.toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel.")
+ feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+
+/client/verb/Toggle_Soundscape() //All new ambience should be added here so it works with this verb until someone better at things comes up with a fix that isn't awful
+ set name = "Hear/Silence Ambience"
+ set category = "Preferences"
+ set desc = "Toggles hearing ambient sound effects"
+ prefs.sound ^= SOUND_AMBIENCE
+ prefs.save_preferences(src)
+ if(prefs.sound & SOUND_AMBIENCE)
+ to_chat(src, "You will now hear ambient sounds.")
+ else
+ to_chat(src, "You will no longer hear ambient sounds.")
+ src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
+ feedback_add_details("admin_verb","TAmbi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/Toggle_Buzz() //No more headaches because headphones bump up shipambience.ogg to insanity levels.
+ set name = "Hear/Silence White Noise"
+ set category = "Preferences"
+ set desc = "Toggles hearing ambient white noise"
+ prefs.sound ^= SOUND_BUZZ
+ prefs.save_preferences(src)
+ if(prefs.sound & SOUND_BUZZ)
+ to_chat(src, "You will now hear ambient white noise.")
+ else
+ to_chat(src, "You will no longer hear ambient white noise.")
+ src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
+ feedback_add_details("admin_verb","TBuzz") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+
+/client/verb/Toggle_Heartbeat() //to toggle off heartbeat sounds, in case they get too annoying
+ set name = "Hear/Silence Heartbeat"
+ set category = "Preferences"
+ set desc = "Toggles hearing heart beating sound effects"
+ prefs.sound ^= SOUND_HEARTBEAT
+ prefs.save_preferences(src)
+ if(prefs.sound & SOUND_HEARTBEAT)
+ to_chat(src, "You will now hear heartbeat sounds.")
+ else
+ to_chat(src, "You will no longer hear heartbeat sounds.")
+ src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
+ src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
+ feedback_add_details("admin_verb","Thb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+// This needs a toggle because you people are awful and spammed terrible music
+/client/verb/toggle_instruments()
+ set name = "Hear/Silence Instruments"
+ set category = "Preferences"
+ set desc = "Toggles hearing musical instruments like the violin and piano"
+ prefs.sound ^= SOUND_INSTRUMENTS
+ prefs.save_preferences(src)
+ if(prefs.sound & SOUND_INSTRUMENTS)
+ to_chat(src, "You will now hear people playing musical instruments.")
+ else
+ to_chat(src, "You will no longer hear musical instruments.")
+ feedback_add_details("admin_verb","TInstru") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/client/verb/toggle_media()
+ set name = "Hear/Silence Streaming"
+ set category = "Preferences"
+ set desc = "Toggle hearing streaming media (radios, jukeboxes, etc)"
+
+ prefs.sound ^= SOUND_STREAMING
+ prefs.save_preferences(src)
+ to_chat(usr, "You will [(prefs.sound & SOUND_STREAMING) ? "now" : "no longer"] hear streamed media.")
+ if(!media) return
+ if(prefs.sound & SOUND_STREAMING)
+ media.update_music()
+ else
+ media.stop_music()
+
+/client/verb/setup_character()
+ set name = "Game Preferences"
+ set category = "Preferences"
+ set desc = "Allows you to access the Setup Character screen. Changes to your character won't take effect until next round, but other changes will."
+ prefs.current_tab = 1
prefs.ShowChoices(usr)
\ No newline at end of file
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 8d6595b73ff..afc11b0acf8 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -31,7 +31,7 @@
/obj/item/clothing/mob_can_equip(M as mob, slot)
//if we can equip the item anyway, don't bother with species_restricted (aslo cuts down on spam)
- if (!..())
+ if(!..())
return 0
if(species_restricted && istype(M,/mob/living/carbon/human))
@@ -66,12 +66,12 @@
species_restricted = list(target_species)
//Set icon
- if (sprite_sheets && (target_species in sprite_sheets))
+ if(sprite_sheets && (target_species in sprite_sheets))
icon_override = sprite_sheets[target_species]
else
icon_override = initial(icon_override)
- if (sprite_sheets_obj && (target_species in sprite_sheets_obj))
+ if(sprite_sheets_obj && (target_species in sprite_sheets_obj))
icon = sprite_sheets_obj[target_species]
else
icon = initial(icon)
@@ -79,14 +79,14 @@
//Ears: currently only used for headsets and earmuffs
/obj/item/clothing/ears
name = "ears"
- w_class = 1.0
+ w_class = 1
throwforce = 2
slot_flags = SLOT_EARS
/obj/item/clothing/ears/attack_hand(mob/user as mob)
- if (!user) return
+ if(!user) return
- if (src.loc != user || !istype(user,/mob/living/carbon/human))
+ if(src.loc != user || !istype(user,/mob/living/carbon/human))
..()
return
@@ -95,7 +95,7 @@
..()
return
- if(flags & NODROP)
+ if(!usr.canUnEquip(src))
return
var/obj/item/clothing/ears/O
@@ -110,7 +110,7 @@
user.unEquip(src)
- if (O)
+ if(O)
user.put_in_hands(O)
O.add_fingerprint(user)
@@ -119,7 +119,7 @@
/obj/item/clothing/ears/offear
name = "Other ear"
- w_class = 5.0
+ w_class = 5
icon = 'icons/mob/screen_gen.dmi'
icon_state = "block"
slot_flags = SLOT_EARS | SLOT_TWOEARS
@@ -144,7 +144,7 @@
/obj/item/clothing/glasses
name = "glasses"
icon = 'icons/obj/clothing/glasses.dmi'
- w_class = 2.0
+ w_class = 2
flags = GLASSESCOVERSEYES
slot_flags = SLOT_EYES
materials = list(MAT_GLASS = 250)
@@ -171,7 +171,7 @@ BLIND // can't see anything
/obj/item/clothing/gloves
name = "gloves"
gender = PLURAL //Carn: for grammarically correct text-parsing
- w_class = 2.0
+ w_class = 2
icon = 'icons/obj/clothing/gloves.dmi'
siemens_coefficient = 0.50
body_parts_covered = HANDS
@@ -179,41 +179,21 @@ BLIND // can't see anything
attack_verb = list("challenged")
var/transfer_prints = FALSE
var/pickpocket = 0 //Master pickpocket?
- var/clipped = 0
strip_delay = 20
put_on_delay = 40
- species_restricted = list("exclude","Unathi","Tajaran","Wryn")
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi',
"Drask" = 'icons/mob/species/drask/gloves.dmi'
)
-/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user, params)
- if(istype(W, /obj/item/weapon/wirecutters))
- if(!clipped)
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
- user.visible_message("[user] snips the fingertips off [src]. ","You snip the fingertips off [src]. ")
- clipped = 1
- name = "mangled [name]"
- desc = "[desc] They have had the fingertips cut off of them."
- if("exclude" in species_restricted)
- species_restricted -= "Unathi"
- species_restricted -= "Tajaran"
- update_icon()
- else
- to_chat(user, "[src] have already been clipped! ")
- return
- else
- ..()
-
/obj/item/clothing/gloves/proc/Touch()
return
/obj/item/clothing/under/proc/set_sensors(mob/user as mob)
var/mob/M = user
- if (istype(M, /mob/dead/)) return
- if (user.stat || user.restrained()) return
+ if(istype(M, /mob/dead/)) return
+ if(user.stat || user.restrained()) return
if(has_sensor >= 2)
to_chat(user, "The controls are locked.")
return 0
@@ -228,7 +208,7 @@ BLIND // can't see anything
return
sensor_mode = modes.Find(switchMode) - 1
- if (src.loc == user)
+ if(src.loc == user)
switch(sensor_mode)
if(0)
to_chat(user, "You disable your suit's remote sensing equipment.")
@@ -243,7 +223,7 @@ BLIND // can't see anything
if(H.w_uniform == src)
H.update_suit_sensors()
- else if (istype(src.loc, /mob))
+ else if(istype(src.loc, /mob))
switch(sensor_mode)
if(0)
for(var/mob/V in viewers(user, 1))
@@ -289,7 +269,6 @@ BLIND // can't see anything
body_parts_covered = HEAD
slot_flags = SLOT_MASK
var/mask_adjusted = 0
- var/ignore_maskadjust = 1
var/adjusted_flags = null
strip_delay = 40
put_on_delay = 40
@@ -297,65 +276,61 @@ BLIND // can't see anything
//Proc that moves gas/breath masks out of the way
/obj/item/clothing/mask/proc/adjustmask(var/mob/user)
var/mob/living/carbon/human/H = usr //Used to check if the mask is on the head, to check if the hands are full, and to turn off internals if they were on when the mask was pushed out of the way.
- if(!ignore_maskadjust)
- if(user.incapacitated()) //This check allows you to adjust your masks while you're buckled into chairs or beds.
- return
- if(mask_adjusted)
- icon_state = copytext(icon_state, 1, findtext(icon_state, "_up")) /*Trims the '_up' off the end of the icon state, thus reverting to the most recent previous state.
- Had to use this instead of initial() because initial reverted to the wrong state.*/
- gas_transfer_coefficient = initial(gas_transfer_coefficient)
- permeability_coefficient = initial(permeability_coefficient)
- to_chat(user, "You push \the [src] back into place.")
- mask_adjusted = 0
- slot_flags = initial(slot_flags)
- if(flags_inv != initial(flags_inv))
- if(initial(flags_inv) & HIDEFACE) //If the mask is one that hides the face and can be adjusted yet lost that trait when it was adjusted, make it hide the face again.
- flags_inv |= HIDEFACE
- if(flags != initial(flags))
- if(initial(flags) & MASKCOVERSMOUTH) //If the mask covers the mouth when it's down and can be adjusted yet lost that trait when it was adjusted, make it cover the mouth again.
- flags |= MASKCOVERSMOUTH
- if(initial(flags) & AIRTIGHT) //If the mask is airtight and thus, one that you'd be able to run internals from yet can't because it was adjusted, make it airtight again.
- flags |= AIRTIGHT
- if(H.head == src)
- if(flags_inv == HIDEFACE) //Means that only things like bandanas and balaclavas will be affected since they obscure the identity of the wearer.
- if(H.l_hand && H.r_hand) //If both hands are occupied, drop the object on the ground.
- user.unEquip(src)
- else //Otherwise, put it in an available hand, the active one preferentially.
- src.loc = user
- H.head = null
- user.put_in_hands(src)
- else
- icon_state += "_up"
- to_chat(user, "You push \the [src] out of the way.")
- gas_transfer_coefficient = null
- permeability_coefficient = null
- mask_adjusted = 1
- if(adjusted_flags)
- slot_flags = adjusted_flags
- if(ishuman(user))
- if(H.internal)
- if(user.wear_mask == src) /*If the user was wearing the mask providing internals on their face at the time it was adjusted, turn off internals.
- Otherwise, they adjusted it while it was in their hands or some such so we won't be needing to turn off internals.*/
- if(H.internals)
- H.internals.icon_state = "internal0"
- H.internal = null
- if(flags_inv & HIDEFACE) //Means that only things like bandanas and balaclavas will be affected since they obscure the identity of the wearer.
- flags_inv &= ~HIDEFACE /*Done after the above to avoid having to do a check for initial(src.flags_inv == HIDEFACE).
- This reveals the user's face since the bandana will now be going on their head.*/
- if(flags & MASKCOVERSMOUTH) //Mask won't cover the mouth any more since it's been pushed out of the way. Allows for CPRing with adjusted masks.
- flags &= ~MASKCOVERSMOUTH
- if(flags & AIRTIGHT) //If the mask was airtight, it won't be anymore since you just pushed it off your face.
- flags &= ~AIRTIGHT
- if(user.wear_mask == src)
- if(initial(flags_inv) == HIDEFACE) //Means that you won't have to take off and put back on simple things like breath masks which, realistically, can just be pulled down off your face.
- if(H.l_hand && H.r_hand) //If both hands are occupied, drop the object on the ground.
- user.unEquip(src)
- else //Otherwise, put it in an available hand, the active one preferentially.
- src.loc = user
- user.wear_mask = null
- user.put_in_hands(src)
- usr.update_inv_wear_mask()
- usr.update_inv_head()
+ if(user.incapacitated()) //This check allows you to adjust your masks while you're buckled into chairs or beds.
+ return
+ if(mask_adjusted)
+ icon_state = initial(icon_state)
+ gas_transfer_coefficient = initial(gas_transfer_coefficient)
+ permeability_coefficient = initial(permeability_coefficient)
+ to_chat(user, "You push \the [src] back into place. ")
+ mask_adjusted = 0
+ slot_flags = initial(slot_flags)
+ if(flags_inv != initial(flags_inv))
+ if(initial(flags_inv) & HIDEFACE) //If the mask is one that hides the face and can be adjusted yet lost that trait when it was adjusted, make it hide the face again.
+ flags_inv |= HIDEFACE
+ if(flags != initial(flags))
+ if(initial(flags) & MASKCOVERSMOUTH) //If the mask covers the mouth when it's down and can be adjusted yet lost that trait when it was adjusted, make it cover the mouth again.
+ flags |= MASKCOVERSMOUTH
+ if(initial(flags) & AIRTIGHT) //If the mask is airtight and thus, one that you'd be able to run internals from yet can't because it was adjusted, make it airtight again.
+ flags |= AIRTIGHT
+ if(H.head == src && flags_inv == HIDEFACE) //Means that only things like bandanas and balaclavas will be affected since they obscure the identity of the wearer.
+ if(H.l_hand && H.r_hand) //If both hands are occupied, drop the object on the ground.
+ user.unEquip(src)
+ else //Otherwise, put it in an available hand, the active one preferentially.
+ src.loc = user
+ H.head = null
+ user.put_in_hands(src)
+ else
+ icon_state += "_up"
+ to_chat(user, "You push \the [src] out of the way. ")
+ gas_transfer_coefficient = null
+ permeability_coefficient = null
+ mask_adjusted = 1
+ if(adjusted_flags)
+ slot_flags = adjusted_flags
+ if(ishuman(user) && H.internal && user.wear_mask == src) /*If the user was wearing the mask providing internals on their face at the time it was adjusted, turn off internals.
+ Otherwise, they adjusted it while it was in their hands or some such so we won't be needing to turn off internals.*/
+ H.update_internals_hud_icon(0)
+ H.internal = null
+ if(flags_inv & HIDEFACE) //Means that only things like bandanas and balaclavas will be affected since they obscure the identity of the wearer.
+ flags_inv &= ~HIDEFACE /*Done after the above to avoid having to do a check for initial(src.flags_inv == HIDEFACE).
+ This reveals the user's face since the bandana will now be going on their head.*/
+ if(flags & MASKCOVERSMOUTH) //Mask won't cover the mouth any more since it's been pushed out of the way. Allows for CPRing with adjusted masks.
+ flags &= ~MASKCOVERSMOUTH
+ if(flags & AIRTIGHT) //If the mask was airtight, it won't be anymore since you just pushed it off your face.
+ flags &= ~AIRTIGHT
+ if(user.wear_mask == src && initial(flags_inv) == HIDEFACE) //Means that you won't have to take off and put back on simple things like breath masks which, realistically, can just be pulled down off your face.
+ if(H.l_hand && H.r_hand) //If both hands are occupied, drop the object on the ground.
+ user.unEquip(src)
+ else //Otherwise, put it in an available hand, the active one preferentially.
+ src.loc = user
+ user.wear_mask = null
+ user.put_in_hands(src)
+ usr.update_inv_wear_mask()
+ usr.update_inv_head()
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
//Shoes
/obj/item/clothing/shoes
@@ -375,7 +350,6 @@ BLIND // can't see anything
permeability_coefficient = 0.50
slowdown = SHOES_SLOWDOWN
- species_restricted = list("exclude","Unathi","Tajaran","Wryn")
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/shoes.dmi'
@@ -408,9 +382,6 @@ BLIND // can't see anything
item_state = "[item_state]_opentoe"
name = "mangled [name]"
desc = "[desc] They have had their toes opened up."
- if("exclude" in species_restricted)
- species_restricted -= "Unathi"
- species_restricted -= "Tajaran"
update_icon()
else
to_chat(user, "[src] have already had their toes cut open! ")
@@ -452,6 +423,7 @@ BLIND // can't see anything
var/suit_adjusted = 0
var/ignore_suitadjust = 1
var/adjust_flavour = null
+ var/list/hide_tail_by_species = null
//Proc that opens and closes jackets.
/obj/item/clothing/suit/proc/adjustsuit(var/mob/user)
@@ -467,6 +439,9 @@ BLIND // can't see anything
flavour = "[copytext(adjust_flavour, 3, lentext(adjust_flavour) + 1)] up" //Trims off the 'un' at the beginning of the word. unzip -> zip, unbutton->button.
to_chat(user, "You [flavour] \the [src].")
suit_adjusted = 0 //Suit is no longer adjusted.
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
else
var/flavour = "open"
icon_state += "_open"
@@ -475,6 +450,9 @@ BLIND // can't see anything
flavour = "[adjust_flavour]"
to_chat(user, "You [flavour] \the [src].")
suit_adjusted = 1 //Suit's adjusted.
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
else
if(user.canUnEquip(src)) //Checks to see if the item can be unequipped. If so, lets shred. Otherwise, struggle and fail.
if(contents) //If the suit's got any storage capability...
@@ -496,20 +474,21 @@ BLIND // can't see anything
else
to_chat(user, "You attempt to button up the velcro on \the [src], before promptly realising how retarded you are. ")
-/obj/item/clothing/suit/verb/openjacket(var/mob/user) //The verb you can use to adjust jackets.
- set name = "Open/Close Jacket"
- set category = "Object"
- set src in usr
- if(!isliving(usr))
- return
- if(usr.stat)
- return
- adjustsuit(user)
+/obj/item/clothing/suit/equipped(var/mob/living/carbon/human/user, var/slot) //Handle tail-hiding on a by-species basis.
+ ..()
+ if(ishuman(user) && hide_tail_by_species && slot == slot_wear_suit)
+ if(user.species.name in hide_tail_by_species)
+ if(!(flags_inv & HIDETAIL)) //Hide the tail if the user's species is in the hide_tail_by_species list and the tail isn't already hidden.
+ flags_inv |= HIDETAIL
+ else
+ if(!(initial(flags_inv) & HIDETAIL) && (flags_inv & HIDETAIL)) //Otherwise, remove the HIDETAIL flag if it wasn't already in the flags_inv to start with.
+ flags_inv &= ~HIDETAIL
-/obj/item/clothing/suit/ui_action_click() //This is what happens when you click the HUD action button to adjust your suit.
+/obj/item/clothing/suit/ui_action_click(mob/user) //This is what happens when you click the HUD action button to adjust your suit.
if(!ignore_suitadjust)
- adjustsuit(usr)
- else ..() //This is required in order to ensure that the UI buttons for items that have alternate functions tied to UI buttons still work.
+ adjustsuit(user)
+ else
+ ..() //This is required in order to ensure that the UI buttons for items that have alternate functions tied to UI buttons still work.
//Spacesuit
//Note: Everything in modules/clothing/spacesuits should have the entire suit grouped together.
@@ -521,7 +500,7 @@ BLIND // can't see anything
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL
item_state = "s_helmet"
permeability_coefficient = 0.01
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 50)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
@@ -543,8 +522,8 @@ BLIND // can't see anything
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank)
- slowdown = 2
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50)
+ slowdown = 1
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 50)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
@@ -561,7 +540,7 @@ BLIND // can't see anything
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
permeability_coefficient = 0.90
slot_flags = SLOT_ICLOTHING
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/uniform.dmi',
@@ -586,7 +565,7 @@ BLIND // can't see anything
return 0
if(accessories.len && (A.slot in list("utility","armband")))
for(var/obj/item/clothing/accessory/AC in accessories)
- if (AC.slot == A.slot)
+ if(AC.slot == A.slot)
return 0
/obj/item/clothing/under/attackby(obj/item/I, mob/user, params)
@@ -619,18 +598,20 @@ BLIND // can't see anything
A.attack_hand(user)
return
- if (ishuman(usr) && src.loc == user) //make it harder to accidentally undress yourself
+ if(ishuman(usr) && src.loc == user) //make it harder to accidentally undress yourself
return
..()
/obj/item/clothing/under/MouseDrop(obj/over_object as obj)
- if (ishuman(usr))
+ if(ishuman(usr))
//makes sure that the clothing is equipped so that we can't drag it into our hand from miles away.
- if (!(src.loc == usr))
+ if(!(src.loc == usr))
return
-
- if (!( usr.restrained() ) && !( usr.stat ) && ( over_object ))
+ if(!( usr.restrained() ) && !( usr.stat ) && ( over_object ))
+ if(!usr.canUnEquip(src))
+ to_chat(usr, "[src] appears stuck on you!")
+ return
switch(over_object.name)
if("r_hand")
usr.unEquip(src)
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index bad4a3dabc5..6a51086c7b3 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -1,7 +1,7 @@
/obj/item/clothing/glasses
name = "glasses"
icon = 'icons/obj/clothing/glasses.dmi'
- //w_class = 2.0
+ //w_class = 2
//flags = GLASSESCOVERSEYES
//slot_flags = SLOT_EYES
//var/vision_flags = 0
@@ -18,7 +18,7 @@
name = "prescription [name]"
/obj/item/clothing/glasses/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if (user.stat || user.restrained() || !ishuman(user))
+ if(user.stat || user.restrained() || !ishuman(user))
return ..()
var/mob/living/carbon/human/H = user
if(prescription_upgradable)
@@ -101,15 +101,11 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
+ actions_types = list(/datum/action/item_action/toggle_research_scanner)
-/obj/item/clothing/glasses/science/equipped(mob/user, slot)
+/obj/item/clothing/glasses/science/item_action_slot_check(slot)
if(slot == slot_glasses)
- user.scanner.Grant(user)
- ..(user, slot)
-
-/obj/item/clothing/glasses/science/dropped(mob/user)
- user.scanner.devices -= 1
- ..(user)
+ return 1
/obj/item/clothing/glasses/science/night
name = "Night Vision Science Goggle"
@@ -158,6 +154,7 @@
desc = "Such a dapper eyepiece!"
icon_state = "monocle"
item_state = "headset" // lol
+ prescription_upgradable = 1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
@@ -220,6 +217,7 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
+ prescription_upgradable = 1
/obj/item/clothing/glasses/sunglasses
desc = "Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks many flashes."
@@ -240,13 +238,16 @@
/obj/item/clothing/glasses/sunglasses/noir
name = "noir sunglasses"
desc = "Somehow these seem even more out-of-date than normal sunglasses."
- action_button_name = "Noir Mode"
+ actions_types = list(/datum/action/item_action/noir)
var/noir_mode = 0
color_view = MATRIX_GREYSCALE
/obj/item/clothing/glasses/sunglasses/noir/attack_self()
- if(is_equipped())
- toggle_noir()
+ toggle_noir()
+
+/obj/item/clothing/glasses/sunglasses/noir/item_action_slot_check(slot)
+ if(slot == slot_glasses)
+ return 1
/obj/item/clothing/glasses/sunglasses/noir/proc/toggle_noir()
if(!noir_mode)
@@ -275,16 +276,12 @@
name = "agreeable glasses"
desc = "H.C Limited edition."
var/punused = null
- action_button_name = "YEAH!"
+ actions_types = list(/datum/action/item_action/YEEEAAAAAHHHHHHHHHHHHH)
/obj/item/clothing/glasses/sunglasses/yeah/attack_self()
pun()
-
-/obj/item/clothing/glasses/sunglasses/yeah/verb/pun()
- set category = "Object"
- set name = "YEAH!"
- set src in usr
+/obj/item/clothing/glasses/sunglasses/yeah/proc/pun()
if(!punused)//one per round
punused = 1
playsound(src.loc, 'sound/misc/yeah.ogg', 100, 0)
@@ -328,7 +325,7 @@
desc = "Protects the eyes from welders, approved by the mad scientist association."
icon_state = "welding-g"
item_state = "welding-g"
- action_button_name = "Flip welding goggles"
+ actions_types = list(/datum/action/item_action/toggle)
flash_protect = 2
tint = 2
species_fit = list("Vox")
@@ -340,31 +337,28 @@
/obj/item/clothing/glasses/welding/attack_self()
toggle()
+/obj/item/clothing/glasses/welding/proc/toggle()
+ if(up)
+ up = !up
+ flags |= GLASSESCOVERSEYES
+ flags_inv |= HIDEEYES
+ icon_state = initial(icon_state)
+ to_chat(usr, "You flip the [src] down to protect your eyes.")
+ flash_protect = 2
+ tint = initial(tint) //better than istype
+ else
+ up = !up
+ flags &= ~GLASSESCOVERSEYES
+ flags_inv &= ~HIDEEYES
+ icon_state = "[initial(icon_state)]up"
+ to_chat(usr, "You push the [src] up out of your face.")
+ flash_protect = 0
+ tint = 0
+ usr.update_inv_glasses()
-/obj/item/clothing/glasses/welding/verb/toggle()
- set category = "Object"
- set name = "Adjust welding goggles"
- set src in usr
-
- if(usr.canmove && !usr.stat && !usr.restrained())
- if(src.up)
- src.up = !src.up
- src.flags |= GLASSESCOVERSEYES
- flags_inv |= HIDEEYES
- icon_state = initial(icon_state)
- to_chat(usr, "You flip the [src] down to protect your eyes.")
- flash_protect = 2
- tint = initial(tint) //better than istype
- else
- src.up = !src.up
- src.flags &= ~HEADCOVERSEYES
- flags_inv &= ~HIDEEYES
- icon_state = "[initial(icon_state)]up"
- to_chat(usr, "You push the [src] up out of your face.")
- flash_protect = 0
- tint = 0
-
- usr.update_inv_glasses()
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
/obj/item/clothing/glasses/welding/superior
name = "superior welding goggles"
@@ -373,7 +367,6 @@
item_state = "rwelding-g"
flash_protect = 2
tint = 0
- action_button_name = "Flip welding goggles"
/obj/item/clothing/glasses/sunglasses/blindfold
name = "blindfold"
@@ -424,6 +417,7 @@
desc = "Used for seeing walls, floors, and stuff through anything."
icon_state = "meson"
origin_tech = "magnets=3;syndicate=4"
+ prescription_upgradable = 1
/obj/item/clothing/glasses/thermal/monocle
name = "Thermoncle"
@@ -499,4 +493,4 @@
desc = "Just who the hell do you think I am?!"
name = "gar glasses"
icon_state = "gar"
- item_state = "gar"
\ No newline at end of file
+ item_state = "gar"
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index 8756290ad20..e290ba5308d 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -14,6 +14,7 @@
H.add_hud_to(user)
/obj/item/clothing/glasses/hud/dropped(mob/living/carbon/human/user)
+ ..()
if(HUDType && istype(user) && user.glasses == src)
var/datum/atom_hud/H = huds[HUDType]
H.remove_hud_from(user)
@@ -73,7 +74,6 @@
desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status and security records."
icon_state = "securityhud"
var/global/list/jobs[0]
- flash_protect = 1
HUDType = DATA_HUD_SECURITY_ADVANCED
species_fit = list("Vox")
sprite_sheets = list(
@@ -82,13 +82,14 @@
)
/obj/item/clothing/glasses/hud/security/chameleon
- name = "Chamleon Security HUD"
+ name = "Chameleon Security HUD"
desc = "A stolen security HUD integrated with Syndicate chameleon technology. Toggle to disguise the HUD. Provides flash protection."
+ flash_protect = 1
/obj/item/clothing/glasses/hud/security/chameleon/attack_self(mob/user)
chameleon(user)
-/obj/item/clothing/glasses/hud/security/jensenshades
+/obj/item/clothing/glasses/hud/security/sunglasses/jensenshades
name = "augmented shades"
desc = "Polarized bioneural eyewear, designed to augment your vision."
icon_state = "jensenshades"
@@ -109,8 +110,28 @@
desc = "Sunglasses with a HUD."
icon_state = "sunhud"
darkness_view = 1
+ flash_protect = 1
tint = 1
prescription_upgradable = 1
/obj/item/clothing/glasses/hud/security/sunglasses/prescription
- prescription = 1
\ No newline at end of file
+ prescription = 1
+
+/obj/item/clothing/glasses/hud/hydroponic
+ name = "Hydroponic HUD"
+ desc = "A heads-up display capable of analyzing the health and status of plants growing in hydro trays and soil."
+ icon_state = "hydroponichud"
+ HUDType = DATA_HUD_HYDROPONIC
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/eyes.dmi'
+ )
+
+/obj/item/clothing/glasses/hud/hydroponic/night
+ name = "Night Vision Hydroponic HUD"
+ desc = "A hydroponic HUD fitted with a light amplifier."
+ icon_state = "hydroponichudnight"
+ item_state = "glasses"
+ darkness_view = 8
+ see_darkness = 0
+ prescription_upgradable = 0
\ No newline at end of file
diff --git a/code/modules/clothing/gloves/boxing.dm b/code/modules/clothing/gloves/boxing.dm
index fd54295c477..77a4076347d 100644
--- a/code/modules/clothing/gloves/boxing.dm
+++ b/code/modules/clothing/gloves/boxing.dm
@@ -4,7 +4,6 @@
icon_state = "boxing"
item_state = "boxing"
put_on_delay = 60
- species_restricted = null
/obj/item/clothing/gloves/boxing/green
icon_state = "boxinggreen"
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index a50e56382a1..76bfbdfd394 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -59,16 +59,28 @@
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
+ var/can_be_cut = 1
- hos
- item_color = "hosred" //Exists for washing machines. Is not different from black gloves in any way.
+/obj/item/clothing/gloves/color/black/hos
+ item_color = "hosred" //Exists for washing machines. Is not different from black gloves in any way.
- ce
- item_color = "chief" //Exists for washing machines. Is not different from black gloves in any way.
+/obj/item/clothing/gloves/color/black/ce
+ item_color = "chief" //Exists for washing machines. Is not different from black gloves in any way.
- thief
- pickpocket = 1
+/obj/item/clothing/gloves/color/black/thief
+ pickpocket = 1
+
+/obj/item/clothing/gloves/color/black/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+ if(istype(W, /obj/item/weapon/wirecutters))
+ if(can_be_cut && icon_state == initial(icon_state))//only if not dyed
+ to_chat(user, "You snip the fingertips off of [src]. ")
+ playsound(user.loc,'sound/items/Wirecutter.ogg', rand(10,50), 1)
+ var/obj/item/clothing/gloves/fingerless/F = new/obj/item/clothing/gloves/fingerless(user.loc)
+ if(pickpocket)
+ F.pickpocket = 1
+ qdel(src)
+ ..()
/obj/item/clothing/gloves/color/orange
name = "orange gloves"
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 060dd1ca47c..feae32b9085 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -7,10 +7,8 @@
transfer_prints = TRUE
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
- species_restricted = null
strip_delay = 40
put_on_delay = 20
- clipped = 1
/obj/item/clothing/gloves/cyborg
desc = "beep boop borp"
@@ -47,4 +45,11 @@
name = "batgloves"
icon_state = "bmgloves"
item_state = "bmgloves"
- item_color="bmgloves"
\ No newline at end of file
+ item_color="bmgloves"
+
+/obj/item/clothing/gloves/cursedclown
+ name = "cursed white gloves"
+ desc = "These things smell terrible, and they're all lumpy. Gross."
+ icon_state = "latex"
+ item_state = "lgloves"
+ flags = NODROP
diff --git a/code/modules/clothing/gloves/rings.dm b/code/modules/clothing/gloves/rings.dm
index 4a0af4392fa..590efa7cd91 100644
--- a/code/modules/clothing/gloves/rings.dm
+++ b/code/modules/clothing/gloves/rings.dm
@@ -8,22 +8,22 @@
icon = 'icons/obj/clothing/rings.dmi'
var/material = "iron"
var/stud = 0
- species_restricted = null
-
- New()
- ..()
- update_icon()
+/obj/item/clothing/gloves/ring/New()
+ ..()
update_icon()
- if(stud)
- icon_state = "d_[initial(icon_state)]"
- else
- icon_state = initial(icon_state)
- examine(mob/user)
- ..(user)
- to_chat(user, "This one is made of [material].")
- if(stud)
- to_chat(user, "It is adorned with a single gem.")
+
+/obj/item/clothing/gloves/ring/update_icon()
+ if(stud)
+ icon_state = "d_[initial(icon_state)]"
+ else
+ icon_state = initial(icon_state)
+
+/obj/item/clothing/gloves/ring/examine(mob/user)
+ ..(user)
+ to_chat(user, "This one is made of [material].")
+ if(stud)
+ to_chat(user, "It is adorned with a single gem.")
/obj/item/clothing/gloves/ring/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I, /obj/item/stack/sheet/mineral/diamond))
@@ -69,10 +69,11 @@
icon_state = "redring"
/obj/item/clothing/gloves/ring/plastic/random
- New()
- var/c = pick("white","blue","red")
- name = "[c] plastic ring"
- icon_state = "[c]ring"
+
+/obj/item/clothing/gloves/ring/plastic/random/New()
+ var/c = pick("white","blue","red")
+ name = "[c] plastic ring"
+ icon_state = "[c]ring"
// weird
/obj/item/clothing/gloves/ring/glass
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index 5dc555a10d7..5cc5af80abb 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -7,21 +7,23 @@
var/brightness_on = 4 //luminosity when on
var/on = 0
item_color = "yellow" //Determines used sprites: hardhat[on]_[color] and hardhat[on]_[color]2 (lying down sprite)
- armor = list(melee = 30, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20)
+ armor = list(melee = 15, bullet = 5, laser = 20, energy = 10, bomb = 20, bio = 10, rad = 20)
flags_inv = 0
- action_button_name = "Toggle Helmet Light"
+ actions_types = list(/datum/action/item_action/toggle_helmet_light)
- attack_self(mob/user)
- if(!isturf(user.loc))
- to_chat(user, "You cannot turn the light on while in this [user.loc]")//To prevent some lighting anomalities.
+/obj/item/clothing/head/hardhat/attack_self(mob/user)
+ on = !on
+ icon_state = "hardhat[on]_[item_color]"
+ item_state = "hardhat[on]_[item_color]"
- return
- on = !on
- icon_state = "hardhat[on]_[item_color]"
- item_state = "hardhat[on]_[item_color]"
+ if(on)
+ set_light(brightness_on)
+ else
+ set_light(0)
- if(on) set_light(brightness_on)
- else set_light(0)
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
/obj/item/clothing/head/hardhat/orange
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index a9e8bbdb7e2..b7b0cc71b81 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -4,7 +4,7 @@
icon_state = "helmetmaterials"
flags = HEADCOVERSEYES | HEADBANGPROTECT
item_state = "helmetmaterials"
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
flags_inv = HIDEEARS|HIDEEYES
cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
@@ -69,7 +69,7 @@
desc = "A bulletproof helmet that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent."
icon_state = "swat"
item_state = "swat-alt"
- armor = list(melee = 25, bullet = 80, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
+ armor = list(melee = 15, bullet = 40, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi',
@@ -82,7 +82,7 @@
icon_state = "riot"
item_state = "helmet"
flags = HEADCOVERSEYES | HEADCOVERSMOUTH | HEADBANGPROTECT
- armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 41, bullet = 15, laser = 5, energy = 5, bomb = 5, bio = 2, rad = 0)
flags_inv = HIDEEARS
strip_delay = 80
@@ -91,9 +91,8 @@
desc = "A classic metal helmet."
icon_state = "knight_green"
item_state = "knight_green"
- flags = BLOCKHAIR | HEADCOVERSEYES | HEADCOVERSMOUTH
- armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
- flags_inv = HIDEMASK | HIDEEARS | HIDEEYES | HIDEFACE
+ flags = BLOCKHAIR|HEADCOVERSEYES|HEADCOVERSMOUTH
+ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
/obj/item/clothing/head/helmet/justice
name = "helmet of justice"
@@ -101,7 +100,7 @@
icon_state = "justice"
toggle_message = "You turn off the lights on"
alt_toggle_message = "You turn on the lights on"
- action_button_name = "Toggle JUSTICE"
+ actions_types = list(/datum/action/item_action/toggle_helmet_light)
can_toggle = 1
toggle_cooldown = 20
active_sound = 'sound/items/WEEOO1.ogg'
@@ -120,7 +119,7 @@
icon_state = "swat"
flags = HEADCOVERSEYES
item_state = "swat"
- armor = list(melee = 80, bullet = 60, laser = 50, energy = 25, bomb = 50, bio = 10, rad = 0)
+ armor = list(melee = 40, bullet = 30, laser = 30, energy = 30, bomb = 50, bio = 90, rad = 20)
flags_inv = HIDEEARS|HIDEEYES
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
@@ -145,7 +144,7 @@
icon_state = "thunderdome"
flags = HEADCOVERSEYES
item_state = "thunderdome"
- armor = list(melee = 80, bullet = 60, laser = 50, energy = 10, bomb = 25, bio = 10, rad = 0)
+ armor = list(melee = 40, bullet = 30, laser = 25, energy = 10, bomb = 25, bio = 10, rad = 0)
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
@@ -181,7 +180,7 @@ obj/item/clothing/head/helmet/redtaghelm
icon_state = "redtaghelm"
flags = HEADCOVERSEYES
item_state = "redtaghelm"
- armor = list(melee = 30, bullet = 10, laser = 20, energy = 10, bomb = 20, bio = 0, rad = 0)
+ armor = list(melee = 15, bullet = 10, laser = 20, energy = 10, bomb = 20, bio = 0, rad = 0)
// Offer about the same protection as a hardhat.
flags_inv = HIDEEARS|HIDEEYES
@@ -191,7 +190,7 @@ obj/item/clothing/head/helmet/bluetaghelm
icon_state = "bluetaghelm"
flags = HEADCOVERSEYES
item_state = "bluetaghelm"
- armor = list(melee = 30, bullet = 10, laser = 20, energy = 10, bomb = 20, bio = 0, rad = 0)
+ armor = list(melee = 15, bullet = 10, laser = 20, energy = 10, bomb = 20, bio = 0, rad = 0)
// Offer about the same protection as a hardhat.
flags_inv = HIDEEARS|HIDEEYES
@@ -203,19 +202,19 @@ obj/item/clothing/head/blob
flags = HEADCOVERSEYES|HEADCOVERSMOUTH
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
-/obj/item/clothing/head/helmet/knight/blue
+/obj/item/clothing/head/helmet/riot/knight/blue
icon_state = "knight_blue"
item_state = "knight_blue"
-/obj/item/clothing/head/helmet/knight/yellow
+/obj/item/clothing/head/helmet/riot/knight/yellow
icon_state = "knight_yellow"
item_state = "knight_yellow"
-/obj/item/clothing/head/helmet/knight/red
+/obj/item/clothing/head/helmet/riot/knight/red
icon_state = "knight_red"
item_state = "knight_red"
-/obj/item/clothing/head/helmet/knight/templar
+/obj/item/clothing/head/helmet/riot/knight/templar
name = "crusader helmet"
desc = "Deus Vult."
icon_state = "knight_templar"
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 51ee371df32..7100d459a51 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -15,7 +15,7 @@
icon_state = "captain"
desc = "It's good being the king."
item_state = "caphat"
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 60
//Captain: no longer space-worthy
@@ -29,7 +29,7 @@
name = "head of personnel's cap"
icon_state = "hopcap"
desc = "The symbol of true bureaucratic micromanagement."
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
//Nanotrasen Representative
/obj/item/clothing/head/ntrep
@@ -56,8 +56,8 @@
name = "hat"
desc = "Someone who wears this will look very smart."
icon_state = "detective"
- allowed = list(/obj/item/weapon/reagent_containers/food/snacks/candy_corn, /obj/item/weapon/pen)
- armor = list(melee = 50, bullet = 5, laser = 25,energy = 10, bomb = 0, bio = 0, rad = 0)
+ allowed = list(/obj/item/weapon/reagent_containers/food/snacks/candy/candy_corn, /obj/item/weapon/pen)
+ armor = list(melee = 25, bullet = 5, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
//Mime
/obj/item/clothing/head/beret
@@ -70,7 +70,7 @@
name = "head of security cap"
desc = "The robust standard-issue cap of the Head of Security. For showing the officers who's in charge."
icon_state = "hoscap"
- armor = list(melee = 80, bullet = 60, laser = 50, energy = 10, bomb = 25, bio = 10, rad = 0)
+ armor = list(melee = 40, bullet = 30, laser = 25, energy = 10, bomb = 25, bio = 10, rad = 0)
strip_delay = 80
/obj/item/clothing/head/HoS/beret
@@ -82,7 +82,7 @@
name = "warden's police hat"
desc = "It's a special armored hat issued to the Warden of a security force. Protects the head from impacts."
icon_state = "policehelm"
- armor = list(melee = 60, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 60
/obj/item/clothing/head/officer
@@ -90,20 +90,21 @@
desc = "A red cap with an old-fashioned badge on the front for establishing that you are, in fact, the law."
icon_state = "customshelm"
item_state = "customshelm"
- armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
+ strip_delay = 60
/obj/item/clothing/head/beret/sec
name = "security beret"
desc = "A beret with the security insignia emblazoned on it. For officers that are more inclined towards style than safety."
icon_state = "beret_officer"
- armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 60
/obj/item/clothing/head/beret/sec/warden
name = "warden's beret"
desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class."
icon_state = "beret_warden"
- armor = list(melee = 60, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 5, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
/obj/item/clothing/head/beret/eng
name = "engineering beret"
@@ -115,6 +116,11 @@
desc = "A beret for those who have shown immaculate proficienty in piping. Or plumbing."
icon_state = "beret_atmospherics"
+/obj/item/clothing/head/beret/ce
+ name = "chief engineer beret"
+ desc = "A white beret with the engineering insignia emblazoned on it. Its owner knows what they're doing. Probably."
+ icon_state = "beret_ce"
+
//Medical
/obj/item/clothing/head/surgery
name = "surgical cap"
@@ -136,4 +142,4 @@
/obj/item/clothing/head/surgery/black
desc = "A cap coroners wear during autopsies. Keeps their hair from falling into the cadavers. It is as dark than the coroner's humor."
- icon_state = "surgcap_black"
\ No newline at end of file
+ icon_state = "surgcap_black"
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 88af8bf4dd3..f7253a82cdf 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -5,7 +5,7 @@
icon_state = "centcom"
desc = "It's good to be emperor."
item_state = "centhat"
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 80
/obj/item/clothing/head/hairflower
@@ -25,6 +25,15 @@
icon_state = "pwig"
item_state = "pwig"
+/obj/item/clothing/head/beret/blue
+ icon_state = "beret_blue"
+
+/obj/item/clothing/head/beret/black
+ icon_state = "beret_black"
+
+/obj/item/clothing/head/beret/purple_normal
+ icon_state = "beret_purple_normal"
+
/obj/item/clothing/head/that
name = "top-hat"
desc = "It's an amish looking hat."
@@ -161,6 +170,12 @@
item_state = "boater_hat"
desc = "Goes well with celery."
+/obj/item/clothing/head/cowboyhat
+ name = "cowboy hat"
+ icon_state = "cowboyhat"
+ item_state = "fedora"
+ desc = "There's a new sheriff in town. Pass the whiskey."
+
/obj/item/clothing/head/fedora
name = "\improper fedora"
icon_state = "fedora"
@@ -325,7 +340,7 @@
throwforce = 3.0
throw_speed = 2
throw_range = 5
- w_class = 2.0
+ w_class = 2
attack_verb = list("warned", "cautioned", "smashed")
/obj/item/clothing/head/griffin
@@ -335,19 +350,12 @@
item_state = "griffinhat"
flags = BLOCKHAIR|NODROP
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
- action_button_name = "Caw"
+ actions_types = list(/datum/action/item_action/caw)
/obj/item/clothing/head/griffin/attack_self()
caw()
-/obj/item/clothing/head/griffin/verb/caw()
-
- set category = "Object"
- set name = "Caw"
- set src in usr
- if(!istype(usr, /mob/living)) return
- if(usr.stat) return
-
+/obj/item/clothing/head/griffin/proc/caw()
if(cooldown < world.time - 20) // A cooldown, to stop people being jerks
playsound(src.loc, "sound/misc/caw.ogg", 50, 1)
cooldown = world.time
@@ -363,4 +371,4 @@
name = "bloated human head"
desc = "A horribly bloated and mismatched human head."
icon_state = "lingspacehelmet"
- item_state = "lingspacehelmet"
\ No newline at end of file
+ item_state = "lingspacehelmet"
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 0fbb39e6f1b..703f36cf1fd 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -20,9 +20,9 @@
materials = list(MAT_METAL=1750, MAT_GLASS=400)
flash_protect = 2
tint = 2
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
- action_button_name = "flip welding helmet"
+ actions_types = list(/datum/action/item_action/toggle)
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
@@ -50,26 +50,28 @@
toggle()
/obj/item/clothing/head/welding/proc/toggle()
- set src in usr
+ if(up)
+ up = !up
+ flags |= (HEADCOVERSEYES | HEADCOVERSMOUTH)
+ flags_inv |= (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
+ icon_state = initial(icon_state)
+ to_chat(usr, "You flip the [src] down to protect your eyes.")
+ flash_protect = 2
+ tint = 2
+ else
+ up = !up
+ flags &= ~(HEADCOVERSEYES | HEADCOVERSMOUTH)
+ flags_inv &= ~(HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
+ icon_state = "[initial(icon_state)]up"
+ to_chat(usr, "You push the [src] up out of your face.")
+ flash_protect = 0
+ tint = 0
+ usr.update_inv_head() //so our mob-overlays update
+
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
- if(usr.canmove && !usr.stat && !usr.restrained())
- if(src.up)
- src.up = !src.up
- src.flags |= (HEADCOVERSEYES | HEADCOVERSMOUTH)
- flags_inv |= (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
- icon_state = initial(icon_state)
- to_chat(usr, "You flip the [src] down to protect your eyes.")
- flash_protect = 2
- tint = 2
- else
- src.up = !src.up
- src.flags &= ~(HEADCOVERSEYES | HEADCOVERSMOUTH)
- flags_inv &= ~(HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
- icon_state = "[initial(icon_state)]up"
- to_chat(usr, "You push the [src] up out of your face.")
- flash_protect = 0
- tint = 0
- usr.update_inv_head() //so our mob-overlays update
/*
@@ -96,13 +98,13 @@
if(M.l_hand == src || M.r_hand == src || M.head == src)
location = M.loc
- if (istype(location, /turf))
+ if(istype(location, /turf))
location.hotspot_expose(700, 1)
/obj/item/clothing/head/cakehat/attack_self(mob/user as mob)
if(status > 1) return
src.onfire = !( src.onfire )
- if (src.onfire)
+ if(src.onfire)
src.force = 3
src.damtype = "fire"
src.icon_state = "cake1"
@@ -148,8 +150,7 @@
flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
- action_button_name = "Toggle Pumpkin Light"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
brightness_on = 2 //luminosity when on
@@ -160,8 +161,7 @@
item_state = "hardhat0_reindeer"
item_color = "reindeer"
flags_inv = 0
- action_button_name = "Toggle Nose Light"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
brightness_on = 1 //luminosity when on
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index e14057b32b1..e7dae7d04da 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -90,7 +90,7 @@
desc = "It's baseball hat in tasteful red colour."
icon_state = "secsoft"
item_color = "sec"
- armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
strip_delay = 60
/obj/item/clothing/head/soft/sec/corp
diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm
index 66e97d714d8..25cdc259f92 100644
--- a/code/modules/clothing/masks/boxing.dm
+++ b/code/modules/clothing/masks/boxing.dm
@@ -6,8 +6,7 @@
flags = BLOCKHAIR
flags_inv = HIDEFACE
w_class = 2
- action_button_name = "Adjust Balaclava"
- ignore_maskadjust = 0
+ actions_types = list(/datum/action/item_action/adjust)
adjusted_flags = SLOT_HEAD
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
sprite_sheets = list(
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index 40811397187..5b3ab335cbe 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -7,8 +7,7 @@
w_class = 2
gas_transfer_coefficient = 0.10
permeability_coefficient = 0.50
- action_button_name = "Adjust Breath Mask"
- ignore_maskadjust = 0
+ actions_types = list(/datum/action/item_action/adjust)
species_fit = list("Vox", "Vox Armalis", "Unathi", "Tajaran", "Vulpkanin")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
@@ -38,5 +37,4 @@
item_state = "voxmask"
permeability_coefficient = 0.01
species_restricted = list("Vox")
- action_button_name = null
- ignore_maskadjust = 1
+ actions_types = list()
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 6f6d0f03446..72b4b6febb7 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -4,7 +4,7 @@
icon_state = "gas_alt"
flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE
- w_class = 3.0
+ w_class = 3
item_state = "gas_alt"
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
@@ -27,37 +27,35 @@
materials = list(MAT_METAL=4000, MAT_GLASS=2000)
flash_protect = 2
tint = 2
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
origin_tech = "materials=2;engineering=2"
- action_button_name = "Toggle Welding Helmet"
+ actions_types = list(/datum/action/item_action/toggle)
/obj/item/clothing/mask/gas/welding/attack_self()
toggle()
+/obj/item/clothing/mask/gas/welding/proc/toggle()
+ if(up)
+ up = !src.up
+ flags |= (MASKCOVERSEYES)
+ flags_inv |= (HIDEEYES)
+ icon_state = initial(icon_state)
+ to_chat(usr, "You flip the [src] down to protect your eyes.")
+ flash_protect = 2
+ tint = 2
+ else
+ up = !up
+ flags &= ~(MASKCOVERSEYES)
+ flags_inv &= ~(HIDEEYES)
+ icon_state = "[initial(icon_state)]up"
+ to_chat(usr, "You push the [src] up out of your face.")
+ flash_protect = 0
+ tint = 0
+ usr.update_inv_wear_mask() //so our mob-overlays update
-/obj/item/clothing/mask/gas/welding/verb/toggle()
- set category = "Object"
- set name = "Adjust welding mask"
- set src in usr
-
- if(usr.canmove && !usr.stat && !usr.restrained())
- if(src.up)
- src.up = !src.up
- src.flags |= (MASKCOVERSEYES)
- flags_inv |= (HIDEEYES)
- icon_state = initial(icon_state)
- to_chat(usr, "You flip the [src] down to protect your eyes.")
- flash_protect = 2
- tint = 2
- else
- src.up = !src.up
- src.flags &= ~(MASKCOVERSEYES)
- flags_inv &= ~(HIDEEYES)
- icon_state = "[initial(icon_state)]up"
- to_chat(usr, "You push the [src] up out of your face.")
- flash_protect = 0
- tint = 0
- usr.update_inv_wear_mask() //so our mob-overlays update
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
//Bane gas mask
/obj/item/clothing/mask/banemask
@@ -66,7 +64,7 @@
icon_state = "bane_mask"
flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE
- w_class = 3.0
+ w_class = 3
item_state = "bane_mask"
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
@@ -78,7 +76,7 @@
desc = "A modernised version of the classic design, this mask will not only filter out toxins but it can also be connected to an air supply."
icon_state = "plaguedoctor"
item_state = "gas_mask"
- armor = list(melee = 0, bullet = 0, laser = 2,energy = 2, bomb = 0, bio = 75, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 2, energy = 2, bomb = 0, bio = 75, rad = 0)
/obj/item/clothing/mask/gas/swat
name = "\improper SWAT mask"
@@ -166,19 +164,12 @@
desc = "Twoooo!"
icon_state = "owl"
flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | NODROP
- action_button_name = "Hoot"
+ actions_types = list(/datum/action/item_action/hoot)
/obj/item/clothing/mask/gas/owl_mask/attack_self()
hoot()
-/obj/item/clothing/mask/gas/owl_mask/verb/hoot()
-
- set category = "Object"
- set name = "Hoot"
- set src in usr
- if(!istype(usr, /mob/living)) return
- if(usr.stat) return
-
+/obj/item/clothing/mask/gas/owl_mask/proc/hoot()
if(cooldown < world.time - 35) // A cooldown, to stop people being jerks
playsound(src.loc, "sound/misc/hoot.ogg", 50, 1)
cooldown = world.time
@@ -190,26 +181,24 @@
/obj/item/clothing/mask/gas/sechailer
name = "security gas mask"
desc = "A standard issue Security gas mask with integrated 'Compli-o-nator 3000' device, plays over a dozen pre-recorded compliance phrases designed to get scumbags to stand still whilst you taze them. Do not tamper with the device."
- action_button_name = "HALT!"
icon_state = "sechailer"
var/aggressiveness = 2
var/safety = 1
- ignore_maskadjust = 0
- action_button_name = "HALT!"
+ actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/adjust)
/obj/item/clothing/mask/gas/sechailer/hos
name = "\improper HOS SWAT mask"
desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a tan stripe."
icon_state = "hosmask"
aggressiveness = 3
- ignore_maskadjust = 1
+ actions_types = list(/datum/action/item_action/halt)
/obj/item/clothing/mask/gas/sechailer/warden
name = "\improper Warden SWAT mask"
desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a blue stripe."
icon_state = "wardenmask"
aggressiveness = 3
- ignore_maskadjust = 1
+ actions_types = list(/datum/action/item_action/halt)
/obj/item/clothing/mask/gas/sechailer/swat
@@ -217,7 +206,7 @@
desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000."
icon_state = "officermask"
aggressiveness = 3
- ignore_maskadjust = 1
+ actions_types = list(/datum/action/item_action/halt)
/obj/item/clothing/mask/gas/sechailer/blue
name = "\improper blue SWAT mask"
@@ -225,7 +214,7 @@
icon_state = "blue_sechailer"
item_state = "blue_sechailer"
aggressiveness = 3
- ignore_maskadjust = 1
+ actions_types = list(/datum/action/item_action/halt)
/obj/item/clothing/mask/gas/sechailer/cyborg
name = "security hailer"
@@ -233,16 +222,13 @@
icon = 'icons/obj/device.dmi'
icon_state = "taperecorder_idle"
aggressiveness = 1 //Borgs are nicecurity!
- ignore_maskadjust = 1
+ actions_types = list(/datum/action/item_action/halt)
-/obj/item/clothing/mask/gas/sechailer/cyborg/New()
- ..()
- verbs -= /obj/item/clothing/mask/gas/sechailer/verb/adjust
-
-/obj/item/clothing/mask/gas/sechailer/verb/adjust()
- set category = "Object"
- set name = "Adjust Mask"
- adjustmask(usr)
+/obj/item/clothing/mask/gas/sechailer/ui_action_click(mob/user, actiontype)
+ if(actiontype == /datum/action/item_action/halt)
+ halt()
+ else
+ adjustmask(user)
/obj/item/clothing/mask/gas/sechailer/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/screwdriver))
@@ -275,13 +261,7 @@
else
return
-/obj/item/clothing/mask/gas/sechailer/verb/halt()
- set category = "Object"
- set name = "HALT"
- set src in usr
- if(!istype(usr, /mob/living)) return
- if(usr.stat) return
-
+/obj/item/clothing/mask/gas/sechailer/proc/halt()
var/phrase = 0 //selects which phrase to use
var/phrase_text = null
var/phrase_sound = null
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index d9817add99f..184d4c14c40 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -63,9 +63,8 @@
flags = MASKCOVERSMOUTH
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.01
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 25, rad = 0)
- action_button_name = "Adjust Sterile Mask"
- ignore_maskadjust = 0
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 25, rad = 0)
+ actions_types = list(/datum/action/item_action/adjust)
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
@@ -209,7 +208,6 @@
flags_inv = HIDEFACE
w_class = 1
slot_flags = SLOT_MASK
- ignore_maskadjust = 0
adjusted_flags = SLOT_HEAD
icon_state = "bandbotany"
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
@@ -219,7 +217,7 @@
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
)
- action_button_name = "Adjust Bandana"
+ actions_types = list(/datum/action/item_action/adjust)
/obj/item/clothing/mask/bandana/attack_self(var/mob/user)
adjustmask(user)
@@ -275,3 +273,28 @@ obj/item/clothing/mask/bandana/purple
icon_state = "bandblack"
item_color = "black"
desc = "It's a black bandana."
+
+/obj/item/clothing/mask/cursedclown
+ name = "cursed clown mask"
+ desc = "This is a very, very odd looking mask."
+ icon = 'icons/goonstation/objects/clothing/mask.dmi'
+ icon_state = "cursedclown"
+ item_state = "cclown_hat"
+ icon_override = 'icons/goonstation/mob/clothing/mask.dmi'
+ lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi'
+ righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi'
+ flags = NODROP
+
+/obj/item/clothing/mask/cursedclown/equipped(mob/user, slot)
+ ..()
+ var/mob/living/carbon/human/H = user
+ if(istype(H) && slot == slot_wear_mask)
+ to_chat(H, "[src] grips your face! ")
+ if(H.mind && H.mind.assigned_role != "Cluwne")
+ H.makeCluwne()
+
+/obj/item/clothing/mask/cursedclown/suicide_act(mob/user)
+ user.visible_message("[user] gazes into the eyes of [src]. [src] gazes back! ")
+ spawn(10)
+ user.gib()
+ return BRUTELOSS
diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm
index 1b7ea8fc4c9..22437ec451e 100644
--- a/code/modules/clothing/shoes/colour.dm
+++ b/code/modules/clothing/shoes/colour.dm
@@ -88,7 +88,7 @@
item_color = "orange"
/obj/item/clothing/shoes/orange/attack_self(mob/user as mob)
- if (src.chained)
+ if(src.chained)
src.chained = null
src.slowdown = SHOES_SLOWDOWN
new /obj/item/weapon/restraints/handcuffs( user.loc )
@@ -97,8 +97,8 @@
/obj/item/clothing/shoes/orange/attackby(obj/H, loc, params)
..()
- if (istype(H, /obj/item/weapon/restraints/handcuffs) && !chained && !(H.flags & NODROP))
- if (src.icon_state != "orange") return
+ if(istype(H, /obj/item/weapon/restraints/handcuffs) && !chained && !(H.flags & NODROP))
+ if(src.icon_state != "orange") return
qdel(H)
src.chained = 1
src.slowdown = 15
diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm
index 48b9ffa7589..2c6bdeddf87 100644
--- a/code/modules/clothing/shoes/magboots.dm
+++ b/code/modules/clothing/shoes/magboots.dm
@@ -5,23 +5,25 @@
var/magboot_state = "magboots"
var/magpulse = 0
var/slowdown_active = 2
- action_button_name = "Toggle Magboots"
+ actions_types = list(/datum/action/item_action/toggle)
strip_delay = 70
put_on_delay = 70
- species_restricted = null
/obj/item/clothing/shoes/magboots/attack_self(mob/user)
- if(src.magpulse)
- src.flags &= ~NOSLIP
- src.slowdown = SHOES_SLOWDOWN
+ if(magpulse)
+ flags &= ~NOSLIP
+ slowdown = SHOES_SLOWDOWN
else
- src.flags |= NOSLIP
- src.slowdown = slowdown_active
+ flags |= NOSLIP
+ slowdown = slowdown_active
magpulse = !magpulse
icon_state = "[magboot_state][magpulse]"
to_chat(user, "You [magpulse ? "enable" : "disable"] the mag-pulse traction system.")
user.update_inv_shoes() //so our mob-overlays update
user.update_gravity(user.mob_has_gravity())
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
/obj/item/clothing/shoes/magboots/negates_gravity()
return flags & NOSLIP
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index babeb811a37..229daee5c93 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -7,7 +7,6 @@
flags = NOSLIP
origin_tech = "syndicate=3"
var/list/clothing_choices = list()
- species_restricted = null
silence_steps = 1
/obj/item/clothing/shoes/mime
@@ -21,15 +20,14 @@
can_cut_open = 1
icon_state = "jackboots"
item_state = "jackboots"
- armor = list(melee = 50, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 10, rad = 0)
- species_restricted = null //Syndicate tech means even Tajarans can kick ass with these
+ armor = list(melee = 25, bullet = 25, laser = 25, energy = 25, bomb = 50, bio = 10, rad = 0)
strip_delay = 70
/obj/item/clothing/shoes/combat/swat //overpowered boots for death squads
name = "\improper SWAT shoes"
desc = "High speed, no drag combat boots."
permeability_coefficient = 0.01
- armor = list(melee = 80, bullet = 60, laser = 50, energy = 50, bomb = 50, bio = 30, rad = 30)
+ armor = list(melee = 40, bullet = 30, laser = 25, energy = 25, bomb = 50, bio = 30, rad = 30)
flags = NOSLIP
/obj/item/clothing/shoes/sandal
@@ -38,7 +36,6 @@
icon_state = "wizard"
strip_delay = 50
put_on_delay = 50
- species_restricted = null
/obj/item/clothing/shoes/sandal/marisa
desc = "A pair of magic, black shoes."
@@ -54,7 +51,6 @@
slowdown = SHOES_SLOWDOWN+1
strip_delay = 50
put_on_delay = 50
- species_restricted = null
/obj/item/clothing/shoes/galoshes/dry
name = "absorbent galoshes"
@@ -74,7 +70,6 @@
slowdown = SHOES_SLOWDOWN+1
item_color = "clown"
var/footstep = 1 //used for squeeks whilst walking
- species_restricted = null
silence_steps = 1
shoe_sound = "clownstep"
@@ -97,7 +92,12 @@
can_cut_open = 0
icon_state = "jacksandal"
item_color = "jacksandal"
- species_restricted = null
+
+/obj/item/clothing/shoes/workboots
+ name = "work boots"
+ desc = "Thick-soled boots for industrial work environments."
+ can_cut_open = 1
+ icon_state = "workboots"
/obj/item/clothing/shoes/cult
name = "boots"
@@ -110,7 +110,6 @@
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
heat_protection = FEET
max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
- species_restricted = null
/obj/item/clothing/shoes/cyborg
name = "cyborg boots"
@@ -122,7 +121,6 @@
desc = "Fluffy!"
icon_state = "slippers"
item_state = "slippers"
- species_restricted = null
/obj/item/clothing/shoes/slippers_worn
name = "worn bunny slippers"
@@ -143,7 +141,6 @@
item_state = "roman"
strip_delay = 100
put_on_delay = 100
- species_restricted = null
/obj/item/clothing/shoes/centcom
name = "dress shoes"
@@ -178,7 +175,7 @@
desc = "Looks sneaky."
icon_state = "sheet-cloth"
-/datum/table_recipe/shoe_rags
+/datum/crafting_recipe/shoe_rags
name = "Shoe Rags"
result = /obj/item/shoe_silencer
@@ -192,12 +189,21 @@
desc = "Medical sandals that nerds wear."
icon_state = "medsandal"
item_color = "medsandal"
- species_restricted = null
/obj/item/clothing/shoes/sandal/fancy
name = "Fancy Sandals"
desc = "FANCY!!."
icon_state = "fancysandal"
item_color = "fancysandal"
- species_restricted = null
+/obj/item/clothing/shoes/cursedclown
+ name = "cursed clown shoes"
+ desc = "Moldering clown flip flops. They're neon green for some reason."
+ icon = 'icons/goonstation/objects/clothing/feet.dmi'
+ icon_state = "cursedclown"
+ item_state = "cclown_shoes"
+ icon_override = 'icons/goonstation/mob/clothing/feet.dmi'
+ lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi'
+ righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi'
+ flags = NODROP
+ shoe_sound = "clownstep"
diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm
index d5fcbdf3251..f8a18749644 100644
--- a/code/modules/clothing/spacesuits/alien.dm
+++ b/code/modules/clothing/spacesuits/alien.dm
@@ -2,8 +2,6 @@
/obj/item/clothing/head/helmet/space/skrell
name = "Skrellian helmet"
desc = "Smoothly contoured and polished to a shine. Still looks like a fishbowl."
- armor = list(melee = 20, bullet = 20, laser = 50,energy = 50, bomb = 50, bio = 100, rad = 100)
- max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
species_restricted = list("Skrell","Human")
/obj/item/clothing/head/helmet/space/skrell/white
@@ -19,10 +17,6 @@
/obj/item/clothing/suit/space/skrell
name = "Skrellian hardsuit"
desc = "Seems like a wetsuit with reinforced plating seamlessly attached to it. Very chic."
- armor = list(melee = 20, bullet = 20, laser = 50,energy = 50, bomb = 50, bio = 100, rad = 100)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd)
- heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
- max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
species_restricted = list("Skrell","Human")
/obj/item/clothing/suit/space/skrell/white
@@ -37,9 +31,6 @@
//Unathi space gear. Huge and restrictive.
/obj/item/clothing/head/helmet/space/unathi
- armor = list(melee = 40, bullet = 30, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 50)
- heat_protection = HEAD
- max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
species_restricted = list("Unathi")
/obj/item/clothing/head/helmet/space/unathi/helmet_cheap
@@ -50,10 +41,6 @@
item_color = "unathi_helm_cheap"
/obj/item/clothing/suit/space/unathi
- armor = list(melee = 40, bullet = 30, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 50)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd)
- heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
- max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
species_restricted = list("Unathi")
/obj/item/clothing/suit/space/unathi/rig_cheap
@@ -61,7 +48,6 @@
desc = "A cheap NT knock-off of a Unathi battle-rig. Looks like a fish, moves like a fish, steers like a cow."
icon_state = "rig-unathi-cheap"
item_state = "rig-unathi-cheap"
- slowdown = 3
/obj/item/clothing/head/helmet/space/unathi/breacher
name = "breacher helm"
@@ -76,15 +62,13 @@
icon_state = "unathi_breacher"
item_state = "unathi_breacher"
item_color = "unathi_breacher"
- slowdown = 1
// Vox space gear (vaccuum suit, low pressure armour)
// Can't be equipped by any other species due to bone structure and vox cybernetics.
/obj/item/clothing/suit/space/vox
w_class = 3
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
- slowdown = 2
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 40, bullet = 40, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
species_restricted = list("Vox", "Vox Armalis")
@@ -94,7 +78,7 @@
)
/obj/item/clothing/head/helmet/space/vox
- armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 40, bullet = 40, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
flags = HEADCOVERSEYES|STOPSPRESSUREDMAGE
species_restricted = list("Vox","Vox Armalis")
sprite_sheets = list(
@@ -198,10 +182,8 @@
"Vox Armalis" = 'icons/mob/species/armalis/feet.dmi'
)
- action_button_name = "Toggle the magclaws"
-
/obj/item/clothing/shoes/magboots/vox/attack_self(mob/user)
- if(src.magpulse)
+ if(magpulse)
flags &= ~NOSLIP
magpulse = 0
flags |= NODROP
@@ -211,7 +193,7 @@
if(!ishuman(user))
return
var/mob/living/carbon/human/H = user
- if (H.shoes != src)
+ if(H.shoes != src)
to_chat(user, "You will have to put on the [src] before you can do that.")
return
@@ -233,7 +215,7 @@
/obj/item/clothing/shoes/magboots/vox/examine(mob/user)
..(user)
- if (magpulse)
+ if(magpulse)
to_chat(user, "It would be hard to take these off without relaxing your grip first.")//theoretically this message should only be seen by the wearer when the claws are equipped.
diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm
index a7f8baf7a7a..9d2b2a06198 100644
--- a/code/modules/clothing/spacesuits/breaches.dm
+++ b/code/modules/clothing/spacesuits/breaches.dm
@@ -106,7 +106,7 @@ var/global/list/breach_burn_descriptors = list(
if(existing.damtype != damtype)
continue
- if (existing.class < 5)
+ if(existing.class < 5)
var/needs = 5 - existing.class
if(amount < needs)
existing.class += amount
@@ -120,7 +120,7 @@ var/global/list/breach_burn_descriptors = list(
else if(existing.damtype == BURN)
T.visible_message("\The [existing.descriptor] on [src] widens! ")
- if (amount)
+ if(amount)
//Spawn a new breach.
var/datum/breach/B = new()
breaches += B
@@ -200,7 +200,7 @@ var/global/list/breach_burn_descriptors = list(
to_chat(user, "\red How do you intend to patch a hardsuit while someone is wearing it?")
return
- if (!damage || ! brute_damage)
+ if(!damage || ! brute_damage)
to_chat(user, "There is no structural damage on \the [src] to repair.")
return
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index 334e659302b..6348f32aa11 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -22,8 +22,7 @@
desc = "An advanced spacesuit equipped with teleportation and anti-compression technology"
icon_state = "chronosuit"
item_state = "chronosuit"
- action_button_name = "Toggle Chronosuit"
- slowdown = 2
+ actions_types = list(/datum/action/item_action/toggle)
armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90)
var/obj/item/clothing/head/helmet/space/chronos/helmet = null
var/obj/effect/chronos_cam/camera = null
diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm
index 91824a9856e..d5c4d5626bb 100644
--- a/code/modules/clothing/spacesuits/ert.dm
+++ b/code/modules/clothing/spacesuits/ert.dm
@@ -4,7 +4,7 @@
desc = "A helmet worn by members of the Nanotrasen Emergency Response Team. Armoured and space ready."
icon_state = "rig0-ert_commander"
item_state = "helm-command"
- armor = list(melee = 50, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 60)
+ armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
rig_restrict_helmet = 0 // ERT helmets can be taken on and off at will.
var/obj/machinery/camera/camera
strip_delay = 130
@@ -30,8 +30,7 @@
item_state = "suit-command"
w_class = 3
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
- slowdown = 1
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 60)
+ armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \
/obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, \
/obj/item/device/radio, /obj/item/device/analyzer, /obj/item/weapon/gun/energy/laser, /obj/item/weapon/gun/energy/pulse, \
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index aab36bb04cb..1c7deb94970 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -6,7 +6,7 @@
desc = "A special helmet designed for only the most fashionable of military figureheads."
flags_inv = HIDEFACE
permeability_coefficient = 0.01
- armor = list(melee = 65, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
+ armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
species_restricted = list("exclude", "Diona", "Wryn")
species_fit = list("Vox")
sprite_sheets = list(
@@ -14,10 +14,13 @@
"Drask" = 'icons/mob/species/drask/helmet.dmi'
)
/obj/item/clothing/head/helmet/space/capspace/equipped(var/mob/living/carbon/human/user, var/slot)
- if (ishuman(user) && user.species.name == "Vox")
- flags &= ~BLOCKHAIR
- else
- flags |= BLOCKHAIR
+ if(ishuman(user) && slot == slot_head)
+ if(user.species.name == "Vox")
+ if(flags & BLOCKHAIR)
+ flags &= ~BLOCKHAIR
+ else
+ if((initial(flags) & BLOCKHAIR) && !(flags & BLOCKHAIR))
+ flags |= BLOCKHAIR
/obj/item/clothing/suit/space/captain
name = "captain's space suit"
@@ -26,8 +29,7 @@
item_state = "capspacesuit"
w_class = 4
allowed = list(/obj/item/weapon/tank, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
- slowdown = 1
- armor = list(melee = 65, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
+ armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
species_restricted = list("exclude", "Diona", "Wryn")
species_fit = list("Vox")
sprite_sheets = list(
@@ -56,8 +58,7 @@
icon_state = "deathsquad"
item_state = "swat_suit"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank,/obj/item/weapon/kitchen/knife/combat)
- armor = list(melee = 80, bullet = 80, laser = 50,energy = 50, bomb = 100, bio = 100, rad = 100)
- slowdown = 1
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
unacidable = 1
strip_delay = 130
@@ -69,14 +70,14 @@
icon_state = "heavy"
item_state = "swat_suit"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank,/obj/item/weapon/kitchen/knife/combat)
- armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0)
+ armor = list(melee = 40, bullet = 30, laser = 30, energy = 30, bomb = 50, bio = 90, rad = 20)
strip_delay = 120
/obj/item/clothing/head/helmet/space/deathsquad/beret
name = "officer's beret"
desc = "An armored beret commonly used by special operations officers."
icon_state = "beret_officer"
- armor = list(melee = 65, bullet = 55, laser = 35,energy = 20, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 65, bullet = 55, laser = 35, energy = 20, bomb = 30, bio = 30, rad = 30)
/obj/item/clothing/suit/space/deathsquad/officer
name = "officer jacket"
@@ -101,7 +102,8 @@
icon_state = "santa"
item_state = "santa"
slowdown = 0
- flags = ONESIZEFITSALL | STOPSPRESSUREDMAGE
+ flags = STOPSPRESSUREDMAGE
+ flags_size = ONESIZEFITSALL
allowed = list(/obj/item) //for stuffing exta special presents
@@ -111,7 +113,7 @@
desc = "Yarr."
icon_state = "pirate"
item_state = "pirate"
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 30, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
flags = HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE
strip_delay = 40
put_on_delay = 20
@@ -124,7 +126,7 @@
w_class = 3
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
slowdown = 0
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 30, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
strip_delay = 40
put_on_delay = 20
@@ -146,8 +148,7 @@
icon_state = "spacenew"
item_state = "s_suit"
desc = "A lightweight space suit with the basic ability to protect the wearer from the vacuum of space during emergencies."
- slowdown = 1
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
/obj/item/clothing/head/helmet/space/eva
name = "EVA helmet"
@@ -155,7 +156,7 @@
item_state = "s_helmet"
desc = "A lightweight space helmet with the basic ability to protect the wearer from the vacuum of space during emergencies."
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flash_protect = 0
//Mime's Hardsuit
@@ -192,7 +193,7 @@
desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle."
icon_state = "griffinhat"
item_state = "griffinhat"
- armor = list(melee = 40, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 20, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100)
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
strip_delay = 130
@@ -203,8 +204,7 @@
icon_state = "freedom"
item_state = "freedom"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
- armor = list(melee = 40, bullet = 40, laser = 30,energy = 25, bomb = 100, bio = 100, rad = 100)
- slowdown = 1
+ armor = list(melee = 20, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100)
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
strip_delay = 130
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index fd4122c56ec..de2cfc0eda5 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -5,13 +5,13 @@
desc = "A special containment suit designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
slowdown = 0
- armor = list(melee = 0, bullet = 0, laser = 0 ,energy = 0, bomb = 0, bio = 100, rad = 20)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
species_restricted = list("Plasmaman")
- flags = STOPSPRESSUREDMAGE | PLASMAGUARD
+ flags = STOPSPRESSUREDMAGE
icon_state = "plasmaman_suit"
item_state = "plasmaman_suit"
@@ -38,7 +38,7 @@
/obj/item/clothing/head/helmet/space/eva/plasmaman
name = "plasmaman helmet"
desc = "A special containment helmet designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
- flags = STOPSPRESSUREDMAGE | PLASMAGUARD
+ flags = STOPSPRESSUREDMAGE
species_restricted = list("Plasmaman")
icon_state = "plasmaman_helmet0"
@@ -46,13 +46,9 @@
var/base_state = "plasmaman_helmet"
var/brightness_on = 4 //luminosity when on
var/on = 0
- action_button_name = "Toggle Helmet Light"
+ actions_types = list(/datum/action/item_action/toggle_helmet_light)
/obj/item/clothing/head/helmet/space/eva/plasmaman/attack_self(mob/user)
- if(!isturf(user.loc))
- to_chat(user, "You cannot turn the light on while in this [user.loc]. ")//To prevent some lighting anomalities.
-
- return
toggle_light(user)
/obj/item/clothing/head/helmet/space/eva/plasmaman/proc/toggle_light(mob/user)
@@ -68,6 +64,10 @@
var/mob/living/carbon/human/H = user
H.update_inv_head()
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
+
// ENGINEERING
/obj/item/clothing/suit/space/eva/plasmaman/assistant
name = "plasmaman assistant suit"
@@ -185,14 +185,14 @@
/obj/item/clothing/suit/space/eva/plasmaman/miner
name = "plasmaman miner suit"
icon_state = "plasmamanMiner_suit"
- armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
- slowdown = 2
+ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
+ slowdown = 1
/obj/item/clothing/head/helmet/space/eva/plasmaman/miner
name = "plasmaman miner helmet"
icon_state = "plasmamanMiner_helmet0"
base_state = "plasmamanMiner_helmet"
- armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
+ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
// MEDSCI
@@ -266,13 +266,13 @@
/obj/item/clothing/suit/space/eva/plasmaman/security
name = "plasmaman security suit"
icon_state = "plasmamanSecurity_suit"
- armor = list(melee = 30, bullet = 15, laser = 30,energy = 10, bomb = 10, bio = 100, rad = 50)
+ armor = list(melee = 15, bullet = 15, laser = 15, energy = 10, bomb = 10, bio = 100, rad = 50)
/obj/item/clothing/head/helmet/space/eva/plasmaman/security
name = "plasmaman security helmet"
icon_state = "plasmamanSecurity_helmet0"
base_state = "plasmamanSecurity_helmet"
- armor = list(melee = 30, bullet = 15, laser = 30,energy = 10, bomb = 10, bio = 100, rad = 50)
+ armor = list(melee = 15, bullet = 15, laser = 15, energy = 10, bomb = 10, bio = 100, rad = 50)
/obj/item/clothing/suit/space/eva/plasmaman/security/hos
name = "plasmaman head of security suit"
diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm
index ce73bb13a24..355b511c391 100644
--- a/code/modules/clothing/spacesuits/rig.dm
+++ b/code/modules/clothing/spacesuits/rig.dm
@@ -10,7 +10,7 @@
var/brightness_on = 4 //luminosity when on
var/on = 0
item_color = "engineering" //Determines used sprites: rig[on]-[color] and rig[on]-[color]2 (lying down sprite)
- action_button_name = "Toggle Helmet Light"
+ actions_types = list(/datum/action/item_action/toggle_helmet_light)
//Species-specific stuff.
species_restricted = list("exclude","Diona","Wryn")
@@ -31,10 +31,6 @@
)
/obj/item/clothing/head/helmet/space/rig/attack_self(mob/user)
- if(!isturf(user.loc))
- to_chat(user, "You cannot turn the light on while in this [user.loc]. ")//To prevent some lighting anomalities.
-
- return
toggle_light(user)
/obj/item/clothing/head/helmet/space/rig/proc/toggle_light(mob/user)
@@ -50,12 +46,19 @@
var/mob/living/carbon/human/H = user
H.update_inv_head()
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
+
+/obj/item/clothing/head/helmet/space/rig/item_action_slot_check(slot)
+ if(slot == slot_head)
+ return 1
+
/obj/item/clothing/suit/space/rig
name = "hardsuit"
desc = "A special space suit for environments that might pose hazards beyond just the vacuum of space. Provides more protection than a standard space suit."
icon_state = "rig-engineering"
item_state = "eng_hardsuit"
- slowdown = 2
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
siemens_coefficient = 0
@@ -247,7 +250,6 @@
desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
icon_state = "rig-engineering"
item_state = "eng_hardsuit"
- slowdown = 2
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
@@ -279,14 +281,14 @@
item_state = "mining_helm"
item_color = "mining"
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE
- armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
+ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
/obj/item/clothing/suit/space/rig/mining
icon_state = "rig-mining"
name = "mining hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has reinforced plating."
item_state = "mining_hardsuit"
- armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
+ armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/pickaxe)
@@ -294,23 +296,18 @@
/obj/item/clothing/head/helmet/space/rig/syndi
name = "blood-red hardsuit helmet"
desc = "A dual-mode advanced helmet designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
- icon_state = "hardsuit1-syndi"
+ icon_state = "rig1-syndi"
item_state = "syndie_helm"
item_color = "syndi"
- armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
on = 1
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL
- action_button_name = "Toggle Helmet Mode"
+ actions_types = list(/datum/action/item_action/toggle_helmet_mode)
/obj/item/clothing/head/helmet/space/rig/syndi/update_icon()
- icon_state = "hardsuit[on]-[item_color]"
+ icon_state = "rig[on]-[item_color]"
/obj/item/clothing/head/helmet/space/rig/syndi/attack_self(mob/user)
- if(!isturf(user.loc))
- to_chat(user, "You cannot toggle your helmet while in this [user.loc].")//To prevent some lighting anomalities.
-
- return
-
on = !on
if(on)
to_chat(user, "You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor. ")
@@ -333,21 +330,24 @@
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
user.update_inv_head()
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
+
/obj/item/clothing/suit/space/rig/syndi
name = "blood-red hardsuit"
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
- icon_state = "hardsuit1-syndi"
+ icon_state = "rig1-syndi"
item_state = "syndie_hardsuit"
item_color = "syndi"
- slowdown = 1
w_class = 3
var/on = 1
- action_button_name = "Toggle Hardsuit Mode"
- armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
+ actions_types = list(/datum/action/item_action/toggle_hardsuit_mode)
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
/obj/item/clothing/suit/space/rig/syndi/update_icon()
- icon_state = "hardsuit[on]-[item_color]"
+ icon_state = "rig[on]-[item_color]"
/obj/item/clothing/suit/space/rig/syndi/attack_self(mob/user)
on = !on
@@ -373,13 +373,17 @@
user.update_inv_wear_suit()
user.update_inv_w_uniform()
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
+
//Elite Syndie suit
/obj/item/clothing/head/helmet/space/rig/syndi/elite
name = "elite syndicate hardsuit helmet"
desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in travel mode. Property of Gorlex Marauders."
- icon_state = "hardsuit0-syndielite"
+ icon_state = "rig0-syndielite"
item_color = "syndielite"
- armor = list(melee = 80, bullet = 70, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70)
+ armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70)
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
sprite_sheets = null
@@ -396,9 +400,9 @@
/obj/item/clothing/suit/space/rig/syndi/elite
name = "elite syndicate hardsuit"
desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in travel mode."
- icon_state = "hardsuit0-syndielite"
+ icon_state = "rig0-syndielite"
item_color = "syndielite"
- armor = list(melee = 80, bullet = 70, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70)
+ armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
sprite_sheets = null
@@ -420,7 +424,7 @@
item_state = "wiz_helm"
item_color = "wiz"
unacidable = 1 //No longer shall our kind be foiled by lone chemists with spray bottles!
- armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60)
+ armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50)
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
@@ -431,10 +435,9 @@
name = "gem-encrusted hardsuit"
desc = "A bizarre gem-encrusted suit that radiates magical energies."
item_state = "wiz_hardsuit"
- slowdown = 1
w_class = 3
unacidable = 1
- armor = list(melee = 40, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 100, rad = 50)
+ armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/weapon/teleportation_scroll,/obj/item/weapon/tank)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
@@ -458,7 +461,6 @@
name = "medical hardsuit"
desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra comfort."
item_state = "medical_hardsuit"
- slowdown = 1
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical,/obj/item/device/rad_laser)
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
@@ -469,7 +471,7 @@
icon_state = "rig0-sec"
item_state = "sec_helm"
item_color = "sec"
- armor = list(melee = 30, bullet = 15, laser = 30,energy = 10, bomb = 10, bio = 100, rad = 50)
+ armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
/obj/item/clothing/suit/space/rig/security
icon_state = "rig-sec"
@@ -507,7 +509,7 @@
icon_state = "rig0-singuloth"
item_state = "singuloth_helm"
item_color = "singuloth"
- armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 100)
+ armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 100)
/obj/item/clothing/suit/space/rig/singuloth
icon_state = "rig-singuloth"
@@ -515,4 +517,100 @@
desc = "This is a ceremonial armor from the chapter of the Singuloth Knights. It's made of pure forged adamantium."
item_state = "singuloth_hardsuit"
flags = STOPSPRESSUREDMAGE
- armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 100)
+ armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 100)
+
+
+/obj/item/clothing/head/helmet/space/rig/security/hos
+ name = "head of security's hardsuit helmet"
+ desc = "a special bulky helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor."
+ icon_state = "rig0-hos"
+ item_color = "hos"
+ armor = list(melee = 45, bullet = 25, laser = 30,energy = 10, bomb = 25, bio = 100, rad = 50)
+ sprite_sheets = null
+
+
+/obj/item/clothing/suit/space/rig/security/hos
+ icon_state = "rig-hos"
+ name = "head of security's hardsuit"
+ desc = "A special bulky suit that protects against hazardous, low pressure environments. Has an additional layer of armor."
+ armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
+ sprite_sheets = null
+
+
+/////////////SHIELDED//////////////////////////////////
+
+/obj/item/clothing/suit/space/rig/shielded
+ name = "shielded hardsuit"
+ desc = "A hardsuit with built in energy shielding. Will rapidly recharge when not under fire."
+ icon_state = "rig-hos"
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank, /obj/item/weapon/gun,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
+ armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
+ var/current_charges = 3
+ var/max_charges = 3 //How many charges total the shielding has
+ var/recharge_delay = 200 //How long after we've been shot before we can start recharging. 20 seconds here
+ var/recharge_cooldown = 0 //Time since we've last been shot
+ var/recharge_rate = 1 //How quickly the shield recharges once it starts charging
+ var/shield_state = "shield-old"
+ var/shield_on = "shield-old"
+ sprite_sheets = null
+
+/obj/item/clothing/suit/space/rig/shielded/hit_reaction(mob/living/carbon/human/owner, attack_text)
+ if(current_charges > 0)
+ var/datum/effect/system/spark_spread/s = new
+ s.set_up(2, 1, src)
+ s.start()
+ owner.visible_message("[owner]'s shields deflect [attack_text] in a shower of sparks! ")
+ current_charges--
+ recharge_cooldown = world.time + recharge_delay
+ processing_objects |= src
+ if(current_charges <= 0)
+ owner.visible_message("[owner]'s shield overloads!")
+ shield_state = "broken"
+ owner.update_inv_wear_suit()
+ return 1
+ return 0
+
+
+/obj/item/clothing/suit/space/rig/shielded/Destroy()
+ processing_objects.Remove(src)
+ return ..()
+
+/obj/item/clothing/suit/space/rig/shielded/process()
+ if(world.time > recharge_cooldown && current_charges < max_charges)
+ current_charges = Clamp((current_charges + recharge_rate), 0, max_charges)
+ playsound(loc, 'sound/magic/Charge.ogg', 50, 1)
+ if(current_charges == max_charges)
+ playsound(loc, 'sound/machines/ding.ogg', 50, 1)
+ processing_objects.Remove(src)
+ shield_state = "[shield_on]"
+ if(istype(loc, /mob/living/carbon/human))
+ var/mob/living/carbon/human/C = loc
+ C.update_inv_wear_suit()
+
+//////Syndicate Version
+
+/obj/item/clothing/suit/space/rig/shielded/syndi
+ name = "blood-red hardsuit"
+ desc = "An advanced hardsuit with built in energy shielding."
+ icon_state = "rig1-syndi"
+ item_state = "syndie_hardsuit"
+ item_color = "syndi"
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
+ allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
+ slowdown = 0
+ sprite_sheets = list(
+ "Unathi" = 'icons/mob/species/unathi/suit.dmi',
+ "Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
+ "Skrell" = 'icons/mob/species/skrell/suit.dmi',
+ "Vox" = 'icons/mob/species/vox/suit.dmi',
+ "Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi',
+ "Drask" = 'icons/mob/species/drask/suit.dmi'
+ )
+
+/obj/item/clothing/head/helmet/space/rig/shielded/syndi
+ name = "blood-red hardsuit helmet"
+ desc = "An advanced hardsuit helmet with built in energy shielding."
+ icon_state = "rig1-syndi"
+ item_state = "syndie_helm"
+ item_color = "syndi"
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm
index 087b34dd756..46471966aa7 100644
--- a/code/modules/clothing/spacesuits/rig/modules/utility.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm
@@ -337,7 +337,7 @@
/obj/item/rig_module/maneuvering_jets/engage()
if(!..())
return 0
- jets.toggle_rockets()
+ jets.toggle_stabilization(usr)
return 1
/obj/item/rig_module/maneuvering_jets/activate()
@@ -354,15 +354,13 @@
suit_overlay = null
holder.update_icon()
- if(!jets.on)
- jets.toggle()
+ jets.turn_on()
return 1
/obj/item/rig_module/maneuvering_jets/deactivate()
if(!..())
return 0
- if(jets.on)
- jets.toggle()
+ jets.turn_off()
return 1
/obj/item/rig_module/maneuvering_jets/New()
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index 6e3fcffa7cf..fccf464607b 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -17,7 +17,7 @@
w_class = 4
// These values are passed on to all component pieces.
- armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20)
+ armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
siemens_coefficient = 0.2
@@ -82,13 +82,13 @@
var/datum/effect/system/spark_spread/spark_system
/obj/item/weapon/rig/examine()
- to_chat(usr, "This is \icon[src][src.name].")
+ to_chat(usr, "This is [bicon(src)][src.name].")
to_chat(usr, "[src.desc]")
if(wearer)
for(var/obj/item/piece in list(helmet,gloves,chest,boots))
if(!piece || piece.loc != wearer)
continue
- to_chat(usr, "\icon[piece] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed.")
+ to_chat(usr, "[bicon(piece)] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed.")
if(src.loc == usr)
to_chat(usr, "The maintenance panel is [open ? "open" : "closed"].")
@@ -431,7 +431,7 @@
if(!offline)
if(istype(wearer))
if(flags & NODROP)
- if (offline_slowdown < 3)
+ if(offline_slowdown < 3)
to_chat(wearer, "Your suit beeps stridently, and suddenly goes dead. ")
else
to_chat(wearer, "Your suit beeps stridently, and suddenly you're wearing a leaden mass of metal and plastic composites instead of a powered suit. ")
@@ -576,7 +576,7 @@
data["modules"] = module_list
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, ((src.loc != user) ? ai_interface_path : interface_path), interface_title, 480, 550, state = nano_state)
ui.set_initial_data(data)
ui.open()
@@ -819,7 +819,7 @@
take_hit((100/severity_class), "electrical pulse", 1)
/obj/item/weapon/rig/proc/shock(mob/user)
- if (electrocute_mob(user, cell, src)) //electrocute_mob() handles removing charge from the cell, no need to do that here.
+ if(electrocute_mob(user, cell, src)) //electrocute_mob() handles removing charge from the cell, no need to do that here.
spark_system.start()
if(user.stunned)
return 1
diff --git a/code/modules/clothing/spacesuits/rig/suits/alien.dm b/code/modules/clothing/spacesuits/rig/suits/alien.dm
index 5f43c172a39..8632b6cc472 100644
--- a/code/modules/clothing/spacesuits/rig/suits/alien.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/alien.dm
@@ -3,13 +3,13 @@
desc = "A cheap NT knock-off of an Unathi battle-rig. Looks like a fish, moves like a fish, steers like a cow."
suit_type = "NT breacher"
icon_state = "breacher_rig_cheap"
- armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 70, bio = 100, rad = 50)
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 30, bomb = 45, bio = 100, rad = 50)
emp_protection = -20
slowdown = 6
offline_slowdown = 10
vision_restriction = 1
offline_vision_restriction = 2
-
+
chest_type = /obj/item/clothing/suit/space/new_rig
helm_type = /obj/item/clothing/head/helmet/space/new_rig/unathi
boot_type = /obj/item/clothing/shoes/magboots/rig/unathi
@@ -19,7 +19,7 @@
desc = "An authentic Unathi breacher chassis. Huge, bulky and absurdly heavy. It must be like wearing a tank."
suit_type = "breacher chassis"
icon_state = "breacher_rig"
- armor = list(melee = 90, bullet = 90, laser = 90, energy = 90, bomb = 90, bio = 100, rad = 80) //Takes TEN TIMES as much damage to stop someone in a breacher. In exchange, it's slow.
+ armor = list(melee = 45, bullet = 45, laser = 45, energy = 45, bomb = 45, bio = 100, rad = 75) //Takes TEN TIMES as much damage to stop someone in a breacher. In exchange, it's slow. //Whoever made this was on meth
vision_restriction = 0
/obj/item/clothing/head/helmet/space/new_rig/unathi
@@ -27,6 +27,6 @@
/obj/item/clothing/suit/space/new_rig/unathi
species_restricted = list("Unathi")
-
+
/obj/item/clothing/shoes/magboots/rig/unathi
species_restricted = list("Unathi")
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/rig/suits/combat.dm b/code/modules/clothing/spacesuits/rig/suits/combat.dm
index cd37189a080..98adb708ada 100644
--- a/code/modules/clothing/spacesuits/rig/suits/combat.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/combat.dm
@@ -5,7 +5,7 @@
desc = "A sleek and dangerous hardsuit for active combat."
icon_state = "security_rig"
suit_type = "combat hardsuit"
- armor = list(melee = 80, bullet = 65, laser = 50, energy = 15, bomb = 80, bio = 100, rad = 60)
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
slowdown = 1
offline_slowdown = 3
offline_vision_restriction = 1
diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm
index f10a859af9a..4aed2a53f30 100644
--- a/code/modules/clothing/spacesuits/rig/suits/ert.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm
@@ -10,7 +10,7 @@
req_access = list(access_cent_specops)
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100)
+ armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \
/obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, \
/obj/item/device/radio, /obj/item/device/analyzer,/obj/item/weapon/storage/briefcase/inflatable, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, \
@@ -27,7 +27,6 @@
desc = "A suit worn by the engineering division of an Emergency Response Team. Has orange highlights. Armoured and space ready."
suit_type = "ERT engineer"
icon_state = "ert_engineer_rig"
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 100)
siemens_coefficient = 0
initial_modules = list(
@@ -68,7 +67,6 @@
desc = "A heavy suit worn by the highest level of Asset Protection, don't mess with the person wearing this. Armoured and space ready."
suit_type = "heavy asset protection"
icon_state = "asset_protection_rig"
- armor = list(melee = 60, bullet = 50, laser = 50,energy = 40, bomb = 40, bio = 100, rad = 100)
initial_modules = list(
/obj/item/rig_module/ai_container,
diff --git a/code/modules/clothing/spacesuits/rig/suits/light.dm b/code/modules/clothing/spacesuits/rig/suits/light.dm
index fb6b0459a91..0bda9f9288a 100644
--- a/code/modules/clothing/spacesuits/rig/suits/light.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/light.dm
@@ -5,7 +5,6 @@
icon_state = "ninja_rig"
suit_type = "light suit"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank,/obj/item/weapon/stock_parts/cell)
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
emp_protection = 10
slowdown = 0
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
diff --git a/code/modules/clothing/spacesuits/rig/suits/merc.dm b/code/modules/clothing/spacesuits/rig/suits/merc.dm
index 58a66aaa4b1..a7512231641 100644
--- a/code/modules/clothing/spacesuits/rig/suits/merc.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/merc.dm
@@ -5,7 +5,7 @@
desc = "A blood-red hardsuit featuring some fairly illegal technology."
icon_state = "merc_rig"
suit_type = "crimson hardsuit"
- armor = list(melee = 80, bullet = 65, laser = 50, energy = 15, bomb = 80, bio = 100, rad = 60)
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
slowdown = 1
offline_slowdown = 3
offline_vision_restriction = 1
diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm
index 4ddf6e419f3..a0e236daee7 100644
--- a/code/modules/clothing/spacesuits/rig/suits/station.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/station.dm
@@ -15,7 +15,7 @@
suit_type = "augmented suit"
desc = "Prepare for paperwork."
icon_state = "internalaffairs_rig"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 0.9
slowdown = 0
offline_slowdown = 0
@@ -51,7 +51,7 @@
suit_type = "industrial hardsuit"
desc = "A heavy, powerful rig used by construction crews and mining corporations."
icon_state = "engineering_rig"
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 50)
+ armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
slowdown = 3
offline_slowdown = 10
offline_vision_restriction = 2
@@ -80,7 +80,6 @@
suit_type = "EVA hardsuit"
desc = "A light rig for repairs and maintenance to the outside of habitats and vessels."
icon_state = "eva_rig"
- armor = list(melee = 30, bullet = 10, laser = 20,energy = 25, bomb = 20, bio = 100, rad = 100)
slowdown = 0
offline_slowdown = 1
offline_vision_restriction = 1
@@ -108,7 +107,7 @@
suit_type = "advanced voidsuit"
desc = "An advanced voidsuit that protects against hazardous, low pressure environments. Shines with a high polish."
icon_state = "ce_rig"
- armor = list(melee = 40, bullet = 10, laser = 30,energy = 25, bomb = 40, bio = 100, rad = 100)
+ armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 90)
slowdown = 0
offline_slowdown = 0
offline_vision_restriction = 0
@@ -150,7 +149,6 @@
suit_type = "hazmat hardsuit"
desc = "An Anomalous Material Interaction hardsuit that protects against the strangest energies the universe can throw at it."
icon_state = "science_rig"
- armor = list(melee = 45, bullet = 5, laser = 45, energy = 80, bomb = 60, bio = 100, rad = 100)
slowdown = 1
offline_vision_restriction = 1
@@ -179,7 +177,7 @@
suit_type = "rescue hardsuit"
desc = "A durable suit designed for medical rescue in high risk areas."
icon_state = "medical_rig"
- armor = list(melee = 30, bullet = 15, laser = 20, energy = 60, bomb = 30, bio = 100, rad = 100)
+ armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
slowdown = 1
offline_vision_restriction = 1
@@ -204,7 +202,7 @@
suit_type = "hazard hardsuit"
desc = "A Security hardsuit designed for prolonged EVA in dangerous environments."
icon_state = "hazard_rig"
- armor = list(melee = 60, bullet = 40, laser = 30, energy = 15, bomb = 60, bio = 100, rad = 30)
+ armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
slowdown = 1
offline_slowdown = 3
offline_vision_restriction = 1
diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm
index 4017cb3f1f8..4b8f32f5a74 100644
--- a/code/modules/clothing/spacesuits/syndi.dm
+++ b/code/modules/clothing/spacesuits/syndi.dm
@@ -5,7 +5,7 @@
icon_state = "syndicate"
item_state = "syndicate"
desc = "Has a tag: Totally not property of an enemy corporation, honest."
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
/obj/item/clothing/suit/space/syndicate
name = "red space suit"
@@ -14,8 +14,7 @@
desc = "Has a tag on it: Totally not property of of a hostile corporation, honest!"
w_class = 3
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
- slowdown = 1
- armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
//Green syndicate space suit
diff --git a/code/modules/clothing/spacesuits/void.dm b/code/modules/clothing/spacesuits/void.dm
index 91142123450..cce0f4c49b3 100644
--- a/code/modules/clothing/spacesuits/void.dm
+++ b/code/modules/clothing/spacesuits/void.dm
@@ -11,5 +11,4 @@
icon_state = "void"
item_state = "void"
desc = "A high tech, NASA Centcom branch designed, dark red Space suit. Used for AI satellite maintenance."
- slowdown = 1
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/multitool)
\ No newline at end of file
diff --git a/code/modules/clothing/suits/alien.dm b/code/modules/clothing/suits/alien.dm
index 5b664f21b35..664e1dea237 100644
--- a/code/modules/clothing/suits/alien.dm
+++ b/code/modules/clothing/suits/alien.dm
@@ -1,4 +1,9 @@
//Unathi clothing.
+/obj/item/clothing/suit/unathi/
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
/obj/item/clothing/suit/unathi/robe
name = "roughspun robes"
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 609e24ca6bf..8b5ea0d9af5 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -1,4 +1,3 @@
-
/obj/item/clothing/suit/armor
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic,/obj/item/weapon/kitchen/knife/combat)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
@@ -8,6 +7,10 @@
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
strip_delay = 60
put_on_delay = 40
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
/obj/item/clothing/suit/armor/vest
name = "armor"
@@ -15,8 +18,8 @@
icon_state = "armor"
item_state = "armor"
blood_overlay_type = "armor"
- flags = ONESIZEFITSALL
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ flags_size = ONESIZEFITSALL
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
/obj/item/clothing/suit/armor/vest/jacket
name = "military jacket"
@@ -31,8 +34,7 @@
icon_state = "armor-combat"
item_state = "bulletproof"
blood_overlay_type = "armor"
- flags = ONESIZEFITSALL
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/suit/armor/vest/security
name = "security armor"
@@ -48,7 +50,8 @@
W.forceMove(src)
attached_badge = W
- action_button_name = "Remove Holobadge"
+ var/datum/action/A = new /datum/action/item_action/remove_badge(src)
+ A.Grant(user)
icon_state = "armorsec"
user.update_inv_wear_suit()
desc = "An armored vest that protects against some damage. This one has [attached_badge] attached to it."
@@ -61,8 +64,10 @@
add_fingerprint(user)
user.put_in_hands(attached_badge)
- action_button_name = null
- action.Remove(user)
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.Remove(user)
+
icon_state = "armor"
user.update_inv_wear_suit()
desc = "An armored vest that protects against some damage. This one has a clip for a holobadge."
@@ -85,6 +90,22 @@
desc = "A vest drenched in the blood of Greytide. It has seen better days."
icon_state = "bloody_armor"
item_state = "bloody_armor"
+ species_fit = null
+ sprite_sheets = null
+
+/obj/item/clothing/suit/armor/secjacket
+ name = "security jacket"
+ desc = "A sturdy black jacket with reinforced fabric. Bears insignia of NT corporate security."
+ icon_state = "secjacket_open"
+ item_state = "hos"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ armor = list(melee = 15, bullet = 10, laser = 15, energy = 5, bomb = 15, bio = 0, rad = 0)
+ cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
+ heat_protection = UPPER_TORSO|LOWER_TORSO|ARMS
+ ignore_suitadjust = 0
+ suit_adjusted = 1
+ actions_types = list(/datum/action/item_action/openclose)
+ adjust_flavour = "unzip"
/obj/item/clothing/suit/armor/hos
name = "armored coat"
@@ -92,7 +113,7 @@
icon_state = "hos"
item_state = "hos"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
- armor = list(melee = 65, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
@@ -106,7 +127,7 @@
flags_inv = 0
ignore_suitadjust = 0
suit_adjusted = 1
- action_button_name = "Open/Close Trenchcoat"
+ actions_types = list(/datum/action/item_action/openclose)
adjust_flavour = "unbutton"
/obj/item/clothing/suit/armor/hos/jensen
@@ -115,6 +136,8 @@
icon_state = "jensencoat"
item_state = "jensencoat"
flags_inv = 0
+ species_fit = null
+ sprite_sheets = null
/obj/item/clothing/suit/armor/vest/warden
name = "Warden's armored jacket"
@@ -137,7 +160,7 @@
icon_state = "capcarapace"
item_state = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
- armor = list(melee = 50, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 50, bullet = 40, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
/obj/item/clothing/suit/armor/riot
name = "Riot Suit"
@@ -147,18 +170,18 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
- slowdown = 1
- armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
strip_delay = 80
put_on_delay = 60
+ hide_tail_by_species = list("Vox")
/obj/item/clothing/suit/armor/riot/knight
name = "plate armour"
desc = "A classic suit of plate armour, highly effective at stopping melee attacks."
icon_state = "knight_green"
item_state = "knight_green"
- armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
+ slowdown = 1
/obj/item/clothing/suit/armor/riot/knight/yellow
icon_state = "knight_yellow"
@@ -185,7 +208,7 @@
icon_state = "bulletproof"
item_state = "armor"
blood_overlay_type = "armor"
- armor = list(melee = 25, bullet = 80, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
+ armor = list(melee = 15, bullet = 80, laser = 10, energy = 10, bomb = 40, bio = 0, rad = 0)
strip_delay = 70
put_on_delay = 50
@@ -195,7 +218,7 @@
icon_state = "armor_reflec"
item_state = "armor_reflec"
blood_overlay_type = "armor"
- armor = list(melee = 10, bullet = 10, laser = 80, energy = 50, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 10, laser = 60, energy = 50, bomb = 0, bio = 0, rad = 0)
var/hit_reflect_chance = 40
/obj/item/clothing/suit/armor/laserproof/IsReflect(var/def_zone)
@@ -210,46 +233,131 @@
icon_state = "detective-armor"
item_state = "armor"
blood_overlay_type = "armor"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
//Reactive armor
-//When the wearer gets hit, this armor will teleport the user a short distance away (to safety or to more danger, no one knows. That's the fun of it!)
/obj/item/clothing/suit/armor/reactive
- name = "Reactive Teleport Armor"
- desc = "Someone seperated our Research Director from his own head!"
- var/active = 0.0
+ name = "reactive armor"
+ desc = "Doesn't seem to do much for some reason."
+ var/active = 0
icon_state = "reactiveoff"
item_state = "reactiveoff"
blood_overlay_type = "armor"
- action_button_name = "Toggle Reactive Armor"
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
+ actions_types = list(/datum/action/item_action/toggle)
+ unacidable = 1
+ hit_reaction_chance = 50
-/obj/item/clothing/suit/armor/reactive/IsShield()
+/obj/item/clothing/suit/armor/reactive/attack_self(mob/user)
+ active = !(active)
if(active)
- return 1
- return 0
-
-/obj/item/clothing/suit/armor/reactive/attack_self(mob/user as mob)
- src.active = !( src.active )
- if (src.active)
- to_chat(user, "\blue The reactive armor is now active.")
- src.icon_state = "reactive"
- src.item_state = "reactive"
+ to_chat(user, "[src] is now active. ")
+ icon_state = "reactive"
+ item_state = "reactive"
else
- to_chat(user, "\blue The reactive armor is now inactive.")
- src.icon_state = "reactiveoff"
- src.item_state = "reactiveoff"
- src.add_fingerprint(user)
- return
+ to_chat(user, "[src] is now inactive. ")
+ icon_state = "reactiveoff"
+ item_state = "reactiveoff"
+ add_fingerprint(user)
+ user.update_inv_wear_suit()
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
/obj/item/clothing/suit/armor/reactive/emp_act(severity)
active = 0
- src.icon_state = "reactiveoff"
- src.item_state = "reactiveoff"
+ icon_state = "reactiveoff"
+ item_state = "reactiveoff"
+ if(istype(loc, /mob/living/carbon/human))
+ var/mob/living/carbon/human/C = loc
+ C.update_inv_wear_suit()
..()
+//When the wearer gets hit, this armor will teleport the user a short distance away (to safety or to more danger, no one knows. That's the fun of it!)
+/obj/item/clothing/suit/armor/reactive/teleport
+ name = "reactive teleport armor"
+ desc = "Someone seperated our Research Director from his own head!"
+ var/tele_range = 6
+
+/obj/item/clothing/suit/armor/reactive/teleport/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
+ if(!active)
+ return 0
+ if(prob(hit_reaction_chance))
+ var/mob/living/carbon/human/H = owner
+ owner.visible_message("The reactive teleport system flings [H] clear of [attack_text], shutting itself off in the process! ")
+ var/list/turfs = new/list()
+ for(var/turf/T in orange(tele_range, H))
+ if(istype(T, /turf/space))
+ continue
+ if(T.density)
+ continue
+ if(T.x>world.maxx-tele_range || T.xworld.maxy-tele_range || T.yThe [src] blocks the [attack_text], sending out jets of flame! ")
+ for(var/mob/living/carbon/C in range(6, owner))
+ if(C != owner)
+ C.fire_stacks += 8
+ C.IgniteMob()
+ owner.fire_stacks = -20
+ return 1
+ return 0
+
+
+/obj/item/clothing/suit/armor/reactive/stealth
+ name = "reactive stealth armor"
+
+/obj/item/clothing/suit/armor/reactive/stealth/hit_reaction(mob/living/carbon/human/owner, attack_text)
+ if(!active)
+ return 0
+ if(prob(hit_reaction_chance))
+ var/mob/living/simple_animal/hostile/illusion/escape/E = new(owner.loc)
+ E.Copy_Parent(owner, 50)
+ E.GiveTarget(owner) //so it starts running right away
+ E.Goto(owner, E.move_to_delay, E.minimum_distance)
+ owner.alpha = 0
+ owner.visible_message("[owner] is hit by [attack_text] in the chest! ") //We pretend to be hit, since blocking it would stop the message otherwise
+ spawn(40)
+ owner.alpha = initial(owner.alpha)
+ return 1
+
+/obj/item/clothing/suit/armor/reactive/tesla
+ name = "reactive tesla armor"
+
+/obj/item/clothing/suit/armor/reactive/tesla/hit_reaction(mob/living/carbon/human/owner, attack_text)
+ if(!active)
+ return 0
+ if(prob(hit_reaction_chance))
+ owner.visible_message("The [src] blocks the [attack_text], sending out arcs of lightning! ")
+ for(var/mob/living/M in view(6, owner))
+ if(M == owner)
+ continue
+ owner.Beam(M,icon_state="lightning[rand(1, 12)]",icon='icons/effects/effects.dmi',time=5)
+ M.adjustFireLoss(25)
+ playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ return 1
//All of the armor below is mostly unused
@@ -266,27 +374,32 @@
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
+ species_fit = null
+ sprite_sheets = null
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
/obj/item/clothing/suit/armor/heavy
name = "heavy armor"
desc = "A heavily armored suit that protects against moderate damage."
icon_state = "heavy"
item_state = "swat_suit"
- armor = list(melee = 65, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
w_class = 4//bulky item
gas_transfer_coefficient = 0.90
flags = THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
slowdown = 3
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
+ hide_tail_by_species = list("Vox")
/obj/item/clothing/suit/armor/tdome
- armor = list(melee = 65, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
flags = THICKMATERIAL
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
+ hide_tail_by_species = list("Vox")
/obj/item/clothing/suit/armor/tdome/red
name = "Red Thunderdome Armor"
@@ -306,7 +419,7 @@
desc = "A set of armor worn by members of the Nanotrasen Emergency Response Team."
icon_state = "ertarmor_cmd"
item_state = "armor"
- armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 20, bio = 0, rad = 0)
+ armor = list(melee = 30, bullet = 30, laser = 30, energy = 30, bomb = 20, bio = 0, rad = 0)
//Commander
/obj/item/clothing/suit/armor/vest/ert/command
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 3879cc5692c..06fbf32b056 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -5,7 +5,7 @@
desc = "A hood that protects the head and face from biological comtaminants."
permeability_coefficient = 0.01
flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR | THICKMATERIAL
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
/obj/item/clothing/suit/bio_suit
@@ -16,14 +16,20 @@
w_class = 4//bulky item
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
- flags = ONESIZEFITSALL | THICKMATERIAL
+ flags = THICKMATERIAL
+ flags_size = ONESIZEFITSALL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
- slowdown = 1.0
+ slowdown = 1
allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/pen,/obj/item/device/flashlight/pen)
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
strip_delay = 70
put_on_delay = 70
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
+ hide_tail_by_species = list("Vox")
//Standard biosuit, orange stripe
/obj/item/clothing/head/bio_hood/general
@@ -43,9 +49,11 @@
//Security biosuit, grey with red stripe across the chest
/obj/item/clothing/head/bio_hood/security
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 100, rad = 20)
icon_state = "bio_security"
/obj/item/clothing/suit/bio_suit/security
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 100, rad = 20)
icon_state = "bio_security"
@@ -80,4 +88,6 @@
icon_state = "plaguedoctor"
item_state = "bio_suit"
strip_delay = 40
- put_on_delay = 20
\ No newline at end of file
+ put_on_delay = 20
+ species_fit = null
+ sprite_sheets = null
\ No newline at end of file
diff --git a/code/modules/clothing/suits/hood.dm b/code/modules/clothing/suits/hood.dm
new file mode 100644
index 00000000000..0683394ce9f
--- /dev/null
+++ b/code/modules/clothing/suits/hood.dm
@@ -0,0 +1,67 @@
+//Hoods for winter coats and chaplain hoodie etc
+
+/obj/item/clothing/suit/hooded
+ actions_types = list(/datum/action/item_action/toggle)
+ var/obj/item/clothing/head/hood
+ var/hoodtype = /obj/item/clothing/head/winterhood //so the chaplain hoodie or other hoodies can override this
+
+/obj/item/clothing/suit/hooded/New()
+ MakeHood()
+ ..()
+
+/obj/item/clothing/suit/hooded/Destroy()
+ qdel(hood)
+ return ..()
+
+/obj/item/clothing/suit/hooded/proc/MakeHood()
+ if(!hood)
+ var/obj/item/clothing/head/W = new hoodtype(src)
+ hood = W
+
+/obj/item/clothing/suit/hooded/ui_action_click()
+ ToggleHood()
+
+/obj/item/clothing/suit/hooded/item_action_slot_check(slot, mob/user)
+ if(slot == slot_wear_suit)
+ return 1
+
+/obj/item/clothing/suit/hooded/equipped(mob/user, slot)
+ if(slot != slot_wear_suit)
+ RemoveHood()
+ ..()
+
+/obj/item/clothing/suit/hooded/proc/RemoveHood()
+ icon_state = "[initial(icon_state)]"
+ suit_adjusted = 0
+ if(ishuman(hood.loc))
+ var/mob/living/carbon/H = hood.loc
+ H.unEquip(hood, 1)
+ H.update_inv_wear_suit()
+ hood.loc = src
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
+
+/obj/item/clothing/suit/hooded/dropped()
+ ..()
+ RemoveHood()
+
+/obj/item/clothing/suit/hooded/proc/ToggleHood()
+ if(!suit_adjusted)
+ if(ishuman(loc))
+ var/mob/living/carbon/human/H = loc
+ if(H.wear_suit != src)
+ to_chat(H,"You must be wearing [src] to put up the hood! ")
+ return
+ if(H.head)
+ to_chat(H,"You're already wearing something on your head! ")
+ return
+ else if(H.equip_to_slot_if_possible(hood,slot_head,0,0,1))
+ suit_adjusted = 1
+ icon_state = "[initial(icon_state)]_hood"
+ H.update_inv_wear_suit()
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
+ else
+ RemoveHood()
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index f9ce0cd4593..a8fd6ea4c49 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -25,6 +25,10 @@
/obj/item/device/healthanalyzer, /obj/item/device/flashlight, \
/obj/item/device/radio, /obj/item/weapon/tank/emergency_oxygen,/obj/item/device/rad_laser)
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
//Botonist
/obj/item/clothing/suit/apron
@@ -48,7 +52,7 @@
item_state = "bio_suit"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
flags_inv = HIDEJUMPSUIT
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
allowed = list(/obj/item/weapon/disk, /obj/item/weapon/stamp, /obj/item/weapon/reagent_containers/food/drinks/flask, /obj/item/weapon/melee, /obj/item/weapon/storage/lockbox/medal, /obj/item/device/flash, /obj/item/weapon/storage/box/matches, /obj/item/weapon/lighter, /obj/item/clothing/mask/cigarette, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/tank/emergency_oxygen)
species_fit = list("Vox")
sprite_sheets = list(
@@ -69,12 +73,13 @@
)
//Chaplain
-/obj/item/clothing/suit/chaplain_hoodie
+/obj/item/clothing/suit/hooded/chaplain_hoodie
name = "chaplain hoodie"
desc = "This suit says to you 'hush'!"
icon_state = "chaplain_hoodie"
item_state = "chaplain_hoodie"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
+ hoodtype = /obj/item/clothing/head/chaplain_hood
allowed = list(/obj/item/weapon/storage/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/emergency_oxygen)
species_fit = list("Vox")
sprite_sheets = list(
@@ -82,13 +87,14 @@
)
//Chaplain
-/obj/item/clothing/suit/nun
+/obj/item/clothing/suit/hooded/nun
name = "nun robe"
desc = "Maximum piety in this star system."
icon_state = "nun"
item_state = "nun"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS
flags_inv = HIDESHOES|HIDEJUMPSUIT
+ hoodtype = /obj/item/clothing/head/nun_hood
allowed = list(/obj/item/weapon/storage/bible, /obj/item/weapon/nullrod, /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater, /obj/item/weapon/storage/fancy/candle_box, /obj/item/candle, /obj/item/weapon/tank/emergency_oxygen)
species_fit = list("Vox")
sprite_sheets = list(
@@ -119,10 +125,6 @@
blood_overlay_type = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
allowed = list(/obj/item/weapon/kitchen/knife)
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/suit.dmi'
- )
//Detective
/obj/item/clothing/suit/storage/det_suit
@@ -133,30 +135,30 @@
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
- armor = list(melee = 50, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
//Forensics
-/obj/item/clothing/suit/storage/forensics
+/obj/item/clothing/suit/storage/det_suit/forensics
name = "jacket"
desc = "A forensics technician jacket."
item_state = "det_suit"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
- allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
- armor = list(melee = 10, bullet = 10, laser = 15, energy = 10, bomb = 0, bio = 0, rad = 0)
+ cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
+ heat_protection = UPPER_TORSO|LOWER_TORSO|ARMS
-/obj/item/clothing/suit/storage/forensics/red
+/obj/item/clothing/suit/storage/det_suit/forensics/red
name = "red jacket"
desc = "A red forensics technician jacket."
icon_state = "forensics_red"
-/obj/item/clothing/suit/storage/forensics/blue
+/obj/item/clothing/suit/storage/det_suit/forensics/blue
name = "blue jacket"
desc = "A blue forensics technician jacket."
icon_state = "forensics_blue"
@@ -170,10 +172,14 @@
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite,/obj/item/weapon/melee/classic_baton/telescopic)
- armor = list(melee = 50, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 25, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0)
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
//Engineering
/obj/item/clothing/suit/storage/hazardvest
@@ -189,6 +195,12 @@
)
//Lawyer
+/obj/item/clothing/suit/storage/lawyer
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
+
/obj/item/clothing/suit/storage/lawyer/blackjacket
name = "black suit jacket"
desc = "A snappy dress jacket."
@@ -198,7 +210,7 @@
body_parts_covered = UPPER_TORSO|ARMS
ignore_suitadjust = 0
suit_adjusted = 1
- action_button_name = "Button/Unbutton Jacket"
+ actions_types = list(/datum/action/item_action/button)
adjust_flavour = "unbutton"
/obj/item/clothing/suit/storage/lawyer/bluejacket
@@ -210,7 +222,7 @@
body_parts_covered = UPPER_TORSO|ARMS
ignore_suitadjust = 0
suit_adjusted = 1
- action_button_name = "Button/Unbutton Jacket"
+ actions_types = list(/datum/action/item_action/button)
adjust_flavour = "unbutton"
/obj/item/clothing/suit/storage/lawyer/purpjacket
@@ -231,8 +243,12 @@
body_parts_covered = UPPER_TORSO|ARMS
ignore_suitadjust = 0
suit_adjusted = 1
- action_button_name = "Button/Unbutton Jacket"
+ actions_types = list(/datum/action/item_action/button)
adjust_flavour = "unbutton"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
/obj/item/clothing/suit/storage/ntrep
name = "\improper NanoTrasen Representative jacket"
@@ -242,8 +258,12 @@
blood_overlay_type = "coat"
body_parts_covered = UPPER_TORSO|ARMS
ignore_suitadjust = 0
- action_button_name = "Button/Unbutton Jacket"
+ actions_types = list(/datum/action/item_action/button)
adjust_flavour = "unbutton"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
//Medical
/obj/item/clothing/suit/storage/fr_jacket
@@ -256,8 +276,12 @@
/obj/item/device/healthanalyzer, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/weapon/tank/emergency_oxygen,/obj/item/device/rad_laser)
ignore_suitadjust = 0
suit_adjusted = 1
- action_button_name = "Button/Unbutton Jacket"
+ actions_types = list(/datum/action/item_action/button)
adjust_flavour = "unbutton"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
//Mime
/obj/item/clothing/suit/suspenders
@@ -266,3 +290,7 @@
icon = 'icons/obj/clothing/belts.dmi'
icon_state = "suspenders"
blood_overlay_type = "armor" //it's the less thing that I can put here
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm
index 96065432f3d..8097162ba28 100644
--- a/code/modules/clothing/suits/labcoat.dm
+++ b/code/modules/clothing/suits/labcoat.dm
@@ -13,7 +13,7 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
- action_button_name = "Button/Unbutton Labcoat"
+ actions_types = list(/datum/action/item_action/button)
adjust_flavour = "unbutton"
/obj/item/clothing/suit/storage/labcoat/cmo
@@ -21,66 +21,44 @@
desc = "Bluer than the standard model."
icon_state = "labcoat_cmo_open"
item_state = "labcoat_cmo_open"
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/suit.dmi'
- )
/obj/item/clothing/suit/storage/labcoat/mad
name = "mad scientist's labcoat"
desc = "It makes you look capable of konking someone on the noggin and shooting them into space."
icon_state = "labcoat_green_open"
item_state = "labcoat_green_open"
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/suit.dmi'
- )
/obj/item/clothing/suit/storage/labcoat/genetics
name = "geneticist labcoat"
desc = "A suit that protects against minor chemical spills. Has a blue stripe on the shoulder."
icon_state = "labcoat_gen_open"
item_state = "labcoat_gen_open"
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/suit.dmi'
- )
/obj/item/clothing/suit/storage/labcoat/chemist
name = "chemist labcoat"
desc = "A suit that protects against minor chemical spills. Has an orange stripe on the shoulder."
icon_state = "labcoat_chem_open"
item_state = "labcoat_chem_open"
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/suit.dmi'
- )
/obj/item/clothing/suit/storage/labcoat/virologist
name = "virologist labcoat"
desc = "A suit that protects against minor chemical spills. Offers slightly more protection against biohazards than the standard model. Has a green stripe on the shoulder."
icon_state = "labcoat_vir_open"
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/suit.dmi'
- )
/obj/item/clothing/suit/storage/labcoat/science
name = "scientist labcoat"
desc = "A suit that protects against minor chemical spills. Has a purple stripe on the shoulder."
icon_state = "labcoat_tox_open"
item_state = "labcoat_tox_open"
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/suit.dmi'
- )
/obj/item/clothing/suit/storage/labcoat/mortician
name = "coroner labcoat"
desc = "A suit that protects against minor chemical spills. Has a black stripe on the shoulder."
icon_state = "labcoat_mort_open"
item_state = "labcoat_mort_open"
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/suit.dmi'
- )
+
+/obj/item/clothing/suit/storage/labcoat/emt
+ name = "EMT labcoat"
+ desc = "A comfortable suit for paramedics. Has dark colours."
+ icon_state = "labcoat_emt_open"
+ item_state = "labcoat_emt_open"
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 7985eb06b57..676800f8f48 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -2,6 +2,7 @@
* Contains:
* Lasertag
* Costume
+ * Winter Coats
* Misc
*/
@@ -16,6 +17,10 @@
blood_overlay_type = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
allowed = list (/obj/item/weapon/gun/energy/laser/bluetag)
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
/obj/item/clothing/suit/redtag
name = "red laser tag armour"
@@ -25,6 +30,10 @@
blood_overlay_type = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
allowed = list (/obj/item/weapon/gun/energy/laser/redtag)
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
/*
* Costume
@@ -34,13 +43,20 @@
desc = "Yarr."
icon_state = "pirate_old"
item_state = "pirate_old"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
/obj/item/clothing/suit/pirate_black
name = "black pirate coat"
desc = "Yarr."
icon_state = "pirate"
item_state = "pirate"
-
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
/obj/item/clothing/suit/hgpirate
name = "pirate captain coat"
@@ -99,7 +115,10 @@
item_state = "wcoat"
blood_overlay_type = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
-
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
/obj/item/clothing/suit/apron/overalls
name = "coveralls"
@@ -233,6 +252,10 @@
desc = "Your classic, non-racist poncho."
icon_state = "classicponcho"
item_state = "classicponcho"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
/obj/item/clothing/suit/poncho/green
name = "green poncho"
@@ -260,11 +283,192 @@
item_state = "lingspacesuit"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+/*
+ * Winter Coats
+ */
+
+/obj/item/clothing/suit/hooded/wintercoat
+ name = "winter coat"
+ desc = "A heavy jacket made from 'synthetic' animal furs."
+ icon_state = "wintercoat"
+ item_state = "labcoat"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
+ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/toy, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/lighter)
+ species_fit = list("Vox")
+ sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi')
+
+/obj/item/clothing/head/winterhood
+ name = "winter hood"
+ desc = "A hood attached to a heavy winter jacket."
+ icon_state = "winterhood"
+ body_parts_covered = HEAD
+ cold_protection = HEAD
+ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
+ flags = NODROP|BLOCKHAIR
+ flags_inv = HIDEEARS
+ species_fit = list("Vox")
+ sprite_sheets = list("Vox" = 'icons/mob/species/vox/head.dmi')
+
+/obj/item/clothing/suit/hooded/wintercoat/captain
+ name = "captain's winter coat"
+ icon_state = "wintercoat_captain"
+ armor = list(melee = 25, bullet = 30, laser = 30, energy = 10, bomb = 25, bio = 0, rad = 0)
+ allowed = list(/obj/item/weapon/gun/energy, /obj/item/weapon/reagent_containers/spray/pepper, /obj/item/weapon/gun/projectile, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs, /obj/item/device/flashlight/seclite, /obj/item/weapon/melee/classic_baton/telescopic)
+ hoodtype = /obj/item/clothing/head/winterhood/captain
+
+/obj/item/clothing/head/winterhood/captain
+ icon_state = "winterhood_captain"
+
+/obj/item/clothing/suit/hooded/wintercoat/security
+ name = "security winter coat"
+ icon_state = "wintercoat_sec"
+ armor = list(melee = 10, bullet = 10, laser = 10, energy = 5, bomb = 15, bio = 0, rad = 0)
+ allowed = list(/obj/item/weapon/gun/energy, /obj/item/weapon/reagent_containers/spray/pepper, /obj/item/weapon/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/restraints/handcuffs, /obj/item/device/flashlight/seclite, /obj/item/weapon/melee/classic_baton/telescopic)
+ hoodtype = /obj/item/clothing/head/winterhood/security
+
+/obj/item/clothing/head/winterhood/security
+ icon_state = "winterhood_sec"
+
+/obj/item/clothing/suit/hooded/wintercoat/medical
+ name = "medical winter coat"
+ icon_state = "wintercoat_med"
+ allowed = list(/obj/item/device/analyzer, /obj/item/weapon/dnainjector, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/syringe, /obj/item/weapon/reagent_containers/hypospray, /obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen, /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/storage/pill_bottle, /obj/item/weapon/paper, /obj/item/weapon/melee/classic_baton/telescopic)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0)
+ hoodtype = /obj/item/clothing/head/winterhood/medical
+
+/obj/item/clothing/head/winterhood/medical
+ icon_state = "winterhood_med"
+
+/obj/item/clothing/suit/hooded/wintercoat/science
+ name = "science winter coat"
+ icon_state = "wintercoat_sci"
+ allowed = list(/obj/item/device/analyzer, /obj/item/stack/medical, /obj/item/weapon/dnainjector, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/syringe, /obj/item/weapon/reagent_containers/hypospray, /obj/item/device/healthanalyzer,/obj/item/device/flashlight/pen, /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/storage/pill_bottle, /obj/item/weapon/paper, /obj/item/weapon/melee/classic_baton/telescopic)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0)
+ hoodtype = /obj/item/clothing/head/winterhood/science
+
+/obj/item/clothing/head/winterhood/science
+ icon_state = "winterhood_sci"
+
+/obj/item/clothing/suit/hooded/wintercoat/engineering
+ name = "engineering winter coat"
+ icon_state = "wintercoat_engi"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20)
+ allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/device/t_scanner, /obj/item/weapon/rcd)
+ hoodtype = /obj/item/clothing/head/winterhood/engineering
+
+/obj/item/clothing/head/winterhood/engineering
+ icon_state = "winterhood_engi"
+
+/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos
+ name = "atmospherics winter coat"
+ icon_state = "wintercoat_atmos"
+ hoodtype = /obj/item/clothing/head/winterhood/engineering/atmos
+
+/obj/item/clothing/head/winterhood/engineering/atmos
+ icon_state = "winterhood_atmos"
+
+/obj/item/clothing/suit/hooded/wintercoat/hydro
+ name = "hydroponics winter coat"
+ icon_state = "wintercoat_hydro"
+ allowed = list(/obj/item/weapon/reagent_containers/spray, /obj/item/device/analyzer/plant_analyzer, /obj/item/seeds, /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/hatchet, /obj/item/weapon/storage/bag/plants)
+ hoodtype = /obj/item/clothing/head/winterhood/hydro
+
+/obj/item/clothing/head/winterhood/hydro
+ icon_state = "winterhood_hydro"
+
+/obj/item/clothing/suit/hooded/wintercoat/cargo
+ name = "cargo winter coat"
+ icon_state = "wintercoat_cargo"
+ hoodtype = /obj/item/clothing/head/winterhood/cargo
+
+/obj/item/clothing/head/winterhood/cargo
+ icon_state = "winterhood_cargo"
+
+/obj/item/clothing/suit/hooded/wintercoat/miner
+ name = "mining winter coat"
+ icon_state = "wintercoat_miner"
+ allowed = list(/obj/item/weapon/pickaxe, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/toy, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/lighter)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
+ hoodtype = /obj/item/clothing/head/winterhood/miner
+
+/obj/item/clothing/head/winterhood/miner
+ icon_state = "winterhood_miner"
+
/*
* Misc
*/
+//hoodies
+/obj/item/clothing/suit/hooded/hoodie
+ name = "black hoodie"
+ desc = "It's a hoodie. It has a hood. Most hoodies do."
+ icon_state = "black_hoodie"
+ item_state = "labcoat"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ hoodtype = /obj/item/clothing/head/hood
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
+
+/obj/item/clothing/head/hood
+ name = "black hood"
+ desc = "A hood attached to a hoodie."
+ icon_state = "blackhood"
+ body_parts_covered = HEAD
+ cold_protection = HEAD
+ flags = NODROP|BLOCKHAIR
+ flags_inv = HIDEEARS
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/head.dmi'
+ )
+
+/obj/item/clothing/head/hood/blue
+ icon_state = "bluehood"
+
+/obj/item/clothing/head/hood/white
+ icon_state = "whitehood"
+
+/obj/item/clothing/suit/hooded/hoodie/blue
+ name = "blue hoodie"
+ icon_state = "blue_hoodie"
+ hoodtype = /obj/item/clothing/head/hood/blue
+
+/obj/item/clothing/suit/hooded/hoodie/mit
+ name = "Martian Institute of Technology hoodie"
+ desc = "A hoodie proudly worn by students and graduates alike, has the letters 'MIT' on the back."
+ icon_state = "mit_hoodie"
+ hoodtype = /obj/item/clothing/head/hood
+
+/obj/item/clothing/suit/hooded/hoodie/cut
+ name = "Canaan University of Technology hoodie"
+ desc = "A bright hoodie with the Canaan University of Technology logo on the front."
+ icon_state = "cut_hoodie"
+ hoodtype = /obj/item/clothing/head/hood/white
+
+/obj/item/clothing/suit/hooded/hoodie/lam
+ name = "Lunar Academy of Medicine hoodie"
+ desc = "A bright hoodie with the Lunar Academy of Medicine logo on the back."
+ icon_state = "lam_hoodie"
+ hoodtype = /obj/item/clothing/head/hood/white
+
+/obj/item/clothing/suit/hooded/hoodie/nt
+ name = "Nanotrasen hoodie"
+ desc = "A blue hoodie with the Nanotrasen logo on the back."
+ icon_state = "nt_hoodie"
+ hoodtype = /obj/item/clothing/head/hood/blue
+
+/obj/item/clothing/suit/hooded/hoodie/tp
+ name = "Tharsis Polytech hoodie"
+ desc = "A dark hoodie with the Tharsis Polytech logo on the back."
+ icon_state = "tp_hoodie"
+ hoodtype = /obj/item/clothing/head/hood
+
/obj/item/clothing/suit/straight_jacket
name = "straight jacket"
desc = "A suit that completely restrains the wearer."
@@ -272,7 +476,7 @@
item_state = "straight_jacket"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
strip_delay = 60
/obj/item/clothing/suit/ianshirt
@@ -280,6 +484,12 @@
desc = "A worn out, curiously comfortable t-shirt with a picture of Ian. You wouldn't go so far as to say it feels like being hugged when you wear it but it's pretty close. Good for sleeping in."
icon_state = "ianshirt"
item_state = "ianshirt"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
+
+
//pyjamas
//originally intended to be pinstripes >.>
@@ -323,13 +533,49 @@
desc = "It makes you stand out. Just the opposite of why it's typically worn. Nice try trying to blend in while wearing it."
icon_state = "brtrenchcoat"
item_state = "brtrenchcoat"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
/obj/item/clothing/suit/blacktrenchcoat
name = "black trench coat"
desc = "That shade of black just makes you look a bit more evil. Good for those mafia types."
icon_state = "bltrenchcoat"
item_state = "bltrenchcoat"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
+//trackjackets
+
+/obj/item/clothing/suit/tracksuit
+ name = "black tracksuit"
+ desc = "Lightweight and stylish. What else could a man ask of his tracksuit?"
+ icon_state = "trackjacket_open"
+ item_state = "bltrenchcoat"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ ignore_suitadjust = 0
+ suit_adjusted = 1
+ actions_types = list(/datum/action/item_action/openclose)
+ adjust_flavour = "unzip"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
+
+/obj/item/clothing/suit/tracksuit/green
+ name = "green tracksuit"
+ icon_state = "trackjacketgreen_open"
+
+/obj/item/clothing/suit/tracksuit/red
+ name = "red tracksuit"
+ icon_state = "trackjacketred_open"
+
+/obj/item/clothing/suit/tracksuit/white
+ name = "white tracksuit"
+ icon_state = "trackjacketwhite_open"
//actual suits
@@ -377,7 +623,7 @@
icon_state = "militaryjacket"
item_state = "militaryjacket"
ignore_suitadjust = 1
- action_button_name = null
+ actions_types = list()
adjust_flavour = null
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/weapon/gun/projectile/automatic/pistol,/obj/item/weapon/gun/projectile/revolver,/obj/item/weapon/gun/projectile/revolver/detective)
@@ -403,7 +649,7 @@
item_state = "xenos_helm"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
//swimsuit
/obj/item/clothing/under/swimsuit/
@@ -446,10 +692,10 @@
w_class = 4//bulky item
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/pen,/obj/item/device/flashlight/pen)
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
/obj/item/clothing/head/mercy_hood
@@ -459,7 +705,7 @@
item_state = "mercy_hood"
permeability_coefficient = 0.01
flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
/obj/item/clothing/suit/jacket
@@ -471,8 +717,12 @@
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
- action_button_name = "Zip/Unzip Jacket"
+ actions_types = list(/datum/action/item_action/zipper)
adjust_flavour = "unzip"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
/obj/item/clothing/suit/jacket/pilot
name = "security bomber jacket"
@@ -487,8 +737,8 @@
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
strip_delay = 60
put_on_delay = 40
- flags = ONESIZEFITSALL
- armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
+ flags_size = ONESIZEFITSALL
+ armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
//End of inheritance from Security armour.
/obj/item/clothing/suit/jacket/leather
@@ -496,7 +746,7 @@
desc = "Pompadour not included."
icon_state = "leatherjacket"
ignore_suitadjust = 1
- action_button_name = null
+ actions_types = list()
adjust_flavour = null
/obj/item/clothing/suit/officercoat
@@ -504,12 +754,26 @@
desc = "A classy clown officer's overcoat, also designed by Hugo Boss."
icon_state = "officersuit"
item_state = "officersuit"
+ ignore_suitadjust = 0
+ actions_types = list(/datum/action/item_action/button)
+ adjust_flavour = "unbutton"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
/obj/item/clothing/suit/soldiercoat
name = "Clown Soldier's Coat"
desc = "An overcoat for the clown soldier, to keep him warm during those cold winter nights on the front."
icon_state = "soldiersuit"
item_state = "soldiersuit"
+ ignore_suitadjust = 0
+ actions_types = list(/datum/action/item_action/button)
+ adjust_flavour = "unbutton"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
/obj/item/clothing/suit/toggle/owlwings
name = "owl cloak"
@@ -517,9 +781,9 @@
icon_state = "owl_wings"
item_state = "owl_wings"
body_parts_covered = ARMS
- armor = list(melee = 5, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite)
- action_button_name = "Toggle Owl Wings"
+ actions_types = list(/datum/action/item_action/toggle_wings)
flags = NODROP
/obj/item/clothing/suit/toggle/owlwings/griffinwings
@@ -536,6 +800,9 @@
icon_state = initial(icon_state)
item_state = initial(item_state)
usr.update_inv_wear_suit()
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
/obj/item/clothing/suit/lordadmiral
name = "Lord Admiral's Coat"
@@ -559,12 +826,12 @@
desc = "An incredibly advanced and complex suit; it has so many buttons and dials as to be incomprehensible."
icon_state = "bomb"
item_state = "bomb"
- action_button_name = "Toggle Advanced Protective Suit"
+ actions_types = list(/datum/action/item_action/toggle)
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
flags = STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS|HEAD
- armor = list(melee = 100, bullet = 100, laser = 100,energy = 100, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100)
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
heat_protection = UPPER_TORSO | LOWER_TORSO|LEGS|FEET|ARMS|HANDS | HEAD
@@ -605,4 +872,4 @@
if(user.reagents.get_reagent_amount("syndicate_nanites") < 15)
user.reagents.add_reagent("syndicate_nanites", 15)
else
- processing_objects.Remove(src)
\ No newline at end of file
+ processing_objects.Remove(src)
diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm
index 87520f38856..360c9b2915f 100644
--- a/code/modules/clothing/suits/storage.dm
+++ b/code/modules/clothing/suits/storage.dm
@@ -14,11 +14,11 @@
return ..()
/obj/item/clothing/suit/storage/attack_hand(mob/user as mob)
- if (pockets.handle_attack_hand(user))
+ if(pockets.handle_attack_hand(user))
..(user)
/obj/item/clothing/suit/storage/MouseDrop(obj/over_object as obj)
- if (pockets.handle_mousedrop(usr, over_object))
+ if(pockets.handle_mousedrop(usr, over_object))
..(over_object)
/obj/item/clothing/suit/storage/attackby(obj/item/W as obj, mob/user as mob, params)
@@ -47,6 +47,6 @@
L += S.return_inv()
for(var/obj/item/weapon/gift/G in src)
L += G.gift
- if (istype(G.gift, /obj/item/weapon/storage))
+ if(istype(G.gift, /obj/item/weapon/storage))
L += G.gift:return_inv()
return L
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index 030d8f3773c..2178821e3fa 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -19,7 +19,7 @@
permeability_coefficient = 0.50
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/extinguisher)
- slowdown = 1.0
+ slowdown = 1
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
@@ -32,7 +32,10 @@
/obj/item/clothing/suit/fire/firefighter
icon_state = "firesuit"
item_state = "firefighter"
-
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
/obj/item/clothing/suit/fire/heavy
name = "firesuit"
@@ -48,6 +51,10 @@
icon_state = "atmos_firesuit"
item_state = "firesuit_atmos"
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
/*
* Bomb protection
@@ -57,7 +64,7 @@
desc = "Use in case of bomb."
icon_state = "bombsuit"
flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR | THICKMATERIAL
- armor = list(melee = 40, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0)
+ armor = list(melee = 20, bullet = 0, laser = 20, energy = 10, bomb = 100, bio = 0, rad = 0)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
cold_protection = HEAD
min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
@@ -77,7 +84,7 @@
flags = THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
slowdown = 2
- armor = list(melee = 40, bullet = 0, laser = 20,energy = 10, bomb = 100, bio = 0, rad = 0)
+ armor = list(melee = 20, bullet = 0, laser = 20, energy = 10, bomb = 100, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT|HIDETAIL
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
@@ -85,6 +92,11 @@
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
strip_delay = 70
put_on_delay = 70
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
+ hide_tail_by_species = list("Vox")
/obj/item/clothing/head/bomb_hood/security
icon_state = "bombsuitsec"
@@ -104,7 +116,7 @@
icon_state = "rad"
desc = "A hood with radiation protective properties. Label: Made with lead, do not eat insulation"
flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR|THICKMATERIAL
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 60, rad = 100)
strip_delay = 60
put_on_delay = 60
@@ -120,7 +132,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen)
slowdown = 1.5
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 60, rad = 100)
flags_inv = HIDEJUMPSUIT|HIDETAIL
strip_delay = 60
put_on_delay = 60
\ No newline at end of file
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index 8b1d33d6ddb..e417c899f7f 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -6,11 +6,10 @@
item_state = "" //no inhands
item_color = "bluetie"
slot_flags = SLOT_TIE
- w_class = 2.0
+ w_class = 2
var/slot = "decor"
var/obj/item/clothing/under/has_suit = null //the suit the tie may be attached to
var/image/inv_overlay = null //overlay used when attached to clothing.
- action_button_custom_type = /datum/action/item_action/accessory
/obj/item/clothing/accessory/New()
..()
@@ -23,14 +22,30 @@
has_suit = S
loc = has_suit
has_suit.overlays += inv_overlay
+ has_suit.actions += actions
- to_chat(user, "You attach [src] to [has_suit]. ")
+ for(var/X in actions)
+ var/datum/action/A = X
+ if(has_suit.is_equipped())
+ var/mob/M = has_suit.loc
+ A.Grant(M)
+
+ if(user)
+ to_chat(user, "You attach [src] to [has_suit]. ")
src.add_fingerprint(user)
/obj/item/clothing/accessory/proc/on_removed(mob/user as mob)
if(!has_suit)
return
has_suit.overlays -= inv_overlay
+ has_suit.actions -= actions
+
+ for(var/X in actions)
+ var/datum/action/A = X
+ if(ismob(has_suit.loc))
+ var/mob/M = has_suit.loc
+ A.Remove(M)
+
has_suit = null
usr.put_in_hands(src)
src.add_fingerprint(user)
@@ -89,6 +104,10 @@
icon_state = "waistcoat"
item_state = "waistcoat"
item_color = "waistcoat"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
/obj/item/clothing/accessory/stethoscope
name = "stethoscope"
@@ -98,35 +117,45 @@
/obj/item/clothing/accessory/stethoscope/attack(mob/living/carbon/human/M, mob/living/user)
if(ishuman(M) && isliving(user))
- if(user.a_intent == I_HELP)
- var/body_part = parse_zone(user.zone_sel.selecting)
- if(body_part)
- var/their = "their"
- switch(M.gender)
- if(MALE) their = "his"
- if(FEMALE) their = "her"
-
- var/sound = "pulse"
- var/sound_strength
-
- if(M.stat == DEAD || (M.status_flags&FAKEDEATH))
- sound_strength = "cannot hear"
- sound = "anything"
- else
- sound_strength = "hear a weak"
- switch(body_part)
- if("chest")
- if(M.oxyloss < 50)
- sound_strength = "hear a healthy"
- sound = "pulse and respiration"
- if("eyes","mouth")
- sound_strength = "cannot hear"
- sound = "anything"
- else
- sound_strength = "hear a weak"
-
- user.visible_message("[user] places [src] against [M]'s [body_part] and listens attentively.", "You place [src] against [their] [body_part]. You [sound_strength] [sound].")
- return
+ if(user == M)
+ user.visible_message("[user] places \the [src] against \his chest and listens attentively.", "You place \the [src] against your chest...")
+ else
+ user.visible_message("[user] places \the [src] against [M]'s chest and listens attentively.", "You place \the [src] against [M]'s chest...")
+ var/obj/item/organ/internal/H = M.get_int_organ(/obj/item/organ/internal/heart)
+ var/obj/item/organ/internal/L = M.get_int_organ(/obj/item/organ/internal/lungs)
+ if((H && M.pulse) || (L && !(NO_BREATH in M.mutations) && !(M.species.flags & NO_BREATH)))
+ var/color = "notice"
+ if(H)
+ var/heart_sound
+ switch(H.damage)
+ if(0 to 1)
+ heart_sound = "healthy"
+ if(1 to 25)
+ heart_sound = "offbeat"
+ if(25 to 50)
+ heart_sound = "uneven"
+ color = "warning"
+ if(50 to INFINITY)
+ heart_sound = "weak, unhealthy"
+ color = "warning"
+ to_chat(user, "You hear \an [heart_sound] pulse. ")
+ if(L)
+ var/lung_sound
+ switch(L.damage)
+ if(0 to 1)
+ lung_sound = "healthy respiration"
+ if(1 to 25)
+ lung_sound = "labored respiration"
+ if(25 to 50)
+ lung_sound = "pained respiration"
+ color = "warning"
+ if(50 to INFINITY)
+ lung_sound = "gurgling"
+ color = "warning"
+ to_chat(user, "You hear [lung_sound]. ")
+ else
+ to_chat(user, "You don't hear anything. ")
+ return
return ..(M,user)
@@ -231,7 +260,7 @@
..()
/obj/item/clothing/accessory/holobadge/emag_act(user as mob)
- if (emagged)
+ if(emagged)
to_chat(user, "\red [src] is already cracked.")
return
else
@@ -389,7 +418,7 @@
/obj/item/clothing/accessory/petcollar/examine(mob/user)
..()
if(access_id)
- to_chat(user, "There is \icon[access_id] \a [access_id] clipped onto it.")
+ to_chat(user, "There is [bicon(access_id)] \a [access_id] clipped onto it.")
/obj/item/clothing/accessory/petcollar/equipped(mob/living/simple_animal/user)
if(istype(user))
@@ -419,15 +448,15 @@
return
var/list/A = U.accessories
var/total = A.len
- if (total == 1)
+ if(total == 1)
return "\a [A[1]]"
- else if (total == 2)
+ else if(total == 2)
return "\a [A[1]] and \a [A[2]]"
else
var/output = ""
var/index = 1
var/comma_text = ", "
- while (index < total)
+ while(index < total)
output += "\a [A[index]][comma_text]"
index++
diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm
index cc0e47a9563..a30522768ed 100644
--- a/code/modules/clothing/under/accessories/holster.dm
+++ b/code/modules/clothing/under/accessories/holster.dm
@@ -6,8 +6,8 @@
slot = "utility"
var/holster_allow = /obj/item/weapon/gun
var/obj/item/weapon/gun/holstered = null
- action_button_name = "Holster"
- w_class = 3.0 // so it doesn't fit in pockets
+ actions_types = list(/datum/action/item_action/accessory/holster)
+ w_class = 3 // so it doesn't fit in pockets
//subtypes can override this to specify what can be holstered
/obj/item/clothing/accessory/holster/proc/can_holster(obj/item/weapon/gun/W)
@@ -67,8 +67,8 @@
holstered = null
/obj/item/clothing/accessory/holster/attack_hand(mob/user as mob)
- if (has_suit) //if we are part of a suit
- if (holstered)
+ if(has_suit) //if we are part of a suit
+ if(holstered)
unholster(user)
return
@@ -78,13 +78,13 @@
holster(W, user)
/obj/item/clothing/accessory/holster/emp_act(severity)
- if (holstered)
+ if(holstered)
holstered.emp_act(severity)
..()
/obj/item/clothing/accessory/holster/examine(mob/user)
..(user)
- if (holstered)
+ if(holstered)
to_chat(user, "A [holstered] is holstered here.")
else
to_chat(user, "It is empty.")
@@ -106,14 +106,14 @@
if(usr.stat) return
var/obj/item/clothing/accessory/holster/H = null
- if (istype(src, /obj/item/clothing/accessory/holster))
+ if(istype(src, /obj/item/clothing/accessory/holster))
H = src
- else if (istype(src, /obj/item/clothing/under))
+ else if(istype(src, /obj/item/clothing/under))
var/obj/item/clothing/under/S = src
- if (S.accessories.len)
+ if(S.accessories.len)
H = locate() in S.accessories
- if (!H)
+ if(!H)
to_chat(usr, "Something is very wrong. ")
if(!H.holstered)
diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm
index 4c5997d3330..aea6cf139f3 100644
--- a/code/modules/clothing/under/accessories/storage.dm
+++ b/code/modules/clothing/under/accessories/storage.dm
@@ -6,8 +6,8 @@
slot = "utility"
var/slots = 3
var/obj/item/weapon/storage/internal/hold
- action_button_name = "View Storage"
- w_class = 3.0 // so it doesn't fit in pockets
+ actions_types = list(/datum/action/item_action/accessory/storage)
+ w_class = 3 // so it doesn't fit in pockets
/obj/item/clothing/accessory/storage/New()
..()
@@ -15,18 +15,18 @@
hold.storage_slots = slots
/obj/item/clothing/accessory/storage/attack_hand(mob/user as mob)
- if (has_suit) //if we are part of a suit
+ if(has_suit) //if we are part of a suit
hold.open(user)
return
- if (hold.handle_attack_hand(user)) //otherwise interact as a regular storage item
+ if(hold.handle_attack_hand(user)) //otherwise interact as a regular storage item
..(user)
/obj/item/clothing/accessory/storage/MouseDrop(obj/over_object as obj)
- if (has_suit)
+ if(has_suit)
return
- if (hold.handle_mousedrop(usr, over_object))
+ if(hold.handle_mousedrop(usr, over_object))
..(over_object)
/obj/item/clothing/accessory/storage/attackby(obj/item/W as obj, mob/user as mob, params)
@@ -54,12 +54,12 @@
L += S.return_inv()
for(var/obj/item/weapon/gift/G in src)
L += G.gift
- if (istype(G.gift, /obj/item/weapon/storage))
+ if(istype(G.gift, /obj/item/weapon/storage))
L += G.gift:return_inv()
return L
/obj/item/clothing/accessory/storage/attack_self(mob/user as mob)
- if (has_suit) //if we are part of a suit
+ if(has_suit) //if we are part of a suit
hold.open(user)
else
to_chat(user, "You empty [src]. ")
@@ -74,6 +74,10 @@
desc = "Sturdy mess of synthcotton belts and buckles, ready to share your burden."
icon_state = "webbing"
item_color = "webbing"
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/suit.dmi'
+ )
/obj/item/clothing/accessory/storage/black_vest
name = "black webbing vest"
diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm
index a2496168b5f..8f5a540f3c3 100644
--- a/code/modules/clothing/under/chameleon.dm
+++ b/code/modules/clothing/under/chameleon.dm
@@ -7,6 +7,7 @@
desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist."
origin_tech = "syndicate=3"
var/list/clothing_choices = list()
+ armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0)
New()
..()
@@ -38,11 +39,13 @@
desc = "Groovy!"
icon_state = "psyche"
item_color = "psyche"
+ usr.update_inv_w_uniform()
spawn(200)
- name = "Black Jumpsuit"
- icon_state = "bl_suit"
- item_color = "black"
- desc = null
+ name = initial(name)
+ icon_state = initial(icon_state)
+ item_color = initial(item_color)
+ desc = initial(desc)
+ usr.update_inv_w_uniform()
..()
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index e0386585f26..886d48932aa 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -16,7 +16,7 @@
icon_state = "black"
item_state = "bl_suit"
item_color = "black"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/color/blackf
name = "feminine black jumpsuit"
@@ -30,17 +30,18 @@
icon_state = "blue"
item_state = "b_suit"
item_color = "blue"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/color/blue/dodgeball
- flags = ONESIZEFITSALL | NODROP
+ flags = NODROP
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/color/green
name = "green jumpsuit"
icon_state = "green"
item_state = "g_suit"
item_color = "green"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/color/grey
name = "grey jumpsuit"
@@ -48,10 +49,19 @@
icon_state = "grey"
item_state = "gy_suit"
item_color = "grey"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/color/grey/greytide
- flags = ONESIZEFITSALL | NODROP
+ flags = NODROP
+ flags_size = ONESIZEFITSALL
+
+/obj/item/clothing/under/color/grey/glorf
+ name = "ancient jumpsuit"
+ desc = "A terribly ragged and frayed grey jumpsuit. It looks like it hasn't been washed in over a decade."
+
+/obj/item/clothing/under/color/grey/glorf/hit_reaction(mob/living/carbon/human/owner)
+ owner.forcesay(hit_appends)
+ return 0
/obj/item/clothing/under/color/orange
name = "orange jumpsuit"
@@ -59,7 +69,7 @@
icon_state = "orange"
item_state = "o_suit"
item_color = "orange"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/color/orange/prison
name = "orange jumpsuit"
@@ -69,7 +79,7 @@
item_color = "orange"
has_sensor = 2
sensor_mode = 3
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/color/pink
name = "pink jumpsuit"
@@ -77,31 +87,32 @@
icon_state = "pink"
item_state = "p_suit"
item_color = "pink"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/color/red
name = "red jumpsuit"
icon_state = "red"
item_state = "r_suit"
item_color = "red"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/color/red/dodgeball
- flags = ONESIZEFITSALL | NODROP
+ flags = NODROP
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/color/white
name = "white jumpsuit"
icon_state = "white"
item_state = "w_suit"
item_color = "white"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/color/yellow
name = "yellow jumpsuit"
icon_state = "yellow"
item_state = "y_suit"
item_color = "yellow"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/psyche
name = "psychedelic jumpsuit"
@@ -122,7 +133,7 @@
name = "aqua jumpsuit"
icon_state = "aqua"
item_color = "aqua"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/color/purple
name = "purple jumpsuit"
@@ -149,7 +160,7 @@
name = "light brown jumpsuit"
icon_state = "lightbrown"
item_color = "lightbrown"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/color/brown
name = "brown jumpsuit"
@@ -165,7 +176,7 @@
name = "dark blue jumpsuit"
icon_state = "darkblue"
item_color = "darkblue"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/color/lightred
name = "light red jumpsuit"
@@ -176,7 +187,7 @@
name = "dark red jumpsuit"
icon_state = "darkred"
item_color = "darkred"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/color/red/jersey
name = "red team jersey"
@@ -184,7 +195,7 @@
icon_state = "redjersey"
item_state = "r_suit"
item_color = "redjersey"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/color/blue/jersey
name = "blue team jersey"
@@ -192,4 +203,4 @@
icon_state = "bluejersey"
item_state = "b_suit"
item_color = "bluejersey"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm
index 78d9428d4b2..68307875b1b 100644
--- a/code/modules/clothing/under/jobs/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian.dm
@@ -6,7 +6,7 @@
icon_state = "ba_suit"
item_state = "ba_suit"
item_color = "ba_suit"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define.
desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Captain\"."
@@ -14,7 +14,7 @@
icon_state = "captain"
item_state = "caparmor"
item_color = "captain"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/cargo
name = "quartermaster's jumpsuit"
@@ -22,8 +22,15 @@
icon_state = "qm"
item_state = "lb_suit"
item_color = "qm"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
+/obj/item/clothing/under/rank/cargo/skirt
+ name = "quartermaster's jumpskirt"
+ desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper."
+ icon_state = "qmf"
+ item_color = "qmf"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ flags_size = null
/obj/item/clothing/under/rank/cargotech
name = "cargo technician's jumpsuit"
@@ -31,8 +38,14 @@
icon_state = "cargotech"
item_state = "lb_suit"
item_color = "cargo"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
+/obj/item/clothing/under/rank/cargotech/skirt
+ name = "cargo technician's jumpskirt"
+ desc = "Skirrrrrts! They're comfy and easy to wear!"
+ icon_state = "cargof"
+ item_color = "cargof"
+ flags_size = null
/obj/item/clothing/under/rank/chaplain
desc = "It's a black jumpsuit, often worn by religious folk."
@@ -40,14 +53,14 @@
icon_state = "chaplain"
item_state = "bl_suit"
item_color = "chapblack"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/chef
desc = "It's an apron which is given only to the most hardcore chefs in space."
name = "chef's uniform"
icon_state = "chef"
item_color = "chef"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/clown
name = "clown suit"
@@ -55,8 +68,11 @@
icon_state = "clown"
item_state = "clown"
item_color = "clown"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
+/obj/item/clothing/under/rank/clown/hit_reaction()
+ playsound(loc, 'sound/items/bikehorn.ogg', 50, 1, -1)
+ return 0
/obj/item/clothing/under/rank/head_of_personnel
desc = "It's a jumpsuit worn by someone who works in the position of \"Head of Personnel\"."
@@ -64,7 +80,7 @@
icon_state = "hop"
item_state = "b_suit"
item_color = "hop"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/head_of_personnel_whimsy
desc = "A blue jacket and red tie, with matching red cuffs! Snazzy. Wearing this makes you feel more important than your job title does."
@@ -81,7 +97,7 @@
item_state = "g_suit"
item_color = "hydroponics"
permeability_coefficient = 0.50
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/internalaffairs
desc = "The plain, professional attire of an Internal Affairs Agent. The collar is immaculately starched."
@@ -89,7 +105,7 @@
icon_state = "internalaffairs"
item_state = "internalaffairs"
item_color = "internalaffairs"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/ntrep
desc = "A well-ironed dress shirt and matching set of black pants."
@@ -97,21 +113,21 @@
icon_state = "internalaffairs"
item_state = "internalaffairs"
item_color = "internalaffairs"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/janitor
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
name = "janitor's jumpsuit"
icon_state = "janitor"
item_color = "janitor"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/lawyer
desc = "Slick threads."
name = "Lawyer suit"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/lawyer/black
icon_state = "lawyer_black"
@@ -160,7 +176,7 @@
icon_state = "red_suit"
item_state = "red_suit"
item_color = "red_suit"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/mime
name = "mime's outfit"
@@ -168,7 +184,7 @@
icon_state = "mime"
item_state = "mime"
item_color = "mime"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/miner
@@ -177,7 +193,7 @@
icon_state = "miner"
item_state = "miner"
item_color = "miner"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/barber
desc = "It's a barber's uniform."
diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm
index 4b91e82b2fc..9b604da7277 100644
--- a/code/modules/clothing/under/jobs/engineering.dm
+++ b/code/modules/clothing/under/jobs/engineering.dm
@@ -5,8 +5,16 @@
icon_state = "chiefengineer"
item_state = "g_suit"
item_color = "chief"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
- flags = ONESIZEFITSALL
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10)
+ flags_size = ONESIZEFITSALL
+
+/obj/item/clothing/under/rank/chief_engineer/skirt
+ desc = "It's a high visibility jumpskirt given to those engineers insane enough to achieve the rank of \"Chief engineer\". It has minor radiation shielding."
+ name = "chief engineer's jumpskirt"
+ icon_state = "chieff"
+ item_color = "chieff"
+ flags_size = null
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
/obj/item/clothing/under/rank/atmospheric_technician
desc = "It's a jumpsuit worn by atmospheric technicians."
@@ -14,7 +22,15 @@
icon_state = "atmos"
item_state = "atmos_suit"
item_color = "atmos"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
+
+/obj/item/clothing/under/rank/atmospheric_technician/skirt
+ desc = "It's a jumpskirt worn by atmospheric technicians."
+ name = "atmospheric technician's jumpskirt"
+ icon_state = "atmosf"
+ item_color = "atmosf"
+ flags_size = null
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
/obj/item/clothing/under/rank/engineer
desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding."
@@ -22,8 +38,17 @@
icon_state = "engine"
item_state = "engi_suit"
item_color = "engine"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
- flags = ONESIZEFITSALL
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10)
+ flags_size = ONESIZEFITSALL
+
+
+/obj/item/clothing/under/rank/engineer/skirt
+ desc = "It's an orange high visibility jumpskirt worn by engineers. It has minor radiation shielding."
+ name = "engineer's jumpskirt"
+ icon_state = "enginef"
+ item_color = "enginef"
+ flags_size = null
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
/obj/item/clothing/under/rank/roboticist
desc = "It's a slimming black with reinforced seams; great for industrial work."
@@ -31,7 +56,14 @@
icon_state = "robotics"
item_state = "robotics"
item_color = "robotics"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
+
+/obj/item/clothing/under/rank/roboticist/skirt
+ desc = "It's a slimming black jumpskirt with reinforced seams; great for industrial work."
+ name = "roboticist's jumpskirt"
+ icon_state = "roboticsf"
+ item_color = "roboticsf"
+ flags_size = null
/obj/item/clothing/under/rank/mechanic
desc = "It's a pair of overalls worn by mechanics."
diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm
index b6f83e78beb..a4f4f3c8b9f 100644
--- a/code/modules/clothing/under/jobs/medsci.dm
+++ b/code/modules/clothing/under/jobs/medsci.dm
@@ -7,8 +7,8 @@
icon_state = "director"
item_state = "g_suit"
item_color = "director"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 10, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0)
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/scientist
desc = "It's made of a special fiber that provides minor protection against biohazards. It has markings that denote the wearer as a scientist."
@@ -17,8 +17,15 @@
item_state = "w_suit"
item_color = "toxinswhite"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0)
+ flags_size = ONESIZEFITSALL
+
+/obj/item/clothing/under/rank/scientist/skirt
+ name = "scientist's jumpskirt"
+ icon_state = "sciencewhitef"
+ item_color = "sciencewhitef"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ flags_size = null
/obj/item/clothing/under/rank/chemist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a chemist rank stripe on it."
@@ -27,8 +34,15 @@
item_state = "w_suit"
item_color = "chemistrywhite"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
+ flags_size = ONESIZEFITSALL
+
+/obj/item/clothing/under/rank/chemist/skirt
+ name = "chemist's jumpskirt"
+ icon_state = "chemistrywhitef"
+ item_color = "chemistrywhitef"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ flags_size = null
/*
* Medical
@@ -40,8 +54,16 @@
item_state = "w_suit"
item_color = "cmo"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
+ flags_size = ONESIZEFITSALL
+
+/obj/item/clothing/under/rank/chief_medical_officer/skirt
+ desc = "It's a jumpskirt worn by those with the experience to be \"Chief Medical Officer\". It provides minor biological protection."
+ name = "chief medical officer's jumpskirt"
+ icon_state = "cmof"
+ item_color = "cmof"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ flags_size = null
/obj/item/clothing/under/rank/geneticist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a genetics rank stripe on it."
@@ -50,8 +72,15 @@
item_state = "w_suit"
item_color = "geneticswhite"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
+ flags_size = ONESIZEFITSALL
+
+/obj/item/clothing/under/rank/geneticist/skirt
+ name = "geneticist's jumpskirt"
+ icon_state = "geneticswhitef"
+ item_color = "geneticswhitef"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ flags_size = null
/obj/item/clothing/under/rank/virologist
desc = "It's made of a special fiber that gives special protection against biohazards. It has a virologist rank stripe on it."
@@ -60,8 +89,15 @@
item_state = "w_suit"
item_color = "virologywhite"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
+ flags_size = ONESIZEFITSALL
+
+/obj/item/clothing/under/rank/virologist/skirt
+ name = "virologist's jumpskirt"
+ icon_state = "virologywhitef"
+ item_color = "virologywhitef"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ flags_size = null
/obj/item/clothing/under/rank/nursesuit
desc = "It's a jumpsuit commonly worn by nursing staff in the medical department."
@@ -70,8 +106,8 @@
item_state = "nursesuit"
item_color = "nursesuit"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/nurse
desc = "A dress commonly worn by the nursing staff in the medical department."
@@ -80,8 +116,8 @@
item_state = "nurse"
item_color = "nurse"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/orderly
desc = "A white suit to be worn by orderly people who love orderly things."
@@ -90,8 +126,8 @@
item_state = "orderly"
item_color = "orderly"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/medical
desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel."
@@ -100,36 +136,43 @@
item_state = "w_suit"
item_color = "medical"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
+ flags_size = ONESIZEFITSALL
+
+/obj/item/clothing/under/rank/medical/skirt
+ name = "medical doctor's jumpskirt"
+ icon_state = "medicalf"
+ item_color = "medicalf"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ flags_size = null
/obj/item/clothing/under/rank/medical/blue
name = "medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in baby blue."
icon_state = "scrubsblue"
item_color = "scrubsblue"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/medical/green
name = "medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in dark green."
icon_state = "scrubsgreen"
item_color = "scrubsgreen"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/medical/purple
name = "medical scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is in deep purple."
icon_state = "scrubspurple"
item_color = "scrubspurple"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/medical/mortician
name = "coroner's scrubs"
desc = "It's made of a special fiber that provides minor protection against biohazards. This one is as dark as an emo's poetry."
icon_state = "scrubsblack"
item_color = "scrubsblack"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
//paramedic
/obj/item/clothing/under/rank/medical/paramedic
@@ -139,8 +182,8 @@
item_state = "paramedic"
item_color = "paramedic"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 10)
- flags = ONESIZEFITSALL
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 10)
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/psych
desc = "A basic white jumpsuit. It has turqouise markings that denote the wearer as a psychiatrist."
@@ -148,7 +191,7 @@
icon_state = "psych"
item_state = "w_suit"
item_color = "psych"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/psych/turtleneck
desc = "A turqouise turtleneck and a pair of dark blue slacks, belonging to a psychologist."
@@ -156,7 +199,7 @@
icon_state = "psychturtle"
item_state = "b_suit"
item_color = "psychturtle"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/*
@@ -169,8 +212,8 @@
item_state = "w_suit"
item_color = "genetics_new"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/chemist_new
desc = "It's made of a special fiber which provides minor protection against biohazards."
@@ -179,8 +222,8 @@
item_state = "w_suit"
item_color = "chemist_new"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/scientist_new
desc = "Made of a special fiber that gives special protection against biohazards and small explosions."
@@ -189,8 +232,8 @@
item_state = "w_suit"
item_color = "scientist_new"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 0, rad = 0)
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/virologist_new
desc = "Made of a special fiber that gives increased protection against biohazards."
@@ -199,5 +242,5 @@
item_state = "w_suit"
item_color = "virologist_new"
permeability_coefficient = 0.50
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
+ flags_size = ONESIZEFITSALL
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index d40952e2030..71eb07c89eb 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -15,28 +15,44 @@
icon_state = "warden"
item_state = "r_suit"
item_color = "warden"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
+ flags_size = ONESIZEFITSALL
strip_delay = 50
+/obj/item/clothing/under/rank/warden/skirt
+ desc = "Standard feminine fashion for a Warden. It is made of sturdier material than standard jumpskirts. It has the word \"Warden\" written on the shoulders."
+ name = "warden's jumpskirt"
+ icon_state = "wardenf"
+ item_state = "r_suit"
+ item_color = "wardenf"
+ flags_size = null
+
/obj/item/clothing/under/rank/security
name = "security officer's jumpsuit"
desc = "It's made of a slightly sturdier material than standard jumpsuits, to allow for robust protection."
icon_state = "security"
item_state = "r_suit"
item_color = "secred"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
+ flags_size = ONESIZEFITSALL
strip_delay = 50
+/obj/item/clothing/under/rank/security/skirt
+ name = "security officer's jumpskirt"
+ desc = "Standard feminine fashion for Security Officers. It's made of sturdier material than the standard jumpskirts."
+ icon_state = "secredf"
+ item_state = "r_suit"
+ item_color = "secredf"
+ flags_size = null
+
/obj/item/clothing/under/rank/dispatch
name = "dispatcher's uniform"
desc = "A dress shirt and khakis with a security patch sewn on."
icon_state = "dispatch"
item_state = "dispatch"
item_color = "dispatch"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/security2
name = "security officer's uniform"
@@ -44,8 +60,9 @@
icon_state = "redshirt2"
item_state = "r_suit"
item_color = "redshirt2"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
+ flags_size = ONESIZEFITSALL
+
/obj/item/clothing/under/rank/security/corp
icon_state = "sec_corporate"
item_state = "sec_corporate"
@@ -65,8 +82,8 @@
icon_state = "detective"
item_state = "det"
item_color = "detective"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
+ flags_size = ONESIZEFITSALL
strip_delay = 50
species_fit = list("Vox")
sprite_sheets = list(
@@ -82,10 +99,18 @@
icon_state = "hos"
item_state = "r_suit"
item_color = "hosred"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
- flags = ONESIZEFITSALL
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
+ flags_size = ONESIZEFITSALL
strip_delay = 60
+/obj/item/clothing/under/rank/head_of_security/skirt
+ desc = "It's a fashionable jumpskirt worn by those few with the dedication to achieve the position of \"Head of Security\". It has additional armor to protect the wearer."
+ name = "head of security's jumpskirt"
+ icon_state = "hosredf"
+ item_state = "r_suit"
+ item_color = "hosredf"
+ flags_size = null
+
/obj/item/clothing/under/rank/head_of_security/corp
icon_state = "hos_corporate"
item_state = "hos_corporate"
@@ -98,7 +123,7 @@
icon_state = "jensen"
item_state = "jensen"
item_color = "jensen"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
//Paradise Station
@@ -154,5 +179,5 @@
item_state = "brig_phys"
item_color = "brig_phys"
permeability_coefficient = 0.50
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
- flags = ONESIZEFITSALL
\ No newline at end of file
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
+ flags_size = ONESIZEFITSALL
\ No newline at end of file
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 9533d7c4aae..d912a2e289d 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -88,7 +88,7 @@
item_state = "g_suit"
item_color = "officer"
displays_id = 0
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/centcom/captain
desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Captain\" and bears \"N.C.V. Fearless CV-286\" on the left shounder."
@@ -105,7 +105,7 @@
item_state = "g_suit"
item_color = "officer"
displays_id = 0
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/centcom/representative
desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Ensign\" and bears \"N.S.S. Cyberiad\" on the left shounder."
@@ -114,7 +114,7 @@
item_state = "g_suit"
item_color = "officer"
displays_id = 0
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/centcom/diplomatic
desc = "A very gaudy and official looking uniform of the Nanotrasen Diplomatic Corps."
@@ -130,7 +130,7 @@
icon_state = "ert_uniform"
item_state = "bl_suit"
item_color = "ert_uniform"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/under/space
name = "\improper NASA jumpsuit"
@@ -156,7 +156,7 @@
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS|HEAD
- armor = list(melee = 100, bullet = 100, laser = 100,energy = 100, bomb = 100, bio = 100, rad = 100)
+ armor = list(melee = 100, bullet = 100, laser = 100, energy = 100, bomb = 100, bio = 100, rad = 100)
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
heat_protection = UPPER_TORSO | LOWER_TORSO|LEGS|FEET|ARMS|HANDS | HEAD
@@ -231,7 +231,7 @@
icon_state = "red_suit"
item_state = "r_suit"
item_color = "red_suit"
- flags = ONESIZEFITSALL
+ flags_size = ONESIZEFITSALL
/obj/item/clothing/under/suit_jacket/navy
name = "navy suit"
@@ -568,7 +568,7 @@
icon_state = "vengine"
item_state = "vengine"
item_color = "vengine"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10)
/obj/item/clothing/under/vox_sec
name = "Vox Security Jumpsuit"
@@ -576,7 +576,7 @@
icon_state = "vred"
item_state = "vred"
item_color = "vred"
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/under/vox_chem
name = "Vox Chemist Jumpsuit"
@@ -584,7 +584,7 @@
icon_state = "vchem"
item_state = "vchem"
item_color = "vchem"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
/obj/item/clothing/under/psyjump
name = "Psychic Amp Jumpsuit"
@@ -709,3 +709,15 @@
to_chat(user,"You can't fit inside while wearing that \the [user.get_item_by_slot(slot_id)]. ")
return 0
return 1
+
+/obj/item/clothing/under/cursedclown
+ name = "cursed clown suit"
+ desc = "It wasn't already?"
+ icon = 'icons/goonstation/objects/clothing/uniform.dmi'
+ icon_state = "cursedclown"
+ item_state = "cclown_uniform"
+ item_color = "cursedclown"
+ icon_override = 'icons/goonstation/mob/clothing/uniform.dmi'
+ lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi'
+ righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi'
+ flags = NODROP
diff --git a/code/modules/clothing/under/pants.dm b/code/modules/clothing/under/pants.dm
index 8beff8f41f3..e39691d857f 100644
--- a/code/modules/clothing/under/pants.dm
+++ b/code/modules/clothing/under/pants.dm
@@ -86,4 +86,4 @@
desc = "For those brave enough to weather the breeze."
icon_state = "chaps"
item_color = "chaps"
- flags = ONESIZEFITSALL
\ No newline at end of file
+ flags_size = ONESIZEFITSALL
\ No newline at end of file
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index cfe317aaa3b..198a3e46de9 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -1,18 +1,19 @@
/obj/item/clothing/under/syndicate
name = "tactical turtleneck"
- desc = "It's some non-descript, slightly suspicious looking, support clothing."
+ desc = "A non-descript and slightly suspicious looking turtleneck with digital camouflage cargo pants."
icon_state = "syndicate"
item_state = "bl_suit"
item_color = "syndicate"
has_sensor = 0
- armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/under/syndicate/combat
name = "combat turtleneck"
/obj/item/clothing/under/syndicate/tacticool
- name = "\improper Tacticool turtleneck"
+ name = "tacticool turtleneck"
desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-."
icon_state = "tactifool"
item_state = "bl_suit"
- item_color = "tactifool"
\ No newline at end of file
+ item_color = "tactifool"
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
\ No newline at end of file
diff --git a/code/modules/computer3/NTOS.dm b/code/modules/computer3/NTOS.dm
index 5119084f0e6..bc70c49cbac 100644
--- a/code/modules/computer3/NTOS.dm
+++ b/code/modules/computer3/NTOS.dm
@@ -61,7 +61,7 @@
dat += {"
- \icon[C]
+ [bicon(C)]
[C.name]
"}
diff --git a/code/modules/computer3/buildandrepair.dm b/code/modules/computer3/buildandrepair.dm
index 4ea984d15d1..2165205e354 100644
--- a/code/modules/computer3/buildandrepair.dm
+++ b/code/modules/computer3/buildandrepair.dm
@@ -2,7 +2,7 @@
/obj/item/part/computer/circuitboard
density = 0
anchored = 0
- w_class = 2.0
+ w_class = 2
name = "Circuit board"
icon = 'icons/obj/module.dmi'
icon_state = "id_mod"
diff --git a/code/modules/computer3/component.dm b/code/modules/computer3/component.dm
index 6dac7aebb31..0070c057fcd 100644
--- a/code/modules/computer3/component.dm
+++ b/code/modules/computer3/component.dm
@@ -14,7 +14,7 @@
gender = PLURAL
icon = 'icons/obj/stock_parts.dmi'
icon_state = "hdd1"
- w_class = 2.0
+ w_class = 2
var/emagged = 0
crit_fail = 0
@@ -116,9 +116,9 @@
if(3)
if(equip_to_reader(card, L))
to_chat(usr, "You insert the card into reader slot")
- else if (equip_to_writer(card, L) && dualslot)
+ else if(equip_to_writer(card, L) && dualslot)
to_chat(usr, "You insert the card into writer slot")
- else if (dualslot)
+ else if(dualslot)
to_chat(usr, "There is already something in both slots.")
else
to_chat(usr, "There is already something in the reader slot.")
@@ -146,18 +146,18 @@
var/mob/living/L = usr
switch(slot)
if(1)
- if (remove_reader(L))
+ if(remove_reader(L))
to_chat(L, "You remove the card from reader slot")
else
to_chat(L, "There is no card in the reader slot")
if(2)
- if (remove_writer(L))
+ if(remove_writer(L))
to_chat(L, "You remove the card from writer slot")
else
to_chat(L, "There is no card in the writer slot")
if(3)
- if (remove_reader(L))
- if (remove_writer(L))
+ if(remove_reader(L))
+ if(remove_writer(L))
to_chat(L, "You remove cards from both slots")
else
to_chat(L, "You remove the card from reader slot")
@@ -167,10 +167,10 @@
else
to_chat(L, "There are no cards in both slots")
if(4)
- if (!remove_reader(L))
- if (remove_writer(L))
+ if(!remove_reader(L))
+ if(remove_writer(L))
to_chat(L, "You remove the card from writer slot")
- else if (!dualslot)
+ else if(!dualslot)
to_chat(L, "There is no card in the reader slot")
else
to_chat(L, "There are no cards in both slots")
diff --git a/code/modules/computer3/computer.dm b/code/modules/computer3/computer.dm
index 75252b33107..eca1207c692 100644
--- a/code/modules/computer3/computer.dm
+++ b/code/modules/computer3/computer.dm
@@ -212,15 +212,15 @@
qdel(src)
return
if(2.0)
- if (prob(25))
+ if(prob(25))
qdel(src)
return
- if (prob(50))
+ if(prob(50))
for(var/x in verbs)
verbs -= x
set_broken()
if(3.0)
- if (prob(25))
+ if(prob(25))
for(var/x in verbs)
verbs -= x
set_broken()
@@ -229,7 +229,7 @@
blob_act()
- if (prob(75))
+ if(prob(75))
set_broken()
density = 0
@@ -443,7 +443,7 @@
//Returns percentage of battery charge remaining. Returns -1 if no battery is installed.
proc/check_battery_status()
- if (battery)
+ if(battery)
var/obj/item/weapon/stock_parts/cell/B = battery
return round(B.charge / (B.maxcharge / 100))
else
diff --git a/code/modules/computer3/computers/aifixer.dm b/code/modules/computer3/computers/aifixer.dm
index a52e40a0d54..7e1f3959e9f 100644
--- a/code/modules/computer3/computers/aifixer.dm
+++ b/code/modules/computer3/computers/aifixer.dm
@@ -19,7 +19,7 @@
if(!computer.cradle.occupant)
overlay.icon_state = "ai-fixer-empty"
else
- if (computer.cradle.occupant.health >= 0 && computer.cradle.occupant.stat != 2)
+ if(computer.cradle.occupant.health >= 0 && computer.cradle.occupant.stat != 2)
overlay.icon_state = "ai-fixer-full"
else
overlay.icon_state = "ai-fixer-404"
@@ -39,34 +39,34 @@
proc/aifixer_menu()
var/dat = ""
- if (computer.cradle.occupant)
+ if(computer.cradle.occupant)
var/laws
dat += "Stored AI: [computer.cradle.occupant.name] "
dat += "System integrity: [(computer.cradle.occupant.health+100)/2]% "
- if (computer.cradle.occupant.laws.zeroth)
+ if(computer.cradle.occupant.laws.zeroth)
laws += "0: [computer.cradle.occupant.laws.zeroth] "
var/number = 1
- for (var/index = 1, index <= computer.cradle.occupant.laws.inherent.len, index++)
+ for(var/index = 1, index <= computer.cradle.occupant.laws.inherent.len, index++)
var/law = computer.cradle.occupant.laws.inherent[index]
- if (length(law) > 0)
+ if(length(law) > 0)
laws += "[number]: [law] "
number++
- for (var/index = 1, index <= computer.cradle.occupant.laws.supplied.len, index++)
+ for(var/index = 1, index <= computer.cradle.occupant.laws.supplied.len, index++)
var/law = computer.cradle.occupant.laws.supplied[index]
- if (length(law) > 0)
+ if(length(law) > 0)
laws += "[number]: [law] "
number++
dat += "Laws: [laws] "
- if (computer.cradle.occupant.stat == 2)
+ if(computer.cradle.occupant.stat == 2)
dat += "AI non-functional "
else
dat += "AI functional "
- if (!computer.cradle.busy)
+ if(!computer.cradle.busy)
dat += " [topic_link(src,"fix","Begin Reconstruction")]"
else
dat += " Reconstruction in process, please wait. "
@@ -77,7 +77,7 @@
if(!interactable() || !computer.cradle || ..(href,href_list))
return
- if ("fix" in href_list)
+ if("fix" in href_list)
var/mob/living/silicon/ai/occupant = computer.cradle.occupant
if(!occupant) return
@@ -85,7 +85,7 @@
computer.overlays += image('icons/obj/computer.dmi', "ai-fixer-on")
var/i = 0
- while (occupant.health < 100)
+ while(occupant.health < 100)
if(!computer || (computer.stat&~MAINT)) // takes some time, keep checking
break
@@ -94,7 +94,7 @@
occupant.adjustToxLoss(-1)
occupant.adjustBruteLoss(-1)
occupant.updatehealth()
- if (occupant.health >= 0 && computer.cradle.occupant.stat == 2)
+ if(occupant.health >= 0 && computer.cradle.occupant.stat == 2)
occupant.stat = 0
occupant.lying = 0
dead_mob_list -= occupant
diff --git a/code/modules/computer3/computers/arcade.dm b/code/modules/computer3/computers/arcade.dm
index 6949bfff107..29ada5126c3 100644
--- a/code/modules/computer3/computers/arcade.dm
+++ b/code/modules/computer3/computers/arcade.dm
@@ -76,7 +76,7 @@
dat += "[temp] "
dat += "Health: [player_hp] | Magic: [player_mp] | Enemy Health: [enemy_hp] "
- if (gameover)
+ if(gameover)
dat += "[topic_link(src,"newgame","New Game")]"
else
dat += " [topic_link(src,"attack","Attack")] | [topic_link(src,"heal","Heal")] | [topic_link(src,"charge","Recharge Power")]"
@@ -89,8 +89,8 @@
/datum/file/program/arcade/Topic(href, list/href_list)
if(!interactable() || ..(href,href_list))
return
- if (!blocked && !gameover)
- if ("attack" in href_list)
+ if(!blocked && !gameover)
+ if("attack" in href_list)
blocked = 1
var/attackamt = rand(2,6)
temp = "You attack for [attackamt] damage!"
@@ -102,7 +102,7 @@
enemy_hp -= attackamt
arcade_action()
- else if ("heal" in href_list)
+ else if("heal" in href_list)
blocked = 1
var/pointamt = rand(1,3)
var/healamt = rand(6,8)
@@ -117,7 +117,7 @@
computer.updateUsrDialog()
arcade_action()
- else if ("charge" in href_list)
+ else if("charge" in href_list)
blocked = 1
var/chargeamt = rand(4,7)
temp = "You regain [chargeamt] points"
@@ -129,7 +129,7 @@
sleep(10)
arcade_action()
- if ("newgame" in href_list) //Reset everything
+ if("newgame" in href_list) //Reset everything
temp = "New Round"
player_hp = 30
player_mp = 10
@@ -141,25 +141,25 @@
/datum/file/program/arcade/proc/arcade_action()
- if ((enemy_mp <= 0) || (enemy_hp <= 0))
+ if((enemy_mp <= 0) || (enemy_hp <= 0))
if(!gameover)
gameover = 1
temp = "[enemy_name] has fallen! Rejoice!"
if(computer.toybox)
computer.toybox.dispense()
- else if ((enemy_mp <= 5) && (prob(70)))
+ else if((enemy_mp <= 5) && (prob(70)))
var/stealamt = rand(2,3)
temp = "[enemy_name] steals [stealamt] of your power!"
player_mp -= stealamt
- if (player_mp <= 0)
+ if(player_mp <= 0)
gameover = 1
sleep(10)
temp = "You have been drained! GAME OVER"
feedback_inc("arcade_loss_mana_normal")
- else if ((enemy_hp <= 10) && (enemy_mp > 4))
+ else if((enemy_hp <= 10) && (enemy_mp > 4))
temp = "[enemy_name] heals for 4 health!"
enemy_hp += 4
enemy_mp -= 4
@@ -169,7 +169,7 @@
temp = "[enemy_name] attacks for [attackamt] damage!"
player_hp -= attackamt
- if ((player_mp <= 0) || (player_hp <= 0))
+ if((player_mp <= 0) || (player_hp <= 0))
gameover = 1
temp = "You have been crushed! GAME OVER"
feedback_inc("arcade_loss_hp_normal")
diff --git a/code/modules/computer3/computers/atmos_alert.dm b/code/modules/computer3/computers/atmos_alert.dm
index 1d834565cac..894286d334b 100644
--- a/code/modules/computer3/computers/atmos_alert.dm
+++ b/code/modules/computer3/computers/atmos_alert.dm
@@ -41,7 +41,7 @@
priority_alarms -= zone
if(severity=="severe")
priority_alarms += zone
- else if (severity=="minor")
+ else if(severity=="minor")
minor_alarms += zone
update_icon()
return
diff --git a/code/modules/computer3/computers/camera.dm b/code/modules/computer3/computers/camera.dm
index 7cf5fd0439a..cb31379a59f 100644
--- a/code/modules/computer3/computers/camera.dm
+++ b/code/modules/computer3/computers/camera.dm
@@ -181,7 +181,7 @@
//proc/camera_list(var/datum/file/camnet_key/key)
get_machines(var/datum/file/camnet_key/key)
- if (!computer || computer.z > 6)
+ if(!computer || computer.z > 6)
return null
var/list/L = list()
diff --git a/code/modules/computer3/computers/card.dm b/code/modules/computer3/computers/card.dm
index 978d597144e..1a6fe38a46e 100644
--- a/code/modules/computer3/computers/card.dm
+++ b/code/modules/computer3/computers/card.dm
@@ -181,7 +181,7 @@
// assume linked_db since called by interact()
var/crew = ""
var/list/L = list()
- for (var/datum/data/record/t in data_core.general)
+ for(var/datum/data/record/t in data_core.general)
var/R = t.fields["name"] + " - " + t.fields["rank"]
L += R
for(var/R in sortList(L))
@@ -269,7 +269,7 @@
computer.cardslot.insert(card,1)
if("print" in href_list)
- if (printing)
+ if(printing)
return
printing = 1
@@ -277,7 +277,7 @@
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( computer.loc )
P.info = "Crew Manifest: "
var/list/L = list()
- for (var/datum/data/record/t in data_core.general)
+ for(var/datum/data/record/t in data_core.general)
var/R = t.fields["name"] + " - " + t.fields["rank"]
L += R
for(var/R in sortList(L))
diff --git a/code/modules/computer3/computers/cloning.dm b/code/modules/computer3/computers/cloning.dm
index f90ba3e57e3..73978ad6aed 100644
--- a/code/modules/computer3/computers/cloning.dm
+++ b/code/modules/computer3/computers/cloning.dm
@@ -35,29 +35,29 @@
scanner = locate(/obj/machinery/dna_scannernew) in nearby
pod1 = locate(/obj/machinery/clonepod) in nearby
- if (pod1)
+ if(pod1)
pod1.connected = src // Some variable the pod needs
proc/ScanningMenu()
- if (isnull(scanner))
+ if(isnull(scanner))
return "ERROR: No Scanner detected! "
var/dat = "Scanner Functions "
dat += " "
- if (!scanner.occupant)
+ if(!scanner.occupant)
dat += "Scanner Unoccupied"
else if(loading)
dat += "[scanner.occupant] => Scanning..."
else
- if (scanner.occupant.ckey != scantemp_ckey)
+ if(scanner.occupant.ckey != scantemp_ckey)
scantemp = "Ready to Scan"
scantemp_ckey = scanner.occupant.ckey
dat += "[scanner.occupant] => [scantemp]"
dat += "
"
- if (scanner.occupant)
+ if(scanner.occupant)
dat += topic_link(src,"scan","Start Scan") + " "
if(scanner.locked)
dat += topic_link(src,"lock","Unlock Scanner")
@@ -68,12 +68,12 @@
// Footer
dat += "Database Functions "
- if (records.len > 0)
+ if(records.len > 0)
dat += topic_link(src,"menu=2","View Records ([records.len])") + " "
else
dat += fake_link("View Records (0)")
- if (has_disk)
+ if(has_disk)
dat += topic_link(src,"eject_disk","Eject Disk") + " "
return dat
@@ -88,7 +88,7 @@
var/dat = "Selected Record "
to_chat(dat += topic_link(src,"menu=2",", Back") + " ")
- if (!active_record)
+ if(!active_record)
dat += "Record not found. "
else
dat += "[active_record.fields["name"]] "
@@ -96,7 +96,7 @@
var/obj/item/weapon/implant/health/H = locate(active_record.fields["imp"])
- if ((H) && (istype(H)))
+ if((H) && (istype(H)))
dat += "Health Implant Data: [H.sensehealth()] "
else
dat += "Unable to locate Health Implant. "
@@ -104,11 +104,11 @@
dat += "Unique Identifier: [active_record.fields["UI"]] "
dat += "Structural Enzymes: [active_record.fields["SE"]] "
- if (has_disk)
+ if(has_disk)
dat += ""
dat += "
Inserted Disk "
dat += "
Contents: "
- if (computer.floppy.inserted.files.len == 0)
+ if(computer.floppy.inserted.files.len == 0)
dat += "
Empty "
else
for(var/datum/file/data/genome/G in computer.floppy.inserted.files)
@@ -170,9 +170,9 @@
if(loading || !interactable())
return
- if (href_list["menu"])
+ if(href_list["menu"])
menu = text2num(href_list["menu"])
- else if (("scan" in href_list) && !isnull(scanner))
+ else if(("scan" in href_list) && !isnull(scanner))
scantemp = ""
loading = 1
@@ -186,16 +186,16 @@
//No locking an open scanner.
- else if (("lock" in href_list) && !isnull(scanner))
- if ((!scanner.locked) && (scanner.occupant))
+ else if(("lock" in href_list) && !isnull(scanner))
+ if((!scanner.locked) && (scanner.occupant))
scanner.locked = 1
else
scanner.locked = 0
- else if ("view_rec" in href_list)
+ else if("view_rec" in href_list)
active_record = locate(href_list["view_rec"])
if(istype(active_record,/datum/data/record))
- if ( !active_record.fields["ckey"] || active_record.fields["ckey"] == "" )
+ if( !active_record.fields["ckey"] || active_record.fields["ckey"] == "" )
del(active_record)
temp = "
Record Corrupt "
else
@@ -204,16 +204,16 @@
active_record = null
temp = "Record missing."
- else if ("del_rec" in href_list)
- if ((!active_record) || (menu < 3))
+ else if("del_rec" in href_list)
+ if((!active_record) || (menu < 3))
return
- if (menu == 3) //If we are viewing a record, confirm deletion
+ if(menu == 3) //If we are viewing a record, confirm deletion
temp = "Delete record?"
menu = 4
- else if (menu == 4)
+ else if(menu == 4)
var/obj/item/weapon/card/id/C = usr.get_active_hand()
- if (istype(C)||istype(C, /obj/item/device/pda))
+ if(istype(C)||istype(C, /obj/item/device/pda))
if(check_access(C))
temp = "[active_record.fields["name"]] => Record deleted."
records.Remove(active_record)
@@ -222,7 +222,7 @@
else
temp = "
Access Denied. "
- else if ("eject_disk" in href_list)
+ else if("eject_disk" in href_list)
if(computer.floppy)
computer.floppy.eject_disk()
@@ -243,7 +243,7 @@
if(/datum/file/data/genome/cloning)
active_record = G:record
else if("savefile" in href_list)
- if (!active_record || !computer || !computer.floppy)
+ if(!active_record || !computer || !computer.floppy)
temp = "
Save error. "
computer.updateUsrDialog()
return
@@ -272,10 +272,10 @@
if(!rval)
temp = "
Disk write error. "
- else if ("refresh" in href_list)
+ else if("refresh" in href_list)
computer.updateUsrDialog()
- else if ("clone" in href_list)
+ else if("clone" in href_list)
//Look for that player! They better be dead!
if(active_record)
//Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs.
@@ -303,22 +303,22 @@
return
proc/scan_mob(mob/living/carbon/human/subject as mob)
- if ((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna))
+ if((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna))
scantemp = "
Unable to locate valid genetic data. "
return
- if (!getbrain(subject))
+ if(!getbrain(subject))
scantemp = "
No signs of intelligence detected. "
return
- if (subject.suiciding == 1)
+ if(subject.suiciding == 1)
scantemp = "
Subject's brain is not responding to scanning stimuli. "
return
- if ((!subject.ckey) || (!subject.client))
+ if((!subject.ckey) || (!subject.client))
scantemp = "
Mental interface failure. "
return
- if (NOCLONE in subject.mutations)
+ if(NOCLONE in subject.mutations)
scantemp = "
Mental interface failure. "
return
- if (!isnull(find_record(subject.ckey)))
+ if(!isnull(find_record(subject.ckey)))
scantemp = "
Subject already in database. "
return
@@ -341,7 +341,7 @@
//Add an implant if needed
var/obj/item/weapon/implant/health/imp = locate(/obj/item/weapon/implant/health, subject)
- if (isnull(imp))
+ if(isnull(imp))
imp = new /obj/item/weapon/implant/health(subject)
imp.implanted = subject
R.fields["imp"] = "\ref[imp]"
@@ -349,7 +349,7 @@
else
R.fields["imp"] = "\ref[imp]"
- if (!isnull(subject.mind)) //Save that mind so traitors can continue traitoring after cloning.
+ if(!isnull(subject.mind)) //Save that mind so traitors can continue traitoring after cloning.
R.fields["mind"] = "\ref[subject.mind]"
records += R
@@ -358,6 +358,6 @@
//Find a specific record by key.
proc/find_record(var/find_key)
for(var/datum/data/record/R in records)
- if (R.fields["ckey"] == find_key)
+ if(R.fields["ckey"] == find_key)
return R
return null
diff --git a/code/modules/computer3/computers/communications.dm b/code/modules/computer3/computers/communications.dm
index b738cef704e..2f02bdcfdb3 100644
--- a/code/modules/computer3/computers/communications.dm
+++ b/code/modules/computer3/computers/communications.dm
@@ -59,8 +59,8 @@
Topic(var/href, var/list/href_list)
if(!interactable() || !computer.radio || ..(href,href_list) )
return
- if (!(computer.z in config.station_levels))
- to_chat(usr, "\red
Unable to establish a connection : \black You're too far away from the station!")
+ if(!(computer.z in config.station_levels))
+ to_chat(usr, "
Unable to establish a connection : You're too far away from the station!")
return
if("main" in href_list)
@@ -85,7 +85,7 @@
var/obj/item/I = M.get_active_hand()
I = I.GetID()
- if (istype(I,/obj/item/weapon/card/id))
+ if(istype(I,/obj/item/weapon/card/id))
if(access_captain in I.GetAccess())
var/old_level = security_level
if(!tmp_alertlevel) tmp_alertlevel = SEC_LEVEL_GREEN
@@ -146,7 +146,7 @@
state = STATE_MESSAGELIST
if("viewmessage" in href_list)
state = STATE_VIEWMESSAGE
- if (!currmsg)
+ if(!currmsg)
if(href_list["message-num"])
currmsg = text2num(href_list["message-num"])
else
@@ -247,7 +247,7 @@
aistate = STATE_MESSAGELIST
if("ai-viewmessage" in href_list)
aistate = STATE_VIEWMESSAGE
- if (!aicurrmsg)
+ if(!aicurrmsg)
if(href_list["message-num"])
aicurrmsg = text2num(href_list["message-num"])
else
@@ -281,16 +281,16 @@
proc/main_menu()
var/dat = ""
- if (computer.radio.subspace)
+ if(computer.radio.subspace)
if(shuttle_master.emergency.mode == SHUTTLE_CALL)
var/timeleft = shuttle_master.emergency.timeLeft()
dat += "
Emergency shuttle \n
\nETA: [timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)]"
refresh = 1
else
refresh = 0
- if (authenticated)
+ if(authenticated)
dat += "
\[
Log Out \]"
- if (authenticated==2)
+ if(authenticated==2)
dat += "
\[
Make An Announcement \]"
if(computer.emagged == 0)
dat += "
\[
Send an emergency message to Centcomm \]"
@@ -300,7 +300,7 @@
dat += "
\[
Change alert level \]"
/*if(emergency_shuttle.location())
- if (emergency_shuttle.online())
+ if(emergency_shuttle.online())
dat += "
\[
Cancel Shuttle Call \]"
else
dat += "
\[
Call Emergency Shuttle \]"*/
@@ -335,16 +335,16 @@
for(var/i = 1; i<=messagetitle.len; i++)
dat += "
[messagetitle[i]] "
if(STATE_VIEWMESSAGE)
- if (currmsg)
+ if(currmsg)
dat += "
[messagetitle[currmsg]] [messagetext[currmsg]]"
- if (authenticated)
+ if(authenticated)
dat += "
\[
Delete \]"
else
state = STATE_MESSAGELIST
interact()
return
if(STATE_DELMESSAGE)
- if (currmsg)
+ if(currmsg)
dat += "Are you sure you want to delete this message? \[ OK |
Cancel \]"
else
state = STATE_MESSAGELIST
diff --git a/code/modules/computer3/computers/law.dm b/code/modules/computer3/computers/law.dm
index ec278163b2a..d75a016f680 100644
--- a/code/modules/computer3/computers/law.dm
+++ b/code/modules/computer3/computers/law.dm
@@ -24,8 +24,8 @@
attackby(obj/item/weapon/aiModule/module as obj, mob/user as mob, params)
- if (user.z > 6)
- to_chat(user, "\red
Unable to establish a connection : \black You're too far away from the station!")
+ if(user.z > 6)
+ to_chat(user, "
Unable to establish a connection : You're too far away from the station!")
return
if(istype(module, /obj/item/weapon/aiModule))
module.install(src)
@@ -43,7 +43,7 @@
src.current = select_active_ai(user)
- if (!src.current)
+ if(!src.current)
to_chat(usr, "No active AIs detected.")
else
to_chat(usr, "[src.current.name] selected for law changes.")
@@ -75,7 +75,7 @@
src.current = freeborg()
- if (!src.current)
+ if(!src.current)
to_chat(usr, "No free cyborgs detected.")
else
to_chat(usr, "[src.current.name] selected for law changes.")
diff --git a/code/modules/computer3/computers/medical.dm b/code/modules/computer3/computers/medical.dm
index aeda16c4414..27002c264c2 100644
--- a/code/modules/computer3/computers/medical.dm
+++ b/code/modules/computer3/computers/medical.dm
@@ -49,21 +49,21 @@
scan = computer.cardslot.reader
if(!interactable())
return
- if (computer.z > 6)
- to_chat(usr, "\red
Unable to establish a connection : \black You're too far away from the station!")
+ if(computer.z > 6)
+ to_chat(usr, "
Unable to establish a connection : You're too far away from the station!")
return
var/dat
- if (temp)
+ if(temp)
dat = text("
[src.temp] Clear Screen ")
else
dat = text("Confirm Identity (R):
[] ", src, (scan ? text("[]", scan.name) : "----------"))
- if (computer.cardslot.dualslot)
+ if(computer.cardslot.dualslot)
dat += text("Check Identity (W):
[] ", src, (scan2 ? text("[]", scan2.name) : "----------"))
if(scan2 && !scan)
dat += text("
Insert card into reader slot to log in.
")
- if (src.authenticated)
+ if(src.authenticated)
switch(src.screen)
if(1.0)
dat += {"
@@ -86,12 +86,8 @@
if(3.0)
dat += text("
Records Maintenance \n
Backup To Disk \n
Upload From disk \n
Delete All Records \n
\n
Back ", src, src, src, src)
if(4.0)
- var/icon/front = new(active1.fields["photo"], dir = SOUTH)
- var/icon/side = new(active1.fields["photo"], dir = WEST)
- usr << browse_rsc(front, "front.png")
- usr << browse_rsc(side, "side.png")
dat += "
Medical Record "
- if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
+ if((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
dat += "
"
+ Photo:
\
+
"
else
dat += "General Record Lost! "
- if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
+ if((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
dat += text(" \nMedical Data \nBlood Type: [] \nDNA: [] \n \nMinor Disabilities: [] \nDetails: [] \n \nMajor Disabilities: [] \nDetails: [] \n \nAllergies: [] \nDetails: [] \n \nCurrent Diseases: [] (per disease info placed in log/comment section) \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", src, src.active2.fields["b_type"], src, src.active2.fields["b_dna"], src, src.active2.fields["mi_dis"], src, src.active2.fields["mi_dis_d"], src, src.active2.fields["ma_dis"], src, src.active2.fields["ma_dis_d"], src, src.active2.fields["alg"], src, src.active2.fields["alg_d"], src, src.active2.fields["cdi"], src, src.active2.fields["cdi_d"], src, decode(src.active2.fields["notes"]))
var/counter = 1
while(src.active2.fields[text("com_[]", counter)])
@@ -157,16 +154,16 @@
Topic(href, href_list)
if(!interactable() || !computer.cardslot || ..(href,href_list))
return
- if (!( data_core.general.Find(src.active1) ))
+ if(!( data_core.general.Find(src.active1) ))
src.active1 = null
- if (!( data_core.medical.Find(src.active2) ))
+ if(!( data_core.medical.Find(src.active2) ))
src.active2 = null
- if (href_list["temp"])
+ if(href_list["temp"])
src.temp = null
- if (href_list["cardr"])
- if (scan)
+ if(href_list["cardr"])
+ if(scan)
if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
computer.cardslot.remove(1)
else
@@ -174,12 +171,12 @@
scan = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
computer.cardslot.insert(I, 1)
scan = I
- if (href_list["cardw"])
- if (scan2)
+ if(href_list["cardw"])
+ if(scan2)
if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
computer.cardslot.remove(2)
else
@@ -187,26 +184,26 @@
scan2 = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
computer.cardslot.insert(I, 2)
scan2 = I
- else if (href_list["logout"])
+ else if(href_list["logout"])
src.authenticated = null
src.screen = null
src.active1 = null
src.active2 = null
- else if (href_list["login"])
+ else if(href_list["login"])
- if (istype(usr, /mob/living/silicon/ai))
+ if(istype(usr, /mob/living/silicon/ai))
src.active1 = null
src.active2 = null
src.authenticated = usr.name
src.rank = "AI"
src.screen = 1
- else if (istype(usr, /mob/living/silicon/robot))
+ else if(istype(usr, /mob/living/silicon/robot))
src.active1 = null
src.active2 = null
src.authenticated = usr.name
@@ -214,16 +211,16 @@
src.rank = "[R.modtype] [R.braintype]"
src.screen = 1
- else if (istype(src.scan, /obj/item/weapon/card/id))
+ else if(istype(src.scan, /obj/item/weapon/card/id))
src.active1 = null
src.active2 = null
- if (src.check_access(src.scan))
+ if(src.check_access(src.scan))
src.authenticated = src.scan.registered_name
src.rank = src.scan.assignment
src.screen = 1
- if (src.authenticated)
+ if(src.authenticated)
if(href_list["screen"])
src.screen = text2num(href_list["screen"])
@@ -241,125 +238,125 @@
src.temp += "Spread: [v.fields["spread type"]] "
src.temp += "Details: [v.fields["description"]] "
- if (href_list["del_all"])
+ if(href_list["del_all"])
src.temp = text("Are you sure you wish to delete all records? \n\tYes \n\tNo ", src, src)
- if (href_list["del_all2"])
+ if(href_list["del_all2"])
for(var/datum/data/record/R in data_core.medical)
//R = null
qdel(R)
//Foreach goto(494)
src.temp = "All records deleted."
- if (href_list["field"])
+ if(href_list["field"])
var/a1 = src.active1
var/a2 = src.active2
switch(href_list["field"])
if("fingerprint")
- if (istype(src.active1, /datum/data/record))
+ if(istype(src.active1, /datum/data/record))
var/t1 = trim(sanitize(copytext(input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) as text,1,MAX_MESSAGE_LEN)))
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
return
src.active1.fields["fingerprint"] = t1
if("sex")
- if (istype(src.active1, /datum/data/record))
- if (src.active1.fields["sex"] == "Male")
+ if(istype(src.active1, /datum/data/record))
+ if(src.active1.fields["sex"] == "Male")
src.active1.fields["sex"] = "Female"
else
src.active1.fields["sex"] = "Male"
if("age")
- if (istype(src.active1, /datum/data/record))
+ if(istype(src.active1, /datum/data/record))
var/t1 = input("Please input age:", "Med. records", src.active1.fields["age"], null) as num
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
return
src.active1.fields["age"] = t1
if("mi_dis")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
var/t1 = sanitize(copytext(input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) as text,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
src.active2.fields["mi_dis"] = t1
if("mi_dis_d")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
var/t1 = sanitize(copytext(input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) as message,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
src.active2.fields["mi_dis_d"] = t1
if("ma_dis")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
var/t1 = sanitize(copytext(input("Please input major diabilities list:", "Med. records", src.active2.fields["ma_dis"], null) as text,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
src.active2.fields["ma_dis"] = t1
if("ma_dis_d")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
var/t1 = sanitize(copytext(input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) as message,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
src.active2.fields["ma_dis_d"] = t1
if("alg")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
var/t1 = sanitize(copytext(input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) as text,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
src.active2.fields["alg"] = t1
if("alg_d")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
var/t1 = sanitize(copytext(input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) as message,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
src.active2.fields["alg_d"] = t1
if("cdi")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
var/t1 = sanitize(copytext(input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) as text,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
src.active2.fields["cdi"] = t1
if("cdi_d")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
var/t1 = sanitize(copytext(input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) as message,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
src.active2.fields["cdi_d"] = t1
if("notes")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
var/t1 = html_encode(trim(copytext(input("Please summarize notes:", "Med. records", html_decode(src.active2.fields["notes"]), null) as message,1,MAX_MESSAGE_LEN)))
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
src.active2.fields["notes"] = t1
if("p_stat")
- if (istype(src.active1, /datum/data/record))
+ if(istype(src.active1, /datum/data/record))
src.temp = text("Physical Condition: \n\t*Deceased* \n\t*SSD* \n\tActive \n\tPhysically Unfit \n\tDisabled ", src, src, src, src, src)
if("m_stat")
- if (istype(src.active1, /datum/data/record))
+ if(istype(src.active1, /datum/data/record))
src.temp = text("Mental Condition: \n\t*Insane* \n\t*Unstable* \n\t*Watch* \n\tStable ", src, src, src, src)
if("b_type")
- if (istype(src.active2, /datum/data/record))
+ if(istype(src.active2, /datum/data/record))
src.temp = text("Blood Type: \n\tA- A+ \n\tB- B+ \n\tAB- AB+ \n\tO- O+ ", src, src, src, src, src, src, src, src)
if("b_dna")
- if (istype(src.active1, /datum/data/record))
+ if(istype(src.active1, /datum/data/record))
var/t1 = sanitize(copytext(input("Please input DNA hash:", "Med. records", src.active1.fields["dna"], null) as text,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
return
src.active1.fields["dna"] = t1
if("vir_name")
var/datum/data/record/v = locate(href_list["edit_vir"])
- if (v)
+ if(v)
var/t1 = sanitize(copytext(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
return
v.fields["name"] = t1
if("vir_desc")
var/datum/data/record/v = locate(href_list["edit_vir"])
- if (v)
+ if(v)
var/t1 = sanitize(copytext(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
return
v.fields["description"] = t1
else
- if (href_list["p_stat"])
- if (src.active1)
+ if(href_list["p_stat"])
+ if(src.active1)
switch(href_list["p_stat"])
if("deceased")
src.active1.fields["p_stat"] = "*Deceased*"
@@ -372,8 +369,8 @@
if("disabled")
src.active1.fields["p_stat"] = "Disabled"
- if (href_list["m_stat"])
- if (src.active1)
+ if(href_list["m_stat"])
+ if(src.active1)
switch(href_list["m_stat"])
if("insane")
src.active1.fields["m_stat"] = "*Insane*"
@@ -385,8 +382,8 @@
src.active1.fields["m_stat"] = "Stable"
- if (href_list["b_type"])
- if (src.active2)
+ if(href_list["b_type"])
+ if(src.active2)
switch(href_list["b_type"])
if("an")
src.active2.fields["b_type"] = "A-"
@@ -406,23 +403,23 @@
src.active2.fields["b_type"] = "O+"
- if (href_list["del_r"])
- if (src.active2)
+ if(href_list["del_r"])
+ if(src.active2)
src.temp = text("Are you sure you wish to delete the record (Medical Portion Only)? \n\tYes \n\tNo ", src, src)
- if (href_list["del_r2"])
- if (src.active2)
+ if(href_list["del_r2"])
+ if(src.active2)
//src.active2 = null
qdel(src.active2)
- if (href_list["d_rec"])
+ if(href_list["d_rec"])
var/datum/data/record/R = locate(href_list["d_rec"])
var/datum/data/record/M = locate(href_list["d_rec"])
- if (!( data_core.general.Find(R) ))
+ if(!( data_core.general.Find(R) ))
src.temp = "Record Not Found!"
return
for(var/datum/data/record/E in data_core.medical)
- if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
+ if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
M = E
else
//Foreach continue //goto(2540)
@@ -430,8 +427,8 @@
src.active2 = M
src.screen = 4
- if (href_list["new"])
- if ((istype(src.active1, /datum/data/record) && !( istype(src.active2, /datum/data/record) )))
+ if(href_list["new"])
+ if((istype(src.active1, /datum/data/record) && !( istype(src.active2, /datum/data/record) )))
var/datum/data/record/R = new /datum/data/record( )
R.fields["name"] = src.active1.fields["name"]
R.fields["id"] = src.active1.fields["id"]
@@ -451,63 +448,63 @@
src.active2 = R
src.screen = 4
- if (href_list["add_c"])
- if (!( istype(src.active2, /datum/data/record) ))
+ if(href_list["add_c"])
+ if(!( istype(src.active2, /datum/data/record) ))
return
var/a2 = src.active2
var/t1 = sanitize(copytext(input("Add Comment:", "Med. records", null, null) as message,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
+ if((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || src.active2 != a2))
return
var/counter = 1
while(src.active2.fields[text("com_[]", counter)])
counter++
src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year] [t1]")
- if (href_list["del_c"])
- if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])]))
+ if(href_list["del_c"])
+ if((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])]))
src.active2.fields[text("com_[]", href_list["del_c"])] = "Deleted "
- if (href_list["search"])
+ if(href_list["search"])
var/t1 = input("Search String: (Name, DNA, or ID)", "Med. records", null, null) as text
- if ((!( t1 ) || usr.stat || !( src.authenticated ) || usr.restrained() || ((!interactable()) && (!istype(usr, /mob/living/silicon)))))
+ if((!( t1 ) || usr.stat || !( src.authenticated ) || usr.restrained() || ((!interactable()) && (!istype(usr, /mob/living/silicon)))))
return
src.active1 = null
src.active2 = null
t1 = lowertext(t1)
for(var/datum/data/record/R in data_core.medical)
- if ((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"])))
+ if((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"])))
src.active2 = R
else
//Foreach continue //goto(3229)
- if (!( src.active2 ))
+ if(!( src.active2 ))
src.temp = text("Could not locate record [].", t1)
else
for(var/datum/data/record/E in data_core.general)
- if ((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"]))
+ if((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"]))
src.active1 = E
else
//Foreach continue //goto(3334)
src.screen = 4
- if (href_list["print_p"])
- if (!( src.printing ))
+ if(href_list["print_p"])
+ if(!( src.printing ))
src.printing = 1
var/datum/data/record/record1 = null
var/datum/data/record/record2 = null
- if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
+ if((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
record1 = active1
- if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
+ if((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
record2 = active2
sleep(50)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( computer.loc )
P.info = "Medical Record "
- if (record1)
+ if(record1)
P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] ", record1.fields["name"], record1.fields["id"], record1.fields["sex"], record1.fields["age"], record1.fields["fingerprint"], record1.fields["p_stat"], record1.fields["m_stat"])
P.name = text("Medical Record ([])", record1.fields["name"])
else
P.info += "General Record Lost! "
P.name = "Medical Record"
- if (record2)
+ if(record2)
P.info += text(" \nMedical Data \nBlood Type: [] \nDNA: [] \n \nMinor Disabilities: [] \nDetails: [] \n \nMajor Disabilities: [] \nDetails: [] \n \nAllergies: [] \nDetails: [] \n \nCurrent Diseases: [] (per disease info placed in log/comment section) \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", record2.fields["b_type"], record2.fields["b_dna"], record2.fields["mi_dis"], record2.fields["mi_dis_d"], record2.fields["ma_dis"], record2.fields["ma_dis_d"], record2.fields["alg"], record2.fields["alg_d"], record2.fields["cdi"], record2.fields["cdi_d"], decode(record2.fields["notes"]))
var/counter = 1
while(record2.fields[text("com_[]", counter)])
diff --git a/code/modules/computer3/computers/message.dm b/code/modules/computer3/computers/message.dm
index 31aa4f3a501..cf40e7f3a0c 100644
--- a/code/modules/computer3/computers/message.dm
+++ b/code/modules/computer3/computers/message.dm
@@ -242,7 +242,7 @@
if(!interactable() || ..(href,href_list))
return
- if ("auth" in href_list)
+ if("auth" in href_list)
if(auth)
auth = 0
screen = 0
@@ -255,10 +255,10 @@
message = incorrectkey
//Turn the server on/off.
- if ("active" in href_list)
+ if("active" in href_list)
if(auth) linkedServer.active = !linkedServer.active
//Find a server
- if ("find" in href_list)
+ if("find" in href_list)
if(message_servers && message_servers.len > 1)
src.linkedServer = input(usr,"Please select a server.", "Select a server.", null) as null|anything in message_servers
message = "NOTICE: Server selected. "
@@ -269,7 +269,7 @@
message = noserver
//View the logs - KEY REQUIRED
- if ("view" in href_list)
+ if("view" in href_list)
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
@@ -277,7 +277,7 @@
src.screen = 1
//Clears the logs - KEY REQUIRED
- if ("clear" in href_list)
+ if("clear" in href_list)
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
@@ -285,7 +285,7 @@
src.linkedServer.pda_msgs = list()
message = "NOTICE: Logs cleared. "
//Clears the request console logs - KEY REQUIRED
- if ("clearr" in href_list)
+ if("clearr" in href_list)
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
@@ -293,7 +293,7 @@
src.linkedServer.rc_msgs = list()
message = "NOTICE: Logs cleared. "
//Change the password - KEY REQUIRED
- if ("pass" in href_list)
+ if("pass" in href_list)
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
@@ -313,7 +313,7 @@
message = incorrectkey
//Hack the Console to get the password
- if ("hack" in href_list)
+ if("hack" in href_list)
if((istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) && (usr.mind.special_role && usr.mind.original == usr))
src.hacking = 1
src.screen = 2
@@ -323,7 +323,7 @@
if(src && src.linkedServer && usr)
BruteForce(usr)
//Delete the log.
- if ("delete" in href_list)
+ if("delete" in href_list)
//Are they on the view logs screen?
if(screen == 1)
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
@@ -332,7 +332,7 @@
src.linkedServer.pda_msgs -= locate(href_list["delete"])
message = "NOTICE: Log Deleted! "
//Delete the request console log.
- if ("deleter" in href_list)
+ if("deleter" in href_list)
//Are they on the view logs screen?
if(screen == 4)
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
@@ -341,14 +341,14 @@
src.linkedServer.rc_msgs -= locate(href_list["deleter"])
message = "NOTICE: Log Deleted! "
//Create a custom message
- if ("msg" in href_list)
+ if("msg" in href_list)
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
else
if(auth)
src.screen = 3
//Fake messaging selection - KEY REQUIRED
- if ("select" in href_list)
+ if("select" in href_list)
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
message = noserver
screen = 0
@@ -400,21 +400,21 @@
return src.attack_hand(usr)
var/obj/item/device/pda/PDARec = null
- for (var/obj/item/device/pda/P in PDAs)
- if (!P.owner || P.toff || P.hidden) continue
+ for(var/obj/item/device/pda/P in PDAs)
+ if(!P.owner || P.toff || P.hidden) continue
if(P.owner == customsender)
PDARec = P
//Sender isn't faking as someone who exists
if(isnull(PDARec))
src.linkedServer.send_pda_message("[customrecepient.owner]", "[customsender]","[custommessage]")
customrecepient.tnote += "← From [customsender] ([customjob]): [custommessage] "
- if (!customrecepient.silent)
+ if(!customrecepient.silent)
playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1)
- for (var/mob/O in hearers(3, customrecepient.loc))
- O.show_message(text("\icon[customrecepient] *[customrecepient.ttone]*"))
+ for(var/mob/O in hearers(3, customrecepient.loc))
+ O.show_message(text("[bicon(customrecepient)] *[customrecepient.ttone]*"))
if( customrecepient.loc && ishuman(customrecepient.loc) )
var/mob/living/carbon/human/H = customrecepient.loc
- to_chat(H, "\icon[customrecepient] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply )"
+ to_chat(H, "[bicon(customrecepient)] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply )"
log_pda("[usr] (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]")
customrecepient.overlays.Cut()
@@ -423,13 +423,13 @@
else
src.linkedServer.send_pda_message("[customrecepient.owner]", "[PDARec.owner]","[custommessage]")
customrecepient.tnote += "← From [PDARec.owner] ([customjob]): [custommessage] "
- if (!customrecepient.silent)
+ if(!customrecepient.silent)
playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1)
- for (var/mob/O in hearers(3, customrecepient.loc))
- O.show_message(text("\icon[customrecepient] *[customrecepient.ttone]*"))
+ for(var/mob/O in hearers(3, customrecepient.loc))
+ O.show_message(text("[bicon(customrecepient)] *[customrecepient.ttone]*"))
if( customrecepient.loc && ishuman(customrecepient.loc) )
var/mob/living/carbon/human/H = customrecepient.loc
- to_chat(H, "\icon[customrecepient] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply )"
+ to_chat(H, "[bicon(customrecepient)] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply )"
log_pda("[usr] (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]")
customrecepient.overlays.Cut()
@@ -447,6 +447,6 @@
// to_chat(usr, href_list["select"])
- if ("back" in href_list)
+ if("back" in href_list)
src.screen = 0
interact()
\ No newline at end of file
diff --git a/code/modules/computer3/computers/prisonshuttle.dm b/code/modules/computer3/computers/prisonshuttle.dm
index 119dbc350a4..e7dd5c650ac 100644
--- a/code/modules/computer3/computers/prisonshuttle.dm
+++ b/code/modules/computer3/computers/prisonshuttle.dm
@@ -40,12 +40,12 @@ var/prison_shuttle_timeleft = 0
if(do_after(user, 20, target = src))
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
var/obj/item/part/board/circuit/prison_shuttle/M = new /obj/item/part/board/circuit/prison_shuttle( A )
- for (var/obj/C in src)
+ for(var/obj/C in src)
C.loc = src.loc
A.circuit = M
A.anchored = 1
- if (src.stat & BROKEN)
+ if(src.stat & BROKEN)
to_chat(user, "\blue The broken glass falls out.")
new /obj/item/trash/shard( src.loc )
A.state = 3
@@ -75,7 +75,7 @@ var/prison_shuttle_timeleft = 0
user.set_machine(src)
post_signal("prison")
var/dat
- if (src.temp)
+ if(src.temp)
dat = src.temp
else
dat += {"Location: [prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison ? "Moving to station ([prison_shuttle_timeleft] Secs.)":prison_shuttle_at_station ? "Station":"Dock"]
@@ -95,11 +95,11 @@ var/prison_shuttle_timeleft = 0
if(..())
return
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
- if (href_list["sendtodock"])
- if (!prison_can_move())
+ if(href_list["sendtodock"])
+ if(!prison_can_move())
to_chat(usr, "\red The prison shuttle is unable to leave.")
return
if(!prison_shuttle_at_station|| prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return
@@ -112,8 +112,8 @@ var/prison_shuttle_timeleft = 0
spawn(0)
prison_process()
- else if (href_list["sendtostation"])
- if (!prison_can_move())
+ else if(href_list["sendtostation"])
+ if(!prison_can_move())
to_chat(usr, "\red The prison shuttle is unable to leave.")
return
if(prison_shuttle_at_station || prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return
@@ -126,7 +126,7 @@ var/prison_shuttle_timeleft = 0
spawn(0)
prison_process()
- else if (href_list["mainmenu"])
+ else if(href_list["mainmenu"])
src.temp = null
src.add_fingerprint(usr)
@@ -141,13 +141,13 @@ var/prison_shuttle_timeleft = 0
/*
proc/prison_break()
switch(prison_break)
- if (0)
+ if(0)
if(!prison_shuttle_at_station || prison_shuttle_moving_to_prison) return
prison_shuttle_moving_to_prison = 1
prison_shuttle_at_station = prison_shuttle_at_station
- if (!prison_shuttle_moving_to_prison || !prison_shuttle_moving_to_station)
+ if(!prison_shuttle_moving_to_prison || !prison_shuttle_moving_to_station)
prison_shuttle_time = world.timeofday + PRISON_MOVETIME
spawn(0)
prison_process()
@@ -183,9 +183,9 @@ var/prison_shuttle_timeleft = 0
if(0)
prison_shuttle_at_station = 1
- if (prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return
+ if(prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return
- if (!prison_can_move())
+ if(!prison_can_move())
to_chat(usr, "\red The prison shuttle is unable to leave.")
return
@@ -212,9 +212,9 @@ var/prison_shuttle_timeleft = 0
if(1)
prison_shuttle_at_station = 0
- if (prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return
+ if(prison_shuttle_moving_to_station || prison_shuttle_moving_to_prison) return
- if (!prison_can_move())
+ if(!prison_can_move())
to_chat(usr, "\red The prison shuttle is unable to leave.")
return
diff --git a/code/modules/computer3/computers/robot.dm b/code/modules/computer3/computers/robot.dm
index 002750b49c1..9e9e4b29fac 100644
--- a/code/modules/computer3/computers/robot.dm
+++ b/code/modules/computer3/computers/robot.dm
@@ -34,7 +34,7 @@
if(!interactable() || computer.z > 6)
return
var/dat
- if (src.temp)
+ if(src.temp)
dat = "[src.temp] Clear Screen "
else
if(screen == 0)
@@ -44,10 +44,10 @@
if(screen == 1)
for(var/mob/living/silicon/robot/R in mob_list)
if(istype(usr, /mob/living/silicon/ai))
- if (R.connected_ai != usr)
+ if(R.connected_ai != usr)
continue
if(istype(usr, /mob/living/silicon/robot))
- if (R != usr)
+ if(R != usr)
continue
if(R.scrambledcodes)
continue
@@ -55,11 +55,11 @@
dat += "[R.name] |"
if(R.stat)
dat += " Not Responding |"
- else if (!R.canmove)
+ else if(!R.canmove)
dat += " Locked Down |"
else
dat += " Operating Normally |"
- if (!R.canmove)
+ if(!R.canmove)
else if(R.cell)
dat += " Battery Installed ([R.cell.charge]/[R.cell.maxcharge]) |"
else
@@ -72,7 +72,7 @@
dat += " Slaved to [R.connected_ai.name] |"
else
dat += " Independent from AI |"
- if (istype(usr, /mob/living/silicon))
+ if(istype(usr, /mob/living/silicon))
if(issilicon(usr) && is_special_character(usr) && !R.emagged)
dat += "(Hack ) "
dat += "([R.canmove ? "Lockdown" : "Release"] ) "
@@ -105,19 +105,19 @@
if(!interactable() || ..(href,href_list))
return
- if ("killall" in href_list)
+ if("killall" in href_list)
src.temp = {"Destroy Robots?
\[Swipe ID to initiate destruction sequence\]
Cancel "}
- if ("do_killall" in href_list)
+ if("do_killall" in href_list)
var/obj/item/weapon/card/id/I = usr.get_active_hand()
- if (istype(I, /obj/item/device/pda))
+ if(istype(I, /obj/item/device/pda))
var/obj/item/device/pda/pda = I
I = pda.id
- if (istype(I))
+ if(istype(I))
if(src.check_access(I))
- if (!status)
+ if(!status)
message_admins("\blue [key_name_admin(usr)] has initiated the global cyborg killswitch!")
log_game("\blue [key_name(usr)] has initiated the global cyborg killswitch!")
src.status = 1
@@ -127,23 +127,23 @@
else
to_chat(usr, "\red Access Denied.")
- if ("stop" in href_list)
+ if("stop" in href_list)
src.temp = {"
Stop Robot Destruction Sequence?
Yes
No "}
- if ("stop2" in href_list)
+ if("stop2" in href_list)
src.stop = 1
src.temp = null
src.status = 0
- if ("reset" in href_list)
+ if("reset" in href_list)
src.timeleft = 60
- if ("temp" in href_list)
+ if("temp" in href_list)
src.temp = null
- if ("screen" in href_list)
+ if("screen" in href_list)
switch(href_list["screen"])
if("0")
screen = 0
@@ -151,7 +151,7 @@
screen = 1
if("2")
screen = 2
- if ("killbot" in href_list)
+ if("killbot" in href_list)
if(computer.allowed(usr))
var/mob/living/silicon/robot/R = locate(href_list["killbot"])
if(R)
@@ -169,7 +169,7 @@
else
to_chat(usr, "\red Access Denied.")
- if ("stopbot" in href_list)
+ if("stopbot" in href_list)
if(computer.allowed(usr))
var/mob/living/silicon/robot/R = locate(href_list["stopbot"])
if(R && istype(R)) // Extra sancheck because of input var references
@@ -179,7 +179,7 @@
message_admins("\blue [key_name_admin(usr)] [R.canmove ? "locked down" : "released"] [R.name]!")
log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [R.name]!")
R.canmove = !R.canmove
- if (R.lockcharge)
+ if(R.lockcharge)
// R.cell.charge = R.lockcharge
R.lockcharge = !R.lockcharge
to_chat(R, "Your lockdown has been lifted!")
@@ -191,7 +191,7 @@
else
to_chat(usr, "\red Access Denied.")
- if ("magbot" in href_list)
+ if("magbot" in href_list)
if(computer.allowed(usr))
var/mob/living/silicon/robot/R = locate(href_list["magbot"])
if(R)
diff --git a/code/modules/computer3/computers/scanconsole.dm b/code/modules/computer3/computers/scanconsole.dm
index fa88ae24b36..1ccc06bde90 100644
--- a/code/modules/computer3/computers/scanconsole.dm
+++ b/code/modules/computer3/computers/scanconsole.dm
@@ -279,7 +279,7 @@
var/rejuvenators = round(occupant.reagents.get_reagent_amount("inaprovaline") / REJUVENATORS_MAX * 100)
status_html += "Rejuvenators:
[occupant.reagents.get_reagent_amount("inaprovaline")] units
"
- if (dna_summary)
+ if(dna_summary)
status_html += "Unique Enzymes :
[uppertext(occupant.dna.unique_enzymes)]
"
status_html += "Unique Identifier:
[occupant.dna.uni_identity]
"
status_html += "Structural Enzymes:
[occupant.dna.struc_enzymes]
"
@@ -384,7 +384,7 @@
proc/emitter_menu()
to_chat(var/dat = topic_link(src,"mode=0",", Main Menu") + " ")
dat += "Radiation Emitter Settings "
- if (viable)
+ if(viable)
dat += topic_link(src,"pulse","Pulse Radiation")
else
dat += fake_link("Pulse Radiation")
@@ -454,7 +454,7 @@
updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity)
scanner.occupant.apply_effect(radstrength+radduration, IRRADIATE)
if("ui-f")
- if (prob(20+radstrength))
+ if(prob(20+radstrength))
randmutb(scanner.occupant)
domutcheck(scanner.occupant,scanner)
else
@@ -466,8 +466,8 @@
var/se = scanner.occupant.dna.struc_enzymes
var/targetblock = se_block
- if (!(se_block in list(2,8,10,12)) && prob (20)) // shifts the target slightly
- if (se_block <= 5)
+ if(!(se_block in list(2,8,10,12)) && prob (20)) // shifts the target slightly
+ if(se_block <= 5)
targetblock++
else
targetblock--
@@ -484,7 +484,7 @@
domutcheck(scanner.occupant,scanner)
scanner.occupant.apply_effect(radstrength+radduration, IRRADIATE)
if("se-f")
- if (prob(80-radduration))
+ if(prob(80-radduration))
randmutb(scanner.occupant)
domutcheck(scanner.occupant,scanner)
else
@@ -493,7 +493,7 @@
scanner.occupant.apply_effect((radstrength*2)+radduration, IRRADIATE)
if(null)
- if (prob(95))
+ if(prob(95))
if(prob(75))
randmutb(scanner.occupant)
else
@@ -517,7 +517,7 @@
if(istype(H))
var/inap = H.reagents.get_reagent_amount("inaprovaline") // oh my *god* this section was ugly before I shortened it
- if (inap < (REJUVENATORS_MAX - REJUVENATORS_INJECT))
+ if(inap < (REJUVENATORS_MAX - REJUVENATORS_INJECT))
H.reagents.add_reagent("inaprovaline", REJUVENATORS_INJECT)
else
H.reagents.add_reagent("inaprovaline", max(REJUVENATORS_MAX - inap,0))
@@ -534,32 +534,32 @@
var/viable_occupant = (occupant && occupant.dna && !(NOCLONE in occupant.mutations))
var/mob/living/carbon/human/human_occupant = scanner.occupant
- if (href_list["screen"]) // Passing a screen is only a request, we set current_screen here but it can be overridden below if necessary
+ if(href_list["screen"]) // Passing a screen is only a request, we set current_screen here but it can be overridden below if necessary
current_screen = href_list["screen"]
- if (!viable_occupant) // If there is no viable occupant only allow certain screens
+ if(!viable_occupant) // If there is no viable occupant only allow certain screens
var/allowed_no_occupant_screens = list("mainmenu", "radsetmenu", "buffermenu") //These are the screens which will be allowed if there's no occupant
- if (!(current_screen in allowed_no_occupant_screens))
+ if(!(current_screen in allowed_no_occupant_screens))
href_list = new /list(0) // clear list of options
current_screen = "mainmenu"
- if (!current_screen) // If no screen is set default to mainmenu
+ if(!current_screen) // If no screen is set default to mainmenu
current_screen = "mainmenu"
- if (!scanner) //Is the scanner not connected?
+ if(!scanner) //Is the scanner not connected?
scanner_status_html = "ERROR: No DNA Scanner connected. "
current_screen = null // blank does not exist in the switch below, so no screen will be outputted
updateUsrDialog()
return
usr.set_machine(src)
- if (href_list["locked"])
- if (scanner.occupant)
+ if(href_list["locked"])
+ if(scanner.occupant)
scanner.locked = !( scanner.locked )
////////////////////////////////////////////////////////
- if (href_list["genpulse"])
+ if(href_list["genpulse"])
if(!viable_occupant)//Makes sure someone is in there (And valid) before trying anything
temp_html = text("No viable occupant detected.")//More than anything, this just acts as a sanity check in case the option DOES appear for whatever reason
//usr << browse(temp_html, "window=scannernew;size=550x650")
@@ -574,10 +574,10 @@
var/lock_state = scanner.locked
scanner.locked = 1//lock it
sleep(10*radduration)
- if (!scanner.occupant)
+ if(!scanner.occupant)
temp_html = null
return null
- if (prob(95))
+ if(prob(95))
if(prob(75))
randmutb(scanner.occupant)
else
@@ -591,59 +591,59 @@
scanner.locked = lock_state
temp_html = null
dopage(src,"screen=radsetmenu")
- if (href_list["radleplus"])
+ if(href_list["radleplus"])
if(!viable_occupant)
temp_html = text("No viable occupant detected.")
popup.set_content(temp_html)
popup.open()
- if (radduration < 20)
+ if(radduration < 20)
radduration++
radduration++
dopage(src,"screen=radsetmenu")
- if (href_list["radleminus"])
+ if(href_list["radleminus"])
if(!viable_occupant)
temp_html = text("No viable occupant detected.")
popup.set_content(temp_html)
popup.open()
- if (radduration > 2)
+ if(radduration > 2)
radduration--
radduration--
dopage(src,"screen=radsetmenu")
- if (href_list["radinplus"])
- if (radstrength < 10)
+ if(href_list["radinplus"])
+ if(radstrength < 10)
radstrength++
dopage(src,"screen=radsetmenu")
- if (href_list["radinminus"])
- if (radstrength > 1)
+ if(href_list["radinminus"])
+ if(radstrength > 1)
radstrength--
dopage(src,"screen=radsetmenu")
////////////////////////////////////////////////////////
- if (href_list["unimenuplus"])
- if (ui_block < 13)
+ if(href_list["unimenuplus"])
+ if(ui_block < 13)
ui_block++
else
ui_block = 1
dopage(src,"screen=unimenu")
- if (href_list["unimenuminus"])
- if (ui_block > 1)
+ if(href_list["unimenuminus"])
+ if(ui_block > 1)
ui_block--
else
ui_block = 13
dopage(src,"screen=unimenu")
- if (href_list["unimenusubplus"])
- if (subblock < 3)
+ if(href_list["unimenusubplus"])
+ if(subblock < 3)
subblock++
else
subblock = 1
dopage(src,"screen=unimenu")
- if (href_list["unimenusubminus"])
- if (subblock > 1)
+ if(href_list["unimenusubminus"])
+ if(subblock > 1)
subblock--
else
subblock = 3
dopage(src,"screen=unimenu")
- if (href_list["unimenutargetplus"])
- if (unitarget < 15)
+ if(href_list["unimenutargetplus"])
+ if(unitarget < 15)
unitarget++
unitargethex = unitarget
switch(unitarget)
@@ -663,8 +663,8 @@
unitarget = 0
unitargethex = 0
dopage(src,"screen=unimenu")
- if (href_list["unimenutargetminus"])
- if (unitarget > 0)
+ if(href_list["unimenutargetminus"])
+ if(unitarget > 0)
unitarget--
unitargethex = unitarget
switch(unitarget)
@@ -682,15 +682,15 @@
unitarget = 15
unitargethex = "F"
dopage(src,"screen=unimenu")
- if (href_list["uimenuset"] && href_list["uimenusubset"]) // This chunk of code updates selected block / sub-block based on click
+ if(href_list["uimenuset"] && href_list["uimenusubset"]) // This chunk of code updates selected block / sub-block based on click
var/menuset = text2num(href_list["uimenuset"])
var/menusubset = text2num(href_list["uimenusubset"])
- if ((menuset <= 13) && (menuset >= 1))
+ if((menuset <= 13) && (menuset >= 1))
ui_block = menuset
- if ((menusubset <= 3) && (menusubset >= 1))
+ if((menusubset <= 3) && (menusubset >= 1))
subblock = menusubset
dopage(src, "unimenu")
- if (href_list["unipulse"])
+ if(href_list["unipulse"])
if(scanner.occupant)
var/block
var/newblock
@@ -703,22 +703,22 @@
var/lock_state = scanner.locked
scanner.locked = 1//lock it
sleep(10*radduration)
- if (!scanner.occupant)
+ if(!scanner.occupant)
temp_html = null
return null
///
- if (prob((80 + (radduration / 2))))
+ if(prob((80 + (radduration / 2))))
block = miniscrambletarget(num2text(unitarget), radstrength, radduration)
newblock = null
- if (subblock == 1) newblock = block + getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),2,1) + getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),3,1)
- if (subblock == 2) newblock = getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),1,1) + block + getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),3,1)
- if (subblock == 3) newblock = getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),1,1) + getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),2,1) + block
+ if(subblock == 1) newblock = block + getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),2,1) + getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),3,1)
+ if(subblock == 2) newblock = getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),1,1) + block + getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),3,1)
+ if(subblock == 3) newblock = getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),1,1) + getblock(getblock(scanner.occupant.dna.uni_identity,ui_block,3),2,1) + block
tstructure2 = setblock(scanner.occupant.dna.uni_identity, ui_block, newblock,3)
scanner.occupant.dna.uni_identity = tstructure2
updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity)
scanner.occupant.apply_effect(radstrength+radduration, IRRADIATE)
else
- if (prob(20+radstrength))
+ if(prob(20+radstrength))
randmutb(scanner.occupant)
domutcheck(scanner.occupant,scanner)
else
@@ -729,61 +729,61 @@
dopage(src,"screen=unimenu")
////////////////////////////////////////////////////////
- if (href_list["rejuv"])
+ if(href_list["rejuv"])
if(!viable_occupant)
temp_html = text("No viable occupant detected.")
popup.set_content(temp_html)
popup.open()
else
if(human_occupant)
- if (human_occupant.reagents.get_reagent_amount("inaprovaline") < REJUVENATORS_MAX)
- if (human_occupant.reagents.get_reagent_amount("inaprovaline") < (REJUVENATORS_MAX - REJUVENATORS_INJECT))
+ if(human_occupant.reagents.get_reagent_amount("inaprovaline") < REJUVENATORS_MAX)
+ if(human_occupant.reagents.get_reagent_amount("inaprovaline") < (REJUVENATORS_MAX - REJUVENATORS_INJECT))
human_occupant.reagents.add_reagent("inaprovaline", REJUVENATORS_INJECT)
else
human_occupant.reagents.add_reagent("inaprovaline", round(REJUVENATORS_MAX - human_occupant.reagents.get_reagent_amount("inaprovaline")))
// to_chat(usr, text("Occupant now has [] units of rejuvenation in his/her bloodstream.", human_occupant.reagents.get_reagent_amount("inaprovaline")))
////////////////////////////////////////////////////////
- if (href_list["strucmenuplus"])
- if (se_block < 14)
+ if(href_list["strucmenuplus"])
+ if(se_block < 14)
se_block++
else
se_block = 1
dopage(src,"screen=strucmenu")
- if (href_list["strucmenuminus"])
- if (se_block > 1)
+ if(href_list["strucmenuminus"])
+ if(se_block > 1)
se_block--
else
se_block = 14
dopage(src,"screen=strucmenu")
- if (href_list["strucmenusubplus"])
- if (subblock < 3)
+ if(href_list["strucmenusubplus"])
+ if(subblock < 3)
subblock++
else
subblock = 1
dopage(src,"screen=strucmenu")
- if (href_list["strucmenusubminus"])
- if (subblock > 1)
+ if(href_list["strucmenusubminus"])
+ if(subblock > 1)
subblock--
else
subblock = 3
dopage(src,"screen=strucmenu")
- if (href_list["semenuset"] && href_list["semenusubset"]) // This chunk of code updates selected block / sub-block based on click (se stands for strutural enzymes)
+ if(href_list["semenuset"] && href_list["semenusubset"]) // This chunk of code updates selected block / sub-block based on click (se stands for strutural enzymes)
var/menuset = text2num(href_list["semenuset"])
var/menusubset = text2num(href_list["semenusubset"])
- if ((menuset <= 14) && (menuset >= 1))
+ if((menuset <= 14) && (menuset >= 1))
se_block = menuset
- if ((menusubset <= 3) && (menusubset >= 1))
+ if((menusubset <= 3) && (menusubset >= 1))
subblock = menusubset
dopage(src, "strucmenu")
- if (href_list["strucpulse"])
+ if(href_list["strucpulse"])
var/block
var/newblock
var/tstructure2
var/oldblock
var/lock_state = scanner.locked
scanner.locked = 1//lock it
- if (viable_occupant)
+ if(viable_occupant)
block = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),subblock,1)
temp_html = text("Working ... Please wait ([] Seconds)", radduration)
@@ -795,18 +795,18 @@
return null
///
if(viable_occupant)
- if (prob((80 + (radduration / 2))))
- if ((se_block != 2 || se_block != 12 || se_block != 8 || se_block || 10) && prob (20))
+ if(prob((80 + (radduration / 2))))
+ if((se_block != 2 || se_block != 12 || se_block != 8 || se_block || 10) && prob (20))
oldblock = se_block
block = miniscramble(block, radstrength, radduration)
newblock = null
- if (se_block > 1 && se_block < 5)
+ if(se_block > 1 && se_block < 5)
se_block++
- else if (se_block > 5 && se_block < 14)
+ else if(se_block > 5 && se_block < 14)
se_block--
- if (subblock == 1) newblock = block + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),2,1) + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),3,1)
- if (subblock == 2) newblock = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),1,1) + block + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),3,1)
- if (subblock == 3) newblock = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),1,1) + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),2,1) + block
+ if(subblock == 1) newblock = block + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),2,1) + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),3,1)
+ if(subblock == 2) newblock = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),1,1) + block + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),3,1)
+ if(subblock == 3) newblock = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),1,1) + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),2,1) + block
tstructure2 = setblock(scanner.occupant.dna.struc_enzymes, se_block, newblock,3)
scanner.occupant.dna.struc_enzymes = tstructure2
domutcheck(scanner.occupant,scanner)
@@ -816,15 +816,15 @@
//
block = miniscramble(block, radstrength, radduration)
newblock = null
- if (subblock == 1) newblock = block + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),2,1) + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),3,1)
- if (subblock == 2) newblock = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),1,1) + block + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),3,1)
- if (subblock == 3) newblock = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),1,1) + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),2,1) + block
+ if(subblock == 1) newblock = block + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),2,1) + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),3,1)
+ if(subblock == 2) newblock = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),1,1) + block + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),3,1)
+ if(subblock == 3) newblock = getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),1,1) + getblock(getblock(scanner.occupant.dna.struc_enzymes,se_block,3),2,1) + block
tstructure2 = setblock(scanner.occupant.dna.struc_enzymes, se_block, newblock,3)
scanner.occupant.dna.struc_enzymes = tstructure2
domutcheck(scanner.occupant,scanner)
scanner.occupant.apply_effect(radstrength+radduration, IRRADIATE)
else
- if (prob(80-radduration))
+ if(prob(80-radduration))
randmutb(scanner.occupant)
domutcheck(scanner.occupant,scanner)
else
@@ -836,21 +836,21 @@
dopage(src,"screen=strucmenu")
////////////////////////////////////////////////////////
- if (href_list["b1addui"])
+ if(href_list["b1addui"])
if(scanner.occupant && scanner.occupant.dna)
buffer1iue = 0
buffer1 = scanner.occupant.dna.uni_identity
- if (!istype(scanner.occupant,/mob/living/carbon/human))
+ if(!istype(scanner.occupant,/mob/living/carbon/human))
buffer1owner = scanner.occupant.name
else
buffer1owner = scanner.occupant.real_name
buffer1label = "Unique Identifier"
buffer1type = "ui"
dopage(src,"screen=buffermenu")
- if (href_list["b1adduiue"])
+ if(href_list["b1adduiue"])
if(scanner.occupant && scanner.occupant.dna)
buffer1 = scanner.occupant.dna.uni_identity
- if (!istype(scanner.occupant,/mob/living/carbon/human))
+ if(!istype(scanner.occupant,/mob/living/carbon/human))
buffer1owner = scanner.occupant.name
else
buffer1owner = scanner.occupant.real_name
@@ -858,10 +858,10 @@
buffer1type = "ui"
buffer1iue = 1
dopage(src,"screen=buffermenu")
- if (href_list["b2adduiue"])
+ if(href_list["b2adduiue"])
if(scanner.occupant && scanner.occupant.dna)
buffer2 = scanner.occupant.dna.uni_identity
- if (!istype(scanner.occupant,/mob/living/carbon/human))
+ if(!istype(scanner.occupant,/mob/living/carbon/human))
buffer2owner = scanner.occupant.name
else
buffer2owner = scanner.occupant.real_name
@@ -869,10 +869,10 @@
buffer2type = "ui"
buffer2iue = 1
dopage(src,"screen=buffermenu")
- if (href_list["b3adduiue"])
+ if(href_list["b3adduiue"])
if(scanner.occupant && scanner.occupant.dna)
buffer3 = scanner.occupant.dna.uni_identity
- if (!istype(scanner.occupant,/mob/living/carbon/human))
+ if(!istype(scanner.occupant,/mob/living/carbon/human))
buffer3owner = scanner.occupant.name
else
buffer3owner = scanner.occupant.real_name
@@ -880,141 +880,141 @@
buffer3type = "ui"
buffer3iue = 1
dopage(src,"screen=buffermenu")
- if (href_list["b2addui"])
+ if(href_list["b2addui"])
if(scanner.occupant && scanner.occupant.dna)
buffer2iue = 0
buffer2 = scanner.occupant.dna.uni_identity
- if (!istype(scanner.occupant,/mob/living/carbon/human))
+ if(!istype(scanner.occupant,/mob/living/carbon/human))
buffer2owner = scanner.occupant.name
else
buffer2owner = scanner.occupant.real_name
buffer2label = "Unique Identifier"
buffer2type = "ui"
dopage(src,"screen=buffermenu")
- if (href_list["b3addui"])
+ if(href_list["b3addui"])
if(scanner.occupant && scanner.occupant.dna)
buffer3iue = 0
buffer3 = scanner.occupant.dna.uni_identity
- if (!istype(scanner.occupant,/mob/living/carbon/human))
+ if(!istype(scanner.occupant,/mob/living/carbon/human))
buffer3owner = scanner.occupant.name
else
buffer3owner = scanner.occupant.real_name
buffer3label = "Unique Identifier"
buffer3type = "ui"
dopage(src,"screen=buffermenu")
- if (href_list["b1addse"])
+ if(href_list["b1addse"])
if(scanner.occupant && scanner.occupant.dna)
buffer1iue = 0
buffer1 = scanner.occupant.dna.struc_enzymes
- if (!istype(scanner.occupant,/mob/living/carbon/human))
+ if(!istype(scanner.occupant,/mob/living/carbon/human))
buffer1owner = scanner.occupant.name
else
buffer1owner = scanner.occupant.real_name
buffer1label = "Structural Enzymes"
buffer1type = "se"
dopage(src,"screen=buffermenu")
- if (href_list["b2addse"])
+ if(href_list["b2addse"])
if(scanner.occupant && scanner.occupant.dna)
buffer2iue = 0
buffer2 = scanner.occupant.dna.struc_enzymes
- if (!istype(scanner.occupant,/mob/living/carbon/human))
+ if(!istype(scanner.occupant,/mob/living/carbon/human))
buffer2owner = scanner.occupant.name
else
buffer2owner = scanner.occupant.real_name
buffer2label = "Structural Enzymes"
buffer2type = "se"
dopage(src,"screen=buffermenu")
- if (href_list["b3addse"])
+ if(href_list["b3addse"])
if(scanner.occupant && scanner.occupant.dna)
buffer3iue = 0
buffer3 = scanner.occupant.dna.struc_enzymes
- if (!istype(scanner.occupant,/mob/living/carbon/human))
+ if(!istype(scanner.occupant,/mob/living/carbon/human))
buffer3owner = scanner.occupant.name
else
buffer3owner = scanner.occupant.real_name
buffer3label = "Structural Enzymes"
buffer3type = "se"
dopage(src,"screen=buffermenu")
- if (href_list["b1clear"])
+ if(href_list["b1clear"])
buffer1 = null
buffer1owner = null
buffer1label = null
buffer1iue = null
dopage(src,"screen=buffermenu")
- if (href_list["b2clear"])
+ if(href_list["b2clear"])
buffer2 = null
buffer2owner = null
buffer2label = null
buffer2iue = null
dopage(src,"screen=buffermenu")
- if (href_list["b3clear"])
+ if(href_list["b3clear"])
buffer3 = null
buffer3owner = null
buffer3label = null
buffer3iue = null
dopage(src,"screen=buffermenu")
- if (href_list["b1label"])
+ if(href_list["b1label"])
buffer1label = sanitize(input("New Label:","Edit Label","Infos here"))
dopage(src,"screen=buffermenu")
- if (href_list["b2label"])
+ if(href_list["b2label"])
buffer2label = sanitize(input("New Label:","Edit Label","Infos here"))
dopage(src,"screen=buffermenu")
- if (href_list["b3label"])
+ if(href_list["b3label"])
buffer3label = sanitize(input("New Label:","Edit Label","Infos here"))
dopage(src,"screen=buffermenu")
- if (href_list["b1transfer"])
- if (!scanner.occupant || (NOCLONE in scanner.occupant.mutations) || !scanner.occupant.dna)
+ if(href_list["b1transfer"])
+ if(!scanner.occupant || (NOCLONE in scanner.occupant.mutations) || !scanner.occupant.dna)
return
- if (buffer1type == "ui")
- if (buffer1iue)
+ if(buffer1type == "ui")
+ if(buffer1iue)
scanner.occupant.real_name = buffer1owner
scanner.occupant.name = buffer1owner
scanner.occupant.dna.uni_identity = buffer1
updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity)
- else if (buffer1type == "se")
+ else if(buffer1type == "se")
scanner.occupant.dna.struc_enzymes = buffer1
domutcheck(scanner.occupant,scanner)
temp_html = "Transfered."
scanner.occupant.apply_effect(rand(20,50), IRRADIATE)
- if (href_list["b2transfer"])
- if (!scanner.occupant || (NOCLONE in scanner.occupant.mutations) || !scanner.occupant.dna)
+ if(href_list["b2transfer"])
+ if(!scanner.occupant || (NOCLONE in scanner.occupant.mutations) || !scanner.occupant.dna)
return
- if (buffer2type == "ui")
- if (buffer2iue)
+ if(buffer2type == "ui")
+ if(buffer2iue)
scanner.occupant.real_name = buffer2owner
scanner.occupant.name = buffer2owner
scanner.occupant.dna.uni_identity = buffer2
updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity)
- else if (buffer2type == "se")
+ else if(buffer2type == "se")
scanner.occupant.dna.struc_enzymes = buffer2
domutcheck(scanner.occupant,scanner)
temp_html = "Transfered."
scanner.occupant.apply_effect(rand(20,50), IRRADIATE)
- if (href_list["b3transfer"])
- if (!scanner.occupant || (NOCLONE in scanner.occupant.mutations) || !scanner.occupant.dna)
+ if(href_list["b3transfer"])
+ if(!scanner.occupant || (NOCLONE in scanner.occupant.mutations) || !scanner.occupant.dna)
return
- if (buffer3type == "ui")
- if (buffer3iue)
+ if(buffer3type == "ui")
+ if(buffer3iue)
scanner.occupant.real_name = buffer3owner
scanner.occupant.name = buffer3owner
scanner.occupant.dna.uni_identity = buffer3
updateappearance(scanner.occupant,scanner.occupant.dna.uni_identity)
- else if (buffer3type == "se")
+ else if(buffer3type == "se")
scanner.occupant.dna.struc_enzymes = buffer3
domutcheck(scanner.occupant,scanner)
temp_html = "Transfered."
scanner.occupant.apply_effect(rand(20,50), IRRADIATE)
- if (href_list["b1injector"])
- if (injectorready)
+ if(href_list["b1injector"])
+ if(injectorready)
var/obj/item/tool/medical/dnainjector/I = new /obj/item/tool/medical/dnainjector
I.dna = buffer1
I.dnatype = buffer1type
I.loc = loc
I.name += " ([buffer1label])"
- if (buffer1iue) I.ue = buffer1owner //lazy haw haw
+ if(buffer1iue) I.ue = buffer1owner //lazy haw haw
temp_html = "Injector created."
injectorready = 0
@@ -1023,14 +1023,14 @@
else
temp_html = "Replicator not ready yet."
- if (href_list["b2injector"])
- if (injectorready)
+ if(href_list["b2injector"])
+ if(injectorready)
var/obj/item/tool/medical/dnainjector/I = new /obj/item/tool/medical/dnainjector
I.dna = buffer2
I.dnatype = buffer2type
I.loc = loc
I.name += " ([buffer2label])"
- if (buffer2iue) I.ue = buffer2owner //lazy haw haw
+ if(buffer2iue) I.ue = buffer2owner //lazy haw haw
temp_html = "Injector created."
injectorready = 0
@@ -1039,14 +1039,14 @@
else
temp_html = "Replicator not ready yet."
- if (href_list["b3injector"])
- if (injectorready)
+ if(href_list["b3injector"])
+ if(injectorready)
var/obj/item/tool/medical/dnainjector/I = new /obj/item/tool/medical/dnainjector
I.dna = buffer3
I.dnatype = buffer3type
I.loc = loc
I.name += " ([buffer3label])"
- if (buffer3iue) I.ue = buffer3owner //lazy haw haw
+ if(buffer3iue) I.ue = buffer3owner //lazy haw haw
temp_html = "Injector created."
injectorready = 0
@@ -1056,11 +1056,11 @@
temp_html = "Replicator not ready yet."
////////////////////////////////////////////////////////
- if (href_list["load_disk"])
+ if(href_list["load_disk"])
var/buffernum = text2num(href_list["load_disk"])
- if ((buffernum > 3) || (buffernum < 1))
+ if((buffernum > 3) || (buffernum < 1))
return
- if ((isnull(diskette)) || (!diskette.data) || (diskette.data == ""))
+ if((isnull(diskette)) || (!diskette.data) || (diskette.data == ""))
return
switch(buffernum)
if(1)
@@ -1080,11 +1080,11 @@
buffer3owner = diskette.owner
temp_html = "Data loaded."
- if (href_list["save_disk"])
+ if(href_list["save_disk"])
var/buffernum = text2num(href_list["save_disk"])
- if ((buffernum > 3) || (buffernum < 1))
+ if((buffernum > 3) || (buffernum < 1))
return
- if ((isnull(diskette)) || (diskette.read_only))
+ if((isnull(diskette)) || (diskette.read_only))
return
switch(buffernum)
if(1)
@@ -1106,8 +1106,8 @@
diskette.owner = buffer3owner
diskette.name = "data disk - '[buffer3owner]'"
temp_html = "Data saved."
- if (href_list["eject_disk"])
- if (!diskette)
+ if(href_list["eject_disk"])
+ if(!diskette)
return
diskette.loc = get_turf(src)
diskette = null
@@ -1115,9 +1115,9 @@
temp_html = temp_header_html
switch(current_screen)
- if ("mainmenu")
+ if("mainmenu")
temp_html += "Main Menu "
- if (viable_occupant) //is there REALLY someone in there who can be modified?
+ if(viable_occupant) //is there REALLY someone in there who can be modified?
temp_html += text("Modify Unique Identifier ", src)
temp_html += text("Modify Structural Enzymes ", src)
else
@@ -1126,7 +1126,7 @@
temp_html += text("Radiation Emitter Settings ", src)
temp_html += text("Transfer Buffer ", src)
- if ("unimenu")
+ if("unimenu")
if(!viable_occupant)
temp_html = text("No viable occupant detected.")
popup.set_content(temp_html)
@@ -1141,7 +1141,7 @@
temp_html += "Modify Block "
temp_html += "Irradiate "
- if ("strucmenu")
+ if("strucmenu")
if(!viable_occupant)
temp_html = text("No viable occupant detected.")
popup.set_content(temp_html)
@@ -1155,61 +1155,61 @@
temp_html += "Modify Block "
temp_html += "Irradiate "
- if ("radsetmenu")
+ if("radsetmenu")
temp_html = "<< Main Menu "
temp_html += "Radiation Emitter Settings "
- if (viable_occupant)
+ if(viable_occupant)
temp_html += text("Pulse Radiation ", src)
else
temp_html += "Pulse Radiation "
temp_html += " Radiation Duration: - [radduration] + "
temp_html += "Radiation Intensity: - [radstrength] + "
- if ("buffermenu")
+ if("buffermenu")
temp_html = "<< Main Menu "
temp_html += "Transfer Buffer "
temp_html += "Buffer 1: "
- if (!(buffer1))
+ if(!(buffer1))
temp_html += "Buffer Empty "
else
temp_html += text("Data: [] ", buffer1)
temp_html += text("By: [] ", buffer1owner)
temp_html += text("Label: [] ", buffer1label)
- if (viable_occupant) temp_html += text("Save : UI - UI+UE - SE ", src, src, src)
- if (buffer1) temp_html += text("Transfer to: Occupant - Injector ", src, src)
- //if (buffer1) temp_html += text("Isolate Block ", src)
- if (buffer1) temp_html += "Disk: Save To | Load From "
- if (buffer1) temp_html += text("Edit Label ", src)
- if (buffer1) temp_html += text("Clear Buffer ", src)
- if (!buffer1) temp_html += " "
+ if(viable_occupant) temp_html += text("Save : UI - UI+UE - SE ", src, src, src)
+ if(buffer1) temp_html += text("Transfer to: Occupant - Injector ", src, src)
+ //if(buffer1) temp_html += text("Isolate Block ", src)
+ if(buffer1) temp_html += "Disk: Save To | Load From "
+ if(buffer1) temp_html += text("Edit Label ", src)
+ if(buffer1) temp_html += text("Clear Buffer ", src)
+ if(!buffer1) temp_html += " "
temp_html += "Buffer 2: "
- if (!(buffer2))
+ if(!(buffer2))
temp_html += "Buffer Empty "
else
temp_html += text("Data: [] ", buffer2)
temp_html += text("By: [] ", buffer2owner)
temp_html += text("Label: [] ", buffer2label)
- if (viable_occupant) temp_html += text("Save : UI - UI+UE - SE ", src, src, src)
- if (buffer2) temp_html += text("Transfer to: Occupant - Injector ", src, src)
- //if (buffer2) temp_html += text("Isolate Block ", src)
- if (buffer2) temp_html += "Disk: Save To | Load From "
- if (buffer2) temp_html += text("Edit Label ", src)
- if (buffer2) temp_html += text("Clear Buffer ", src)
- if (!buffer2) temp_html += " "
+ if(viable_occupant) temp_html += text("Save : UI - UI+UE - SE ", src, src, src)
+ if(buffer2) temp_html += text("Transfer to: Occupant - Injector ", src, src)
+ //if(buffer2) temp_html += text("Isolate Block ", src)
+ if(buffer2) temp_html += "Disk: Save To | Load From "
+ if(buffer2) temp_html += text("Edit Label ", src)
+ if(buffer2) temp_html += text("Clear Buffer ", src)
+ if(!buffer2) temp_html += " "
temp_html += "Buffer 3: "
- if (!(buffer3))
+ if(!(buffer3))
temp_html += "Buffer Empty "
else
temp_html += text("Data: [] ", buffer3)
temp_html += text("By: [] ", buffer3owner)
temp_html += text("Label: [] ", buffer3label)
- if (viable_occupant) temp_html += text("Save : UI - UI+UE - SE ", src, src, src)
- if (buffer3) temp_html += text("Transfer to: Occupant - Injector ", src, src)
- //if (buffer3) temp_html += text("Isolate Block ", src)
- if (buffer3) temp_html += "Disk: Save To | Load From "
- if (buffer3) temp_html += text("Edit Label ", src)
- if (buffer3) temp_html += text("Clear Buffer ", src)
- if (!buffer3) temp_html += " "
+ if(viable_occupant) temp_html += text("Save : UI - UI+UE - SE ", src, src, src)
+ if(buffer3) temp_html += text("Transfer to: Occupant - Injector ", src, src)
+ //if(buffer3) temp_html += text("Isolate Block ", src)
+ if(buffer3) temp_html += "Disk: Save To | Load From "
+ if(buffer3) temp_html += text("Edit Label ", src)
+ if(buffer3) temp_html += text("Clear Buffer ", src)
+ if(!buffer3) temp_html += " "
temp_html += temp_footer_html
if(viable_occupant && !scanner_status_html && occupant) //is there REALLY someone in there?
@@ -1219,7 +1219,7 @@
var/rejuvenators = round(human_occupant.reagents.get_reagent_amount("inaprovaline") / REJUVENATORS_MAX * 100)
scanner_status_html += "Rejuvenators:
[human_occupant.reagents.get_reagent_amount("inaprovaline")] units
"
- if (current_screen == "mainmenu")
+ if(current_screen == "mainmenu")
scanner_status_html += "Unique Enzymes :
[uppertext(occupant.dna.unique_enzymes)]
"
scanner_status_html += "Unique Identifier:
[occupant.dna.uni_identity]
"
scanner_status_html += "Structural Enzymes:
[occupant.dna.struc_enzymes]
"
@@ -1228,7 +1228,7 @@
var/occupant_status = "Scanner Unoccupied"
if(occupant && occupant.dna) //is there REALLY someone in there?
- if (!istype(occupant,/mob/living/carbon/human))
+ if(!istype(occupant,/mob/living/carbon/human))
sleep(1)
if(NOCLONE in occupant.mutations)
occupant_status = "Invalid DNA structure "
@@ -1246,14 +1246,14 @@
dat += "[occupant_status][scanner_status_html]
"
var/scanner_access_text = "Lock Scanner"
- if (scanner.locked)
+ if(scanner.locked)
scanner_access_text = "Unlock Scanner"
dat += "Scan "
- if (occupant && occupant.dna)
+ if(occupant && occupant.dna)
dat += "[scanner_access_text] "
- if (human_occupant)
+ if(human_occupant)
dat += "Inject Rejuvenators "
else
dat += "Inject Rejuvenators "
@@ -1261,12 +1261,12 @@
dat += "[scanner_access_text] "
dat += "Inject Rejuvenators "
- if (!isnull(diskette))
+ if(!isnull(diskette))
dat += text("Eject Disk ", src)
dat += " "
- if (temp_html)
+ if(temp_html)
dat += temp_html
popup.set_content(dat)
diff --git a/code/modules/computer3/computers/security.dm b/code/modules/computer3/computers/security.dm
index c7eb0a8881b..ce6184178bf 100644
--- a/code/modules/computer3/computers/security.dm
+++ b/code/modules/computer3/computers/security.dm
@@ -51,26 +51,26 @@
usr.set_machine(src)
scan = computer.cardslot.reader
- if (computer.cardslot.dualslot)
+ if(computer.cardslot.dualslot)
scan2 = computer.cardslot.writer
if(!interactable())
return
- if (computer.z > 6)
- to_chat(usr, "\red Unable to establish a connection : \black You're too far away from the station!")
+ if(computer.z > 6)
+ to_chat(usr, "Unable to establish a connection : You're too far away from the station!")
return
var/dat
- if (temp)
+ if(temp)
dat = text("[] Clear Screen ", temp, src)
else
dat = text("Confirm Identity (R): [] ", src, (scan ? text("[]", scan.name) : "----------"))
- if (computer.cardslot.dualslot)
+ if(computer.cardslot.dualslot)
dat += text("Check Identity (W): [] ", src, (scan2 ? text("[]", scan2.name) : "----------"))
if(scan2 && !scan)
dat += text("Insert card into reader slot to log in.
")
- if (authenticated)
+ if(authenticated)
switch(screen)
if(1.0)
dat += {"
@@ -96,7 +96,7 @@
for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order))
var/crimstat = ""
for(var/datum/data/record/E in data_core.security)
- if ((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
+ if((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
crimstat = E.fields["criminal"]
var/background
switch(crimstat)
@@ -126,11 +126,7 @@
dat += "Delete All Records Back "
if(3.0)
dat += "Security Record "
- if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
- var/icon/front = new(active1.fields["photo"], dir = SOUTH)
- var/icon/side = new(active1.fields["photo"], dir = WEST)
- usr << browse_rsc(front, "front.png")
- usr << browse_rsc(side, "side.png")
+ if((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
dat += text("")
+ Photo: \
+
")
else
dat += "General Record Lost! "
- if ((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
+ if((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
dat += text(" \nSecurity Data \nCriminal Status: [] \n \nMinor Crimes: [] \nDetails: [] \n \nMajor Crimes: [] \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", src, active2.fields["criminal"], src, active2.fields["mi_crim"], src, active2.fields["mi_crim_d"], src, active2.fields["ma_crim"], src, active2.fields["ma_crim_d"], src, decode(active2.fields["notes"]))
var/counter = 1
while(active2.fields[text("com_[]", counter)])
@@ -219,9 +215,9 @@ What a mess.*/
Topic(href, href_list)
if(!interactable() || !computer.cardslot || ..(href,href_list))
return
- if (!( data_core.general.Find(active1) ))
+ if(!( data_core.general.Find(active1) ))
active1 = null
- if (!( data_core.security.Find(active2) ))
+ if(!( data_core.security.Find(active2) ))
active2 = null
switch(href_list["choice"])
// SORTING!
@@ -240,13 +236,13 @@ What a mess.*/
if("Clear Screen")
temp = null
- if ("Return")
+ if("Return")
screen = 1
active1 = null
active2 = null
if("Confirm Identity R")
- if (scan)
+ if(scan)
if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
computer.cardslot.remove(1)
else
@@ -254,12 +250,12 @@ What a mess.*/
scan = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
computer.cardslot.insert(I, 1)
scan = I
if("Confirm Identity W")
- if (scan2)
+ if(scan2)
if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
computer.cardslot.remove(2)
else
@@ -267,7 +263,7 @@ What a mess.*/
scan2 = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
computer.cardslot.insert(I, 2)
scan2 = I
@@ -278,20 +274,20 @@ What a mess.*/
active2 = null
if("Log In")
- if (istype(usr, /mob/living/silicon/ai))
+ if(istype(usr, /mob/living/silicon/ai))
src.active1 = null
src.active2 = null
src.authenticated = usr.name
src.rank = "AI"
src.screen = 1
- else if (istype(usr, /mob/living/silicon/robot))
+ else if(istype(usr, /mob/living/silicon/robot))
src.active1 = null
src.active2 = null
src.authenticated = usr.name
var/mob/living/silicon/robot/R = usr
src.rank = "[R.modtype] [R.braintype]"
src.screen = 1
- else if (istype(scan, /obj/item/weapon/card/id))
+ else if(istype(scan, /obj/item/weapon/card/id))
active1 = null
active2 = null
if(authenticate())
@@ -301,7 +297,7 @@ What a mess.*/
//RECORD FUNCTIONS
if("Search Records")
var/t1 = input("Search String: (Partial Name or ID or Fingerprints or Rank)", "Secure. records", null, null) as text
- if ((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || !interactable()))
+ if((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || !interactable()))
return
Perp = new/list()
t1 = lowertext(t1)
@@ -318,7 +314,7 @@ What a mess.*/
for(var/i = 1, i<=Perp.len, i+=2)
for(var/datum/data/record/E in data_core.security)
var/datum/data/record/R = Perp[i]
- if ((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
+ if((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
Perp[i+1] = E
tempname = t1
screen = 4
@@ -328,56 +324,56 @@ What a mess.*/
active1 = null
active2 = null
- if ("Browse Record")
+ if("Browse Record")
var/datum/data/record/R = locate(href_list["d_rec"])
var/S = locate(href_list["d_rec"])
- if (!( data_core.general.Find(R) ))
+ if(!( data_core.general.Find(R) ))
temp = "Record Not Found!"
else
for(var/datum/data/record/E in data_core.security)
- if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
+ if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
S = E
active1 = R
active2 = S
screen = 3
-/* if ("Search Fingerprints")
+/* if("Search Fingerprints")
var/t1 = input("Search String: (Fingerprint)", "Secure. records", null, null) as text
- if ((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || (!interactable()) && (!istype(usr, /mob/living/silicon))))
+ if((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || (!interactable()) && (!istype(usr, /mob/living/silicon))))
return
active1 = null
active2 = null
t1 = lowertext(t1)
for(var/datum/data/record/R in data_core.general)
- if (lowertext(R.fields["fingerprint"]) == t1)
+ if(lowertext(R.fields["fingerprint"]) == t1)
active1 = R
- if (!( active1 ))
+ if(!( active1 ))
temp = text("Could not locate record [].", t1)
else
for(var/datum/data/record/E in data_core.security)
- if ((E.fields["name"] == active1.fields["name"] || E.fields["id"] == active1.fields["id"]))
+ if((E.fields["name"] == active1.fields["name"] || E.fields["id"] == active1.fields["id"]))
active2 = E
screen = 3 */
- if ("Print Record")
- if (!( printing ))
+ if("Print Record")
+ if(!( printing ))
printing = 1
var/datum/data/record/record1 = null
var/datum/data/record/record2 = null
- if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
+ if((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
record1 = active1
- if ((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
+ if((istype(active2, /datum/data/record) && data_core.security.Find(active2)))
record2 = active2
sleep(50)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( computer.loc )
P.info = "Security Record "
- if (record1)
+ if(record1)
P.info += text("Name: [] ID: [] \nSex: [] \nAge: [] \nFingerprint: [] \nPhysical Status: [] \nMental Status: [] ", record1.fields["name"], record1.fields["id"], record1.fields["sex"], record1.fields["age"], record1.fields["fingerprint"], record1.fields["p_stat"], record1.fields["m_stat"])
P.name = text("Security Record ([])", record1.fields["name"])
else
P.info += "General Record Lost! "
P.name = "Security Record"
- if (record2)
+ if(record2)
P.info += text(" \nSecurity Data \nCriminal Status: [] \n \nMinor Crimes: [] \nDetails: [] \n \nMajor Crimes: [] \nDetails: [] \n \nImportant Notes: \n\t[] \n \nComments/Log ", record2.fields["criminal"], record2.fields["mi_crim"], record2.fields["mi_crim_d"], record2.fields["ma_crim"], record2.fields["ma_crim_d"], decode(record2.fields["notes"]))
var/counter = 1
while(record2.fields[text("com_[]", counter)])
@@ -389,47 +385,47 @@ What a mess.*/
printing = null
computer.updateUsrDialog()
//RECORD DELETE
- if ("Delete All Records")
+ if("Delete All Records")
temp = ""
temp += "Are you sure you wish to delete all Security records? "
temp += "Yes "
temp += "No "
- if ("Purge All Records")
+ if("Purge All Records")
for(var/datum/data/record/R in data_core.security)
qdel(R)
temp = "All Security records deleted."
- if ("Add Entry")
- if (!( istype(active2, /datum/data/record) ))
+ if("Add Entry")
+ if(!( istype(active2, /datum/data/record) ))
return
var/a2 = active2
var/t1 = sanitize(copytext(input("Add Comment:", "Secure. records", null, null) as message,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
return
var/counter = 1
while(active2.fields[text("com_[]", counter)])
counter++
active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year] [t1]")
- if ("Delete Record (ALL)")
- if (active1)
+ if("Delete Record (ALL)")
+ if(active1)
temp = "Are you sure you wish to delete the record (ALL)? "
temp += "Yes "
temp += "No "
- if ("Delete Record (Security)")
- if (active2)
+ if("Delete Record (Security)")
+ if(active2)
temp = "Are you sure you wish to delete the record (Security Portion Only)? "
temp += "Yes "
temp += "No "
- if ("Delete Entry")
- if ((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])]))
+ if("Delete Entry")
+ if((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])]))
active2.fields[text("com_[]", href_list["del_c"])] = "Deleted "
//RECORD CREATE
- if ("New Record (Security)")
- if ((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) )))
+ if("New Record (Security)")
+ if((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) )))
var/datum/data/record/R = new /datum/data/record()
R.fields["name"] = active1.fields["name"]
R.fields["id"] = active1.fields["id"]
@@ -444,7 +440,7 @@ What a mess.*/
active2 = R
screen = 3
- if ("New Record (General)")
+ if("New Record (General)")
var/datum/data/record/G = new /datum/data/record()
G.fields["name"] = "New Record"
G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
@@ -461,72 +457,72 @@ What a mess.*/
active2 = null
//FIELD FUNCTIONS
- if ("Edit Field")
+ if("Edit Field")
var/a1 = active1
var/a2 = active2
switch(href_list["field"])
if("name")
- if (istype(active1, /datum/data/record))
+ if(istype(active1, /datum/data/record))
var/t1 = input("Please input name:", "Secure. records", active1.fields["name"], null) as text
- if ((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon)))) || active1 != a1)
+ if((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon)))) || active1 != a1)
return
active1.fields["name"] = t1
if("id")
- if (istype(active2, /datum/data/record))
+ if(istype(active2, /datum/data/record))
var/t1 = sanitize(copytext(input("Please input id:", "Secure. records", active1.fields["id"], null) as text,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1))
return
active1.fields["id"] = t1
if("fingerprint")
- if (istype(active1, /datum/data/record))
+ if(istype(active1, /datum/data/record))
var/t1 = sanitize(copytext(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1))
return
active1.fields["fingerprint"] = t1
if("sex")
- if (istype(active1, /datum/data/record))
- if (active1.fields["sex"] == "Male")
+ if(istype(active1, /datum/data/record))
+ if(active1.fields["sex"] == "Male")
active1.fields["sex"] = "Female"
else
active1.fields["sex"] = "Male"
if("age")
- if (istype(active1, /datum/data/record))
+ if(istype(active1, /datum/data/record))
var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1))
return
active1.fields["age"] = t1
if("mi_crim")
- if (istype(active2, /datum/data/record))
+ if(istype(active2, /datum/data/record))
var/t1 = sanitize(copytext(input("Please input minor crimes list:", "Secure. records", active2.fields["mi_crim"], null) as text,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
return
active2.fields["mi_crim"] = t1
if("mi_crim_d")
- if (istype(active2, /datum/data/record))
+ if(istype(active2, /datum/data/record))
var/t1 = sanitize(copytext(input("Please summarize minor crimes:", "Secure. records", active2.fields["mi_crim_d"], null) as message,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
return
active2.fields["mi_crim_d"] = t1
if("ma_crim")
- if (istype(active2, /datum/data/record))
+ if(istype(active2, /datum/data/record))
var/t1 = sanitize(copytext(input("Please input major crimes list:", "Secure. records", active2.fields["ma_crim"], null) as text,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
return
active2.fields["ma_crim"] = t1
if("ma_crim_d")
- if (istype(active2, /datum/data/record))
+ if(istype(active2, /datum/data/record))
var/t1 = sanitize(copytext(input("Please summarize major crimes:", "Secure. records", active2.fields["ma_crim_d"], null) as message,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
return
active2.fields["ma_crim_d"] = t1
if("notes")
- if (istype(active2, /datum/data/record))
+ if(istype(active2, /datum/data/record))
var/t1 = trim(sanitize(copytext(input("Please summarize minor crimes:", "Secure. records", active2.fields["mi_crim_d"], null) as message,1,MAX_MESSAGE_LEN)))
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active2 != a2))
return
active2.fields["notes"] = t1
if("criminal")
- if (istype(active2, /datum/data/record))
+ if(istype(active2, /datum/data/record))
temp = "Criminal Status: "
temp += ""
temp += "None "
@@ -538,7 +534,7 @@ What a mess.*/
if("rank")
var/list/L = list( "Head of Personnel", "Captain", "AI" )
//This was so silly before the change. Now it actually works without beating your head against the keyboard. /N
- if ((istype(active1, /datum/data/record) && L.Find(rank)))
+ if((istype(active1, /datum/data/record) && L.Find(rank)))
temp = "Rank: "
temp += ""
for(var/rank in joblist)
@@ -547,9 +543,9 @@ What a mess.*/
else
alert(usr, "You do not have the required rank to do this!")
if("species")
- if (istype(active1, /datum/data/record))
+ if(istype(active1, /datum/data/record))
var/t1 = sanitize(copytext(input("Please enter race:", "General records", active1.fields["species"], null) as message,1,MAX_MESSAGE_LEN))
- if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ if((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!interactable() && (!istype(usr, /mob/living/silicon))) || active1 != a1))
return
active1.fields["species"] = t1
@@ -557,14 +553,14 @@ What a mess.*/
else//To properly clear as per clear screen.
temp=null
switch(href_list["choice"])
- if ("Change Rank")
- if (active1)
+ if("Change Rank")
+ if(active1)
active1.fields["rank"] = href_list["rank"]
if(href_list["rank"] in joblist)
active1.fields["real_rank"] = href_list["real_rank"]
- if ("Change Criminal Status")
- if (active2)
+ if("Change Criminal Status")
+ if(active2)
switch(href_list["criminal2"])
if("none")
@@ -580,18 +576,18 @@ What a mess.*/
for(var/mob/living/carbon/human/H in mob_list)
H.sec_hud_set_security_status()
- if ("Delete Record (Security) Execute")
- if (active2)
+ if("Delete Record (Security) Execute")
+ if(active2)
qdel(active2)
- if ("Delete Record (ALL) Execute")
- if (active1)
+ if("Delete Record (ALL) Execute")
+ if(active1)
for(var/datum/data/record/R in data_core.medical)
- if ((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
+ if((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
qdel(R)
else
qdel(active1)
- if (active2)
+ if(active2)
qdel(active2)
else
temp = "This function does not appear to be working at the moment. Our apologies."
diff --git a/code/modules/computer3/computers/shuttle.dm b/code/modules/computer3/computers/shuttle.dm
index 236de564868..70bdb133137 100644
--- a/code/modules/computer3/computers/shuttle.dm
+++ b/code/modules/computer3/computers/shuttle.dm
@@ -13,12 +13,12 @@
attackby(var/obj/item/card/W as obj, var/mob/user as mob, params)
if(stat & (BROKEN|NOPOWER)) return
- if ((!( istype(W, /obj/item/card) ) || !( ticker ) || emergency_shuttle.location != 1 || !( user ))) return
- if (istype(W, /obj/item/card/id)||istype(W, /obj/item/device/pda))
- if (istype(W, /obj/item/device/pda))
+ if((!( istype(W, /obj/item/card) ) || !( ticker ) || emergency_shuttle.location != 1 || !( user ))) return
+ if(istype(W, /obj/item/card/id)||istype(W, /obj/item/device/pda))
+ if(istype(W, /obj/item/device/pda))
var/obj/item/device/pda/pda = W
W = pda.id
- if (!W:access) //no access
+ if(!W:access) //no access
to_chat(user, "The access level of [W:registered_name]\'s card is not high enough. ")
return
@@ -38,7 +38,7 @@
if("Authorize")
src.authorized -= W:registered_name
src.authorized += W:registered_name
- if (src.auth_need - src.authorized.len > 0)
+ if(src.auth_need - src.authorized.len > 0)
message_admins("[key_name_admin(user)] has authorized early shuttle launch")
log_game("[user.ckey] has authorized early shuttle launch")
to_chat(world, text("\blue Alert: [] authorizations needed until shuttle is launched early ", src.auth_need - src.authorized.len))
@@ -63,7 +63,7 @@
return
emag_act(user as mob)
- if (!emagged)
+ if(!emagged)
var/choice = alert(user, "Would you like to launch the shuttle?","Shuttle control", "Launch", "Cancel")
if(!emagged && emergency_shuttle.location == 1)
diff --git a/code/modules/computer3/computers/specops_shuttle.dm b/code/modules/computer3/computers/specops_shuttle.dm
index 8281a30479f..fa64036857d 100644
--- a/code/modules/computer3/computers/specops_shuttle.dm
+++ b/code/modules/computer3/computers/specops_shuttle.dm
@@ -55,9 +55,9 @@ var/specops_shuttle_timeleft = 0
specops_shuttle_moving_to_centcom = 0
specops_shuttle_at_station = 1
- if (specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
+ if(specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
- if (!specops_can_move())
+ if(!specops_can_move())
to_chat(usr, "\red The Special Operations shuttle is unable to leave.")
return
@@ -179,7 +179,7 @@ var/specops_shuttle_timeleft = 0
to_chat(user, "\red Access Denied.")
return
- if (sent_strike_team == 0)
+ if(sent_strike_team == 0)
to_chat(usr, "\red The strike team has not yet deployed.")
return
@@ -188,7 +188,7 @@ var/specops_shuttle_timeleft = 0
user.set_machine(src)
var/dat
- if (temp)
+ if(temp)
dat = temp
else
dat += {"
@@ -208,19 +208,19 @@ var/specops_shuttle_timeleft = 0
if(..())
return
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
- if (href_list["sendtodock"])
+ if(href_list["sendtodock"])
if(!specops_shuttle_at_station|| specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
to_chat(usr, "\blue Central Command will not allow the Special Operations shuttle to return.")
return
- else if (href_list["sendtostation"])
+ else if(href_list["sendtostation"])
if(specops_shuttle_at_station || specops_shuttle_moving_to_station || specops_shuttle_moving_to_centcom) return
- if (!specops_can_move())
+ if(!specops_can_move())
to_chat(usr, "\red The Special Operations shuttle is unable to leave.")
return
@@ -238,7 +238,7 @@ var/specops_shuttle_timeleft = 0
spawn(0)
specops_process()
- else if (href_list["mainmenu"])
+ else if(href_list["mainmenu"])
temp = null
add_fingerprint(usr)
diff --git a/code/modules/computer3/computers/station_alert.dm b/code/modules/computer3/computers/station_alert.dm
index 850bfc83c5b..f026f36a8bb 100644
--- a/code/modules/computer3/computers/station_alert.dm
+++ b/code/modules/computer3/computers/station_alert.dm
@@ -16,18 +16,18 @@
return
var/dat = "Current Station Alerts \n"
dat += "Close "
- for (var/cat in src.alarms)
+ for(var/cat in src.alarms)
dat += text("[] \n", cat)
var/list/L = src.alarms[cat]
- if (L.len)
- for (var/alarm in L)
+ if(L.len)
+ for(var/alarm in L)
var/list/alm = L[alarm]
var/area/A = alm[1]
var/list/sources = alm[3]
dat += ""
dat += "• "
dat += "[A.name]"
- if (sources.len > 1)
+ if(sources.len > 1)
dat += text(" - [] sources", sources.len)
dat += " \n"
else
@@ -49,20 +49,20 @@
proc/triggerAlarm(var/class, area/A, var/O, var/alarmsource)
var/list/L = src.alarms[class]
- for (var/I in L)
- if (I == A.name)
+ for(var/I in L)
+ if(I == A.name)
var/list/alarm = L[I]
var/list/sources = alarm[3]
- if (!(alarmsource in sources))
+ if(!(alarmsource in sources))
sources += alarmsource
return 1
var/obj/machinery/camera/C = null
var/list/CL = null
- if (O && istype(O, /list))
+ if(O && istype(O, /list))
CL = O
- if (CL.len == 1)
+ if(CL.len == 1)
C = CL[1]
- else if (O && istype(O, /obj/machinery/camera))
+ else if(O && istype(O, /obj/machinery/camera))
C = O
L[A.name] = list(A, (C) ? C : O, list(alarmsource))
return 1
@@ -71,13 +71,13 @@
proc/cancelAlarm(var/class, area/A as area, obj/origin)
var/list/L = src.alarms[class]
var/cleared = 0
- for (var/I in L)
- if (I == A.name)
+ for(var/I in L)
+ if(I == A.name)
var/list/alarm = L[I]
var/list/srcs = alarm[3]
- if (origin in srcs)
+ if(origin in srcs)
srcs -= origin
- if (srcs.len == 0)
+ if(srcs.len == 0)
cleared = 1
L -= I
return !cleared
@@ -86,7 +86,7 @@
process()
var/active_alarms = 0
- for (var/cat in src.alarms)
+ for(var/cat in src.alarms)
var/list/L = src.alarms[cat]
if(L.len) active_alarms = 1
if(active_alarms)
diff --git a/code/modules/computer3/computers/syndicate_specops_shuttle.dm b/code/modules/computer3/computers/syndicate_specops_shuttle.dm
index f490cd3c822..c9a61b2dfad 100644
--- a/code/modules/computer3/computers/syndicate_specops_shuttle.dm
+++ b/code/modules/computer3/computers/syndicate_specops_shuttle.dm
@@ -55,9 +55,9 @@ var/syndicate_elite_shuttle_timeleft = 0
syndicate_elite_shuttle_moving_to_mothership = 0
syndicate_elite_shuttle_at_station = 1
- if (syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return
+ if(syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return
- if (!syndicate_elite_can_move())
+ if(!syndicate_elite_can_move())
to_chat(usr, "\red The Syndicate Elite shuttle is unable to leave.")
return
@@ -192,7 +192,7 @@ var/syndicate_elite_shuttle_timeleft = 0
to_chat(user, "\red Access Denied.")
return
-// if (sent_syndicate_strike_team == 0)
+// if(sent_syndicate_strike_team == 0)
// to_chat(usr, "\red The strike team has not yet deployed.")
// return
@@ -201,7 +201,7 @@ var/syndicate_elite_shuttle_timeleft = 0
user.set_machine(src)
var/dat
- if (temp)
+ if(temp)
dat = temp
else
dat = {"Location: [syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership ? "Departing for [station_name] in ([syndicate_elite_shuttle_timeleft] seconds.)":syndicate_elite_shuttle_at_station ? "Station":"Dock"]
@@ -220,19 +220,19 @@ var/syndicate_elite_shuttle_timeleft = 0
if(..())
return
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
- if (href_list["sendtodock"])
+ if(href_list["sendtodock"])
if(!syndicate_elite_shuttle_at_station|| syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return
to_chat(usr, "\blue The Syndicate will not allow the Elite Squad shuttle to return.")
return
- else if (href_list["sendtostation"])
+ else if(href_list["sendtostation"])
if(syndicate_elite_shuttle_at_station || syndicate_elite_shuttle_moving_to_station || syndicate_elite_shuttle_moving_to_mothership) return
- if (!specops_can_move())
+ if(!specops_can_move())
to_chat(usr, "\red The Syndicate Elite shuttle is unable to leave.")
return
@@ -251,7 +251,7 @@ var/syndicate_elite_shuttle_timeleft = 0
syndicate_elite_process()
- else if (href_list["mainmenu"])
+ else if(href_list["mainmenu"])
temp = null
add_fingerprint(usr)
diff --git a/code/modules/computer3/computers/welcome.dm b/code/modules/computer3/computers/welcome.dm
index 11695ce5322..203c5922289 100644
--- a/code/modules/computer3/computers/welcome.dm
+++ b/code/modules/computer3/computers/welcome.dm
@@ -10,7 +10,6 @@
interact()
- usr.set_machine(src)
if(!interactable())
return
var/dat = ""
diff --git a/code/modules/computer3/laptop.dm b/code/modules/computer3/laptop.dm
index dd4f73914b6..e32375a457c 100644
--- a/code/modules/computer3/laptop.dm
+++ b/code/modules/computer3/laptop.dm
@@ -101,14 +101,15 @@
var/obj/item/weapon/card/id/card
if(C.reader)
card = C.reader
+ C.remove_reader(usr)
else if(C.writer)
card = C.writer
+ C.remove_writer(usr)
else
to_chat(usr, "There is nothing to remove from the laptop card port.")
return
to_chat(usr, "You remove [card] from the laptop.")
- C.remove(card)
/obj/machinery/computer3/laptop
diff --git a/code/modules/computer3/lapvend.dm b/code/modules/computer3/lapvend.dm
index 8383981046d..ee436ee3cc0 100644
--- a/code/modules/computer3/lapvend.dm
+++ b/code/modules/computer3/lapvend.dm
@@ -29,7 +29,7 @@
/obj/machinery/lapvend/blob_act()
- if (prob(50))
+ if(prob(50))
spawn(0)
qdel(src)
return
@@ -82,7 +82,7 @@
dat += "Total: [total()] "
if(cardreader == 1)
dat += "Card Reader: (single) (50) "
- else if (cardreader == 2)
+ else if(cardreader == 2)
dat += "Card Reader: (double) (125) "
else
dat += "Card Reader: None "
@@ -106,9 +106,9 @@
dat += "Network card: Powernet (25) "
else
dat += "Network card: None "
- if (power == 0)
+ if(power == 0)
dat += "Power source: Regular "
- else if (power == 1)
+ else if(power == 1)
dat += "Power source: Extended (175) "
else
dat += "Power source: Unreal (250) "
@@ -133,41 +133,41 @@
/obj/machinery/lapvend/Topic(href, href_list)
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
usr.set_machine(src)
switch(href_list["choice"])
if("single_add")
cardreader = 1
- if ("dual_add")
+ if("dual_add")
cardreader = 2
- if ("floppy_add")
+ if("floppy_add")
floppy = 1
- if ("radio_add")
+ if("radio_add")
radionet = 1
- if ("camnet_add")
+ if("camnet_add")
camera = 1
- if ("area_add")
+ if("area_add")
network = 1
- if ("prox_add")
+ if("prox_add")
network = 2
- if ("cable_add")
+ if("cable_add")
network = 3
- if ("high_add")
+ if("high_add")
power = 1
- if ("super_add")
+ if("super_add")
power = 2
- if ("single_rem" || "dual_rem")
+ if("single_rem" || "dual_rem")
cardreader = 0
- if ("floppy_rem")
+ if("floppy_rem")
floppy = 0
- if ("radio_rem")
+ if("radio_rem")
radionet = 0
- if ("camnet_rem")
+ if("camnet_rem")
camera = 0
- if ("area_rem" || "prox_rem" || "cable_rem")
+ if("area_rem" || "prox_rem" || "cable_rem")
network = 0
- if ("high_rem" || "super_rem")
+ if("high_rem" || "super_rem")
power = 0
if("vend")
@@ -194,23 +194,23 @@
newlap.spawn_parts += (/obj/item/part/computer/networking/radio)
if(camera == 1)
newlap.spawn_parts += (/obj/item/part/computer/networking/cameras)
- if (network == 1)
+ if(network == 1)
newlap.spawn_parts += (/obj/item/part/computer/networking/area)
- if (network == 2)
+ if(network == 2)
newlap.spawn_parts += (/obj/item/part/computer/networking/prox)
- if (network == 3)
+ if(network == 3)
newlap.spawn_parts += (/obj/item/part/computer/networking/cable)
- if (power == 1)
+ if(power == 1)
qdel(newlap.battery)
newlap.battery = new /obj/item/weapon/stock_parts/cell/high(newlap)
- if (power == 2)
+ if(power == 2)
qdel(newlap.battery)
newlap.battery = new /obj/item/weapon/stock_parts/cell/super(newlap)
newlap.spawn_parts()
/obj/machinery/lapvend/proc/scan_card(var/obj/item/weapon/card/I)
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = I
visible_message("[usr] swipes a card through [src]. ")
if(vendor_account)
@@ -262,11 +262,11 @@
network = 0
power = 0
else
- to_chat(usr, "\icon[src]You don't have that much money! ")
+ to_chat(usr, "[bicon(src)]You don't have that much money! ")
else
- to_chat(usr, "\icon[src]Unable to access account. Check security settings and try again. ")
+ to_chat(usr, "[bicon(src)]Unable to access account. Check security settings and try again. ")
else
- to_chat(usr, "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support. ")
+ to_chat(usr, "[bicon(src)]Unable to access vendor account. Please record the machine ID and call CentComm Support. ")
/obj/machinery/lapvend/proc/total()
var/total = 0
@@ -312,7 +312,7 @@
newlap.spawn_files += (/datum/file/program/communications)
if((access_medical in C.access) || (access_forensics_lockers in C.access)) //Gives detective the medical records program, but not the crew monitoring one.
newlap.spawn_files += (/datum/file/program/med_data)
- if (access_medical in C.access)
+ if(access_medical in C.access)
newlap.spawn_files += (/datum/file/program/crew)
if(access_engine in C.access)
newlap.spawn_files += (/datum/file/program/powermon)
@@ -359,7 +359,7 @@
/obj/machinery/lapvend/proc/reimburse(var/obj/item/weapon/card/I)
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = I
visible_message("[usr] swipes a card through [src]. ")
if(vendor_account)
@@ -405,6 +405,6 @@
power = 0
else
- to_chat(usr, "\icon[src]Unable to access account. Check security settings and try again. ")
+ to_chat(usr, "[bicon(src)]Unable to access account. Check security settings and try again. ")
else
- to_chat(usr, "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support. ")
+ to_chat(usr, "[bicon(src)]Unable to access vendor account. Please record the machine ID and call CentComm Support. ")
diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm
new file mode 100644
index 00000000000..901de314edc
--- /dev/null
+++ b/code/modules/crafting/craft.dm
@@ -0,0 +1,340 @@
+/datum/personal_crafting
+ var/busy
+ var/viewing_category = 1 //typical powergamer starting on the Weapons tab
+ var/list/categories = list(CAT_WEAPON,CAT_AMMO,CAT_ROBOT,CAT_FOOD,CAT_MISC,CAT_PRIMAL)
+
+
+
+
+
+/* This is what procs do:
+ get_environment - gets a list of things accessable for crafting by user
+ get_surroundings - takes a list of things and makes a list of key-types to values-amounts of said type in the list
+ check_contents - takes a recipe and a key-type list and checks if said recipe can be done with available stuff
+ check_tools - takes recipe, a key-type list, and a user and checks if there are enough tools to do the stuff, checks bugs one level deep
+ construct_item - takes a recipe and a user, call all the checking procs, calls do_after, checks all the things again, calls del_reqs, creates result, calls CheckParts of said result with argument being list returned by deel_reqs
+ del_reqs - takes recipe and a user, loops over the recipes reqs var and tries to find everything in the list make by get_environment and delete it/add to parts list, then returns the said list
+*/
+
+
+
+
+/datum/personal_crafting/proc/check_contents(datum/crafting_recipe/R, list/contents)
+ main_loop:
+ for(var/A in R.reqs)
+ var/needed_amount = R.reqs[A]
+ for(var/B in contents)
+ if(ispath(B, A))
+ if(contents[B] >= R.reqs[A])
+ continue main_loop
+ else
+ needed_amount -= contents[B]
+ if(needed_amount <= 0)
+ continue main_loop
+ else
+ continue
+ return 0
+ for(var/A in R.chem_catalists)
+ if(contents[A] < R.chem_catalists[A])
+ return 0
+ return 1
+
+/datum/personal_crafting/proc/get_environment(mob/user)
+ . = list()
+ . += user.r_hand
+ . += user.l_hand
+ if(!istype(user.loc, /turf))
+ return
+ var/list/L = block(get_step(user, SOUTHWEST), get_step(user, NORTHEAST))
+ for(var/A in L)
+ var/turf/T = A
+ if(T.Adjacent(user))
+ . += T.contents
+
+
+/datum/personal_crafting/proc/get_surroundings(mob/user)
+ . = list()
+ for(var/obj/item/I in get_environment(user))
+ if(istype(I, /obj/item/stack))
+ var/obj/item/stack/S = I
+ .[I.type] += S.amount
+ else
+ if(istype(I, /obj/item/weapon/reagent_containers))
+ var/obj/item/weapon/reagent_containers/RC = I
+ if(RC.flags & OPENCONTAINER)
+ for(var/datum/reagent/A in RC.reagents.reagent_list)
+ .[A.type] += A.volume
+ .[I.type] += 1
+
+/datum/personal_crafting/proc/check_tools(mob/user, datum/crafting_recipe/R, list/contents)
+ if(!R.tools.len)
+ return 1
+ var/list/possible_tools = list()
+ for(var/obj/item/I in user.contents)
+ if(istype(I, /obj/item/weapon/storage))
+ for(var/obj/item/SI in I.contents)
+ possible_tools += SI.type
+ possible_tools += I.type
+ possible_tools += contents
+
+ main_loop:
+ for(var/A in R.tools)
+ for(var/I in possible_tools)
+ if(ispath(I,A))
+ continue main_loop
+ return 0
+ return 1
+
+/datum/personal_crafting/proc/construct_item(mob/user, datum/crafting_recipe/R)
+ for(var/A in R.parts)
+ var/list/contents = get_surroundings(user)
+ var/send_feedback = 1
+ if(check_contents(R, contents))
+ if(check_tools(user, R, contents))
+ if(do_after(user, R.time, target = user))
+ contents = get_surroundings(user)
+ if(!check_contents(R, contents))
+ return ", missing component."
+ if(!check_tools(user, R, contents))
+ return ", missing tool."
+ var/list/parts = del_reqs(R, user)
+ var/atom/movable/I = new R.result (get_turf(user.loc))
+ I.CheckParts(parts, R)
+ if(send_feedback)
+ feedback_add_details("object_crafted","[I.type]")
+ return 0
+ return "."
+ return ", missing tool."
+ return ", missing component."
+
+
+/*Del reqs works like this:
+ Loop over reqs var of the recipe
+ Set var amt to the value current cycle req is pointing to, its amount of type we need to delete
+ Get var/surroundings list of things accessable to crafting by get_environment()
+ Check the type of the current cycle req
+ If its reagent then do a while loop, inside it try to locate() reagent containers, inside such containers try to locate needed reagent, if there isnt remove thing from surroundings
+ If there is enough reagent in the search result then delete the needed amount, create the same type of reagent with the same data var and put it into deletion list
+ If there isnt enough take all of that reagent from the container, put into deletion list, substract the amt var by the volume of reagent, remove the container from surroundings list and keep searching
+ While doing above stuff check deletion list if it already has such reagnet, if yes merge instead of adding second one
+ If its stack check if it has enough amount
+ If yes create new stack with the needed amount and put in into deletion list, substract taken amount from the stack
+ If no put all of the stack in the deletion list, substract its amount from amt and keep searching
+ While doing above stuff check deletion list if it already has such stack type, if yes try to merge them instead of adding new one
+ If its anything else just locate() in in the list in a while loop, each find --s the amt var and puts the found stuff in deletion loop
+ Then do a loop over parts var of the recipe
+ Do similar stuff to what we have done above, but now in deletion list, until the parts conditions are satisfied keep taking from the deletion list and putting it into parts list for return
+ After its done loop over deletion list and delete all the shit that wasnt taken by parts loop
+ del_reqs return the list of parts resulting object will recieve as argument of CheckParts proc, on the atom level it will add them all to the contents, on all other levels it calls ..() and does whatever is needed afterwards but from contents list already
+*/
+
+/datum/personal_crafting/proc/del_reqs(datum/crafting_recipe/R, mob/user)
+ var/list/surroundings
+ var/list/Deletion = list()
+ . = list()
+ var/data
+ var/amt
+ main_loop:
+ for(var/A in R.reqs)
+ amt = R.reqs[A]
+ surroundings = get_environment(user)
+ surroundings -= Deletion
+ if(ispath(A, /datum/reagent))
+ var/datum/reagent/RG = new A
+ var/datum/reagent/RGNT
+ while(amt > 0)
+ var/obj/item/weapon/reagent_containers/RC = locate() in surroundings
+ RG = RC.reagents.get_reagent(A)
+ if(RG)
+ if(!locate(RG.type) in Deletion)
+ Deletion += new RG.type()
+ if(RG.volume > amt)
+ RG.volume -= amt
+ data = RG.data
+ RC.reagents.conditional_update(RC)
+ RG = locate(RG.type) in Deletion
+ RG.volume = amt
+ RG.data += data
+ continue main_loop
+ else
+ surroundings -= RC
+ amt -= RG.volume
+ RC.reagents.reagent_list -= RG
+ RC.reagents.conditional_update(RC)
+ RGNT = locate(RG.type) in Deletion
+ RGNT.volume += RG.volume
+ RGNT.data += RG.data
+ qdel(RG)
+ else
+ surroundings -= RC
+ else if(ispath(A, /obj/item/stack))
+ var/obj/item/stack/S
+ var/obj/item/stack/SD
+ while(amt > 0)
+ S = locate(A) in surroundings
+ if(S.amount >= amt)
+ if(!locate(S.type) in Deletion)
+ SD = new S.type()
+ Deletion += SD
+ S.use(amt)
+ SD = locate(S.type) in Deletion
+ SD.amount += amt
+ continue main_loop
+ else
+ amt -= S.amount
+ if(!locate(S.type) in Deletion)
+ Deletion += S
+ else
+ data = S.amount
+ S = locate(S.type) in Deletion
+ S.amount += data
+ surroundings -= S
+ else
+ var/atom/movable/I
+ while(amt > 0)
+ I = locate(A) in surroundings
+ Deletion += I
+ surroundings -= I
+ amt--
+ var/list/partlist = list(R.parts.len)
+ for(var/M in R.parts)
+ partlist[M] = R.parts[M]
+ for(var/A in R.parts)
+ if(istype(A, /datum/reagent))
+ var/datum/reagent/RG = locate(A) in Deletion
+ if(RG.volume > partlist[A])
+ RG.volume = partlist[A]
+ . += RG
+ Deletion -= RG
+ continue
+ else if(istype(A, /obj/item/stack))
+ var/obj/item/stack/ST = locate(A) in Deletion
+ if(ST.amount > partlist[A])
+ ST.amount = partlist[A]
+ . += ST
+ Deletion -= ST
+ continue
+ else
+ while(partlist[A] > 0)
+ var/atom/movable/AM = locate(A) in Deletion
+ . += AM
+ Deletion -= AM
+ partlist[A] -= 1
+ while(Deletion.len)
+ var/DL = Deletion[Deletion.len]
+ Deletion.Cut(Deletion.len)
+ qdel(DL)
+
+/datum/personal_crafting/proc/craft(mob/user)
+ if(user.incapacitated() || user.lying || istype(user.loc, /obj/mecha))
+ return
+ var/list/surroundings = get_surroundings(user)
+ var/dat = "Crafting menu "
+ if(busy)
+ dat += ""
+ dat += "Crafting in progress...
"
+ else
+ dat += "<-- "
+ dat += " [categories[prev_cat()]] |"
+ dat += " [categories[viewing_category]] "
+ dat += "| [categories[next_cat()]] "
+ dat += "--> "
+
+ dat += ""
+
+ //Filter the recipes we can craft to the top
+ var/list/can_craft = list()
+ var/list/cant_craft = list()
+ for(var/datum/crafting_recipe/R in crafting_recipes)
+ if(R.category != categories[viewing_category])
+ continue
+ if(check_contents(R, surroundings))
+ can_craft += R
+ else
+ cant_craft += R
+
+ for(var/datum/crafting_recipe/R in can_craft)
+ dat += build_recipe_text(R, surroundings)
+ for(var/datum/crafting_recipe/R in cant_craft)
+ dat += build_recipe_text(R, surroundings)
+
+
+ dat += "
"
+
+ var/datum/browser/popup = new(user, "crafting", "Crafting", 500, 500)
+ popup.set_content(dat)
+ popup.open()
+ return
+
+/datum/personal_crafting/Topic(href, href_list)
+ if(usr.stat || usr.lying)
+ return
+ if(href_list["make"])
+ var/datum/crafting_recipe/TR = locate(href_list["make"])
+ busy = 1
+ craft(usr)
+ var/fail_msg = construct_item(usr, TR)
+ if(!fail_msg)
+ usr << "[TR.name] constructed. "
+ else
+ usr << "Construction failed[fail_msg] "
+ busy = 0
+ craft(usr)
+ if(href_list["forwardCat"])
+ viewing_category = next_cat()
+ usr << "Category is now [categories[viewing_category]]. "
+ craft(usr)
+ if(href_list["backwardCat"])
+ viewing_category = prev_cat()
+ usr << "Category is now [categories[viewing_category]]. "
+ craft(usr)
+
+//Next works nicely with modular arithmetic
+/datum/personal_crafting/proc/next_cat()
+ . = viewing_category % categories.len + 1
+
+//Previous can go fuck itself
+/datum/personal_crafting/proc/prev_cat()
+ if(viewing_category == categories.len)
+ . = viewing_category-1
+ else
+ . = viewing_category % categories.len - 1
+ if(. <= 0)
+ . = categories.len
+
+/datum/personal_crafting/proc/build_recipe_text(datum/crafting_recipe/R, list/contents)
+ . = ""
+ var/name_text = ""
+ var/req_text = ""
+ var/tool_text = ""
+ var/catalist_text = ""
+ if(check_contents(R, contents))
+ name_text ="[R.name] "
+
+ else
+ name_text = "[R.name] "
+
+ if(name_text)
+ for(var/A in R.reqs)
+ if(ispath(A, /obj))
+ var/obj/O = A
+ req_text += " [R.reqs[A]] [initial(O.name)]"
+ else if(ispath(A, /datum/reagent))
+ var/datum/reagent/RE = A
+ req_text += " [R.reqs[A]] [initial(RE.name)]"
+
+ if(R.chem_catalists.len)
+ catalist_text += ", Catalysts:"
+ for(var/C in R.chem_catalists)
+ if(ispath(C, /datum/reagent))
+ var/datum/reagent/RE = C
+ catalist_text += " [R.chem_catalists[C]] [initial(RE.name)]"
+
+ if(R.tools.len)
+ tool_text += ", Tools:"
+ for(var/O in R.tools)
+ if(ispath(O, /obj))
+ var/obj/T = O
+ tool_text += " [R.tools[O]] [initial(T.name)]"
+
+ . = "[name_text][req_text][tool_text][catalist_text] "
diff --git a/code/modules/crafting/guncrafting.dm b/code/modules/crafting/guncrafting.dm
index 8a9d5803529..a7309803c1b 100644
--- a/code/modules/crafting/guncrafting.dm
+++ b/code/modules/crafting/guncrafting.dm
@@ -71,7 +71,7 @@
..()
if(istype(I, /obj/item/stack/packageWrap))
var/obj/item/stack/packageWrap/C = I
- if (C.use(5))
+ if(C.use(5))
var/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/W = new /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised
user.unEquip(src)
user.put_in_hands(W)
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index d8586b6c0d8..60d830a1c89 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -1,4 +1,4 @@
-/datum/table_recipe
+/datum/crafting_recipe
var/name = "" //in-game display name
var/reqs[] = list() //type paths of items consumed associated with how many are needed
var/result //type path of item resulting from this craft
@@ -7,14 +7,15 @@
var/parts[] = list() //type paths of items that will be placed in the result
var/chem_catalists[] = list() //like tools but for reagents
var/fruit[] = list() //grown products required by the recipe
+ var/category = CAT_MISC // Recipe category
-/datum/table_recipe/proc/AdjustChems(var/obj/resultobj as obj)
+/datum/crafting_recipe/proc/AdjustChems(var/obj/resultobj as obj)
//This proc is to replace the make_food proc of recipes from microwaves and such that are being converted to table crafting recipes.
//Use it to handle the removal of reagents after the food has been created (like removing toxins from a salad made with ambrosia)
//If a recipe does not require it's chems adjusted, don't bother declaring this for the recipe, as it will call this placeholder
return
-/datum/table_recipe/IED
+/datum/crafting_recipe/IED
name = "IED"
result = /obj/item/weapon/grenade/iedcasing/filled
reqs = list(/datum/reagent/fuel = 50,
@@ -23,8 +24,9 @@
/obj/item/weapon/reagent_containers/food/drinks/cans = 1)
parts = list(/obj/item/weapon/reagent_containers/food/drinks/cans = 1)
time = 80
+ category = CAT_WEAPON
-/datum/table_recipe/stunprod
+/datum/crafting_recipe/stunprod
name = "Stunprod"
result = /obj/item/weapon/melee/baton/cattleprod
reqs = list(/obj/item/weapon/restraints/handcuffs/cable = 1,
@@ -33,8 +35,9 @@
/obj/item/weapon/stock_parts/cell = 1)
time = 80
parts = list(/obj/item/weapon/stock_parts/cell = 1)
+ category = CAT_WEAPON
-/datum/table_recipe/ed209
+/datum/crafting_recipe/ed209
name = "ED209"
result = /mob/living/simple_animal/bot/ed209
reqs = list(/obj/item/robot_parts/robot_suit = 1,
@@ -50,8 +53,9 @@
/obj/item/robot_parts/r_arm = 1)
tools = list(/obj/item/weapon/weldingtool, /obj/item/weapon/screwdriver)
time = 120
+ category = CAT_ROBOT
-/datum/table_recipe/secbot
+/datum/crafting_recipe/secbot
name = "Secbot"
result = /mob/living/simple_animal/bot/secbot
reqs = list(/obj/item/device/assembly/signaler = 1,
@@ -61,16 +65,18 @@
/obj/item/robot_parts/r_arm = 1)
tools = list(/obj/item/weapon/weldingtool)
time = 120
+ category = CAT_ROBOT
-/datum/table_recipe/cleanbot
+/datum/crafting_recipe/cleanbot
name = "Cleanbot"
result = /mob/living/simple_animal/bot/cleanbot
reqs = list(/obj/item/weapon/reagent_containers/glass/bucket = 1,
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
time = 80
+ category = CAT_ROBOT
-/datum/table_recipe/floorbot
+/datum/crafting_recipe/floorbot
name = "Floorbot"
result = /mob/living/simple_animal/bot/floorbot
reqs = list(/obj/item/weapon/storage/toolbox/mechanical = 1,
@@ -78,8 +84,9 @@
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
time = 80
+ category = CAT_ROBOT
-/datum/table_recipe/medbot
+/datum/crafting_recipe/medbot
name = "Medbot"
result = /mob/living/simple_animal/bot/medbot
reqs = list(/obj/item/device/healthanalyzer = 1,
@@ -87,8 +94,9 @@
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
time = 80
+ category = CAT_ROBOT
-/datum/table_recipe/flamethrower
+/datum/crafting_recipe/flamethrower
name = "Flamethrower"
result = /obj/item/weapon/flamethrower
reqs = list(/obj/item/weapon/weldingtool = 1,
@@ -96,8 +104,9 @@
/obj/item/stack/rods = 2)
tools = list(/obj/item/weapon/screwdriver)
time = 20
+ category = CAT_WEAPON
-/datum/table_recipe/meteorshot
+/datum/crafting_recipe/meteorshot
name = "Meteorshot Shell"
result = /obj/item/ammo_casing/shotgun/meteorshot
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
@@ -105,8 +114,9 @@
/obj/item/weapon/stock_parts/manipulator = 2)
tools = list(/obj/item/weapon/screwdriver)
time = 5
+ category = CAT_AMMO
-/datum/table_recipe/pulseslug
+/datum/crafting_recipe/pulseslug
name = "Pulse Slug Shell"
result = /obj/item/ammo_casing/shotgun/pulseslug
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
@@ -114,16 +124,18 @@
/obj/item/weapon/stock_parts/micro_laser/ultra = 1)
tools = list(/obj/item/weapon/screwdriver)
time = 5
+ category = CAT_AMMO
-/datum/table_recipe/dragonsbreath
+/datum/crafting_recipe/dragonsbreath
name = "Dragonsbreath Shell"
result = /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
/datum/reagent/phosphorus = 5,)
tools = list(/obj/item/weapon/screwdriver)
time = 5
+ category = CAT_AMMO
-/datum/table_recipe/frag12
+/datum/crafting_recipe/frag12
name = "FRAG-12 Shell"
result = /obj/item/ammo_casing/shotgun/frag12
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
@@ -132,8 +144,9 @@
/datum/reagent/facid = 5,)
tools = list(/obj/item/weapon/screwdriver)
time = 5
+ category = CAT_AMMO
-/datum/table_recipe/ionslug
+/datum/crafting_recipe/ionslug
name = "Ion Scatter Shell"
result = /obj/item/ammo_casing/shotgun/ion
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
@@ -141,8 +154,9 @@
/obj/item/weapon/stock_parts/subspace/crystal = 1)
tools = list(/obj/item/weapon/screwdriver)
time = 5
+ category = CAT_AMMO
-/datum/table_recipe/improvisedslug
+/datum/crafting_recipe/improvisedslug
name = "Improvised Shotgun Shell"
result = /obj/item/ammo_casing/shotgun/improvised
reqs = list(/obj/item/weapon/grenade/chem_grenade = 1,
@@ -151,16 +165,18 @@
/datum/reagent/fuel = 10)
tools = list(/obj/item/weapon/screwdriver)
time = 5
+ category = CAT_AMMO
-/datum/table_recipe/improvisedslugoverload
+/datum/crafting_recipe/improvisedslugoverload
name = "Overload Improvised Shell"
result = /obj/item/ammo_casing/shotgun/improvised/overload
reqs = list(/obj/item/ammo_casing/shotgun/improvised = 1,
/datum/reagent/blackpowder = 5)
tools = list(/obj/item/weapon/screwdriver)
time = 5
+ category = CAT_AMMO
-/datum/table_recipe/laserslug
+/datum/crafting_recipe/laserslug
name = "Laser Slug Shell"
result = /obj/item/ammo_casing/shotgun/laserslug
reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
@@ -168,8 +184,9 @@
/obj/item/weapon/stock_parts/micro_laser/high = 1)
tools = list(/obj/item/weapon/screwdriver)
time = 5
+ category = CAT_AMMO
-/datum/table_recipe/ishotgun
+/datum/crafting_recipe/ishotgun
name = "Improvised Shotgun"
result = /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised
reqs = list(/obj/item/weaponcrafting/receiver = 1,
@@ -178,8 +195,9 @@
/obj/item/stack/packageWrap = 5,)
tools = list(/obj/item/weapon/screwdriver)
time = 200
+ category = CAT_WEAPON
-/datum/table_recipe/spooky_camera
+/datum/crafting_recipe/spooky_camera
name = "Camera Obscura"
result = /obj/item/device/camera/spooky
time = 15
@@ -187,29 +205,31 @@
/datum/reagent/holywater = 10)
parts = list(/obj/item/device/camera = 1)
-/datum/table_recipe/notreallysoap
+/datum/crafting_recipe/notreallysoap
name = "Homemade Soap"
result = /obj/item/weapon/soap/ducttape
time = 100
reqs = list(/obj/item/stack/tape_roll = 1,
/datum/reagent/liquidgibs = 10)
-/datum/table_recipe/garrote
+/datum/crafting_recipe/garrote
name = "Makeshift Garrote"
result = /obj/item/weapon/twohanded/garrote/improvised
time = 15
reqs = list(/obj/item/stack/sheet/wood = 1,
/obj/item/stack/cable_coil = 5)
tools = list(/obj/item/weapon/kitchen/knife) // Gotta carve the wood into handles
+ category = CAT_WEAPON
-/datum/table_recipe/makeshift_bolt
+/datum/crafting_recipe/makeshift_bolt
name = "Makeshift Bolt"
result = /obj/item/weapon/arrow/rod
time = 15
reqs = list(/obj/item/stack/rods = 1)
tools = list(/obj/item/weapon/weldingtool)
+ category = CAT_AMMO
-/datum/table_recipe/crossbow
+/datum/crafting_recipe/crossbow
name = "Powered Crossbow"
result = /obj/item/weapon/gun/throw/crossbow
time = 300
@@ -219,10 +239,11 @@
/obj/item/stack/sheet/wood = 5)
tools = list(/obj/item/weapon/weldingtool,
/obj/item/weapon/screwdriver)
+ category = CAT_WEAPON
-/datum/table_recipe/glove_balloon
+/datum/crafting_recipe/glove_balloon
name = "Latex Glove Balloon"
result = /obj/item/latexballon
time = 15
reqs = list(/obj/item/clothing/gloves/color/latex = 1,
- /obj/item/stack/cable_coil = 5)
\ No newline at end of file
+ /obj/item/stack/cable_coil = 5)
diff --git a/code/modules/crafting/table.dm b/code/modules/crafting/table.dm
deleted file mode 100644
index 19ea37c3866..00000000000
--- a/code/modules/crafting/table.dm
+++ /dev/null
@@ -1,225 +0,0 @@
-#define TABLECRAFT_MAX_ITEMS 30
-
-/obj/structure/table
- var/list/table_contents = list()
-
-/obj/structure/table/MouseDrop(atom/over)
- if(over != usr)
- return
- interact(usr)
-
-/obj/structure/table/proc/check_contents(datum/table_recipe/R)
- check_table()
- main_loop:
- if(R.fruit)
- for(var/A in R.fruit)
- for(var/B in table_contents)
- if(B == A)
- if(table_contents[B] >= R.fruit[A])
- continue main_loop
- return 0
- for(var/A in R.reqs)
- for(var/B in table_contents)
- if(ispath(B, A))
- if(table_contents[B] >= R.reqs[A])
- continue main_loop
- return 0
- for(var/A in R.chem_catalists)
- if(table_contents[A] < R.chem_catalists[A])
- return 0
- return 1
-
-/obj/structure/table/proc/check_table()
- table_contents = list()
- for(var/obj/item/I in loc)
- if(istype(I, /obj/item/stack))
- var/obj/item/stack/S = I
- table_contents[I.type] += S.amount
- else if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/grown))
- var/obj/item/weapon/reagent_containers/food/snacks/grown/G = I
- if(G.seed && G.seed.kitchen_tag)
- table_contents[G.seed.kitchen_tag] += 1
- else
- if(istype(I, /obj/item/weapon/reagent_containers))
- var/obj/item/weapon/reagent_containers/RC = I
- if(RC.flags & OPENCONTAINER)
- for(var/datum/reagent/A in RC.reagents.reagent_list)
- table_contents[A.type] += A.volume
- table_contents[I.type] += 1
-
-/obj/structure/table/proc/check_tools(mob/user, datum/table_recipe/R)
- if(!R.tools.len)
- return 1
- var/list/possible_tools = list()
- for(var/obj/item/I in user.contents)
- if(istype(I, /obj/item/weapon/storage))
- for(var/obj/item/SI in I.contents)
- possible_tools += SI.type
- else
- possible_tools += I.type
- possible_tools += table_contents
- var/i = R.tools.len
- var/I
- for(var/A in R.tools)
- I = possible_tools.Find(A)
- if(I)
- possible_tools.Cut(I, I+1)
- i--
- else
- break
- return !i
-
-/obj/structure/table/proc/construct_item(mob/user, datum/table_recipe/R)
- check_table()
- if(check_contents(R) && check_tools(user, R))
- if(do_after(user, R.time, target = src))
- if(!check_contents(R) || !check_tools(user, R))
- return 0
- var/atom/movable/I = new R.result (loc)
- var/list/parts = del_reqs(R, I)
- for(var/A in parts)
- if(istype(A, /obj/item))
- var/atom/movable/B = A
- B.loc = I
- else
- if(!I.reagents)
- I.reagents = new /datum/reagents()
- I.reagents.reagent_list.Add(A)
- I.CheckParts()
- R.AdjustChems(I)
- return 1
- return 0
-
-/obj/structure/table/proc/del_reqs(datum/table_recipe/R, atom/movable/resultobject)
- var/list/Deletion = list()
- var/amt
- var/reagenttransfer = 0
- if(istype(resultobject,/obj/item/weapon/reagent_containers))
- reagenttransfer = 1
- if(R.fruit)
- for(var/A in R.fruit)
- amt = R.fruit[A]
- fruit_loop: //ha
- for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in loc)
- if(G.seed && G.seed.kitchen_tag && (G.seed.kitchen_tag == A))
- amt--
- G.loc = null //remove it from the table loc so that we don't locate the same fruit every time
- if(reagenttransfer)
- G.reagents.trans_to(resultobject, G.reagents.total_volume)
- qdel(G)
- if(amt <= 0)
- break fruit_loop
- for(var/A in R.reqs)
- amt = R.reqs[A]
- if(ispath(A, /obj/item/stack))
- var/obj/item/stack/S
- stack_loop:
- for(var/B in table_contents)
- if(ispath(B, A))
- while(amt > 0)
- S = locate(B) in loc
- if(S.amount >= amt)
- S.use(amt)
- break stack_loop
- else
- amt -= S.amount
- qdel(S)
- else if(ispath(A, /obj/item))
- var/obj/item/I
- item_loop:
- for(var/B in table_contents)
- if(ispath(B, A))
- while(amt > 0)
- I = locate(B) in loc
- Deletion.Add(I)
- I.loc = null //remove it from the table loc so that we don't locate the same item every time (will be relocated inside the crafted item in construct_item())
- amt--
- if(reagenttransfer && istype(I,/obj/item/weapon/reagent_containers))
- var/obj/item/weapon/reagent_containers/RC = I
- RC.reagents.trans_to(resultobject, RC.reagents.total_volume)
- break item_loop
- else
- var/datum/reagent/RG = new A
- reagent_loop:
- for(var/B in table_contents)
- if(ispath(B, /obj/item/weapon/reagent_containers))
- var/obj/item/RC = locate(B) in loc
- if(RC.reagents.has_reagent(RG.id, amt))
- if(reagenttransfer)
- RC.reagents.trans_id_to(resultobject,RG.id, amt)
- else
- RC.reagents.remove_reagent(RG.id, amt)
- RG.volume = amt
- Deletion.Add(RG)
- break reagent_loop
- else if(RC.reagents.has_reagent(RG.id))
- Deletion.Add(RG)
- RG.volume += RC.reagents.get_reagent_amount(RG.id)
- amt -= RC.reagents.get_reagent_amount(RG.id)
- if(reagenttransfer)
- RC.reagents.trans_id_to(resultobject,RG.id, RG.volume)
- else
- RC.reagents.del_reagent(RG.id)
-
- var/list/partlist = list(R.parts.len)
- for(var/M in R.parts)
- partlist[M] = R.parts[M]
- deletion_loop:
- for(var/B in Deletion)
- for(var/A in R.parts)
- if(istype(B, A))
- if(partlist[A] > 0) //do we still need a part like that?
- partlist[A] -= 1
- continue deletion_loop
- Deletion.Remove(B)
- qdel(B)
-
- return Deletion
-
-/obj/structure/table/interact(mob/user)
- if(user.stat || user.lying || !Adjacent(user))
- return
- check_table()
- if(!table_contents.len)
- return
- user.face_atom(src)
- var/dat = "Crafting menu "
- dat += ""
- if(busy)
- dat += "Crafting in progress...
"
- else
- for(var/datum/table_recipe/R in table_recipes)
- if(check_contents(R))
- dat += "[R.name] "
- dat += ""
-
- var/datum/browser/popup = new(user, "table", "Table", 300, 300)
- popup.set_content(dat)
- popup.open()
- return
-
-/obj/structure/table/Topic(href, href_list)
- if(usr.stat || !Adjacent(usr) || usr.lying)
- return
- if(href_list["make"])
- if(!check_table_space())
- to_chat(usr, "The table is too crowded. ")
- return
- var/datum/table_recipe/TR = locate(href_list["make"])
- busy = 1
- interact(usr)
- if(construct_item(usr, TR))
- to_chat(usr, "[TR.name] constructed. ")
- else
- to_chat(usr, "Construction failed. ")
- busy = 0
- interact(usr)
-
-/obj/structure/table/proc/check_table_space()
- var/Item_amount = 0
- for(var/obj/item/I in loc)
- Item_amount++
- if(Item_amount <= TABLECRAFT_MAX_ITEMS) //is the table crowded?
- return 1
-
- #undef TABLECRAFT_MAX_ITEMS
\ No newline at end of file
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index ab8670b3b05..c7b9b3abdb6 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -10,6 +10,9 @@
////////// Usable Items //////////
//////////////////////////////////
+/obj/item/device/fluff
+ var/used = 0
+
/obj/item/device/fluff/tattoo_gun // Generic tattoo gun, make subtypes for different folks
name = "dispoable tattoo pen"
desc = "A cheap plastic tattoo application pen."
@@ -17,8 +20,7 @@
icon_state = "tatgun"
force = 0
throwforce = 0
- w_class = 1.0
- var/used = 0
+ w_class = 1
var/tattoo_name = "tiger stripe tattoo" // Tat name for visible messages
var/tattoo_icon = "Tiger Body" // body_accessory.dmi, new icons defined in sprite_accessories.dm
var/tattoo_r = 1 // RGB values for the body markings
@@ -84,6 +86,28 @@
..()
update_icon()
+/obj/item/device/fluff/tattoo_gun/elliot_cybernetic_tat
+ desc = "A cheap plastic tattoo application pen. This one seems heavily used."
+ tattoo_name = "circuitry tattoo"
+ tattoo_icon = "Elliot Circuit Tattoo"
+ tattoo_r = 48
+ tattoo_g = 138
+ tattoo_b = 176
+
+/obj/item/device/fluff/tattoo_gun/elliot_cybernetic_tat/attack_self(mob/user as mob)
+ if(!used)
+ var/ink_color = input("Please select an ink color.", "Tattoo Ink Color", rgb(tattoo_r, tattoo_g, tattoo_b)) as color|null
+ if(ink_color && !(user.incapacitated() || used) )
+ tattoo_r = hex2num(copytext(ink_color, 2, 4))
+ tattoo_g = hex2num(copytext(ink_color, 4, 6))
+ tattoo_b = hex2num(copytext(ink_color, 6, 8))
+
+ to_chat(user, "You change the color setting on the [src]. ")
+
+ update_icon()
+
+ else
+ to_chat(user, "The [src] is out of ink! ")
/obj/item/weapon/claymore/fluff // MrBarrelrolll: Maximus Greenwood
name = "Greenwood's Blade"
@@ -92,7 +116,7 @@
sharp = 0
edge = 0
-/obj/item/weapon/claymore/fluff/IsShield()
+/obj/item/weapon/claymore/fluff/hit_reaction()
return 0
/obj/item/weapon/crowbar/fluff/zelda_creedy_1 // Zomgponies: Griffin Rowley
@@ -171,6 +195,82 @@
icon_state = "jello_guitar"
item_state = "jello_guitar"
+/obj/item/fluff/wingler_comb
+ name = "blue comb"
+ desc = "A blue comb, it looks like it was made to groom a Tajaran's fur."
+ icon = 'icons/obj/custom_items.dmi'
+ icon_state = "wingler_comb"
+ attack_verb = list("combed")
+ hitsound = 'sound/weapons/tap.ogg'
+ force = 0
+ throwforce = 0
+ w_class = 2
+ var/used = 0
+
+/obj/item/fluff/wingler_comb/attack_self(mob/user)
+ if(used)
+ return
+
+ var/mob/living/carbon/human/target = user
+ if(!istype(target) || target.get_species() != "Tajaran") // Only catbeasts, kthnx.
+ return
+
+ if(target.change_body_accessory("Jay Wingler Tail"))
+ to_chat(target, "You comb your tail with the [src]. ")
+ used = 1
+
+#define USED_MOD_HELM 1
+#define USED_MOD_SUIT 2
+
+/obj/item/device/fluff/shadey_plasman_modkit
+ name = "plasmaman suit modkit"
+ desc = "A kit containing nanites that are able to modify the look of a plasmaman suit and helmet without exposing the wearer to hostile environments."
+ icon_state = "modkit"
+ w_class = 2
+ force = 0
+ throwforce = 0
+
+/obj/item/device/fluff/shadey_plasman_modkit/afterattack(atom/target, mob/user, proximity)
+ if(!proximity || !ishuman(user) || user.lying)
+ return
+ var/mob/living/carbon/human/H = user
+
+ if(istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman))
+ if(used & USED_MOD_HELM)
+ to_chat(H, "The kit's helmet modifier has already been used. ")
+ return
+ to_chat(H, "You modify the appearance of [target]. ")
+ used |= USED_MOD_HELM
+
+ var/obj/item/clothing/head/helmet/space/eva/plasmaman/P = target
+ P.name = "plasma containment helmet"
+ P.desc = "A purpose-built containment helmet designed to keep plasma in, and everything else out."
+ P.icon_state = "plasmaman_halo_helmet[P.on]"
+ P.base_state = "plasmaman_halo_helmet"
+
+ if(P == H.head)
+ H.update_inv_head()
+ return
+ if(istype(target, /obj/item/clothing/suit/space/eva/plasmaman))
+ if(used & USED_MOD_SUIT)
+ to_chat(user, "The kit's suit modifier has already been used. ")
+ return
+ to_chat(H, "You modify the appearance of [target]. ")
+ used |= USED_MOD_SUIT
+
+ var/obj/item/clothing/suit/space/eva/plasmaman/P = target
+ P.name = "plasma containment suit"
+ P.desc = "A feminine containment suit designed to keep plasma in, and everything else out. It's even got an overskirt."
+ P.icon_state = "plasmaman_halo"
+
+ if(P == H.wear_suit)
+ H.update_inv_wear_suit()
+ return
+ to_chat(user, "You can't modify [target]! ")
+
+#undef USED_MOD_HELM
+#undef USED_MOD_SUIT
+
//////////////////////////////////
//////////// Clothing ////////////
//////////////////////////////////
@@ -212,6 +312,8 @@
desc = "A labcoat with a few markings denoting it as the labcoat of roboticist."
icon = 'icons/obj/custom_items.dmi'
icon_state = "aeneasrinil_open"
+ species_fit = null
+ sprite_sheets = null
/obj/item/clothing/suit/jacket/fluff/kidosvest // Anxipal: Kido Qasteth
name = "Kido's Vest"
@@ -220,8 +322,10 @@
icon_state = "kidosvest"
item_state = "kidosvest"
ignore_suitadjust = 1
- action_button_name = null
+ actions_types = list()
adjust_flavour = null
+ species_fit = null
+ sprite_sheets = null
/obj/item/clothing/suit/fluff/kluys // Kluys: Cripty Pandaen
name = "Nano Fibre Jacket"
@@ -259,6 +363,8 @@
desc = "A suit that protects against minor chemical spills. Has a red stripe on the shoulders and rolled up sleeves."
icon = 'icons/obj/custom_items.dmi'
icon_state = "labcoat_red_open"
+ species_fit = null
+ sprite_sheets = null
/obj/item/clothing/suit/fluff/stobarico_greatcoat // Stobarico: F.U.R.R.Y
name = "\improper F.U.R.R.Y's Nanotrasen Greatcoat"
@@ -331,8 +437,10 @@
icon_state = "fox_jacket"
item_state = "fox_jacket"
ignore_suitadjust = 1
- action_button_name = null
+ actions_types = list()
adjust_flavour = null
+ species_fit = null
+ sprite_sheets = null
/obj/item/clothing/under/fluff/fox
name = "Aeronautics Jumpsuit"
@@ -381,28 +489,27 @@
icon_state = "chronx_hood"
item_state = "chronx_hood"
flags = HEADCOVERSEYES | BLOCKHAIR
- action_button_name = "Transform Hood"
+ actions_types = list(/datum/action/item_action/toggle)
var/adjusted = 0
/obj/item/clothing/head/fluff/chronx/ui_action_click()
adjust()
-/obj/item/clothing/head/fluff/chronx/verb/adjust()
- set name = "Transform Hood"
- set category = "Object"
- set src in usr
- if(isliving(usr) && !usr.incapacitated())
- if(adjusted)
- icon_state = initial(icon_state)
- item_state = initial(item_state)
- to_chat(usr, "You untransform \the [src].")
- adjusted = 0
- else
- icon_state += "_open"
- item_state += "_open"
- to_chat(usr, "You transform \the [src].")
- adjusted = 1
- usr.update_inv_head()
+/obj/item/clothing/head/fluff/chronx/proc/adjust()
+ if(adjusted)
+ icon_state = initial(icon_state)
+ item_state = initial(item_state)
+ to_chat(usr, "You untransform \the [src].")
+ adjusted = 0
+ else
+ icon_state += "_open"
+ item_state += "_open"
+ to_chat(usr, "You transform \the [src].")
+ adjusted = 1
+ usr.update_inv_head()
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
/obj/item/clothing/suit/chaplain_hoodie/fluff/chronx //chronx100: Hughe O'Splash
name = "Cthulhu's Robes"
@@ -410,23 +517,11 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "chronx_robe"
item_state = "chronx_robe"
- flags = ONESIZEFITSALL
- action_button_name = "Transform Robes"
+ flags_size = ONESIZEFITSALL
+ actions_types = list(/datum/action/item_action/toggle)
adjust_flavour = "untransform"
ignore_suitadjust = 0
-/obj/item/clothing/suit/chaplain_hoodie/fluff/chronx/New()
- ..()
- verbs -= /obj/item/clothing/suit/verb/openjacket
-
-/obj/item/clothing/suit/chaplain_hoodie/fluff/chronx/verb/adjust()
- set name = "Transform Robes"
- set category = "Object"
- set src in usr
- if(!istype(usr, /mob/living))
- return
- adjustsuit(usr)
-
/obj/item/clothing/shoes/black/fluff/chronx //chronx100: Hughe O'Splash
name = "Cthulhu's Boots"
desc = "Boots worn by the worshipers of Cthulhu. You see a name inscribed in blood on the inside: Hughe O'Splash"
@@ -440,6 +535,8 @@
icon = 'icons/obj/clothing/ties.dmi'
icon_state = "vest_black"
item_state = "vest_black"
+ species_fit = null
+ sprite_sheets = null
/obj/item/clothing/under/pants/fluff/combat
name = "combat pants"
@@ -455,26 +552,5 @@
item_state = "elliot_windbreaker_open"
adjust_flavour = "unzip"
suit_adjusted = 1
-
-/obj/item/device/fluff/tattoo_gun/elliot_cybernetic_tat
- desc = "A cheap plastic tattoo application pen. This one seems heavily used."
- tattoo_name = "circuitry tattoo"
- tattoo_icon = "Elliot Circuit Tattoo"
- tattoo_r = 48
- tattoo_g = 138
- tattoo_b = 176
-
-/obj/item/device/fluff/tattoo_gun/elliot_cybernetic_tat/attack_self(mob/user as mob)
- if(!used)
- var/ink_color = input("Please select an ink color.", "Tattoo Ink Color", rgb(tattoo_r, tattoo_g, tattoo_b)) as color|null
- if(ink_color && !(user.incapacitated() || used) )
- tattoo_r = hex2num(copytext(ink_color, 2, 4))
- tattoo_g = hex2num(copytext(ink_color, 4, 6))
- tattoo_b = hex2num(copytext(ink_color, 6, 8))
-
- to_chat(user, "You change the color setting on the [src]. ")
-
- update_icon()
-
- else
- to_chat(user, "The [src] is out of ink! ")
\ No newline at end of file
+ species_fit = null
+ sprite_sheets = null
diff --git a/code/modules/customitems/item_spawning.dm b/code/modules/customitems/item_spawning.dm
index d0b350b9b1e..345bf6e164e 100644
--- a/code/modules/customitems/item_spawning.dm
+++ b/code/modules/customitems/item_spawning.dm
@@ -48,7 +48,7 @@
to_chat(M, "Your [Item.name] has been added to your [M.back.name]. ")
if(ok == 0)
for(var/obj/item/weapon/storage/S in M.contents) // Try to place it in any item that can store stuff, on the mob.
- if (S.contents.len < S.storage_slots)
+ if(S.contents.len < S.storage_slots)
Item.loc = S
ok = 1
to_chat(M, "Your [Item.name] has been added to your [S.name]. ")
@@ -58,7 +58,7 @@
if(newname)
Item.name = newname
- if (ok == 0) // Finally, since everything else failed, place it on the ground
+ if(ok == 0) // Finally, since everything else failed, place it on the ground
Item.loc = get_turf(M.loc)
HackProperties(Item,propadjust)
diff --git a/code/modules/detective_work/evidence.dm b/code/modules/detective_work/evidence.dm
index 4654e0ab665..6f62a7eecac 100644
--- a/code/modules/detective_work/evidence.dm
+++ b/code/modules/detective_work/evidence.dm
@@ -21,6 +21,10 @@
if(!istype(I) || I.anchored == 1)
return
+ if(istype(I, /obj/item/weapon/storage/box))
+ to_chat(user, "This box is too big to fit in the evidence bag. ")
+ return
+
if(istype(I, /obj/item/weapon/evidencebag))
to_chat(user, "You find putting an evidence bag in another evidence bag to be slightly absurd. ")
return 1 //now this is podracing
diff --git a/code/modules/detective_work/scanner.dm b/code/modules/detective_work/scanner.dm
index e959df37989..58c1c31a3b8 100644
--- a/code/modules/detective_work/scanner.dm
+++ b/code/modules/detective_work/scanner.dm
@@ -7,7 +7,7 @@
desc = "Used to remotely scan objects and biomass for DNA and fingerprints. Can print a report of the findings."
icon = 'icons/goonstation/objects/objects.dmi'
icon_state = "detscanner"
- w_class = 3.0
+ w_class = 3
item_state = "electronic"
flags = CONDUCT | NOBLUDGEON
slot_flags = SLOT_BELT
@@ -18,39 +18,39 @@
/obj/item/device/detective_scanner/attack_self(var/mob/user)
var/search = input(user, "Enter name, fingerprint or blood DNA.", "Find record", "")
- if (!search || user.stat || user.incapacitated())
+ if(!search || user.stat || user.incapacitated())
return
search = lowertext(search)
var/name
- var/fingerprint
- var/dna
+ var/fingerprint = "FINGERPRINT NOT FOUND"
+ var/dna = "BLOOD DNA NOT FOUND"
// I really, really wish I didn't have to split this into two seperate loops. But the datacore is awful.
- for (var/record in data_core.general)
+ for(var/record in data_core.general)
var/datum/data/record/S = record
- if(search == lowertext(S.fields["fingerprint"]) || search == lowertext(S.fields["name"]))
+ if(S && (search == lowertext(S.fields["fingerprint"]) || search == lowertext(S.fields["name"])))
name = S.fields["name"]
fingerprint = S.fields["fingerprint"]
continue
- for (var/record in data_core.medical)
+ for(var/record in data_core.medical)
var/datum/data/record/M = record
- if (search == lowertext(M.fields["b_dna"]) || name == M.fields["name"])
+ if(M && ( search == lowertext(M.fields["b_dna"]) || name == M.fields["name"]) )
dna = M.fields["b_dna"]
- if(!fingerprint) // We have searched by DNA, and do not have the relevant information from the security records.
+ if(fingerprint == "FINGERPRINT NOT FOUND") // We have searched by DNA, and do not have the relevant information from the fingerprint records.
name = M.fields["name"]
- for (var/gen_record in data_core.general)
+ for(var/gen_record in data_core.general)
var/datum/data/record/S = gen_record
- if(name == S.fields["name"])
+ if(S && (name == S.fields["name"]))
fingerprint = S.fields["fingerprint"]
continue
continue
- if(name && fingerprint && dna)
+ if(name)
to_chat(user, "Match found in station records: [name] \
Fingerprint: [fingerprint] \
Blood DNA: [dna] ")
@@ -132,7 +132,7 @@
if(ishuman(A))
var/mob/living/carbon/human/H = A
- if (istype(H.dna, /datum/dna) && !H.gloves)
+ if(istype(H.dna, /datum/dna) && !H.gloves)
fingerprints += md5(H.dna.uni_identity)
else if(!ismob(A))
@@ -170,7 +170,7 @@
found_something = 1
// Blood
- if (blood && blood.len)
+ if(blood && blood.len)
sleep(30)
add_log("Blood: ")
found_something = 1
@@ -220,4 +220,4 @@
CRASH("[src] \ref[src] is adding a log when it was never put in scanning mode!")
/proc/get_timestamp()
- return time2text(world.time + 432000, ":ss")
\ No newline at end of file
+ return time2text(world.time + 432000, ":ss")
diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm
index 7448d3da352..5ea69f25c55 100644
--- a/code/modules/economy/ATM.dm
+++ b/code/modules/economy/ATM.dm
@@ -49,7 +49,7 @@ log transactions
if(linked_db && ( (linked_db.stat & NOPOWER) || !linked_db.activated ) )
linked_db = null
authenticated_account = null
- src.visible_message("\red \icon[src] [src] buzzes rudely, \"Connection to remote database lost.\"")
+ src.visible_message("\red [bicon(src)] [src] buzzes rudely, \"Connection to remote database lost.\"")
updateDialog()
if(ticks_left_timeout > 0)
@@ -209,7 +209,9 @@ log transactions
dat += "Unable to connect to accounts database, please retry and if the issue persists contact Nanotrasen IT support. "
reconnect_database()
- user << browse(dat,"window=atm;size=550x650")
+ var/datum/browser/popup = new(user, "atm", name, 550, 650)
+ popup.set_content(dat)
+ popup.open(0)
else
user << browse(null,"window=atm")
@@ -225,7 +227,7 @@ log transactions
var/target_account_number = text2num(href_list["target_acc_number"])
var/transfer_purpose = href_list["purpose"]
if(linked_db.charge_to_account(target_account_number, authenticated_account.owner_name, transfer_purpose, machine_id, transfer_amount))
- to_chat(usr, "\icon[src]Funds transfer successful. ")
+ to_chat(usr, "[bicon(src)]Funds transfer successful. ")
authenticated_account.money -= transfer_amount
//create an entry in the account transaction log
@@ -238,10 +240,10 @@ log transactions
T.amount = "([transfer_amount])"
authenticated_account.transaction_log.Add(T)
else
- to_chat(usr, "\icon[src]Funds transfer failed. ")
+ to_chat(usr, "[bicon(src)]Funds transfer failed. ")
else
- to_chat(usr, "\icon[src]You don't have enough funds to do that! ")
+ to_chat(usr, "[bicon(src)]You don't have enough funds to do that! ")
if("view_screen")
view_screen = text2num(href_list["view_screen"])
if("change_security_level")
@@ -275,11 +277,11 @@ log transactions
T.time = worldtime2text()
failed_account.transaction_log.Add(T)
else
- to_chat(usr, "\red \icon[src] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.")
+ to_chat(usr, "\red [bicon(src)] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.")
previous_account_number = tried_account_num
playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1)
else
- to_chat(usr, "\red \icon[src] incorrect pin/account combination entered.")
+ to_chat(usr, "\red [bicon(src)] incorrect pin/account combination entered.")
number_incorrect_tries = 0
else
playsound(src, 'sound/machines/twobeep.ogg', 50, 1)
@@ -295,7 +297,7 @@ log transactions
T.time = worldtime2text()
authenticated_account.transaction_log.Add(T)
- to_chat(usr, "\blue \icon[src] Access granted. Welcome user '[authenticated_account.owner_name].'")
+ to_chat(usr, "\blue [bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'")
previous_account_number = tried_account_num
if("withdrawal")
@@ -323,7 +325,7 @@ log transactions
T.time = worldtime2text()
authenticated_account.transaction_log.Add(T)
else
- to_chat(usr, "\icon[src]You don't have enough funds to do that! ")
+ to_chat(usr, "[bicon(src)]You don't have enough funds to do that! ")
if("balance_statement")
if(authenticated_account)
if(world.timeofday < lastprint + PRINT_DELAY)
@@ -364,7 +366,7 @@ log transactions
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.loc = src
held_card = I
@@ -391,7 +393,7 @@ log transactions
if(I)
authenticated_account = attempt_account_access(I.associated_account_number)
if(authenticated_account)
- to_chat(human_user, "\blue \icon[src] Access granted. Welcome user '[authenticated_account.owner_name].'")
+ to_chat(human_user, "\blue [bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'")
//create a transaction log entry
var/datum/transaction/T = new()
diff --git a/code/modules/economy/Accounts.dm b/code/modules/economy/Accounts.dm
index 844c5ca8bbf..9fac3da39d0 100644
--- a/code/modules/economy/Accounts.dm
+++ b/code/modules/economy/Accounts.dm
@@ -318,7 +318,7 @@ var/global/list/all_money_accounts = list()
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = I
usr.drop_item()
C.loc = src
diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm
index b5cb77880f6..1293d92b2b3 100644
--- a/code/modules/economy/Accounts_DB.dm
+++ b/code/modules/economy/Accounts_DB.dm
@@ -18,7 +18,7 @@
/obj/machinery/computer/account_database/proc/get_access_level(var/mob/user)
if(user.can_admin_interact())
return 2
- if (!held_card)
+ if(!held_card)
return 0
if(access_cent_commander in held_card.access)
return 2
@@ -91,14 +91,14 @@
data["transactions"] = null
data["accounts"] = null
- if (detailed_account_view)
+ if(detailed_account_view)
data["account_number"] = detailed_account_view.account_number
data["owner_name"] = detailed_account_view.owner_name
data["money"] = detailed_account_view.money
data["suspended"] = detailed_account_view.suspended
var/list/trx[0]
- for (var/datum/transaction/T in detailed_account_view.transaction_log)
+ for(var/datum/transaction/T in detailed_account_view.transaction_log)
trx.Add(list(list(\
"date" = T.date, \
"time" = T.time, \
@@ -107,7 +107,7 @@
"amount" = T.amount, \
"source_terminal" = T.source_terminal)))
- if (trx.len > 0)
+ if(trx.len > 0)
data["transactions"] = trx
var/list/accounts[0]
@@ -119,11 +119,11 @@
"suspended"=D.suspended ? "SUSPENDED" : "",\
"account_index"=i)))
- if (accounts.len > 0)
+ if(accounts.len > 0)
data["accounts"] = accounts
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "accounts_terminal.tmpl", src.name, 400, 640)
ui.set_initial_data(data)
ui.open()
@@ -142,7 +142,7 @@
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = I
usr.drop_item()
C.forceMove(src)
@@ -220,7 +220,7 @@
var/text
playsound(loc, "sound/goonstation/machines/printer_thermal.ogg", 50, 1)
var/obj/item/weapon/paper/P = new(loc)
- if (detailed_account_view)
+ if(detailed_account_view)
P.name = "account #[detailed_account_view.account_number] details"
var/title = "Account #[detailed_account_view.account_number] Details"
text = {"
@@ -242,7 +242,7 @@
"}
- for (var/datum/transaction/T in detailed_account_view.transaction_log)
+ for(var/datum/transaction/T in detailed_account_view.transaction_log)
text += {"
[T.date] [T.time]
diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm
index a9fe34e1e46..275456e0d4f 100644
--- a/code/modules/economy/EFTPOS.dm
+++ b/code/modules/economy/EFTPOS.dm
@@ -111,9 +111,9 @@
var/obj/item/weapon/card/I = O
scan_card(I)
else
- to_chat(usr, "\icon[src]Unable to connect to linked account. ")
+ to_chat(usr, "[bicon(src)]Unable to connect to linked account. ")
else
- to_chat(usr, "\icon[src]Unable to connect to accounts database. ")
+ to_chat(usr, "[bicon(src)]Unable to connect to accounts database. ")
else
..()
@@ -130,7 +130,7 @@
alert("That is not a valid code!")
print_reference()
else
- to_chat(usr, "\icon[src]Incorrect code entered. ")
+ to_chat(usr, "[bicon(src)]Incorrect code entered. ")
if("change_id")
var/attempt_code = text2num(input("Re-enter the current EFTPOS access code", "Confirm EFTPOS code"))
if(attempt_code == access_code)
@@ -139,7 +139,7 @@
eftpos_name = name + " EFTPOS scanner"
print_reference()
else
- to_chat(usr, "\icon[src]Incorrect code entered. ")
+ to_chat(usr, "[bicon(src)]Incorrect code entered. ")
if("link_account")
if(!linked_db)
reconnect_database()
@@ -148,7 +148,7 @@
var/attempt_pin = input("Enter pin code", "Account pin") as num
linked_account = attempt_account_access(attempt_account_num, attempt_pin, 1)
else
- to_chat(usr, "\icon[src]Unable to connect to accounts database. ")
+ to_chat(usr, "[bicon(src)]Unable to connect to accounts database. ")
if("trans_purpose")
var/purpose = input("Enter reason for EFTPOS transaction", "Transaction purpose") as text|null
if(purpose)
@@ -168,33 +168,33 @@
else if(linked_account)
transaction_locked = 1
else
- to_chat(usr, "\icon[src] No account connected to send transactions to. ")
+ to_chat(usr, "[bicon(src)] No account connected to send transactions to. ")
if("scan_card")
//attempt to connect to a new db, and if that doesn't work then fail
if(!linked_db)
reconnect_database()
if(linked_db && linked_account)
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card))
+ if(istype(I, /obj/item/weapon/card))
scan_card(I)
else
- to_chat(usr, "\icon[src]Unable to link accounts. ")
+ to_chat(usr, "[bicon(src)]Unable to link accounts. ")
if("reset")
//reset the access code - requires HoP/captain access
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card))
+ if(istype(I, /obj/item/weapon/card))
var/obj/item/weapon/card/id/C = I
if(access_cent_commander in C.access || access_hop in C.access || access_captain in C.access)
access_code = 0
- to_chat(usr, "\icon[src]Access code reset to 0. ")
- else if (istype(I, /obj/item/weapon/card/emag))
+ to_chat(usr, "[bicon(src)]Access code reset to 0. ")
+ else if(istype(I, /obj/item/weapon/card/emag))
access_code = 0
- to_chat(usr, "\icon[src]Access code reset to 0. ")
+ to_chat(usr, "[bicon(src)]Access code reset to 0. ")
src.attack_self(usr)
/obj/item/device/eftpos/proc/scan_card(var/obj/item/weapon/card/I)
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = I
visible_message("[usr] swipes a card through [src]. ")
if(transaction_locked && !transaction_paid)
@@ -204,7 +204,7 @@
if(D)
if(transaction_amount <= D.money)
playsound(src, 'sound/machines/chime.ogg', 50, 1)
- src.visible_message("\icon[src] The [src] chimes.")
+ src.visible_message("[bicon(src)] The [src] chimes.")
transaction_paid = 1
//transfer the money
@@ -233,11 +233,11 @@
T.time = worldtime2text()
linked_account.transaction_log.Add(T)
else
- to_chat(usr, "\icon[src]You don't have that much money! ")
+ to_chat(usr, "[bicon(src)]You don't have that much money! ")
else
- to_chat(usr, "\icon[src]Unable to access account. Check security settings and try again. ")
+ to_chat(usr, "[bicon(src)]Unable to access account. Check security settings and try again. ")
else
- to_chat(usr, "\icon[src]EFTPOS is not connected to an account. ")
+ to_chat(usr, "[bicon(src)]EFTPOS is not connected to an account. ")
else
..()
diff --git a/code/modules/economy/POS.dm b/code/modules/economy/POS.dm
index 79e506ddee9..cbdcb0070fb 100644
--- a/code/modules/economy/POS.dm
+++ b/code/modules/economy/POS.dm
@@ -391,7 +391,7 @@ var/const/POS_HEADER = {"
return
/obj/machinery/pos/proc/say(var/text)
- src.visible_message("\icon[src] [name] states, \"[text]\" ")
+ src.visible_message("[bicon(src)] [name] states, \"[text]\" ")
/obj/machinery/pos/Topic(var/href, var/list/href_list)
if(..(href,href_list)) return
diff --git a/code/modules/economy/utils.dm b/code/modules/economy/utils.dm
index 5ef9a033b6d..4fc67aa6c78 100644
--- a/code/modules/economy/utils.dm
+++ b/code/modules/economy/utils.dm
@@ -16,7 +16,7 @@
/obj/proc/get_card_account(var/obj/item/weapon/card/I, var/mob/user=null, var/terminal_name="", var/transaction_purpose="", var/require_pin=0)
if(terminal_name=="")
terminal_name=src.name
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = I
var/attempt_pin=0
var/datum/money_account/D = get_money_account(C.associated_account_number)
diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm
index 1ab10bc8e4f..430ac0fccb1 100644
--- a/code/modules/error_handler/error_handler.dm
+++ b/code/modules/error_handler/error_handler.dm
@@ -102,3 +102,17 @@ var/total_runtimes_skipped = 0
error_cache.logError(e, desclines, e_src = e_src)
#endif
+
+/proc/log_runtime(exception/e, datum/e_src, extra_info)
+ if(!istype(e))
+ world.Error(e, e_src)
+ return
+
+ if(extra_info)
+ // Adding extra info adds two newlines, because parsing runtimes is funky
+ if(islist(extra_info))
+ e.desc = " [jointext(extra_info, "\n ")]\n\n" + e.desc
+ else
+ e.desc = " [extra_info]\n\n" + e.desc
+
+ world.Error(e, e_src)
diff --git a/code/modules/error_handler/error_viewer.dm b/code/modules/error_handler/error_viewer.dm
index 1b8bd092ee2..9bbab68b637 100644
--- a/code/modules/error_handler/error_viewer.dm
+++ b/code/modules/error_handler/error_viewer.dm
@@ -112,7 +112,8 @@ var/global/datum/ErrorViewer/ErrorCache/error_cache = null
// Show the error to admins with debug messages turned on, but only if one
// from the same source hasn't been shown too recently
- if(error_source.next_message_at <= world.time)
+ // (Also, make sure config is initialized, or log_debug will runtime)
+ if(config && error_source.next_message_at <= world.time)
var/const/viewtext = "\[view]" // Nesting these in other brackets went poorly
log_debug("Runtime in [e.file],[e.line]: [html_encode(e.name)] [error_entry.makeLink(viewtext)]")
error_source.next_message_at = world.time + ERROR_MSG_DELAY
diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm
index 82a4da4cc15..13d7478aab3 100644
--- a/code/modules/events/anomaly_bluespace.dm
+++ b/code/modules/events/anomaly_bluespace.dm
@@ -42,7 +42,7 @@
var/y_distance = TO.y - FROM.y
var/x_distance = TO.x - FROM.x
- for (var/atom/movable/A in range(12, FROM )) // iterate thru list of mobs in the area
+ for(var/atom/movable/A in range(12, FROM )) // iterate thru list of mobs in the area
if(istype(A, /obj/item/device/radio/beacon)) continue // don't teleport beacons because that's just insanely stupid
if(A.anchored) continue
diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm
index a4f620fccdf..13b5c884131 100644
--- a/code/modules/events/carp_migration.dm
+++ b/code/modules/events/carp_migration.dm
@@ -34,9 +34,9 @@
num_groups = min(num_groups, spawn_locations.len)
var/i = 1
- while (i <= num_groups)
+ while(i <= num_groups)
var/group_size = rand(group_size_min, group_size_max)
- for (var/j = 1, j <= group_size, j++)
+ for(var/j = 1, j <= group_size, j++)
var/carptype = /mob/living/simple_animal/hostile/carp
if(prob(5))
carptype = /mob/living/simple_animal/hostile/carp/megacarp
diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm
index b7f1fb660c8..20f7f9955eb 100644
--- a/code/modules/events/dust.dm
+++ b/code/modules/events/dust.dm
@@ -73,7 +73,7 @@
for(var/mob/M in range(10, src))
if(!M.stat && !istype(M, /mob/living/silicon/ai))
shake_camera(M, 3, 1)
- if (A)
+ if(A)
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
if(ismob(A))
diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm
index 85ffa86f25f..00b7f76fc3e 100644
--- a/code/modules/events/event_manager.dm
+++ b/code/modules/events/event_manager.dm
@@ -337,18 +337,18 @@
var/list/event_areas = list()
- for (var/areapath in the_station_areas)
+ for(var/areapath in the_station_areas)
event_areas += typesof(areapath)
- for (var/areapath in safe_areas)
+ for(var/areapath in safe_areas)
event_areas -= typesof(areapath)
- for (var/areapath in danger_areas)
+ for(var/areapath in danger_areas)
event_areas += typesof(areapath)
- while (event_areas.len > 0)
+ while(event_areas.len > 0)
var/list/event_turfs = null
candidate = locate(pick_n_take(event_areas))
event_turfs = get_area_turfs(candidate)
- if (event_turfs.len > 0)
+ if(event_turfs.len > 0)
break
return candidate
diff --git a/code/modules/events/holidays/Holidays.dm b/code/modules/events/holidays/Holidays.dm
index e06c7764a39..8b219e77d8a 100644
--- a/code/modules/events/holidays/Holidays.dm
+++ b/code/modules/events/holidays/Holidays.dm
@@ -2,7 +2,7 @@
var/global/Holiday = null
//Just thinking ahead! Here's the foundations to a more robust Holiday event system.
-//It's easy as hell to add stuff. Just set Holiday to something using the switch (or something else)
+//It's easy as hell to add stuff. Just set Holiday to something using the switch(or something else)
//then use if(Holiday == "MyHoliday") to make stuff happen on that specific day only
//Please, Don't spam stuff up with easter eggs, I'd rather somebody just delete this than people cause
//the game to lag even more in the name of one-day content.
diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm
index eb2007944dd..3012b0f9535 100644
--- a/code/modules/events/immovable_rod.dm
+++ b/code/modules/events/immovable_rod.dm
@@ -54,11 +54,11 @@ In my current plan for it, 'solid' will be defined as anything with density == 1
x = clong.x
y = clong.y
- if (istype(clong, /turf) || istype(clong, /obj))
+ if(istype(clong, /turf) || istype(clong, /obj))
if(clong.density)
clong.ex_act(2)
- else if (istype(clong, /mob))
+ else if(istype(clong, /mob))
if(istype(clong, /mob/living/carbon/human))
var/mob/living/carbon/human/H = clong
H.visible_message("[H.name] is penetrated by an immovable rod! " , "The rod penetrates you! " , "You hear a CLANG! ")
diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm
index bba7949a600..20a53a4413f 100644
--- a/code/modules/events/ion_storm.dm
+++ b/code/modules/events/ion_storm.dm
@@ -492,7 +492,7 @@
/proc/generate_static_ion_law()
/var/list/players = list()
- for (var/mob/living/carbon/human/player in player_list)
+ for(var/mob/living/carbon/human/player in player_list)
if( !player.mind || player.mind.assigned_role == "MODE" || player.client.inactivity > MinutesToTicks(10))
continue
players += player.real_name
diff --git a/code/modules/events/meaty_ores.dm b/code/modules/events/meaty_ores.dm
index d13a1b9ad34..df56749734e 100644
--- a/code/modules/events/meaty_ores.dm
+++ b/code/modules/events/meaty_ores.dm
@@ -26,7 +26,7 @@
for(var/mob/M in range(10, src))
if(!M.stat && !istype(M, /mob/living/silicon/ai))
shake_camera(M, 3, 1)
- if (A)
+ if(A)
playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
walk(src,0)
invisibility = 101
diff --git a/code/modules/events/money_spam.dm b/code/modules/events/money_spam.dm
index 94f27958b9b..061a1c9efa7 100644
--- a/code/modules/events/money_spam.dm
+++ b/code/modules/events/money_spam.dm
@@ -9,7 +9,7 @@
/datum/event/pda_spam/proc/pick_message_server()
if(message_servers)
- for (var/obj/machinery/message_server/MS in message_servers)
+ for(var/obj/machinery/message_server/MS in message_servers)
if(MS.active)
useMS = MS
break
@@ -31,7 +31,7 @@
for(var/obj/item/device/pda/check_pda in PDAs)
var/datum/data/pda/app/messenger/check_m = check_pda.find_program(/datum/data/pda/app/messenger)
- if (!check_m || !check_m.can_receive())
+ if(!check_m || !check_m.can_receive())
continue
viables.Add(check_pda)
@@ -92,12 +92,12 @@
"You have won tickets to the newest romantic comedy 16 RULES OF LOVE!",\
"You have won tickets to the newest thriller THE CULT OF THE SLEEPING ONE!")
- if (useMS.send_pda_message("[P.owner]", sender, message)) //Message been filtered by spam filter.
+ if(useMS.send_pda_message("[P.owner]", sender, message)) //Message been filtered by spam filter.
return
last_spam_time = world.time
- if (prob(50)) //Give the AI an increased chance to intercept the message
+ if(prob(50)) //Give the AI an increased chance to intercept the message
for(var/mob/living/silicon/ai/ai in mob_list)
// Allows other AIs to intercept the message but the AI won't intercept their own message.
if(ai.aiPDA != P && ai.aiPDA != src)
diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm
index f798e9984d4..5afddd49d23 100644
--- a/code/modules/events/radiation_storm.dm
+++ b/code/modules/events/radiation_storm.dm
@@ -49,7 +49,7 @@
H.apply_effect((rand(15,35)),IRRADIATE,0)
if(prob(5))
H.apply_effect((rand(40,70)),IRRADIATE,0)
- if (prob(75))
+ if(prob(75))
randmutb(H) // Applies bad mutation
domutcheck(H,null,1)
else
diff --git a/code/modules/examine/examine.dm b/code/modules/examine/examine.dm
index c4d54a44ab6..0956877d202 100644
--- a/code/modules/examine/examine.dm
+++ b/code/modules/examine/examine.dm
@@ -46,7 +46,7 @@
description_holders["antag"] = (update_antag_info)? A.get_description_antag() : ""
description_holders["name"] = "[A.name]"
- description_holders["icon"] = "\icon[A]"
+ description_holders["icon"] = "[bicon(A)]"
description_holders["desc"] = A.desc
/client/Stat()
diff --git a/code/modules/fish/fish_eggs.dm b/code/modules/fish/fish_eggs.dm
index e4283718a53..493f3dcf1db 100644
--- a/code/modules/fish/fish_eggs.dm
+++ b/code/modules/fish/fish_eggs.dm
@@ -4,7 +4,7 @@
desc = "Eggs laid by a fish. This cluster seems... empty?"
icon = 'icons/obj/fish_items.dmi'
icon_state = "eggs"
- w_class = 2.0
+ w_class = 2
var/fish_type = null //Holds the name of the fish that the egg is for
/obj/item/fish_eggs/New()
diff --git a/code/modules/fish/fish_items.dm b/code/modules/fish/fish_items.dm
index 00659104480..0266f06df90 100644
--- a/code/modules/fish/fish_items.dm
+++ b/code/modules/fish/fish_items.dm
@@ -23,7 +23,7 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi
icon_state = "egg_scoop"
slot_flags = SLOT_BELT
throwforce = 0
- w_class = 2.0
+ w_class = 2
throw_speed = 3
throw_range = 7
@@ -34,7 +34,7 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi
icon_state = "net"
slot_flags = SLOT_BELT
throwforce = 0
- w_class = 2.0
+ w_class = 2
throw_speed = 3
throw_range = 7
@@ -48,7 +48,7 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi
icon = 'icons/obj/fish_items.dmi'
icon_state = "fish_food"
throwforce = 1
- w_class = 2.0
+ w_class = 2
throw_speed = 3
throw_range = 7
@@ -59,7 +59,7 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi
icon_state = "brush"
slot_flags = SLOT_BELT
throwforce = 0
- w_class = 2.0
+ w_class = 2
throw_speed = 3
throw_range = 7
attack_verb = list("scrubbed", "brushed", "scraped")
@@ -103,7 +103,7 @@ var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfi
icon = 'icons/obj/fish_items.dmi'
icon_state = "fish"
throwforce = 1
- w_class = 2.0
+ w_class = 2
throw_speed = 3
throw_range = 7
force = 1
diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm
index 6da71b3adb2..005fce56df0 100644
--- a/code/modules/fish/fishtank.dm
+++ b/code/modules/fish/fishtank.dm
@@ -415,7 +415,7 @@
examine_message += "\The [src] is about three-quarters filled. "
else if(water_level < water_capacity)
examine_message += "\The [src] is nearly full! "
- else if (water_level == water_capacity)
+ else if(water_level == water_capacity)
examine_message += "\The [src] is full! "
examine_message += " Cleanliness level: "
@@ -558,7 +558,7 @@
/obj/machinery/fishtank/attack_slime(mob/living/user as mob)
var/mob/living/carbon/slime/S = user
- if (!S.is_adult)
+ if(!S.is_adult)
return
attack_generic(user, rand(10, 15))
@@ -567,7 +567,7 @@
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!"))
user.visible_message("[user] smashes through [src]! ")
destroy()
- else if (usr.a_intent == I_HARM)
+ else if(usr.a_intent == I_HARM)
user.changeNext_move(CLICK_CD_MELEE)
playsound(get_turf(src), 'sound/effects/glassknock.ogg', 80, 1)
usr.visible_message("[usr.name] bangs against the [src.name]! ", \
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 6229105a8b3..81038eaf463 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -295,29 +295,29 @@ Gunshots/explosions/opening doors/less rare audio (done)
switch(rand(1,5))
if(1) //Laser fight
for(var/i=0,i 0,i--) //Pick a few words to stutter on.
- if (!unstuttered_words.len)
+ if(!unstuttered_words.len)
break
var/word = pick(unstuttered_words)
unstuttered_words -= word //Remove from unstuttered words so we don't stutter it again.
diff --git a/code/modules/food/beverages/bottler.dm b/code/modules/food/beverages/bottler.dm
new file mode 100644
index 00000000000..7e764595fd5
--- /dev/null
+++ b/code/modules/food/beverages/bottler.dm
@@ -0,0 +1,414 @@
+
+//adjust these to change the maximum capacity of the bottler for each container type
+#define MAX_GLASS 10
+#define MAX_PLAST 20
+#define MAX_METAL 25
+
+//adjust these to change the number of containers the bottler will make per sheet
+#define RATIO_GLASS 1
+#define RATIO_PLAST 2
+#define RATIO_METAL 5
+
+/obj/machinery/bottler
+ name = "bottler unit"
+ desc = "A machine that combines ingredients and bottles the resulting beverages."
+ icon = 'icons/obj/kitchen.dmi'
+ icon_state = "bottler_off"
+ density = 1
+ anchored = 1
+ var/list/slots[3]
+ var/list/datum/bottler_recipe/available_recipes
+ var/list/acceptable_items
+ var/list/containers = list("glass bottle" = 10, "plastic bottle" = 20, "metal can" = 25)
+ var/bottling = 0
+
+/obj/machinery/bottler/New()
+ if(!available_recipes)
+ available_recipes = list()
+ acceptable_items = list()
+ //These are going to be acceptable even if they aren't in a recipe
+ acceptable_items |= /obj/item/weapon/reagent_containers/food/snacks
+ acceptable_items |= /obj/item/weapon/reagent_containers/food/drinks/cans
+ //the rest is based on what is used in recipes so we don't have people destroying the nuke disc
+ for(var/type in subtypesof(/datum/bottler_recipe))
+ var/datum/bottler_recipe/recipe = new type
+ if(recipe.result) // Ignore recipe subtypes that lack a result
+ available_recipes += recipe
+ for(var/i = 1, i <= recipe.ingredients.len, i++)
+ acceptable_items |= recipe.ingredients[i]
+ else
+ qdel(recipe)
+
+/obj/machinery/bottler/attackby(obj/item/O, mob/user, params)
+ if(iswrench(O)) //This being before the canUnequip check allows borgs to (un)wrench bottlers in case they need move them to fix stuff
+ playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
+ if(anchored)
+ anchored = 0
+ to_chat(user, "[src] can now be moved. ")
+ else
+ anchored = 1
+ to_chat(user, "[src] is now secured. ")
+ return 1
+ if(!user.canUnEquip(O, 0))
+ to_chat(user, "[O] is stuck to your hand, you can't seem to put it down! ")
+ return 0
+ if(is_type_in_list(O,acceptable_items))
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks))
+ var/obj/item/weapon/reagent_containers/food/snacks/S = O
+ user.unEquip(S)
+ if(S.reagents && !S.reagents.total_volume) //This prevents us from using empty foods, should one occur due to some sort of error
+ to_chat(user, "[S] is gone, oh no! ")
+ qdel(S) //Delete the food object because it is useless even as food due to the lack of reagents
+ else
+ insert_item(S, user)
+ return 1
+ else if(istype(O, /obj/item/weapon/reagent_containers/food/drinks/cans))
+ var/obj/item/weapon/reagent_containers/food/drinks/cans/C = O
+ if(C.reagents)
+ if(C.canopened && C.reagents.total_volume) //This prevents us from using opened cans that still have something in them
+ to_chat(user, "Only unopened cans and bottles can be processed to ensure product integrity. ")
+ return 0
+ user.unEquip(C)
+ if(!C.reagents.total_volume) //Empty cans get recycled, even if they have somehow remained unopened due to some sort of error
+ recycle_container(C)
+ else //Full cans that are unopened get inserted for processing as ingredients
+ insert_item(C, user)
+ return 1
+ else
+ user.unEquip(O)
+ insert_item(O, user)
+ return 1
+ else if(istype(O, /obj/item/trash/can)) //Crushed cans (and bottles) are returnable still
+ var/obj/item/trash/can/C = O
+ user.unEquip(C)
+ recycle_container(C)
+ return 1
+ else if(istype(O, /obj/item/stack/sheet)) //Sheets of materials can replenish the machine's supply of drink containers (when people inevitably don't return them)
+ var/obj/item/stack/sheet/S = O
+ user.unEquip(S)
+ process_sheets(S)
+ return 1
+ else //If it doesn't qualify in the above checks, we don't want it. Inform the person so they (ideally) stop trying to put the nuke disc in.
+ to_chat(user, "You aren't sure this is able to be processed by the machine. ")
+ return 0
+ //..()
+
+/obj/machinery/bottler/proc/insert_item(obj/item/O, mob/user)
+ if(!O || !user)
+ return
+ if(slots[1] && slots[2] && slots[3])
+ to_chat(user, "[src] is full, please remove or process the contents first. ")
+ return
+ var/slot_inserted = 0
+ for(var/i = 1, i <= slots.len, i++)
+ if(!slots[i])
+ slots[i] = O
+ slot_inserted = i
+ break
+ if(!slot_inserted)
+ to_chat(user, "Something went wrong and the machine spits out [O]. ")
+ O.forceMove(loc)
+ else
+ to_chat(user, "You load [O] into the [slot_inserted]\th ingredient tray. ")
+ O.forceMove(src)
+ updateUsrDialog()
+
+/obj/machinery/bottler/proc/eject_items(var/slot)
+ var/obj/item/O = null
+ if(!slot)
+ for(var/i = 1, i <= slots.len, i++)
+ if(slots[i])
+ O = slots[i]
+ O.forceMove(loc)
+ slots[i] = null
+ visible_message("[src] beeps as it ejects the contents of all the ingredient trays. ")
+ else
+ if(slots[slot]) //ensures the tray actually has something to eject so we don't runtime on trying to reference null
+ O = slots[slot]
+ O.forceMove(loc)
+ slots[slot] = null
+ visible_message("[src] beeps as it ejects [O.name] from the [slot]\th ingredient tray. ")
+ updateUsrDialog()
+
+/obj/machinery/bottler/proc/recycle_container(obj/item/O)
+ if(!O)
+ return
+ var/con_type
+ var/max_define
+ if(istype(O, /obj/item/trash/can))
+ var/obj/item/trash/can/C = O
+ if(C.is_glass)
+ con_type = "glass bottle"
+ max_define = MAX_GLASS
+ else if(C.is_plastic)
+ con_type = "plastic bottle"
+ max_define = MAX_PLAST
+ else
+ con_type = "metal can"
+ max_define = MAX_METAL
+ else if(istype(O, /obj/item/weapon/reagent_containers/food/drinks/cans))
+ var/obj/item/weapon/reagent_containers/food/drinks/cans/C = O
+ if(C.is_glass)
+ con_type = "glass bottle"
+ max_define = MAX_GLASS
+ else if(C.is_plastic)
+ con_type = "plastic bottle"
+ max_define = MAX_PLAST
+ else
+ con_type = "metal can"
+ max_define = MAX_METAL
+ if(con_type)
+ if(containers[con_type] < max_define)
+ containers[con_type]++
+ visible_message("[src] whirs briefly as it prepares the container for reuse. ")
+ qdel(O)
+ updateUsrDialog()
+ else
+ visible_message("[src] cannot store any more cans at this time. Please fill some before recycling more. ")
+ O.forceMove(loc)
+
+/obj/machinery/bottler/proc/process_sheets(obj/item/stack/sheet/S)
+ if(!S)
+ return
+ S.forceMove(loc)
+ var/con_type
+ var/max_define
+ var/mat_ratio
+ //Glass sheets for glass bottles (1 bottle per sheet)
+ if(istype(S, /obj/item/stack/sheet/glass))
+ con_type = "glass bottle"
+ max_define = MAX_GLASS
+ mat_ratio = RATIO_GLASS
+ else if(istype(S, /obj/item/stack/sheet/mineral/plastic))
+ con_type = "plastic bottle"
+ max_define = MAX_PLAST
+ mat_ratio = RATIO_PLAST
+ else if(istype(S, /obj/item/stack/sheet/metal))
+ con_type = "metal can"
+ max_define = MAX_METAL
+ mat_ratio = RATIO_METAL
+ else
+ visible_message("[src] rejects the unusable materials. ")
+ return
+ var/missing
+ var/sheets_needed
+ var/sheets_to_use
+ if(con_type)
+ missing = max_define - containers[con_type]
+ sheets_needed = round(missing / mat_ratio, 1)
+ if(missing % mat_ratio)
+ sheets_needed += 1
+ sheets_to_use = min(sheets_needed, S.amount)
+ if(missing)
+ visible_message("[src] shudders as it converts [sheets_to_use] [S.singular_name]\s into new [con_type]s. ")
+ containers[con_type] += sheets_to_use * mat_ratio
+ containers[con_type] = min(containers[con_type], max_define)
+ S.use(sheets_to_use)
+ else
+ visible_message("[src] rejects the [S] because it already is fully stocked with [con_type]s. ")
+
+/obj/machinery/bottler/proc/select_recipe()
+ for(var/datum/bottler_recipe/recipe in available_recipes)
+ var/number_matches = 0
+ for(var/i = 1, i <= slots.len, i++)
+ var/obj/item/O = slots[i]
+ if(istype(O, recipe.ingredients[i]))
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown))
+ var/obj/item/weapon/reagent_containers/food/snacks/grown/G = O
+ if(G.seed && G.seed.kitchen_tag == recipe.tags[i])
+ number_matches++
+ else
+ number_matches++
+ if(number_matches == 3)
+ return recipe
+ return null
+
+/obj/machinery/bottler/proc/dispense_empty_container(container)
+ var/con_type
+ var/obj/item/weapon/reagent_containers/food/drinks/cans/bottler/drink_container
+ switch(container)
+ if(1) //glass bottle
+ con_type = "glass bottle"
+ drink_container = /obj/item/weapon/reagent_containers/food/drinks/cans/bottler/glass_bottle
+ if(2) //plastic bottle
+ con_type = "plastic bottle"
+ drink_container = /obj/item/weapon/reagent_containers/food/drinks/cans/bottler/plastic_bottle
+ if(3) //metal can
+ con_type = "metal can"
+ drink_container = /obj/item/weapon/reagent_containers/food/drinks/cans/bottler/metal_can
+ if(containers[con_type])
+ //empties aren't sealed, so let's open it quietly
+ drink_container = new drink_container()
+ drink_container.canopened = 1
+ drink_container.flags |= OPENCONTAINER
+ drink_container.forceMove(loc)
+ containers[con_type]--
+
+/obj/machinery/bottler/proc/process_ingredients(container)
+ //stop if we have ZERO ingredients (what would you process?)
+ if(!slots[1] && !slots[2] && !slots[3])
+ visible_message("There are no ingredients to process! Please insert some first. ")
+ return
+ //prep a container
+ var/obj/item/weapon/reagent_containers/food/drinks/cans/bottler/drink_container
+ var/con_type
+ switch(container)
+ if(1) //glass bottle
+ con_type = "glass bottle"
+ drink_container = /obj/item/weapon/reagent_containers/food/drinks/cans/bottler/glass_bottle
+ if(2) //plastic bottle
+ con_type = "plastic bottle"
+ drink_container = /obj/item/weapon/reagent_containers/food/drinks/cans/bottler/plastic_bottle
+ if(3) //metal can
+ con_type = "metal can"
+ drink_container = /obj/item/weapon/reagent_containers/food/drinks/cans/bottler/metal_can
+
+ if(!con_type)
+ visible_message("Error 404: Drink Container Not Found. ")
+ return
+ if(!containers[con_type])
+ visible_message("Error 503: Out of [con_type]s. ")
+ return
+ else
+ drink_container = new drink_container()
+ containers[con_type]--
+ //select and process a recipe based on inserted ingredients
+ visible_message("[src] hums as it processes the ingredients... ")
+ bottling = 1
+ var/datum/bottler_recipe/recipe_to_use = select_recipe()
+ if(!recipe_to_use)
+ //bad recipe, ruins the drink
+ var/contents = pick("thick goop", "pungent sludge", "unspeakable slurry", "gross-looking concoction", "eldritch abomination of liquids")
+ visible_message("The [con_type] fills with \an [contents]... ")
+ drink_container.reagents.add_reagent(pick("????", "toxic_slurry", "meatslurry", "glowing_slury", "fishwater"), pick(30, 50))
+ drink_container.name = "Liquid Mistakes"
+ drink_container.desc = "WARNING: CONTENTS MAY BE AWFUL, DRINK AT OWN RISK."
+ else
+ //good recipe, make it
+ visible_message("The [con_type] fills with a delicious-looking beverage! ")
+ drink_container.reagents.add_reagent(recipe_to_use.result, 50)
+ drink_container.name = "[recipe_to_use.name]"
+ drink_container.desc = "[recipe_to_use.description]"
+ flick("bottler_on", src)
+ spawn(45)
+ for(var/i = 1, i <= slots.len, i++)
+ qdel(slots[i])
+ slots[i] = null
+ bottling = 0
+ drink_container.forceMove(loc)
+ updateUsrDialog()
+
+/obj/machinery/bottler/attack_ai(mob/user)
+ attack_hand(user)
+
+/obj/machinery/bottler/attack_ghost(mob/user)
+ attack_hand(user)
+
+/obj/machinery/bottler/attack_hand(mob/user)
+ if(stat & BROKEN)
+ return
+ interact(user)
+
+/obj/machinery/bottler/interact(mob/user)
+ user.set_machine(src)
+ //html ahoy
+ var/dat = ""
+ if(bottling)
+ dat = "Bottling in process, please wait... "
+ else
+ dat += ""
+ dat += ""
+ dat += "Containers: "
+ dat += " "
+ dat += ""
+ dat += "Glass Bottles: [containers["glass bottle"]] "
+ dat += "Plastic Bottles: [containers["plastic bottle"]] "
+ dat += "Metal Cans: [containers["metal can"]] "
+ dat += " "
+ dat += ""
+ if(containers["glass bottle"])
+ dat += "Dispense "
+ else
+ dat += "Out of stock "
+ if(containers["plastic bottle"])
+ dat += "Dispense "
+ else
+ dat += "Out of stock "
+ if(containers["metal can"])
+ dat += "Dispense "
+ else
+ dat += "Out of stock "
+ dat += " "
+ dat += "
"
+ dat += " "
+ dat += ""
+ dat += ""
+ dat += "Ingredient Tray Contents: "
+ dat += " "
+
+ dat += ""
+ for(var/i = 1, i <= slots.len, i++)
+ var/obj/O = slots[i]
+ if(O)
+ dat += "[bicon(O)] [O.name] "
+ else
+ dat += "Tray Empty "
+
+ if(slots[1] && slots[2] && slots[3])
+ dat += "Process Ingredients "
+ else
+ dat += "Insufficient Ingredients "
+ dat += " "
+
+ dat += ""
+ for(var/i = 1, i <= slots.len, i++)
+ if(slots[i])
+ dat += "Eject "
+ else
+ dat += "N/A "
+ dat += "Eject All "
+ dat += " "
+ dat += "
"
+ dat += " "
+ dat += "Insert three ingredients and press process to create a beverage. You will be able to select a container for the beverage before processing begins.
"
+ dat += "Inserting empty bottles and cans, as well as sheets of glass, plastic, or metal will restock the appropriate container supply.
"
+ var/datum/browser/popup = new(user, "bottler", "Bottler Menu", 575, 400)
+ popup.set_content(dat)
+ popup.open()
+
+/obj/machinery/bottler/Topic(href, href_list)
+ if(..())
+ return 1
+ if(bottling)
+ return
+
+ add_fingerprint(usr)
+ usr.set_machine(src)
+
+ if(href_list["process"])
+ var/list/choices = list("Glass Bottle" = 1, "Plastic Bottle" = 2, "Metal Can" = 3)
+ var/selection = input("Select a container for your beverage.", "Container") as null|anything in choices
+ if(!selection)
+ return
+ else
+ selection = choices[selection]
+ process_ingredients(selection)
+
+ if(href_list["eject"])
+ var/slot = text2num(href_list["eject"])
+ eject_items(slot)
+
+ if(href_list["dispense"])
+ var/container = text2num(href_list["dispense"])
+ dispense_empty_container(container)
+
+ updateUsrDialog()
+ return
+
+/obj/machinery/bottler/update_icon()
+ if(stat & BROKEN)
+ icon_state = "bottler_broken"
+ else if(bottling)
+ icon_state = "bottler_on"
+ else
+ icon_state = "bottler_off"
\ No newline at end of file
diff --git a/code/modules/food/beverages/bottler_recipes.dm b/code/modules/food/beverages/bottler_recipes.dm
new file mode 100644
index 00000000000..be7504afade
--- /dev/null
+++ b/code/modules/food/beverages/bottler_recipes.dm
@@ -0,0 +1,86 @@
+
+/datum/bottler_recipe
+ var/name = ""
+ var/description = ""
+ var/list/ingredients[3]
+ var/list/tags[3]
+ var/datum/reagent/result = null
+
+
+/* Example of how a bottler_recipe should look:
+/datum/bottler_recipe/example
+ name = "Example"
+ description = "This is an example."
+ ingredients = list(thing_1, thing_2, thing_3)
+ tags = list(null, "tag_2", null)
+ result = "water"
+
+The ingredients list must have 3 non-null entries.
+The tags list must have 3 entries, using null where a tag is unused.
+Failing to ensure both lists have EXACTLY 3 entries (unless the system is updated in the future to use a different number) will result in runtimes.
+There is no excuse to do this wrong now that there is an example for you. --FalseIncarnate
+*/
+
+
+/datum/bottler_recipe/Paradise_Punch
+ name = "Paradise Punch"
+ description = "Tastes just how you'd think Paradise would if you could bottle it."
+ ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown,
+ /obj/item/weapon/reagent_containers/food/snacks/grown,
+ /obj/item/weapon/reagent_containers/food/snacks/grown)
+ tags = list("grapes", "banana", "cherries")
+ result = "paradise_punch"
+
+/datum/bottler_recipe/Applepocalypse
+ name = "Apple-pocalypse"
+ description = "If doomsday came in fruit form, it'd probably be apples."
+ ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown,
+ /obj/item/weapon/reagent_containers/food/snacks/grown,
+ /obj/item/weapon/reagent_containers/food/snacks/grown)
+ tags = list("apple", "apple", "apple")
+ result = "apple-pocalypse"
+
+/datum/bottler_recipe/Berry_Banned
+ name = "Berry Banned"
+ description = "Reason for ban: Excessive Flavor."
+ ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown,
+ /obj/item/weapon/reagent_containers/food/snacks/grown,
+ /obj/item/weapon/reagent_containers/food/snacks/grown)
+ tags = list("berries", "berries", "berries")
+ result = "berry_banned"
+
+/datum/bottler_recipe/Berry_Banned2
+ name = "Berry Banned"
+ description = "Reason for ban: Excessive Flavor."
+ ingredients = list(/obj/item/weapon/reagent_containers/food/snacks/grown,
+ /obj/item/weapon/reagent_containers/food/snacks/grown,
+ /obj/item/weapon/reagent_containers/food/snacks/grown)
+ tags = list("poisonberries", "poisonberries", "poisonberries")
+ result = "berry_banned2"
+
+/datum/bottler_recipe/Blackeye_Brew
+ name = "Blackeye Brew"
+ description = "Creamy, smooth flavor, just like the bald heads of the masses. Supposedly aged for 30 years."
+ ingredients = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola,
+ /obj/item/weapon/reagent_containers/food/snacks/grown,
+ /obj/item/weapon/reagent_containers/food/snacks/icecream)
+ tags = list(null, "sugarcane", null)
+ result = "blackeye_brew"
+
+/datum/bottler_recipe/Grape_Granade
+ name = "Grape Granade"
+ description = "Exploding with grape flavor and a favorite among ERT members system-wide."
+ ingredients = list(/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice,
+ /obj/item/weapon/reagent_containers/food/snacks/grown,
+ /obj/item/device/flash)
+ tags = list(null, "grapes", null)
+ result = "grape_granade"
+
+/datum/bottler_recipe/Meteor_Malt
+ name = "Meteor Malt"
+ description = "Soft drinks have been detected on collision course with your tastebuds."
+ ingredients = list(/obj/item/weapon/ore,
+ /obj/item/weapon/reagent_containers/food/snacks/grown,
+ /obj/item/weapon/ore)
+ tags = list(null, "wheat", null)
+ result = "meteor_malt"
diff --git a/code/modules/food/cooker.dm b/code/modules/food/cooker.dm
index 40e04817209..706ea0e367b 100644
--- a/code/modules/food/cooker.dm
+++ b/code/modules/food/cooker.dm
@@ -9,16 +9,18 @@
var/on = 0
var/onicon = null
var/officon = null
+ var/openicon = null
var/thiscooktype = null
var/burns = 0 // whether a machine burns something - if it does, you probably want to add the cooktype to /snacks/badrecipe
var/firechance = 0
var/cooktime = 0
var/foodcolor = null
var/has_specials = 0 //Set to 1 if the machine has specials to check, otherwise leave it at 0
+ var/upgradeable = 0 //Set to 1 if the machine supports upgrades / deconstruction, or else it will ignore stuff like screwdrivers and parts exchangers
// checks if the snack has been cooked in a certain way
/obj/machinery/cooker/proc/checkCooked(obj/item/weapon/reagent_containers/food/snacks/D)
- if (D.cooktype[thiscooktype])
+ if(D.cooktype[thiscooktype])
return 1
return 0
@@ -65,7 +67,7 @@
var/datum/effect/system/bad_smoke_spread/smoke = new /datum/effect/system/bad_smoke_spread() // burning things makes smoke!
smoke.set_up(5, 0, src)
smoke.start()
- if (prob(firechance))
+ if(prob(firechance))
var/turf/location = get_turf(src)
var/obj/effect/decal/cleanable/liquid_fuel/oil = new(location)
oil.name = "fat"
@@ -91,9 +93,24 @@
return type
/obj/machinery/cooker/attackby(obj/item/I, mob/user, params)
+ if(upgradeable)
+ //Not all cooker types currently support build/upgrade stuff, so not all of it will work well with this
+ //Until we decide whether or not we want to bring back the cereal maker or old grill/oven in some form, this initial check will have to suffice
+ if(isscrewdriver(I))
+ default_deconstruction_screwdriver(user, openicon, officon, I)
+ return
+ if(iscrowbar(I))
+ default_deconstruction_crowbar(I)
+ return
+ if(istype(I, /obj/item/weapon/storage/part_replacer))
+ exchange_parts(user, I)
+ return
if(stat & (NOPOWER|BROKEN))
return
- if (!checkValid(I, user))
+ if(panel_open)
+ to_chat(user, "Close the panel first! ")
+ return
+ if(!checkValid(I, user))
return
if(!burns)
if(istype(I, /obj/item/weapon/reagent_containers/food/snacks))
diff --git a/code/modules/food/customizables.dm b/code/modules/food/customizables.dm
index ff1ff9f6ad5..d14731f9add 100644
--- a/code/modules/food/customizables.dm
+++ b/code/modules/food/customizables.dm
@@ -425,24 +425,24 @@
continue
- if (istype(ing, /obj/item/weapon/reagent_containers/food/snacks/customizable)) // split the ingredients into ones with basenames (sandwich, burger, etc) and ones without, keeping track of how many of each there are
+ if(istype(ing, /obj/item/weapon/reagent_containers/food/snacks/customizable)) // split the ingredients into ones with basenames (sandwich, burger, etc) and ones without, keeping track of how many of each there are
var/obj/item/weapon/reagent_containers/food/snacks/customizable/gettype = ing
- if (unsortedtypes[gettype.basename])
+ if(unsortedtypes[gettype.basename])
unsortedtypes[gettype.basename]++
- if (unsortedtypes[gettype.basename] > ct)
+ if(unsortedtypes[gettype.basename] > ct)
ct = unsortedtypes[gettype.basename]
else
(unsortedtypes[gettype.basename]) = 1
- if (unsortedtypes[gettype.basename] > ct)
+ if(unsortedtypes[gettype.basename] > ct)
ct = unsortedtypes[gettype.basename]
else
if(unsorteditems[ing.name])
unsorteditems[ing.name]++
- if (unsorteditems[ing.name] > ci)
+ if(unsorteditems[ing.name] > ci)
ci = unsorteditems[ing.name]
else
unsorteditems[ing.name] = 1
- if (unsorteditems[ing.name] > ci)
+ if(unsorteditems[ing.name] > ci)
ci = unsorteditems[ing.name]
sorteditems = sortlist(unsorteditems, ci) //order both types going from the lowest number to the highest number
@@ -450,30 +450,30 @@
for(var/ings in sorteditems) //add the non-basename items to the name, sorting out the , and the and
c++
- if (c == sorteditems.len - 1)
+ if(c == sorteditems.len - 1)
seperator = " and "
- else if (c == sorteditems.len)
+ else if(c == sorteditems.len)
seperator = " "
else
seperator = ", "
- if (sorteditems[ings] > levels.len)
+ if(sorteditems[ings] > levels.len)
sorteditems[ings] = levels.len
- if (sorteditems[ings] <= 1)
+ if(sorteditems[ings] <= 1)
sendback +="[ings][seperator]"
else
sendback +="[levels[sorteditems[ings]]] [ings][seperator]"
- for (var/ingtype in sortedtypes) // now add the types basenames, keeping the src one seperate so it can go on the end
- if (sortedtypes[ingtype] > levels.len)
+ for(var/ingtype in sortedtypes) // now add the types basenames, keeping the src one seperate so it can go on the end
+ if(sortedtypes[ingtype] > levels.len)
sortedtypes[ingtype] = levels.len
- if (ingtype == basename)
- if (sortedtypes[ingtype] < levels.len)
+ if(ingtype == basename)
+ if(sortedtypes[ingtype] < levels.len)
sortedtypes[ingtype]++
endpart = "[levels[sortedtypes[ingtype]]] decker [basename]"
continue
- if (sortedtypes[ingtype] >= 2)
+ if(sortedtypes[ingtype] >= 2)
sendback += "[levels[sortedtypes[ingtype]]] decker [ingtype] "
else
sendback += "[ingtype] "
@@ -491,7 +491,7 @@
var/sorted[0]
for(var/i = 1, i<= highest, i++)
for(var/it in unsorted)
- if (unsorted[it] == i)
+ if(unsorted[it] == i)
sorted[it] = i
return sorted
diff --git a/code/modules/food/deep_fryer.dm b/code/modules/food/deep_fryer.dm
index 96e5fb94c57..b5aaef15fec 100644
--- a/code/modules/food/deep_fryer.dm
+++ b/code/modules/food/deep_fryer.dm
@@ -10,8 +10,34 @@
foodcolor = "#FFAD33"
officon = "fryer_off"
onicon = "fryer_on"
+ openicon = "fryer_open"
has_specials = 1
+ upgradeable = 1
+/obj/machinery/cooker/deepfryer/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/deepfryer(null)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
+ component_parts += new /obj/item/stack/cable_coil(null, 5)
+ RefreshParts()
+
+/obj/machinery/cooker/deepfryer/upgraded/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/deepfryer(null)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser/ultra(null)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser/ultra(null)
+ component_parts += new /obj/item/stack/cable_coil(null, 5)
+ RefreshParts()
+
+/obj/machinery/cooker/deepfryer/RefreshParts()
+ var/E = 0
+ for(var/obj/item/weapon/stock_parts/micro_laser/L in component_parts)
+ E += L.rating
+ E -= 2 //Standard parts is 0 (1+1-2), Tier 4 parts is 6 (4+4-2)
+ cooktime = (200 - (E * 20)) //Effectively each laser improves cooktime by 20 per rating beyond the first (200 base, 80 max upgrade)
/obj/machinery/cooker/deepfryer/gettype()
var/obj/item/weapon/reagent_containers/food/snacks/deepfryholder/type = new(get_turf(src))
@@ -20,13 +46,13 @@
/obj/machinery/cooker/deepfryer/checkSpecials(obj/item/I)
if(!I)
return 0
- for (var/Type in subtypesof(/datum/deepfryer_special))
+ for(var/Type in subtypesof(/datum/deepfryer_special))
var/datum/deepfryer_special/P = new Type()
if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/grown))
var/obj/item/weapon/reagent_containers/food/snacks/grown/G = I
if(G.seed.kitchen_tag != P.input)
continue
- else if (!istype(I, P.input))
+ else if(!istype(I, P.input))
continue
return P
return 0
diff --git a/code/modules/food/recipes_candy.dm b/code/modules/food/recipes_candy.dm
index 8067820786f..2ab54fc0e27 100644
--- a/code/modules/food/recipes_candy.dm
+++ b/code/modules/food/recipes_candy.dm
@@ -69,7 +69,7 @@
result = /obj/item/weapon/reagent_containers/food/snacks/candy/toffee
/datum/recipe/candy/taffy
- reagents = list("sugar" = 5, "water" = 5, "sodiumchloride" = 5)
+ reagents = list("salglu_solution" = 15)
items = list()
result = /obj/item/weapon/reagent_containers/food/snacks/candy/taffy
@@ -532,4 +532,4 @@
/obj/item/weapon/reagent_containers/food/snacks/candy/caramel,
/obj/item/weapon/reagent_containers/food/snacks/candy/nougat,
)
- result = /obj/item/weapon/reagent_containers/food/snacks/candy/candybar/caramel_nougat
\ No newline at end of file
+ result = /obj/item/weapon/reagent_containers/food/snacks/candy/candybar/caramel_nougat
diff --git a/code/modules/food/recipes_grill.dm b/code/modules/food/recipes_grill.dm
index 0c3c81078df..4c459b737ff 100644
--- a/code/modules/food/recipes_grill.dm
+++ b/code/modules/food/recipes_grill.dm
@@ -1,6 +1,12 @@
// /datum/recipe/grill
+/datum/recipe/grill/bacon
+ items = list(
+ /obj/item/weapon/reagent_containers/food/snacks/raw_bacon,
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/bacon
+
/datum/recipe/grill/telebacon
items = list(
/obj/item/weapon/reagent_containers/food/snacks/meat,
@@ -214,4 +220,4 @@
/obj/item/weapon/reagent_containers/food/snacks/boiledrice,
/obj/item/weapon/reagent_containers/food/snacks/catfishmeat,
)
- result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Tai
\ No newline at end of file
+ result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Tai
diff --git a/code/modules/food/recipes_oven.dm b/code/modules/food/recipes_oven.dm
index 105bc4d0282..9ee3ff3343e 100644
--- a/code/modules/food/recipes_oven.dm
+++ b/code/modules/food/recipes_oven.dm
@@ -185,9 +185,9 @@
return being_cooked
check_items(var/obj/container as obj)
. = ..()
- if (.)
+ if(.)
var/obj/item/weapon/paper/paper = locate() in container
- if (!paper || !paper.info)
+ if(!paper || !paper.info)
return -1
return .
diff --git a/code/modules/food/recipes_table.dm b/code/modules/food/recipes_table.dm
index 0c9f72dd6d5..005be6c1f7e 100644
--- a/code/modules/food/recipes_table.dm
+++ b/code/modules/food/recipes_table.dm
@@ -1,5 +1,5 @@
/* Example for reference when defining recipes
-/datum/table_recipe/food
+/datum/crafting_recipe/food
name = "" //in-game display name
reqs[] = list() //type paths of items/reagents consumed associated with how many are needed (equivalent to var/list/items and var/list/reagents combined)
result //type path of item resulting from this craft
@@ -9,7 +9,7 @@
fruit[] = list() //grown products required by the recipe
*/
-/datum/table_recipe/sandwich
+/datum/crafting_recipe/sandwich
name = "Sandwich"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/meatsteak = 1,
@@ -17,55 +17,61 @@
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sandwich
+ category = CAT_FOOD
-/datum/table_recipe/slimesandwich
+/datum/crafting_recipe/slimesandwich
name = "Slime Jelly Sandwich"
reqs = list(
/datum/reagent/slimejelly = 5,
/obj/item/weapon/reagent_containers/food/snacks/breadslice = 2,
)
result = /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime
+ category = CAT_FOOD
-/datum/table_recipe/cherrysandwich
+/datum/crafting_recipe/cherrysandwich
name = "Cherry Jelly Sandwich"
reqs = list(
/datum/reagent/cherryjelly = 5,
/obj/item/weapon/reagent_containers/food/snacks/breadslice = 2,
)
result = /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry
+ category = CAT_FOOD
-/datum/table_recipe/slimeburger
+/datum/crafting_recipe/slimeburger
name = "Slime Jelly Burger"
reqs = list(
/datum/reagent/slimejelly = 5,
/obj/item/weapon/reagent_containers/food/snacks/bun = 1,
)
result = /obj/item/weapon/reagent_containers/food/snacks/jellyburger/slime
+ category = CAT_FOOD
-/datum/table_recipe/jellyburger
+/datum/crafting_recipe/jellyburger
name = "Cherry Jelly Burger"
reqs = list(
/datum/reagent/cherryjelly = 5,
/obj/item/weapon/reagent_containers/food/snacks/bun = 1,
)
result = /obj/item/weapon/reagent_containers/food/snacks/jellyburger/cherry
+ category = CAT_FOOD
-/datum/table_recipe/herbsalad
+/* Temporarily disabled until we can find a workaround for this fruit shit.
+/datum/crafting_recipe/herbsalad
name = "herb salad"
fruit = list("ambrosia" = 3, "apple" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/herbsalad
-/datum/table_recipe/herbsalad/AdjustChems(var/obj/resultobj as obj)
+/datum/crafting_recipe/herbsalad/AdjustChems(var/obj/resultobj as obj)
if(istype(resultobj, /obj/item/weapon/reagent_containers))
var/obj/item/weapon/reagent_containers/RC = resultobj
RC.reagents.del_reagent("toxin")
-/datum/table_recipe/aesirsalad
+/datum/crafting_recipe/aesirsalad
name = "Aesir salad"
fruit = list("ambrosiadeus" = 3, "goldapple" = 1)
result = /obj/item/weapon/reagent_containers/food/snacks/aesirsalad
-/datum/table_recipe/validsalad
+/datum/crafting_recipe/validsalad
name = "valid salad"
fruit = list("ambrosia" = 3, "potato" = 1)
reqs = list(
@@ -73,20 +79,12 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/validsalad
-/datum/table_recipe/validsalad/AdjustChems(var/obj/resultobj as obj)
+/datum/crafting_recipe/validsalad/AdjustChems(var/obj/resultobj as obj)
if(istype(resultobj, /obj/item/weapon/reagent_containers))
var/obj/item/weapon/reagent_containers/RC = resultobj
RC.reagents.del_reagent("toxin")
-/datum/table_recipe/notasandwich
- name = "not-a-sandwich"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/breadslice = 2,
- /obj/item/clothing/mask/fakemoustache = 1,
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/notasandwich
-
-/datum/table_recipe/wrap
+/datum/crafting_recipe/wrap
name = "egg wrap"
fruit = list("cabbage" = 1)
reqs = list(
@@ -94,75 +92,95 @@
/obj/item/weapon/reagent_containers/food/snacks/friedegg = 1,
)
result = /obj/item/weapon/reagent_containers/food/snacks/wrap
+*/
-/datum/table_recipe/sushi_Ebi
+/datum/crafting_recipe/notasandwich
+ name = "not-a-sandwich"
+ reqs = list(
+ /obj/item/weapon/reagent_containers/food/snacks/breadslice = 2,
+ /obj/item/clothing/mask/fakemoustache = 1,
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/notasandwich
+ category = CAT_FOOD
+
+
+/datum/crafting_recipe/sushi_Ebi
name = "Ebi Sushi"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1,
/obj/item/weapon/reagent_containers/food/snacks/boiled_shrimp = 1,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Ebi
+ category = CAT_FOOD
-/datum/table_recipe/sushi_Ikura
+/datum/crafting_recipe/sushi_Ikura
name = "Ikura Sushi"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1,
/obj/item/fish_eggs/salmon = 1,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Ikura
+ category = CAT_FOOD
-/datum/table_recipe/sushi_Inari
+/datum/crafting_recipe/sushi_Inari
name = "Inari Sushi"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1,
/obj/item/weapon/reagent_containers/food/snacks/fried_tofu = 1,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Inari
+ category = CAT_FOOD
-/datum/table_recipe/sushi_Sake
+/datum/crafting_recipe/sushi_Sake
name = "Sake Sushi"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1,
/obj/item/weapon/reagent_containers/food/snacks/salmonmeat = 1,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Sake
+ category = CAT_FOOD
-/datum/table_recipe/sushi_SmokedSalmon
+/datum/crafting_recipe/sushi_SmokedSalmon
name = "Smoked Salmon Sushi"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1,
/obj/item/weapon/reagent_containers/food/snacks/salmonsteak = 1,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sushi_SmokedSalmon
+ category = CAT_FOOD
-/datum/table_recipe/sushi_Masago
+/datum/crafting_recipe/sushi_Masago
name = "Masago Sushi"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1,
/obj/item/fish_eggs/goldfish = 1,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Masago
+ category = CAT_FOOD
-/datum/table_recipe/sushi_Tobiko
+/datum/crafting_recipe/sushi_Tobiko
name = "Tobiko Sushi"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1,
/obj/item/fish_eggs/shark = 1,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Tobiko
+ category = CAT_FOOD
-/datum/table_recipe/sushi_TobikoEgg
+/datum/crafting_recipe/sushi_TobikoEgg
name = "Tobiko and Egg Sushi"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/sushi_Tobiko = 1,
/obj/item/weapon/reagent_containers/food/snacks/egg = 1,
)
result = /obj/item/weapon/reagent_containers/food/snacks/sushi_TobikoEgg
+ category = CAT_FOOD
-/datum/table_recipe/sushi_Tai
+/datum/crafting_recipe/sushi_Tai
name = "Tai Sushi"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1,
/obj/item/weapon/reagent_containers/food/snacks/catfishmeat = 1,
)
- result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Tai
\ No newline at end of file
+ result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Tai
+ category = CAT_FOOD
diff --git a/code/modules/garbage_collection/garbage_collector.dm b/code/modules/garbage_collection/garbage_collector.dm
index aa8933c42de..95535376f85 100644
--- a/code/modules/garbage_collection/garbage_collector.dm
+++ b/code/modules/garbage_collection/garbage_collector.dm
@@ -109,7 +109,7 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
hint = D.Destroy()
catch(var/exception/e)
if(istype(e))
- gcwarning("qdel() caught runtime destroying [D.type]: [e] in [e.file], line [e.line]")
+ log_runtime(e, D, "Caught by qdel() destroying [D.type]")
else
gcwarning("qdel() caught runtime destroying [D.type]: [e]")
// Destroy runtimed? Panic! Hard delete!
@@ -129,14 +129,14 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
return
if(QDEL_HINT_IWILLGC) //functionally the same as the above. qdel should assume the object will gc on its own, and not check it.
return
- if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste.
+ if(QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste.
D.hard_deleted = -1 // -1 means "this hard del skipped the queue", used for profiling
del(D)
if(garbageCollector)
garbageCollector.dels_count++
- if (QDEL_HINT_PUTINPOOL) //qdel will put this object in the pool.
+ if(QDEL_HINT_PUTINPOOL) //qdel will put this object in the pool.
PlaceInPool(D,0)
- if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion.
+ if(QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion.
#ifdef TESTING
D.find_references(remove_from_queue = FALSE)
#endif
@@ -148,9 +148,9 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
// Returns 1 if the object has been queued for deletion.
/proc/qdeleted(var/datum/D)
- if (!istype(D))
+ if(!istype(D))
return 0
- if (!isnull(D.gcDestroyed))
+ if(!isnull(D.gcDestroyed))
return 1
return 0
@@ -169,7 +169,7 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
Destroy()
catch(var/exception/e)
if(istype(e))
- gcwarning("Del() caught runtime destroying [type]: [e] in [e.file], line [e.line]")
+ log_runtime(e, src, "Caught by Del() destroying [type]")
else
gcwarning("Del() caught runtime destroying [type]: [e]")
if(del_profiling)
diff --git a/code/modules/garbage_collection/gc_testing.dm b/code/modules/garbage_collection/gc_testing.dm
index 25fc4bef495..686b39a8542 100644
--- a/code/modules/garbage_collection/gc_testing.dm
+++ b/code/modules/garbage_collection/gc_testing.dm
@@ -71,17 +71,17 @@ var/global/list/ghdels_profiled = list()
code = 2
switch(code)
if(0) // Directly deleted (skipped the GC queue entirely)
- if (!("[type]" in dels_profiled))
+ if(!("[type]" in dels_profiled))
dels_profiled["[type]"] = 0
dels_profiled["[type]"] += 1
if(1) // Hard-deleted by the GC
- if (!("[type]" in ghdels_profiled))
+ if(!("[type]" in ghdels_profiled))
ghdels_profiled["[type]"] = 0
ghdels_profiled["[type]"] += 1
if(2) // qdel'd and garbage collected by BYOND
- if (!("[type]" in gdels_profiled))
+ if(!("[type]" in gdels_profiled))
gdels_profiled["[type]"] = 0
gdels_profiled["[type]"] += 1
@@ -117,7 +117,7 @@ var/global/list/ghdels_profiled = list()
L.Swap(i,s)
var/dat = "[header] "
- for (var/t in L)
+ for(var/t in L)
dat +="[L[t]] [t] "
dat += "
"
return dat
diff --git a/code/modules/holiday/christmas.dm b/code/modules/holiday/christmas.dm
index 765792e5da1..7dccff585d8 100644
--- a/code/modules/holiday/christmas.dm
+++ b/code/modules/holiday/christmas.dm
@@ -61,5 +61,5 @@
icon_state = "xmashat"
desc = "A crappy paper hat that you are REQUIRED to wear."
flags_inv = 0
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm
index 553251a2ee8..817f002f014 100644
--- a/code/modules/hydroponics/beekeeping/beebox.dm
+++ b/code/modules/hydroponics/beekeeping/beebox.dm
@@ -251,4 +251,4 @@
if(!user.put_in_active_hand(QB))
QB.forceMove(get_turf(src))
visible_message("[user] removes the queen from the apiary. ")
- queen_bee = null
+ queen_bee = null
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index b6dc4eee727..23a5447f1d4 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -254,7 +254,7 @@
for(var/i=0,i<2,i++)
var/obj/item/stack/sheet/wood/NG = new (user.loc)
NG.color = seed.get_trait(TRAIT_PRODUCT_COLOUR)
- for (var/obj/item/stack/sheet/wood/G in user.loc)
+ for(var/obj/item/stack/sheet/wood/G in user.loc)
if(G==NG)
continue
if(G.amount>=G.max_amount)
@@ -325,7 +325,7 @@
else
user.visible_message("[M] has been attacked with [src] by [user]! ")
- if (hitsound)
+ if(hitsound)
playsound(loc, hitsound, 50, 1, -1)
switch(damtype)
if("brute")
@@ -407,7 +407,7 @@
for(var/i=0,i<2,i++)
var/obj/item/stack/tile/grass/G = new (user.loc)
G.color = seed.get_trait(TRAIT_PRODUCT_COLOUR)
- for (var/obj/item/stack/tile/grass/NG in user.loc)
+ for(var/obj/item/stack/tile/grass/NG in user.loc)
if(G==NG)
continue
if(NG.amount>=NG.max_amount)
diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm
index fd9405cc6bf..39e94160275 100644
--- a/code/modules/hydroponics/grown_inedible.dm
+++ b/code/modules/hydroponics/grown_inedible.dm
@@ -80,7 +80,7 @@
/obj/item/weapon/grown/nettle/death
name = "deathnettle"
- desc = "The glowing \black nettle incites rage \black in you just from looking at it!"
+ desc = "The glowing nettle incites rage in you just from looking at it!"
icon_state = "deathnettle"
force = 30
throwforce = 15
@@ -110,7 +110,7 @@
icon = 'icons/obj/trash.dmi'
icon_state = "corncob"
item_state = "corncob"
- w_class = 2.0
+ w_class = 2
throwforce = 0
throw_speed = 4
throw_range = 20
@@ -129,7 +129,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "banana_peel"
item_state = "banana_peel"
- w_class = 2.0
+ w_class = 2
throwforce = 0
throw_speed = 4
throw_range = 20
@@ -143,7 +143,7 @@
icon = 'icons/obj/harvest.dmi'
icon_state = "sunflower"
item_state = "sunflower"
- w_class = 2.0
+ w_class = 2
throwforce = 0
throw_speed = 4
throw_range = 20
@@ -161,7 +161,7 @@
icon = 'icons/obj/harvest.dmi'
icon_state = "novaflower"
item_state = "sunflower"
- w_class = 2.0
+ w_class = 2
throwforce = 0
throw_speed = 4
throw_range = 20
diff --git a/code/modules/hydroponics/hydro_reagents.dm b/code/modules/hydroponics/hydro_reagents.dm
index 5e5cb819b98..db19d0832c9 100644
--- a/code/modules/hydroponics/hydro_reagents.dm
+++ b/code/modules/hydroponics/hydro_reagents.dm
@@ -5,7 +5,7 @@
flags = OPENCONTAINER | NOBLUDGEON
slot_flags = SLOT_BELT
throwforce = 4
- w_class = 2.0
+ w_class = 2
throw_speed = 2
throw_range = 10
var/toxicity = 4
@@ -93,7 +93,7 @@
icon_state = "bottle16"
flags = OPENCONTAINER
possible_transfer_amounts = null
- w_class = 2.0
+ w_class = 2
var/fertilizer //Reagent contained, if any.
diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm
index a028fa66727..7d646b23cc3 100644
--- a/code/modules/hydroponics/seed_datums.dm
+++ b/code/modules/hydroponics/seed_datums.dm
@@ -825,6 +825,7 @@
display_name = "grapevines"
mutants = list("greengrapes")
chems = list("plantmatter" = list(1,10), "sugar" = list(1,5))
+ kitchen_tag = "grapes"
preset_icon = "grapes"
/datum/seed/grapes/New()
@@ -1089,6 +1090,7 @@
seed_name = "sugarcane"
display_name = "sugarcanes"
chems = list("sugar" = list(4,5))
+ kitchen_tag = "sugarcane"
preset_icon = "sugarcane"
/datum/seed/sugarcane/New()
diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm
index 6e94201c75c..42323841094 100644
--- a/code/modules/hydroponics/seed_machines.dm
+++ b/code/modules/hydroponics/seed_machines.dm
@@ -3,7 +3,7 @@
desc = "A small disk used for carrying data on plant genetics."
icon = 'icons/obj/hydroponics_machines.dmi'
icon_state = "disk"
- w_class = 1.0
+ w_class = 1
var/list/genes = list()
var/genesource = "unknown"
@@ -68,15 +68,15 @@
active = 0
if(failed_task)
failed_task = 0
- visible_message("\icon[src] [src] pings unhappily, flashing a red warning light.")
+ visible_message("[bicon(src)] [src] pings unhappily, flashing a red warning light.")
else
- visible_message("\icon[src] [src] pings happily.")
+ visible_message("[bicon(src)] [src] pings happily.")
if(eject_disk)
eject_disk = 0
if(loaded_disk)
loaded_disk.loc = get_turf(src)
- visible_message("\icon[src] [src] beeps and spits out [loaded_disk].")
+ visible_message("[bicon(src)] [src] beeps and spits out [loaded_disk].")
loaded_disk = null
/obj/machinery/botany/attackby(obj/item/weapon/W as obj, mob/user as mob)
@@ -151,7 +151,7 @@
/obj/machinery/botany/extractor/RefreshParts()
var/tier = 1
- for (var/obj/item/weapon/stock_parts/scanning_module/S in component_parts)
+ for(var/obj/item/weapon/stock_parts/scanning_module/S in component_parts)
tier = S.rating
degrade_lower = 25 - (tier * 5) //Tier 1: 20, Tier 4: 5
degrade_upper = 70 - (tier * 10) //Tier 1: 60, Tier 4: 30
@@ -191,7 +191,7 @@
data["sourceName"] = 0
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "botany_isolator.tmpl", "Lysis-isolation Centrifuge UI", 470, 450)
ui.set_initial_data(data)
ui.open()
@@ -212,14 +212,14 @@
plant_controller.seeds[seed.seed.name] = seed.seed
seed.update_seed()
- visible_message("\icon[src] [src] beeps and spits out [seed].")
+ visible_message("[bicon(src)] [src] beeps and spits out [seed].")
seed = null
if(href_list["eject_disk"])
if(!loaded_disk) return
loaded_disk.loc = get_turf(src)
- visible_message("\icon[src] [src] beeps and spits out [loaded_disk].")
+ visible_message("[bicon(src)] [src] beeps and spits out [loaded_disk].")
loaded_disk = null
usr.set_machine(src)
@@ -302,7 +302,7 @@
/obj/machinery/botany/editor/RefreshParts()
var/tier = 1
- for (var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
tier = M.rating
degrade_lower = 6 - tier //Tier 1: 5, Tier 4: 1
degrade_upper = 11 - tier //Tier 1: 10, Tier 4: 6
@@ -341,7 +341,7 @@
data["loaded"] = 0
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "botany_editor.tmpl", "Bioballistic Delivery UI", 470, 450)
ui.set_initial_data(data)
ui.open()
diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm
index c97238b490d..1749181b329 100644
--- a/code/modules/hydroponics/seed_packets.dm
+++ b/code/modules/hydroponics/seed_packets.dm
@@ -5,7 +5,7 @@ var/global/list/plant_seed_sprites = list()
name = "packet of seeds"
icon = 'icons/obj/seeds.dmi'
icon_state = "blank"
- w_class = 2.0
+ w_class = 2
var/seed_type
var/datum/seed/seed
diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm
index fe905595677..fa5b8e311f3 100644
--- a/code/modules/hydroponics/seed_storage.dm
+++ b/code/modules/hydroponics/seed_storage.dm
@@ -13,7 +13,7 @@
src.ID = ID
/datum/seed_pile/proc/matches(var/obj/item/seeds/O)
- if (O.seed == seed_type)
+ if(O.seed == seed_type)
return 1
return 0
@@ -52,52 +52,52 @@
interact(user)
/obj/machinery/seed_storage/interact(mob/user as mob)
- if (..())
+ if(..())
return
- if (!initialized)
+ if(!initialized)
for(var/typepath in starting_seeds)
var/amount = starting_seeds[typepath]
if(isnull(amount)) amount = 1
- for (var/i = 1 to amount)
+ for(var/i = 1 to amount)
var/O = new typepath
add(O)
initialized = 1
var/dat = "Seed storage contents "
- if (piles.len == 0)
+ if(piles.len == 0)
dat += "No seeds "
else
dat += "Name "
dat += "Variety "
- if ("stats" in scanner)
+ if("stats" in scanner)
dat += "E Y M Pr Pt Harvest "
- if ("temperature" in scanner)
+ if("temperature" in scanner)
dat += "Temp "
- if ("light" in scanner)
+ if("light" in scanner)
dat += "Light "
- if ("soil" in scanner)
+ if("soil" in scanner)
dat += "Nutri Water "
dat += "Notes Amount "
- for (var/datum/seed_pile/S in piles)
+ for(var/datum/seed_pile/S in piles)
var/datum/seed/seed = S.seed_type
if(!seed)
continue
dat += ""
dat += "[seed.seed_name] "
dat += "#[seed.uid] "
- if ("stats" in scanner)
+ if("stats" in scanner)
dat += "[seed.get_trait(TRAIT_ENDURANCE)] [seed.get_trait(TRAIT_YIELD)] [seed.get_trait(TRAIT_MATURATION)] [seed.get_trait(TRAIT_PRODUCTION)] [seed.get_trait(TRAIT_POTENCY)] "
if(seed.get_trait(TRAIT_HARVEST_REPEAT))
dat += "Multiple "
else
dat += "Single "
- if ("temperature" in scanner)
+ if("temperature" in scanner)
dat += "[seed.get_trait(TRAIT_IDEAL_HEAT)] K "
- if ("light" in scanner)
+ if("light" in scanner)
dat += "[seed.get_trait(TRAIT_IDEAL_LIGHT)] L "
- if ("soil" in scanner)
+ if("soil" in scanner)
if(seed.get_trait(TRAIT_REQUIRES_NUTRIENTS))
if(seed.get_trait(TRAIT_NUTRIENT_CONSUMPTION) < 0.05)
dat += "Low "
@@ -128,17 +128,17 @@
dat += "VINE "
if(2)
dat += "VINE "
- if ("pressure" in scanner)
+ if("pressure" in scanner)
if(seed.get_trait(TRAIT_LOWKPA_TOLERANCE) < 20)
dat += "LP "
if(seed.get_trait(TRAIT_HIGHKPA_TOLERANCE) > 220)
dat += "HP "
- if ("temperature" in scanner)
+ if("temperature" in scanner)
if(seed.get_trait(TRAIT_HEAT_TOLERANCE) > 30)
dat += "TEMRES "
else if(seed.get_trait(TRAIT_HEAT_TOLERANCE) < 10)
dat += "TEMSEN "
- if ("light" in scanner)
+ if("light" in scanner)
if(seed.get_trait(TRAIT_LIGHT_TOLERANCE) > 10)
dat += "LIGRES "
else if(seed.get_trait(TRAIT_LIGHT_TOLERANCE) < 3)
@@ -157,7 +157,7 @@
dat += "WEEDRES "
if(seed.get_trait(TRAIT_PARASITE))
dat += "PAR "
- if ("temperature" in scanner)
+ if("temperature" in scanner)
if(seed.get_trait(TRAIT_ALTER_TEMP) > 0)
dat += "TEMP+ "
if(seed.get_trait(TRAIT_ALTER_TEMP) < 0)
@@ -174,27 +174,27 @@
onclose(user, "seedstorage")
/obj/machinery/seed_storage/Topic(var/href, var/list/href_list)
- if (..())
+ if(..())
return
var/task = href_list["task"]
var/ID = text2num(href_list["id"])
- for (var/datum/seed_pile/N in piles)
- if (N.ID == ID)
- if (task == "vend")
+ for(var/datum/seed_pile/N in piles)
+ if(N.ID == ID)
+ if(task == "vend")
var/obj/O = pick(N.seeds)
- if (O)
+ if(O)
--N.amount
N.seeds -= O
- if (N.amount <= 0 || N.seeds.len <= 0)
+ if(N.amount <= 0 || N.seeds.len <= 0)
piles -= N
qdel(N)
O.loc = src.loc
else
piles -= N
qdel(N)
- else if (task == "purge")
- for (var/obj/O in N.seeds)
+ else if(task == "purge")
+ for(var/obj/O in N.seeds)
qdel(O)
piles -= N
qdel(N)
@@ -202,17 +202,17 @@
updateUsrDialog()
/obj/machinery/seed_storage/attackby(var/obj/item/O as obj, var/mob/user as mob)
- if (istype(O, /obj/item/seeds))
+ if(istype(O, /obj/item/seeds))
add(O)
user.visible_message("[user] puts \the [O.name] into \the [src].", "You put \the [O] into \the [src].")
return
- else if (istype(O, /obj/item/weapon/storage/bag/plants))
+ else if(istype(O, /obj/item/weapon/storage/bag/plants))
var/obj/item/weapon/storage/P = O
var/loaded = 0
for(var/obj/item/seeds/G in P.contents)
++loaded
add(G)
- if (loaded)
+ if(loaded)
user.visible_message("[user] puts the seeds from \the [O.name] into \the [src].", "You put the seeds from \the [O.name] into \the [src].")
else
to_chat(user, "There are no seeds in \the [O.name]. ")
@@ -223,7 +223,7 @@
to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].")
/obj/machinery/seed_storage/proc/add(var/obj/item/seeds/O as obj)
- if (istype(O.loc, /mob))
+ if(istype(O.loc, /mob))
var/mob/user = O.loc
user.drop_item(O)
else if(istype(O.loc,/obj/item/weapon/storage))
@@ -233,8 +233,8 @@
O.loc = src
var/newID = 0
- for (var/datum/seed_pile/N in piles)
- if (N.matches(O))
+ for(var/datum/seed_pile/N in piles)
+ if(N.matches(O))
++N.amount
N.seeds += (O)
return
diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm
index c26d5b98bad..21dc0dad4af 100644
--- a/code/modules/hydroponics/spreading/spreading.dm
+++ b/code/modules/hydroponics/spreading/spreading.dm
@@ -259,11 +259,11 @@
die_off()
return
if(2.0)
- if (prob(50))
+ if(prob(50))
die_off()
return
if(3.0)
- if (prob(5))
+ if(prob(5))
die_off()
return
else
diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm
index 74a8d7824dc..e9c63ed8794 100644
--- a/code/modules/hydroponics/trays/tray.dm
+++ b/code/modules/hydroponics/trays/tray.dm
@@ -7,6 +7,8 @@
flags = OPENCONTAINER
volume = 100
+ hud_possible = list (PLANT_NUTRIENT_HUD, PLANT_WATER_HUD, PLANT_STATUS_HUD, PLANT_HEALTH_HUD, PLANT_TOXIN_HUD, PLANT_PEST_HUD, PLANT_WEED_HUD)
+
var/mechanical = 1 // Set to 0 to stop it from drawing the alert lights.
var/base_name = "tray"
@@ -73,10 +75,12 @@
if(weedlevel > 0)
nymph.reagents.add_reagent("nutriment", weedlevel)
weedlevel = 0
+ plant_hud_set_weed()
nymph.visible_message("[nymph] begins rooting through [src], ripping out weeds and eating them noisily. ","You begin rooting through [src], ripping out weeds and eating them noisily. ")
else if(nymph.nutrition > 100 && nutrilevel < 10)
nymph.nutrition -= ((10-nutrilevel)*5)
nutrilevel = 10
+ plant_hud_set_nutrient()
nymph.visible_message("[nymph] secretes a trickle of green liquid, refilling [src]. ","You secrete a trickle of green liquid, refilling [src]. ")
else
nymph.visible_message("[nymph] rolls around in [src] for a bit. ","You roll around in [src] for a bit. ")
@@ -85,6 +89,17 @@
/obj/machinery/portable_atmospherics/hydroponics/New()
..()
+ var/datum/atom_hud/data/hydroponic/hydro_hud = huds[DATA_HUD_HYDROPONIC]
+ prepare_huds()
+ hydro_hud.add_to_hud(src)
+ plant_hud_set_nutrient()
+ plant_hud_set_water()
+ plant_hud_set_status()
+ plant_hud_set_health()
+ plant_hud_set_toxin()
+ plant_hud_set_pest()
+ plant_hud_set_weed()
+
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/hydroponics(null)
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
@@ -101,6 +116,7 @@
if(closed_system)
flags &= ~OPENCONTAINER
+
/obj/machinery/portable_atmospherics/hydroponics/upgraded/New()
..()
component_parts = list()
@@ -112,12 +128,14 @@
/obj/machinery/portable_atmospherics/hydroponics/RefreshParts()
var/tmp_capacity = 0
- for (var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
+ for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
tmp_capacity += M.rating
maxwater = tmp_capacity * 50 // Up to 300
maxnutri = tmp_capacity * 5 // Up to 30
//waterlevel = maxwater
//nutrilevel = 3
+ plant_hud_set_nutrient()
+ plant_hud_set_water()
/obj/machinery/portable_atmospherics/hydroponics/bullet_act(var/obj/item/projectile/Proj)
@@ -150,12 +168,18 @@
die()
check_level_sanity()
update_icon()
+ plant_hud_set_status()
+ plant_hud_set_health()
/obj/machinery/portable_atmospherics/hydroponics/proc/die()
dead = 1
harvest = 0
weedlevel += 1 * HYDRO_SPEED_MULTIPLIER
pestlevel = 0
+ plant_hud_set_status()
+ plant_hud_set_health()
+ plant_hud_set_weed()
+ plant_hud_set_pest()
//Harvests the product of a plant.
/obj/machinery/portable_atmospherics/hydroponics/proc/harvest(var/mob/user)
@@ -233,6 +257,9 @@
pestlevel = 0
sampled = 0
update_icon()
+ plant_hud_set_weed()
+ plant_hud_set_status()
+ plant_hud_set_health()
visible_message("[src] has been overtaken by [seed.display_name]. ")
return
@@ -391,6 +418,14 @@
toxins = max(0,min(toxins,10))
yield_mod = min(100, yield_mod)
+ plant_hud_set_nutrient()
+ plant_hud_set_water()
+ plant_hud_set_status()
+ plant_hud_set_health()
+ plant_hud_set_toxin()
+ plant_hud_set_pest()
+ plant_hud_set_weed()
+
/obj/machinery/portable_atmospherics/hydroponics/proc/mutate_species()
var/previous_plant = seed.display_name
@@ -409,6 +444,9 @@
harvest = 0
weedlevel = 0
+ plant_hud_set_health()
+ plant_hud_set_weed()
+
update_icon()
visible_message("\red The \blue [previous_plant] \red has suddenly mutated into \blue [seed.display_name]!")
@@ -427,7 +465,7 @@
//--FalseIncarnate
//Check if held item is an open container
- if (O.is_open_container())
+ if(O.is_open_container())
//Check if container is of the "glass" subtype (includes buckets, beakers, vials)
if(istype(O, /obj/item/weapon/reagent_containers/glass))
var/obj/item/weapon/reagent_containers/glass/C = O
@@ -471,7 +509,7 @@
update_icon()
//Check if container is any spray container
- else if (istype(O, /obj/item/weapon/reagent_containers/spray))
+ else if(istype(O, /obj/item/weapon/reagent_containers/spray))
var/obj/item/weapon/reagent_containers/spray/S = O
//Check if there is a plant in the tray
if(seed)
@@ -537,7 +575,7 @@
var/obj/item/weapon/reagent_containers/syringe/S = O
- if (S.mode == 1)
+ if(S.mode == 1)
if(seed)
return ..()
else
@@ -551,7 +589,7 @@
to_chat(user, "There's nothing to draw something from.")
return 1
- else if (istype(O, /obj/item/seeds))
+ else if(istype(O, /obj/item/seeds))
if(!seed)
@@ -579,21 +617,22 @@
else
to_chat(user, "\The [src] already has seeds in it! ")
- else if (istype(O, /obj/item/weapon/minihoe)) // The minihoe
+ else if(istype(O, /obj/item/weapon/minihoe)) // The minihoe
if(weedlevel > 0)
user.visible_message("[user] starts uprooting the weeds. ", "You remove the weeds from the [src]. ")
weedlevel = 0
update_icon()
+ plant_hud_set_weed()
else
to_chat(user, "This plot is completely devoid of weeds. It doesn't need uprooting. ")
- else if (istype(O, /obj/item/weapon/storage/bag/plants))
+ else if(istype(O, /obj/item/weapon/storage/bag/plants))
attack_hand(user)
var/obj/item/weapon/storage/bag/plants/S = O
- for (var/obj/item/weapon/reagent_containers/food/snacks/grown/G in locate(user.x,user.y,user.z))
+ for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in locate(user.x,user.y,user.z))
if(!S.can_be_inserted(G))
return
S.handle_item_insertion(G, 1)
@@ -608,8 +647,8 @@
anchored = !anchored
to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].")
- else if ((istype(O, /obj/item/weapon/tank) && !( src.destroyed )))
- if (src.holding)
+ else if((istype(O, /obj/item/weapon/tank) && !( src.destroyed )))
+ if(src.holding)
to_chat(user, "\blue There is alreadu a tank loaded into the [src].")
return
var/obj/item/weapon/tank/T = O
diff --git a/code/modules/hydroponics/trays/tray_apiary.dm b/code/modules/hydroponics/trays/tray_apiary.dm
index 25a2698d274..9ecf2bcb2fc 100644
--- a/code/modules/hydroponics/trays/tray_apiary.dm
+++ b/code/modules/hydroponics/trays/tray_apiary.dm
@@ -36,7 +36,7 @@
if(!yieldmod)
yieldmod += 1
// to_chat(world, "Yield increased by 1, from 0, to a total of [myseed.yield]")
- else if (prob(1/(yieldmod * yieldmod) *100))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2...
+ else if(prob(1/(yieldmod * yieldmod) *100))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2...
yieldmod += 1
// to_chat(world, "Yield increased by 1, to a total of [myseed.yield]")
else
diff --git a/code/modules/hydroponics/trays/tray_process.dm b/code/modules/hydroponics/trays/tray_process.dm
index 855d053008c..03568731dc5 100644
--- a/code/modules/hydroponics/trays/tray_process.dm
+++ b/code/modules/hydroponics/trays/tray_process.dm
@@ -21,10 +21,11 @@
// Bonus chance if the tray is unoccupied.
if(waterlevel > 10 && nutrilevel > 2 && prob(isnull(seed) ? 6 : 3))
weedlevel += 1 * HYDRO_SPEED_MULTIPLIER
+ plant_hud_set_weed()
// There's a chance for a weed explosion to happen if the weeds take over.
// Plants that are themselves weeds (weed_tolerance > 10) are unaffected.
- if (weedlevel >= 10 && prob(10))
+ if(weedlevel >= 10 && prob(10))
if(!seed || weedlevel >= seed.get_trait(TRAIT_WEED_TOLERANCE))
weed_invasion()
@@ -48,8 +49,10 @@
// Maintain tray nutrient and water levels.
if(seed.get_trait(TRAIT_NUTRIENT_CONSUMPTION) > 0 && nutrilevel > 0 && prob(25))
nutrilevel -= max(0,seed.get_trait(TRAIT_NUTRIENT_CONSUMPTION) * HYDRO_SPEED_MULTIPLIER)
+ plant_hud_set_nutrient()
if(seed.get_trait(TRAIT_WATER_CONSUMPTION) > 0 && waterlevel > 0 && prob(25))
waterlevel -= max(0,seed.get_trait(TRAIT_WATER_CONSUMPTION) * HYDRO_SPEED_MULTIPLIER)
+ plant_hud_set_water()
// Make sure the plant is not starving or thirsty. Adequate
// water and nutrients will cause a plant to become healthier.
@@ -81,7 +84,7 @@
T.air_update_turf()
// If we're attached to a pipenet, then we should let the pipenet know we might have modified some gasses
- if (closed_system && connected_port)
+ if(closed_system && connected_port)
connected_port.parent.update = 1
// Toxin levels beyond the plant's tolerance cause damage, but
@@ -91,6 +94,7 @@
if(toxins > seed.get_trait(TRAIT_TOXINS_TOLERANCE))
health -= toxin_uptake
toxins -= toxin_uptake
+ plant_hud_set_toxin()
// Check for pests and weeds.
// Some carnivorous plants happily eat pests.
@@ -98,16 +102,18 @@
if(seed.get_trait(TRAIT_CARNIVOROUS))
health += HYDRO_SPEED_MULTIPLIER
pestlevel -= HYDRO_SPEED_MULTIPLIER
- else if (pestlevel >= seed.get_trait(TRAIT_PEST_TOLERANCE))
+ else if(pestlevel >= seed.get_trait(TRAIT_PEST_TOLERANCE))
health -= HYDRO_SPEED_MULTIPLIER
+ plant_hud_set_pest()
// Some plants thrive and live off of weeds.
if(weedlevel > 0)
if(seed.get_trait(TRAIT_PARASITE))
health += HYDRO_SPEED_MULTIPLIER
weedlevel -= HYDRO_SPEED_MULTIPLIER
- else if (weedlevel >= seed.get_trait(TRAIT_WEED_TOLERANCE))
+ else if(weedlevel >= seed.get_trait(TRAIT_WEED_TOLERANCE))
health -= HYDRO_SPEED_MULTIPLIER
+ plant_hud_set_weed()
// Handle life and death.
// If the plant gets too old, begin killing it each cycle
diff --git a/code/modules/hydroponics/trays/tray_reagents.dm b/code/modules/hydroponics/trays/tray_reagents.dm
index 8f7e4f5e836..e4f68e6d106 100644
--- a/code/modules/hydroponics/trays/tray_reagents.dm
+++ b/code/modules/hydroponics/trays/tray_reagents.dm
@@ -11,7 +11,7 @@
var/reagent_total = reagents.get_reagent_amount(R.id)
- //These are here because they have checks that would clutter up the switch statement cases, and thus get handled after the switch (readability)
+ //These are here because they have checks that would clutter up the switch statement cases, and thus get handled after the switch(readability)
var/water_value = 0
var/health_value = 0
var/production_stat_value = 0
diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm
index 1dea731ff54..b1ee10cc075 100644
--- a/code/modules/hydroponics/trays/tray_tools.dm
+++ b/code/modules/hydroponics/trays/tray_tools.dm
@@ -313,7 +313,8 @@
throw_range = 3
w_class = 4
var/extend = 1
- flags = NOSHIELD | CONDUCT
+ flags = CONDUCT
+ armour_penetration = 20
slot_flags = SLOT_BACK
origin_tech = "materials=2;combat=2"
attack_verb = list("chopped", "sliced", "cut", "reaped")
@@ -336,9 +337,9 @@
edge = 0
throw_speed = 2
throw_range = 3
- w_class = 2.0
+ w_class = 2
extend = 0
- flags = NOSHIELD
+ armour_penetration = 20
slot_flags = SLOT_BELT
origin_tech = "materials=3;combat=3"
attack_verb = list("chopped", "sliced", "cut", "reaped")
@@ -373,7 +374,7 @@
H.update_inv_l_hand()
H.update_inv_r_hand()
add_fingerprint(user)
- if (!blood_DNA) return
+ if(!blood_DNA) return
if(blood_overlay && (blood_DNA.len >= 1)) //updates blood overlay, if any
overlays.Cut()//this might delete other item overlays as well but eeeeeeeh
@@ -396,7 +397,7 @@
anchored = 0.0
var/matter = 0
var/mode = 1
- w_class = 3.0
+ w_class = 3
/obj/item/weapon/bananapeel
name = "banana peel"
@@ -404,7 +405,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "banana_peel"
item_state = "banana_peel"
- w_class = 1.0
+ w_class = 1
throwforce = 0
throw_speed = 4
throw_range = 20
@@ -415,7 +416,7 @@
icon = 'icons/obj/harvest.dmi'
icon_state = "corncob"
item_state = "corncob"
- w_class = 1.0
+ w_class = 1
throwforce = 0
throw_speed = 4
throw_range = 20
diff --git a/code/modules/karma/karma.dm b/code/modules/karma/karma.dm
index 9c40f005a21..fa765fd244b 100644
--- a/code/modules/karma/karma.dm
+++ b/code/modules/karma/karma.dm
@@ -182,7 +182,7 @@ You've gained [totalkarma] total karma in your time here. "}
dat += " "
switch(karma_tab)
- if (0) // Job Unlocks
+ if(0) // Job Unlocks
dat += {"
Unlock Barber -- 5KP
Unlock Brig Physician -- 5KP
@@ -193,7 +193,7 @@ You've gained [totalkarma] total karma in your time here. "}
Unlock Magistrate -- 45KP
"}
- if (1) // Species Unlocks
+ if(1) // Species Unlocks
dat += {"
Unlock Machine People -- 15KP
Unlock Kidan -- 30KP
@@ -204,7 +204,7 @@ You've gained [totalkarma] total karma in your time here. "}
Unlock Plasmaman -- 100KP
"}
- if (2) // Karma Refunds
+ if(2) // Karma Refunds
var/list/refundable = list()
var/list/purchased = checkpurchased()
if("Tajaran Ambassador" in purchased)
diff --git a/code/modules/library/computers/base.dm b/code/modules/library/computers/base.dm
index b24c7e7dbbf..360cda83d74 100644
--- a/code/modules/library/computers/base.dm
+++ b/code/modules/library/computers/base.dm
@@ -19,8 +19,8 @@
if(stat & (BROKEN | NOPOWER))
return 1
- if (!Adjacent(user))
- if (!issilicon(user) && !isobserver(user))
+ if(!Adjacent(user))
+ if(!issilicon(user) && !isobserver(user))
user.unset_machine()
user << browse(null, "window=library")
return 1
diff --git a/code/modules/library/computers/checkout.dm b/code/modules/library/computers/checkout.dm
index 2746aed857e..ff62f15c276 100644
--- a/code/modules/library/computers/checkout.dm
+++ b/code/modules/library/computers/checkout.dm
@@ -435,7 +435,7 @@
return
if(bibledelay)
- for (var/mob/V in hearers(src))
+ for(var/mob/V in hearers(src))
V.show_message("[src] 's monitor flashes, \"Printer unavailable. Please allow a short time before attempting to print.\"")
else
bibledelay = 1
@@ -456,7 +456,7 @@
return
var/obj/item/weapon/book/B = new newbook.path(loc)
- if (!newbook.programmatic)
+ if(!newbook.programmatic)
B.name = "Book: [newbook.title]"
B.title = newbook.title
B.author = newbook.author
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index f7729af3578..4d58fee8e11 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -26,6 +26,7 @@
/obj/item/weapon/storage/bible)
/obj/structure/bookcase/initialize()
+ ..()
for(var/obj/item/I in loc)
if(is_type_in_list(I, valid_types))
I.forceMove(src)
@@ -69,7 +70,7 @@
if("brute")
health -= O.force * 0.75
else
- if (health <= 0)
+ if(health <= 0)
visible_message("The bookcase is smashed apart! ")
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
@@ -288,7 +289,7 @@
icon_state ="scanner"
throw_speed = 1
throw_range = 5
- w_class = 1.0
+ w_class = 1
var/obj/machinery/computer/library/checkout/computer // Associated computer - Modes 1 to 3 use this
var/obj/item/weapon/book/book // Currently scanned book
var/mode = 0 // 0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory
diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm
index f2dede3b8ba..525de63a0af 100644
--- a/code/modules/lighting/lighting_overlay.dm
+++ b/code/modules/lighting/lighting_overlay.dm
@@ -9,6 +9,7 @@
invisibility = INVISIBILITY_LIGHTING
color = "#000000"
icon_state = "light1"
+ auto_init = 0 // doesn't need special init
var/lum_r
var/lum_g
@@ -104,4 +105,4 @@
if(istype(T))
T.lighting_overlay = null
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/modules/martial_arts/martial.dm b/code/modules/martial_arts/martial.dm
index d128e22c0f6..0ca98c921d8 100644
--- a/code/modules/martial_arts/martial.dm
+++ b/code/modules/martial_arts/martial.dm
@@ -181,7 +181,7 @@
attack_verb = list("smashed", "slammed", "whacked", "thwacked")
icon = 'icons/obj/weapons.dmi'
icon_state = "bostaff0"
-
+ block_chance = 50
/obj/item/weapon/twohanded/bostaff/update_icon()
icon_state = "bostaff[wielded]"
@@ -239,8 +239,7 @@
return ..()
return ..()
-/obj/item/weapon/twohanded/bostaff/IsShield()
+/obj/item/weapon/twohanded/bostaff/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance)
if(wielded)
- return 1
- else
- return 0
\ No newline at end of file
+ return ..()
+ return 0
\ No newline at end of file
diff --git a/code/modules/martial_arts/sleeping_carp.dm b/code/modules/martial_arts/sleeping_carp.dm
index 3202f8fbe27..bc4e15eb598 100644
--- a/code/modules/martial_arts/sleeping_carp.dm
+++ b/code/modules/martial_arts/sleeping_carp.dm
@@ -38,6 +38,8 @@
D.visible_message("[A] grabs [D]'s wrist and wrenches it sideways! ", \
"[A] grabs your wrist and violently wrenches it to the side! ")
playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ if(prob(60))
+ A.say(pick("WRISTY TWIRLY!", "WE FIGHT LIKE MEN!", "YOU DISHONOR YOURSELF!", "POHYAH!", "WHERE IS YOUR BATON NOW?", "SAY UNCLE!"))
D.emote("scream")
D.drop_item()
D.apply_damage(5, BRUTE, pick("l_arm", "r_arm"))
@@ -53,6 +55,8 @@
step_to(D,get_step(D,D.dir),1)
D.Weaken(4)
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
+ if(prob(80))
+ A.say(pick("SURRPRIZU!","BACK STRIKE!","WOPAH!", "WATAAH", "ZOTA!", "Never turn your back to the enemy!"))
return 1
return basic_hit(A,D)
@@ -65,6 +69,8 @@
D.losebreath += 3
D.Stun(2)
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
+ if(prob(80))
+ A.say(pick("HWOP!", "KUH!", "YAKUUH!", "KYUH!", "KNEESTRIKE!"))
return 1
return basic_hit(A,D)
@@ -76,6 +82,8 @@
D.apply_damage(20, BRUTE, "head")
D.drop_item()
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
+ if(prob(60))
+ A.say(pick("OOHYOO!", "OOPYAH!", "HYOOAA!", "WOOAAA!", "SHURYUKICK!", "HIYAH!"))
D.Stun(4)
return 1
return basic_hit(A,D)
@@ -89,6 +97,8 @@
D.death() //FINISH HIM!
D.apply_damage(50, BRUTE, "chest")
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 75, 1, -1)
+ if(prob(80))
+ A.say(pick("BANZAIII!", "KIYAAAA!", "OMAE WA MOU SHINDEIRU!", "YOU CAN'T SEE ME!", "MY TIME IS NOW!", "COWABUNGA"))
return 1
return basic_hit(A,D)
@@ -111,6 +121,8 @@
"[A] [atk_verb] you! ")
D.apply_damage(rand(10,15), BRUTE)
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, 1, -1)
+ if(prob(50))
+ A.say(pick("HUAH!", "HYA!", "CHOO!", "WUO!", "KYA!", "HUH!", "HIYOH!", "CARP STRIKE!", "CARP BITE!"))
if(prob(D.getBruteLoss()) && !D.lying)
D.visible_message("[D] stumbles and falls! ", "The blow sends you to the ground! ")
D.Weaken(4)
diff --git a/code/modules/media/broadcast/receivers/radio.dm b/code/modules/media/broadcast/receivers/radio.dm
index 7b9c4ad7b15..a0d94dcbf31 100644
--- a/code/modules/media/broadcast/receivers/radio.dm
+++ b/code/modules/media/broadcast/receivers/radio.dm
@@ -8,6 +8,7 @@
var/on=0
/obj/machinery/media/receiver/boombox/initialize()
+ ..()
if(on)
update_on()
update_icon()
@@ -80,4 +81,4 @@
if(on)
icon_state="wallradio-p"
else
- icon_state="wallradio"
\ No newline at end of file
+ icon_state="wallradio"
diff --git a/code/modules/media/broadcast/transmitters/broadcast.dm b/code/modules/media/broadcast/transmitters/broadcast.dm
index d8607851752..898771b496d 100644
--- a/code/modules/media/broadcast/transmitters/broadcast.dm
+++ b/code/modules/media/broadcast/transmitters/broadcast.dm
@@ -19,6 +19,7 @@
var/const/MAX_TEMP=70 // Celsius
/obj/machinery/media/transmitter/broadcast/initialize()
+ ..()
testing("[type]/initialize() called!")
if(autolink && autolink.len)
for(var/obj/machinery/media/source in orange(20, src))
diff --git a/code/modules/media/jukebox.dm b/code/modules/media/jukebox.dm
index 9cea989fde7..ae33c38dcc4 100644
--- a/code/modules/media/jukebox.dm
+++ b/code/modules/media/jukebox.dm
@@ -183,12 +183,12 @@ var/global/loopModeNames=list(
to_chat(usr, "\red You touch the bluescreened menu. Nothing happens. You feel dumber.")
return
- if (href_list["power"])
+ if(href_list["power"])
playing=!playing
update_music()
update_icon()
- if (href_list["playlist"])
+ if(href_list["playlist"])
if(!check_reload())
to_chat(usr, "\red You must wait 60 seconds between playlist reloads.")
return
@@ -199,12 +199,12 @@ var/global/loopModeNames=list(
update_music()
update_icon()
- if (href_list["song"])
+ if(href_list["song"])
current_song=Clamp(text2num(href_list["song"]),1,playlist.len)
update_music()
update_icon()
- if (href_list["mode"])
+ if(href_list["mode"])
loop_mode = (loop_mode % JUKEMODE_COUNT) + 1
return attack_hand(usr)
@@ -218,7 +218,7 @@ var/global/loopModeNames=list(
if(response)
var/json = file2text(response["CONTENT"])
if("/>" in json)
- visible_message("\icon[src] \The [src] buzzes, unable to update its playlist. ","You hear a buzz. ")
+ visible_message("[bicon(src)] \The [src] buzzes, unable to update its playlist. ","You hear a buzz. ")
stat &= BROKEN
update_icon()
return
@@ -226,11 +226,11 @@ var/global/loopModeNames=list(
for(var/list/record in songdata)
playlist += new /datum/song_info(record)
if(playlist.len==0)
- visible_message("\icon[src] \The [src] buzzes, unable to update its playlist. ","You hear a buzz. ")
+ visible_message("[bicon(src)] \The [src] buzzes, unable to update its playlist. ","You hear a buzz. ")
stat &= BROKEN
update_icon()
return
- visible_message("\icon[src] \The [src] beeps, and the menu on its front fills with [playlist.len] items. ","You hear a beep. ")
+ visible_message("[bicon(src)] \The [src] beeps, and the menu on its front fills with [playlist.len] items. ","You hear a beep. ")
if(autoplay)
playing=1
autoplay=0
@@ -261,8 +261,8 @@ var/global/loopModeNames=list(
var/datum/song_info/song = playlist[current_song]
media_url = song.url
media_start_time = world.time
- visible_message("\icon[src] \The [src] begins to play [song.display()]. ","You hear music. ")
- //visible_message("\icon[src] \The [src] warbles: [song.length/10]s @ [song.url]")
+ visible_message("[bicon(src)] \The [src] begins to play [song.display()]. ","You hear music. ")
+ //visible_message("[bicon(src)] \The [src] warbles: [song.length/10]s @ [song.url]")
else
media_url=""
media_start_time = 0
diff --git a/code/modules/media/mediamanager.dm b/code/modules/media/mediamanager.dm
index d78afc6f9f2..125b224c8ea 100644
--- a/code/modules/media/mediamanager.dm
+++ b/code/modules/media/mediamanager.dm
@@ -51,26 +51,21 @@ if(vlc.attachEvent) {
"}
// Hook into the events we desire.
-/hook_handler/soundmanager
- // Set up player on login
- proc/OnLogin(var/list/args)
- //testing("Received OnLogin.")
- var/client/C = args["client"]
- C.media = new /datum/media_manager(args["mob"])
- C.media.open()
- spawn(20)
- C.media.update_music()
+/hook/mob_login/proc/init_media_manager(client/client, mob/mob)
+ client.media = new /datum/media_manager(mob)
+ client.media.open()
+ spawn(20)
+ client.media.update_music()
+ return 1
// Update when moving between areas.
- proc/OnMobAreaChange(var/list/args)
- var/mob/M = args["mob"]
- //if(istype(M, /mob/living/carbon/human)||istype(M, /mob/dead/observer))
- // testing("Received OnMobAreaChange for [M.type] [M] (M.client=[M.client==null?"null":"/client"]).")
- if(M.client)
- M.update_music()
+/hook/mob_area_change/proc/update_media(mob/mob, area/newarea, area/oldarea)
+ if(mob.client)
+ mob.update_music()
+ return 1
/mob/proc/update_music()
- if (client && client.media)
+ if(client && client.media)
client.media.update_music()
//else
// testing("[src] - client: [client?"Y":"N"]; client.media: [client && client.media ? "Y":"N"]")
@@ -124,7 +119,7 @@ to_chat(#define MP_DEBUG(x) owner, x)
var/targetURL = ""
var/targetStartTime = 0
- if (!owner)
+ if(!owner)
//testing("owner is null")
return
@@ -141,7 +136,7 @@ to_chat(#define MP_DEBUG(x) owner, x)
//else
// testing("M is not playing or null.")
- if (url != targetURL || abs(targetStartTime - start_time) > 1)
+ if(url != targetURL || abs(targetStartTime - start_time) > 1)
url = targetURL
start_time = targetStartTime
send_update()
diff --git a/code/modules/mining/abandonedcrates.dm b/code/modules/mining/abandonedcrates.dm
index 3e9580ef14b..cd229550880 100644
--- a/code/modules/mining/abandonedcrates.dm
+++ b/code/modules/mining/abandonedcrates.dm
@@ -156,12 +156,12 @@
to_chat(user, "The crate is locked with a Deca-code lock. ")
var/input = input(usr, "Enter [codelen] digits.", "Deca-Code Lock", "") as text
if(in_range(src, user))
- if (input == code)
+ if(input == code)
to_chat(user, "The crate unlocks! ")
locked = 0
overlays.Cut()
overlays += "securecrateg"
- else if (input == null || length(input) != codelen)
+ else if(input == null || length(input) != codelen)
to_chat(user, "You leave the crate alone. ")
else
to_chat(user, "A red light flashes. ")
diff --git a/code/modules/mining/coins.dm b/code/modules/mining/coins.dm
index a8ac5e1a88c..83f9c871f44 100644
--- a/code/modules/mining/coins.dm
+++ b/code/modules/mining/coins.dm
@@ -7,7 +7,7 @@
flags = CONDUCT
force = 1
throwforce = 2
- w_class = 1.0
+ w_class = 1
var/string_attached
var/list/sideslist = list("heads","tails")
var/cmineral = null
@@ -105,7 +105,7 @@
to_chat(user, "There already is a string attached to this coin. ")
return
- if (CC.use(1))
+ if(CC.use(1))
overlays += image('icons/obj/items.dmi',"coin_string_overlay")
string_attached = 1
to_chat(user, "You attach a string to the coin. ")
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index 1320423a4e8..d3a65e3c0bf 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -19,7 +19,7 @@
var/ore_pickup_rate = 15
var/sheet_per_ore = 1
var/point_upgrade = 1
- var/list/ore_values = list(("sand" = 1), ("iron" = 1), ("plasma" = 15), ("silver" = 16), ("gold" = 18), ("uranium" = 30), ("diamond" = 50), ("bananium" = 60), ("tranquillite" = 60))
+ var/list/ore_values = list(("sand" = 1), ("iron" = 1), ("plasma" = 15), ("silver" = 16), ("gold" = 18), ("uranium" = 30), ("diamond" = 50), ("bluespace crystal" = 50), ("bananium" = 60), ("tranquillite" = 60))
var/list/supply_consoles = list("Science", "Robotics", "Research Director's Desk", "Mechanic", "Engineering" = list("metal", "glass", "plasma"), "Chief Engineer's Desk" = list("metal", "glass", "plasma"), "Atmospherics" = list("metal", "glass", "plasma"), "Bar" = list("uranium", "plasma"), "Virology" = list("plasma", "uranium", "gold"))
/obj/machinery/mineral/ore_redemption/New()
@@ -84,9 +84,9 @@
var/i = 0
if(T)
for(var/obj/item/weapon/ore/O in T)
- if (i >= ore_pickup_rate)
+ if(i >= ore_pickup_rate)
break
- else if (!O || !O.refined_type)
+ else if(!O || !O.refined_type)
continue
else
process_sheet(O)
@@ -95,16 +95,16 @@
var/obj/structure/ore_box/B = locate() in T
if(B)
for(var/obj/item/weapon/ore/O in B.contents)
- if (i >= ore_pickup_rate)
+ if(i >= ore_pickup_rate)
break
- else if (!O || !O.refined_type)
+ else if(!O || !O.refined_type)
continue
else
process_sheet(O)
i++
/obj/machinery/mineral/ore_redemption/attackby(var/obj/item/weapon/W, var/mob/user, params)
- if (!powered())
+ if(!powered())
return
if(istype(W,/obj/item/weapon/card/id))
var/obj/item/weapon/card/id/I = usr.get_active_hand()
@@ -425,7 +425,7 @@
if(href_list["purchase"])
if(istype(inserted_id))
var/datum/data/mining_equipment/prize = locate(href_list["purchase"])
- if (!prize || !(prize in prize_list))
+ if(!prize || !(prize in prize_list))
return
if(prize.cost > inserted_id.mining_points)
else
@@ -521,7 +521,7 @@
icon_state = "Jaunter"
item_state = "electronic"
throwforce = 0
- w_class = 2.0
+ w_class = 2
throw_speed = 3
throw_range = 5
origin_tech = "bluespace=2"
@@ -677,7 +677,7 @@
/obj/item/weapon/mining_drone_cube
name = "mining drone cube"
desc = "Compressed mining drone, ready for deployment. Just press the button to activate!"
- w_class = 2.0
+ w_class = 2
icon = 'icons/obj/aibots.dmi'
icon_state = "minedronecube"
item_state = "electronic"
@@ -731,13 +731,13 @@
if(istype(I, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/W = I
if(W.welding && !stat)
- if(AIStatus == AI_ON)
+ if(FindTarget())//if the bot has anything to shoot at, to prevent combat repair cheesing
to_chat(user, "[src] is moving around too much to repair! ")
return
if(maxHealth == health)
to_chat(user, "[src] is at full integrity. ")
else
- health += 10
+ adjustHealth(-10)//actually repairs the bot, not damages it
to_chat(user, "You repair some of the armor on [src]. ")
return
if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner))
@@ -902,7 +902,7 @@
icon_state = "lazarus_hypo"
item_state = "hypo"
throwforce = 0
- w_class = 2.0
+ w_class = 2
throw_speed = 3
throw_range = 5
var/loaded = 1
@@ -958,14 +958,15 @@
/**********************Mining Scanner**********************/
/obj/item/device/mining_scanner
- desc = "A scanner that checks surrounding rock for useful minerals, it can also be used to stop gibtonite detonations. Requires you to wear mesons to work properly."
- name = "mining scanner"
+ desc = "A scanner that checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results."
+ name = "manual mining scanner"
icon_state = "mining1"
item_state = "analyzer"
- w_class = 2.0
+ w_class = 2
flags = CONDUCT
slot_flags = SLOT_BELT
var/cooldown = 0
+ origin_tech = "engineering=1;magnets=1"
/obj/item/device/mining_scanner/attack_self(mob/user)
if(!user.client)
@@ -989,29 +990,51 @@
qdel(src)
/obj/item/device/t_scanner/adv_mining_scanner
- desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Requires you to wear mesons to function properly."
- name = "advanced mining scanner"
+ desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear meson scanners for optimal results. This one has an extended range."
+ name = "advanced automatic mining scanner"
icon_state = "mining0"
item_state = "analyzer"
- w_class = 2.0
+ w_class = 2
flags = CONDUCT
slot_flags = SLOT_BELT
- var/cooldown = 0
+ var/cooldown = 35
+ var/on_cooldown = 0
+ var/range = 7
+ var/meson = TRUE
+ origin_tech = "engineering=3;magnets=3"
/obj/item/device/t_scanner/adv_mining_scanner/cyborg
flags = CONDUCT | NODROP
+/obj/item/device/t_scanner/adv_mining_scanner/material
+ meson = FALSE
+ desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results. This one has an extended range."
+
+/obj/item/device/t_scanner/adv_mining_scanner/lesser
+ name = "automatic mining scanner"
+ desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear meson scanners for optimal results."
+ range = 4
+ cooldown = 50
+
+/obj/item/device/t_scanner/adv_mining_scanner/lesser/material
+ desc = "A scanner that automatically checks surrounding rock for useful minerals; it can also be used to stop gibtonite detonations. Wear material scanners for optimal results."
+ meson = FALSE
+
/obj/item/device/t_scanner/adv_mining_scanner/scan()
- if(!cooldown)
- cooldown = 1
- spawn(35)
- cooldown = 0
+ if(!on_cooldown)
+ on_cooldown = 1
+ spawn(cooldown)
+ on_cooldown = 0
var/turf/t = get_turf(src)
var/list/mobs = recursive_mob_check(t, client_check = 1, sight_check = 0, include_radio = 0)
if(!mobs.len)
return
- mineral_scan_pulse(mobs, t)
+ if(meson)
+ mineral_scan_pulse(mobs, t, range)
+ else
+ mineral_scan_pulse_material(mobs, t, range)
+//For use with mesons
/proc/mineral_scan_pulse(list/mobs, turf/T, range = world.view)
var/list/minerals = list()
for(var/turf/simulated/mineral/M in range(range, T))
@@ -1029,6 +1052,26 @@
if(C)
C.images -= I
+//For use with material scanners
+/proc/mineral_scan_pulse_material(list/mobs, turf/T, range = world.view)
+ var/list/minerals = list()
+ for(var/turf/simulated/mineral/M in range(range, T))
+ if(M.scan_state)
+ minerals += M
+ if(minerals.len)
+ for(var/turf/simulated/mineral/M in minerals)
+ var/obj/effect/overlay/temp/mining_overlay/C = new/obj/effect/overlay/temp/mining_overlay(M)
+ C.icon_state = M.scan_state
+
+/obj/effect/overlay/temp/mining_overlay
+ layer = 18
+ icon = 'icons/turf/mining.dmi'
+ anchored = 1
+ mouse_opacity = 0
+ duration = 30
+ pixel_x = -4
+ pixel_y = -4
+
/**********************Xeno Warning Sign**********************/
/obj/structure/sign/xeno_warning_mining
name = "DANGEROUS ALIEN LIFE"
diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm
index 47c9c45dbc3..ce6dcc15eb1 100644
--- a/code/modules/mining/laborcamp/laborstacker.dm
+++ b/code/modules/mining/laborcamp/laborstacker.dm
@@ -28,7 +28,7 @@
t = d.id_tag
if(t == src.door_tag)
src.release_door = d
- if (machine && (release_door || !use_release_door))
+ if(machine && (release_door || !use_release_door))
machine.CONSOLE = src
else
qdel(src)
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index b83a2001bb0..23bf8ab532f 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -13,7 +13,7 @@
..()
spawn(7)
src.machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir))
- if (machine)
+ if(machine)
machine.CONSOLE = src
else
qdel(src)
@@ -24,7 +24,7 @@
//iron
if(machine.ore_iron || machine.ore_glass || machine.ore_plasma || machine.ore_uranium || machine.ore_gold || machine.ore_silver || machine.ore_diamond || machine.ore_clown || machine.ore_mime || machine.ore_adamantine)
if(machine.ore_iron)
- if (machine.selected_iron==1)
+ if(machine.selected_iron==1)
dat += text("Smelting ")
else
dat += text("Not smelting ")
@@ -34,7 +34,7 @@
//sand - glass
if(machine.ore_glass)
- if (machine.selected_glass==1)
+ if(machine.selected_glass==1)
dat += text("Smelting ")
else
dat += text("Not smelting ")
@@ -44,7 +44,7 @@
//plasma
if(machine.ore_plasma)
- if (machine.selected_plasma==1)
+ if(machine.selected_plasma==1)
dat += text("Smelting ")
else
dat += text("Not smelting ")
@@ -54,7 +54,7 @@
//uranium
if(machine.ore_uranium)
- if (machine.selected_uranium==1)
+ if(machine.selected_uranium==1)
dat += text("Smelting ")
else
dat += text("Not smelting ")
@@ -64,7 +64,7 @@
//gold
if(machine.ore_gold)
- if (machine.selected_gold==1)
+ if(machine.selected_gold==1)
dat += text("Smelting ")
else
dat += text("Not smelting ")
@@ -74,7 +74,7 @@
//silver
if(machine.ore_silver)
- if (machine.selected_silver==1)
+ if(machine.selected_silver==1)
dat += text("Smelting ")
else
dat += text("Not smelting ")
@@ -84,7 +84,7 @@
//diamond
if(machine.ore_diamond)
- if (machine.selected_diamond==1)
+ if(machine.selected_diamond==1)
dat += text("Smelting ")
else
dat += text("Not smelting ")
@@ -94,7 +94,7 @@
//bananium
if(machine.ore_clown)
- if (machine.selected_clown==1)
+ if(machine.selected_clown==1)
dat += text("Smelting ")
else
dat += text("Not smelting ")
@@ -104,7 +104,7 @@
//tranquillite
if(machine.ore_mime)
- if (machine.selected_mime==1)
+ if(machine.selected_mime==1)
dat += text("Smelting ")
else
dat += text("Not smelting ")
@@ -115,7 +115,7 @@
//On or off
dat += text("Machine is currently ")
- if (machine.on==1)
+ if(machine.on==1)
dat += text("On ")
else
dat += text("Off ")
@@ -131,52 +131,52 @@
usr.set_machine(src)
src.add_fingerprint(usr)
if(href_list["sel_iron"])
- if (href_list["sel_iron"] == "yes")
+ if(href_list["sel_iron"] == "yes")
machine.selected_iron = 1
else
machine.selected_iron = 0
if(href_list["sel_glass"])
- if (href_list["sel_glass"] == "yes")
+ if(href_list["sel_glass"] == "yes")
machine.selected_glass = 1
else
machine.selected_glass = 0
if(href_list["sel_plasma"])
- if (href_list["sel_plasma"] == "yes")
+ if(href_list["sel_plasma"] == "yes")
machine.selected_plasma = 1
else
machine.selected_plasma = 0
if(href_list["sel_uranium"])
- if (href_list["sel_uranium"] == "yes")
+ if(href_list["sel_uranium"] == "yes")
machine.selected_uranium = 1
else
machine.selected_uranium = 0
if(href_list["sel_gold"])
- if (href_list["sel_gold"] == "yes")
+ if(href_list["sel_gold"] == "yes")
machine.selected_gold = 1
else
machine.selected_gold = 0
if(href_list["sel_silver"])
- if (href_list["sel_silver"] == "yes")
+ if(href_list["sel_silver"] == "yes")
machine.selected_silver = 1
else
machine.selected_silver = 0
if(href_list["sel_diamond"])
- if (href_list["sel_diamond"] == "yes")
+ if(href_list["sel_diamond"] == "yes")
machine.selected_diamond = 1
else
machine.selected_diamond = 0
if(href_list["sel_clown"])
- if (href_list["sel_clown"] == "yes")
+ if(href_list["sel_clown"] == "yes")
machine.selected_clown = 1
else
machine.selected_clown = 0
if(href_list["sel_mime"])
- if (href_list["sel_mime"] == "yes")
+ if(href_list["sel_mime"] == "yes")
machine.selected_mime = 1
else
machine.selected_mime = 0
if(href_list["set_on"])
- if (href_list["set_on"] == "on")
+ if(href_list["set_on"] == "on")
machine.on = 1
else
machine.on = 0
@@ -216,82 +216,82 @@
/obj/machinery/mineral/processing_unit/process()
var/i
- for (i = 0; i < 10; i++)
- if (on)
- if (selected_glass == 1 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0)
- if (ore_glass > 0)
+ for(i = 0; i < 10; i++)
+ if(on)
+ if(selected_glass == 1 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0)
+ if(ore_glass > 0)
ore_glass--;
generate_mineral(/obj/item/stack/sheet/glass)
else
on = 0
continue
- if (selected_glass == 1 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0 && selected_mime == 0)
- if (ore_glass > 0 && ore_iron > 0)
+ if(selected_glass == 1 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0 && selected_mime == 0)
+ if(ore_glass > 0 && ore_iron > 0)
ore_glass--;
ore_iron--;
generate_mineral(/obj/item/stack/sheet/rglass)
else
on = 0
continue
- if (selected_glass == 0 && selected_gold == 1 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0)
- if (ore_gold > 0)
+ if(selected_glass == 0 && selected_gold == 1 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0)
+ if(ore_gold > 0)
ore_gold--;
generate_mineral(/obj/item/stack/sheet/mineral/gold)
else
on = 0
continue
- if (selected_glass == 0 && selected_gold == 0 && selected_silver == 1 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0)
- if (ore_silver > 0)
+ if(selected_glass == 0 && selected_gold == 0 && selected_silver == 1 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0)
+ if(ore_silver > 0)
ore_silver--;
generate_mineral(/obj/item/stack/sheet/mineral/silver)
else
on = 0
continue
- if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 1 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0)
- if (ore_diamond > 0)
+ if(selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 1 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0)
+ if(ore_diamond > 0)
ore_diamond--;
generate_mineral(/obj/item/stack/sheet/mineral/diamond)
else
on = 0
continue
- if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0)
- if (ore_plasma > 0)
+ if(selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0)
+ if(ore_plasma > 0)
ore_plasma--;
generate_mineral(/obj/item/stack/sheet/mineral/plasma)
else
on = 0
continue
- if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 1 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0)
- if (ore_uranium > 0)
+ if(selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 1 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0)
+ if(ore_uranium > 0)
ore_uranium--;
generate_mineral(/obj/item/stack/sheet/mineral/uranium)
else
on = 0
continue
- if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0 && selected_mime == 0)
- if (ore_iron > 0)
+ if(selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0 && selected_mime == 0)
+ if(ore_iron > 0)
ore_iron--;
generate_mineral(/obj/item/stack/sheet/metal)
else
on = 0
continue
- if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0 && selected_mime == 0)
- if (ore_iron > 0 && ore_plasma > 0)
+ if(selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0 && selected_mime == 0)
+ if(ore_iron > 0 && ore_plasma > 0)
ore_iron--;
ore_plasma--;
generate_mineral(/obj/item/stack/sheet/plasteel)
else
on = 0
continue
- if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 1 && selected_mime == 0)
- if (ore_clown > 0)
+ if(selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 1 && selected_mime == 0)
+ if(ore_clown > 0)
ore_clown--;
generate_mineral(/obj/item/stack/sheet/mineral/bananium)
else
on = 0
continue
- if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 1)
- if (ore_mime > 0)
+ if(selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 1)
+ if(ore_mime > 0)
ore_mime--;
generate_mineral(/obj/item/stack/sheet/mineral/tranquillite)
else
@@ -299,16 +299,16 @@
continue
//THESE TWO ARE CODED FOR URIST TO USE WHEN HE GETS AROUND TO IT.
//They were coded on 18 Feb 2012. If you're reading this in 2015, then firstly congratulations on the world not ending on 21 Dec 2012 and secondly, Urist is apparently VERY lazy. ~Errorage
- /*if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 1 && selected_plasma == 0 && selected_uranium == 1 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0)
- if (ore_uranium >= 2 && ore_diamond >= 1)
+ /*if(selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 1 && selected_plasma == 0 && selected_uranium == 1 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0)
+ if(ore_uranium >= 2 && ore_diamond >= 1)
ore_uranium -= 2
ore_diamond -= 1
generate_mineral(/obj/item/stack/sheet/mineral/adamantine)
else
on = 0
continue
- if (selected_glass == 0 && selected_gold == 0 && selected_silver == 1 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0)
- if (ore_silver >= 1 && ore_plasma >= 3)
+ if(selected_glass == 0 && selected_gold == 0 && selected_silver == 1 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0 && selected_mime == 0)
+ if(ore_silver >= 1 && ore_plasma >= 3)
ore_silver -= 1
ore_plasma -= 3
generate_mineral(/obj/item/stack/sheet/mineral/mythril)
@@ -321,53 +321,53 @@
var/b = 1 //this part checks if all required ores are available
- if (!(selected_gold || selected_silver ||selected_diamond || selected_uranium | selected_plasma || selected_iron || selected_iron))
+ if(!(selected_gold || selected_silver ||selected_diamond || selected_uranium | selected_plasma || selected_iron || selected_iron))
b = 0
- if (selected_gold == 1)
- if (ore_gold <= 0)
+ if(selected_gold == 1)
+ if(ore_gold <= 0)
b = 0
- if (selected_silver == 1)
- if (ore_silver <= 0)
+ if(selected_silver == 1)
+ if(ore_silver <= 0)
b = 0
- if (selected_diamond == 1)
- if (ore_diamond <= 0)
+ if(selected_diamond == 1)
+ if(ore_diamond <= 0)
b = 0
- if (selected_uranium == 1)
- if (ore_uranium <= 0)
+ if(selected_uranium == 1)
+ if(ore_uranium <= 0)
b = 0
- if (selected_plasma == 1)
- if (ore_plasma <= 0)
+ if(selected_plasma == 1)
+ if(ore_plasma <= 0)
b = 0
- if (selected_iron == 1)
- if (ore_iron <= 0)
+ if(selected_iron == 1)
+ if(ore_iron <= 0)
b = 0
- if (selected_glass == 1)
- if (ore_glass <= 0)
+ if(selected_glass == 1)
+ if(ore_glass <= 0)
b = 0
- if (selected_clown == 1)
- if (ore_clown <= 0)
+ if(selected_clown == 1)
+ if(ore_clown <= 0)
b = 0
- if (selected_mime == 1)
- if (ore_mime <= 0)
+ if(selected_mime == 1)
+ if(ore_mime <= 0)
b = 0
- if (b) //if they are, deduct one from each, produce slag and shut the machine off
- if (selected_gold == 1)
+ if(b) //if they are, deduct one from each, produce slag and shut the machine off
+ if(selected_gold == 1)
ore_gold--
- if (selected_silver == 1)
+ if(selected_silver == 1)
ore_silver--
- if (selected_diamond == 1)
+ if(selected_diamond == 1)
ore_diamond--
- if (selected_uranium == 1)
+ if(selected_uranium == 1)
ore_uranium--
- if (selected_plasma == 1)
+ if(selected_plasma == 1)
ore_plasma--
- if (selected_iron == 1)
+ if(selected_iron == 1)
ore_iron--
- if (selected_clown == 1)
+ if(selected_clown == 1)
ore_clown--
- if (selected_mime == 1)
+ if(selected_mime == 1)
ore_mime--
generate_mineral(/obj/item/weapon/ore/slag)
on = 0
@@ -384,39 +384,39 @@
n++
if(n>10)
break
- if (istype(O,/obj/item/weapon/ore/iron))
+ if(istype(O,/obj/item/weapon/ore/iron))
ore_iron++;
O.loc = null
continue
- if (istype(O,/obj/item/weapon/ore/glass))
+ if(istype(O,/obj/item/weapon/ore/glass))
ore_glass++;
O.loc = null
continue
- if (istype(O,/obj/item/weapon/ore/diamond))
+ if(istype(O,/obj/item/weapon/ore/diamond))
ore_diamond++;
O.loc = null
continue
- if (istype(O,/obj/item/weapon/ore/plasma))
+ if(istype(O,/obj/item/weapon/ore/plasma))
ore_plasma++
O.loc = null
continue
- if (istype(O,/obj/item/weapon/ore/gold))
+ if(istype(O,/obj/item/weapon/ore/gold))
ore_gold++
O.loc = null
continue
- if (istype(O,/obj/item/weapon/ore/silver))
+ if(istype(O,/obj/item/weapon/ore/silver))
ore_silver++
O.loc = null
continue
- if (istype(O,/obj/item/weapon/ore/uranium))
+ if(istype(O,/obj/item/weapon/ore/uranium))
ore_uranium++
O.loc = null
continue
- if (istype(O,/obj/item/weapon/ore/bananium))
+ if(istype(O,/obj/item/weapon/ore/bananium))
ore_clown++
O.loc = null
continue
- if (istype(O,/obj/item/weapon/ore/tranquillite))
+ if(istype(O,/obj/item/weapon/ore/tranquillite))
ore_mime++
O.loc = null
continue
diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm
index 5f315648c10..44d7b037869 100644
--- a/code/modules/mining/machine_stacking.dm
+++ b/code/modules/mining/machine_stacking.dm
@@ -13,7 +13,7 @@
..()
spawn(7)
src.machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir))
- if (machine)
+ if(machine)
machine.CONSOLE = src
else
qdel(src)
diff --git a/code/modules/mining/machine_unloading.dm b/code/modules/mining/machine_unloading.dm
index 5ae7f376cb0..5214c8caec8 100644
--- a/code/modules/mining/machine_unloading.dm
+++ b/code/modules/mining/machine_unloading.dm
@@ -15,14 +15,14 @@
if(T)
var/limit
for(var/obj/structure/ore_box/B in T)
- for (var/obj/item/weapon/ore/O in B)
+ for(var/obj/item/weapon/ore/O in B)
B.contents -= O
unload_mineral(O)
limit++
- if (limit>=10)
+ if(limit>=10)
return
for(var/obj/item/I in T)
unload_mineral(I)
limit++
- if (limit>=10)
+ if(limit>=10)
return
\ No newline at end of file
diff --git a/code/modules/mining/manufacturing.dm b/code/modules/mining/manufacturing.dm
index 429b0ee42bc..36464c2d7c7 100644
--- a/code/modules/mining/manufacturing.dm
+++ b/code/modules/mining/manufacturing.dm
@@ -39,26 +39,26 @@
process()
..()
- if (src.working) use_power(src.powconsumption)
+ if(src.working) use_power(src.powconsumption)
ex_act(severity)
switch(severity)
if(1.0) qdel(src)
if(2.0)
- if (prob(60)) stat |= BROKEN
+ if(prob(60)) stat |= BROKEN
if(3.0)
- if (prob(30)) stat |= BROKEN
+ if(prob(30)) stat |= BROKEN
return
blob_act()
- if (prob(25)) del src
+ if(prob(25)) del src
return
power_change()
if(stat & BROKEN) icon_state = "fab-broken"
else
if( powered() )
- if (src.working) src.icon_state = "fab-active"
+ if(src.working) src.icon_state = "fab-active"
else src.icon_state = "fab-idle"
stat &= ~NOPOWER
else
@@ -92,31 +92,31 @@
var/AMTfabr = 0
for(var/obj/item/weapon/ore/O in src.contents)
- if (istype(O,/obj/item/weapon/ore/iron)) AMTmaux++
- if (istype(O,/obj/item/weapon/ore/glass)) AMTmoli++
- if (istype(O,/obj/item/weapon/ore/silver)) AMTphar++
- if (istype(O,/obj/item/weapon/ore/diamond)) AMTclar++
- if (istype(O,/obj/item/weapon/ore/gold)) AMTbohr++
- if (istype(O,/obj/item/weapon/ore/coal)) AMTereb++
- if (istype(O,/obj/item/weapon/ore/uranium)) AMTcere++
- if (istype(O,/obj/item/weapon/ore/plasma)) AMTplas++
- if (istype(O,/obj/item/weapon/ore/osmium)) AMTuqil++
- if (istype(O,/obj/item/weapon/ore/hydrogen)) AMTtele++
- if (istype(O,/obj/item/weapon/ore/fabric)) AMTfabr++
+ if(istype(O,/obj/item/weapon/ore/iron)) AMTmaux++
+ if(istype(O,/obj/item/weapon/ore/glass)) AMTmoli++
+ if(istype(O,/obj/item/weapon/ore/silver)) AMTphar++
+ if(istype(O,/obj/item/weapon/ore/diamond)) AMTclar++
+ if(istype(O,/obj/item/weapon/ore/gold)) AMTbohr++
+ if(istype(O,/obj/item/weapon/ore/coal)) AMTereb++
+ if(istype(O,/obj/item/weapon/ore/uranium)) AMTcere++
+ if(istype(O,/obj/item/weapon/ore/plasma)) AMTplas++
+ if(istype(O,/obj/item/weapon/ore/osmium)) AMTuqil++
+ if(istype(O,/obj/item/weapon/ore/hydrogen)) AMTtele++
+ if(istype(O,/obj/item/weapon/ore/fabric)) AMTfabr++
dat += "Available Minerals "
- if (AMTmaux) dat += "Iron: [AMTmaux] "
- if (AMTmoli) dat += "Glass: [AMTmoli] "
- if (AMTphar) dat += "Silver: [AMTphar] "
- if (AMTclar) dat += "Diamond: [AMTclar] "
- if (AMTbohr) dat += "Gold: [AMTbohr] "
- if (AMTereb) dat += "Coal: [AMTereb] "
- if (AMTcere) dat += "Uranium: [AMTcere] "
- if (AMTplas) dat += "Plasma: [AMTplas] "
- if (AMTuqil) dat += "Platinum: [AMTuqil] "
- if (AMTtele) dat += "Hydrogen: [AMTtele] "
- if (AMTfabr) dat += "Fabric: [AMTfabr] "
- if (!AMTmaux && !AMTmoli && !AMTphar && !AMTclar && !AMTbohr && !AMTereb && !AMTcere && !AMTplas && !AMTuqil && !AMTtele && !AMTfabr)
+ if(AMTmaux) dat += "Iron: [AMTmaux] "
+ if(AMTmoli) dat += "Glass: [AMTmoli] "
+ if(AMTphar) dat += "Silver: [AMTphar] "
+ if(AMTclar) dat += "Diamond: [AMTclar] "
+ if(AMTbohr) dat += "Gold: [AMTbohr] "
+ if(AMTereb) dat += "Coal: [AMTereb] "
+ if(AMTcere) dat += "Uranium: [AMTcere] "
+ if(AMTplas) dat += "Plasma: [AMTplas] "
+ if(AMTuqil) dat += "Platinum: [AMTuqil] "
+ if(AMTtele) dat += "Hydrogen: [AMTtele] "
+ if(AMTfabr) dat += "Fabric: [AMTfabr] "
+ if(!AMTmaux && !AMTmoli && !AMTphar && !AMTclar && !AMTbohr && !AMTereb && !AMTcere && !AMTplas && !AMTuqil && !AMTtele && !AMTfabr)
dat += "No minerals currently loaded. "
dat += {"
@@ -126,42 +126,42 @@
dat += {"
[A.name]
Cost: [A.amount1] [A.cname1]"}
- if (A.cost2) dat += ", [A.amount2] [A.cname2]"
- if (A.cost3) dat += ", [A.amount3] [A.cname3]"
+ if(A.cost2) dat += ", [A.amount2] [A.cname2]"
+ if(A.cost3) dat += ", [A.amount3] [A.cname3]"
dat += "Time: [A.time] Seconds "
for(var/datum/manufacture/A in src.download)
dat += {"
[A.name] (Downloaded)
Cost: [A.amount1] [A.cname1]"}
- if (A.cost2) dat += ", [A.amount2] [A.cname2]"
- if (A.cost3) dat += ", [A.amount3] [A.cname3]"
+ if(A.cost2) dat += ", [A.amount2] [A.cname2]"
+ if(A.cost3) dat += ", [A.amount3] [A.cname3]"
dat += "Time: [A.time] Seconds "
for(var/datum/manufacture/A in src.diskload)
dat += {"
[A.name] (Disk)
Cost: [A.amount1] [A.cname1]"}
- if (A.cost2) dat += ", [A.amount2] [A.cname2]"
- if (A.cost3) dat += ", [A.amount3] [A.cname3]"
+ if(A.cost2) dat += ", [A.amount2] [A.cname2]"
+ if(A.cost3) dat += ", [A.amount3] [A.cname3]"
dat += "Time: [A.time] Seconds "
- if (src.hacked)
+ if(src.hacked)
for(var/datum/manufacture/A in src.hidden)
dat += {"
[A.name] (Secret)
Cost: [A.amount1] [A.cname1]"}
- if (A.cost2) dat += ", [A.amount2] [A.cname2]"
- if (A.cost3) dat += ", [A.amount3] [A.cname3]"
+ if(A.cost2) dat += ", [A.amount2] [A.cname2]"
+ if(A.cost3) dat += ", [A.amount3] [A.cname3]"
dat += "Time: [A.time] Seconds "
dat += " "
- if (src.dl_list)
+ if(src.dl_list)
dat += {"Download Available Schematics
Clear Downloaded Schematics "}
- if (src.acceptdisk)
+ if(src.acceptdisk)
dat += {"Clear Disk Schematics "}
user << browse(dat, "window=manufact;size=400x500")
@@ -173,45 +173,45 @@
if(usr.stat || usr.restrained())
return
- if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))))
+ if((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))))
usr.machine = src
- if (href_list["download"])
+ if(href_list["download"])
to_chat(if(!src.dl_list) usr, "\red This unit is not capable of downloading any additional schematics.")
else
var/amtdl = 0
//var/dontload = 0
- if (src.dl_list == "robotics")
+ if(src.dl_list == "robotics")
/*for(var/i = robotics_research.starting_tier, i <= robotics_research.max_tiers, i++)
for(var/datum/roboresearch/X in robotics_research.researched_items[i])
- for (var/datum/manufacture/S in X.schematics)
- for (var/datum/manufacture/A in src.download)
- if (istype(S,A)) dontload = 1
- if (!dontload)
+ for(var/datum/manufacture/S in X.schematics)
+ for(var/datum/manufacture/A in src.download)
+ if(istype(S,A)) dontload = 1
+ if(!dontload)
src.download += new S.type(src)
amtdl++
else dontload = 0*/
- to_chat(if (amtdl) usr, "\blue [amtdl] new schematics downloaded from Robotics Research Database.")
+ to_chat(if(amtdl) usr, "\blue [amtdl] new schematics downloaded from Robotics Research Database.")
to_chat(else usr, "\red No new schematics currently available in Robotics Research Database.")
- if (href_list["delete"])
+ if(href_list["delete"])
var/operation = text2num(href_list["delete"])
if(operation == 1) // Clear Disk Schematics
var/amtgone = 0
for(var/datum/manufacture/D in src.diskload)
src.diskload-= D
amtgone++
- to_chat(if (amtgone) usr, "\blue Cleared [amtgone] schematics from database.")
+ to_chat(if(amtgone) usr, "\blue Cleared [amtgone] schematics from database.")
to_chat(else usr, "\red No disk-loaded schematics detected in database.")
if(operation == 2) // Clear Download Schematics
var/amtgone = 0
for(var/datum/manufacture/D in src.download)
src.download-= D
amtgone++
- to_chat(if (amtgone) usr, "\blue Cleared [amtgone] schematics from database.")
+ to_chat(if(amtgone) usr, "\blue Cleared [amtgone] schematics from database.")
to_chat(else usr, "\red No downloaded schematics detected in database.")
- if (href_list["eject"])
+ if(href_list["eject"])
var/operation = text2num(href_list["eject"])
var/ejectamt = 0
var/ejecting = null
@@ -233,22 +233,22 @@
sleep(3)
ejectamt = input(usr,"How many units do you want to eject?","Eject Materials") as num
for(var/obj/item/weapon/ore/O in src.contents)
- if (ejectamt <= 0) break
- if (istype(O, ejecting))
+ if(ejectamt <= 0) break
+ if(istype(O, ejecting))
O.loc = usr.loc
ejectamt--
- if (href_list["disp"])
+ if(href_list["disp"])
var/datum/manufacture/I = locate(href_list["disp"])
// Material Check
var/A1 = 0
var/A2 = 0
var/A3 = 0
for(var/obj/item/weapon/ore/O in src.contents)
- if (istype(O,I.cost1)) A1++
- if (istype(O,I.cost2)) A2++
- if (istype(O,I.cost3)) A3++
- if (A1 < I.amount1 || A2 < I.amount2 || A3 < I.amount3)
+ if(istype(O,I.cost1)) A1++
+ if(istype(O,I.cost2)) A2++
+ if(istype(O,I.cost3)) A3++
+ if(A1 < I.amount1 || A2 < I.amount2 || A3 < I.amount3)
to_chat(usr, "\red Insufficient materials to manufacture that item.")
return
// Consume Mats
@@ -256,13 +256,13 @@
var/C2 = I.amount2
var/C3 = I.amount3
for(var/obj/item/weapon/ore/O in src.contents)
- if (istype(O,I.cost1) && C1)
+ if(istype(O,I.cost1) && C1)
del O
C1--
- if (istype(O,I.cost2) && C2)
+ if(istype(O,I.cost2) && C2)
del O
C2--
- if (istype(O,I.cost3) && C3)
+ if(istype(O,I.cost3) && C3)
del O
C3--
// Manufacture Item
@@ -272,16 +272,16 @@
var/powconsume = round(1500*worktime/3)
/*for(var/i = robotics_research.starting_tier, i <= robotics_research.max_tiers, i++)
for(var/datum/roboresearch/a in robotics_research.researched_items[i])
- if (a.manubonus)
+ if(a.manubonus)
worktime -= a.timebonus
- if (a.multiplier != 0) worktime /= a.multiplier
+ if(a.multiplier != 0) worktime /= a.multiplier
powconsume -= a.powbonus*/
- if (worktime < 1) worktime = 1
+ if(worktime < 1) worktime = 1
src.powconsumption = powconsume
src.updateUsrDialog()
sleep(worktime)
var/make = I.create
- while (make > 0)
+ while(make > 0)
new I.item(src.loc)
make--
src.working = 0
@@ -298,24 +298,24 @@
var/obj/item/stack/sheet/STACK = W
for(var/mob/O in viewers(user, null)) O.show_message(text("\blue [] loads [] into the [].", user, W, src), 1)
if(istype(STACK, /obj/item/stack/sheet/metal))
- for (var/amt = STACK.amount, amt > 0, amt--) new /obj/item/weapon/ore/iron(src)
+ for(var/amt = STACK.amount, amt > 0, amt--) new /obj/item/weapon/ore/iron(src)
if(istype(STACK, /obj/item/stack/sheet/plasteel))
- for (var/amt = STACK.amount, amt > 0, amt--)
+ for(var/amt = STACK.amount, amt > 0, amt--)
new /obj/item/weapon/ore/iron(src)
new /obj/item/weapon/ore/plasma(src)
if(istype(STACK, /obj/item/stack/sheet/glass))
- for (var/amt = STACK.amount, amt > 0, amt--) new /obj/item/weapon/ore/glass(src)
+ for(var/amt = STACK.amount, amt > 0, amt--) new /obj/item/weapon/ore/glass(src)
if(istype(STACK, /obj/item/stack/sheet/rglass))
- for (var/amt = STACK.amount, amt > 0, amt--)
+ for(var/amt = STACK.amount, amt > 0, amt--)
new /obj/item/weapon/ore/iron(src)
new /obj/item/weapon/ore/glass(src)
load = 2
- //else if (istype(W, /obj/item/weapon/plant/wheat/metal))
+ //else if(istype(W, /obj/item/weapon/plant/wheat/metal))
// new /obj/item/weapon/ore/iron(src)
// load = 2
/*else if(istype(W, /obj/item/stack/cable_coil/))
for(var/mob/O in viewers(user, null)) O.show_message(text("\blue [] loads [] into the [].", user, W, src), 1)
- for (var/amt = W:amount, amt > 0, amt--)
+ for(var/amt = W:amount, amt > 0, amt--)
new /obj/item/weapon/ore/silver(src)
amt--
load = 2*/
@@ -324,7 +324,7 @@
load = 2
else if(istype(W, /obj/item/stack/rods))
var/obj/item/stack/RODS = W
- for (var/amt = RODS.amount, amt > 0, amt--) new /obj/item/weapon/ore/iron(src)
+ for(var/amt = RODS.amount, amt > 0, amt--) new /obj/item/weapon/ore/iron(src)
load = 2
else if(istype(W, /obj/item/clothing/))
if(istype(W, /obj/item/clothing/under/))
@@ -337,78 +337,78 @@
if(istype(W,/obj/item/clothing/suit/space/)) new /obj/item/weapon/ore/fabric(src)
load = 2
else if(istype(W, /obj/item/weapon/disk/data/schematic))
- to_chat(if (!src.acceptdisk) user, "\red This unit is unable to accept disks.")
+ to_chat(if(!src.acceptdisk) user, "\red This unit is unable to accept disks.")
else
var/amtload = 0
var/dontload = 0
- for (var/datum/manufacture/WS in W:schematics)
- for (var/datum/manufacture/A in src.available)
- if (istype(WS,A)) dontload = 1
- for (var/datum/manufacture/B in src.download)
- if (istype(WS,B)) dontload = 1
- for (var/datum/manufacture/C in src.diskload)
- if (istype(WS,C)) dontload = 1
- for (var/datum/manufacture/D in src.hidden)
- if (istype(WS,D) && src.hacked) dontload = 1
- if (!dontload)
+ for(var/datum/manufacture/WS in W:schematics)
+ for(var/datum/manufacture/A in src.available)
+ if(istype(WS,A)) dontload = 1
+ for(var/datum/manufacture/B in src.download)
+ if(istype(WS,B)) dontload = 1
+ for(var/datum/manufacture/C in src.diskload)
+ if(istype(WS,C)) dontload = 1
+ for(var/datum/manufacture/D in src.hidden)
+ if(istype(WS,D) && src.hacked) dontload = 1
+ if(!dontload)
src.diskload += new WS.type(src)
amtload++
else dontload = 0
- to_chat(if (amtload) user, "\blue [amtload] new schematics downloaded from disk.")
+ to_chat(if(amtload) user, "\blue [amtload] new schematics downloaded from disk.")
to_chat(else user, "\red No new schematics available on disk.")
- else if (istype(W, /obj/item/weapon/storage/bag/ore))
+ else if(istype(W, /obj/item/weapon/storage/bag/ore))
for(var/mob/V in viewers(user, null)) V.show_message(text("\blue [] uses the []'s automatic ore loader on []!", user, src, W), 1)
var/amtload = 0
- for (var/obj/item/weapon/ore/M in W.contents)
+ for(var/obj/item/weapon/ore/M in W.contents)
M.loc = src
amtload++
- to_chat(if (amtload) user, "\blue [amtload] pieces of ore loaded from [W]!")
+ to_chat(if(amtload) user, "\blue [amtload] pieces of ore loaded from [W]!")
to_chat(else user, "\red No ore loaded!")
else if(istype(W, /obj/item/weapon/card/emag))
src.hacked = 1
to_chat(user, "\blue You remove the [src]'s product locks!")
else ..()
- if (load == 1)
+ if(load == 1)
user.unEquip(W)
W.loc = src
- if ((user.client && user.s_active != src))
+ if((user.client && user.s_active != src))
user.client.screen -= W
W.dropped()
- else if (load == 2)
+ else if(load == 2)
user.unEquip(W)
W.dropped()
- if ((user.client && user.s_active != src))
+ if((user.client && user.s_active != src))
user.client.screen -= W
del W
src.updateUsrDialog()
MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
- if (istype(O, /obj/structure/closet/crate/))
+ if(istype(O, /obj/structure/closet/crate/))
for(var/mob/V in viewers(user, null)) V.show_message(text("\blue [] uses the []'s automatic ore loader on []!", user, src, O), 1)
var/amtload = 0
- for (var/obj/item/weapon/ore/M in O.contents)
+ for(var/obj/item/weapon/ore/M in O.contents)
M.loc = src
amtload++
- to_chat(if (amtload) user, "\blue [amtload] pieces of ore loaded from [O]!")
+ to_chat(if(amtload) user, "\blue [amtload] pieces of ore loaded from [O]!")
to_chat(else user, "\red No ore loaded!")
- else if (istype(O, /obj/item/weapon/ore/))
+ else if(istype(O, /obj/item/weapon/ore/))
for(var/mob/V in viewers(user, null)) V.show_message(text("\blue [] begins quickly stuffing ore into []!", user, src), 1)
var/staystill = user.loc
for(var/obj/item/weapon/ore/M in view(1,user))
M.loc = src
sleep(3)
- if (user.loc != staystill) break
+ if(user.loc != staystill) break
to_chat(user, "\blue You finish stuffing ore into [src]!")
- /*else if (istype(O, /obj/item/weapon/plant/wheat/metal))
+ /*else if(istype(O, /obj/item/weapon/plant/wheat/metal))
for(var/mob/V in viewers(user, null)) V.show_message(text("\blue [] begins quickly stuffing [O] into []!", user, src), 1)
var/staystill = user.loc
for(var/obj/item/weapon/plant/wheat/metal/M in view(1,user))
new /obj/item/weapon/ore/iron(src)
del M
sleep(3)
- if (user.loc != staystill) break
+ if(user.loc != staystill) break
to_chat(user, "\blue You finish stuffing [O] into [src]!"*/)
else ..()
src.updateUsrDialog()
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index f1f317789b4..e774ef23924 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -9,6 +9,27 @@
/**********************Miner Lockers**************************/
+/obj/structure/closet/wardrobe/miner
+ name = "mining wardrobe"
+ icon_state = "mixed"
+ icon_closed = "mixed"
+
+/obj/structure/closet/wardrobe/miner/New()
+ ..()
+ contents = list()
+ new /obj/item/weapon/storage/backpack/duffel(src)
+ new /obj/item/weapon/storage/backpack/industrial(src)
+ new /obj/item/weapon/storage/backpack/satchel_eng(src)
+ new /obj/item/clothing/under/rank/miner(src)
+ new /obj/item/clothing/under/rank/miner(src)
+ new /obj/item/clothing/under/rank/miner(src)
+ new /obj/item/clothing/shoes/workboots(src)
+ new /obj/item/clothing/shoes/workboots(src)
+ new /obj/item/clothing/shoes/workboots(src)
+ new /obj/item/clothing/gloves/fingerless(src)
+ new /obj/item/clothing/gloves/fingerless(src)
+ new /obj/item/clothing/gloves/fingerless(src)
+
/obj/structure/closet/secure_closet/miner
name = "miner's equipment"
icon_state = "miningsec1"
@@ -21,20 +42,11 @@
/obj/structure/closet/secure_closet/miner/New()
..()
- sleep(2)
- if(prob(50))
- new /obj/item/weapon/storage/backpack/industrial(src)
- else
- new /obj/item/weapon/storage/backpack/satchel_eng(src)
- new /obj/item/device/radio/headset/headset_cargo(src)
- new /obj/item/clothing/under/rank/miner(src)
- new /obj/item/clothing/gloves/fingerless(src)
- new /obj/item/clothing/shoes/black(src)
- new /obj/item/device/mining_scanner(src)
- new /obj/item/weapon/storage/bag/ore(src)
- new /obj/item/device/flashlight/lantern(src)
new /obj/item/weapon/shovel(src)
new /obj/item/weapon/pickaxe(src)
+ new /obj/item/device/radio/headset/headset_cargo/mining(src)
+ new /obj/item/device/t_scanner/adv_mining_scanner/lesser(src)
+ new /obj/item/weapon/storage/bag/ore(src)
new /obj/item/clothing/glasses/meson(src)
/**********************Shuttle Computer**************************/
@@ -65,7 +77,7 @@
force = 15.0
throwforce = 10.0
item_state = "pickaxe"
- w_class = 4.0
+ w_class = 4
materials = list(MAT_METAL=2000) //one sheet, but where can you make them?
var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO
origin_tech = "materials=1;engineering=1"
@@ -122,7 +134,7 @@
icon_state = "smdrill"
origin_tech = "materials=6;powerstorage=4;engineering=5;syndicate=3"
desc = "Microscopic supermatter crystals cover the head of this tiny drill."
- w_class = 2.0
+ w_class = 2
/obj/item/weapon/pickaxe/drill/cyborg/diamond //This is the BORG version!
name = "diamond-tipped cyborg mining drill" //To inherit the NODROP flag, and easier to change borg specific drill mechanics.
@@ -166,7 +178,7 @@
force = 8.0
throwforce = 4.0
item_state = "shovel"
- w_class = 3.0
+ w_class = 3
materials = list(MAT_METAL=50)
origin_tech = "materials=1;engineering=1"
attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked")
@@ -178,7 +190,7 @@
item_state = "spade"
force = 5.0
throwforce = 7.0
- w_class = 2.0
+ w_class = 2
/**********************Mining car (Crate like thing, not the rail car)**************************/
@@ -199,7 +211,7 @@
desc = "It allows you to store and deploy lazarus-injected creatures easier."
icon = 'icons/obj/mobcap.dmi'
icon_state = "mobcap0"
- w_class = 1.0
+ w_class = 1
throw_range = 20
var/mob/living/simple_animal/captured = null
var/colorindex = 0
@@ -249,4 +261,50 @@
if(colorindex >= 6)
colorindex = 0
icon_state = "mobcap[colorindex]"
- update_icon()
\ No newline at end of file
+ update_icon()
+
+//Fans
+/obj/structure/fans
+ icon = 'icons/obj/lavaland/survival_pod.dmi'
+ icon_state = "fans"
+ name = "environmental regulation system"
+ desc = "A large machine releasing a constant gust of air."
+ anchored = 1
+ density = 1
+ var/arbitraryatmosblockingvar = 1
+ var/buildstacktype = /obj/item/stack/sheet/metal
+ var/buildstackamount = 5
+
+/obj/structure/fans/proc/deconstruct()
+ if(buildstacktype)
+ new buildstacktype(loc, buildstackamount)
+ qdel(src)
+
+/obj/structure/fans/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W, /obj/item/weapon/wrench))
+ playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ user.visible_message("[user] disassembles the fan. ", \
+ "You start to disassemble the fan... ", "You hear clanking and banging noises.")
+ if(do_after(user, 20, target = src))
+ deconstruct()
+ return ..()
+
+/obj/structure/fans/tiny
+ name = "tiny fan"
+ desc = "A tiny fan, releasing a thin gust of air."
+ layer = TURF_LAYER+0.1
+ density = 0
+ icon_state = "fan_tiny"
+ buildstackamount = 2
+
+/obj/structure/fans/New(loc)
+ ..()
+ air_update_turf(1)
+
+/obj/structure/fans/Destroy()
+ arbitraryatmosblockingvar = 0
+ air_update_turf(1)
+ return ..()
+
+/obj/structure/fans/CanAtmosPass(turf/T)
+ return !arbitraryatmosblockingvar
\ No newline at end of file
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 41b994b31b6..a76dfa9a699 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -45,10 +45,10 @@ var/global/list/rockTurfEdgeCache = list(
..()
switch(severity)
if(3.0)
- if (prob(75))
+ if(prob(75))
src.gets_drilled(null, 1)
if(2.0)
- if (prob(90))
+ if(prob(90))
src.gets_drilled(null, 1)
if(1.0)
src.gets_drilled(null, 1)
@@ -58,7 +58,7 @@ var/global/list/rockTurfEdgeCache = list(
..()
mineral_turfs += src
- if (mineralType && mineralAmt && spread && spreadChance)
+ if(mineralType && mineralAmt && spread && spreadChance)
for(var/dir in cardinal)
if(prob(spreadChance))
var/turf/T = get_step(src, dir)
@@ -88,19 +88,19 @@ var/global/list/rockTurfEdgeCache = list(
var/turf/T
if((istype(get_step(src, NORTH), /turf/simulated/floor)) || (istype(get_step(src, NORTH), /turf/space)))
T = get_step(src, NORTH)
- if (T)
+ if(T)
T.overlays += rockTurfEdgeCache[SOUTH_EDGING]
if((istype(get_step(src, SOUTH), /turf/simulated/floor)) || (istype(get_step(src, SOUTH), /turf/space)))
T = get_step(src, SOUTH)
- if (T)
+ if(T)
T.overlays += rockTurfEdgeCache[NORTH_EDGING]
if((istype(get_step(src, EAST), /turf/simulated/floor)) || (istype(get_step(src, EAST), /turf/space)))
T = get_step(src, EAST)
- if (T)
+ if(T)
T.overlays += rockTurfEdgeCache[WEST_EDGING]
if((istype(get_step(src, WEST), /turf/simulated/floor)) || (istype(get_step(src, WEST), /turf/space)))
T = get_step(src, WEST)
- if (T)
+ if(T)
T.overlays += rockTurfEdgeCache[EAST_EDGING]
/turf/simulated/mineral/random
@@ -116,10 +116,10 @@ var/global/list/rockTurfEdgeCache = list(
/turf/simulated/mineral/random/New()
..()
- if (prob(mineralChance))
+ if(prob(mineralChance))
var/mName = pickweight(mineralSpawnChanceList) //temp mineral name
- if (mName)
+ if(mName)
var/turf/simulated/mineral/M
switch(mName)
if("Uranium")
@@ -367,13 +367,13 @@ var/global/list/rockTurfEdgeCache = list(
/turf/simulated/mineral/attackby(var/obj/item/weapon/pickaxe/P as obj, mob/user as mob, params)
- if (!user.IsAdvancedToolUser())
+ if(!user.IsAdvancedToolUser())
to_chat(usr, "You don't have the dexterity to do this! ")
return
- if (istype(P, /obj/item/weapon/pickaxe))
+ if(istype(P, /obj/item/weapon/pickaxe))
var/turf/T = user.loc
- if (!( istype(T, /turf) ))
+ if(!( istype(T, /turf) ))
return
if(last_act+P.digspeed > world.time)//prevents message spam
@@ -393,9 +393,9 @@ var/global/list/rockTurfEdgeCache = list(
return
/turf/simulated/mineral/proc/gets_drilled()
- if (mineralType && (src.mineralAmt > 0) && (src.mineralAmt < 11))
+ if(mineralType && (src.mineralAmt > 0) && (src.mineralAmt < 11))
var/i
- for (i=0;iThis area has already been dug! ")
return
to_chat(user, "You start digging... ")
sleep(20)
- if ((user.loc == T && user.get_active_hand() == W))
+ if((user.loc == T && user.get_active_hand() == W))
to_chat(user, "You dig a hole. ")
gets_dug()
return
- if ((istype(W, /obj/item/weapon/pickaxe)))
+ if((istype(W, /obj/item/weapon/pickaxe)))
var/obj/item/weapon/pickaxe/P = W
var/turf/T = user.loc
- if (!( istype(T, /turf) ))
+ if(!( istype(T, /turf) ))
return
- if (dug)
+ if(dug)
to_chat(user, "This area has already been dug! ")
return
to_chat(user, "You start digging... ")
sleep(P.digspeed)
- if ((user.loc == T && user.get_active_hand() == W))
+ if((user.loc == T && user.get_active_hand() == W))
to_chat(user, "You dig a hole. ")
gets_dug()
return
@@ -557,7 +557,7 @@ var/global/list/rockTurfEdgeCache = list(
return
/turf/proc/fullUpdateMineralOverlays()
- for (var/turf/t in range(1,src))
+ for(var/turf/t in range(1,src))
t.updateMineralOverlays()
/turf/simulated/floor/plating/airless/asteroid/cave
diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm
index be34465c207..02b69a160d7 100644
--- a/code/modules/mining/mint.dm
+++ b/code/modules/mining/mint.dm
@@ -26,28 +26,28 @@
var/turf/T = get_step(src,input_dir)
if(T)
for(var/obj/item/stack/sheet/O in T)
- if (istype(O, /obj/item/stack/sheet/mineral/gold))
+ if(istype(O, /obj/item/stack/sheet/mineral/gold))
amt_gold += 100 * O.amount
O.loc = null
- if (istype(O, /obj/item/stack/sheet/mineral/silver))
+ if(istype(O, /obj/item/stack/sheet/mineral/silver))
amt_silver += 100 * O.amount
O.loc = null
- if (istype(O, /obj/item/stack/sheet/mineral/diamond))
+ if(istype(O, /obj/item/stack/sheet/mineral/diamond))
amt_diamond += 100 * O.amount
O.loc = null
- if (istype(O, /obj/item/stack/sheet/mineral/plasma))
+ if(istype(O, /obj/item/stack/sheet/mineral/plasma))
amt_plasma += 100 * O.amount
O.loc = null
- if (istype(O, /obj/item/stack/sheet/mineral/uranium))
+ if(istype(O, /obj/item/stack/sheet/mineral/uranium))
amt_uranium += 100 * O.amount
O.loc = null
- if (istype(O, /obj/item/stack/sheet/metal))
+ if(istype(O, /obj/item/stack/sheet/metal))
amt_iron += 100 * O.amount
O.loc = null
- if (istype(O, /obj/item/stack/sheet/mineral/bananium))
+ if(istype(O, /obj/item/stack/sheet/mineral/bananium))
amt_clown += 100 * O.amount
O.loc = null
- if (istype(O, /obj/item/stack/sheet/mineral/tranquillite))
+ if(istype(O, /obj/item/stack/sheet/mineral/tranquillite))
amt_mime += 100 * O.amount
O.loc = null
return
@@ -58,49 +58,49 @@
var/dat = "Coin Press "
dat += text("Gold inserted: [amt_gold] ")
- if (chosen == "gold")
+ if(chosen == "gold")
dat += text("chosen")
else
dat += text("Choose ")
dat += text("Silver inserted: [amt_silver] ")
- if (chosen == "silver")
+ if(chosen == "silver")
dat += text("chosen")
else
dat += text("Choose ")
dat += text("Iron inserted: [amt_iron] ")
- if (chosen == "metal")
+ if(chosen == "metal")
dat += text("chosen")
else
dat += text("Choose ")
dat += text("Diamond inserted: [amt_diamond] ")
- if (chosen == "diamond")
+ if(chosen == "diamond")
dat += text("chosen")
else
dat += text("Choose ")
dat += text("Plasma inserted: [amt_plasma] ")
- if (chosen == "plasma")
+ if(chosen == "plasma")
dat += text("chosen")
else
dat += text("Choose ")
dat += text("Uranium inserted: [amt_uranium] ")
- if (chosen == "uranium")
+ if(chosen == "uranium")
dat += text("chosen")
else
dat += text("Choose ")
if(amt_clown > 0)
dat += text("Bananium inserted: [amt_clown] ")
- if (chosen == "clown")
+ if(chosen == "clown")
dat += text("chosen")
else
dat += text("Choose ")
if(amt_mime > 0)
dat += text("Tranquillite inserted: [amt_mime] ")
- if (chosen == "mime")
+ if(chosen == "mime")
dat += text("chosen")
else
dat += text("Choose ")
dat += text("Adamantine inserted: [amt_adamantine] ")//I don't even know these color codes, so fuck it.
- if (chosen == "adamantine")
+ if(chosen == "adamantine")
dat += text("chosen")
else
dat += text("Choose ")
diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm
index a7a7b4b10df..8972b675e1a 100644
--- a/code/modules/mining/money_bag.dm
+++ b/code/modules/mining/money_bag.dm
@@ -7,7 +7,7 @@
flags = CONDUCT
force = 10.0
throwforce = 0
- w_class = 4.0
+ w_class = 4
/obj/item/weapon/moneybag/attack_hand(user as mob)
var/amt_gold = 0
@@ -20,58 +20,58 @@
var/amt_mime = 0
var/amt_adamantine = 0
- for (var/obj/item/weapon/coin/C in contents)
- if (istype(C,/obj/item/weapon/coin/diamond))
+ for(var/obj/item/weapon/coin/C in contents)
+ if(istype(C,/obj/item/weapon/coin/diamond))
amt_diamond++
- if (istype(C,/obj/item/weapon/coin/plasma))
+ if(istype(C,/obj/item/weapon/coin/plasma))
amt_plasma++
- if (istype(C,/obj/item/weapon/coin/iron))
+ if(istype(C,/obj/item/weapon/coin/iron))
amt_iron++
- if (istype(C,/obj/item/weapon/coin/silver))
+ if(istype(C,/obj/item/weapon/coin/silver))
amt_silver++
- if (istype(C,/obj/item/weapon/coin/gold))
+ if(istype(C,/obj/item/weapon/coin/gold))
amt_gold++
- if (istype(C,/obj/item/weapon/coin/uranium))
+ if(istype(C,/obj/item/weapon/coin/uranium))
amt_uranium++
- if (istype(C,/obj/item/weapon/coin/clown))
+ if(istype(C,/obj/item/weapon/coin/clown))
amt_clown++
- if (istype(C,/obj/item/weapon/coin/mime))
+ if(istype(C,/obj/item/weapon/coin/mime))
amt_mime++
- if (istype(C,/obj/item/weapon/coin/adamantine))
+ if(istype(C,/obj/item/weapon/coin/adamantine))
amt_adamantine++
var/dat = text("The contents of the moneybag reveal... ")
- if (amt_gold)
+ if(amt_gold)
dat += text("Gold coins: [amt_gold] Remove one ")
- if (amt_silver)
+ if(amt_silver)
dat += text("Silver coins: [amt_silver] Remove one ")
- if (amt_iron)
+ if(amt_iron)
dat += text("Metal coins: [amt_iron] Remove one ")
- if (amt_diamond)
+ if(amt_diamond)
dat += text("Diamond coins: [amt_diamond] Remove one ")
- if (amt_plasma)
+ if(amt_plasma)
dat += text("Plasma coins: [amt_plasma] Remove one ")
- if (amt_uranium)
+ if(amt_uranium)
dat += text("Uranium coins: [amt_uranium] Remove one ")
- if (amt_clown)
+ if(amt_clown)
dat += text("Bananium coins: [amt_clown] Remove one ")
- if (amt_mime)
+ if(amt_mime)
dat += text("Tranquillite coins: [amt_mime] Remove one ")
- if (amt_adamantine)
+ if(amt_adamantine)
dat += text("Adamantine coins: [amt_adamantine] Remove one ")
user << browse("[dat]", "window=moneybag")
/obj/item/weapon/moneybag/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
..()
- if (istype(W, /obj/item/weapon/coin))
+ if(istype(W, /obj/item/weapon/coin))
var/obj/item/weapon/coin/C = W
if(!user.drop_item())
return
to_chat(user, "You add the [C.name] into the bag. ")
contents += C
- if (istype(W, /obj/item/weapon/moneybag))
+ if(istype(W, /obj/item/weapon/moneybag))
var/obj/item/weapon/moneybag/C = W
- for (var/obj/O in C.contents)
+ for(var/obj/O in C.contents)
contents += O;
to_chat(user, "You empty the [C.name] into the bag. ")
return
diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm
index 7d6750c4be4..bf4a615c2e9 100644
--- a/code/modules/mining/satchel_ore_boxdm.dm
+++ b/code/modules/mining/satchel_ore_boxdm.dm
@@ -10,11 +10,11 @@
pressure_resistance = 5*ONE_ATMOSPHERE
/obj/structure/ore_box/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/ore))
+ if(istype(W, /obj/item/weapon/ore))
if(!user.drop_item())
return
W.loc = src
- if (istype(W, /obj/item/weapon/storage))
+ if(istype(W, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = W
S.hide_from(usr)
for(var/obj/item/weapon/ore/O in S.contents)
@@ -34,52 +34,54 @@
var/amt_mime = 0
var/amt_bluespace = 0
- for (var/obj/item/weapon/ore/C in contents)
- if (istype(C,/obj/item/weapon/ore/diamond))
+ for(var/obj/item/weapon/ore/C in contents)
+ if(istype(C,/obj/item/weapon/ore/diamond))
amt_diamond++
- if (istype(C,/obj/item/weapon/ore/glass))
+ if(istype(C,/obj/item/weapon/ore/glass))
amt_glass++
- if (istype(C,/obj/item/weapon/ore/plasma))
+ if(istype(C,/obj/item/weapon/ore/plasma))
amt_plasma++
- if (istype(C,/obj/item/weapon/ore/iron))
+ if(istype(C,/obj/item/weapon/ore/iron))
amt_iron++
- if (istype(C,/obj/item/weapon/ore/silver))
+ if(istype(C,/obj/item/weapon/ore/silver))
amt_silver++
- if (istype(C,/obj/item/weapon/ore/gold))
+ if(istype(C,/obj/item/weapon/ore/gold))
amt_gold++
- if (istype(C,/obj/item/weapon/ore/uranium))
+ if(istype(C,/obj/item/weapon/ore/uranium))
amt_uranium++
- if (istype(C,/obj/item/weapon/ore/bananium))
+ if(istype(C,/obj/item/weapon/ore/bananium))
amt_clown++
- if (istype(C,/obj/item/weapon/ore/tranquillite))
+ if(istype(C,/obj/item/weapon/ore/tranquillite))
amt_mime++
- if (istype(C,/obj/item/weapon/ore/bluespace_crystal))
+ if(istype(C,/obj/item/weapon/ore/bluespace_crystal))
amt_bluespace++
var/dat = text("The contents of the ore box reveal... ")
- if (amt_gold)
+ if(amt_gold)
dat += text("Gold ore: [amt_gold] ")
- if (amt_silver)
+ if(amt_silver)
dat += text("Silver ore: [amt_silver] ")
- if (amt_iron)
+ if(amt_iron)
dat += text("Metal ore: [amt_iron] ")
- if (amt_glass)
+ if(amt_glass)
dat += text("Sand: [amt_glass] ")
- if (amt_diamond)
+ if(amt_diamond)
dat += text("Diamond ore: [amt_diamond] ")
- if (amt_plasma)
+ if(amt_plasma)
dat += text("Plasma ore: [amt_plasma] ")
- if (amt_uranium)
+ if(amt_uranium)
dat += text("Uranium ore: [amt_uranium] ")
- if (amt_clown)
+ if(amt_clown)
dat += text("Bananium ore: [amt_clown] ")
- if (amt_mime)
+ if(amt_mime)
dat += text("Tranquillite ore: [amt_mime] ")
- if (amt_bluespace)
+ if(amt_bluespace)
dat += text("Bluespace crystals: [amt_bluespace] ")
dat += text("Empty box ")
- user << browse("[dat]", "window=orebox")
+ var/datum/browser/popup = new(user, "orebox", name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
return
/obj/structure/ore_box/Topic(href, href_list)
@@ -88,7 +90,7 @@
usr.set_machine(src)
src.add_fingerprint(usr)
if(href_list["removeall"])
- for (var/obj/item/weapon/ore/O in contents)
+ for(var/obj/item/weapon/ore/O in contents)
contents -= O
O.loc = src.loc
to_chat(usr, "You empty the box. ")
@@ -122,7 +124,7 @@ obj/structure/ore_box/ex_act(severity, target)
to_chat(usr, "The ore box is empty. ")
return
- for (var/obj/item/weapon/ore/O in contents)
+ for(var/obj/item/weapon/ore/O in contents)
contents -= O
O.loc = src.loc
to_chat(usr, "You empty the ore box. ")
diff --git a/code/modules/mob/dead/observer/login.dm b/code/modules/mob/dead/observer/login.dm
index f6fcac54798..7e3d3f6c4bf 100644
--- a/code/modules/mob/dead/observer/login.dm
+++ b/code/modules/mob/dead/observer/login.dm
@@ -1,6 +1,6 @@
/mob/dead/observer/Login()
..()
- if (ghostimage)
+ if(ghostimage)
ghostimage.icon_state = src.icon_state
updateghostimages()
diff --git a/code/modules/mob/dead/observer/logout.dm b/code/modules/mob/dead/observer/logout.dm
index f80f0100cfc..aa72e364aa0 100644
--- a/code/modules/mob/dead/observer/logout.dm
+++ b/code/modules/mob/dead/observer/logout.dm
@@ -1,5 +1,5 @@
/mob/dead/observer/Logout()
- if (client)
+ if(client)
client.images -= ghost_darkness_images
..()
spawn(0)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index ebefadd7b3d..c20e543057e 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -36,7 +36,7 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi
verbs += /mob/dead/observer/proc/dead_tele
// Our new boo spell.
- AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/boo(src))
+ AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/boo(null))
can_reenter_corpse = flags & GHOST_CAN_REENTER
started_as_observer = flags & GHOST_IS_OBSERVER
@@ -44,16 +44,12 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi
stat = DEAD
- ghostimage = image(src.icon,src,src.icon_state)
- ghost_darkness_images |= ghostimage
- updateallghostimages()
-
var/turf/T
if(ismob(body))
T = get_turf(body) //Where is the body located?
attack_log = body.attack_log //preserve our attack logs by copying them to our ghost
- if (ishuman(body))
+ if(ishuman(body))
var/mob/living/carbon/human/H = body
icon = H.stand_icon
overlays = H.overlays_standing
@@ -77,6 +73,14 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi
mind = body.mind //we don't transfer the mind but we keep a reference to it.
+ ghostimage = image(icon = icon, loc = src, icon_state = icon_state)
+ ghostimage.overlays = overlays
+ ghostimage.dir = dir
+ ghostimage.appearance_flags |= KEEP_TOGETHER
+ ghostimage.alpha = alpha
+ appearance_flags |= KEEP_TOGETHER
+ ghost_darkness_images |= ghostimage
+ updateallghostimages()
if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position
forceMove(T)
@@ -90,7 +94,7 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi
var/mob/M = following
M.following_mobs -= src
following = null
- if (ghostimage)
+ if(ghostimage)
ghost_darkness_images -= ghostimage
qdel(ghostimage)
ghostimage = null
@@ -131,7 +135,7 @@ Works together with spawning an observer, noted above.
if(ghost.can_reenter_corpse)
respawnable_list += ghost
ghost.key = key
- if(!ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed.
+ if(!(ghost.client && ghost.client.holder) && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed.
ghost.verbs -= /mob/dead/observer/verb/toggle_antagHUD // Poor guys, don't know what they are missing!
return ghost
@@ -153,19 +157,24 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
resting = 1
var/mob/dead/observer/ghost = ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly.
-
var/obj/structure/morgue/Morgue = locate() in M.loc
- if(istype(M.loc,/obj/structure/morgue))
+ if(istype(M.loc, /obj/structure/morgue))
Morgue = M.loc
if(Morgue)
Morgue.update()
-
+ if(istype(M.loc, /obj/machinery/cryopod))
+ var/obj/machinery/cryopod/P = M.loc
+ if(!P.control_computer)
+ P.find_control_computer(urgent=1)
+ if(P.control_computer)
+ P.despawn_occupant()
return
/mob/dead/observer/Move(NewLoc, direct)
following = null
dir = direct
+ ghostimage.dir = dir
if(NewLoc)
forceMove(NewLoc)
return
@@ -196,7 +205,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/dead/observer/Stat()
..()
statpanel("Status")
- if (client.statpanel == "Status")
+ if(client.statpanel == "Status")
show_stat_station_time()
if(ticker)
if(ticker.mode)
@@ -248,7 +257,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
source.layer = old_layer
to_chat(src, "(Click to re-enter) ")
if(sound)
- to_chat(src, sound(sound))
+ src << sound(sound)
/mob/dead/observer/proc/show_me_the_hud(hud_index)
var/datum/atom_hud/H = huds[hud_index]
@@ -357,6 +366,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!target)
return
+ if(!get_turf(target))
+ return
+
if(target != src)
if(following && following == target)
return
@@ -406,7 +418,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(istype(usr, /mob/dead/observer)) //Make sure they're an observer!
- if (!target)//Make sure we actually have a target
+ if(!target)//Make sure we actually have a target
return
else
var/mob/M = getmobs()[target] //Destination mob
@@ -449,7 +461,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!istype(usr, /mob/dead/observer)) return
// Shamelessly copied from the Gas Analyzers
- if (!( istype(usr.loc, /turf) ))
+ if(!( istype(usr.loc, /turf) ))
return
var/datum/gas_mixture/environment = usr.loc.return_air()
@@ -506,8 +518,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
//this is called when a ghost is drag clicked to something.
/mob/dead/observer/MouseDrop(atom/over)
if(!usr || !over) return
- if (isobserver(usr) && usr.client && usr.client.holder)
- if (usr.client.holder.cmd_ghost_drag(src,over))
+ if(isobserver(usr) && usr.client && usr.client.holder)
+ if(usr.client.holder.cmd_ghost_drag(src,over))
return
return ..()
@@ -535,17 +547,17 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return
..()
- if (href_list["track"])
+ if(href_list["track"])
var/atom/target = locate(href_list["track"])
if(target)
ManualFollow(target)
- if (href_list["follow"])
+ if(href_list["follow"])
var/atom/target = locate(href_list["follow"])
if(target)
ManualFollow(target)
- if (href_list["jump"])
+ if(href_list["jump"])
var/mob/target = locate(href_list["jump"])
var/mob/A = usr;
to_chat(A, "Teleporting to [target]...")
@@ -594,27 +606,27 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
updateghostsight()
/mob/dead/observer/proc/updateghostsight()
- if (!seedarkness)
+ if(!seedarkness)
see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING
else
see_invisible = SEE_INVISIBLE_OBSERVER
- if (!ghostvision)
+ if(!ghostvision)
see_invisible = SEE_INVISIBLE_LIVING;
updateghostimages()
/proc/updateallghostimages()
- for (var/mob/dead/observer/O in player_list)
+ for(var/mob/dead/observer/O in player_list)
O.updateghostimages()
/mob/dead/observer/proc/updateghostimages()
- if (!client)
+ if(!client)
return
- if (seedarkness || !ghostvision)
+ if(seedarkness || !ghostvision)
client.images -= ghost_darkness_images
else
//add images for the 60inv things ghosts can normally see when darkness is enabled so they can see them now
client.images |= ghost_darkness_images
- if (ghostimage)
+ if(ghostimage)
client.images -= ghostimage //remove ourself
/mob/proc/can_admin_interact()
diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm
index a6269b96d36..fb5b7735633 100644
--- a/code/modules/mob/dead/observer/say.dm
+++ b/code/modules/mob/dead/observer/say.dm
@@ -1,21 +1,39 @@
/mob/dead/observer/say(var/message)
message = sanitize(copytext(message, 1, MAX_MESSAGE_LEN))
- if (!message)
+ if(!message)
return
log_say("Ghost/[src.key] : [message]")
- if (src.client)
+ if(src.client)
if(src.client.prefs.muted & MUTE_DEADCHAT)
to_chat(src, "\red You cannot talk in deadchat (muted).")
return
- if (src.client.handle_spam_prevention(message,MUTE_DEADCHAT))
+ if(src.client.handle_spam_prevention(message,MUTE_DEADCHAT))
return
- if(copytext(message,1,2) == "*")
- return emote(copytext(message,2))
-
. = src.say_dead(message)
+
+/mob/dead/observer/emote(var/act, var/type, var/message)
+ message = sanitize(copytext(message, 1, MAX_MESSAGE_LEN))
+
+ if(!message)
+ return
+
+ if(act != "me")
+ return
+
+ log_emote("Ghost/[src.key] : [message]")
+
+ if(src.client)
+ if(src.client.prefs.muted & MUTE_DEADCHAT)
+ to_chat(src, "\red You cannot emote in deadchat (muted).")
+ return
+
+ if(src.client.handle_spam_prevention(message, MUTE_DEADCHAT))
+ return
+
+ . = src.emote_dead(message)
diff --git a/code/modules/mob/dead/observer/spells.dm b/code/modules/mob/dead/observer/spells.dm
index 993f2b6e344..39dae4c0746 100644
--- a/code/modules/mob/dead/observer/spells.dm
+++ b/code/modules/mob/dead/observer/spells.dm
@@ -20,6 +20,7 @@ var/global/list/boo_phrases=list(
school = "transmutation"
charge_max = 600
clothes_req = 0
+ stat_allowed = 1
invocation = ""
invocation_type = "none"
range = 1 // Or maybe 3?
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
new file mode 100644
index 00000000000..ecdc6a0220a
--- /dev/null
+++ b/code/modules/mob/emote.dm
@@ -0,0 +1,125 @@
+#define EMOTE_COOLDOWN 20 //Time in deciseconds that the cooldown lasts
+
+//Emote Cooldown System (it's so simple!)
+/mob/proc/handle_emote_CD(cooldown = EMOTE_COOLDOWN)
+ if(emote_cd == 2) return 1 // Cooldown emotes were disabled by an admin, prevent use
+ if(src.emote_cd == 1) return 1 // Already on CD, prevent use
+
+ src.emote_cd = 1 // Starting cooldown
+ spawn(cooldown)
+ if(emote_cd == 2) return 1 // Don't reset if cooldown emotes were disabled by an admin during the cooldown
+ src.emote_cd = 0 // Cooldown complete, ready for more!
+
+ return 0 // Proceed with emote
+//--FalseIncarnate
+
+// All mobs should have custom emote, really..
+/mob/proc/custom_emote(var/m_type=1,var/message = null)
+
+ if(stat || !use_me && usr == src)
+ if(usr)
+ to_chat(usr, "You are unable to emote.")
+ return
+
+ var/muzzled = istype(src.wear_mask, /obj/item/clothing/mask/muzzle)
+ if(m_type == 2 && muzzled) return
+
+ var/input
+ if(!message)
+ input = sanitize(copytext(input(src,"Choose an emote to display.") as text|null,1,MAX_MESSAGE_LEN))
+ else
+ input = message
+ if(input)
+ message = "[src] [input]"
+ else
+ return
+
+
+ if(message)
+ log_emote("[name]/[key] : [message]")
+
+ //Hearing gasp and such every five seconds is not good emotes were not global for a reason.
+ // Maybe some people are okay with that.
+
+ for(var/mob/M in player_list)
+ if(!M.client)
+ continue //skip monkeys and leavers
+ if(istype(M, /mob/new_player))
+ continue
+ if(findtext(message," snores.")) //Because we have so many sleeping people.
+ break
+ if(M.stat == 2 && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
+ M.show_message(message)
+
+
+ // Type 1 (Visual) emotes are sent to anyone in view of the item
+ if(m_type & 1)
+ var/list/can_see = get_mobs_in_view(1,src) //Allows silicon & mmi mobs carried around to see the emotes of the person carrying them around.
+ can_see |= viewers(src,null)
+ for(var/mob/O in can_see)
+
+ if(O.status_flags & PASSEMOTES)
+
+ for(var/obj/item/weapon/holder/H in O.contents)
+ H.show_message(message, m_type)
+
+ for(var/mob/living/M in O.contents)
+ M.show_message(message, m_type)
+
+ O.show_message(message, m_type)
+
+ // Type 2 (Audible) emotes are sent to anyone in hear range
+ // of the *LOCATION* -- this is important for pAIs to be heard
+ else if(m_type & 2)
+ for(var/mob/O in get_mobs_in_view(7,src))
+
+ if(O.status_flags & PASSEMOTES)
+
+ for(var/obj/item/weapon/holder/H in O.contents)
+ H.show_message(message, m_type)
+
+ for(var/mob/living/M in O.contents)
+ M.show_message(message, m_type)
+
+ O.show_message(message, m_type)
+
+/mob/proc/emote_dead(var/message)
+
+ if(client.prefs.muted & MUTE_DEADCHAT)
+ to_chat(src, "\red You cannot send deadchat emotes (muted).")
+ return
+
+ if(!(client.prefs.toggles & CHAT_DEAD))
+ to_chat(src, "\red You have deadchat muted.")
+ return
+
+ if(!src.client.holder)
+ if(!config.dsay_allowed)
+ to_chat(src, "\red Deadchat is globally muted")
+ return
+
+
+ var/input
+ if(!message)
+ input = sanitize(copytext(input(src, "Choose an emote to display.") as text|null, 1, MAX_MESSAGE_LEN))
+ else
+ input = message
+
+ if(input)
+ message = "DEAD: [src] [message] "
+ else
+ return
+
+
+ if(message)
+ log_emote("Ghost/[src.key] : [message]")
+
+ for(var/mob/M in player_list)
+ if(istype(M, /mob/new_player))
+ continue
+
+ if(check_rights(R_ADMIN|R_MOD, 0, M) && (M.client.prefs.toggles & CHAT_DEAD)) // Show the emote to admins/mods
+ to_chat(M, message)
+
+ else if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_DEAD)) // Show the emote to regular ghosts with deadchat toggled on
+ M.show_message(message, 2)
diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm
index 47004016a2b..af1dab9098c 100644
--- a/code/modules/mob/hear_say.dm
+++ b/code/modules/mob/hear_say.dm
@@ -1,51 +1,54 @@
// At minimum every mob has a hear_say proc.
-/mob/proc/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
+/mob/proc/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
if(!client)
- return
+ return 0
- if(speaker && !speaker.client && istype(src,/mob/dead/observer) && client.prefs.toggles & CHAT_GHOSTEARS && !speaker in view(src))
+ if(isobserver(src) && client.prefs.toggles & CHAT_GHOSTEARS)
+ if(speaker && !speaker.client && !(speaker in view(src)))
//Does the speaker have a client? It's either random stuff that observers won't care about (Experiment 97B says, 'EHEHEHEHEHEHEHE')
//Or someone snoring. So we make it where they won't hear it.
- return
+ return 0
//make sure the air can transmit speech - hearer's side
var/turf/T = get_turf(src)
- if ((T) && (!(istype(src, /mob/dead/observer)))) //Ghosts can hear even in vacuum.
+ if(T && !isobserver(src))
var/datum/gas_mixture/environment = T.return_air()
- var/pressure = (environment)? environment.return_pressure() : 0
+ var/pressure = environment ? environment.return_pressure() : 0
if(pressure < SOUND_MINIMUM_PRESSURE && get_dist(speaker, src) > 1)
- return
+ return 0
- if (pressure < ONE_ATMOSPHERE*0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet
+ if(pressure < ONE_ATMOSPHERE * 0.4) //sound distortion pressure, to help clue people in that the air is thin, even if it isn't a vacuum yet
italics = 1
- sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact
+ sound_vol *= 0.5
- if(sleeping || stat == 1)
+ if(sleeping || stat == UNCONSCIOUS)
hear_sleep(message)
- return
+ return 0
//non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet.
- if (language && (language.flags & NONVERBAL))
- if (!speaker || (src.sdisabilities & BLIND || src.blinded) || !(speaker in view(src)))
+ if(language && (language.flags & NONVERBAL))
+ if(disabilities & BLIND || blinded) //blind people can't see dumbass
message = stars(message)
- if(!(language && (language.flags & INNATE))) // skip understanding checks for INNATE languages
- if(!say_understands(speaker,language))
- if(istype(speaker,/mob/living/simple_animal))
- var/mob/living/simple_animal/S = speaker
- if(S.speak.len)
- message = pick(S.speak)
- else
- stars(message)
+ if(!speaker || !(speaker in view(src)))
+ message = stars(message)
+
+ if(!say_understands(speaker, language))
+ if(isanimal(speaker))
+ var/mob/living/simple_animal/S = speaker
+ if(S.speak.len)
+ message = pick(S.speak)
else
- if(language)
- message = language.scramble(message)
- else
- message = stars(message)
+ message = stars(message)
+ else
+ if(language)
+ message = language.scramble(message)
+ else
+ message = stars(message)
var/speaker_name = speaker.name
- if(istype(speaker, /mob/living/carbon/human))
+ if(ishuman(speaker))
var/mob/living/carbon/human/H = speaker
speaker_name = H.GetVoice()
@@ -53,7 +56,7 @@
message = "[message] "
var/track = null
- if(istype(src, /mob/dead/observer))
+ if(isobserver(src))
if(italics && client.prefs.toggles & CHAT_GHOSTRADIO)
return
if(speaker_name != speaker.real_name && speaker.real_name)
@@ -62,7 +65,7 @@
if(client.prefs.toggles & CHAT_GHOSTEARS && speaker in view(src))
message = "[message] "
- if(sdisabilities & DEAF || ear_deaf)
+ if(disabilities & DEAF || ear_deaf)
if(!language || !(language.flags & INNATE)) // INNATE is the flag for audible-emote-language, so we don't want to show an "x talks but you cannot hear them" message if it's set
if(speaker == src)
to_chat(src, "You cannot hear yourself speak! ")
@@ -73,17 +76,16 @@
to_chat(src, "[speaker_name] [alt_name] [track][language.format_message(message, verb)] ")
else
to_chat(src, "[speaker_name] [alt_name] [track][verb], \"[message]\" ")
- if (speech_sound && (get_dist(speaker, src) <= world.view && src.z == speaker.z))
+ if(speech_sound && (get_dist(speaker, src) <= world.view && src.z == speaker.z))
var/turf/source = speaker? get_turf(speaker) : get_turf(src)
src.playsound_local(source, speech_sound, sound_vol, 1)
-/mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="", var/atom/follow_target)
-
+/mob/proc/hear_radio(var/message, var/verb = "says", var/datum/language/language = null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname = "", var/atom/follow_target)
if(!client)
return
- if(sleeping || stat==1) //If unconscious or sleeping
+ if(sleeping || stat == UNCONSCIOUS) //If unconscious or sleeping
hear_sleep(message)
return
@@ -92,26 +94,28 @@
follow_target = speaker
//non-verbal languages are garbled if you can't see the speaker. Yes, this includes if they are inside a closet.
- if (language && (language.flags & NONVERBAL))
- if (!speaker || (src.sdisabilities & BLIND || src.blinded) || !(speaker in view(src)))
+ if(language && (language.flags & NONVERBAL))
+ if(disabilities & BLIND || blinded) //blind people can't see dumbass
message = stars(message)
- if(!(language && (language.flags & INNATE))) // skip understanding checks for INNATE languages
- if(!say_understands(speaker,language))
- if(isanimal(speaker))
- var/mob/living/simple_animal/S = speaker
- if(S.speak && S.speak.len)
- message = pick(S.speak)
- else
- return
+ if(!speaker || !(speaker in view(src)))
+ message = stars(message)
+
+ if(!say_understands(speaker, language))
+ if(isanimal(speaker))
+ var/mob/living/simple_animal/S = speaker
+ if(S.speak && S.speak.len)
+ message = pick(S.speak)
else
- if(language)
- message = language.scramble(message)
- else
- message = stars(message)
+ return
+ else
+ if(language)
+ message = language.scramble(message)
+ else
+ message = stars(message)
- if(hard_to_hear)
- message = stars(message)
+ if(hard_to_hear)
+ message = stars(message)
var/speaker_name = "unknown"
if(speaker)
@@ -128,7 +132,7 @@
var/jobname // the mob's "job"
var/mob/living/carbon/human/impersonating //The crewmember being impersonated, if any.
- if (ishuman(speaker))
+ if(ishuman(speaker))
var/mob/living/carbon/human/H = speaker
var/obj/item/weapon/card/id/id = H.wear_id
@@ -143,15 +147,15 @@
else
jobname = H.get_assignment()
- else if (iscarbon(speaker)) // Nonhuman carbon mob
+ else if(iscarbon(speaker)) // Nonhuman carbon mob
jobname = "No ID"
- else if (isAI(speaker))
+ else if(isAI(speaker))
jobname = "AI"
- else if (isrobot(speaker))
+ else if(isrobot(speaker))
jobname = "Cyborg"
- else if (ispAI(speaker))
+ else if(ispAI(speaker))
jobname = "Personal AI"
- else if (isAutoAnnouncer(speaker))
+ else if(isAutoAnnouncer(speaker))
var/mob/living/automatedannouncer/AA = speaker
jobname = AA.role
else
@@ -178,7 +182,7 @@
formatted = language.format_message_radio(message, verb)
else
formatted = "[verb], \"[message]\" "
- if(sdisabilities & DEAF || ear_deaf)
+ if(disabilities & DEAF || ear_deaf)
if(prob(20))
to_chat(src, "You feel your headset vibrate but can hear nothing from it! ")
else if(track)
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index 09f8009be75..ed867cd5178 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -48,10 +48,10 @@
if(istype(M))
M.unEquip(src)
to_chat(M, "[src] wriggles out of your grip!")
- to_chat(src, "You wriggle out of [M]'s grip!")
- else if(istype(src.loc,/obj/item))
- to_chat(src, "You struggle free of [src.loc].")
- src.forceMove(get_turf(src))
+ to_chat(L, "You wriggle out of [M]'s grip!")
+ else if(istype(loc,/obj/item))
+ to_chat(L, "You struggle free of [loc].")
+ forceMove(get_turf(src))
if(istype(M))
for(var/atom/A in M.contents)
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index bbc313e0421..559dac3abbf 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -165,7 +165,7 @@
return list(wear_mask, back, l_hand, r_hand)
/mob/proc/get_id_card()
- for(var/obj/item/I in src.get_all_slots())
+ for(var/obj/item/I in get_all_slots())
. = I.GetID()
if(.)
break
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 6abd4acd6fc..abe6742fecc 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -276,6 +276,24 @@
flags = RESTRICTED | WHITELISTED
syllables = list("blob","plop","pop","bop","boop")
+/datum/language/grey
+ name = "Psionic Communication"
+ desc = "The grey's psionic communication, less potent version of their distant cousin's telepathy. Talk to other greys within a limited radius."
+ speech_verb = "expresses"
+ ask_verb = "inquires"
+ exclaim_verb = "imparts"
+ colour = "abductor"
+ key = "^"
+ flags = RESTRICTED | HIVEMIND
+
+/datum/language/grey/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
+ ..(speaker,message,speaker.real_name)
+
+/datum/language/grey/check_special_condition(var/mob/living/carbon/human/other, var/mob/living/carbon/human/speaker)
+ if(other in range(7, speaker))
+ return 1
+ return 0
+
/datum/language/drask
name = "Orluum"
desc = "The droning, vibrous language of the Drask. It sounds somewhat like whalesong."
@@ -354,7 +372,7 @@
speech_verb = "growls"
ask_verb = "gnarls"
exclaim_verb = "snarls"
- colour = "rough"
+ colour = "gutter"
key = "3"
syllables = list ("gra","ba","ba","breh","bra","rah","dur","ra","ro","gro","go","ber","bar","geh","heh", "gra")
@@ -500,24 +518,24 @@
if(!speaker.binarycheck())
return
- if (!message)
+ if(!message)
return
var/message_start = "[name], [speaker.name] "
var/message_body = "[speaker.say_quote(message)], \"[message]\" "
- for (var/mob/M in dead_mob_list)
+ for(var/mob/M in dead_mob_list)
if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain))
var/message_start_dead = "[name], [speaker.name] ([ghost_follow_link(speaker, ghost=M)]) "
M.show_message("[message_start_dead] [message_body]", 2)
- for (var/mob/living/S in living_mob_list)
+ for(var/mob/living/S in living_mob_list)
if(drone_only && !istype(S,/mob/living/silicon/robot/drone))
continue
else if(istype(S , /mob/living/silicon/ai))
message_start = "[name], [speaker.name] "
- else if (!S.binarycheck())
+ else if(!S.binarycheck())
continue
S.show_message("[message_start] [message_body]", 2)
@@ -525,17 +543,11 @@
var/list/listening = hearers(1, src)
listening -= src
- for (var/mob/living/M in listening)
+ for(var/mob/living/M in listening)
if(istype(M, /mob/living/silicon) || M.binarycheck())
continue
M.show_message("synthesised voice beeps, \"beep beep beep\" ",2)
- //robot binary xmitter component power usage
- if (isrobot(speaker))
- var/mob/living/silicon/robot/R = speaker
- var/datum/robot_component/C = R.components["comms"]
- R.use_power(C.energy_consumption)
-
/datum/language/binary/drone
name = "Drone Talk"
desc = "A heavily encoded damage control coordination stream."
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 6192b0acc6b..124a1120df6 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -118,11 +118,11 @@
/mob/living/carbon/alien/handle_mutations_and_radiation()
// Aliens love radiation nom nom nom
- if (radiation)
- if (radiation > 100)
+ if(radiation)
+ if(radiation > 100)
radiation = 100
- if (radiation < 0)
+ if(radiation < 0)
radiation = 0
switch(radiation)
@@ -217,7 +217,7 @@
if(judgebot.check_for_weapons(r_hand))
threatcount += 4
- //Loyalty implants imply trustworthyness
+ //Mindshield implants imply trustworthyness
if(isloyal(src))
threatcount -= 1
@@ -228,8 +228,8 @@ Proc: AddInfectionImages()
Des: Gives the client of the alien an image on each infected mob.
----------------------------------------*/
/mob/living/carbon/alien/proc/AddInfectionImages()
- if (client)
- for (var/mob/living/C in mob_list)
+ if(client)
+ for(var/mob/living/C in mob_list)
if(C.status_flags & XENO_HOST)
var/obj/item/organ/internal/body_egg/alien_embryo/A = C.get_int_organ(/obj/item/organ/internal/body_egg/alien_embryo)
if(A)
@@ -243,7 +243,7 @@ Proc: RemoveInfectionImages()
Des: Removes all infected images from the alien.
----------------------------------------*/
/mob/living/carbon/alien/proc/RemoveInfectionImages()
- if (client)
+ if(client)
for(var/image/I in client.images)
if(dd_hasprefix_case(I.icon_state, "infected"))
qdel(I)
diff --git a/code/modules/mob/living/carbon/alien/alien_defenses.dm b/code/modules/mob/living/carbon/alien/alien_defenses.dm
index 397a14fc259..3f2e2d28b78 100644
--- a/code/modules/mob/living/carbon/alien/alien_defenses.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defenses.dm
@@ -6,17 +6,17 @@ As such, they can either help or harm other aliens. Help works like the human he
In all, this is a lot like the monkey code. /N
*/
/mob/living/carbon/alien/attack_alien(mob/living/carbon/alien/M as mob)
- if (!ticker)
+ if(!ticker)
to_chat(M, "You cannot attack people before the game has started.")
return
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
+ if(istype(loc, /turf) && istype(loc.loc, /area/start))
to_chat(M, "No attacking people at spawn, you jackass.")
return
switch(M.a_intent)
- if (I_HELP)
+ if(I_HELP)
sleeping = max(0,sleeping-5)
resting = 0
AdjustParalysis(-3)
@@ -24,12 +24,12 @@ In all, this is a lot like the monkey code. /N
AdjustWeakened(-3)
visible_message("[M.name] nuzzles [src] trying to wake it up! ")
- if (I_GRAB)
+ if(I_GRAB)
src.grabbedby(M)
return 1
else
- if (health > 0)
+ if(health > 0)
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
var/damage = 1
visible_message("[M.name] bites [src]! ", \
@@ -57,7 +57,7 @@ In all, this is a lot like the monkey code. /N
help_shake_act(M)
if(I_GRAB)
src.grabbedby(M)
- if (I_HARM, I_DISARM)
+ if(I_HARM, I_DISARM)
return 1
return 0
diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
index 9311ab0592f..28439ab0ff2 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
@@ -57,10 +57,10 @@ Doesn't work on other aliens/AI.*/
if(isalien(M))
var/amount = input("Amount:", "Transfer Plasma to [M]") as num
- if (amount)
+ if(amount)
amount = abs(round(amount))
if(powerc(amount))
- if (get_dist(src,M) <= 1)
+ if(get_dist(src,M) <= 1)
M.adjustPlasma(amount)
adjustPlasma(-amount)
to_chat(M, "[src] has transfered [amount] plasma to you. ")
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 a5e72059ab8..f0af54a45ab 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -18,8 +18,8 @@
/mob/living/carbon/alien/humanoid/hunter/handle_regular_hud_updates()
..() //-Yvarov
- if (healths)
- if (stat != 2)
+ if(healths)
+ if(stat != 2)
switch(health)
if(125 to INFINITY)
healths.icon_state = "health0"
@@ -85,7 +85,7 @@
leaping = 0
update_icons()
-/mob/living/carbon/alien/humanoid/hunter/throw_impact(A)
+/mob/living/carbon/alien/humanoid/hunter/throw_impact(atom/A)
if(!leaping)
return ..()
@@ -93,20 +93,26 @@
if(A)
if(istype(A, /mob/living))
var/mob/living/L = A
- L.visible_message("[src] pounces on [L]! ", "[src] pounces on you! ")
- if(ishuman(L))
- var/mob/living/carbon/human/H = L
- H.apply_effect(5, WEAKEN, H.run_armor_check(null, "melee"))
- else
- L.Weaken(5)
- sleep(2)//Runtime prevention (infinite bump() calls on hulks)
- step_towards(src,L)
+ var/blocked = 0
+ if(ishuman(A))
+ var/mob/living/carbon/human/H = A
+ if(H.check_shields(90, "the [name]", src, attack_type = THROWN_PROJECTILE_ATTACK))
+ blocked = 1
+ if(!blocked)
+ L.visible_message("[src] pounces on [L]! ", "[src] pounces on you! ")
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ H.apply_effect(5, WEAKEN, H.run_armor_check(null, "melee"))
+ else
+ L.Weaken(5)
+ sleep(2)//Runtime prevention (infinite bump() calls on hulks)
+ step_towards(src,L)
toggle_leap(0)
pounce_cooldown = !pounce_cooldown
spawn(pounce_cooldown_time) //3s by default
pounce_cooldown = !pounce_cooldown
- else
+ else if(A.density && !A.CanPass(src))
visible_message("[src] smashes into [A]! ", "[src] smashes into [A]! ")
weakened = 2
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
index 831d01dbc87..d93fb0a835c 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
@@ -49,8 +49,8 @@
/mob/living/carbon/alien/humanoid/sentinel/handle_regular_hud_updates()
..() //-Yvarov
- if (healths)
- if (stat != 2)
+ if(healths)
+ if(stat != 2)
switch(health)
if(150 to INFINITY)
healths.icon_state = "health0"
diff --git a/code/modules/mob/living/carbon/alien/humanoid/emote.dm b/code/modules/mob/living/carbon/alien/humanoid/emote.dm
new file mode 100644
index 00000000000..05eb2c8e226
--- /dev/null
+++ b/code/modules/mob/living/carbon/alien/humanoid/emote.dm
@@ -0,0 +1,115 @@
+/mob/living/carbon/alien/humanoid/emote(var/act,var/m_type=1,var/message = null)
+ var/param = null
+ if(findtext(act, "-", 1, null))
+ var/t1 = findtext(act, "-", 1, null)
+ param = copytext(act, t1 + 1, length(act) + 1)
+ act = copytext(act, 1, t1)
+
+// if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
+// act = copytext(act,1,length(act)) //seriously who the fuck wrote this
+ var/muzzled = is_muzzled()
+ act = lowertext(act)
+ switch(act)
+ if("sign")
+ if(!restrained())
+ var/num = null
+ if(text2num(param))
+ num = "the number [text2num(param)]"
+ if(num)
+ message = "\The [src] signs [num]."
+ m_type = 1
+ if("burp")
+ if(!muzzled)
+ message = "\The [src] burps."
+ m_type = 2
+ if("deathgasp")
+ message = "\The [src] lets out a waning guttural screech, green blood bubbling from its maw..."
+ m_type = 2
+ if("scratch")
+ if(!src.restrained())
+ message = "\The [src] scratches."
+ m_type = 1
+ if("whimper")
+ if(!muzzled)
+ message = "\The [src] whimpers."
+ m_type = 2
+ if("roar")
+ if(!muzzled)
+ message = "\The [src] roars."
+ m_type = 2
+ if("hiss")
+ if(!muzzled)
+ message = "\The [src] hisses."
+ m_type = 2
+ if("tail")
+ message = "\The [src] waves its tail."
+ m_type = 1
+ if("gasp")
+ message = "\The [src] gasps."
+ m_type = 2
+ if("shiver")
+ message = "\The [src] shivers."
+ m_type = 2
+ if("drool")
+ message = "\The [src] drools."
+ m_type = 1
+ if("scretch")
+ if(!muzzled)
+ message = "\The [src] scretches."
+ m_type = 2
+ if("choke")
+ message = "\The [src] chokes."
+ m_type = 2
+ if("moan")
+ message = "\The [src] moans!"
+ m_type = 2
+ if("nod")
+ message = "\The [src] nods its head."
+ m_type = 1
+ if("sit")
+ message = "\The [src] sits down."
+ m_type = 1
+ if("sway")
+ message = "\The [src] sways around dizzily."
+ m_type = 1
+ if("sulk")
+ message = "\The [src] sulks down sadly."
+ m_type = 1
+ if("twitch")
+ message = "\The [src] twitches violently."
+ m_type = 1
+ if("dance")
+ if(!src.restrained())
+ message = "\The [src] dances around happily."
+ m_type = 1
+ if("roll")
+ if(!src.restrained())
+ message = "\The [src] rolls."
+ m_type = 1
+ if("shake")
+ message = "\The [src] shakes its head."
+ m_type = 1
+ if("gnarl")
+ if(!muzzled)
+ message = "\The [src] gnarls and shows its teeth.."
+ m_type = 2
+ if("jump")
+ message = "\The [src] jumps!"
+ m_type = 1
+ if("collapse")
+ Paralyse(2)
+ message = "\The [src] collapses!"
+ m_type = 2
+ if("flip")
+ m_type = 1
+ message = "\The [src] does a flip!"
+ src.SpinAnimation(5,1)
+ if("help")
+ to_chat(src, "burp, flip, deathgasp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper")
+
+ if(!stat)
+ if(act == "roar")
+ playsound(src.loc, 'sound/voice/hiss5.ogg', 40, 1, 1)
+ if(act == "deathgasp")
+ playsound(src.loc, 'sound/voice/hiss6.ogg', 80, 1, 1)
+ ..(act, m_type, message)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/humanoid/empress.dm b/code/modules/mob/living/carbon/alien/humanoid/empress.dm
index ffc8e04429e..d2553c9a28f 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/empress.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/empress.dm
@@ -56,8 +56,8 @@
..() //-Yvarov
- if (src.healths)
- if (src.stat != 2)
+ if(src.healths)
+ if(src.stat != 2)
switch(health)
if(250 to INFINITY)
src.healths.icon_state = "health0"
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 90fe6537759..9f47fc9910c 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -29,22 +29,22 @@
//This is fine, works the same as a human
/mob/living/carbon/alien/humanoid/Bump(atom/movable/AM as mob|obj, yes)
spawn( 0 )
- if ((!( yes ) || now_pushing))
+ if((!( yes ) || now_pushing))
return
now_pushing = 0
..()
- if (!istype(AM, /atom/movable))
+ if(!istype(AM, /atom/movable))
return
- if (ismob(AM))
+ if(ismob(AM))
var/mob/tmob = AM
tmob.LAssailant = src
- if (!now_pushing)
+ if(!now_pushing)
now_pushing = 1
- if (!AM.anchored)
+ if(!AM.anchored)
var/t = get_dir(src, AM)
- if (istype(AM, /obj/structure/window/full))
+ if(istype(AM, /obj/structure/window/full))
for(var/obj/structure/window/win in get_step(AM,t))
now_pushing = 0
return
@@ -55,13 +55,13 @@
/mob/living/carbon/alien/humanoid/movement_delay()
var/tally = 0
- if (istype(src, /mob/living/carbon/alien/humanoid/queen))
+ if(istype(src, /mob/living/carbon/alien/humanoid/queen))
tally += 4
- if (istype(src, /mob/living/carbon/alien/humanoid/drone))
+ if(istype(src, /mob/living/carbon/alien/humanoid/drone))
tally += 0
- if (istype(src, /mob/living/carbon/alien/humanoid/sentinel))
+ if(istype(src, /mob/living/carbon/alien/humanoid/sentinel))
tally += 0
- if (istype(src, /mob/living/carbon/alien/humanoid/hunter))
+ if(istype(src, /mob/living/carbon/alien/humanoid/hunter))
tally = -2 // hunters go supersuperfast
return (tally + move_delay_add + config.alien_delay)
@@ -85,26 +85,24 @@
var/b_loss = null
var/f_loss = null
- switch (severity)
- if (1.0)
+ switch(severity)
+ if(1.0)
gib()
return
- if (2.0)
- if (!shielded)
+ if(2.0)
+ if(!shielded)
b_loss += 60
f_loss += 60
- ear_damage += 30
- ear_deaf += 120
+ adjustEarDamage(30, 120)
if(3.0)
b_loss += 30
- if (prob(50) && !shielded)
+ if(prob(50) && !shielded)
Paralyse(1)
- ear_damage += 15
- ear_deaf += 60
+ adjustEarDamage(15,60)
adjustBruteLoss(b_loss)
adjustFireLoss(f_loss)
@@ -112,13 +110,13 @@
updatehealth()
/mob/living/carbon/alien/humanoid/attack_slime(mob/living/carbon/slime/M as mob)
- if (!ticker)
+ if(!ticker)
to_chat(M, "You cannot attack people before the game has started.")
return
if(M.Victim) return // can't attack while eating!
- if (stat > -100)
+ if(stat > -100)
M.do_attack_animation(src)
visible_message("The [M.name] glomps [src]! ", \
@@ -153,7 +151,7 @@
"The [M.name] has shocked [src]! ")
Weaken(power)
- if (stuttering < power)
+ if(stuttering < power)
stuttering = power
Stun(power)
@@ -161,7 +159,7 @@
s.set_up(5, 1, src)
s.start()
- if (prob(stunprob) && M.powerlevel >= 8)
+ if(prob(stunprob) && M.powerlevel >= 8)
adjustFireLoss(M.powerlevel * rand(6,10))
@@ -183,11 +181,11 @@
updatehealth()
/mob/living/carbon/alien/humanoid/attack_hand(mob/living/carbon/human/M as mob)
- if (!ticker)
+ if(!ticker)
to_chat(M, "You cannot attack people before the game has started.")
return
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
+ if(istype(loc, /turf) && istype(loc.loc, /area/start))
to_chat(M, "No attacking people at spawn, you jackass.")
return
@@ -196,17 +194,17 @@
switch(M.a_intent)
- if (I_HELP)
+ if(I_HELP)
help_shake_act(M)
- if (I_GRAB)
+ if(I_GRAB)
grabbedby(M)
- if (I_HARM)
+ if(I_HARM)
M.do_attack_animation(src)
var/damage = rand(1, 9)
- if (prob(90))
- if (HULK in M.mutations)//HULK SMASH
+ if(prob(90))
+ if(HULK in M.mutations)//HULK SMASH
damage = 15
spawn(0)
Paralyse(1)
@@ -216,7 +214,7 @@
playsound(loc, "punch", 25, 1, -1)
visible_message("[M] has punched [src]! ", \
"[M] has punched [src]! ")
- if ((stat != DEAD) && (damage > 9||prob(5)))//Regular humans have a very small chance of weakening an alien.
+ if((stat != DEAD) && (damage > 9||prob(5)))//Regular humans have a very small chance of weakening an alien.
Paralyse(2)
visible_message("[M] has weakened [src]! ", \
"[M] has weakened [src]! ", \
@@ -227,15 +225,15 @@
playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
visible_message("[M] has attempted to punch [src]! ")
- if (I_DISARM)
- if (!lying)
- if (prob(5))//Very small chance to push an alien down.
+ if(I_DISARM)
+ if(!lying)
+ if(prob(5))//Very small chance to push an alien down.
Paralyse(2)
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
visible_message("[M] has pushed down [src]! ", \
"[M] has pushed down [src]! ")
else
- if (prob(50))
+ if(prob(50))
drop_item()
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
visible_message("[M] has disarmed [src]! ", \
@@ -251,11 +249,11 @@ In all, this is a lot like the monkey code. /N
*/
/mob/living/carbon/alien/humanoid/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
- if (!ticker)
+ if(!ticker)
to_chat(M, "You cannot attack people before the game has started.")
return
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
+ if(istype(loc, /turf) && istype(loc.loc, /area/start))
to_chat(M, "No attacking people at spawn, you jackass.")
return
@@ -263,7 +261,7 @@ In all, this is a lot like the monkey code. /N
switch(M.a_intent)
- if (I_HELP)
+ if(I_HELP)
sleeping = max(0,sleeping-5)
resting = 0
AdjustParalysis(-3)
@@ -272,7 +270,7 @@ In all, this is a lot like the monkey code. /N
visible_message("[M.name] nuzzles [src] trying to wake it up! ")
else
- if (health > 0)
+ if(health > 0)
M.do_attack_animation(src)
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
var/damage = rand(1, 3)
@@ -294,7 +292,7 @@ In all, this is a lot like the monkey code. /N
else
- if (health > 0)
+ if(health > 0)
L.do_attack_animation(src)
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
var/damage = rand(1, 3)
@@ -310,7 +308,7 @@ In all, this is a lot like the monkey code. /N
/mob/living/carbon/alien/humanoid/restrained()
- if (handcuffed)
+ if(handcuffed)
return 1
return 0
diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm
index b41d5a9705d..4cccb6e57ed 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/life.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm
@@ -15,24 +15,24 @@
/mob/living/carbon/alien/humanoid/handle_disabilities()
- if (disabilities & EPILEPSY)
- if ((prob(1) && paralysis < 10))
+ if(disabilities & EPILEPSY)
+ if((prob(1) && paralysis < 10))
to_chat(src, "You have a seizure! ")
Paralyse(10)
- if (disabilities & COUGHING)
- if ((prob(5) && paralysis <= 1))
+ if(disabilities & COUGHING)
+ if((prob(5) && paralysis <= 1))
drop_item()
spawn( 0 )
emote("cough")
return
- if (disabilities & TOURETTES)
- if ((prob(10) && paralysis <= 1))
+ if(disabilities & TOURETTES)
+ if((prob(10) && paralysis <= 1))
Stun(10)
spawn( 0 )
emote("twitch")
return
- if (disabilities & NERVOUS)
- if (prob(10))
+ if(disabilities & NERVOUS)
+ if(prob(10))
stuttering = max(10, stuttering)
/mob/living/carbon/alien/humanoid/proc/adjust_body_temperature(current, loc_temp, boost)
@@ -59,7 +59,7 @@
blinded = 1
silent = 0
else //ALIVE. LIGHTS ARE ON
- if(health < config.health_threshold_dead || brain_op_stage == 4.0)
+ if(health < config.health_threshold_dead || !get_int_organ(/obj/item/organ/internal/brain))
death()
blinded = 1
stat = DEAD
@@ -95,7 +95,7 @@
move_delay_add = max(0, move_delay_add - rand(1, 2))
//Eyes
- if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own
+ if(disabilities & BLIND) //disabled-blind, doesn't get better on its own
blinded = 1
else if(eye_blind) //blindness, heals slowly over time
eye_blind = max(eye_blind-1,0)
@@ -104,12 +104,12 @@
eye_blurry = max(eye_blurry-1, 0)
//Ears
- if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own
- ear_deaf = max(ear_deaf, 1)
+ if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own
+ setEarDamage(-1, max(ear_deaf, 1))
else if(ear_deaf) //deafness, heals slowly over time
- ear_deaf = max(ear_deaf-1, 0)
+ adjustEarDamage(0,-1)
else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs
- ear_damage = max(ear_damage-0.05, 0)
+ adjustEarDamage(-0.05, 0)
//Other
if(stunned)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
index 2b5060468a1..daba3852764 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
@@ -34,8 +34,8 @@
/mob/living/carbon/alien/humanoid/queen/handle_regular_hud_updates()
..() //-Yvarov
- if (healths)
- if (stat != DEAD)
+ if(healths)
+ if(stat != DEAD)
switch(health)
if(250 to INFINITY)
healths.icon_state = "health0"
@@ -88,37 +88,4 @@
icon_state = "queen_s"
for(var/image/I in overlays_standing)
- overlays += I
-
-
-/*
-/mob/living/carbon/alien/humanoid/queen/verb/evolve() // -- TLE
- set name = "Evolve (1000)"
- set desc = "The ultimate transformation. Become an alien Empress. Only one empress can exist at a time."
- set category = "Alien"
-
- if(powerc(1000))
- // Queen check
- var/no_queen = 1
- for(var/mob/living/carbon/alien/humanoid/empress/E in living_mob_list)
- if(!E.key && E.brain_op_stage != 4)
- continue
- no_queen = 0
-
- if(no_queen)
- adjustToxLoss(-1000)
- to_chat(src, "You begin to evolve! ")
- for(var/mob/O in viewers(src, null))
- O.show_message(text("[src] begins to twist and contort! "), 1)
- var/mob/living/carbon/alien/humanoid/empress/new_xeno = new(loc)
- if(mind)
- mind.transfer_to(new_xeno)
- else
- new_xeno.key = key
- new_xeno.mind.name = new_xeno.name
- qdel(src)
- else
- to_chat(src, "We already have an alive empress. ")
- return
-
-*/
\ No newline at end of file
+ overlays += I
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
index fb489552f78..898d23de066 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
@@ -56,7 +56,7 @@
/mob/living/carbon/alien/humanoid/regenerate_icons()
..()
- if (notransform) return
+ if(notransform) return
update_inv_head(0,0)
update_inv_wear_suit(0,0)
@@ -103,7 +103,7 @@
t_suit = "armor"
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "[t_suit]blood")
- if (istype(wear_suit, /obj/item/clothing/suit/straight_jacket))
+ if(istype(wear_suit, /obj/item/clothing/suit/straight_jacket))
unEquip(handcuffed)
drop_r_hand()
drop_l_hand()
@@ -115,7 +115,7 @@
/mob/living/carbon/alien/humanoid/update_inv_head(var/update_icons=1)
- if (head)
+ if(head)
var/t_state = head.item_state
if(!t_state) t_state = head.icon_state
var/image/standing = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "[t_state]")
diff --git a/code/modules/mob/living/carbon/alien/larva/emote.dm b/code/modules/mob/living/carbon/alien/larva/emote.dm
new file mode 100644
index 00000000000..01d834b07cf
--- /dev/null
+++ b/code/modules/mob/living/carbon/alien/larva/emote.dm
@@ -0,0 +1,126 @@
+/mob/living/carbon/alien/larva/emote(var/act,var/m_type=1,var/message = null)
+ var/param = null
+ if(findtext(act, "-", 1, null))
+ var/t1 = findtext(act, "-", 1, null)
+ param = copytext(act, t1 + 1, length(act) + 1)
+ act = copytext(act, 1, t1)
+
+ if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
+ act = copytext(act,1,length(act))
+ var/muzzled = is_muzzled()
+ act = lowertext(act)
+ switch(act)
+ if("me")
+ if(silent)
+ return
+ if(src.client)
+ if(client.prefs.muted & MUTE_IC)
+ to_chat(src, "\red You cannot send IC messages (muted).")
+ return
+ if(src.client.handle_spam_prevention(message,MUTE_IC))
+ return
+ if(stat)
+ return
+ if(!(message))
+ return
+ return custom_emote(m_type, message)
+
+ if("custom")
+ return custom_emote(m_type, message)
+ if("sign")
+ if(!src.restrained())
+ message = text("The alien signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null))
+ m_type = 1
+ if("burp")
+ if(!muzzled)
+ message = "[src] burps."
+ m_type = 2
+ if("scratch")
+ if(!src.restrained())
+ message = "The [src.name] scratches."
+ m_type = 1
+ if("whimper")
+ if(!muzzled)
+ message = "The [src.name] whimpers."
+ m_type = 2
+// if("roar")
+// if(!muzzled)
+// message = "The [src.name] roars." Commenting out since larva shouldn't roar /N
+// m_type = 2
+ if("tail")
+ message = "The [src.name] waves its tail."
+ m_type = 1
+ if("gasp")
+ message = "The [src.name] gasps."
+ m_type = 2
+ if("shiver")
+ message = "The [src.name] shivers."
+ m_type = 2
+ if("drool")
+ message = "The [src.name] drools."
+ m_type = 1
+ if("scretch")
+ if(!muzzled)
+ message = "The [src.name] scretches."
+ m_type = 2
+ if("choke")
+ message = "The [src.name] chokes."
+ m_type = 2
+ if("moan")
+ message = "The [src.name] moans!"
+ m_type = 2
+ if("nod")
+ message = "The [src.name] nods its head."
+ m_type = 1
+// if("sit")
+// message = "The [src.name] sits down." //Larvan can't sit down, /N
+// m_type = 1
+ if("sway")
+ message = "The [src.name] sways around dizzily."
+ m_type = 1
+ if("sulk")
+ message = "The [src.name] sulks down sadly."
+ m_type = 1
+ if("twitch")
+ message = "The [src.name] twitches violently."
+ m_type = 1
+ if("dance")
+ if(!src.restrained())
+ message = "The [src.name] dances around happily."
+ m_type = 1
+ if("roll")
+ if(!src.restrained())
+ message = "The [src.name] rolls."
+ m_type = 1
+ if("shake")
+ message = "The [src.name] shakes its head."
+ m_type = 1
+ if("gnarl")
+ if(!muzzled)
+ message = "The [src.name] gnarls and shows its teeth.."
+ m_type = 2
+ if("jump")
+ message = "The [src.name] jumps!"
+ m_type = 1
+ if("hiss_")
+ message = "The [src.name] hisses softly."
+ m_type = 1
+ if("collapse")
+ Paralyse(2)
+ message = text("[] collapses!", src)
+ m_type = 2
+ if("help")
+ to_chat(src, "burp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roll, scratch,\nscretch, shake, sign-#, sulk, sway, tail, twitch, whimper")
+ else
+ to_chat(src, text("Invalid Emote: []", act))
+ if((message && src.stat == 0))
+ log_emote("[name]/[key] : [message]")
+ if(m_type & 1)
+ for(var/mob/O in viewers(src, null))
+ O.show_message(message, m_type)
+ //Foreach goto(703)
+ else
+ for(var/mob/O in hearers(src, null))
+ O.show_message(message, m_type)
+ //Foreach goto(746)
+ return
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index a513ab76a90..19f3368ce96 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -31,7 +31,7 @@
/mob/living/carbon/alien/larva/Bump(atom/movable/AM as mob|obj, yes)
spawn( 0 )
- if ((!( yes ) || now_pushing))
+ if((!( yes ) || now_pushing))
return
now_pushing = 1
if(ismob(AM))
@@ -48,11 +48,11 @@
now_pushing = 0
..()
- if (!( istype(AM, /atom/movable) ))
+ if(!( istype(AM, /atom/movable) ))
return
- if (!( now_pushing ))
+ if(!( now_pushing ))
now_pushing = 1
- if (!( AM.anchored ))
+ if(!( AM.anchored ))
var/t = get_dir(src, AM)
step(AM, t)
now_pushing = null
@@ -76,26 +76,24 @@
var/b_loss = null
var/f_loss = null
- switch (severity)
- if (1.0)
+ switch(severity)
+ if(1.0)
gib()
return
- if (2.0)
+ if(2.0)
b_loss += 60
f_loss += 60
- ear_damage += 30
- ear_deaf += 120
+ adjustEarDamage(30,120)
if(3.0)
b_loss += 30
- if (prob(50))
+ if(prob(50))
Paralyse(1)
- ear_damage += 15
- ear_deaf += 60
+ adjustEarDamage(15,60)
adjustBruteLoss(b_loss)
adjustFireLoss(f_loss)
@@ -123,14 +121,14 @@
/mob/living/carbon/alien/larva/attack_slime(mob/living/carbon/slime/M as mob)
- if (!ticker)
+ if(!ticker)
to_chat(M, "You cannot attack people before the game has started.")
return
if(M.Victim)
return // can't attack while eating!
- if (stat != DEAD)
+ if(stat != DEAD)
M.do_attack_animation(src)
visible_message("The [M.name] glomps [src]! ", \
"The [M.name] glomps [src]! ")
@@ -148,11 +146,11 @@
return
/mob/living/carbon/alien/larva/attack_hand(mob/living/carbon/human/M as mob)
- if (!ticker)
+ if(!ticker)
to_chat(M, "You cannot attack people before the game has started.")
return
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
+ if(istype(loc, /turf) && istype(loc.loc, /area/start))
to_chat(M, "No attacking people at spawn, you jackass.")
return
@@ -160,17 +158,17 @@
switch(M.a_intent)
- if (I_HELP)
+ if(I_HELP)
help_shake_act(M)
- if (I_GRAB)
+ if(I_GRAB)
grabbedby(M)
else
M.do_attack_animation(src)
var/damage = rand(1, 9)
- if (prob(90))
- if (HULK in M.mutations)
+ if(prob(90))
+ if(HULK in M.mutations)
damage += 5
spawn(0)
Paralyse(1)
@@ -180,7 +178,7 @@
playsound(loc, "punch", 25, 1, -1)
visible_message("[M] has kicked [src]! ", \
"[M] has kicked [src]! ")
- if ((stat != DEAD) && (damage > 4.9))
+ if((stat != DEAD) && (damage > 4.9))
Paralyse(rand(5,10))
visible_message("[M] has weakened [src]! ", \
"[M] has weakened [src]! ", \
@@ -194,11 +192,11 @@
return
/mob/living/carbon/alien/larva/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
- if (!ticker)
+ if(!ticker)
to_chat(M, "You cannot attack people before the game has started.")
return
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
+ if(istype(loc, /turf) && istype(loc.loc, /area/start))
to_chat(M, "No attacking people at spawn, you jackass.")
return
@@ -206,7 +204,7 @@
switch(M.a_intent)
- if (I_HELP)
+ if(I_HELP)
sleeping = max(0,sleeping-5)
resting = 0
AdjustParalysis(-3)
@@ -215,7 +213,7 @@
visible_message("[M.name] nuzzles [src] trying to wake it up! ")
else
- if (health > 0)
+ if(health > 0)
M.do_attack_animation(src)
playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1)
var/damage = 1
diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm
index 4e7b974d855..76ceef6ad2e 100644
--- a/code/modules/mob/living/carbon/alien/larva/life.dm
+++ b/code/modules/mob/living/carbon/alien/larva/life.dm
@@ -19,7 +19,7 @@
blinded = 1
silent = 0
else //ALIVE. LIGHTS ARE ON
- if(health < -25 || brain_op_stage == 4.0)
+ if(health < -25 || !get_int_organ(/obj/item/organ/internal/brain))
death()
blinded = 1
silent = 0
@@ -54,7 +54,7 @@
move_delay_add = max(0, move_delay_add - rand(1, 2))
//Eyes
- if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own
+ if(disabilities & BLIND) //disabled-blind, doesn't get better on its own
blinded = 1
else if(eye_blind) //blindness, heals slowly over time
eye_blind = max(eye_blind-1,0)
@@ -63,12 +63,12 @@
eye_blurry = max(eye_blurry-1, 0)
//Ears
- if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own
- ear_deaf = max(ear_deaf, 1)
+ if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own
+ setEarDamage(-1, max(ear_deaf, 1))
else if(ear_deaf) //deafness, heals slowly over time
- ear_deaf = max(ear_deaf-1, 0)
+ adjustEarDamage(0,-1)
else if(ear_damage < 25) //ear damage heals slowly under this threshold.
- ear_damage = max(ear_damage-0.05, 0)
+ adjustEarDamage(-0.05,0)
//Other
if(stunned)
diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm
index 44351eb792a..678e4211b0d 100644
--- a/code/modules/mob/living/carbon/alien/larva/powers.dm
+++ b/code/modules/mob/living/carbon/alien/larva/powers.dm
@@ -7,17 +7,17 @@
if(stat != CONSCIOUS)
return
- if (layer != TURF_LAYER+0.2)
+ if(layer != TURF_LAYER+0.2)
layer = TURF_LAYER+0.2
to_chat(src, text("You are now hiding. "))
for(var/mob/O in oviewers(src, null))
- if ((O.client && !( O.blinded )))
+ if((O.client && !( O.blinded )))
to_chat(O, text("[] scurries to the ground! ", src))
else
layer = MOB_LAYER
to_chat(src, text("\green You have stopped hiding."))
for(var/mob/O in oviewers(src, null))
- if ((O.client && !( O.blinded )))
+ if((O.client && !( O.blinded )))
to_chat(O, text("[] slowly peaks up from the ground...", src))
/mob/living/carbon/alien/larva/verb/evolve()
diff --git a/code/modules/mob/living/carbon/alien/larva/update_icons.dm b/code/modules/mob/living/carbon/alien/larva/update_icons.dm
index 104811c4fc1..697d6413c02 100644
--- a/code/modules/mob/living/carbon/alien/larva/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/larva/update_icons.dm
@@ -12,11 +12,11 @@
if(stat == DEAD)
icon_state = "larva[state]_dead"
- else if (handcuffed || legcuffed) //This should be an overlay. Who made this an icon_state?
+ else if(handcuffed || legcuffed) //This should be an overlay. Who made this an icon_state?
icon_state = "larva[state]_cuff"
else if(stat == UNCONSCIOUS || lying || resting)
icon_state = "larva[state]_sleep"
- else if (stunned)
+ else if(stunned)
icon_state = "larva[state]_stun"
else
icon_state = "larva[state]"
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 151ed93e3ef..2038704023b 100644
--- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
+++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
@@ -98,7 +98,7 @@
new_xeno.mind.name = new_xeno.name
new_xeno.mind.assigned_role = "MODE"
new_xeno.mind.special_role = "Alien"
- to_chat(new_xeno, sound('sound/voice/hiss5.ogg',0,0,0,100))//To get the player's attention
+ new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100)//To get the player's attention
if(gib_on_success)
owner.gib()
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index f0935c520ce..6ea16fc24a1 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -52,7 +52,7 @@ var/const/MAX_ACTIVE_TIME = 400
to_chat(user, "[src] is not moving. ")
if(CONSCIOUS)
to_chat(user, "[src] seems to be active! ")
- if (sterile)
+ if(sterile)
to_chat(user, "It looks like the proboscis has been removed. ")
/obj/item/clothing/mask/facehugger/attackby(obj/item/O,mob/m, params)
@@ -148,7 +148,7 @@ var/const/MAX_ACTIVE_TIME = 400
target.equip_to_slot(src, slot_wear_mask,,0)
if(!sterile)
M.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings
- else if (iscorgi(M))
+ else if(iscorgi(M))
var/mob/living/simple_animal/pet/corgi/C = M
loc = C
C.facehugger = src
diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm
index 8e6da1eca78..aac43c16ac3 100644
--- a/code/modules/mob/living/carbon/brain/brain.dm
+++ b/code/modules/mob/living/carbon/brain/brain.dm
@@ -23,39 +23,44 @@
return ..()
say_understands(var/other)//Goddamn is this hackish, but this say code is so odd
- if (istype(other, /mob/living/silicon/ai))
+ if(istype(other, /mob/living/silicon/ai))
if(!(container && istype(container, /obj/item/device/mmi)))
return 0
else
return 1
- if (istype(other, /mob/living/silicon/decoy))
+ if(istype(other, /mob/living/silicon/decoy))
if(!(container && istype(container, /obj/item/device/mmi)))
return 0
else
return 1
- if (istype(other, /mob/living/silicon/pai))
+ if(istype(other, /mob/living/silicon/pai))
if(!(container && istype(container, /obj/item/device/mmi)))
return 0
else
return 1
- if (istype(other, /mob/living/silicon/robot))
+ if(istype(other, /mob/living/silicon/robot))
if(!(container && istype(container, /obj/item/device/mmi)))
return 0
else
return 1
- if (istype(other, /mob/living/carbon/human))
+ if(istype(other, /mob/living/carbon/human))
return 1
- if (istype(other, /mob/living/carbon/slime))
+ if(istype(other, /mob/living/carbon/slime))
return 1
return ..()
-/mob/living/carbon/brain/update_canmove()
+/mob/living/carbon/brain/update_canmove(delay_action_updates = 0)
if(in_contents_of(/obj/mecha))
canmove = 1
use_me = 1 //If it can move, let it emote
- else if(istype(loc, /obj/item/device/mmi)) canmove = 1 //mmi won't move anyways so whatever
- else canmove = 0
+ else if(istype(loc, /obj/item/device/mmi))
+ canmove = 1 //mmi won't move anyways so whatever
+ else
+ canmove = 0
+
+ if(!delay_action_updates)
+ update_action_buttons_icon()
return canmove
/mob/living/carbon/brain/ex_act() //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up.
@@ -94,4 +99,10 @@ I'm using this for Stat to give it a more nifty interface to work with
stat("Exosuit Integrity", "[!M.health ? "0" : "[(M.health / initial(M.health)) * 100]"]%")
/mob/living/carbon/brain/can_safely_leave_loc()
- return 0 //You're not supposed to be ethereal jaunting, brains
\ No newline at end of file
+ return 0 //You're not supposed to be ethereal jaunting, brains
+
+/mob/living/carbon/brain/adjustEarDamage()
+ return
+
+/mob/living/carbon/brain/setEarDamage() // no ears to damage or heal
+ return
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm
index 92c04ca0066..dd2e81ed35b 100644
--- a/code/modules/mob/living/carbon/brain/brain_item.dm
+++ b/code/modules/mob/living/carbon/brain/brain_item.dm
@@ -4,7 +4,7 @@
max_damage = 200
icon_state = "brain2"
force = 1.0
- w_class = 2.0
+ w_class = 2
throwforce = 1.0
throw_speed = 3
throw_range = 5
@@ -21,8 +21,7 @@
/obj/item/organ/internal/brain/surgeryize()
if(!owner)
return
- owner.ear_damage = 0 //Yeah, didn't you...hear? The ears are totally inside the brain.
- owner.ear_deaf = 0
+ owner.setEarDamage(0,0) //Yeah, didn't you...hear? The ears are totally inside the brain.
/obj/item/organ/internal/brain/xeno
name = "xenomorph brain"
diff --git a/code/modules/mob/living/carbon/brain/emote.dm b/code/modules/mob/living/carbon/brain/emote.dm
new file mode 100644
index 00000000000..23a609131f2
--- /dev/null
+++ b/code/modules/mob/living/carbon/brain/emote.dm
@@ -0,0 +1,51 @@
+/mob/living/carbon/brain/emote(var/act,var/m_type=1,var/message = null)
+ if(!(container && istype(container, /obj/item/device/mmi)))//No MMI, no emotes
+ return
+
+ if(findtext(act, "-", 1, null))
+ var/t1 = findtext(act, "-", 1, null)
+ act = copytext(act, 1, t1)
+
+ if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
+ act = copytext(act,1,length(act))
+
+ if(src.stat == DEAD)
+ return
+ act = lowertext(act)
+ switch(act)
+
+ if("alarm")
+ to_chat(src, "You sound an alarm.")
+ message = "\The [src] sounds an alarm."
+ m_type = 2
+ if("alert")
+ to_chat(src, "You let out a distressed noise.")
+ message = "\The [src] lets out a distressed noise."
+ m_type = 2
+ if("notice")
+ to_chat(src, "You play a loud tone.")
+ message = "\The [src] plays a loud tone."
+ m_type = 2
+ if("flash")
+ message = "The lights on \the [src] flash quickly."
+ m_type = 1
+ if("blink")
+ message = "\The [src] blinks."
+ m_type = 1
+ if("whistle")
+ to_chat(src, "You whistle.")
+ message = "\The [src] whistles."
+ m_type = 2
+ if("beep")
+ to_chat(src, "You beep.")
+ message = "\The [src] beeps."
+ m_type = 2
+ if("boop")
+ to_chat(src, "You boop.")
+ message = "\The [src] boops."
+ m_type = 2
+ if("help")
+ to_chat(src, "alarm, alert, notice, flash,blink, whistle, beep, boop")
+
+ if(message && !stat)
+ ..(act, m_type, message)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm
index 63eb38e607f..40273bf66ad 100644
--- a/code/modules/mob/living/carbon/brain/life.dm
+++ b/code/modules/mob/living/carbon/brain/life.dm
@@ -65,13 +65,13 @@
/mob/living/carbon/brain/handle_vision()
..()
- if (stat == 2 || (XRAY in src.mutations))
+ if(stat == 2 || (XRAY in src.mutations))
sight |= SEE_TURFS
sight |= SEE_MOBS
sight |= SEE_OBJS
see_in_dark = 8
see_invisible = SEE_INVISIBLE_LEVEL_TWO
- else if (stat != 2)
+ else if(stat != 2)
sight &= ~SEE_TURFS
sight &= ~SEE_MOBS
sight &= ~SEE_OBJS
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index f6cdb0362e3..aad88276473 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -64,7 +64,7 @@
if(!C || brainmob.key || 0 == searching) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located.
if(response == "Yes")
transfer_personality(C.mob)
- else if (response == "Never for this round")
+ else if(response == "Never for this round")
C.prefs.be_special -= ROLE_POSIBRAIN
// This should not ever happen, but let's be safe
@@ -99,7 +99,7 @@
src.brainmob.mind.assigned_role = "Positronic Brain"
var/turf/T = get_turf_or_move(src.loc)
- for (var/mob/M in viewers(T))
+ for(var/mob/M in viewers(T))
M.show_message("\blue The positronic brain chimes quietly.")
icon_state = "posibrain-occupied"
@@ -110,7 +110,7 @@
icon_state = "posibrain"
var/turf/T = get_turf_or_move(src.loc)
- for (var/mob/M in viewers(T))
+ for(var/mob/M in viewers(T))
M.show_message("\blue The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?")
/obj/item/device/mmi/posibrain/Topic(href,href_list)
@@ -144,11 +144,12 @@
/obj/item/device/mmi/posibrain/examine(mob/user)
+ to_chat(user, "*---------* ")
if(!..(user))
+ to_chat(user, "*---------* ")
return
- var/msg = "*---------*\nThis is \icon[src] \a [src] !\n[desc]\n"
- msg += ""
+ var/msg = ""
if(src.brainmob && src.brainmob.key)
switch(src.brainmob.stat)
@@ -158,7 +159,7 @@
if(DEAD) msg += "It appears to be completely inactive. \n"
else
msg += "It appears to be completely inactive. \n"
- msg += "*---------* "
+ msg += "*---------* "
to_chat(user, msg)
/obj/item/device/mmi/posibrain/emp_act(severity)
@@ -182,7 +183,6 @@
src.brainmob.container = src
src.brainmob.stat = 0
src.brainmob.silent = 0
- src.brainmob.brain_op_stage = 4.0
dead_mob_list -= src.brainmob
..()
@@ -192,7 +192,7 @@
volunteer(O)
else
var/turf/T = get_turf_or_move(src.loc)
- for (var/mob/M in viewers(T))
+ for(var/mob/M in viewers(T))
M.show_message("\blue The positronic brain pings softly.")
/obj/item/device/mmi/posibrain/ipc
diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm
index 03d6906b876..a343d245424 100644
--- a/code/modules/mob/living/carbon/brain/say.dm
+++ b/code/modules/mob/living/carbon/brain/say.dm
@@ -1,6 +1,6 @@
//TODO: Convert this over for languages.
/mob/living/carbon/brain/say(var/message, var/datum/language/speaking = null)
- if (silent)
+ if(silent)
return
if(!(container && istype(container, /obj/item/device/mmi)))
@@ -24,9 +24,9 @@
if("headset")
var/radio_worked = 0 // If any of the radios our brainmob could use functioned, this is set true so that we don't use any others
// I'm doing it this way so that if the mecha radio fails for some reason, a radio MMI still has the built-in fallback
- if (container && istype(container,/obj/item/device/mmi))
+ if(container && istype(container,/obj/item/device/mmi))
var/obj/item/device/mmi/c = container
- if (!radio_worked && c.mecha)
+ if(!radio_worked && c.mecha)
var/obj/mecha/metalgear = c.mecha
if(metalgear.radio)
radio_worked = metalgear.radio.talk_into(src, message, message_mode, verb, speaking)
@@ -36,7 +36,7 @@
if(R.radio)
radio_worked = R.radio.talk_into(src, message, message_mode, verb, speaking)
return radio_worked
- if ("whisper")
+ if("whisper")
whisper_say(message, speaking, alt_name)
return 1
else return 0
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index f9afba579fb..f30ff8ed0f2 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -25,7 +25,7 @@
return ..()
/mob/living/carbon/blob_act()
- if (stat == DEAD)
+ if(stat == DEAD)
return
else
show_message("The blob attacks! ")
@@ -65,7 +65,7 @@
if(istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src
var/obj/item/organ/external/organ = H.get_organ("chest")
- if (istype(organ))
+ if(istype(organ))
if(organ.take_damage(d, 0))
H.UpdateDamageIcon()
@@ -119,7 +119,7 @@
if(stun)
adjustToxLoss(-3)
T = get_step(T, dir)
- if (is_blocked_turf(T))
+ if(is_blocked_turf(T))
break
return 1
@@ -168,7 +168,7 @@
if(!tesla_shock || (tesla_shock && siemens_coeff > 0.5))
Stun(3)
Weaken(3)
- if (shock_damage > 200)
+ if(shock_damage > 200)
src.visible_message(
"[src] was arc flashed by the [source]! ", \
"The [source] arc flashes and electrocutes you! ", \
@@ -213,7 +213,7 @@
swap_hand()
/mob/living/carbon/proc/help_shake_act(mob/living/carbon/M)
- if (src.health >= config.health_threshold_crit)
+ if(src.health >= config.health_threshold_crit)
if(src == M && istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src
src.visible_message( \
@@ -261,11 +261,11 @@
"You shake [src], but they are unresponsive. Probably suffering from SSD. ")
if(lying) // /vg/: For hugs. This is how update_icon figgers it out, anyway. - N3X15
var/t_him = "it"
- if (src.gender == MALE)
+ if(src.gender == MALE)
t_him = "him"
- else if (src.gender == FEMALE)
+ else if(src.gender == FEMALE)
t_him = "her"
- if (istype(src,/mob/living/carbon/human) && src:w_uniform)
+ if(istype(src,/mob/living/carbon/human) && src:w_uniform)
var/mob/living/carbon/human/H = src
H.w_uniform.add_fingerprint(M)
src.sleeping = max(0,src.sleeping-5)
@@ -498,7 +498,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
//Throwing stuff
/mob/living/carbon/proc/toggle_throw_mode()
- if (in_throw_mode)
+ if(in_throw_mode)
throw_mode_off()
else
throw_mode_on()
@@ -565,7 +565,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
return 1
/mob/living/carbon/restrained()
- if (handcuffed)
+ if(handcuffed)
return 1
return
@@ -644,8 +644,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
if(do_mob(usr, src, POCKET_STRIP_DELAY))
if(internal)
internal = null
- if(internals)
- internals.icon_state = "internal0"
+ update_internals_hud_icon(0)
else
var/no_mask2
if(!(wear_mask && wear_mask.flags & AIRTIGHT))
@@ -655,8 +654,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
to_chat(usr, "[src] is not wearing a suitable mask or helmet! ")
return
internal = ITEM
- if(internals)
- internals.icon_state = "internal1"
+ update_internals_hud_icon(1)
visible_message("[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM]. ", \
"[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM]. ")
@@ -858,7 +856,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
throw_alert("handcuffed", /obj/screen/alert/restrained/handcuffed, new_master = src.handcuffed)
else
clear_alert("handcuffed")
- update_action_buttons() //some of our action buttons might be unusable when we're handcuffed.
+ update_action_buttons_icon() //some of our action buttons might be unusable when we're handcuffed.
update_inv_handcuffed()
update_hud_handcuffed()
@@ -890,51 +888,51 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
wear_mask)
/mob/living/carbon/proc/uncuff()
- if (handcuffed)
+ if(handcuffed)
var/obj/item/weapon/W = handcuffed
handcuffed = null
- if (buckled && buckled.buckle_requires_restraints)
+ if(buckled && buckled.buckle_requires_restraints)
buckled.unbuckle_mob()
update_handcuffed()
- if (client)
+ if(client)
client.screen -= W
- if (W)
+ if(W)
W.loc = loc
W.dropped(src)
- if (W)
+ if(W)
W.layer = initial(W.layer)
W.plane = initial(W.plane)
- if (legcuffed)
+ if(legcuffed)
var/obj/item/weapon/W = legcuffed
legcuffed = null
update_inv_legcuffed()
- if (client)
+ if(client)
client.screen -= W
- if (W)
+ if(W)
W.loc = loc
W.dropped(src)
- if (W)
+ if(W)
W.layer = initial(W.layer)
W.plane = initial(W.plane)
/mob/living/carbon/proc/slip(var/description, var/stun, var/weaken, var/tilesSlipped, var/walkSafely, var/slipAny)
- if (flying || buckled || (walkSafely && m_intent == "walk"))
+ if(flying || buckled || (walkSafely && m_intent == "walk"))
return
- if ((lying) && (!(tilesSlipped)))
+ if((lying) && (!(tilesSlipped)))
return
- if (!(slipAny))
- if (istype(src, /mob/living/carbon/human))
+ if(!(slipAny))
+ if(istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src
- if ((isobj(H.shoes) && H.shoes.flags & NOSLIP) || H.species.bodyflags & FEET_NOSLIP)
+ if((isobj(H.shoes) && H.shoes.flags & NOSLIP) || H.species.bodyflags & FEET_NOSLIP)
return
- if (tilesSlipped)
+ if(tilesSlipped)
for(var/t = 0, t<=tilesSlipped, t++)
spawn (t) step(src, src.dir)
stop_pulling()
to_chat(src, "You slipped on the [description]! ")
playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
- if (stun)
+ if(stun)
Stun(stun)
Weaken(weaken)
return 1
@@ -966,15 +964,15 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
if(istype(toEat, /obj/item/weapon/reagent_containers/food/pill))
to_chat(src, "You [toEat.apply_method] [toEat]. ")
else
- if (fullness <= 50)
+ if(fullness <= 50)
to_chat(src, "You hungrily chew out a piece of [toEat] and gobble it! ")
- else if (fullness > 50 && fullness <= 150)
+ else if(fullness > 50 && fullness <= 150)
to_chat(src, "You hungrily begin to eat [toEat]. ")
- else if (fullness > 150 && fullness <= 350)
+ else if(fullness > 150 && fullness <= 350)
to_chat(src, "You take a bite of [toEat]. ")
- else if (fullness > 350 && fullness <= 550)
+ else if(fullness > 350 && fullness <= 550)
to_chat(src, "You unwillingly chew a bit of [toEat]. ")
- else if (fullness > (550 * (1 + overeatduration / 2000))) // The more you eat - the more you can eat
+ else if(fullness > (550 * (1 + overeatduration / 2000))) // The more you eat - the more you can eat
to_chat(src, "You cannot force any more of [toEat] to go down your throat. ")
return 0
return 1
@@ -1031,3 +1029,16 @@ so that different stomachs can handle things in different ways VB*/
var/obj/item/LH = get_inactive_hand()
if(LH)
. |= LH.GetAccess()
+
+/mob/living/carbon/proc/can_breathe_gas()
+ if(!wear_mask)
+ return TRUE
+
+ if(!(wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT) && internal == null)
+ return TRUE
+
+ return FALSE
+
+/mob/living/carbon/proc/update_internals_hud_icon(internal_state = 0)
+ if(hud_used && hud_used.internals)
+ hud_used.internals.icon_state = "internal[internal_state]"
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 07a6a0d28cd..e900fc10517 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -1,15 +1,12 @@
-/mob/living/carbon/
+/mob/living/carbon
gender = MALE
hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD)
var/list/stomach_contents = list()
var/list/internal_organs = list()
- var/brain_op_stage = 0.0
var/antibodies = 0
- var/last_eating = 0 //Not sure what this does... I found it hidden in food.dm
var/life_tick = 0 // The amount of life ticks that have processed on this mob.
- var/analgesic = 0 // when this is set, the mob isn't affected by shock or pain
- // life should decrease this by 1 every tick
+
// total amount of wounds on mob, used to spread out healing and the like over all wounds
var/number_wounds = 0
var/obj/item/handcuffed = null //Whether or not the mob is handcuffed
diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm
index fca8c59fec3..b0ccdc8381d 100644
--- a/code/modules/mob/living/carbon/death.dm
+++ b/code/modules/mob/living/carbon/death.dm
@@ -2,4 +2,8 @@
losebreath = 0
med_hud_set_health()
med_hud_set_status()
+
+ if(reagents)
+ reagents.death_metabolize(src)
+
..(gibbed)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm
index 677e4b42784..f4b95eec4d4 100644
--- a/code/modules/mob/living/carbon/human/body_accessories.dm
+++ b/code/modules/mob/living/carbon/human/body_accessories.dm
@@ -102,6 +102,13 @@ var/global/list/body_accessory_by_species = list("None" = null)
return 0
+/datum/body_accessory/tail/wingler_tail // Jay wingler fluff tail
+ name = "Jay Wingler Tail"
+
+ icon_state = "winglertail"
+ animated_icon_state = "winglertail_a"
+
+
//Vulpkanin
/datum/body_accessory/tail/vulpkanin_2
name = "Vulpkanin Alt 1 (Bushy)"
@@ -130,3 +137,11 @@ var/global/list/body_accessory_by_species = list("None" = null)
icon_state = "vulptail5"
animated_icon_state = "vulptail5_a"
allowed_species = list("Vulpkanin")
+
+/datum/body_accessory/tail/vulpkanin_6
+ name = "Vulpkanin Alt 5 (Straight Bushy)"
+
+ icon_state = "vulptail6"
+ animated_icon_state = "vulptail6_a"
+ allowed_species = list("Vulpkanin")
+
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 5ac5d796897..d3606b12b8a 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -111,7 +111,7 @@
if(istype(I,/mob/living/simple_animal/borer))
B = I
if(B)
- if(!B.ckey && ckey && B.controlling)
+ if(B.controlling && B.host == src)
B.detatch()
verbs -= /mob/living/carbon/proc/release_control
@@ -144,10 +144,11 @@
var/obj/item/organ/external/head/H = get_organ("head")
if(SKELETON in src.mutations) return
- if(H.f_style)
- H.f_style = "Shaved"
- if(H.h_style)
- H.h_style = "Bald"
+ if(istype(H))
+ if(H.f_style)
+ H.f_style = "Shaved"
+ if(H.h_style)
+ H.h_style = "Bald"
update_fhair(0)
update_hair(0)
@@ -162,10 +163,11 @@
var/obj/item/organ/external/head/H = organs_by_name["head"]
if(HUSK in mutations) return
- if(H.f_style)
- H.f_style = "Shaved" //we only change the icon_state of the hair datum, so it doesn't mess up their UI/UE
- if(H.h_style)
- H.h_style = "Bald"
+ if(istype(H))
+ if(H.f_style)
+ H.f_style = "Shaved" //we only change the icon_state of the hair datum, so it doesn't mess up their UI/UE
+ if(H.h_style)
+ H.h_style = "Bald"
update_fhair(0)
update_hair(0)
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
new file mode 100644
index 00000000000..ef5768fcb0e
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -0,0 +1,889 @@
+/mob/living/carbon/human/emote(var/act,var/m_type=1,var/message = null,var/force)
+
+ if(stat == DEAD)
+ return // No screaming bodies
+
+ var/param = null
+ if(findtext(act, "-", 1, null))
+ var/t1 = findtext(act, "-", 1, null)
+ param = copytext(act, t1 + 1, length(act) + 1)
+ act = copytext(act, 1, t1)
+
+ var/muzzled = is_muzzled()
+ if(disabilities & MUTE || silent)
+ muzzled = 1
+ //var/m_type = 1
+
+ for(var/obj/item/weapon/implant/I in src)
+ if(I.implanted)
+ I.trigger(act, src)
+
+ var/miming = 0
+ if(mind)
+ miming = mind.miming
+
+ //Emote Cooldown System (it's so simple!)
+ // proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
+ var/on_CD = 0
+ act = lowertext(act)
+ switch(act)
+ //Cooldown-inducing emotes
+ if("ping", "pings", "buzz", "buzzes", "beep", "beeps", "yes", "no", "buzz2")
+ if(species.name == "Machine") //Only Machines can beep, ping, and buzz, yes, no, and make a silly sad trombone noise.
+ on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
+ else //Everyone else fails, skip the emote attempt
+ return
+ if("drone","drones","hum","hums","rumble","rumbles")
+ if(species.name == "Drask") //Only Drask can make whale noises
+ on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
+ else
+ return
+ if("squish", "squishes")
+ var/found_slime_bodypart = 0
+
+ if(species.name == "Slime People") //Only Slime People can squish
+ on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
+ found_slime_bodypart = 1
+ else
+ for(var/obj/item/organ/external/L in organs) // if your limbs are squishy you can squish too!
+ if(L.dna.species in list("Slime People"))
+ on_CD = handle_emote_CD()
+ found_slime_bodypart = 1
+ break
+
+ if(!found_slime_bodypart) //Everyone else fails, skip the emote attempt
+ return
+ if("scream", "screams")
+ on_CD = handle_emote_CD(50) //longer cooldown
+ if("fart", "farts", "flip", "flips", "snap", "snaps")
+ on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
+ //Everything else, including typos of the above emotes
+ else
+ on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown
+
+ if(on_CD == 1) // Check if we need to suppress the emote attempt.
+ return // Suppress emote, you're still cooling off.
+
+ switch(act)
+ if("me") //OKAY SO RANT TIME, THIS FUCKING HAS TO BE HERE OR A SHITLOAD OF THINGS BREAK
+ return custom_emote(m_type, message) //DO YOU KNOW WHY SHIT BREAKS? BECAUSE SO MUCH OLDCODE CALLS mob.emote("me",1,"whatever_the_fuck_it_wants_to_emote")
+ //WHO THE FUCK THOUGHT THAT WAS A GOOD FUCKING IDEA!?!?
+
+ if("ping", "pings")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] pings at [param]."
+ else
+ message = "[src] pings."
+ playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
+ m_type = 2
+
+ if("buzz2")
+ message = "[src] emits an irritated buzzing sound."
+ playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0)
+ m_type = 2
+
+ if("buzz", "buzzes")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] buzzes at [param]."
+ else
+ message = "[src] buzzes."
+ playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
+ m_type = 2
+
+ if("beep", "beeps")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] beeps at [param]."
+ else
+ message = "[src] beeps."
+ playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
+ m_type = 2
+
+ if("drone", "drones", "hum", "hums", "rumble", "rumbles")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] drones at [param]."
+ else
+ message = "[src] rumbles."
+ playsound(src.loc, 'sound/voice/DraskTalk.ogg', 50, 0)
+ m_type = 2
+
+ if("squish", "squishes")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] squishes at [param]."
+ else
+ message = "[src] squishes."
+ playsound(src.loc, 'sound/effects/slime_squish.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
+ m_type = 2
+
+ if("yes")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] emits an affirmative blip at [param]."
+ else
+ message = "[src] emits an affirmative blip."
+ playsound(src.loc, 'sound/machines/synth_yes.ogg', 50, 0)
+ m_type = 2
+
+ if("no")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] emits a negative blip at [param]."
+ else
+ message = "[src] emits a negative blip."
+ playsound(src.loc, 'sound/machines/synth_no.ogg', 50, 0)
+ m_type = 2
+
+ if("wag", "wags")
+ if(body_accessory)
+ if(body_accessory.try_restrictions(src))
+ message = "[src] starts wagging \his tail."
+ start_tail_wagging(1)
+
+ else if(species.bodyflags & TAIL_WAGGING)
+ if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
+ message = "[src] starts wagging \his tail."
+ src.start_tail_wagging(1)
+ else
+ return
+ else
+ return
+ m_type = 1
+
+ if("swag", "swags")
+ if(species.bodyflags & TAIL_WAGGING || body_accessory)
+ message = "[src] stops wagging \his tail."
+ src.stop_tail_wagging(1)
+ else
+ return
+ m_type = 1
+
+ if("airguitar")
+ if(!src.restrained())
+ message = "[src] is strumming the air and headbanging like a safari chimp."
+ m_type = 1
+
+ if("blink", "blinks")
+ message = "[src] blinks."
+ m_type = 1
+
+ if("blink_r", "blinks_r")
+ message = "[src] blinks rapidly."
+ m_type = 1
+
+ if("bow", "bows")
+ if(!src.buckled)
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] bows to [param]."
+ else
+ message = "[src] bows."
+ m_type = 1
+
+ if("salute", "salutes")
+ if(!src.buckled)
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] salutes to [param]."
+ else
+ message = "[src] salutes."
+ m_type = 1
+
+ if("choke", "chokes")
+ if(miming)
+ message = "[src] clutches \his throat desperately!"
+ m_type = 1
+ else
+ if(!muzzled)
+ message = "[src] chokes!"
+ m_type = 2
+ else
+ message = "[src] makes a strong noise."
+ m_type = 2
+
+ if("burp", "burps")
+ if(miming)
+ message = "[src] opens their mouth rather obnoxiously."
+ m_type = 1
+ else
+ if(!muzzled)
+ message = "[src] burps."
+ m_type = 2
+ else
+ message = "[src] makes a peculiar noise."
+ m_type = 2
+ if("clap", "claps")
+ if(!src.restrained())
+ message = "[src] claps."
+ m_type = 2
+ if(miming)
+ m_type = 1
+ if("flap", "flaps")
+ if(!src.restrained())
+ message = "[src] flaps \his wings."
+ m_type = 2
+ if(miming)
+ m_type = 1
+
+ if("flip", "flips")
+ m_type = 1
+ if(!src.restrained())
+ var/M = null
+ if(param)
+ for(var/mob/A in view(1, null))
+ if(param == A.name)
+ M = A
+ break
+ if(M == src)
+ M = null
+
+ if(M)
+ if(lying || weakened)
+ message = "[src] flops and flails around on the floor."
+ else
+ message = "[src] flips in [M]'s general direction."
+ SpinAnimation(5,1)
+ else
+ if(lying || weakened)
+ message = "[src] flops and flails around on the floor."
+ else
+ var/obj/item/weapon/grab/G
+ if(istype(get_active_hand(), /obj/item/weapon/grab))
+ G = get_active_hand()
+ if(G && G.affecting)
+ if(buckled || G.affecting.buckled)
+ return
+ var/turf/oldloc = loc
+ var/turf/newloc = G.affecting.loc
+ if(isturf(oldloc) && isturf(newloc))
+ SpinAnimation(5,1)
+ forceMove(newloc)
+ G.affecting.forceMove(oldloc)
+ message = "[src] flips over [G.affecting]!"
+ else
+ message = "[src] does a flip!"
+ SpinAnimation(5,1)
+
+ if("aflap", "aflaps")
+ if(!src.restrained())
+ message = "[src] flaps \his wings ANGRILY!"
+ m_type = 2
+ if(miming)
+ m_type = 1
+
+ if("drool", "drools")
+ message = "[src] drools."
+ m_type = 1
+
+ if("eyebrow")
+ message = "[src] raises an eyebrow."
+ m_type = 1
+
+ if("chuckle", "chuckles")
+ if(miming)
+ message = "[src] appears to chuckle."
+ m_type = 1
+ else
+ if(!muzzled)
+ message = "[src] chuckles."
+ m_type = 2
+ else
+ message = "[src] makes a noise."
+ m_type = 2
+
+ if("twitch", "twitches")
+ message = "[src] twitches violently."
+ m_type = 1
+
+ if("twitch_s", "twitches_s")
+ message = "[src] twitches."
+ m_type = 1
+
+ if("faint", "faints")
+ message = "[src] faints."
+ if(src.sleeping)
+ return //Can't faint while asleep
+ src.sleeping += 1
+ m_type = 1
+
+ if("cough", "coughs")
+ if(miming)
+ message = "[src] appears to cough!"
+ m_type = 1
+ else
+ if(!muzzled)
+ message = "[src] coughs!"
+ m_type = 2
+ else
+ message = "[src] makes a strong noise."
+ m_type = 2
+
+ if("frown", "frowns")
+ message = "[src] frowns."
+ m_type = 1
+
+ if("nod", "nods")
+ message = "[src] nods."
+ m_type = 1
+
+ if("blush", "blushes")
+ message = "[src] blushes."
+ m_type = 1
+
+ if("wave", "waves")
+ message = "[src] waves."
+ m_type = 1
+
+ if("quiver", "quivers")
+ message = "[src] quivers."
+ m_type = 1
+
+ if("gasp", "gasps")
+ if(miming)
+ message = "[src] appears to be gasping!"
+ m_type = 1
+ else
+ if(!muzzled)
+ message = "[src] gasps!"
+ m_type = 2
+ else
+ message = "[src] makes a weak noise."
+ m_type = 2
+
+ if("deathgasp", "deathgasps")
+ message = "[src] [species.death_message]"
+ m_type = 1
+
+ if("giggle", "giggles")
+ if(miming)
+ message = "[src] giggles silently!"
+ m_type = 1
+ else
+ if(!muzzled)
+ message = "[src] giggles."
+ m_type = 2
+ else
+ message = "[src] makes a noise."
+ m_type = 2
+
+ if("glare", "glares")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] glares at [param]."
+ else
+ message = "[src] glares."
+ m_type = 1
+
+ if("stare", "stares")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] stares at [param]."
+ else
+ message = "[src] stares."
+ m_type = 1
+
+ if("look", "looks")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] looks at [param]."
+ else
+ message = "[src] looks."
+ m_type = 1
+
+ if("grin", "grins")
+ message = "[src] grins."
+ m_type = 1
+
+ if("cry", "cries")
+ if(miming)
+ message = "[src] cries."
+ m_type = 1
+ else
+ if(!muzzled)
+ message = "[src] cries."
+ m_type = 2
+ else
+ message = "[src] makes a weak noise. \He frowns."
+ m_type = 2
+
+ if("sigh", "sighs")
+ if(miming)
+ message = "[src] sighs."
+ m_type = 1
+ else
+ if(!muzzled)
+ message = "[src] sighs."
+ m_type = 2
+ else
+ message = "[src] makes a weak noise."
+ m_type = 2
+
+ if("laugh", "laughs")
+ if(miming)
+ message = "[src] acts out a laugh."
+ m_type = 1
+ else
+ if(!muzzled)
+ message = "[src] laughs."
+ m_type = 2
+ else
+ message = "[src] makes a noise."
+ m_type = 2
+
+ if("mumble", "mumbles")
+ message = "[src] mumbles!"
+ m_type = 2
+ if(miming)
+ m_type = 1
+
+ if("grumble", "grumbles")
+ if(miming)
+ message = "[src] grumbles!"
+ m_type = 1
+ if(!muzzled)
+ message = "[src] grumbles!"
+ m_type = 2
+ else
+ message = "[src] makes a noise."
+ m_type = 2
+
+ if("groan", "groans")
+ if(miming)
+ message = "[src] appears to groan!"
+ m_type = 1
+ else
+ if(!muzzled)
+ message = "[src] groans!"
+ m_type = 2
+ else
+ message = "[src] makes a loud noise."
+ m_type = 2
+
+ if("moan", "moans")
+ if(miming)
+ message = "[src] appears to moan!"
+ m_type = 1
+ else
+ message = "[src] moans!"
+ m_type = 2
+
+ if("johnny")
+ var/M
+ if(param)
+ M = param
+ if(!M)
+ param = null
+ else
+ if(miming)
+ message = "[src] takes a drag from a cigarette and blows \"[M]\" out in smoke."
+ m_type = 1
+ else
+ message = "[src] says, \"[M], please. They had a family.\" [src.name] takes a drag from a cigarette and blows their name out in smoke."
+ m_type = 2
+
+ if("point", "points")
+ if(!src.restrained())
+ var/atom/M = null
+ if(param)
+ for(var/atom/A as mob|obj|turf in view())
+ if(param == A.name)
+ M = A
+ break
+
+ if(!M)
+ message = "[src] points."
+ else
+ pointed(M)
+ m_type = 1
+
+ if("raise", "raises")
+ if(!src.restrained())
+ message = "[src] raises a hand."
+ m_type = 1
+
+ if("shake", "shakes")
+ message = "[src] shakes \his head."
+ m_type = 1
+
+ if("shrug", "shrugs")
+ message = "[src] shrugs."
+ m_type = 1
+
+ if("signal", "signals")
+ if(!src.restrained())
+ var/t1 = round(text2num(param))
+ if(isnum(t1))
+ if(t1 <= 5 && (!src.r_hand || !src.l_hand))
+ message = "[src] raises [t1] finger\s."
+ else if(t1 <= 10 && (!src.r_hand && !src.l_hand))
+ message = "[src] raises [t1] finger\s."
+ m_type = 1
+
+ if("smile", "smiles")
+ message = "[src] smiles."
+ m_type = 1
+
+ if("shiver", "shivers")
+ message = "[src] shivers."
+ m_type = 2
+ if(miming)
+ m_type = 1
+
+ if("pale", "pales")
+ message = "[src] goes pale for a second."
+ m_type = 1
+
+ if("tremble", "trembles")
+ message = "[src] trembles."
+ m_type = 1
+
+ if("sneeze", "sneezes")
+ if(miming)
+ message = "[src] sneezes."
+ m_type = 1
+ else
+ if(!muzzled)
+ message = "[src] sneezes."
+ m_type = 2
+ else
+ message = "[src] makes a strange noise."
+ m_type = 2
+
+ if("sniff", "sniffs")
+ message = "[src] sniffs."
+ m_type = 2
+ if(miming)
+ m_type = 1
+
+ if("snore", "snores")
+ if(miming)
+ message = "[src] sleeps soundly."
+ m_type = 1
+ else
+ if(!muzzled)
+ message = "[src] snores."
+ m_type = 2
+ else
+ message = "[src] makes a noise."
+ m_type = 2
+
+ if("whimper", "whimpers")
+ if(miming)
+ message = "[src] appears hurt."
+ m_type = 1
+ else
+ if(!muzzled)
+ message = "[src] whimpers."
+ m_type = 2
+ else
+ message = "[src] makes a weak noise."
+ m_type = 2
+
+ if("wink", "winks")
+ message = "[src] winks."
+ m_type = 1
+
+ if("yawn", "yawns")
+ if(!muzzled)
+ message = "[src] yawns."
+ m_type = 2
+ if(miming)
+ m_type = 1
+
+ if("collapse", "collapses")
+ Paralyse(2)
+ message = "[src] collapses!"
+ m_type = 2
+ if(miming)
+ m_type = 1
+
+ if("hug", "hugs")
+ m_type = 1
+ if(!src.restrained())
+ var/M = null
+ if(param)
+ for(var/mob/A in view(1, null))
+ if(param == A.name)
+ M = A
+ break
+ if(M == src)
+ M = null
+
+ if(M)
+ message = "[src] hugs [M]."
+ else
+ message = "[src] hugs \himself."
+
+ if("handshake")
+ m_type = 1
+ if(!src.restrained() && !src.r_hand)
+ var/mob/M = null
+ if(param)
+ for(var/mob/A in view(1, null))
+ if(param == A.name)
+ M = A
+ break
+ if(M == src)
+ M = null
+
+ if(M)
+ if(M.canmove && !M.r_hand && !M.restrained())
+ message = "[src] shakes hands with [M]."
+ else
+ message = "[src] holds out \his hand to [M]."
+
+ if("dap", "daps")
+ m_type = 1
+ if(!src.restrained())
+ var/M = null
+ if(param)
+ for(var/mob/A in view(1, null))
+ if(param == A.name)
+ M = A
+ break
+ if(M)
+ message = "[src] gives daps to [M]."
+ else
+ message = "[src] sadly can't find anybody to give daps to, and daps \himself. Shameful."
+
+ if("slap", "slaps")
+ m_type = 1
+ if(!src.restrained())
+ var/M = null
+ if(param)
+ for(var/mob/A in view(1, null))
+ if(param == A.name)
+ M = A
+ break
+ if(M)
+ message = "\red [src] slaps [M] across the face. Ouch!"
+ playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
+ else
+ message = "\red [src] slaps \himself!"
+ playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
+ src.adjustFireLoss(4)
+
+ if("scream", "screams")
+ if(miming)
+ message = "[src] acts out a scream!"
+ m_type = 1
+ else
+ if(!muzzled)
+ message = "[src] [species.scream_verb]!"
+ m_type = 2
+ if(gender == FEMALE)
+ playsound(src.loc, "[species.female_scream_sound]", 80, 1, 0, pitch = get_age_pitch())
+ else
+ playsound(src.loc, "[species.male_scream_sound]", 80, 1, 0, pitch = get_age_pitch()) //default to male screams if no gender is present.
+
+ else
+ message = "[src] makes a very loud noise."
+ m_type = 2
+
+
+ if("snap", "snaps")
+ if(prob(95))
+ m_type = 2
+ var/mob/living/carbon/human/H = src
+ var/obj/item/organ/external/L = H.get_organ("l_hand")
+ var/obj/item/organ/external/R = H.get_organ("r_hand")
+ var/left_hand_good = 0
+ var/right_hand_good = 0
+ if(L && (!(L.status & ORGAN_DESTROYED)) && (!(L.status & ORGAN_SPLINTED)) && (!(L.status & ORGAN_BROKEN)))
+ left_hand_good = 1
+ if(R && (!(R.status & ORGAN_DESTROYED)) && (!(R.status & ORGAN_SPLINTED)) && (!(R.status & ORGAN_BROKEN)))
+ right_hand_good = 1
+
+ if(!left_hand_good && !right_hand_good)
+ to_chat(usr, "You need at least one hand in good working order to snap your fingers.")
+ return
+
+ message = "[src] snaps \his fingers."
+ playsound(src.loc, 'sound/effects/fingersnap.ogg', 50, 1, -3)
+ else
+ message = "[src] snaps \his fingers right off! "
+ playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
+
+
+ // Needed for M_TOXIC_FART
+ if("fart", "farts")
+ if(reagents.has_reagent("simethicone"))
+ return
+// playsound(src.loc, 'sound/effects/fart.ogg', 50, 1, -3) //Admins still vote no to fun
+ if(locate(/obj/item/weapon/storage/bible) in get_turf(src))
+ to_chat(viewers(src), "[src] farts on the Bible! ")
+ to_chat(viewers(src), "A mysterious force smites [src]! ")
+ var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+ src.gib()
+ else if(TOXIC_FARTS in mutations)
+ message = "[src] unleashes a [pick("horrible","terrible","foul","disgusting","awful")] fart."
+ else
+ message = "[src] [pick("passes wind","farts")]."
+ m_type = 2
+
+ var/turf/location = get_turf(src)
+ var/aoe_range=2 // Default
+
+ // Process toxic farts first.
+ if(TOXIC_FARTS in mutations)
+ for(var/mob/M in range(location,aoe_range))
+ if(M.internal != null && M.wear_mask && (M.wear_mask.flags & AIRTIGHT))
+ continue
+ // Now, we don't have this:
+ //new /obj/effects/fart_cloud(T,L)
+ if(M == src)
+ continue
+ M.reagents.add_reagent("jenkem", 1)
+
+ if("help")
+ var/emotelist = "aflap(s), airguitar, blink(s), blink(s)_r, blush(es), bow(s)-(none)/mob, burp(s), choke(s), chuckle(s), clap(s), collapse(s), cough(s),cry, cries, custom, dap(s)(none)/mob," \
+ + " deathgasp(s), drool(s), eyebrow,fart(s), faint(s), flap(s), flip(s), frown(s), gasp(s), giggle(s), glare(s)-(none)/mob, grin(s), groan(s), grumble(s), handshake-mob, hug(s)-(none)/mob," \
+ + " glare(s)-(none)/mob, grin(s), johnny, laugh(s), look(s)-(none)/mob, moan(s), mumble(s), nod(s), pale(s), point(s)-atom, quiver(s), raise(s), salute(s)-(none)/mob, scream(s), shake(s)," \
+ + " shiver(s), shrug(s), sigh(s), signal(s)-#1-10,slap(s)-(none)/mob, smile(s),snap(s), sneeze(s), sniff(s), snore(s), stare(s)-(none)/mob, swag(s), tremble(s), twitch(es), twitch(es)_s," \
+ + " wag(s), wave(s), whimper(s), wink(s), yawn(s)"
+ if(species.name == "Machine")
+ emotelist += "\nMachine specific emotes :- beep(s)-(none)/mob, buzz(es)-none/mob, no-(none)/mob, ping(s)-(none)/mob, yes-(none)/mob"
+ else if(species.name == "Slime People")
+ emotelist += "\nSlime people specific emotes :- squish(es)-(none)/mob"
+ to_chat(src, emotelist)
+
+ else
+ to_chat(src, "\blue Unusable emote '[act]'. Say *help for a list.")
+
+
+
+
+
+ if(message) //Humans are special fucking snowflakes and have 735 lines of emotes, they get to handle their own emotes, not call the parent
+ log_emote("[name]/[key] : [message]")
+
+ //Hearing gasp and such every five seconds is not good emotes were not global for a reason.
+ // Maybe some people are okay with that.
+
+ for(var/mob/M in dead_mob_list)
+ if(!M.client || istype(M, /mob/new_player))
+ continue //skip monkeys, leavers and new players
+ if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
+ M.show_message(message)
+
+ switch(m_type)
+ if(1)
+ visible_message(message)
+ if(2)
+ audible_message(message)
+
+/mob/living/carbon/human/verb/pose()
+ set name = "Set Pose"
+ set desc = "Sets a description which will be shown when someone examines you."
+ set category = "IC"
+
+ pose = sanitize(copytext(input(usr, "This is [src]. \He is...", "Pose", null) as text, 1, MAX_MESSAGE_LEN))
+
+/mob/living/carbon/human/verb/set_flavor()
+ set name = "Set Flavour Text"
+ set desc = "Sets an extended description of your character's features."
+ set category = "IC"
+
+ update_flavor_text()
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 539d88f11cb..491d291c252 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -41,7 +41,7 @@
t_is = "are"
else
if(icon)
- msg += "\icon[icon] " //fucking BYOND: this should stop dreamseeker crashing if we -somehow- examine somebody before their icon is generated
+ msg += "[bicon(icon(icon, dir=SOUTH))] " //fucking BYOND: this should stop dreamseeker crashing if we -somehow- examine somebody before their icon is generated
switch(gender)
if(MALE)
t_He = "He"
@@ -58,14 +58,14 @@
var/displayed_species = get_species()
for(var/obj/item/clothing/C in src) //Disguise checks
- if (C == src.head || C == src.wear_suit || C == src.wear_mask || C == src.w_uniform || C == src.belt || C == src.back)
+ if(C == src.head || C == src.wear_suit || C == src.wear_mask || C == src.w_uniform || C == src.belt || C == src.back)
if(C.species_disguise)
displayed_species = C.species_disguise
- if (skipjumpsuit && skipface || (displayed_species in nospecies)) //either obscured or on the nospecies list
+ if(skipjumpsuit && skipface || (displayed_species in nospecies)) //either obscured or on the nospecies list
msg += "!\n" //omit the species when examining
- else if (displayed_species == "Slime People") //snowflakey because Slime People are defined as a plural
+ else if(displayed_species == "Slime People") //snowflakey because Slime People are defined as a plural
msg += ", a slime person!\n"
- else if (displayed_species == "Unathi") //DAMN YOU, VOWELS
+ else if(displayed_species == "Unathi") //DAMN YOU, VOWELS
msg += ", a unathi!\n"
else
msg += ", \a [lowertext(displayed_species)]!\n"
@@ -80,108 +80,108 @@
tie_msg += " with [english_accessory_list(U)]"
if(w_uniform.blood_DNA)
- msg += "[t_He] [t_is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] [w_uniform.blood_color != "#030303" ? "blood-stained":"oil-stained"] [w_uniform.name][tie_msg]! \n"
+ msg += "[t_He] [t_is] wearing [bicon(w_uniform)] [w_uniform.gender==PLURAL?"some":"a"] [w_uniform.blood_color != "#030303" ? "blood-stained":"oil-stained"] [w_uniform.name][tie_msg]! \n"
else
- msg += "[t_He] [t_is] wearing \icon[w_uniform] \a [w_uniform][tie_msg].\n"
+ msg += "[t_He] [t_is] wearing [bicon(w_uniform)] \a [w_uniform][tie_msg].\n"
//head
if(head && !(head.flags & ABSTRACT))
if(head.blood_DNA)
- msg += "[t_He] [t_is] wearing \icon[head] [head.gender==PLURAL?"some":"a"] [head.blood_color != "#030303" ? "blood-stained":"oil-stained"] [head.name] on [t_his] head! \n"
+ msg += "[t_He] [t_is] wearing [bicon(head)] [head.gender==PLURAL?"some":"a"] [head.blood_color != "#030303" ? "blood-stained":"oil-stained"] [head.name] on [t_his] head! \n"
else
- msg += "[t_He] [t_is] wearing \icon[head] \a [head] on [t_his] head.\n"
+ msg += "[t_He] [t_is] wearing [bicon(head)] \a [head] on [t_his] head.\n"
//suit/armour
if(wear_suit && !(wear_suit.flags & ABSTRACT))
if(wear_suit.blood_DNA)
- msg += "[t_He] [t_is] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] [wear_suit.blood_color != "#030303" ? "blood-stained":"oil-stained"] [wear_suit.name]! \n"
+ msg += "[t_He] [t_is] wearing [bicon(wear_suit)] [wear_suit.gender==PLURAL?"some":"a"] [wear_suit.blood_color != "#030303" ? "blood-stained":"oil-stained"] [wear_suit.name]! \n"
else
- msg += "[t_He] [t_is] wearing \icon[wear_suit] \a [wear_suit].\n"
+ msg += "[t_He] [t_is] wearing [bicon(wear_suit)] \a [wear_suit].\n"
//suit/armour storage
if(s_store && !skipsuitstorage)
if(s_store.blood_DNA)
- msg += "[t_He] [t_is] carrying \icon[s_store] [s_store.gender==PLURAL?"some":"a"] [s_store.blood_color != "#030303" ? "blood-stained":"oil-stained"] [s_store.name] on [t_his] [wear_suit.name]! \n"
+ msg += "[t_He] [t_is] carrying [bicon(s_store)] [s_store.gender==PLURAL?"some":"a"] [s_store.blood_color != "#030303" ? "blood-stained":"oil-stained"] [s_store.name] on [t_his] [wear_suit.name]! \n"
else
- msg += "[t_He] [t_is] carrying \icon[s_store] \a [s_store] on [t_his] [wear_suit.name].\n"
+ msg += "[t_He] [t_is] carrying [bicon(s_store)] \a [s_store] on [t_his] [wear_suit.name].\n"
//back
if(back && !(back.flags & ABSTRACT))
if(back.blood_DNA)
- msg += "[t_He] [t_has] \icon[back] [back.gender==PLURAL?"some":"a"] [back.blood_color != "#030303" ? "blood-stained":"oil-stained"] [back] on [t_his] back. \n"
+ msg += "[t_He] [t_has] [bicon(back)] [back.gender==PLURAL?"some":"a"] [back.blood_color != "#030303" ? "blood-stained":"oil-stained"] [back] on [t_his] back. \n"
else
- msg += "[t_He] [t_has] \icon[back] \a [back] on [t_his] back.\n"
+ msg += "[t_He] [t_has] [bicon(back)] \a [back] on [t_his] back.\n"
//left hand
if(l_hand && !(l_hand.flags & ABSTRACT))
if(l_hand.blood_DNA)
- msg += "[t_He] [t_is] holding \icon[l_hand] [l_hand.gender==PLURAL?"some":"a"] [l_hand.blood_color != "#030303" ? "blood-stained":"oil-stained"] [l_hand.name] in [t_his] left hand! \n"
+ msg += "[t_He] [t_is] holding [bicon(l_hand)] [l_hand.gender==PLURAL?"some":"a"] [l_hand.blood_color != "#030303" ? "blood-stained":"oil-stained"] [l_hand.name] in [t_his] left hand! \n"
else
- msg += "[t_He] [t_is] holding \icon[l_hand] \a [l_hand] in [t_his] left hand.\n"
+ msg += "[t_He] [t_is] holding [bicon(l_hand)] \a [l_hand] in [t_his] left hand.\n"
//right hand
if(r_hand && !(r_hand.flags & ABSTRACT))
if(r_hand.blood_DNA)
- msg += "[t_He] [t_is] holding \icon[r_hand] [r_hand.gender==PLURAL?"some":"a"] [r_hand.blood_color != "#030303" ? "blood-stained":"oil-stained"] [r_hand.name] in [t_his] right hand! \n"
+ msg += "[t_He] [t_is] holding [bicon(r_hand)] [r_hand.gender==PLURAL?"some":"a"] [r_hand.blood_color != "#030303" ? "blood-stained":"oil-stained"] [r_hand.name] in [t_his] right hand! \n"
else
- msg += "[t_He] [t_is] holding \icon[r_hand] \a [r_hand] in [t_his] right hand.\n"
+ msg += "[t_He] [t_is] holding [bicon(r_hand)] \a [r_hand] in [t_his] right hand.\n"
//gloves
if(gloves && !skipgloves && !(gloves.flags & ABSTRACT))
if(gloves.blood_DNA)
- msg += "[t_He] [t_has] \icon[gloves] [gloves.gender==PLURAL?"some":"a"] [gloves.blood_color != "#030303" ? "blood-stained":"oil-stained"] [gloves.name] on [t_his] hands! \n"
+ msg += "[t_He] [t_has] [bicon(gloves)] [gloves.gender==PLURAL?"some":"a"] [gloves.blood_color != "#030303" ? "blood-stained":"oil-stained"] [gloves.name] on [t_his] hands! \n"
else
- msg += "[t_He] [t_has] \icon[gloves] \a [gloves] on [t_his] hands.\n"
+ msg += "[t_He] [t_has] [bicon(gloves)] \a [gloves] on [t_his] hands.\n"
else if(blood_DNA)
msg += "[t_He] [t_has] [hand_blood_color != "#030303" ? "blood-stained":"oil-stained"] hands! \n"
//handcuffed?
if(handcuffed)
if(istype(handcuffed, /obj/item/weapon/restraints/handcuffs/cable/zipties))
- msg += "[t_He] [t_is] \icon[handcuffed] restrained with zipties! \n"
+ msg += "[t_He] [t_is] [bicon(handcuffed)] restrained with zipties! \n"
else if(istype(handcuffed, /obj/item/weapon/restraints/handcuffs/cable))
- msg += "[t_He] [t_is] \icon[handcuffed] restrained with cable! \n"
+ msg += "[t_He] [t_is] [bicon(handcuffed)] restrained with cable! \n"
else
- msg += "[t_He] [t_is] \icon[handcuffed] handcuffed! \n"
+ msg += "[t_He] [t_is] [bicon(handcuffed)] handcuffed! \n"
//belt
if(belt)
if(belt.blood_DNA)
- msg += "[t_He] [t_has] \icon[belt] [belt.gender==PLURAL?"some":"a"] [belt.blood_color != "#030303" ? "blood-stained":"oil-stained"] [belt.name] about [t_his] waist! \n"
+ msg += "[t_He] [t_has] [bicon(belt)] [belt.gender==PLURAL?"some":"a"] [belt.blood_color != "#030303" ? "blood-stained":"oil-stained"] [belt.name] about [t_his] waist! \n"
else
- msg += "[t_He] [t_has] \icon[belt] \a [belt] about [t_his] waist.\n"
+ msg += "[t_He] [t_has] [bicon(belt)] \a [belt] about [t_his] waist.\n"
//shoes
if(shoes && !skipshoes && !(shoes.flags & ABSTRACT))
if(shoes.blood_DNA)
- msg += "[t_He] [t_is] wearing \icon[shoes] [shoes.gender==PLURAL?"some":"a"] [shoes.blood_color != "#030303" ? "blood-stained":"oil-stained"] [shoes.name] on [t_his] feet! \n"
+ msg += "[t_He] [t_is] wearing [bicon(shoes)] [shoes.gender==PLURAL?"some":"a"] [shoes.blood_color != "#030303" ? "blood-stained":"oil-stained"] [shoes.name] on [t_his] feet! \n"
else
- msg += "[t_He] [t_is] wearing \icon[shoes] \a [shoes] on [t_his] feet.\n"
- else if (blood_DNA)
+ msg += "[t_He] [t_is] wearing [bicon(shoes)] \a [shoes] on [t_his] feet.\n"
+ else if(blood_DNA)
msg += "[t_He] [t_has] [feet_blood_color != "#030303" ? "blood-stained":"oil-stained"] feet! \n"
//mask
if(wear_mask && !skipmask && !(wear_mask.flags & ABSTRACT))
if(wear_mask.blood_DNA)
- msg += "[t_He] [t_has] \icon[wear_mask] [wear_mask.gender==PLURAL?"some":"a"] [wear_mask.blood_color != "#030303" ? "blood-stained":"oil-stained"] [wear_mask.name] on [t_his] face! \n"
+ msg += "[t_He] [t_has] [bicon(wear_mask)] [wear_mask.gender==PLURAL?"some":"a"] [wear_mask.blood_color != "#030303" ? "blood-stained":"oil-stained"] [wear_mask.name] on [t_his] face! \n"
else
- msg += "[t_He] [t_has] \icon[wear_mask] \a [wear_mask] on [t_his] face.\n"
+ msg += "[t_He] [t_has] [bicon(wear_mask)] \a [wear_mask] on [t_his] face.\n"
//eyes
if(glasses && !skipeyes && !(glasses.flags & ABSTRACT))
if(glasses.blood_DNA)
- msg += "[t_He] [t_has] \icon[glasses] [glasses.gender==PLURAL?"some":"a"] [glasses.blood_color != "#030303" ? "blood-stained":"oil-stained"] [glasses] covering [t_his] eyes! \n"
+ msg += "[t_He] [t_has] [bicon(glasses)] [glasses.gender==PLURAL?"some":"a"] [glasses.blood_color != "#030303" ? "blood-stained":"oil-stained"] [glasses] covering [t_his] eyes! \n"
else
- msg += "[t_He] [t_has] \icon[glasses] \a [glasses] covering [t_his] eyes.\n"
+ msg += "[t_He] [t_has] [bicon(glasses)] \a [glasses] covering [t_his] eyes.\n"
//left ear
if(l_ear && !skipears)
- msg += "[t_He] [t_has] \icon[l_ear] \a [l_ear] on [t_his] left ear.\n"
+ msg += "[t_He] [t_has] [bicon(l_ear)] \a [l_ear] on [t_his] left ear.\n"
//right ear
if(r_ear && !skipears)
- msg += "[t_He] [t_has] \icon[r_ear] \a [r_ear] on [t_his] right ear.\n"
+ msg += "[t_He] [t_has] [bicon(r_ear)] \a [r_ear] on [t_his] right ear.\n"
//ID
if(wear_id)
@@ -193,9 +193,9 @@
var/obj/item/weapon/card/id/idcard = wear_id
id = idcard.registered_name
if(id && (id != real_name) && (get_dist(src, user) <= 1) && prob(10))
- msg += "[t_He] [t_is] wearing \icon[wear_id] \a [wear_id] yet something doesn't seem right... \n"
+ msg += "[t_He] [t_is] wearing [bicon(wear_id)] \a [wear_id] yet something doesn't seem right... \n"
else*/
- msg += "[t_He] [t_is] wearing \icon[wear_id] \a [wear_id].\n"
+ msg += "[t_He] [t_is] wearing [bicon(wear_id)] \a [wear_id].\n"
//Jitters
switch(jitteriness)
@@ -221,7 +221,7 @@
var/distance = get_dist(user,src)
if(istype(user, /mob/dead/observer) || user.stat == 2) // ghosts can see anything
distance = 1
- if (src.stat)
+ if(src.stat)
msg += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep. \n"
if((stat == 2 || src.health <= config.health_threshold_crit) && distance <= 3)
msg += "[t_He] does not appear to be breathing. \n"
@@ -462,9 +462,9 @@
perpname = name
if(perpname)
- for (var/datum/data/record/E in data_core.general)
+ for(var/datum/data/record/E in data_core.general)
if(E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.security)
+ for(var/datum/data/record/R in data_core.security)
if(R.fields["id"] == E.fields["id"])
criminal = R.fields["criminal"]
@@ -484,10 +484,10 @@
else
perpname = src.name
- for (var/datum/data/record/E in data_core.general)
- if (E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.general)
- if (R.fields["id"] == E.fields["id"])
+ for(var/datum/data/record/E in data_core.general)
+ if(E.fields["name"] == perpname)
+ for(var/datum/data/record/R in data_core.general)
+ if(R.fields["id"] == E.fields["id"])
medical = R.fields["p_stat"]
msg += "Physical status: \[[medical]\] \n"
@@ -497,7 +497,7 @@
if(print_flavor_text()) msg += "[print_flavor_text()]\n"
msg += "*---------* "
- if (pose)
+ if(pose)
if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 )
pose = addtext(pose,".") //Makes sure all emotes end with a period.
msg += "\n[t_He] is [pose]"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index ed02823215f..07060cfe1a4 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -39,6 +39,8 @@
martial_art = default_martial_art
+ handcrafting = new()
+
var/mob/M = src
faction |= "\ref[M]" //what
@@ -53,6 +55,9 @@
UpdateAppearance()
+/mob/living/carbon/human/OpenCraftingMenu()
+ handcrafting.craft(src)
+
/mob/living/carbon/human/prepare_data_huds()
//Update med hud images...
..()
@@ -203,15 +208,14 @@
now_pushing = 0
return
- if(tmob.r_hand && istype(tmob.r_hand, /obj/item/weapon/shield/riot))
- if(prob(99))
- now_pushing = 0
- return
- if(tmob.l_hand && istype(tmob.l_hand, /obj/item/weapon/shield/riot))
- if(prob(99))
- now_pushing = 0
- return
+ //anti-riot equipment is also anti-push
+ if(tmob.r_hand && (prob(tmob.r_hand.block_chance * 2)) && !istype(tmob.r_hand, /obj/item/clothing))
+ now_pushing = 0
+ return
+ if(tmob.l_hand && (prob(tmob.l_hand.block_chance * 2)) && !istype(tmob.l_hand, /obj/item/clothing))
+ now_pushing = 0
+ return
if(!(tmob.status_flags & CANPUSH))
now_pushing = 0
@@ -351,8 +355,7 @@
else valid_limbs -= processing_dismember
if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
- ear_damage += 30
- ear_deaf += 120
+ adjustEarDamage(30, 120)
if(prob(70) && !shielded)
Paralyse(10)
@@ -376,8 +379,7 @@
else valid_limbs -= processing_dismember
if(!istype(l_ear, /obj/item/clothing/ears/earmuffs) && !istype(r_ear, /obj/item/clothing/ears/earmuffs))
- ear_damage += 15
- ear_deaf += 60
+ adjustEarDamage(15,60)
if(prob(50) && !shielded)
Paralyse(10)
@@ -414,16 +416,16 @@
M.attack_log += text("\[[time_stamp()]\] attacked [src.name] ([src.ckey]) ")
src.attack_log += text("\[[time_stamp()]\] was attacked by [M.name] ([M.ckey]) ")
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- if(check_shields(damage, "the [M.name]"))
+ if(check_shields(damage, "the [M.name]", null, MELEE_ATTACK, M.armour_penetration))
return 0
var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot")
var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone))
- var/armor = run_armor_check(affecting, "melee")
+ var/armor = run_armor_check(affecting, "melee", armour_penetration = M.armour_penetration)
var/obj/item/organ/external/affected = src.get_organ(dam_zone)
if(affected)
affected.add_autopsy_data(M.name, damage) // Add the mob's name to the autopsy data
- apply_damage(damage,M.melee_damage_type, affecting, armor, M.name)
+ apply_damage(damage, M.melee_damage_type, affecting, armor)
updatehealth()
/mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L as mob)
@@ -461,7 +463,7 @@
else
damage = rand(5, 25)
- if(check_shields(damage, "the [M.name]"))
+ if(check_shields(damage, "the [M.name]", null, MELEE_ATTACK))
return 0
var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot")
@@ -489,11 +491,11 @@
M.powerlevel = 0
for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
+ if((O.client && !( O.blinded )))
O.show_message(text("\red The [M.name] has shocked []! ", src), 1)
Weaken(power)
- if (stuttering < power)
+ if(stuttering < power)
stuttering = power
Stun(power)
@@ -501,7 +503,7 @@
s.set_up(5, 1, src)
s.start()
- if (prob(stunprob) && M.powerlevel >= 8)
+ if(prob(stunprob) && M.powerlevel >= 8)
adjustFireLoss(M.powerlevel * rand(6,10))
@@ -511,9 +513,9 @@
/mob/living/carbon/human/restrained()
- if (handcuffed)
+ if(handcuffed)
return 1
- if (istype(wear_suit, /obj/item/clothing/suit/straight_jacket))
+ if(istype(wear_suit, /obj/item/clothing/suit/straight_jacket))
return 1
return 0
@@ -600,7 +602,6 @@
dat += " ↳Pockets: [(l_store && !(l_store.flags&ABSTRACT)) ? "Left (Full)" : "Left (Empty) "] "
dat += " [(r_store && !(r_store.flags&ABSTRACT)) ? "Right (Full)" : "Right (Empty) "] "
dat += " ↳ID: [(wear_id && !(wear_id.flags&ABSTRACT)) ? wear_id : "Empty "] "
- dat += " ↳PDA: [(wear_pda && !(wear_pda.flags&ABSTRACT)) ? wear_pda : "Empty "] "
if(istype(w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = w_uniform
@@ -634,8 +635,8 @@
// Get rank from ID, ID inside PDA, PDA, ID in wallet, etc.
/mob/living/carbon/human/proc/get_authentification_rank(var/if_no_id = "No id", var/if_no_job = "No job")
var/obj/item/device/pda/pda = wear_id
- if (istype(pda))
- if (pda.id)
+ if(istype(pda))
+ if(pda.id)
return pda.id.rank
else
return pda.ownrank
@@ -651,16 +652,16 @@
/mob/living/carbon/human/proc/get_assignment(var/if_no_id = "No id", var/if_no_job = "No job")
var/obj/item/device/pda/pda = wear_id
var/obj/item/weapon/card/id/id = wear_id
- if (istype(pda))
- if (pda.id && istype(pda.id, /obj/item/weapon/card/id))
+ if(istype(pda))
+ if(pda.id && istype(pda.id, /obj/item/weapon/card/id))
. = pda.id.assignment
else
. = pda.ownjob
- else if (istype(id))
+ else if(istype(id))
. = id.assignment
else
return if_no_id
- if (!.)
+ if(!.)
. = if_no_job
return
@@ -669,12 +670,12 @@
/mob/living/carbon/human/proc/get_authentification_name(var/if_no_id = "Unknown")
var/obj/item/device/pda/pda = wear_id
var/obj/item/weapon/card/id/id = wear_id
- if (istype(pda))
- if (pda.id)
+ if(istype(pda))
+ if(pda.id)
. = pda.id.registered_name
else
. = pda.owner
- else if (istype(id))
+ else if(istype(id))
. = id.registered_name
else
return if_no_id
@@ -715,9 +716,9 @@
/mob/living/carbon/human/proc/get_idcard()
var/obj/item/weapon/card/id/id = wear_id
var/obj/item/device/pda/pda = wear_id
- if (istype(pda) && pda.id)
+ if(istype(pda) && pda.id)
id = pda.id
- if (istype(id))
+ if(istype(id))
return id
//Removed the horrible safety parameter. It was only being used by ninja code anyways.
@@ -828,7 +829,7 @@
U.accessories -= A
update_inv_w_uniform()
- if (href_list["criminal"])
+ if(href_list["criminal"])
if(hasHUD(usr,"security"))
var/modified = 0
@@ -843,10 +844,10 @@
perpname = name
if(perpname)
- for (var/datum/data/record/E in data_core.general)
- if (E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.security)
- if (R.fields["id"] == E.fields["id"])
+ for(var/datum/data/record/E in data_core.general)
+ if(E.fields["name"] == perpname)
+ for(var/datum/data/record/R in data_core.security)
+ if(R.fields["id"] == E.fields["id"])
var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list("None", "*Arrest*", "Incarcerated", "Parolled", "Released", "Cancel")
@@ -866,7 +867,7 @@
if(!modified)
to_chat(usr, "\red Unable to locate a data core entry for this person.")
- if (href_list["secrecord"])
+ if(href_list["secrecord"])
if(hasHUD(usr,"security"))
var/perpname = "wot"
var/read = 0
@@ -879,10 +880,10 @@
perpname = tempPda.owner
else
perpname = src.name
- for (var/datum/data/record/E in data_core.general)
- if (E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.security)
- if (R.fields["id"] == E.fields["id"])
+ for(var/datum/data/record/E in data_core.general)
+ if(E.fields["name"] == perpname)
+ for(var/datum/data/record/R in data_core.security)
+ if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"security"))
to_chat(usr, "Name: [R.fields["name"]] Criminal Status: [R.fields["criminal"]]")
to_chat(usr, "Minor Crimes: [R.fields["mi_crim"]]")
@@ -896,7 +897,7 @@
if(!read)
to_chat(usr, "\red Unable to locate a data core entry for this person.")
- if (href_list["secrecordComment"])
+ if(href_list["secrecordComment"])
if(hasHUD(usr,"security"))
var/perpname = "wot"
var/read = 0
@@ -909,24 +910,24 @@
perpname = tempPda.owner
else
perpname = src.name
- for (var/datum/data/record/E in data_core.general)
- if (E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.security)
- if (R.fields["id"] == E.fields["id"])
+ for(var/datum/data/record/E in data_core.general)
+ if(E.fields["name"] == perpname)
+ for(var/datum/data/record/R in data_core.security)
+ if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"security"))
read = 1
var/counter = 1
while(R.fields[text("com_[]", counter)])
to_chat(usr, text("[]", R.fields[text("com_[]", counter)]))
counter++
- if (counter == 1)
+ if(counter == 1)
to_chat(usr, "No comment found")
to_chat(usr, "\[Add comment\] ")
if(!read)
to_chat(usr, "\red Unable to locate a data core entry for this person.")
- if (href_list["secrecordadd"])
+ if(href_list["secrecordadd"])
if(hasHUD(usr,"security"))
var/perpname = "wot"
if(wear_id)
@@ -937,13 +938,13 @@
perpname = tempPda.owner
else
perpname = src.name
- for (var/datum/data/record/E in data_core.general)
- if (E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.security)
- if (R.fields["id"] == E.fields["id"])
+ for(var/datum/data/record/E in data_core.general)
+ if(E.fields["name"] == perpname)
+ for(var/datum/data/record/R in data_core.security)
+ if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"security"))
var/t1 = sanitize(copytext(input("Add Comment:", "Sec. records", null, null) as message,1,MAX_MESSAGE_LEN))
- if ( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"security")) )
+ if( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"security")) )
return
var/counter = 1
while(R.fields[text("com_[]", counter)])
@@ -958,7 +959,7 @@
var/mob/living/silicon/ai/U = usr
R.fields[text("com_[counter]")] = text("Made by [U.name] (artificial intelligence) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year] [t1]")
- if (href_list["medical"])
+ if(href_list["medical"])
if(hasHUD(usr,"medical"))
var/perpname = "wot"
var/modified = 0
@@ -972,10 +973,10 @@
else
perpname = src.name
- for (var/datum/data/record/E in data_core.general)
- if (E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.general)
- if (R.fields["id"] == E.fields["id"])
+ for(var/datum/data/record/E in data_core.general)
+ if(E.fields["name"] == perpname)
+ for(var/datum/data/record/R in data_core.general)
+ if(R.fields["id"] == E.fields["id"])
var/setmedical = input(usr, "Specify a new medical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("*SSD*", "*Deceased*", "Physically Unfit", "Active", "Disabled", "Cancel")
if(hasHUD(usr,"medical"))
@@ -996,7 +997,7 @@
if(!modified)
to_chat(usr, "\red Unable to locate a data core entry for this person.")
- if (href_list["medrecord"])
+ if(href_list["medrecord"])
if(hasHUD(usr,"medical"))
var/perpname = "wot"
var/read = 0
@@ -1009,10 +1010,10 @@
perpname = tempPda.owner
else
perpname = src.name
- for (var/datum/data/record/E in data_core.general)
- if (E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.medical)
- if (R.fields["id"] == E.fields["id"])
+ for(var/datum/data/record/E in data_core.general)
+ if(E.fields["name"] == perpname)
+ for(var/datum/data/record/R in data_core.medical)
+ if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"medical"))
to_chat(usr, "Name: [R.fields["name"]] Blood Type: [R.fields["b_type"]]")
to_chat(usr, "DNA: [R.fields["b_dna"]]")
@@ -1027,7 +1028,7 @@
if(!read)
to_chat(usr, "\red Unable to locate a data core entry for this person.")
- if (href_list["medrecordComment"])
+ if(href_list["medrecordComment"])
if(hasHUD(usr,"medical"))
var/perpname = "wot"
var/read = 0
@@ -1040,24 +1041,24 @@
perpname = tempPda.owner
else
perpname = src.name
- for (var/datum/data/record/E in data_core.general)
- if (E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.medical)
- if (R.fields["id"] == E.fields["id"])
+ for(var/datum/data/record/E in data_core.general)
+ if(E.fields["name"] == perpname)
+ for(var/datum/data/record/R in data_core.medical)
+ if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"medical"))
read = 1
var/counter = 1
while(R.fields[text("com_[]", counter)])
to_chat(usr, text("[]", R.fields[text("com_[]", counter)]))
counter++
- if (counter == 1)
+ if(counter == 1)
to_chat(usr, "No comment found")
to_chat(usr, "\[Add comment\] ")
if(!read)
to_chat(usr, "\red Unable to locate a data core entry for this person.")
- if (href_list["medrecordadd"])
+ if(href_list["medrecordadd"])
if(hasHUD(usr,"medical"))
var/perpname = "wot"
if(wear_id)
@@ -1068,13 +1069,13 @@
perpname = tempPda.owner
else
perpname = src.name
- for (var/datum/data/record/E in data_core.general)
- if (E.fields["name"] == perpname)
- for (var/datum/data/record/R in data_core.medical)
- if (R.fields["id"] == E.fields["id"])
+ for(var/datum/data/record/E in data_core.general)
+ if(E.fields["name"] == perpname)
+ for(var/datum/data/record/R in data_core.medical)
+ if(R.fields["id"] == E.fields["id"])
if(hasHUD(usr,"medical"))
var/t1 = sanitize(copytext(input("Add Comment:", "Med. records", null, null) as message,1,MAX_MESSAGE_LEN))
- if ( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"medical")) )
+ if( !(t1) || usr.stat || usr.restrained() || !(hasHUD(usr,"medical")) )
return
var/counter = 1
while(R.fields[text("com_[]", counter)])
@@ -1086,11 +1087,11 @@
var/mob/living/silicon/robot/U = usr
R.fields[text("com_[counter]")] = text("Made by [U.name] ([U.modtype] [U.braintype]) on [time2text(world.realtime, "DDD MMM DD hh:mm:ss")], [game_year] [t1]")
- if (href_list["lookitem"])
+ if(href_list["lookitem"])
var/obj/item/I = locate(href_list["lookitem"])
src.examinate(I)
- if (href_list["lookmob"])
+ if(href_list["lookmob"])
var/mob/M = locate(href_list["lookmob"])
src.examinate(M)
. = ..()
@@ -1195,7 +1196,7 @@
if(!affecting)
. = 0
fail_msg = "They are missing that limb."
- else if (affecting.status & ORGAN_ROBOT)
+ else if(affecting.status & ORGAN_ROBOT)
. = 0
fail_msg = "That limb is robotic."
else
@@ -1324,7 +1325,7 @@
mutations.Remove(HUSK)
if(!client || !key) //Don't boot out anyone already in the mob.
- for (var/obj/item/organ/internal/brain/H in world)
+ for(var/obj/item/organ/internal/brain/H in world)
if(H.brainmob)
if(H.brainmob.real_name == src.real_name)
if(H.brainmob.mind)
@@ -1359,30 +1360,30 @@
var/germs = 0
var/tdamage = 0
var/ticks = 0
- while (germs < 2501 && ticks < 100000 && round(damage/10)*20)
+ while(germs < 2501 && ticks < 100000 && round(damage/10)*20)
diary << "VIRUS TESTING: [ticks] : germs [germs] tdamage [tdamage] prob [round(damage/10)*20]"
ticks++
- if (prob(round(damage/10)*20))
+ if(prob(round(damage/10)*20))
germs++
- if (germs == 100)
+ if(germs == 100)
to_chat(world, "Reached stage 1 in [ticks] ticks")
- if (germs > 100)
- if (prob(10))
+ if(germs > 100)
+ if(prob(10))
damage++
germs++
- if (germs == 1000)
+ if(germs == 1000)
to_chat(world, "Reached stage 2 in [ticks] ticks")
- if (germs > 1000)
+ if(germs > 1000)
damage++
germs++
- if (germs == 2500)
+ if(germs == 2500)
to_chat(world, "Reached stage 3 in [ticks] ticks")
to_chat(world, "Mob took [tdamage] tox damage")
*/
//returns 1 if made bloody, returns 0 otherwise
/mob/living/carbon/human/add_blood(mob/living/carbon/human/M as mob)
- if (!..())
+ if(!..())
return 0
//if this blood isn't already in the list, add it
if(blood_DNA[M.dna.unique_enzymes])
@@ -1620,32 +1621,32 @@
set name = "Write in blood"
set desc = "Use blood on your hands to write a short message on the floor or a wall, murder mystery style."
- if (usr != src)
+ if(usr != src)
return 0 //something is terribly wrong
- if (!bloody_hands)
+ if(!bloody_hands)
verbs -= /mob/living/carbon/human/proc/bloody_doodle
- if (src.gloves)
+ if(src.gloves)
to_chat(src, "Your [src.gloves] are getting in the way. ")
return
var/turf/simulated/T = src.loc
- if (!istype(T)) //to prevent doodling out of mechs and lockers
+ if(!istype(T)) //to prevent doodling out of mechs and lockers
to_chat(src, "You cannot reach the floor. ")
return
var/direction = input(src,"Which way?","Tile selection") as anything in list("Here","North","South","East","West")
- if (direction != "Here")
+ if(direction != "Here")
T = get_step(T,text2dir(direction))
- if (!istype(T))
+ if(!istype(T))
to_chat(src, "You cannot doodle there. ")
return
var/num_doodles = 0
- for (var/obj/effect/decal/cleanable/blood/writing/W in T)
+ for(var/obj/effect/decal/cleanable/blood/writing/W in T)
num_doodles++
- if (num_doodles > 4)
+ if(num_doodles > 4)
to_chat(src, "There is no space to write on! ")
return
@@ -1653,11 +1654,11 @@
var/message = stripped_input(src,"Write a message. It cannot be longer than [max_length] characters.","Blood writing", "")
- if (message)
+ if(message)
var/used_blood_amount = round(length(message) / 30, 1)
bloody_hands = max(0, bloody_hands - used_blood_amount) //use up some blood
- if (length(message) > max_length)
+ if(length(message) > max_length)
message += "-"
to_chat(src, "You ran out of blood to write with! ")
@@ -1882,7 +1883,7 @@
threatcount += 2
- //Loyalty implants imply trustworthyness
+ //Mindshield implants imply slight trustworthiness
if(isloyal(src))
threatcount -= 1
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 33cb567ba4a..d39aa319e51 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -1,5 +1,5 @@
/mob/living/carbon/human/attack_hand(mob/living/carbon/human/M as mob)
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
+ if(istype(loc, /turf) && istype(loc.loc, /area/start))
to_chat(M, "No attacking people at spawn, you jackass.")
return
@@ -10,7 +10,7 @@
var/mob/living/carbon/human/H = M
if(istype(H))
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
- if (H.hand)
+ if(H.hand)
temp = H.organs_by_name["l_hand"]
if(!temp || !temp.is_usable())
to_chat(H, "\red You can't use your hand.")
@@ -18,10 +18,9 @@
..()
- if((M != src) && check_shields(0, M.name))
+ if((M != src) && M.a_intent != "help" && check_shields(0, M.name, attack_type = UNARMED_ATTACK))
add_logs(src, M, "attempted to touch")
- M.do_attack_animation(src)
- visible_message("\red [M] attempted to touch [src]! ")
+ visible_message("[M] attempted to touch [src]! ")
return 0
if(istype(M.gloves , /obj/item/clothing/gloves/boxing/hologlove))
@@ -109,36 +108,34 @@
return 1
if(I_HARM)
+ //Vampire code
+ if(M.mind && M.mind.vampire && (M.mind in ticker.mode.vampires) && !M.mind.vampire.draining && M.zone_sel && M.zone_sel.selecting == "head" && src != M)
+ if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH)))
+ to_chat(M, "Remove their mask! ")
+ return
+ if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH)))
+ to_chat(M, "Remove your mask! ")
+ return
+ if(mind && mind.vampire && (mind in ticker.mode.vampires))
+ to_chat(M, "Your fangs fail to pierce [src.name]'s cold flesh ")
+ return
+ if(SKELETON in mutations)
+ to_chat(M, "There is no blood in a skeleton! ")
+ return
+ if(issmall(src) && !ckey) //Monkeyized humans are okay, humanized monkeys are okey, monkeys are not.
+ to_chat(M, "Blood from a monkey is useless! ")
+ return
+ //we're good to suck the blood, blaah
+ M.mind.vampire.handle_bloodsucking(src)
+ add_logs(src, M, "vampirebit")
+ msg_admin_attack("[key_name_admin(M)] vampirebit [key_name_admin(src)]")
+ return
+ //end vampire codes
if(attacker_style && attacker_style.harm_act(H, src))
return 1
else
var/datum/unarmed_attack/attack = M.species.unarmed
- //Vampire code
- if(M.zone_sel && M.zone_sel.selecting == "head" && src != M)
- if(M.mind && M.mind.vampire && (M.mind in ticker.mode.vampires) && !M.mind.vampire.draining)
- if((head && (head.flags & HEADCOVERSMOUTH)) || (wear_mask && (wear_mask.flags & MASKCOVERSMOUTH)))
- to_chat(M, "Remove their mask! ")
- return 0
- if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH)))
- to_chat(M, "Remove your mask! ")
- return 0
- if(mind && mind.vampire && (mind in ticker.mode.vampires))
- to_chat(M, "Your fangs fail to pierce [src.name]'s cold flesh ")
- return 0
- if(SKELETON in mutations)
- to_chat(M, "There is no blood in a skeleton! ")
- return 0
- if(issmall(src) && !ckey) //Monkeyized humans are okay, humanized monkeys are okey, monkeys are not.
- to_chat(M, "Blood from a monkey is useless! ")
- return 0
- //we're good to suck the blood, blaah
- M.mind.vampire.handle_bloodsucking(src)
- add_logs(src, M, "vampirebit")
- msg_admin_attack("[key_name_admin(M)] vampirebit [key_name_admin(src)]")
- return
- //end vampire codes
-
M.do_attack_animation(src)
add_logs(src, M, "[pick(attack.attack_verb)]ed")
@@ -185,7 +182,7 @@
w_uniform.add_fingerprint(M)
var/obj/item/organ/external/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/randn = rand(1, 100)
- if (randn <= 25)
+ if(randn <= 25)
apply_effect(2, WEAKEN, run_armor_check(affecting, "melee"))
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
visible_message("\red [M] has pushed [src]! ")
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index 88e655beb0e..0e2e95bc778 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -26,6 +26,7 @@
update_revive()
med_hud_set_health()
med_hud_set_status()
+ handle_hud_icons()
/mob/living/carbon/human/adjustBrainLoss(var/amount)
if(status_flags & GODMODE)
@@ -103,7 +104,7 @@
if(species && species.brute_mod)
amount = amount*species.brute_mod
- if (organ_name in organs_by_name)
+ if(organ_name in organs_by_name)
var/obj/item/organ/external/O = get_organ(organ_name)
if(amount > 0)
@@ -117,7 +118,7 @@
if(species && species.burn_mod)
amount = amount*species.burn_mod
- if (organ_name in organs_by_name)
+ if(organ_name in organs_by_name)
var/obj/item/organ/external/O = get_organ(organ_name)
if(amount > 0)
@@ -316,8 +317,9 @@ This function restores the subjects blood to max.
*/
/mob/living/carbon/human/proc/restore_blood()
if(!(species.flags & NO_BLOOD))
- var/blood_volume = vessel.get_reagent_amount("blood")
- vessel.add_reagent("blood", 560.0 - blood_volume)
+ var/blood_type = get_blood_name()
+ var/blood_volume = vessel.get_reagent_amount(blood_type)
+ vessel.add_reagent(blood_type, BLOOD_VOLUME_NORMAL - blood_volume)
/*
This function restores all organs.
@@ -383,7 +385,7 @@ This function restores all organs.
var/list/attack_bubble_recipients = list()
var/mob/living/user
for(var/mob/O in viewers(user, src))
- if (O.client && !(O.blinded))
+ if(O.client && !(O.blinded))
attack_bubble_recipients.Add(O.client)
spawn(0)
var/image/dmgIcon = image('icons/effects/hit_blips.dmi', src, "dmg[rand(1,2)]",MOB_LAYER+1)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 3a935e5e449..55fd52ada9e 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -32,7 +32,7 @@ emp_act
return -1 // complete projectile permutation
//Shields
- if(check_shields(P.damage, "the [P.name]", P))
+ if(check_shields(P.damage, "the [P.name]", P, PROJECTILE_ATTACK, P.armour_penetration))
P.on_hit(src, 100, def_zone)
return 2
@@ -41,7 +41,7 @@ emp_act
return
//Shrapnel
- if (P.damage_type == BRUTE)
+ if(P.damage_type == BRUTE)
var/armor = getarmor_organ(organ, "bullet")
if((P.embed && prob(20 + max(P.damage - armor, -10))))
var/obj/item/weapon/shard/shrapnel/SP = new()
@@ -91,7 +91,7 @@ emp_act
//this proc returns the Siemens coefficient of electrical resistivity for a particular external organ.
/mob/living/carbon/human/proc/get_siemens_coefficient_organ(var/obj/item/organ/external/def_zone)
- if (!def_zone)
+ if(!def_zone)
return 1.0
var/siemens_coefficient = 1.0
@@ -132,40 +132,24 @@ emp_act
//End Here
-/mob/living/carbon/human/proc/check_shields(var/damage = 0, var/attack_text = "the attack", var/obj/item/O)
- if(O)
- if(O.flags & NOSHIELD) //weapon ignores shields altogether
- return 0
- if(l_hand && istype(l_hand, /obj/item/weapon))//Current base is the prob(50-d/3)
- var/obj/item/weapon/I = l_hand
- if(I.IsShield() && (prob(50 - round(damage / 3))))
- visible_message("[src] blocks [attack_text] with [l_hand]! ", \
- "[src] blocks [attack_text] with [l_hand]! ")
+/mob/living/carbon/human/proc/check_shields(damage = 0, attack_text = "the attack", atom/movable/AM, attack_type = MELEE_ATTACK, armour_penetration = 0)
+ var/block_chance_modifier = round(damage / -3)
+
+ if(l_hand && !istype(l_hand, /obj/item/clothing))
+ var/final_block_chance = l_hand.block_chance - (Clamp((armour_penetration-l_hand.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example
+ if(l_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type))
return 1
- if(r_hand && istype(r_hand, /obj/item/weapon))
- var/obj/item/weapon/I = r_hand
- if(I.IsShield() && (prob(50 - round(damage / 3))))
- visible_message("[src] blocks [attack_text] with [r_hand]! ", \
- "[src] blocks [attack_text] with [r_hand]! ")
+ if(r_hand && !istype(r_hand, /obj/item/clothing))
+ var/final_block_chance = r_hand.block_chance - (Clamp((armour_penetration-r_hand.armour_penetration)/2,0,100)) + block_chance_modifier //Need to reset the var so it doesn't carry over modifications between attempts
+ if(r_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type))
return 1
- if(wear_suit && istype(wear_suit, /obj/item/))
- var/obj/item/I = wear_suit
- if(I.IsShield() && (prob(50)))
- visible_message("The reactive teleport system flings [src] clear of [attack_text]! ", \
- "The reactive teleport system flings [src] clear of [attack_text]! ")
- var/list/turfs = new/list()
- for(var/turf/T in orange(6, src))
- if(istype(T,/turf/space)) continue
- if(T.density) continue
- if(T.x>world.maxx-6 || T.x<6) continue
- if(T.y>world.maxy-6 || T.y<6) continue
- turfs += T
- if(!turfs.len) turfs += pick(/turf in orange(6, src))
- var/turf/picked = pick(turfs)
- if(!isturf(picked)) return
- if(buckled)
- buckled.unbuckle_mob()
- src.loc = picked
+ if(wear_suit)
+ var/final_block_chance = wear_suit.block_chance - (Clamp((armour_penetration-wear_suit.armour_penetration)/2,0,100)) + block_chance_modifier
+ if(wear_suit.hit_reaction(src, attack_text, final_block_chance, damage, attack_type))
+ return 1
+ if(w_uniform)
+ var/final_block_chance = w_uniform.block_chance - (Clamp((armour_penetration-w_uniform.armour_penetration)/2,0,100)) + block_chance_modifier
+ if(w_uniform.hit_reaction(src, attack_text, final_block_chance, damage, attack_type))
return 1
return 0
@@ -221,7 +205,7 @@ emp_act
if(user != src)
user.do_attack_animation(src)
- if(check_shields(I.force, "the [I.name]", I))
+ if(check_shields(I.force, "the [I.name]", I, MELEE_ATTACK, I.armour_penetration))
return 0
if(istype(I,/obj/item/weapon/card/emag))
@@ -236,7 +220,7 @@ emp_act
var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].", armour_penetration = I.armour_penetration)
var/weapon_sharp = is_sharp(I)
var/weapon_edge = has_edge(I)
- if ((weapon_sharp || weapon_edge) && prob(getarmor(user.zone_sel.selecting, "melee")))
+ if((weapon_sharp || weapon_edge) && prob(getarmor(user.zone_sel.selecting, "melee")))
weapon_sharp = 0
weapon_edge = 0
@@ -299,9 +283,9 @@ emp_act
forcesay(hit_appends) //forcesay checks stat already
/* //Melee weapon embedded object code. Commented out, as most people on the forums seem to find this annoying and think it does not contribute to general gameplay. - Dave
- if (I.damtype == BRUTE && !I.is_robot_module())
+ if(I.damtype == BRUTE && !I.is_robot_module())
var/damage = I.force
- if (armor)
+ if(armor)
damage /= armor+1
//blunt objects should really not be embedding in things unless a huge amount of force is involved
@@ -315,63 +299,56 @@ emp_act
//this proc handles being hit by a thrown atom
/mob/living/carbon/human/hitby(atom/movable/AM as mob|obj,var/speed = 5)
- if(istype(AM,/obj/))
- var/obj/O = AM
+ if(istype(AM, /obj/item))
+ var/obj/item/I = AM
if(in_throw_mode && !get_active_hand() && speed <= 5) //empty active hand and we're in throw mode
if(canmove && !restrained())
- if(isturf(O.loc))
- put_in_active_hand(O)
- visible_message("[src] catches [O]! ")
+ if(isturf(I.loc))
+ put_in_active_hand(I)
+ visible_message("[src] catches [I]! ")
throw_mode_off()
return
var/zone = ran_zone("chest", 65)
var/dtype = BRUTE
- if(istype(O,/obj/item/weapon))
- var/obj/item/weapon/W = O
+ if(istype(I, /obj/item/weapon))
+ var/obj/item/weapon/W = I
dtype = W.damtype
- var/throw_damage = O.throwforce*(speed/5)
+ var/throw_damage = I.throwforce*(speed/5)
- /*
- if(!zone)
- visible_message("\blue \The [O] misses [src] narrowly!")
- return
- */
- O.throwing = 0 //it hit, so stop moving
+ I.throwing = 0 //it hit, so stop moving
- if ((O.thrower != src) && check_shields(throw_damage, "[O]"))
+ if((I.thrower != src) && check_shields(throw_damage, "\the [I.name]", I, THROWN_PROJECTILE_ATTACK))
return
var/obj/item/organ/external/affecting = get_organ(zone)
if(!affecting)
- var/missverb = (O.gender == PLURAL) ? "whizz" : "whizzes"
- visible_message("\The [O] [missverb] past [src]'s missing [parse_zone(zone)]! ",
- "\The [O] [missverb] past your missing [parse_zone(zone)]! ")
+ var/missverb = (I.gender == PLURAL) ? "whizz" : "whizzes"
+ visible_message("\The [I] [missverb] past [src]'s missing [parse_zone(zone)]! ",
+ "\The [I] [missverb] past your missing [parse_zone(zone)]! ")
return
var/hit_area = affecting.name
- src.visible_message("\red [src] has been hit in the [hit_area] by [O].")
- var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here
+ src.visible_message("\red [src] has been hit in the [hit_area] by [I].")
+ var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].", I.armour_penetration) //I guess "melee" is the best fit here
+ apply_damage(throw_damage, dtype, zone, armor, is_sharp(I), has_edge(I), I)
- apply_damage(throw_damage, dtype, zone, armor, is_sharp(O), has_edge(O), O)
-
- if(ismob(O.thrower))
- var/mob/M = O.thrower
+ if(ismob(I.thrower))
+ var/mob/M = I.thrower
if(M)
- src.attack_log += text("\[[time_stamp()]\] Has been hit with a [O], thrown by [key_name(M)] ")
- M.attack_log += text("\[[time_stamp()]\] Hit [key_name(src)] with a thrown [O] ")
+ src.attack_log += text("\[[time_stamp()]\] Has been hit with a [I], thrown by [key_name(M)] ")
+ M.attack_log += text("\[[time_stamp()]\] Hit [key_name(src)] with a thrown [I] ")
if(!istype(src,/mob/living/simple_animal/mouse))
- msg_admin_attack("[key_name_admin(src)] was hit by a [O], thrown by [key_name_admin(M)]")
+ msg_admin_attack("[key_name_admin(src)] was hit by a [I], thrown by [key_name_admin(M)]")
//thrown weapon embedded object code.
- if(dtype == BRUTE && istype(O,/obj/item))
- var/obj/item/I = O
- if (!I.is_robot_module())
+ if(dtype == BRUTE && istype(I))
+ if(!I.is_robot_module())
var/sharp = is_sharp(I)
var/damage = throw_damage
- if (armor)
+ if(armor)
damage /= armor+1
//blunt objects should really not be embedding in things unless a huge amount of force is involved
@@ -384,10 +361,10 @@ emp_act
affecting.embed(I)
// Begin BS12 momentum-transfer code.
- if(O.throw_source && speed >= 15)
- var/obj/item/weapon/W = O
+ if(I.throw_source && speed >= 15)
+ var/obj/item/weapon/W = I
var/momentum = speed/2
- var/dir = get_dir(O.throw_source, src)
+ var/dir = get_dir(I.throw_source, src)
visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!")
src.throw_at(get_edge_target_turf(src,dir),1,momentum)
@@ -399,14 +376,14 @@ emp_act
if(T)
src.loc = T
- visible_message("[src] is pinned to the wall by [O]! ","You are pinned to the wall by [O]! ")
+ visible_message("[src] is pinned to the wall by [I]! ","You are pinned to the wall by [I]! ")
src.anchored = 1
- src.pinned += O
+ src.pinned += I
/mob/living/carbon/human/proc/bloody_hands(var/mob/living/source, var/amount = 2)
- if (gloves)
+ if(gloves)
gloves.add_blood(source)
gloves:transfer_blood = amount
gloves:bloody_hands_mob = source
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 6f106f5e125..a74409a9b44 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -53,6 +53,8 @@ var/global/default_martial_art = new/datum/martial_art
var/speech_problem_flag = 0
+ var/datum/personal_crafting/handcrafting
+
var/datum/martial_art/martial_art = null
var/special_voice = "" // For changing our voice. Used by a symptom.
@@ -70,7 +72,7 @@ var/global/default_martial_art = new/datum/martial_art
var/mob/remoteview_target = null
var/meatleft = 3 //For chef item
var/decaylevel = 0 // For rotting bodies
- var/max_blood = 560 // For stuff in the vessel
+ var/max_blood = BLOOD_VOLUME_NORMAL // For stuff in the vessel
var/slime_color = "blue" //For slime people this defines their color, it's blue by default to pay tribute to the old icons
var/check_mutations=0 // Check mutations on next life tick
@@ -80,4 +82,4 @@ var/global/default_martial_art = new/datum/martial_art
var/fire_dmi = 'icons/mob/OnFire.dmi'
var/fire_sprite = "Standing"
- var/datum/body_accessory/body_accessory = null
\ No newline at end of file
+ var/datum/body_accessory/body_accessory = null
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 5d79e3f6237..cf66c1d2c15 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -24,7 +24,7 @@
tally += (health_deficiency / 25)
var/hungry = (500 - nutrition)/5 // So overeat would be 100 and default level would be 80
- if (hungry >= 70)
+ if(hungry >= 70)
tally += hungry/50
if(wear_suit)
@@ -46,7 +46,7 @@
if(FAT in src.mutations)
tally += 1.5
- if (bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
+ if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
tally += (BODYTEMP_COLD_DAMAGE_LIMIT - bodytemperature) / COLD_SLOWDOWN_FACTOR
tally += 2*stance_damage //damaged/missing feet or legs is slow
@@ -79,7 +79,7 @@
break
if(thrust)
- if((movement_dir || thrust.stabilization_on) && thrust.allow_thrust(0.01, src))
+ if((movement_dir || thrust.stabilizers) && thrust.allow_thrust(0.01, src))
return 1
return 0
diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm
index 56838b8d14e..aa0724c5c80 100644
--- a/code/modules/mob/living/carbon/human/human_organs.dm
+++ b/code/modules/mob/living/carbon/human/human_organs.dm
@@ -42,45 +42,45 @@
E.process()
number_wounds += E.number_wounds
- if (!lying && world.time - l_move_time < 15)
+ if(!lying && world.time - l_move_time < 15)
//Moving around with fractured ribs won't do you any good
- if (E.is_broken() && E.internal_organs && E.internal_organs.len && prob(15))
+ if(E.is_broken() && E.internal_organs && E.internal_organs.len && prob(15))
var/obj/item/organ/internal/I = pick(E.internal_organs)
custom_pain("You feel broken bones moving in your [E.name]!", 1)
I.take_damage(rand(3,5))
//Moving makes open wounds get infected much faster
- if (E.wounds.len)
+ if(E.wounds.len)
for(var/datum/wound/W in E.wounds)
- if (W.infection_check())
+ if(W.infection_check())
W.germ_level += 1
/mob/living/carbon/human/proc/handle_stance()
// Don't need to process any of this if they aren't standing anyways
// unless their stance is damaged, and we want to check if they should stay down
- if (!stance_damage && (lying || resting) && (life_tick % 4) == 0)
+ if(!stance_damage && (lying || resting) && (life_tick % 4) == 0)
return
stance_damage = 0
// Buckled to a bed/chair. Stance damage is forced to 0 since they're sitting on something solid
- if (istype(buckled, /obj/structure/stool/bed))
+ if(istype(buckled, /obj/structure/stool/bed))
return
for(var/limb_tag in list("l_leg","r_leg","l_foot","r_foot"))
var/obj/item/organ/external/E = organs_by_name[limb_tag]
if(!E || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD)) || E.is_malfunctioning())
stance_damage += 2 // let it fail even if just foot&leg. Also malfunctioning happens sporadically so it should impact more when it procs
- else if (E.is_broken() || !E.is_usable())
+ else if(E.is_broken() || !E.is_usable())
stance_damage += 1
// Canes and crutches help you stand (if the latter is ever added)
// One cane mitigates a broken leg+foot, or a missing foot.
// Two canes are needed for a lost leg. If you are missing both legs, canes aren't gonna help you.
- if (l_hand && istype(l_hand, /obj/item/weapon/cane))
+ if(l_hand && istype(l_hand, /obj/item/weapon/cane))
stance_damage -= 2
- if (r_hand && istype(r_hand, /obj/item/weapon/cane))
+ if(r_hand && istype(r_hand, /obj/item/weapon/cane))
stance_damage -= 2
if(stance_damage < 0)
@@ -100,7 +100,7 @@
if(!l_hand && !r_hand)
return
- for (var/obj/item/organ/external/E in organs)
+ for(var/obj/item/organ/external/E in organs)
if(!E || !E.can_grasp || (E.status & ORGAN_SPLINTED))
continue
@@ -163,7 +163,7 @@ I use this to standardize shadowling dethrall code
-- Crazylemon
*/
/mob/living/carbon/human/proc/named_organ_parent(var/organ_name)
- if (!get_int_organ(organ_name))
+ if(!get_int_organ(organ_name))
return null
var/obj/item/organ/internal/O = get_int_organ(organ_name)
return O.parent_organ
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/interactive/functions.dm b/code/modules/mob/living/carbon/human/interactive/functions.dm
index b0806e66241..199530c4805 100644
--- a/code/modules/mob/living/carbon/human/interactive/functions.dm
+++ b/code/modules/mob/living/carbon/human/interactive/functions.dm
@@ -433,7 +433,7 @@
return 1
/mob/living/carbon/human/interactive/proc/souschef(obj)
- if(shouldModulePass() || enforceHome() || prob(SNPC_FUZZY_CHANCE_LOW))
+ if(shouldModulePass() || enforceHome() || prob(SNPC_FUZZY_CHANCE_HIGH) || prob(SNPC_FUZZY_CHANCE_HIGH))
return
if(doing & SNPC_SPECIAL)
@@ -442,7 +442,7 @@
var/static/list/customableTypes = list(/obj/item/weapon/reagent_containers/food/snacks/customizable,/obj/item/weapon/reagent_containers/food/snacks/breadslice,/obj/item/weapon/reagent_containers/food/snacks/bun,/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,/obj/item/weapon/reagent_containers/food/snacks/boiledspagetti,/obj/item/trash/plate,/obj/item/trash/bowl)
- var/static/list/rawtypes = list(/obj/item/weapon/reagent_containers/food/snacks/grown, /obj/item/weapon/reagent_containers/food/snacks/rawcutlet, /obj/item/weapon/reagent_containers/food/snacks/rawmeatball, /obj/item/weapon/reagent_containers/food/snacks/rawsticks, /obj/item/weapon/reagent_containers/food/snacks/salmonmeat, /obj/item/weapon/reagent_containers/food/snacks/carpmeat, /obj/item/weapon/reagent_containers/food/snacks/catfishmeat, /obj/item/weapon/reagent_containers/food/snacks/spagetti, /obj/item/weapon/reagent_containers/food/snacks/dough_ball, /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough, /obj/item/weapon/reagent_containers/food/snacks/doughslice, /obj/item/weapon/reagent_containers/food/snacks/meat, /obj/item/weapon/reagent_containers/food/snacks/boiledrice, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge)
+ var/static/list/rawtypes = list(/obj/item/weapon/reagent_containers/food/snacks/grown, /obj/item/weapon/reagent_containers/food/snacks/rawcutlet, /obj/item/weapon/reagent_containers/food/snacks/rawmeatball, /obj/item/weapon/reagent_containers/food/snacks/rawsticks, /obj/item/weapon/reagent_containers/food/snacks/salmonmeat, /obj/item/weapon/reagent_containers/food/snacks/carpmeat, /obj/item/weapon/reagent_containers/food/snacks/catfishmeat, /obj/item/weapon/reagent_containers/food/snacks/spagetti, /obj/item/weapon/reagent_containers/food/snacks/dough_ball, /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough, /obj/item/weapon/reagent_containers/food/snacks/doughslice, /obj/item/weapon/reagent_containers/food/snacks/meat, /obj/item/weapon/reagent_containers/food/snacks/boiledrice, /obj/item/weapon/reagent_containers/food/snacks/cheesewedge, /obj/item/weapon/reagent_containers/food/snacks/raw_bacon)
try
var/list/allContents = getAllContents()
@@ -460,7 +460,7 @@
var/global/list/available_recipes
if(!available_recipes)
available_recipes = list()
- for (var/type in subtypesof(/datum/recipe))
+ for(var/type in subtypesof(/datum/recipe))
var/datum/recipe/recipe = new type
if(recipe.result) // Ignore recipe subtypes that lack a result
available_recipes += recipe
@@ -518,6 +518,7 @@
var/obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel/CW = locate() in rangeCheck
var/obj/item/weapon/reagent_containers/food/snacks/grown/potato/PO = locate() in rangeCheck
var/obj/item/weapon/reagent_containers/food/snacks/meat/ME = locate() in rangeCheck
+ var/obj/item/weapon/reagent_containers/food/snacks/raw_bacon/RB = locate() in rangeCheck
if(D)
TARGET = D
@@ -561,6 +562,13 @@
sleep(get_dist(src, ME))
ME.attackby(KK, src)
foundCookable = 1
+ else if(RB)
+ TARGET = RB
+ if(prob(50))
+ tryWalk(get_turf(RB))
+ sleep(get_dist(src, RB))
+ RB.attackby(KK, src)
+ foundCookable = 1
// refresh
allContents = getAllContents()
@@ -640,7 +648,7 @@
newSnack.name = "Synthetic [newSnack.name]"
custom_emote(2, "[pick("gibbers","drools","slobbers","claps wildly","spits")] as they vomit [newSnack] from their mouth!")
catch(var/exception/e)
- log_to_dd("Cooking error: [e] in [e.file]:[e.line]")
+ log_runtime(e, src, "Caught in SNPC cooking module")
doing &= ~SNPC_SPECIAL
// END COOKING MODULE
@@ -776,6 +784,12 @@
else
return "[word]ed"
+/mob/living/carbon/human/interactive/proc/ing_verb(word)
+ if(copytext(word, length(word)) == "e")
+ return "[copytext(word, 1, length(word))]ing"
+ else
+ return "[word]ing"
+
/mob/living/carbon/human/interactive/proc/paperwork_sentence()
var/verbs_use = pick_list(speak_file, "verbs_use")
var/verbs_touch = pick_list(speak_file, "verbs_touch")
diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm
index 14402788451..5e77278be6f 100644
--- a/code/modules/mob/living/carbon/human/interactive/interactive.dm
+++ b/code/modules/mob/living/carbon/human/interactive/interactive.dm
@@ -258,12 +258,15 @@
RPID.access = myjob.get_access()
equip_to_slot_or_del(MYID, slot_wear_id)
- MYPDA = new(src)
+ if(wear_pda)
+ MYPDA = wear_pda
+ else
+ MYPDA = new(src)
+ equip_to_slot_or_del(MYPDA, slot_belt)
MYPDA.owner = real_name
MYPDA.ownjob = alt_title
MYPDA.ownrank = job
MYPDA.name = "PDA-[real_name] ([alt_title])"
- equip_to_slot_or_del(MYPDA, slot_belt)
zone_sel.selecting = "chest"
//arms
if(prob((SNPC_FUZZY_CHANCE_LOW+SNPC_FUZZY_CHANCE_HIGH)/4))
@@ -317,7 +320,7 @@
if("Captain", "Head of Personnel")
favoured_types = list(/obj/item/clothing, /obj/item/weapon/stamp/captain,/obj/item/weapon/disk/nuclear)
if("Nanotrasen Representative")
- favoured_types = list(/obj/item/clothing, /obj/item/weapon/stamp/centcom, /obj/item/weapon/paper, /obj/item/weapon/melee/baton/loaded/ntcane)
+ favoured_types = list(/obj/item/clothing, /obj/item/weapon/stamp/centcom, /obj/item/weapon/paper, /obj/item/weapon/melee/classic_baton/ntcane)
functions += "paperwork"
if("Magistrate", "Internal Affairs Agent")
favoured_types = list(/obj/item/clothing, /obj/item/weapon/stamp/law, /obj/item/weapon/paper)
@@ -836,7 +839,7 @@
return 0
if(myPath.len <= 0)
- myPath = get_path_to(src, get_turf(target), /turf/proc/Distance, SNPC_MAX_RANGE_FIND + 1, 250,1, id=Path_ID)
+ myPath = get_path_to(src, get_turf(target), /turf/proc/Distance, SNPC_MAX_RANGE_FIND + 1, 250,1, id=Path_ID, simulated_only = 0)
if(myPath)
if(myPath.len > 0)
@@ -951,4 +954,4 @@
if(RPID)
RPID.registered_name = MYID.registered_name
RPID.name = MYID.name
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index bde2c900636..5e0a4335b83 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -39,10 +39,10 @@
/mob/living/carbon/human/proc/equip_in_one_of_slots(obj/item/W, list/slots, del_on_fail = 1)
- for (var/slot in slots)
- if (equip_to_slot_if_possible(W, slots[slot], del_on_fail = 0))
+ for(var/slot in slots)
+ if(equip_to_slot_if_possible(W, slots[slot], del_on_fail = 0))
return slot
- if (del_on_fail)
+ if(del_on_fail)
qdel(W)
return null
@@ -78,8 +78,6 @@
if(slot_wear_id)
// the only relevant check for this is the uniform check
return 1
- if(slot_wear_pda)
- return 1
if(slot_l_ear)
return has_organ("head")
if(slot_r_ear)
@@ -150,7 +148,7 @@
else if(I == r_ear)
r_ear = null
update_inv_ears()
- else if (I == l_ear)
+ else if(I == l_ear)
l_ear = null
update_inv_ears()
else if(I == shoes)
@@ -166,9 +164,8 @@
update_fhair()
update_head_accessory()
if(internal)
- if(internals)
- internals.icon_state = "internal0"
internal = null
+ update_internals_hud_icon(0)
sec_hud_set_ID()
update_inv_wear_mask()
else if(I == wear_id)
@@ -251,9 +248,6 @@
wear_id = W
sec_hud_set_ID()
update_inv_wear_id(redraw_mob)
- if(slot_wear_pda)
- wear_pda = W
- update_inv_wear_pda(redraw_mob)
if(slot_l_ear)
l_ear = W
if(l_ear.slot_flags & SLOT_TWOEARS)
@@ -340,8 +334,6 @@
return belt
if(slot_wear_id)
return wear_id
- if(slot_wear_pda)
- return wear_pda
if(slot_l_ear)
return l_ear
if(slot_r_ear)
@@ -423,7 +415,7 @@
if(istype(I, /obj/item/clothing/under) || istype(I, /obj/item/clothing/suit))
if(FAT in mutations)
//testing("[M] TOO FAT TO WEAR [src]!")
- if(!(I.flags & ONESIZEFITSALL))
+ if(!(I.flags_size & ONESIZEFITSALL))
if(!disable_warning)
to_chat(src, "You're too fat to wear the [I]. ")
return 0
@@ -521,16 +513,6 @@
if(!(I.slot_flags & SLOT_ID))
return 0
return 1
- if(slot_wear_pda)
- if(wear_pda)
- return 0
- if(!w_uniform)
- if(!disable_warning)
- to_chat(src, "You need a jumpsuit before you can attach this [name]. ")
- return 0
- if(!(I.slot_flags & SLOT_PDA))
- return 0
- return 1
if(slot_l_store)
if(I.flags & NODROP) //Pockets aren't visible, so you can't move NODROP items into them.
return 0
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index d96dd018f2a..b2b71d60545 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -78,8 +78,8 @@
/mob/living/carbon/human/handle_disabilities()
- if (disabilities & EPILEPSY)
- if ((prob(1) && paralysis < 1))
+ if(disabilities & EPILEPSY)
+ if((prob(1) && paralysis < 1))
visible_message("[src] starts having a seizure! ","You have a seizure! ")
Paralyse(10)
Jitter(1000)
@@ -89,13 +89,13 @@
if(prob(1) && hallucination < 1)
hallucination += 20
- if (disabilities & COUGHING)
- if ((prob(5) && paralysis <= 1))
+ if(disabilities & COUGHING)
+ if((prob(5) && paralysis <= 1))
drop_item()
emote("cough")
- if (disabilities & TOURETTES)
+ if(disabilities & TOURETTES)
speech_problem_flag = 1
- if ((prob(10) && paralysis <= 1))
+ if((prob(10) && paralysis <= 1))
Stun(10)
switch(rand(1, 3))
if(1)
@@ -108,12 +108,12 @@
animate(src, pixel_x = pixel_x + x_offset, pixel_y = pixel_y + y_offset, time = 1)
animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y), time = 1)
- if (disabilities & NERVOUS)
+ if(disabilities & NERVOUS)
speech_problem_flag = 1
- if (prob(10))
+ if(prob(10))
stuttering = max(10, stuttering)
- if (getBrainLoss() >= 60 && stat != 2)
+ if(getBrainLoss() >= 60 && stat != 2)
speech_problem_flag = 1
if(prob(3))
var/list/s1 = list("IM A PONY NEEEEEEIIIIIIIIIGH",
@@ -174,13 +174,28 @@
if(!gene.block)
continue
if(gene.is_active(src))
- /* if (prob(10) && prob(gene.instability))
- adjustCloneLoss(1) */
speech_problem_flag = 1
gene.OnMobLife(src)
+ if(gene_stability < 85)
+ var/instability = DEFAULT_GENE_STABILITY - gene_stability
+ if(prob(instability / 10))
+ adjustFireLoss(min(6, instability / 12))
+ to_chat(src, "You feel like your skin is burning and bubbling off! ")
+ if(gene_stability < 70)
+ if(prob(instability / 12))
+ adjustCloneLoss(min(5, instability / 15))
+ to_chat(src, "You feel as if your body is warping. ")
+ if(prob(instability / 10))
+ adjustToxLoss(min(6, instability / 12))
+ to_chat(src, "You feel weak and nauseous. ")
+ if(gene_stability < 40 && prob(1))
+ to_chat(src, "You feel incredibly sick... Something isn't right! ")
+ spawn(300)
+ if(gene_stability < 40)
+ gib()
if(!(species.flags & RADIMMUNE))
- if (radiation)
+ if(radiation)
if(get_int_organ(/obj/item/organ/internal/nucleation/resonant_crystal))
var/rads = radiation/25
@@ -191,14 +206,14 @@
to_chat(src, "You feel relaxed. ")
return
- if (radiation > 100)
+ if(radiation > 100)
radiation = 100
Weaken(10)
if(!lying)
to_chat(src, "You feel weak. ")
emote("collapse")
- if (radiation < 0)
+ if(radiation < 0)
radiation = 0
else
@@ -313,7 +328,6 @@
/mob/living/carbon/human/get_breath_from_internal(volume_needed) //making this call the parent would be far too complicated
-
if(internal)
var/null_internals = 0 //internals are invalid, therefore turn them off
var/skip_contents_check = 0 //rigsuit snowflake, oxygen tanks aren't stored inside the mob, so the 'contents.Find' check has to be skipped.
@@ -338,12 +352,10 @@
if(internal) //check for hud updates every time this is called
- if(internals)
- internals.icon_state = "internal1"
+ update_internals_hud_icon(1)
return internal.remove_air_volume(volume_needed) //returns the valid air
else
- if(internals)
- internals.icon_state = "internal0"
+ update_internals_hud_icon(0)
return null
@@ -475,6 +487,16 @@
return
if(RESIST_HEAT in mutations)
return
+ var/thermal_protection = get_thermal_protection()
+
+ if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT)
+ return
+ if(thermal_protection >= FIRE_SUIT_MAX_TEMP_PROTECT)
+ bodytemperature += 11
+ else
+ bodytemperature += BODYTEMP_HEATING_MAX
+
+/mob/living/carbon/human/proc/get_thermal_protection()
var/thermal_protection = 0 //Simple check to estimate how protected we are against multiple temperatures
if(wear_suit)
if(wear_suit.max_heat_protection_temperature >= FIRE_SUIT_MAX_TEMP_PROTECT)
@@ -483,34 +505,9 @@
if(head.max_heat_protection_temperature >= FIRE_HELM_MAX_TEMP_PROTECT)
thermal_protection += (head.max_heat_protection_temperature*THERMAL_PROTECTION_HEAD)
thermal_protection = round(thermal_protection)
- if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT)
- return
- if(thermal_protection >= FIRE_SUIT_MAX_TEMP_PROTECT)
- bodytemperature += 11
- return
- else
- bodytemperature += BODYTEMP_HEATING_MAX
- return
-//END FIRE CODE
+ return thermal_protection
- /*
-/mob/living/carbon/human/proc/adjust_body_temperature(current, loc_temp, boost)
- var/temperature = current
- var/difference = abs(current-loc_temp) //get difference
- var/increments// = difference/10 //find how many increments apart they are
- if(difference > 50)
- increments = difference/5
- else
- increments = difference/10
- var/change = increments*boost // Get the amount to change by (x per increment)
- var/temp_change
- if(current < loc_temp)
- temperature = min(loc_temp, temperature+change)
- else if(current > loc_temp)
- temperature = max(loc_temp, temperature-change)
- temp_change = (temperature - current)
- return temp_change
- */
+//END FIRE CODE
/mob/living/carbon/human/proc/stabilize_temperature_from_calories()
if(bodytemperature <= species.cold_level_1) //260.15 is 310.15 - 50, the temperature where you start to feel effects.
@@ -693,10 +690,10 @@
update_inv_wear_suit()
// nutrition decrease
- if (nutrition > 0 && stat != 2)
+ if(nutrition > 0 && stat != 2)
nutrition = max (0, nutrition - HUNGER_FACTOR)
- if (nutrition > 450)
+ if(nutrition > 450)
if(overeatduration < 800) //capped so people don't take forever to unfat
overeatduration++
@@ -707,10 +704,10 @@
else
overeatduration -= 2
- if (drowsyness)
+ if(drowsyness)
drowsyness--
eye_blurry = max(2, eye_blurry)
- if (prob(5))
+ if(prob(5))
sleeping += 1
Paralyse(5)
@@ -756,7 +753,7 @@
alcohol_strength *= 5
if(alcohol_strength >= slur_start) //slurring
- if (!slurring) slurring = 1
+ if(!slurring) slurring = 1
slurring = drunk
if(alcohol_strength >= brawl_start) //the drunken martial art
if(!istype(martial_art, /datum/martial_art/drunk_brawling))
@@ -766,7 +763,7 @@
if(istype(martial_art, /datum/martial_art/drunk_brawling))
martial_art.remove(src)
if(alcohol_strength >= confused_start && prob(33)) //confused walking
- if (!confused) confused = 1
+ if(!confused) confused = 1
confused = max(confused+(3/sober_str),0)
if(alcohol_strength >= blur_start) //blurry eyes
eye_blurry = max(eye_blurry, 10/sober_str)
@@ -778,7 +775,7 @@
if(alcohol_strength >= pass_out)
Paralyse(5 / sober_str)
drowsyness = max(drowsyness, 30/sober_str)
- if (L)
+ if(L)
L.take_damage(0.1, 1)
adjustToxLoss(0.1)
else //stuff only for synthetics
@@ -819,9 +816,6 @@
handle_organs()
handle_blood()
- //the analgesic effect wears off slowly
- analgesic = max(0, analgesic - 1)
-
if(paralysis)
blinded = 1
stat = UNCONSCIOUS
@@ -867,7 +861,7 @@
else
//blindness
- if(sdisabilities & BLIND) // Disabled-blind, doesn't get better on its own
+ if(disabilities & BLIND) // Disabled-blind, doesn't get better on its own
blinded = 1
else if(eye_blind) // Blindness, heals slowly over time
@@ -887,26 +881,22 @@
//Ears
- if(sdisabilities & DEAF) //disabled-deaf, doesn't get better on its own
- ear_deaf = max(ear_deaf, 1)
+ if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own
+ setEarDamage(-1, max(ear_deaf, 1))
else if(ear_deaf) //deafness, heals slowly over time
- ear_deaf = max(ear_deaf - 1, 0)
+ adjustEarDamage(0,-1)
else if(istype(l_ear, /obj/item/clothing/ears/earmuffs) || istype(r_ear, /obj/item/clothing/ears/earmuffs)) //resting your ears with earmuffs heals ear damage faster
- ear_damage = max(ear_damage - 0.15, 0)
- ear_deaf = max(ear_deaf, 1)
+ adjustEarDamage(-0.15,0)
+ setEarDamage(-1, max(ear_deaf, 1))
else if(ear_damage < 25) //ear damage heals slowly under this threshold. otherwise you'll need earmuffs
- ear_damage = max(ear_damage - 0.05, 0)
-
+ adjustEarDamage(-0.05,0)
if(flying)
- spawn()
- animate(src, pixel_y = pixel_y + 5 , time = 10, loop = 1, easing = SINE_EASING)
- spawn(10)
- if(flying)
- animate(src, pixel_y = pixel_y - 5, time = 10, loop = 1, easing = SINE_EASING)
+ animate(src, pixel_y = pixel_y + 5 , time = 10, loop = 1, easing = SINE_EASING)
+ animate(pixel_y = pixel_y - 5, time = 10, loop = 1, easing = SINE_EASING)
// If you're dirty, your gloves will become dirty, too.
if(gloves && germ_level > gloves.germ_level && prob(10))
@@ -955,7 +945,7 @@
/mob/living/carbon/human/handle_random_events()
// Puke if toxloss is too high
if(!stat)
- if (getToxLoss() >= 45 && nutrition > 20)
+ if(getToxLoss() >= 45 && nutrition > 20)
lastpuke ++
if(lastpuke >= 25) // about 25 second delay I guess
Stun(5)
@@ -965,7 +955,7 @@
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
var/turf/location = loc
- if (istype(location, /turf/simulated))
+ if(istype(location, /turf/simulated))
location.add_vomit_floor(src, 1)
nutrition -= 20
@@ -994,8 +984,10 @@
/mob/living/carbon/human/handle_shock()
..()
- if(status_flags & GODMODE) return 0 //godmode
- if(analgesic || (species && species.flags & NO_PAIN)) return // analgesic avoids all traumatic shock temporarily
+ if(status_flags & GODMODE)
+ return 0 //godmode
+ if(species && species.flags & NO_PAIN)
+ return
if(health <= config.health_threshold_softcrit)// health 0 makes you immediately collapse
shock_stage = max(shock_stage, 61)
@@ -1020,17 +1012,17 @@
if(shock_stage >=60)
if(shock_stage == 60) custom_emote(1,"falls limp.")
- if (prob(2))
+ if(prob(2))
to_chat(src, ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
Weaken(20)
if(shock_stage >= 80)
- if (prob(5))
+ if(prob(5))
to_chat(src, ""+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
Weaken(20)
if(shock_stage >= 120)
- if (prob(2))
+ if(prob(2))
to_chat(src, ""+pick("You black out!", "You feel like you could die any moment now.", "You're about to lose consciousness."))
Paralyse(5)
@@ -1044,9 +1036,11 @@
/mob/living/carbon/human/proc/handle_pulse()
- if(mob_master.current_cycle % 5) return pulse //update pulse every 5 life ticks (~1 tick/sec, depending on server load)
+ if(mob_master.current_cycle % 5)
+ return pulse //update pulse every 5 life ticks (~1 tick/sec, depending on server load)
- if(species && species.flags & NO_BLOOD) return PULSE_NONE //No blood, no pulse.
+ if(species && species.flags & NO_BLOOD)
+ return PULSE_NONE //No blood, no pulse.
if(stat == DEAD)
return PULSE_NONE //that's it, you're dead, nothing can influence your pulse
@@ -1056,32 +1050,29 @@
var/temp = PULSE_NORM
- if(round(vessel.get_reagent_amount("blood")) <= BLOOD_VOLUME_BAD) //how much blood do we have
+ var/blood_type = get_blood_name()
+ if(round(vessel.get_reagent_amount(blood_type)) <= BLOOD_VOLUME_BAD) //how much blood do we have
temp = PULSE_THREADY //not enough :(
if(status_flags & FAKEDEATH)
temp = PULSE_NONE //pretend that we're dead. unlike actual death, can be inflienced by meds
for(var/datum/reagent/R in reagents.reagent_list)
- if(R.id in bradycardics)
+ if(R.heart_rate_decrease)
if(temp <= PULSE_THREADY && temp >= PULSE_NORM)
temp--
- break //one reagent is enough
- //comment out the breaks to make med effects stack
- for(var/datum/reagent/R in reagents.reagent_list) //handles different chems' influence on pulse
- if(R.id in tachycardics)
+ break
+
+ for(var/datum/reagent/R in reagents.reagent_list)//handles different chems' influence on pulse
+ if(R.heart_rate_increase)
if(temp <= PULSE_FAST && temp >= PULSE_NONE)
temp++
break
+
for(var/datum/reagent/R in reagents.reagent_list) //To avoid using fakedeath
- if(R.id in heartstopper)
+ if(R.heart_rate_stop)
temp = PULSE_NONE
break
- for(var/datum/reagent/R in reagents.reagent_list) //Conditional heart-stoppage
- if(R.id in cheartstopper)
- if(R.volume >= R.overdose_threshold)
- temp = PULSE_NONE
- break
return temp
@@ -1141,7 +1132,7 @@
if(heartbeat >= rate)
heartbeat = 0
- to_chat(src, sound('sound/effects/electheart.ogg',0,0,0,30))//Credit to GhostHack (www.ghosthack.de) for sound.
+ src << sound('sound/effects/electheart.ogg',0,0,0,30)//Credit to GhostHack (www.ghosthack.de) for sound.
else
heartbeat++
@@ -1160,9 +1151,9 @@
if(heartbeat >= rate)
heartbeat = 0
if(H.status & ORGAN_ASSISTED)
- to_chat(src, sound('sound/effects/pacemakebeat.ogg',0,0,0,50))
+ src << sound('sound/effects/pacemakebeat.ogg',0,0,0,50)
else
- to_chat(src, sound('sound/effects/singlebeat.ogg',0,0,0,50))
+ src << sound('sound/effects/singlebeat.ogg',0,0,0,50)
else
heartbeat++
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 840b500de01..72e6ff63314 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -38,8 +38,7 @@
say(temp)
winset(client, "input", "text=[null]")
-/mob/living/carbon/human/say_understands(var/mob/other,var/datum/language/speaking = null)
-
+/mob/living/carbon/human/say_understands(var/mob/other, var/datum/language/speaking = null)
if(has_brain_worms()) //Brain worms translate everything. Even mice and alien speak.
return 1
@@ -47,25 +46,19 @@
return 1
//These only pertain to common. Languages are handled by mob/say_understands()
- if (!speaking)
- if (istype(other, /mob/living/simple_animal/diona))
+ if(!speaking)
+ if(istype(other, /mob/living/simple_animal/diona))
if(other.languages.len >= 2) //They've sucked down some blood and can speak common now.
return 1
- if (istype(other, /mob/living/silicon))
+ if(issilicon(other))
return 1
- if (istype(other, /mob/living/simple_animal/bot))
+ if(isbot(other))
return 1
- if (istype(other, /mob/living/carbon/brain))
+ if(isbrain(other))
return 1
- if (istype(other, /mob/living/carbon/slime))
+ if(isslime(other))
return 1
- //This is already covered by mob/say_understands()
- //if (istype(other, /mob/living/simple_animal))
- // if((other.universal_speak && !speaking) || src.universal_speak || src.universal_understand)
- // return 1
- // return 0
-
return ..()
/mob/living/carbon/human/proc/HasVoiceChanger()
@@ -113,7 +106,7 @@
var/list/returns[3]
var/speech_problem_flag = 0
- if(silent || (sdisabilities & MUTE))
+ if(silent || (disabilities & MUTE))
message = ""
speech_problem_flag = 1
@@ -148,7 +141,7 @@
if(prob(braindam))
message = uppertext(message)
verb = "yells loudly"
-
+
if(locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs)
message = "[message] "
@@ -166,57 +159,70 @@
used_radios += I
if("headset")
- if(l_ear && istype(l_ear,/obj/item/device/radio))
- var/obj/item/device/radio/R = l_ear
- R.talk_into(src,message,null,verb,speaking)
- used_radios += l_ear
- else if(r_ear && istype(r_ear,/obj/item/device/radio))
- var/obj/item/device/radio/R = r_ear
- R.talk_into(src,message,null,verb,speaking)
- used_radios += r_ear
+ var/obj/item/device/radio/R = null
+ if(isradio(l_ear))
+ R = l_ear
+ used_radios += R
+ if(R.talk_into(src, message, null, verb, speaking))
+ return
+
+ if(isradio(r_ear))
+ R = r_ear
+ used_radios += R
+ if(R.talk_into(src, message, null, verb, speaking))
+ return
if("right ear")
var/obj/item/device/radio/R
- var/has_radio = 0
- if(r_ear && istype(r_ear,/obj/item/device/radio))
+ if(isradio(r_ear))
R = r_ear
- has_radio = 1
- if(r_hand && istype(r_hand, /obj/item/device/radio))
+ else if(isradio(r_hand))
R = r_hand
- has_radio = 1
- if(has_radio)
- R.talk_into(src,message,null,verb,speaking)
+ if(R)
used_radios += R
-
+ R.talk_into(src, message, null, verb, speaking)
if("left ear")
var/obj/item/device/radio/R
- var/has_radio = 0
- if(l_ear && istype(l_ear,/obj/item/device/radio))
+ if(isradio(l_ear))
R = l_ear
- has_radio = 1
- if(l_hand && istype(l_hand,/obj/item/device/radio))
+ else if(isradio(l_hand))
R = l_hand
- has_radio = 1
- if(has_radio)
- R.talk_into(src,message,null,verb,speaking)
+ if(R)
used_radios += R
+ R.talk_into(src, message, null, verb, speaking)
if("whisper")
whisper_say(message, speaking, alt_name)
return 1
else
if(message_mode)
- if(l_ear && istype(l_ear,/obj/item/device/radio))
- l_ear.talk_into(src,message, message_mode, verb, speaking)
+ if(isradio(l_ear))
used_radios += l_ear
- else if(r_ear && istype(r_ear,/obj/item/device/radio))
- r_ear.talk_into(src,message, message_mode, verb, speaking)
+ if(l_ear.talk_into(src, message, message_mode, verb, speaking))
+ return
+
+ if(isradio(r_ear))
used_radios += r_ear
+ if(r_ear.talk_into(src, message, message_mode, verb, speaking))
+ return
/mob/living/carbon/human/handle_speech_sound()
var/list/returns[2]
if(species.speech_sounds && prob(species.speech_chance))
returns[1] = sound(pick(species.speech_sounds))
returns[2] = 50
- return returns
\ No newline at end of file
+ return returns
+
+/mob/living/carbon/human/binarycheck()
+ . = FALSE
+ var/obj/item/device/radio/headset/R
+ if(istype(l_ear, /obj/item/device/radio/headset))
+ R = l_ear
+ if(R.translate_binary)
+ . = TRUE
+
+ if(istype(r_ear, /obj/item/device/radio/headset))
+ R = r_ear
+ if(R.translate_binary)
+ . = TRUE
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm
index 922810e758d..d5a0125f052 100644
--- a/code/modules/mob/living/carbon/human/species/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/golem.dm
@@ -66,7 +66,7 @@
item_color = "golem"
has_sensor = 0
flags = ABSTRACT | NODROP
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/golem
name = "adamantine shell"
@@ -75,7 +75,8 @@
item_state = "golem"
body_parts_covered = HEAD|UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES
- flags = ONESIZEFITSALL | ABSTRACT | NODROP | THICKMATERIAL
+ flags = ABSTRACT | NODROP | THICKMATERIAL
+ flags_size = ONESIZEFITSALL
armor = list(melee = 55, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/shoes/golem
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index 003e1969d33..bae949dd9af 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -125,8 +125,7 @@
H.equip_or_collect(new/obj/item/weapon/tank/plasma/plasmaman(H), tank_slot) // Bigger plasma tank from Raggy.
to_chat(H, "You are now running on plasma internals from the [H.s_store] in your [tank_slot_name]. You must breathe plasma in order to survive, and are extremely flammable. ")
H.internal = H.get_item_by_slot(tank_slot)
- if (H.internals)
- H.internals.icon_state = "internal1"
+ H.update_internals_hud_icon(1)
// Plasmamen are so fucking different that they need their own proc.
/datum/species/plasmaman/handle_breath(var/datum/gas_mixture/breath, var/mob/living/carbon/human/H)
diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm
index 55701b52d1c..fa7dadfebcb 100644
--- a/code/modules/mob/living/carbon/human/species/shadow.dm
+++ b/code/modules/mob/living/carbon/human/species/shadow.dm
@@ -33,5 +33,5 @@
if(light_amount > 2) //if there's enough light, start dying
H.take_overall_damage(1,1)
- else if (light_amount < 2) //heal in the dark
+ else if(light_amount < 2) //heal in the dark
H.heal_overall_damage(1,1)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index bc4851b9ec3..32203931deb 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -42,7 +42,6 @@
var/heat_level_3_breathe = 1000 // Heat damage level 3 above this point; used for breathed air temperature
var/body_temperature = 310.15 //non-IS_SYNTHETIC species will try to stabilize at this temperature. (also affects temperature processing)
- var/passive_temp_gain = 0 //IS_SYNTHETIC species will gain this much temperature every second
var/reagent_tag //Used for metabolizing reagents.
var/siemens_coeff = 1 //base electrocution coefficient
@@ -393,7 +392,7 @@
return
/datum/species/proc/remove_abilities(var/mob/living/carbon/human/H)
- for (var/proc/ability in species_abilities)
+ for(var/proc/ability in species_abilities)
H.verbs -= ability
return
@@ -607,25 +606,22 @@
/datum/species/proc/handle_hud_icons(mob/living/carbon/human/H)
if(H.healths)
- if(H.analgesic)
- H.healths.icon_state = "health_health_numb"
+ if(H.stat == DEAD)
+ H.healths.icon_state = "health7"
else
- if(H.stat == DEAD)
- H.healths.icon_state = "health7"
- else
- switch(H.hal_screwyhud)
- if(1) H.healths.icon_state = "health6"
- if(2) H.healths.icon_state = "health7"
- if(5) H.healths.icon_state = "health0"
- else
- switch(100 - ((flags & NO_PAIN) ? 0 : H.traumatic_shock) - H.staminaloss)
- if(100 to INFINITY) H.healths.icon_state = "health0"
- if(80 to 100) H.healths.icon_state = "health1"
- if(60 to 80) H.healths.icon_state = "health2"
- if(40 to 60) H.healths.icon_state = "health3"
- if(20 to 40) H.healths.icon_state = "health4"
- if(0 to 20) H.healths.icon_state = "health5"
- else H.healths.icon_state = "health6"
+ switch(H.hal_screwyhud)
+ if(1) H.healths.icon_state = "health6"
+ if(2) H.healths.icon_state = "health7"
+ if(5) H.healths.icon_state = "health0"
+ else
+ switch(100 - ((flags & NO_PAIN) ? 0 : H.traumatic_shock) - H.staminaloss)
+ if(100 to INFINITY) H.healths.icon_state = "health0"
+ if(80 to 100) H.healths.icon_state = "health1"
+ if(60 to 80) H.healths.icon_state = "health2"
+ if(40 to 60) H.healths.icon_state = "health3"
+ if(20 to 40) H.healths.icon_state = "health4"
+ if(0 to 20) H.healths.icon_state = "health5"
+ else H.healths.icon_state = "health6"
if(H.healthdoll)
H.healthdoll.overlays.Cut()
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
index 7f5daa824d5..6268652f828 100644
--- a/code/modules/mob/living/carbon/human/species/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -81,11 +81,6 @@
/datum/species/unathi/handle_death(var/mob/living/carbon/human/H)
H.stop_tail_wagging(1)
-/datum/species/unathi/equip(var/mob/living/carbon/human/H)
- if(H.mind.assigned_role != "Clown")
- H.unEquip(H.shoes)
- H.equip_or_collect(new /obj/item/clothing/shoes/sandal(H), slot_shoes)
-
/datum/species/tajaran
name = "Tajaran"
name_plural = "Tajaran"
@@ -148,11 +143,6 @@
/datum/species/tajaran/handle_death(var/mob/living/carbon/human/H)
H.stop_tail_wagging(1)
-/datum/species/tajaran/equip(var/mob/living/carbon/human/H)
- if(H.mind.assigned_role != "Clown")
- H.unEquip(H.shoes)
- H.equip_or_collect(new /obj/item/clothing/shoes/sandal(H), slot_shoes)
-
/datum/species/vulpkanin
name = "Vulpkanin"
name_plural = "Vulpkanin"
@@ -364,8 +354,7 @@
H.equip_or_collect(new /obj/item/weapon/tank/emergency_oxygen/vox(H), slot_l_hand)
to_chat(H, "You are now running on nitrogen internals from the [H.l_hand] in your hand. Your species finds oxygen toxic, so you must breathe nitrogen only. ")
H.internal = H.l_hand
- if (H.internals)
- H.internals.icon_state = "internal1"
+ H.update_internals_hud_icon(1)
/datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H)
updatespeciescolor(H)
@@ -692,7 +681,7 @@
icobase = 'icons/mob/human_races/r_grey.dmi'
deform = 'icons/mob/human_races/r_def_grey.dmi'
default_language = "Galactic Common"
- //language = "Grey" // Perhaps if they ever get a hivemind
+ language = "Psionic Communication"
unarmed_type = /datum/unarmed_attack/punch
darksight = 5 // BOOSTED from 2
eyes = "grey_eyes_s"
@@ -703,7 +692,7 @@
"lungs" = /obj/item/organ/internal/lungs,
"liver" = /obj/item/organ/internal/liver/grey,
"kidneys" = /obj/item/organ/internal/kidneys,
- "brain" = /obj/item/organ/internal/brain,
+ "brain" = /obj/item/organ/internal/brain/grey,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes,
)
@@ -728,8 +717,6 @@
C.dna.SetSEState(REMOTETALKBLOCK,0,1)
C.mutations -= REMOTE_TALK
genemutcheck(C,REMOTETALKBLOCK,null,MUTCHK_FORCED)
- C.mutations.Add(GREY)
- C.update_mutations()
..()
/datum/species/diona
@@ -805,8 +792,7 @@
"is pulling themselves apart!")
/datum/species/diona/can_understand(var/mob/other)
- var/mob/living/simple_animal/diona/D = other
- if(istype(D))
+ if(istype(other, /mob/living/simple_animal/diona))
return 1
return 0
@@ -864,17 +850,6 @@
burn_mod = 2.5 // So they take 50% extra damage from brute/burn overall.
death_message = "gives one shrill beep before falling limp, their monitor flashing blue before completely shutting off..."
- cold_level_1 = 50
- cold_level_2 = -1
- cold_level_3 = -1
-
- heat_level_1 = 500 //gives them about 25 seconds in space before taking damage
- heat_level_2 = 540
- heat_level_3 = 600
- heat_level_3_breathe = 600
-
- passive_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment.
-
flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | NO_POISON | RADIMMUNE | ALL_RPARTS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR | HAS_MARKINGS | HAS_HEAD_ACCESSORY
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 628ea630555..5620dd5f3c8 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -600,7 +600,7 @@ var/global/list/damage_icon_parts = list()
var/image/standing = image("icon_state" = "[t_color]_s")
if(FAT in mutations)
- if(w_uniform.flags&ONESIZEFITSALL)
+ if(w_uniform.flags_size & ONESIZEFITSALL)
standing.icon = 'icons/mob/uniform_fat.dmi'
else
to_chat(src, "\red You burst out of \the [w_uniform]!")
@@ -623,7 +623,12 @@ var/global/list/damage_icon_parts = list()
for(var/obj/item/clothing/accessory/A in w_uniform:accessories)
var/tie_color = A.item_color
if(!tie_color) tie_color = A.icon_state
- standing.overlays += image("icon" = 'icons/mob/ties.dmi', "icon_state" = "[tie_color]")
+ if(A.icon_override)
+ standing.overlays += image("icon" = A.icon_override, "icon_state" = "[A.icon_state]")
+ else if(A.sprite_sheets && A.sprite_sheets[species.name])
+ standing.overlays += image("icon" = A.sprite_sheets[species.name], "icon_state" = "[A.icon_state]")
+ else
+ standing.overlays += image("icon" = 'icons/mob/ties.dmi', "icon_state" = "[tie_color]")
overlays_standing[UNIFORM_LAYER] = standing
else
@@ -632,10 +637,10 @@ var/global/list/damage_icon_parts = list()
for( var/obj/item/thing in list(r_store, l_store, wear_id, wear_pda, belt) ) //
if(thing) //
unEquip(thing) //
- if (client) //
+ if(client) //
client.screen -= thing //
//
- if (thing) //
+ if(thing) //
thing.loc = loc //
thing.dropped(src) //
thing.layer = initial(thing.layer)
@@ -889,7 +894,6 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/update_inv_wear_suit(var/update_icons=1)
-
if(client && hud_used)
var/obj/screen/inventory/inv = hud_used.inv_slots[slot_wear_suit]
if(inv)
@@ -907,7 +911,7 @@ var/global/list/damage_icon_parts = list()
else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[species.name])
standing = image("icon" = wear_suit.sprite_sheets[species.name], "icon_state" = "[wear_suit.icon_state]")
else if(FAT in mutations)
- if(wear_suit.flags&ONESIZEFITSALL)
+ if(wear_suit.flags_size & ONESIZEFITSALL)
standing = image("icon" = 'icons/mob/suit_fat.dmi', "icon_state" = "[wear_suit.icon_state]")
else
to_chat(src, "\red You burst out of \the [wear_suit]!")
@@ -964,16 +968,6 @@ var/global/list/damage_icon_parts = list()
client.screen += r_store
r_store.screen_loc = ui_storage2
-/mob/living/carbon/human/update_inv_wear_pda()
- if(client && hud_used)
- var/obj/screen/inventory/inv = hud_used.inv_slots[slot_wear_pda]
- if(inv)
- inv.update_icon()
-
- if(wear_pda)
- client.screen += wear_pda
- wear_pda.screen_loc = ui_pda
-
/mob/living/carbon/human/update_inv_wear_mask(var/update_icons = 1)
..()
if(client && hud_used)
@@ -1257,13 +1251,29 @@ var/global/list/damage_icon_parts = list()
//Adds a collar overlay above the helmet layer if the suit has one
// Suit needs an identically named sprite in icons/mob/collar.dmi
+// For suits with species_fit and sprite_sheets, an identically named sprite needs to exist in a file like this icons/mob/species/[species_name_here]/collar.dmi.
/mob/living/carbon/human/proc/update_collar(var/update_icons=1)
var/icon/C = new('icons/mob/collar.dmi')
var/image/standing = null
if(wear_suit)
- if(wear_suit.icon_state in C.IconStates())
- standing = image("icon" = C, "icon_state" = "[wear_suit.icon_state]")
+ if(wear_suit.icon_override)
+ var/icon_path = "[wear_suit.icon_override]"
+ icon_path = "[copytext(icon_path, 1, findtext(icon_path, "/suit.dmi"))]/collar.dmi" //If this file doesn't exist, the end result is that COLLAR_LAYER will be unchanged (empty).
+ var/icon/icon_file
+ if(fexists(icon_path)) //Just ensuring the nonexistance of a file with the above path won't cause a runtime.
+ icon_file = new(icon_path)
+ standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
+ else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[species.name])
+ var/icon_path = "[wear_suit.sprite_sheets[species.name]]"
+ icon_path = "[copytext(icon_path, 1, findtext(icon_path, "/suit.dmi"))]/collar.dmi" //If this file doesn't exist, the end result is that COLLAR_LAYER will be unchanged (empty).
+ var/icon/icon_file
+ if(fexists(icon_path)) //Just ensuring the nonexistance of a file with the above path won't cause a runtime.
+ icon_file = new(icon_path)
+ standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
+ else
+ if(wear_suit.icon_state in C.IconStates())
+ standing = image("icon" = C, "icon_state" = "[wear_suit.icon_state]")
overlays_standing[COLLAR_LAYER] = standing
@@ -1274,7 +1284,7 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/generate_head_icon()
//gender no longer matters for the mouth, although there should probably be seperate base head icons.
// var/g = "m"
-// if (gender == FEMALE) g = "f"
+// if(gender == FEMALE) g = "f"
var/obj/item/organ/external/head/H = get_organ("head")
//base icons
var/icon/face_lying = new /icon('icons/mob/human_face.dmi',"bald_l")
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index eb328291bf7..73f4b5a1c28 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -181,19 +181,17 @@
/mob/living/carbon/proc/get_breath_from_internal(volume_needed)
if(internal)
- if(!contents.Find(internal))
+ if(internal.loc != src)
internal = null
if(!wear_mask || !(wear_mask.flags & AIRTIGHT)) //not wearing mask or non-breath mask
if(!head || !(head.flags & AIRTIGHT)) //not wearing helmet or non-breath helmet
internal = null //turn off internals
if(internal)
- if(internals)
- internals.icon_state = "internal1"
+ update_internals_hud_icon(1)
return internal.remove_air_volume(volume_needed)
else
- if(internals)
- internals.icon_state = "internal0"
+ update_internals_hud_icon(0)
return
@@ -440,18 +438,12 @@
see_invisible = see_override
-/mob/living/carbon/handle_actions()
- ..()
- for(var/obj/item/I in internal_organs)
- give_action_button(I, 1)
-
-
/mob/living/carbon/handle_hud_icons()
return
/mob/living/carbon/handle_hud_icons_health()
if(healths)
- if (stat != DEAD)
+ if(stat != DEAD)
switch(health)
if(100 to INFINITY)
healths.icon_state = "health0"
diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm
index 43195db4f11..0a86f2756cf 100644
--- a/code/modules/mob/living/carbon/shock.dm
+++ b/code/modules/mob/living/carbon/shock.dm
@@ -16,14 +16,12 @@
src.traumatic_shock -= R.shock_reduction // now you too can varedit cyanide to reduce shock by 1000 - Iamgoofball
if(src.slurring)
src.traumatic_shock -= 10
- if(src.analgesic)
- src.traumatic_shock = 0
// broken or ripped off organs will add quite a bit of pain
if(istype(src,/mob/living/carbon/human))
var/mob/living/carbon/human/M = src
for(var/obj/item/organ/external/organ in M.organs)
- if (!organ)
+ if(!organ)
continue
else if(organ.status & ORGAN_BROKEN || organ.open)
src.traumatic_shock += 15
diff --git a/code/modules/mob/living/carbon/slime/emote.dm b/code/modules/mob/living/carbon/slime/emote.dm
new file mode 100644
index 00000000000..c77d5e24a65
--- /dev/null
+++ b/code/modules/mob/living/carbon/slime/emote.dm
@@ -0,0 +1,75 @@
+/mob/living/carbon/slime/emote(var/act, var/m_type=1, var/message = null)
+ if(findtext(act, "-", 1, null))
+ var/t1 = findtext(act, "-", 1, null)
+ //param = copytext(act, t1 + 1, length(act) + 1)
+ act = copytext(act, 1, t1)
+
+ if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
+ act = copytext(act,1,length(act))
+
+ act = lowertext(act)
+ switch(act) //Alphabetical please
+ if("me")
+ if(silent)
+ return
+ if(src.client)
+ if(client.prefs.muted & MUTE_IC)
+ to_chat(src, "\red You cannot send IC messages (muted).")
+ return
+ if(src.client.handle_spam_prevention(message,MUTE_IC))
+ return
+ if(stat)
+ return
+ if(!(message))
+ return
+ return custom_emote(m_type, message)
+ if("bounce")
+ message = "The [src.name] bounces in place."
+ m_type = 1
+
+ if("custom")
+ return custom_emote(m_type, message)
+
+ if("jiggle")
+ message = "The [src.name] jiggles!"
+ m_type = 1
+
+ if("light")
+ message = "The [src.name] lights up for a bit, then stops."
+ m_type = 1
+
+ if("moan")
+ message = "The [src.name] moans."
+ m_type = 2
+
+ if("shiver")
+ message = "The [src.name] shivers."
+ m_type = 2
+
+ if("sway")
+ message = "The [src.name] sways around dizzily."
+ m_type = 1
+
+ if("twitch")
+ message = "The [src.name] twitches."
+ m_type = 1
+
+ if("vibrate")
+ message = "The [src.name] vibrates!"
+ m_type = 1
+
+ if("help") //This is an exception
+ to_chat(src, "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, custom, jiggle, light, moan, shiver, sway, twitch, vibrate")
+
+ else
+ to_chat(src, "\blue Unusable emote '[act]'. Say *help for a list.")
+ if((message && src.stat == 0))
+ if(m_type & 1)
+ for(var/mob/O in viewers(src, null))
+ O.show_message(message, m_type)
+ //Foreach goto(703)
+ else
+ for(var/mob/O in hearers(src, null))
+ O.show_message(message, m_type)
+ //Foreach goto(746)
+ return
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/slime/examine.dm b/code/modules/mob/living/carbon/slime/examine.dm
index 7d2e2d5e62c..4dd67695e2a 100644
--- a/code/modules/mob/living/carbon/slime/examine.dm
+++ b/code/modules/mob/living/carbon/slime/examine.dm
@@ -1,12 +1,13 @@
/mob/living/carbon/slime/examine(mob/user)
+ to_chat(user, "*---------* ")
..(user)
- var/msg = ""
- if (src.stat == DEAD)
+ var/msg = ""
+ if(src.stat == DEAD)
msg += "It is limp and unresponsive. \n"
else
- if (src.getBruteLoss())
+ if(src.getBruteLoss())
msg += ""
- if (src.getBruteLoss() < 40)
+ if(src.getBruteLoss() < 40)
msg += "It has some punctures in its flesh!"
else
msg += "It has severe punctures and tears in its flesh! "
diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm
index 6dce9aba656..b51e0084ee3 100644
--- a/code/modules/mob/living/carbon/slime/life.dm
+++ b/code/modules/mob/living/carbon/slime/life.dm
@@ -9,7 +9,7 @@
if(..())
handle_nutrition()
handle_targets()
- if (!ckey)
+ if(!ckey)
handle_speech_and_mood()
/mob/living/carbon/slime/proc/AIprocess() // the master AI process
@@ -17,9 +17,9 @@
if(AIproc || stat == DEAD || client) return
var/hungry = 0
- if (nutrition < get_starve_nutrition())
+ if(nutrition < get_starve_nutrition())
hungry = 2
- else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition())
+ else if(nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition())
hungry = 1
AIproc = 1
@@ -183,19 +183,19 @@
adjustCloneLoss(-1)
adjustBruteLoss(-1)
- if (src.stat == DEAD)
+ if(src.stat == DEAD)
src.lying = 1
src.blinded = 1
else
- if (src.paralysis || src.stunned || src.weakened || (status_flags && FAKEDEATH)) //Stunned etc.
- if (src.stunned > 0)
+ if(src.paralysis || src.stunned || src.weakened || (status_flags && FAKEDEATH)) //Stunned etc.
+ if(src.stunned > 0)
AdjustStunned(-1)
src.stat = 0
- if (src.weakened > 0)
+ if(src.weakened > 0)
AdjustWeakened(-1)
src.lying = 0
src.stat = 0
- if (src.paralysis > 0)
+ if(src.paralysis > 0)
AdjustParalysis(-1)
src.blinded = 0
src.lying = 0
@@ -205,34 +205,34 @@
src.lying = 0
src.stat = 0
- if (src.stuttering) src.stuttering = 0
+ if(src.stuttering) src.stuttering = 0
- if (src.eye_blind)
+ if(src.eye_blind)
src.eye_blind = 0
src.blinded = 1
- if (src.ear_deaf > 0) src.ear_deaf = 0
- if (src.ear_damage < 25)
+ if(src.ear_deaf > 0) src.ear_deaf = 0
+ if(src.ear_damage < 25)
src.ear_damage = 0
src.density = !( src.lying )
- if (src.sdisabilities & BLIND)
+ if(src.disabilities & BLIND)
src.blinded = 1
- if (src.sdisabilities & DEAF)
+ if(src.disabilities & DEAF)
src.ear_deaf = 1
- if (src.eye_blurry > 0)
+ if(src.eye_blurry > 0)
src.eye_blurry = 0
- if (src.druggy > 0)
+ if(src.druggy > 0)
src.druggy = 0
return 1
/mob/living/carbon/slime/proc/handle_nutrition()
- if (prob(15))
+ if(prob(15))
nutrition -= 1 + is_adult
if(nutrition <= 0)
@@ -240,9 +240,10 @@
if(prob(75))
adjustToxLoss(rand(0,5))
- else if (nutrition >= get_grow_nutrition() && amount_grown < 10)
+ else if(nutrition >= get_grow_nutrition() && amount_grown < 10)
nutrition -= 20
amount_grown++
+ update_action_buttons_icon()
if(amount_grown >= 10 && !Victim && !Target && !ckey)
if(is_adult)
@@ -278,7 +279,7 @@
if(Target)
--target_patience
- if (target_patience <= 0 || SStun || Discipline || attacked) // Tired of chasing or something draws out attention
+ if(target_patience <= 0 || SStun || Discipline || attacked) // Tired of chasing or something draws out attention
target_patience = 0
Target = null
@@ -286,9 +287,9 @@
var/hungry = 0 // determines if the slime is hungry
- if (nutrition < get_starve_nutrition())
+ if(nutrition < get_starve_nutrition())
hungry = 2
- else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition())
+ else if(nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition())
hungry = 1
if(hungry == 2 && !client) // if a slime is starving, it starts losing its friends
@@ -340,26 +341,26 @@
Target = C
break
- if (Target)
+ if(Target)
target_patience = rand(5,7)
- if (is_adult)
+ if(is_adult)
target_patience += 3
if(!Target) // If we have no target, we are wandering or following orders
- if (Leader)
- if (holding_still)
+ if(Leader)
+ if(holding_still)
holding_still = max(holding_still - 1, 0)
else if(canmove && isturf(loc))
step_to(src, Leader)
else if(hungry)
- if (holding_still)
+ if(holding_still)
holding_still = max(holding_still - hungry, 0)
else if(canmove && isturf(loc) && prob(50))
step(src, pick(cardinal))
else
- if (holding_still)
+ if(holding_still)
holding_still = max(holding_still - 1, 0)
else if(canmove && isturf(loc) && prob(33))
step(src, pick(cardinal))
@@ -370,85 +371,85 @@
/mob/living/carbon/slime/proc/handle_speech_and_mood()
//Mood starts here
var/newmood = ""
- if (rabid || attacked) newmood = "angry"
- else if (Target) newmood = "mischevous"
+ if(rabid || attacked) newmood = "angry"
+ else if(Target) newmood = "mischevous"
- if (!newmood)
- if (Discipline && prob(25))
+ if(!newmood)
+ if(Discipline && prob(25))
newmood = "pout"
- else if (prob(1))
+ else if(prob(1))
newmood = pick("sad", ":3", "pout")
- if ((mood == "sad" || mood == ":3" || mood == "pout") && !newmood)
- if (prob(75)) newmood = mood
+ if((mood == "sad" || mood == ":3" || mood == "pout") && !newmood)
+ if(prob(75)) newmood = mood
- if (newmood != mood) // This is so we don't redraw them every time
+ if(newmood != mood) // This is so we don't redraw them every time
mood = newmood
regenerate_icons()
//Speech understanding starts here
var/to_say
- if (speech_buffer.len > 0)
+ if(speech_buffer.len > 0)
var/who = speech_buffer[1] // Who said it?
var/phrase = speech_buffer[2] // What did they say?
- if ((findtext(phrase, num2text(number)) || findtext(phrase, "slimes"))) // Talking to us
- if (findtext(phrase, "hello") || findtext(phrase, "hi"))
+ if((findtext(phrase, num2text(number)) || findtext(phrase, "slimes"))) // Talking to us
+ if(findtext(phrase, "hello") || findtext(phrase, "hi"))
to_say = pick("Hello...", "Hi...")
- else if (findtext(phrase, "follow"))
- if (Leader)
- if (Leader == who) // Already following him
+ else if(findtext(phrase, "follow"))
+ if(Leader)
+ if(Leader == who) // Already following him
to_say = pick("Yes...", "Lead...", "Following...")
- else if (Friends[who] > Friends[Leader]) // VIVA
+ else if(Friends[who] > Friends[Leader]) // VIVA
Leader = who
to_say = "Yes... I follow [who]..."
else
to_say = "No... I follow [Leader]..."
else
- if (Friends[who] > 2)
+ if(Friends[who] > 2)
Leader = who
to_say = "I follow..."
else // Not friendly enough
to_say = pick("No...", "I won't follow...")
- else if (findtext(phrase, "stop"))
- if (Victim) // We are asked to stop feeding
- if (Friends[who] > 4)
+ else if(findtext(phrase, "stop"))
+ if(Victim) // We are asked to stop feeding
+ if(Friends[who] > 4)
Victim = null
Target = null
- if (Friends[who] < 7)
+ if(Friends[who] < 7)
--Friends[who]
to_say = "Grrr..." // I'm angry but I do it
else
to_say = "Fine..."
- else if (Target) // We are asked to stop chasing
- if (Friends[who] > 3)
+ else if(Target) // We are asked to stop chasing
+ if(Friends[who] > 3)
Target = null
- if (Friends[who] < 6)
+ if(Friends[who] < 6)
--Friends[who]
to_say = "Grrr..." // I'm angry but I do it
else
to_say = "Fine..."
- else if (Leader) // We are asked to stop following
- if (Leader == who)
+ else if(Leader) // We are asked to stop following
+ if(Leader == who)
to_say = "Yes... I'll stay..."
Leader = null
else
- if (Friends[who] > Friends[Leader])
+ if(Friends[who] > Friends[Leader])
Leader = null
to_say = "Yes... I'll stop..."
else
to_say = "No... I'll keep following..."
- else if (findtext(phrase, "stay"))
- if (Leader)
- if (Leader == who)
+ else if(findtext(phrase, "stay"))
+ if(Leader)
+ if(Leader == who)
holding_still = Friends[who] * 10
to_say = "Yes... Staying..."
- else if (Friends[who] > Friends[Leader])
+ else if(Friends[who] > Friends[Leader])
holding_still = (Friends[who] - Friends[Leader]) * 10
to_say = "Yes... Staying..."
else
to_say = "No... I'll keep following..."
else
- if (Friends[who] > 2)
+ if(Friends[who] > 2)
holding_still = Friends[who] * 10
to_say = "Yes... Staying..."
else
@@ -456,7 +457,7 @@
speech_buffer = list()
//Speech starts here
- if (to_say)
+ if(to_say)
say (to_say)
else if(prob(1))
emote(pick("bounce","sway","light","vibrate","jiggle"))
@@ -465,83 +466,83 @@
var/slimes_near = -1 // Don't count myself
var/dead_slimes = 0
var/friends_near = list()
- for (var/mob/living/carbon/M in view(7,src))
- if (isslime(M))
+ for(var/mob/living/carbon/M in view(7,src))
+ if(isslime(M))
++slimes_near
- if (M.stat == DEAD)
+ if(M.stat == DEAD)
++dead_slimes
- if (M in Friends)
+ if(M in Friends)
t += 20
friends_near += M
- if (nutrition < get_hunger_nutrition()) t += 10
- if (nutrition < get_starve_nutrition()) t += 10
- if (prob(2) && prob(t))
+ if(nutrition < get_hunger_nutrition()) t += 10
+ if(nutrition < get_starve_nutrition()) t += 10
+ if(prob(2) && prob(t))
var/phrases = list()
- if (Target) phrases += "[Target]... looks tasty..."
- if (nutrition < get_starve_nutrition())
+ if(Target) phrases += "[Target]... looks tasty..."
+ if(nutrition < get_starve_nutrition())
phrases += "So... hungry..."
phrases += "Very... hungry..."
phrases += "Need... food..."
phrases += "Must... eat..."
- else if (nutrition < get_hunger_nutrition())
+ else if(nutrition < get_hunger_nutrition())
phrases += "Hungry..."
phrases += "Where is the food?"
phrases += "I want to eat..."
phrases += "Rawr..."
phrases += "Blop..."
phrases += "Blorble..."
- if (rabid || attacked)
+ if(rabid || attacked)
phrases += "Hrr..."
phrases += "Nhuu..."
phrases += "Unn..."
- if (mood == ":3")
+ if(mood == ":3")
phrases += "Purr..."
- if (attacked)
+ if(attacked)
phrases += "Grrr..."
- if (getToxLoss() > 30)
+ if(getToxLoss() > 30)
phrases += "Cold..."
- if (getToxLoss() > 60)
+ if(getToxLoss() > 60)
phrases += "So... cold..."
phrases += "Very... cold..."
- if (getToxLoss() > 90)
+ if(getToxLoss() > 90)
phrases += "..."
phrases += "C... c..."
- if (Victim)
+ if(Victim)
phrases += "Nom..."
phrases += "Tasty..."
- if (powerlevel > 3) phrases += "Bzzz..."
- if (powerlevel > 5) phrases += "Zap..."
- if (powerlevel > 8) phrases += "Zap... Bzz..."
- if (mood == "sad") phrases += "Bored..."
- if (slimes_near) phrases += "Brother..."
- if (slimes_near > 1) phrases += "Brothers..."
- if (dead_slimes) phrases += "What happened?"
- if (!slimes_near)
+ if(powerlevel > 3) phrases += "Bzzz..."
+ if(powerlevel > 5) phrases += "Zap..."
+ if(powerlevel > 8) phrases += "Zap... Bzz..."
+ if(mood == "sad") phrases += "Bored..."
+ if(slimes_near) phrases += "Brother..."
+ if(slimes_near > 1) phrases += "Brothers..."
+ if(dead_slimes) phrases += "What happened?"
+ if(!slimes_near)
phrases += "Lonely..."
- for (var/M in friends_near)
+ for(var/M in friends_near)
phrases += "[M]... friend..."
- if (nutrition < get_hunger_nutrition())
+ if(nutrition < get_hunger_nutrition())
phrases += "[M]... feed me..."
say (pick(phrases))
/mob/living/carbon/slime/proc/get_max_nutrition() // Can't go above it
- if (is_adult) return 1200
+ if(is_adult) return 1200
else return 1000
/mob/living/carbon/slime/proc/get_grow_nutrition() // Above it we grow, below it we can eat
- if (is_adult) return 1000
+ if(is_adult) return 1000
else return 800
/mob/living/carbon/slime/proc/get_hunger_nutrition() // Below it we will always eat
- if (is_adult) return 600
+ if(is_adult) return 600
else return 500
/mob/living/carbon/slime/proc/get_starve_nutrition() // Below it we will eat before everything else
- if (is_adult) return 300
+ if(is_adult) return 300
else return 200
/mob/living/carbon/slime/proc/will_hunt(var/hunger = -1) // Check for being stopped from feeding and chasing
- if (hunger == 2 || rabid || attacked) return 1
- if (Leader) return 0
- if (holding_still) return 0
+ if(hunger == 2 || rabid || attacked) return 1
+ if(Leader) return 0
+ if(holding_still) return 0
return 1
diff --git a/code/modules/mob/living/carbon/slime/say.dm b/code/modules/mob/living/carbon/slime/say.dm
index 50311ace49e..6d47231792b 100644
--- a/code/modules/mob/living/carbon/slime/say.dm
+++ b/code/modules/mob/living/carbon/slime/say.dm
@@ -2,27 +2,27 @@
var/verb = "telepathically chirps"
var/ending = copytext(text, length(text))
- if (ending == "?")
+ if(ending == "?")
verb = "telepathically asks"
- else if (ending == "!")
+ else if(ending == "!")
verb = "telepathically cries"
return verb
/mob/living/carbon/slime/say_understands(var/other)
- if (istype(other, /mob/living/carbon/slime))
+ if(istype(other, /mob/living/carbon/slime))
return 1
return ..()
/mob/living/carbon/slime/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
- if (speaker in Friends)
+ if(speaker in Friends)
speech_buffer = list()
speech_buffer.Add(speaker)
speech_buffer.Add(lowertext(html_decode(message)))
..()
/mob/living/carbon/slime/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="", var/atom/follow_target)
- if (speaker in Friends)
+ if(speaker in Friends)
speech_buffer = list()
speech_buffer.Add(speaker)
speech_buffer.Add(lowertext(html_decode(message)))
diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm
index 9ed50676e75..634e9865e45 100644
--- a/code/modules/mob/living/carbon/slime/slime.dm
+++ b/code/modules/mob/living/carbon/slime/slime.dm
@@ -75,12 +75,12 @@
/mob/living/carbon/slime/regenerate_icons()
icon_state = "[colour] [is_adult ? "adult" : "baby"] slime"
overlays.len = 0
- if (mood)
+ if(mood)
overlays += image('icons/mob/slimes.dmi', icon_state = "aslime-[mood]")
..()
/mob/living/carbon/slime/movement_delay()
- if (bodytemperature >= 330.23) // 135 F
+ if(bodytemperature >= 330.23) // 135 F
return -1 // slimes become supercharged at high temperatures
var/tally = 0
@@ -88,7 +88,7 @@
var/health_deficiency = (100 - health)
if(health_deficiency >= 45) tally += (health_deficiency / 25)
- if (bodytemperature < 183.222)
+ if(bodytemperature < 183.222)
tally += (283.222 - bodytemperature) / 10 * 1.75
if(reagents)
@@ -104,7 +104,7 @@
return tally + config.slime_delay
/mob/living/carbon/slime/Bump(atom/movable/AM as mob|obj, yes)
- if ((!(yes) || now_pushing))
+ if((!(yes) || now_pushing))
return
now_pushing = 1
@@ -121,7 +121,7 @@
if(prob(probab))
if(istype(AM, /obj/structure/window) || istype(AM, /obj/structure/grille))
if(nutrition <= get_hunger_nutrition() && !Atkcool)
- if (is_adult || prob(5))
+ if(is_adult || prob(5))
AM.attack_slime(src)
spawn()
Atkcool = 1
@@ -143,13 +143,13 @@
now_pushing = 0
..()
- if (!istype(AM, /atom/movable))
+ if(!istype(AM, /atom/movable))
return
- if (!( now_pushing ))
+ if(!( now_pushing ))
now_pushing = 1
- if (!( AM.anchored ))
+ if(!( AM.anchored ))
var/t = get_dir(src, AM)
- if (istype(AM, /obj/structure/window))
+ if(istype(AM, /obj/structure/window))
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
for(var/obj/structure/window/win in get_step(AM,t))
now_pushing = 0
@@ -169,7 +169,7 @@
else
stat(null, "Health: [round((health / 150) * 100)]%")
- if (client.statpanel == "Status")
+ if(client.statpanel == "Status")
stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]")
if(amount_grown >= 10)
if(is_adult)
@@ -197,12 +197,12 @@
var/b_loss = null
var/f_loss = null
- switch (severity)
- if (1.0)
+ switch(severity)
+ if(1.0)
qdel(src)
return
- if (2.0)
+ if(2.0)
b_loss += 60
f_loss += 60
@@ -231,13 +231,13 @@
return
/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob)
- if (!ticker)
+ if(!ticker)
to_chat(M, "You cannot attack people before the game has started.")
return
- if (Victim) return // can't attack while eating!
+ if(Victim) return // can't attack while eating!
- if (health > -100)
+ if(health > -100)
M.do_attack_animation(src)
visible_message(" The [M.name] has glomped [src]! ", \
@@ -292,11 +292,11 @@
adjustBruteLoss(damage)
/mob/living/carbon/slime/attack_hand(mob/living/carbon/human/M as mob)
- if (!ticker)
+ if(!ticker)
to_chat(M, "You cannot attack people before the game has started.")
return
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
+ if(istype(loc, /turf) && istype(loc.loc, /area/start))
to_chat(M, "No attacking people at spawn, you jackass.")
return
@@ -377,10 +377,10 @@
switch(M.a_intent)
- if (I_HELP)
+ if(I_HELP)
help_shake_act(M)
- if (I_GRAB)
+ if(I_GRAB)
grabbedby(M)
else
@@ -388,8 +388,8 @@
var/damage = rand(1, 9)
attacked += 10
- if (prob(90))
- if (HULK in M.mutations)
+ if(prob(90))
+ if(HULK in M.mutations)
damage += 15
if(Victim || Target)
Victim = null
@@ -418,25 +418,25 @@
/mob/living/carbon/slime/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
- if (!ticker)
+ if(!ticker)
to_chat(M, "You cannot attack people before the game has started.")
return
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
+ if(istype(loc, /turf) && istype(loc.loc, /area/start))
to_chat(M, "No attacking people at spawn, you jackass.")
return
switch(M.a_intent)
- if (I_HELP)
+ if(I_HELP)
visible_message("[M] caresses [src] with its scythe like arm. ")
- if (I_HARM)
+ if(I_HARM)
M.do_attack_animation(src)
- if (prob(95))
+ if(prob(95))
attacked += 10
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
var/damage = rand(15, 30)
- if (damage >= 25)
+ if(damage >= 25)
damage = rand(20, 40)
visible_message("[M] has attacked [name]! ", \
"[M] has attacked [name]! ")
@@ -450,10 +450,10 @@
visible_message("[M] has attempted to lunge at [name]! ", \
"[M] has attempted to lunge at [name]! ")
- if (I_GRAB)
+ if(I_GRAB)
grabbedby(M)
- if (I_DISARM)
+ if(I_DISARM)
M.do_attack_animation(src)
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
var/damage = 5
@@ -499,7 +499,7 @@
if(S.next_step(user, src))
return 1
if(istype(W,/obj/item/stack/sheet/mineral/plasma)) //Lets you feed slimes plasma.
- if (user in Friends)
+ if(user in Friends)
++Friends[user]
else
Friends[user] = 1
@@ -580,8 +580,8 @@ mob/living/carbon/slime/var/temperature_resistance = T0C+75
/mob/living/carbon/slime/proc/apply_water()
adjustToxLoss(rand(15,20))
- if (!client)
- if (Target) // Like cats
+ if(!client)
+ if(Target) // Like cats
Target = null
++Discipline
return
diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm
index 1ad57bd787d..23233fd5e09 100644
--- a/code/modules/mob/living/carbon/superheroes.dm
+++ b/code/modules/mob/living/carbon/superheroes.dm
@@ -33,8 +33,9 @@
if(default_spells.len)
for(var/spell in default_spells)
var/obj/effect/proc_holder/spell/S = spell
- if(!S) return
- H.AddSpell(new S)
+ if(!S)
+ return
+ H.mind.AddSpell(new S(null))
/datum/superheroes/proc/assign_id(var/mob/living/carbon/human/H)
var/obj/item/weapon/card/id/syndicate/W = new(H)
@@ -191,14 +192,14 @@
if(isloyal(target))
to_chat(usr, "They are enslaved by Nanotrasen. You feel their interest in your cause wane and disappear. ")
usr.visible_message("[usr] stops talking for a moment, then moves back away from [target]. ")
- to_chat(target, "Your loyalty implant activates and a sharp pain reminds you of your loyalties to Nanotrasen. ")
+ to_chat(target, "Your mindshield implant activates, protecting you from conversion. ")
return
if(3)
to_chat(usr, "You begin filling out the application form with [target]. ")
usr.visible_message("[usr] pulls out a pen and paper and begins filling an application form with [target]. ")
to_chat(target, "You are being convinced by [usr] to fill out an application form to become a henchman. ")//Ow the edge
- if(!do_mob(usr, target, 100)) //around 30 seconds total for enthralling, 45 for someone with a loyalty implant
+ if(!do_mob(usr, target, 100)) //around 30 seconds total for enthralling, 45 for someone with a mindshield implant
to_chat(usr, "The enrollment process has been interrupted - you have lost the attention of [target]. ")
to_chat(target, "You move away and are no longer under the charm of [usr]. The application form is null and void. ")
recruiting = 0
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index 14585f6ae21..e17d9af6250 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -2,4 +2,5 @@
blinded = max(blinded, 1)
clear_fullscreens()
+ update_action_buttons_icon()
..(gibbed)
\ No newline at end of file
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index 82f865621da..a151a062bce 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -49,9 +49,7 @@
handle_disabilities() // eye, ear, brain damages
handle_status_effects() //all special effects, stunned, weakened, jitteryness, hallucination, sleeping, etc
- handle_actions()
-
- update_canmove()
+ update_canmove(1) // set to 1 to not update icon action buttons; rip this argument out if Life is ever refactored to be non-stupid. -Fox
if(client)
//regular_hud_updates() //THIS DOESN'T FUCKING UPDATE SHIT
@@ -95,7 +93,7 @@
if(paralysis)
stat = UNCONSCIOUS
- else if (status_flags & FAKEDEATH)
+ else if(status_flags & FAKEDEATH)
stat = UNCONSCIOUS
else
@@ -176,7 +174,7 @@
/mob/living/proc/handle_disabilities()
//Eyes
- if(sdisabilities & BLIND || stat) //blindness from disability or unconsciousness doesn't get better on its own
+ if(disabilities & BLIND || stat) //blindness from disability or unconsciousness doesn't get better on its own
eye_blind = max(eye_blind, 1)
else if(eye_blind) //blindness, heals slowly over time
eye_blind = max(eye_blind-1,0)
@@ -197,7 +195,6 @@
handle_vision()
handle_hud_icons()
- update_action_buttons()
return 1
@@ -247,84 +244,6 @@
/mob/living/proc/handle_hud_icons_health()
return
-/mob/living/proc/handle_actions()
- //Pretty bad, i'd use picked/dropped instead but the parent calls in these are nonexistent
- for(var/datum/action/A in actions)
- if(A.CheckRemoval(src))
- A.Remove(src)
- for(var/obj/item/I in src)
- give_action_button(I, 1)
- return
-
-/mob/living/proc/give_action_button(var/obj/item/I, recursive = 0)
- if(I.action_button_name)
- if(!I.action)
- if(I.action_button_custom_type)
- I.action = new I.action_button_custom_type
- else
- I.action = new /datum/action/item_action
- I.action.name = I.action_button_name
- I.action.target = I
- I.action.Grant(src)
-
- if(recursive)
- for(var/obj/item/T in I)
- give_action_button(T, recursive - 1)
-
-/mob/living/update_action_buttons()
- if(!hud_used) return
- if(!client) return
-
- if(!hud_used.hud_shown)
- return
-
- client.screen -= hud_used.hide_actions_toggle
- for(var/datum/action/A in actions)
- if(A.button)
- client.screen -= A.button
-
- if(hud_used.action_buttons_hidden)
- if(!hud_used.hide_actions_toggle)
- hud_used.hide_actions_toggle = new(hud_used)
- hud_used.hide_actions_toggle.UpdateIcon()
-
- if(!hud_used.hide_actions_toggle.moved)
- hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(1)
- //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,1)
-
- client.screen += hud_used.hide_actions_toggle
- return
-
- var/button_number = 0
- for(var/datum/action/A in actions)
- button_number++
- if(A.button == null)
- var/obj/screen/movable/action_button/N = new(hud_used)
- N.owner = A
- A.button = N
-
- var/obj/screen/movable/action_button/B = A.button
-
- B.UpdateIcon()
-
- B.name = A.UpdateName()
-
- client.screen += B
-
- if(!B.moved)
- B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number)
- //hud_used.SetButtonCoords(B,button_number)
-
- if(button_number > 0)
- if(!hud_used.hide_actions_toggle)
- hud_used.hide_actions_toggle = new(hud_used)
- hud_used.hide_actions_toggle.InitialiseIcon(src)
- if(!hud_used.hide_actions_toggle.moved)
- hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1)
- //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,button_number+1)
- client.screen += hud_used.hide_actions_toggle
-
-
/mob/living/proc/process_nations()
if(client)
var/client/C = client
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 7185cfdb53b..7d07216c586 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -3,6 +3,9 @@
..()
return QDEL_HINT_HARDDEL_NOW
+/mob/living/proc/OpenCraftingMenu()
+ return
+
/mob/living/Stat()
. = ..()
if(. && get_rig_stats)
@@ -55,7 +58,7 @@
/mob/living/verb/succumb()
set hidden = 1
- if (InCritical())
+ if(InCritical())
attack_log += "[src] has ["succumbed to death"] with [round(health, 0.1)] points of health!"
adjustOxyLoss(health - config.health_threshold_dead)
updatehealth()
@@ -271,7 +274,7 @@
/mob/living/proc/get_organ_target()
var/mob/shooter = src
var/t = shooter:zone_sel.selecting
- if ((t in list( "eyes", "mouth" )))
+ if((t in list( "eyes", "mouth" )))
t = "head"
var/obj/item/organ/external/def_zone = ran_zone(t)
return def_zone
@@ -323,12 +326,12 @@
if(iscarbon(src))
var/mob/living/carbon/C = src
- if (C.handcuffed && !initial(C.handcuffed))
+ if(C.handcuffed && !initial(C.handcuffed))
C.unEquip(C.handcuffed)
C.handcuffed = initial(C.handcuffed)
C.update_handcuffed()
- if (C.legcuffed && !initial(C.legcuffed))
+ if(C.legcuffed && !initial(C.legcuffed))
C.unEquip(C.legcuffed)
C.legcuffed = initial(C.legcuffed)
C.update_inv_legcuffed()
@@ -343,7 +346,7 @@
dead_mob_list -= src
living_mob_list |= src
mob_list |= src
- ear_deaf = 0
+ setEarDamage(-1,0)
timeofdeath = 0
/mob/living/proc/rejuvenate()
@@ -370,13 +373,11 @@
hallucination = 0
nutrition = 400
bodytemperature = 310
- sdisabilities = 0
disabilities = 0
blinded = 0
eye_blind = 0
eye_blurry = 0
- ear_deaf = 0
- ear_damage = 0
+ setEarDamage(0,0)
heal_overall_damage(1000, 1000)
ExtinguishMob()
fire_stacks = 0
@@ -440,26 +441,26 @@
return
/mob/living/Move(atom/newloc, direct)
- if (buckled && buckled.loc != newloc) //not updating position
- if (!buckled.anchored)
+ if(buckled && buckled.loc != newloc) //not updating position
+ if(!buckled.anchored)
return buckled.Move(newloc, direct)
else
return 0
- if (restrained())
+ if(restrained())
stop_pulling()
var/t7 = 1
- if (restrained())
+ if(restrained())
for(var/mob/living/M in range(src, 1))
- if ((M.pulling == src && M.stat == 0 && !( M.restrained() )))
+ if((M.pulling == src && M.stat == 0 && !( M.restrained() )))
t7 = null
if(t7 && pulling && (get_dist(src, pulling) <= 1 || pulling.loc == loc))
var/turf/T = loc
. = ..()
- if (pulling && pulling.loc)
+ if(pulling && pulling.loc)
if(!( isturf(pulling.loc) ))
stop_pulling()
return
@@ -473,46 +474,46 @@
stop_pulling()
return
- if (!restrained())
+ if(!restrained())
var/diag = get_dir(src, pulling)
- if ((diag - 1) & diag)
+ if((diag - 1) & diag)
else
diag = null
- if ((get_dist(src, pulling) > 1 || diag))
- if (isliving(pulling))
+ if((get_dist(src, pulling) > 1 || diag))
+ if(isliving(pulling))
var/mob/living/M = pulling
var/ok = 1
- if (locate(/obj/item/weapon/grab, M.grabbed_by))
- if (prob(75))
+ if(locate(/obj/item/weapon/grab, M.grabbed_by))
+ if(prob(75))
var/obj/item/weapon/grab/G = pick(M.grabbed_by)
- if (istype(G, /obj/item/weapon/grab))
+ if(istype(G, /obj/item/weapon/grab))
for(var/mob/O in viewers(M, null))
O.show_message(text("\red [] has been pulled from []'s grip by []", G.affecting, G.assailant, src), 1)
//G = null
qdel(G)
else
ok = 0
- if (locate(/obj/item/weapon/grab, M.grabbed_by.len))
+ if(locate(/obj/item/weapon/grab, M.grabbed_by.len))
ok = 0
- if (ok)
+ if(ok)
var/atom/movable/t = M.pulling
M.stop_pulling()
- if (M.lying && (prob(M.getBruteLoss() / 6)))
+ if(M.lying && (prob(M.getBruteLoss() / 6)))
var/turf/location = M.loc
- if (istype(location, /turf/simulated))
+ if(istype(location, /turf/simulated))
location.add_blood(M)
pulling.Move(T, get_dir(pulling, T))
if(M)
M.start_pulling(t)
else
- if (pulling)
+ if(pulling)
pulling.Move(T, get_dir(pulling, T))
else
stop_pulling()
. = ..()
- if (s_active && !( s_active in contents ) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents ) first so we hopefully don't have to call get_turf() so much.
+ if(s_active && !( s_active in contents ) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents ) first so we hopefully don't have to call get_turf() so much.
s_active.close(src)
if(.) // did we actually move?
@@ -643,7 +644,7 @@
//called when the mob receives a bright flash
/mob/living/proc/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash)
- if(check_eye_prot() < intensity && (override_blindness_check || !(sdisabilities & BLIND)))
+ if(check_eye_prot() < intensity && (override_blindness_check || !(disabilities & BLIND)))
overlay_fullscreen("flash", type)
addtimer(src, "clear_fullscreen", 25, FALSE, "flash", 25)
return 1
@@ -834,6 +835,15 @@
/mob/living/proc/get_permeability_protection()
return 0
+/mob/living/proc/attempt_harvest(obj/item/I, mob/user)
+ if(stat == DEAD && !isnull(butcher_results)) //can we butcher it?
+ if(istype(I, /obj/item/weapon/kitchen/knife))
+ to_chat(user, "You begin to butcher [src]... ")
+ playsound(loc, 'sound/weapons/slice.ogg', 50, 1, -1)
+ if(do_mob(user, src, 80))
+ harvest(user)
+ return 1
+
/mob/living/proc/harvest(mob/living/user)
if(qdeleted(src))
return
@@ -854,7 +864,7 @@
return tally
/mob/living/proc/can_use_guns(var/obj/item/weapon/gun/G)
- if (G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser())
+ if(G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser())
to_chat(src, "You don't have the dexterity to do this! ")
return 0
return 1
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index cc50408148e..2049d5fd21d 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -43,7 +43,7 @@
var/armor = run_armor_check(def_zone, P.flag, armour_penetration = P.armour_penetration)
var/proj_sharp = is_sharp(P)
var/proj_edge = has_edge(P)
- if ((proj_sharp || proj_edge) && prob(getarmor(def_zone, P.flag)))
+ if((proj_sharp || proj_edge) && prob(getarmor(def_zone, P.flag)))
proj_sharp = 0
proj_edge = 0
@@ -62,49 +62,40 @@
//this proc handles being hit by a thrown atom
/mob/living/hitby(atom/movable/AM as mob|obj,var/speed = 5)//Standardization and logging -Sieve
- if(istype(AM,/obj/))
- var/obj/O = AM
+ if(istype(AM, /obj/item))
+ var/obj/item/I = AM
var/zone = ran_zone("chest", 65)//Hits a random part of the body, geared towards the chest
var/dtype = BRUTE
- if(istype(O,/obj/item/weapon))
- var/obj/item/weapon/W = O
+ if(istype(I, /obj/item/weapon))
+ var/obj/item/weapon/W = I
dtype = W.damtype
- if (W.hitsound && W.throwforce > 0)
+ if(W.hitsound && W.throwforce > 0)
playsound(loc, W.hitsound, 30, 1, -1)
//run to-hit check here
- var/throw_damage = O.throwforce*(speed/5)
+ var/throw_damage = I.throwforce*(speed/5)
- //var/miss_chance = 15
- //if (O.throw_source)
- //var/distance = get_dist(O.throw_source, loc)
- //miss_chance = min(15*(distance-2), 0)
- /*
- if (prob(miss_chance))
- visible_message("\blue \The [O] misses [src] narrowly!")
- return
- */
- src.visible_message("\red [src] has been hit by [O].")
- var/armor = run_armor_check(zone, "melee")
+ src.visible_message("\red [src] has been hit by [I].")
+ 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(throw_damage, dtype, zone, armor, is_sharp(O), has_edge(O), O)
+ apply_damage(throw_damage, dtype, zone, armor, is_sharp(I), has_edge(I), I)
- O.throwing = 0 //it hit, so stop moving
+ I.throwing = 0 //it hit, so stop moving
- if(ismob(O.thrower))
- var/mob/M = O.thrower
+ if(ismob(I.thrower))
+ var/mob/M = I.thrower
if(M)
- src.attack_log += text("\[[time_stamp()]\] Has been hit with a [O], thrown by [key_name(M)] ")
- M.attack_log += text("\[[time_stamp()]\] Hit [key_name(src)] with a thrown [O] ")
+ attack_log += text("\[[time_stamp()]\] Has been hit with a [I], thrown by [key_name(M)] ")
+ M.attack_log += text("\[[time_stamp()]\] Hit [key_name(src)] with a thrown [I] ")
if(!istype(src,/mob/living/simple_animal/mouse))
- msg_admin_attack("[key_name_admin(src)] was hit by a [O], thrown by [key_name_admin(M)]")
+ msg_admin_attack("[key_name_admin(src)] was hit by a [I], thrown by [key_name_admin(M)]")
// Begin BS12 momentum-transfer code.
- if(O.throw_source && speed >= 15)
- var/obj/item/weapon/W = O
+ if(I.throw_source && speed >= 15)
+ var/obj/item/weapon/W = I
var/momentum = speed/2
- var/dir = get_dir(O.throw_source, src)
+ var/dir = get_dir(I.throw_source, src)
visible_message("\red [src] staggers under the impact!","\red You stagger under the impact!")
src.throw_at(get_edge_target_turf(src,dir),1,momentum)
@@ -113,16 +104,16 @@
if(W.sharp) //Projectile is suitable for pinning.
//Handles embedding for non-humans and simple_animals.
- O.loc = src
- src.embedded += O
+ I.loc = src
+ embedded += I
var/turf/T = near_wall(dir,2)
if(T)
src.loc = T
- visible_message("[src] is pinned to the wall by [O]! ","You are pinned to the wall by [O]! ")
+ visible_message("[src] is pinned to the wall by [I]! ","You are pinned to the wall by [I]! ")
src.anchored = 1
- src.pinned += O
+ src.pinned += I
/mob/living/mech_melee_attack(obj/mecha/M)
if(M.occupant.a_intent == I_HARM)
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index ce73ae369c0..19dc6f99cd1 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -7,10 +7,10 @@
//Damage related vars, NOTE: THESE SHOULD ONLY BE MODIFIED BY PROCS
- var/bruteloss = 0.0 //Brutal damage caused by brute force (punching, being clubbed by a toolbox ect... this also accounts for pressure damage)
- var/oxyloss = 0.0 //Oxygen depravation damage (no air in lungs)
- var/toxloss = 0.0 //Toxic damage caused by being poisoned or radiated
- var/fireloss = 0.0 //Burn damage caused by being way too hot, too cold or burnt.
+ var/bruteloss = 0 //Brutal damage caused by brute force (punching, being clubbed by a toolbox ect... this also accounts for pressure damage)
+ var/oxyloss = 0 //Oxygen depravation damage (no air in lungs)
+ var/toxloss = 0 //Toxic damage caused by being poisoned or radiated
+ var/fireloss = 0 //Burn damage caused by being way too hot, too cold or burnt.
var/cloneloss = 0 //Damage caused by being cloned or ejected from the cloner early. slimes also deal cloneloss damage to victims
var/brainloss = 0 //'Retardation' damage caused by someone hitting you in the head with a bible or being infected with brainrot.
var/staminaloss = 0 //Stamina damage, or exhaustion. You recover it slowly naturally, and are stunned if it gets too high. Holodeck and hallucinations deal this.
@@ -23,11 +23,6 @@
//Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects.
var/incorporeal_move = 0 //0 is off, 1 is normal, 2 is for ninjas.
- var/t_plasma = null
- var/t_oxygen = null
- var/t_sl_gas = null
- var/t_n2 = null
-
var/now_pushing = null
var/atom/movable/cameraFollow = null
@@ -36,9 +31,8 @@
var/fire_stacks = 0 //Tracks how many stacks of fire we have on, max is usually 20
var/update_slimes = 1
- var/specialsauce = 0 //Has this person consumed enough special sauce? IF so they're a ticking time bomb of death.
var/implanting = 0 //Used for the mind-slave implant
- var/silent = null //Can't talk. Value goes down every life proc.
+ var/silent = 0 //Can't talk. Value goes down every life proc. //NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU.
var/floating = 0
var/nightvision = 0
@@ -49,9 +43,12 @@
var/list/icon/pipes_shown = list()
var/last_played_vent
- var/list/datum/action/actions = list()
var/step_count = 0
var/list/butcher_results = null
- var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them.
\ No newline at end of file
+ var/list/weather_immunities = list()
+
+ var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them.
+
+ var/gene_stability = DEFAULT_GENE_STABILITY
diff --git a/code/modules/mob/living/logout.dm b/code/modules/mob/living/logout.dm
index b79d822d80b..71e26e60858 100644
--- a/code/modules/mob/living/logout.dm
+++ b/code/modules/mob/living/logout.dm
@@ -1,6 +1,6 @@
/mob/living/Logout()
..()
- if (mind)
+ if(mind)
if(!key) //key and mind have become seperated. I believe this is for when a staff member aghosts.
mind.active = 0 //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body.
//This causes instant sleep and tags a player as SSD. See life.dm for furthering SSD.
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 812d2e8df58..842b03c4bbd 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -26,10 +26,10 @@ var/list/ai_verbs_default = list(
//Not sure why this is necessary...
/proc/AutoUpdateAI(obj/subject)
var/is_in_use = 0
- if (subject!=null)
+ if(subject!=null)
for(var/A in ai_list)
var/mob/living/silicon/ai/M = A
- if ((M.client && M.machine == subject))
+ if((M.client && M.machine == subject))
is_in_use = 1
subject.attack_ai(M)
return is_in_use
@@ -54,6 +54,7 @@ var/list/ai_verbs_default = list(
var/obj/item/device/pda/silicon/ai/aiPDA = null
var/obj/item/device/multitool/aiMulti = null
var/custom_sprite = 0 //For our custom sprites
+ var/custom_hologram = 0 //For our custom holograms
var/obj/item/device/radio/headset/heads/ai_integrated/aiRadio = null
@@ -121,8 +122,8 @@ var/list/ai_verbs_default = list(
var/pickedName = null
while(!pickedName)
pickedName = pick(ai_names)
- for (var/mob/living/silicon/ai/A in mob_list)
- if (A.real_name == pickedName && possibleNames.len > 1) //fixing the theoretically possible infinite loop
+ for(var/mob/living/silicon/ai/A in mob_list)
+ if(A.real_name == pickedName && possibleNames.len > 1) //fixing the theoretically possible infinite loop
possibleNames -= pickedName
pickedName = null
@@ -138,7 +139,7 @@ var/list/ai_verbs_default = list(
proc_holder_list = new()
if(L)
- if (istype(L, /datum/ai_laws))
+ if(istype(L, /datum/ai_laws))
laws = L
else
make_laws()
@@ -154,7 +155,7 @@ var/list/ai_verbs_default = list(
aiCamera = new/obj/item/device/camera/siliconcam/ai_camera(src)
- if (istype(loc, /turf))
+ if(istype(loc, /turf))
add_ai_verbs(src)
//Languages
@@ -176,12 +177,12 @@ var/list/ai_verbs_default = list(
add_language("Clownish", 0)
if(!safety)//Only used by AIize() to successfully spawn an AI.
- if (!B)//If there is no player/brain inside.
+ if(!B)//If there is no player/brain inside.
new/obj/structure/AIcore/deactivated(loc)//New empty terminal.
qdel(src)//Delete AI.
return
else
- if (B.brainmob.mind)
+ if(B.brainmob.mind)
B.brainmob.mind.transfer_to(src)
on_mob_init()
@@ -219,7 +220,7 @@ var/list/ai_verbs_default = list(
to_chat(src, radio_text)
- if (!(ticker && ticker.mode && (mind in ticker.mode.malf_ai)))
+ if(!(ticker && ticker.mode && (mind in ticker.mode.malf_ai)))
show_laws()
to_chat(src, "These laws may be changed by other players, or by you being the traitor. ")
@@ -298,18 +299,19 @@ var/list/ai_verbs_default = list(
Entry[i] = trim(Entry[i])
if(Entry.len < 2)
- continue;
+ continue
- if(Entry[1] == src.ckey && Entry[2] == src.real_name)
+ if(Entry.len < 3 && Entry[1] == ckey && Entry[2] == real_name)
custom_sprite = 1 //They're in the list? Custom sprite time
icon = 'icons/mob/custom-synthetic.dmi'
+
//if(icon_state == initial(icon_state))
var/icontype = ""
- if (custom_sprite == 1) icontype = ("Custom")//automagically selects custom sprite if one is available
+ if(custom_sprite == 1) icontype = ("Custom")//automagically selects custom sprite if one is available
else icontype = input("Select an icon!", "AI", null, null) in list("Monochrome", "Blue", "Clown", "Inverted", "Text", "Smiley", "Angry", "Dorf", "Matrix", "Bliss", "Firewall", "Green", "Red", "Static", "Triumvirate", "Triumvirate Static", "Red October", "Sparkles", "ANIMA", "President", "NT")
switch(icontype)
- if("Custom") icon_state = "[src.ckey]-ai"
+ if("Custom") icon_state = "[ckey]-ai"
if("Clown") icon_state = "ai-clown2"
if("Monochrome") icon_state = "ai-mono"
if("Inverted") icon_state = "ai-u"
@@ -340,9 +342,9 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/show_malf_ai()
if(ticker.mode.name == "AI malfunction")
var/datum/game_mode/malfunction/malf = ticker.mode
- for (var/datum/mind/malfai in malf.malf_ai)
- if (mind == malfai) // are we the evil one?
- if (malf.apcs >= 3)
+ for(var/datum/mind/malfai in malf.malf_ai)
+ if(mind == malfai) // are we the evil one?
+ if(malf.apcs >= 3)
stat(null, "Time until station control secured: [max(malf.AI_win_timeleft/(malf.apcs/3), 0)] seconds")
// this verb lets the ai see the stations manifest
@@ -436,13 +438,13 @@ var/list/ai_verbs_default = list(
ai_announcement()
/mob/living/silicon/ai/check_eye(var/mob/user as mob)
- if (!current)
+ if(!current)
return null
user.reset_view(current)
return 1
/mob/living/silicon/ai/blob_act()
- if (stat != 2)
+ if(stat != 2)
adjustBruteLoss(60)
updatehealth()
return 1
@@ -452,7 +454,7 @@ var/list/ai_verbs_default = list(
return 0
/mob/living/silicon/ai/emp_act(severity)
- if (prob(30))
+ if(prob(30))
switch(pick(1,2))
if(1)
view_core()
@@ -467,11 +469,11 @@ var/list/ai_verbs_default = list(
if(1.0)
gib()
if(2.0)
- if (stat != 2)
+ if(stat != 2)
adjustBruteLoss(60)
adjustFireLoss(60)
if(3.0)
- if (stat != 2)
+ if(stat != 2)
adjustBruteLoss(30)
return
@@ -481,21 +483,21 @@ var/list/ai_verbs_default = list(
if(usr != src)
return
..()
- if (href_list["mach_close"])
- if (href_list["mach_close"] == "aialerts")
+ if(href_list["mach_close"])
+ if(href_list["mach_close"] == "aialerts")
viewalerts = 0
var/t1 = text("window=[]", href_list["mach_close"])
unset_machine()
src << browse(null, t1)
- if (href_list["switchcamera"])
+ if(href_list["switchcamera"])
switchCamera(locate(href_list["switchcamera"])) in cameranet.cameras
- if (href_list["showalerts"])
+ if(href_list["showalerts"])
subsystem_alarm_monitor()
if(href_list["show_paper"])
if(last_paper_seen)
src << browse(last_paper_seen, "window=show_paper")
//Carn: holopad requests
- if (href_list["jumptoholopad"])
+ if(href_list["jumptoholopad"])
var/obj/machinery/hologram/holopad/H = locate(href_list["jumptoholopad"])
if(stat == CONSCIOUS)
if(H)
@@ -507,7 +509,7 @@ var/list/ai_verbs_default = list(
play_vox_word(href_list["say_word"], null, src)
return
- if (href_list["track"])
+ if(href_list["track"])
var/mob/living/target = locate(href_list["track"]) in mob_list
if(target && target.can_track())
ai_actual_track(target)
@@ -515,7 +517,7 @@ var/list/ai_verbs_default = list(
to_chat(src, "Target is not on or near any active cameras on the station. ")
return
- if (href_list["trackbot"])
+ if(href_list["trackbot"])
var/mob/living/simple_animal/bot/target = locate(href_list["trackbot"]) in simple_animal_list
if(target)
ai_actual_track(target)
@@ -523,7 +525,7 @@ var/list/ai_verbs_default = list(
to_chat(src, "Target is not on or near any active cameras on the station. ")
return
- if (href_list["callbot"]) //Command a bot to move to a selected location.
+ if(href_list["callbot"]) //Command a bot to move to a selected location.
Bot = locate(href_list["callbot"]) in simple_animal_list
if(!Bot || Bot.remote_disabled || src.control_disabled)
return //True if there is no bot found, the bot is manually emagged, or the AI is carded with wireless off.
@@ -531,17 +533,17 @@ var/list/ai_verbs_default = list(
to_chat(src, "Set your waypoint by clicking on a valid location free of obstructions. ")
return
- if (href_list["interface"]) //Remotely connect to a bot!
+ if(href_list["interface"]) //Remotely connect to a bot!
Bot = locate(href_list["interface"]) in simple_animal_list
if(!Bot || Bot.remote_disabled || src.control_disabled)
return
Bot.attack_ai(src)
- if (href_list["botrefresh"]) //Refreshes the bot control panel.
+ if(href_list["botrefresh"]) //Refreshes the bot control panel.
botcall()
return
- if (href_list["ai_take_control"]) //Mech domination
+ if(href_list["ai_take_control"]) //Mech domination
var/obj/mecha/M = locate(href_list["ai_take_control"])
if(controlled_mech)
to_chat(src, "You are already loaded into an onboard computer!")
@@ -549,17 +551,17 @@ var/list/ai_verbs_default = list(
if(M)
M.transfer_ai(AI_MECH_HACK,src, usr) //Called om the mech itself.
- else if (href_list["faketrack"])
+ else if(href_list["faketrack"])
var/mob/target = locate(href_list["track"]) in mob_list
var/mob/living/silicon/ai/A = locate(href_list["track2"]) in mob_list
if(A && target)
A.cameraFollow = target
to_chat(A, "Now tracking [target.name] on camera.")
- if (usr.machine == null)
+ if(usr.machine == null)
usr.machine = usr
- while (src.cameraFollow == target)
+ while(src.cameraFollow == target)
to_chat(usr, "Target is not on or near any active cameras on the station. We'll check again in 5 seconds (unless you use the cancel-camera verb).")
sleep(40)
continue
@@ -575,23 +577,23 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
- if (!ticker)
+ if(!ticker)
to_chat(M, "You cannot attack people before the game has started.")
return
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
+ if(istype(loc, /turf) && istype(loc.loc, /area/start))
to_chat(M, "No attacking people at spawn, you jackass.")
return
switch(M.a_intent)
- if (I_HELP)
+ if(I_HELP)
visible_message("[M] caresses [src]'s plating with its scythe like arm. ")
else //harm
M.do_attack_animation(src)
var/damage = rand(10, 20)
- if (prob(90))
+ if(prob(90))
playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
visible_message("[M] has slashed at [src]! ",\
"[M] has slashed at [src]! ")
@@ -644,7 +646,7 @@ var/list/ai_verbs_default = list(
d += "Query network status "
d += "Name Status Location Control "
- for (var/mob/living/simple_animal/bot/Bot in simple_animal_list)
+ for(var/mob/living/simple_animal/bot/Bot in simple_animal_list)
if((Bot.z in ai_allowed_Zlevel) && !Bot.remote_disabled) //Only non-emagged bots on the allowed Z-level are detected!
bot_area = get_area(Bot)
d += "[Bot.hacked ? "(!) [Bot.name]" : Bot.name] ([Bot.model]) "
@@ -686,7 +688,7 @@ var/list/ai_verbs_default = list(
if(!tracking)
cameraFollow = null
- if (!C || stat == DEAD) //C.can_use())
+ if(!C || stat == DEAD) //C.can_use())
return 0
if(!src.eyeobj)
@@ -716,7 +718,7 @@ var/list/ai_verbs_default = list(
var/mob/living/silicon/ai/U = usr
- for (var/obj/machinery/camera/C in cameranet.cameras)
+ for(var/obj/machinery/camera/C in cameranet.cameras)
if(!C.can_use())
continue
@@ -770,7 +772,7 @@ var/list/ai_verbs_default = list(
if(check_unable())
return
- for (var/obj/machinery/M in machines) //change status
+ for(var/obj/machinery/M in machines) //change status
if(istype(M, /obj/machinery/ai_status_display))
var/obj/machinery/ai_status_display/AISD = M
AISD.emotion = emote
@@ -792,6 +794,21 @@ var/list/ai_verbs_default = list(
if(check_unable())
return
+ if(!custom_hologram) //Check to see if custom sprite time, checking the appopriate file to change a var
+ var/file = file2text("config/custom_sprites.txt")
+ var/lines = splittext(file, "\n")
+
+ for(var/line in lines)
+ // split & clean up
+ var/list/Entry = splittext(line, ":")
+ for(var/i = 1 to Entry.len)
+ Entry[i] = trim(Entry[i])
+
+ if(Entry.len < 3)
+ continue
+
+ if (Entry[1] == ckey && Entry[2] == real_name && Entry[3] == "Hologram") //Custom holograms
+ custom_hologram = 1 // option is given in hologram menu
var/input
if(alert("Would you like to select a hologram based on a crew member or switch to unique avatar?",,"Crew Member","Unique")=="Crew Member")
@@ -815,8 +832,12 @@ var/list/ai_verbs_default = list(
"default",
"floating face",
"xeno queen",
- "eldritch"
+ "eldritch",
+ "ancient machine"
)
+ if(custom_hologram) //insert custom hologram
+ icon_list.Add("custom")
+
input = input("Please select a hologram:") as null|anything in icon_list
if(input)
qdel(holo_icon)
@@ -829,6 +850,10 @@ var/list/ai_verbs_default = list(
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo3"))
if("eldritch")
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo4"))
+ if("ancient machine")
+ holo_icon = getHologramIcon(icon('icons/mob/ancient_machine.dmi', "ancient_machine"))
+ if("custom")
+ holo_icon = getHologramIcon(icon('icons/mob/custom-synthetic.dmi', "[ckey]-ai-holo"))
return
/mob/living/silicon/ai/proc/corereturn()
@@ -852,10 +877,10 @@ var/list/ai_verbs_default = list(
camera_light_on = !camera_light_on
- if (!camera_light_on)
+ if(!camera_light_on)
to_chat(src, "Camera lights deactivated.")
- for (var/obj/machinery/camera/C in lit_cameras)
+ for(var/obj/machinery/camera/C in lit_cameras)
C.set_light(0)
lit_cameras = list()
@@ -888,19 +913,19 @@ var/list/ai_verbs_default = list(
var/list/obj/machinery/camera/add = list()
var/list/obj/machinery/camera/remove = list()
var/list/obj/machinery/camera/visible = list()
- for (var/datum/camerachunk/CC in eyeobj.visibleCameraChunks)
- for (var/obj/machinery/camera/C in CC.cameras)
- if (!C.can_use() || get_dist(C, eyeobj) > 7)
+ for(var/datum/camerachunk/CC in eyeobj.visibleCameraChunks)
+ for(var/obj/machinery/camera/C in CC.cameras)
+ if(!C.can_use() || get_dist(C, eyeobj) > 7)
continue
visible |= C
add = visible - lit_cameras
remove = lit_cameras - visible
- for (var/obj/machinery/camera/C in remove)
+ for(var/obj/machinery/camera/C in remove)
lit_cameras -= C //Removed from list before turning off the light so that it doesn't check the AI looking away.
C.Togglelight(0)
- for (var/obj/machinery/camera/C in add)
+ for(var/obj/machinery/camera/C in add)
C.Togglelight(1)
lit_cameras |= C
@@ -936,7 +961,7 @@ var/list/ai_verbs_default = list(
return
to_chat(src, "Accessing Subspace Transceiver control...")
- if (src.aiRadio)
+ if(src.aiRadio)
src.aiRadio.interact(src)
@@ -952,7 +977,7 @@ var/list/ai_verbs_default = list(
if(H.digitalcamo)
to_chat(src, "Unable to locate an airlock")
return
- if (!near_camera(target))
+ if(!near_camera(target))
to_chat(src, "Target is not near any active cameras.")
return
var/obj/machinery/door/airlock/tobeopened
@@ -1012,7 +1037,7 @@ var/list/ai_verbs_default = list(
to_chat(user, "No intelligence patterns detected. ")//No more magical carding of empty cores, AI RETURN TO BODY!!!11
return
- if (mind.special_role == "malfunction") //AI MALF!!
+ if(mind.special_role == "malfunction") //AI MALF!!
to_chat(user, "ERROR : Remote transfer interface disabled.")//Do ho ho ho~
return
@@ -1040,4 +1065,4 @@ var/list/ai_verbs_default = list(
eyeobj.setLoc(get_turf(C))
client.eye = eyeobj
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm
index b0b0f44d0e6..d0293d7f50b 100644
--- a/code/modules/mob/living/silicon/ai/death.dm
+++ b/code/modules/mob/living/silicon/ai/death.dm
@@ -1,7 +1,7 @@
/mob/living/silicon/ai/death(gibbed)
if(stat == DEAD) return
stat = DEAD
- if (src.custom_sprite == 1)//check for custom AI sprite, defaulting to blue screen if no.
+ if(src.custom_sprite == 1)//check for custom AI sprite, defaulting to blue screen if no.
icon_state = "[ckey]-ai-crash"
else icon_state = "ai-crash"
update_canmove()
@@ -21,7 +21,7 @@
for(var/obj/machinery/ai_status_display/O in world) //change status
spawn( 0 )
O.mode = 2
- if (istype(loc, /obj/item/device/aicard))
+ if(istype(loc, /obj/item/device/aicard))
loc.icon_state = "aicard-404"
timeofdeath = worldtime2text()
diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm
index d65e6e0d7d8..c2358c9b237 100644
--- a/code/modules/mob/living/silicon/ai/examine.dm
+++ b/code/modules/mob/living/silicon/ai/examine.dm
@@ -1,24 +1,26 @@
/mob/living/silicon/ai/examine(mob/user)
+ to_chat(user, "*---------* ")
if(!..(user))
+ to_chat(user, "*---------* ")
return
- var/msg = ""
- if (src.stat == DEAD)
+ var/msg = ""
+ if(src.stat == DEAD)
msg += "It appears to be powered-down. \n"
else
msg += ""
- if (src.getBruteLoss())
- if (src.getBruteLoss() < 30)
+ if(src.getBruteLoss())
+ if(src.getBruteLoss() < 30)
msg += "It looks slightly dented.\n"
else
msg += "It looks severely dented! \n"
- if (src.getFireLoss())
- if (src.getFireLoss() < 30)
+ if(src.getFireLoss())
+ if(src.getFireLoss() < 30)
msg += "It looks slightly charred.\n"
else
msg += "Its casing is melted and heat-warped! \n"
- if (src.stat == UNCONSCIOUS)
+ if(src.stat == UNCONSCIOUS)
msg += "It is non-responsive and displaying the text: \"RUNTIME: Sensory Overload, stack 26/3\".\n"
msg += " "
msg += "*---------* "
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index 317aae2dd6b..00435fdd17a 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -50,7 +50,7 @@
var/mob/living/silicon/ai/AI = usr
if(AI.eyeobj && AI.client.eye == AI.eyeobj)
AI.cameraFollow = null
- if (isturf(src.loc) || isturf(src))
+ if(isturf(src.loc) || isturf(src))
AI.eyeobj.setLoc(src)
// AI MOVEMENT
@@ -82,7 +82,7 @@
//user.unset_machine() //Uncomment this if it causes problems.
//user.lightNearbyCamera()
- if (user.camera_light_on)
+ if(user.camera_light_on)
user.light_cameras()
// Return to the Core.
diff --git a/code/modules/mob/living/silicon/ai/laws.dm b/code/modules/mob/living/silicon/ai/laws.dm
index 74816aeeb89..4ce1dbda48c 100755
--- a/code/modules/mob/living/silicon/ai/laws.dm
+++ b/code/modules/mob/living/silicon/ai/laws.dm
@@ -6,7 +6,7 @@
/mob/living/silicon/ai/show_laws(var/everyone = 0)
var/who
- if (everyone)
+ if(everyone)
who = world
else
who = src
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index dabaf2c4153..f82db9b4662 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -12,7 +12,7 @@
updatehealth()
update_gravity(mob_has_gravity())
- if (health <= config.health_threshold_dead)
+ if(health <= config.health_threshold_dead)
death()
return 0
@@ -102,7 +102,7 @@
var/PRP
for(PRP = 1, PRP <= 4, PRP++)
for(var/obj/machinery/power/apc/APC in my_area)
- if (!(APC.stat & BROKEN))
+ if(!(APC.stat & BROKEN))
theAPC = APC
break
@@ -116,7 +116,7 @@
return
if(my_area.power_equip)
- if (!istype(T, /turf/space))
+ if(!istype(T, /turf/space))
to_chat(src, "Alert cancelled. Power has been restored without our assistance.")
aiRestorePowerRoutine = 0
clear_fullscreen("blind")
diff --git a/code/modules/mob/living/silicon/ai/logout.dm b/code/modules/mob/living/silicon/ai/logout.dm
index 09bc93bf349..acc6220bc46 100644
--- a/code/modules/mob/living/silicon/ai/logout.dm
+++ b/code/modules/mob/living/silicon/ai/logout.dm
@@ -3,7 +3,7 @@
for(var/obj/machinery/ai_status_display/O in world) //change status
O.mode = 0
if(!isturf(loc))
- if (client)
+ if(client)
client.eye = loc
client.perspective = EYE_PERSPECTIVE
src.view_core()
diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm
index d5315deaefb..d50cb217cdb 100644
--- a/code/modules/mob/living/silicon/ai/say.dm
+++ b/code/modules/mob/living/silicon/ai/say.dm
@@ -83,9 +83,9 @@ var/const/VOX_PATH = "sound/vox_fem/"
if(M.client)
var/turf/T = get_turf(M)
if(T && T.z == z_level && !isdeaf(M))
- to_chat(M, voice)
+ M << voice
else
- to_chat(only_listener, voice)
+ only_listener << voice
return 1
return 0
diff --git a/code/modules/mob/living/silicon/decoy/life.dm b/code/modules/mob/living/silicon/decoy/life.dm
index d62d5d15dae..ade3c535506 100644
--- a/code/modules/mob/living/silicon/decoy/life.dm
+++ b/code/modules/mob/living/silicon/decoy/life.dm
@@ -1,8 +1,8 @@
/mob/living/silicon/decoy/Life()
- if (src.stat == 2)
+ if(src.stat == 2)
return
else
- if (src.health <= config.health_threshold_dead && src.stat != 2)
+ if(src.health <= config.health_threshold_dead && src.stat != 2)
death()
return
diff --git a/code/modules/mob/living/silicon/emote.dm b/code/modules/mob/living/silicon/emote.dm
new file mode 100644
index 00000000000..9e95b9cefaa
--- /dev/null
+++ b/code/modules/mob/living/silicon/emote.dm
@@ -0,0 +1,127 @@
+/mob/living/silicon/emote(var/act, var/m_type=1, var/message = null)
+ var/param = null
+ if(findtext(act, "-", 1, null))
+ var/t1 = findtext(act, "-", 1, null)
+ param = copytext(act, t1 + 1, length(act) + 1)
+ act = copytext(act, 1, t1)
+
+ //Emote Cooldown System (it's so simple!)
+ // proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
+ var/on_CD = 0
+ act = lowertext(act)
+ switch(act)
+ //Cooldown-inducing emotes
+ if("scream", "screams")
+ on_CD = handle_emote_CD(50) //longer cooldown
+ if("ping","pings","buzz","buzzs","buzzes","beep","beeps","yes","no", "buzz2")
+ //halt is exempt because it's used to stop criminal scum //WHOEVER THOUGHT THAT WAS A GOOD IDEA IS GOING TO GET SHOT.
+ on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
+ //Everything else, including typos of the above emotes
+ else
+ on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown
+
+ if(on_CD == 1) // Check if we need to suppress the emote attempt.
+ return // Suppress emote, you're still cooling off.
+ //--FalseIncarnate
+
+ switch(act)
+ if("ping","pings")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] pings at [param]."
+ else
+ message = "[src] pings."
+ playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
+ m_type = 2
+
+ if("buzz","buzzs","buzzes")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] buzzes at [param]."
+ else
+ message = "[src] buzzes."
+ playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
+ m_type = 2
+
+ if("beep","beeps")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] beeps at [param]."
+ else
+ message = "[src] beeps."
+ playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
+ m_type = 2
+
+ if("yes")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] emits an affirmative blip at [param]."
+ else
+ message = "[src] emits an affirmative blip."
+ playsound(src.loc, 'sound/machines/synth_yes.ogg', 50, 0)
+ m_type = 2
+
+ if("no")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] emits a negative blip at [param]."
+ else
+ message = "[src] emits a negative blip."
+ playsound(src.loc, 'sound/machines/synth_no.ogg', 50, 0)
+ m_type = 2
+
+ if("scream", "screams")
+ message = "[src] screams!"
+ playsound(src.loc, 'sound/goonstation/voice/robot_scream.ogg', 80, 0)
+ m_type = 2
+
+ if("buzz2")
+ message = "[src] emits an irritated buzzing sound."
+ playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0)
+ m_type = 2
+
+
+ if("help")
+ to_chat(src, "yes, no, beep, ping, buzz, scream, buzz2")
+
+ ..(act, m_type, message)
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm
index 30784e61b93..b49aa82625c 100644
--- a/code/modules/mob/living/silicon/laws.dm
+++ b/code/modules/mob/living/silicon/laws.dm
@@ -3,7 +3,7 @@
var/list/additional_law_channels = list("State" = "")
/mob/living/silicon/proc/laws_sanity_check()
- if (!src.laws)
+ if(!src.laws)
laws = new base_law_type
/mob/living/silicon/proc/has_zeroth_law()
diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm
index 0f938ab31b0..92055b813ab 100644
--- a/code/modules/mob/living/silicon/pai/death.dm
+++ b/code/modules/mob/living/silicon/pai/death.dm
@@ -6,7 +6,7 @@
force_fold_out()
var/turf/T = get_turf_or_move(loc)
- for (var/mob/M in viewers(T))
+ for(var/mob/M in viewers(T))
M.show_message("[src] emits a dull beep before it loses power and collapses. ", 3, "You hear a dull beep followed by the sound of glass crunching. ", 2)
name = "pAI debris"
desc = "The unfortunate remains of some poor personal AI device."
diff --git a/code/modules/mob/living/silicon/pai/emote.dm b/code/modules/mob/living/silicon/pai/emote.dm
new file mode 100644
index 00000000000..a418c0972d5
--- /dev/null
+++ b/code/modules/mob/living/silicon/pai/emote.dm
@@ -0,0 +1,2 @@
+/mob/living/silicon/pai/emote(var/act, var/m_type=1, var/message = null)
+ ..(act, m_type, message)
diff --git a/code/modules/mob/living/silicon/pai/examine.dm b/code/modules/mob/living/silicon/pai/examine.dm
deleted file mode 100644
index 814efb1899b..00000000000
--- a/code/modules/mob/living/silicon/pai/examine.dm
+++ /dev/null
@@ -1,25 +0,0 @@
-/mob/living/silicon/pai/examine(mob/user) //removed as it was pointless...moved to the pai-card instead.
- /*..(user) //This is totally pointless because this mob is contained inside a card!
-
- var/msg = ""
- if (src.stat == DEAD)
- msg += "It appears to be offline. \n"
- else
- msg += ""
- if (src.getBruteLoss())
- if (src.getBruteLoss() < 30)
- msg += "It looks slightly dented.\n"
- else
- msg += "Its casing appears cracked and broken! \n"
- if (src.getFireLoss())
- if (src.getFireLoss() < 30)
- msg += "It looks slightly charred!\n"
- else
- msg += "Its casing is melted and heat-warped! \n"
- if (src.stat == UNCONSCIOUS)
- msg += "It doesn't seem to be responding and its text-output is lagging.\n"
- msg += " "
- msg += "*---------*"
-
- to_chat(user, msg)
- */
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm
index ac8e20238d3..c0e4c2f275b 100644
--- a/code/modules/mob/living/silicon/pai/life.dm
+++ b/code/modules/mob/living/silicon/pai/life.dm
@@ -13,7 +13,7 @@
if(cable)
if(get_dist(src, cable) > 1)
var/turf/T = get_turf_or_move(loc)
- for (var/mob/M in viewers(T))
+ for(var/mob/M in viewers(T))
M.show_message("\red The data cable rapidly retracts back into its spool.", 3, "\red You hear a click and the sound of wire spooling rapidly.", 2)
qdel(src.cable)
cable = null
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 635efadcaba..3cf863a3591 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -127,21 +127,21 @@
/mob/living/silicon/pai/Stat()
..()
statpanel("Status")
- if (src.client.statpanel == "Status")
+ if(src.client.statpanel == "Status")
show_silenced()
- if (proc_holder_list.len)//Generic list for proc_holder objects.
+ if(proc_holder_list.len)//Generic list for proc_holder objects.
for(var/obj/effect/proc_holder/P in proc_holder_list)
statpanel("[P.panel]","",P)
/mob/living/silicon/pai/check_eye(var/mob/user as mob)
- if (!src.current)
+ if(!src.current)
return null
user.reset_view(src.current)
return 1
/mob/living/silicon/pai/blob_act()
- if (src.stat != 2)
+ if(src.stat != 2)
src.adjustBruteLoss(60)
src.updatehealth()
return 1
@@ -166,7 +166,7 @@
to_chat(src, "Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete. ")
if(prob(20))
var/turf/T = get_turf_or_move(src.loc)
- for (var/mob/M in viewers(T))
+ for(var/mob/M in viewers(T))
M.show_message("\red A shower of sparks spray from [src]'s inner workings.", 3, "\red You hear and smell the ozone hiss of electrical sparks being expelled violently.", 2)
return src.death(0)
@@ -191,15 +191,15 @@
switch(severity)
if(1.0)
- if (src.stat != 2)
+ if(src.stat != 2)
adjustBruteLoss(100)
adjustFireLoss(100)
if(2.0)
- if (src.stat != 2)
+ if(src.stat != 2)
adjustBruteLoss(60)
adjustFireLoss(60)
if(3.0)
- if (src.stat != 2)
+ if(src.stat != 2)
adjustBruteLoss(30)
return
@@ -223,28 +223,28 @@
updatehealth()
/mob/living/silicon/pai/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
- if (!ticker)
+ if(!ticker)
to_chat(M, "You cannot attack people before the game has started.")
return
- if (istype(src.loc, /turf) && istype(src.loc.loc, /area/start))
+ if(istype(src.loc, /turf) && istype(src.loc.loc, /area/start))
to_chat(M, "You cannot attack someone in the spawn area.")
return
switch(M.a_intent)
- if (I_HELP)
+ if(I_HELP)
for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
+ if((O.client && !( O.blinded )))
O.show_message(text("\blue [M] caresses [src]'s casing with its scythe like arm."), 1)
else //harm
M.do_attack_animation(src)
var/damage = rand(10, 20)
- if (prob(90))
+ if(prob(90))
playsound(src.loc, 'sound/weapons/slash.ogg', 25, 1, -1)
for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
+ if((O.client && !( O.blinded )))
O.show_message(text("\red [] has slashed at []! ", M, src), 1)
if(prob(8))
flash_eyes(affect_silicon = 1)
@@ -253,17 +253,17 @@
else
playsound(src.loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
+ if((O.client && !( O.blinded )))
O.show_message(text("\red [] took a swipe at []! ", M, src), 1)
return
/mob/living/silicon/pai/proc/switchCamera(var/obj/machinery/camera/C)
usr:cameraFollow = null
- if (!C)
+ if(!C)
src.unset_machine()
src.reset_view(null)
return 0
- if (stat == 2 || !C.status || !(src.network in C.network)) return 0
+ if(stat == 2 || !C.status || !(src.network in C.network)) return 0
// ok, we're alive, camera is good and in our network...
@@ -306,7 +306,7 @@
to_chat(usr, "You can't change your camera network because you are dead!")
return
- for (var/obj/machinery/camera/C in Cameras)
+ for(var/obj/machinery/camera/C in Cameras)
if(!C.status)
continue
else
@@ -441,9 +441,9 @@
/mob/living/silicon/pai/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/stack/nanopaste))
var/obj/item/stack/nanopaste/N = W
- if (stat == DEAD)
+ if(stat == DEAD)
to_chat(user, "\The [src] is beyond help, at this point. ")
- else if (getBruteLoss() || getFireLoss())
+ else if(getBruteLoss() || getFireLoss())
adjustBruteLoss(-15)
adjustFireLoss(-15)
updatehealth()
@@ -466,10 +466,15 @@
return
/mob/living/silicon/pai/attack_hand(mob/user as mob)
- if(stat == 2) return
- visible_message("[user.name] boops [src] on the head. ")
- spawn(1)
- close_up()
+ if(stat == DEAD)
+ return
+ if(user.a_intent == I_HELP)
+ user.visible_message("[user] pets [src]. ")
+ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ else
+ visible_message("[user.name] boops [src] on the head. ")
+ spawn(1)
+ close_up()
//I'm not sure how much of this is necessary, but I would rather avoid issues.
/mob/living/silicon/pai/proc/close_up()
@@ -516,35 +521,36 @@
to_chat(src, "You are far too small to pull anything! ")
return
-/mob/living/silicon/pai/update_canmove()
+/mob/living/silicon/pai/update_canmove(delay_action_updates = 0)
. = ..()
density = 0 //this is reset every canmove update otherwise
/mob/living/silicon/pai/examine(mob/user)
+ to_chat(user, "*---------* ")
..(user)
- var/msg = ""
+ var/msg = ""
switch(src.stat)
if(CONSCIOUS)
if(!src.client) msg += "\nIt appears to be in stand-by mode." //afk
if(UNCONSCIOUS) msg += "\nIt doesn't seem to be responding. "
if(DEAD) msg += "\nIt looks completely unsalvageable. "
- msg += "\n*---------* "
- if(print_flavor_text()) msg += "\n[print_flavor_text()]\n"
+ if(print_flavor_text()) msg += "\n[print_flavor_text()]"
- if (pose)
+ if(pose)
if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 )
pose = addtext(pose,".") //Makes sure all emotes end with a period.
msg += "\nIt is [pose]"
+ msg += "\n*---------*"
to_chat(user, msg)
/mob/living/silicon/pai/bullet_act(var/obj/item/projectile/Proj)
..(Proj)
updatehealth()
- if (stat != 2)
+ if(stat != 2)
spawn(1)
close_up()
return 2
diff --git a/code/modules/mob/living/silicon/pai/personality.dm b/code/modules/mob/living/silicon/pai/personality.dm
index 49b7e394d44..d089b76a3fb 100644
--- a/code/modules/mob/living/silicon/pai/personality.dm
+++ b/code/modules/mob/living/silicon/pai/personality.dm
@@ -32,12 +32,12 @@
// returns 0 if savefile did not exist
/datum/paiCandidate/proc/savefile_load(mob/user, var/silent = 1)
- if (IsGuestKey(user.key))
+ if(IsGuestKey(user.key))
return 0
var/path = savefile_path(user)
- if (!fexists(path))
+ if(!fexists(path))
return 0
var/savefile/F = new /savefile(path)
@@ -47,9 +47,9 @@
var/version = null
F["version"] >> version
- if (isnull(version) || version != 1)
+ if(isnull(version) || version != 1)
fdel(path)
- if (!silent)
+ if(!silent)
alert(user, "Your savefile was incompatible with this version and was deleted.")
return 0
diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm
index 949c946a6c8..2e6548ef2c4 100644
--- a/code/modules/mob/living/silicon/pai/recruit.dm
+++ b/code/modules/mob/living/silicon/pai/recruit.dm
@@ -231,7 +231,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
M << browse(dat, "window=paiRecruit;size=580x580;")
proc/findPAI(var/obj/item/device/paicard/p, var/mob/user)
- requestRecruits(p)
+ requestRecruits(p, user)
var/list/available = list()
for(var/datum/paiCandidate/c in paiController.pai_candidates)
if(c.ready)
@@ -346,13 +346,14 @@ var/datum/paiController/paiController // Global handler for pAI candidates
user << browse(dat, "window=findPai")
- proc/requestRecruits(var/obj/item/device/paicard/P)
+ proc/requestRecruits(var/obj/item/device/paicard/P, mob/user)
for(var/mob/dead/observer/O in player_list)
if(O.client && (ROLE_PAI in O.client.prefs.be_special))
if(player_old_enough_antag(O.client,ROLE_PAI))
if(check_recruit(O))
- to_chat(O, "\blue A pAI card is looking for personalities. (Teleport | Sign Up ) ")
+ to_chat(O, "\blue A pAI card activated by [user.real_name] is looking for personalities. (Teleport | Sign Up ) ")
//question(O.client)
+
proc/check_recruit(var/mob/dead/observer/O)
if(jobban_isbanned(O, ROLE_PAI) || jobban_isbanned(O,"nonhumandept"))
return 0
@@ -373,7 +374,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
if(!C) return //handle logouts that happen whilst the alert is waiting for a response.
if(response == "Yes")
recruitWindow(C.mob)
- else if (response == "Never for this round")
+ else if(response == "Never for this round")
var/warning = alert(C, "Are you sure? This action will be undoable and you will need to wait until next round.", "You sure?", "Yes", "No")
if(warning == "Yes")
asked[C.key] = INFINITY
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index e85345db226..539832d9c08 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -85,7 +85,7 @@ var/global/list/default_pai_software = list()
data["current_emotion"] = card.current_emotion
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "pai_interface.tmpl", "pAI Software Interface", 450, 600)
ui.set_initial_data(data)
ui.open()
diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm
index b4fd1ff3fa7..3e15e7118d9 100644
--- a/code/modules/mob/living/silicon/pai/software_modules.dm
+++ b/code/modules/mob/living/silicon/pai/software_modules.dm
@@ -65,7 +65,7 @@
var/answer = input(M, "[P] is requesting a DNA sample from you. Will you allow it to confirm your identity?", "[P] Check DNA", "No") in list("Yes", "No")
if(answer == "Yes")
var/turf/T = get_turf_or_move(P.loc)
- for (var/mob/v in viewers(T))
+ for(var/mob/v in viewers(T))
v.show_message("[M] presses \his thumb against [P]. ", 3, "[P] makes a sharp clicking sound as it extracts DNA material from [M]. ", 2)
var/datum/dna/dna = M.dna
to_chat(P, "[M]'s UE string : [dna.unique_enzymes] ")
@@ -296,7 +296,7 @@
return
t = sanitize(copytext(t, 1, MAX_MESSAGE_LEN))
t = readd_quotes(t)
- if (!t)
+ if(!t)
return
M.current_room.topic = t
@@ -329,7 +329,7 @@
return
t = sanitize(copytext(t, 1, MAX_MESSAGE_LEN))
t = readd_quotes(t)
- if (!t || !P.pda.can_use())
+ if(!t || !P.pda.can_use())
return
target.post(M, t)
@@ -380,12 +380,12 @@
if(record)
var/datum/data/record/R = record
var/datum/data/record/M = null
- if (!( data_core.general.Find(R) ))
+ if(!( data_core.general.Find(R) ))
P.medical_cannotfind = 1
else
P.medical_cannotfind = 0
for(var/datum/data/record/E in data_core.medical)
- if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
+ if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
M = E
P.medicalActive1 = R
P.medicalActive2 = M
@@ -434,14 +434,14 @@
if(record)
var/datum/data/record/R = record
var/datum/data/record/S = null
- if (!( data_core.general.Find(R) ))
+ if(!( data_core.general.Find(R) ))
P.securityActive1 = null
P.securityActive2 = null
P.security_cannotfind = 1
else
P.security_cannotfind = 0
for(var/datum/data/record/E in data_core.security)
- if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
+ if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
S = E
P.securityActive1 = R
P.securityActive2 = S
@@ -670,7 +670,7 @@
if(href_list["send"])
P.sradio.send_signal("ACTIVATE")
for(var/mob/O in hearers(1, P.loc))
- O.show_message(text("\icon[] *beep* *beep*", P), 3, "*beep* *beep*", 2)
+ O.show_message("[bicon(P)] *beep* *beep*", 3, "*beep* *beep*", 2)
return 1
else if(href_list["freq"])
diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm
index c6ae0f57ddf..f51325f546b 100644
--- a/code/modules/mob/living/silicon/robot/component.dm
+++ b/code/modules/mob/living/silicon/robot/component.dm
@@ -7,8 +7,8 @@
var/toggled = 1
var/brute_damage = 0
var/electronics_damage = 0
- var/energy_consumption = 0
var/max_damage = 30
+ var/component_disabled = 0
var/mob/living/silicon/robot/owner
// The actual device object that has to be installed for this.
@@ -51,28 +51,22 @@
electronics_damage = max(0, electronics_damage - electronics)
/datum/robot_component/proc/is_powered()
- return (installed == 1) && (brute_damage + electronics_damage < max_damage) && (!energy_consumption || powered)
+ return (installed == 1) && (brute_damage + electronics_damage < max_damage) && (powered)
/datum/robot_component/proc/consume_power()
if(toggled == 0)
powered = 0
return
- if(owner.cell.charge >= energy_consumption)
- owner.cell.use(energy_consumption)
- powered = 1
- else
- powered = 0
+ powered = 1
/datum/robot_component/armour
name = "armour plating"
- energy_consumption = 0
external_type = /obj/item/robot_parts/robot_component/armour
max_damage = 100
/datum/robot_component/actuator
name = "actuator"
- energy_consumption = 1
external_type = /obj/item/robot_parts/robot_component/actuator
max_damage = 50
@@ -87,24 +81,20 @@
/datum/robot_component/radio
name = "radio"
external_type = /obj/item/robot_parts/robot_component/radio
- energy_consumption = 1
max_damage = 40
/datum/robot_component/binary_communication
name = "binary communication device"
external_type = /obj/item/robot_parts/robot_component/binary_communication_device
- energy_consumption = 0
max_damage = 30
/datum/robot_component/camera
name = "camera"
external_type = /obj/item/robot_parts/robot_component/camera
- energy_consumption = 1
max_damage = 40
/datum/robot_component/diagnosis_unit
name = "self-diagnosis unit"
- energy_consumption = 1
external_type = /obj/item/robot_parts/robot_component/diagnosis_unit
max_damage = 30
@@ -121,7 +111,13 @@
/mob/living/silicon/robot/proc/is_component_functioning(module_name)
var/datum/robot_component/C = components[module_name]
- return C && C.installed == 1 && C.toggled && C.is_powered()
+ return C && C.installed == 1 && C.toggled && C.is_powered() && !C.component_disabled
+
+/mob/living/silicon/robot/proc/disable_component(module_name, duration)
+ var/datum/robot_component/D = get_component(module_name)
+ D.component_disabled++
+ spawn(duration)
+ D.component_disabled--
// Returns component by it's string name
/mob/living/silicon/robot/proc/get_component(var/component_name)
@@ -175,7 +171,7 @@
flags = CONDUCT
slot_flags = SLOT_BELT
throwforce = 3
- w_class = 2.0
+ w_class = 2
throw_speed = 5
throw_range = 10
origin_tech = "magnets=1;biotech=1"
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index 9a5c1a9f4d5..1089e05862a 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -111,11 +111,11 @@
to_chat(user, "\red The maintenance drone chassis not compatible with \the [W].")
return
- else if (istype(W, /obj/item/weapon/crowbar))
+ else if(istype(W, /obj/item/weapon/crowbar))
to_chat(user, "The machine is hermetically sealed. You can't open the case.")
return
- else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
+ else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
if(stat == 2)
@@ -253,6 +253,8 @@
/mob/living/silicon/robot/drone/proc/request_player()
for(var/mob/dead/observer/O in player_list)
+ if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
+ continue
if(jobban_isbanned(O,"nonhumandept") || jobban_isbanned(O,"Drone"))
continue
if(O.client)
@@ -301,7 +303,7 @@
/mob/living/silicon/robot/drone/Bump(atom/movable/AM as mob|obj, yes)
- if (!yes || ( \
+ if(!yes || ( \
!istype(AM,/obj/machinery/door) && \
!istype(AM,/obj/machinery/recharge_station) && \
!istype(AM,/obj/machinery/disposal/deliveryChute) && \
@@ -335,7 +337,7 @@
/mob/living/silicon/robot/drone/remove_robot_verbs()
src.verbs -= silicon_subsystems
-/mob/living/silicon/robot/drone/update_canmove()
+/mob/living/silicon/robot/drone/update_canmove(delay_action_updates = 0)
. = ..()
density = 0 //this is reset every canmove update otherwise
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
index 151fc6de51d..d450d508bd3 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_abilities.dm
@@ -26,7 +26,7 @@
set desc = "Allows you to hide beneath tables or certain items. Toggled on or off."
set category = "Drone"
- if (layer != TURF_LAYER+0.2)
+ if(layer != TURF_LAYER+0.2)
layer = TURF_LAYER+0.2
to_chat(src, text("\blue You are now hiding."))
else
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm
index 5e7077f7000..f9be6f13413 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm
@@ -57,10 +57,10 @@
to_chat(usr, "\red Access denied.")
return
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
- if (href_list["setarea"])
+ if(href_list["setarea"])
//Probably should consider using another list, but this one will do.
var/t_area = input("Select the area to ping.", "Set Target Area", null) as null|anything in TAGGERLOCATIONS
@@ -71,14 +71,14 @@
drone_call_area = t_area
to_chat(usr, "\blue You set the area selector to [drone_call_area].")
- else if (href_list["ping"])
+ else if(href_list["ping"])
to_chat(usr, "\blue You issue a maintenance request for all active drones, highlighting [drone_call_area].")
for(var/mob/living/silicon/robot/drone/D in world)
if(D.client && D.stat == 0)
to_chat(D, "-- Maintenance drone presence requested in: [drone_call_area].")
- else if (href_list["resync"])
+ else if(href_list["resync"])
var/mob/living/silicon/robot/drone/D = locate(href_list["resync"])
@@ -86,7 +86,7 @@
to_chat(usr, "\red You issue a law synchronization directive for the drone.")
D.law_resync()
- else if (href_list["shutdown"])
+ else if(href_list["shutdown"])
var/mob/living/silicon/robot/drone/D = locate(href_list["shutdown"])
@@ -96,7 +96,7 @@
log_game("[key_name(usr)] issued kill order for [key_name(src)] from control console.")
D.shut_down()
- else if (href_list["search_fab"])
+ else if(href_list["search_fab"])
if(dronefab)
return
@@ -111,7 +111,7 @@
to_chat(usr, "\red Unable to locate drone fabricator.")
- else if (href_list["toggle_fab"])
+ else if(href_list["toggle_fab"])
if(!dronefab)
return
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
index b5026a882fe..b6a932a52ec 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
@@ -222,7 +222,7 @@
for(var/obj/W in T)
//Different classes of items give different commodities.
- if (istype(W,/obj/item/weapon/cigbutt))
+ if(istype(W,/obj/item/weapon/cigbutt))
stored_comms["plastic"]++
else if(istype(W,/obj/effect/spider/spiderling))
stored_comms["wood"]++
@@ -270,7 +270,7 @@
stored_comms["glass"]++
stored_comms["glass"]++
stored_comms["glass"]++
- else if (istype(W,/obj/item/weapon/light/tube) || istype(W,/obj/item/weapon/light/bulb))
+ else if(istype(W,/obj/item/weapon/light/tube) || istype(W,/obj/item/weapon/light/bulb))
stored_comms["glass"]++
else
continue
@@ -310,11 +310,11 @@
var/tools = "Tools and devices "
var/resources = "Resources "
- for (var/O in module.modules)
+ for(var/O in module.modules)
var/module_string = ""
- if (!O)
+ if(!O)
module_string += text("Resource depleted ")
else if(activated(O))
module_string += text("[O]: Activated ")
@@ -328,8 +328,8 @@
dat += tools
- if (emagged)
- if (!module.emag)
+ if(emagged)
+ if(!module.emag)
dat += text("Resource depleted ")
else if(activated(module.emag))
dat += text("[module.emag]: Activated ")
@@ -344,7 +344,7 @@
/mob/living/silicon/robot/drone/use_power()
..()
- if(!src.has_power || !decompiler)
+ if(low_power_mode || !decompiler)
return
//The decompiler replenishes drone stores from hoovered-up junk each tick.
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
index 881fde51dee..3a316b0140b 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
@@ -19,7 +19,7 @@
..()
/obj/machinery/drone_fabricator/power_change()
- if (powered())
+ if(powered())
stat &= ~NOPOWER
else
icon_state = "drone_fab_nopower"
@@ -88,10 +88,10 @@
to_chat(src, "\red That verb is not currently permitted.")
return
- if (!src.stat)
+ if(!src.stat)
return
- if (usr != src)
+ if(usr != src)
return 0 //something is terribly wrong
if(jobban_isbanned(src,"nonhumandept") || jobban_isbanned(src,"Drone"))
@@ -128,7 +128,7 @@
pluralcheck = " [deathtimeminutes] minutes and"
var/deathtimeseconds = round((deathtime - deathtimeminutes * 600) / 10,1)
- if (deathtime < 6000 && joinedasobserver == 0)
+ if(deathtime < 6000 && joinedasobserver == 0)
to_chat(usr, "You have been dead for[pluralcheck] [deathtimeseconds] seconds.")
to_chat(usr, "You must wait 10 minutes to respawn as a drone! ")
return
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_say.dm b/code/modules/mob/living/silicon/robot/drone/drone_say.dm
index 9ce0b6c027e..5d00d45f97c 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_say.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_say.dm
@@ -1,15 +1,15 @@
/mob/living/silicon/robot/drone/say(var/message)
if(local_transmit)
- if (src.client)
+ if(src.client)
if(client.prefs.muted & MUTE_IC)
to_chat(src, "You cannot send IC messages (muted).")
return 0
- if (src.client.handle_spam_prevention(message,MUTE_IC))
+ if(src.client.handle_spam_prevention(message,MUTE_IC))
return 0
message = sanitize(message)
- if (stat == 2)
+ if(stat == 2)
return say_dead(message)
if(copytext(message,1,2) == "*")
@@ -21,7 +21,7 @@
return L.broadcast(src,trim(copytext(message,2)))
//Must be concious to speak
- if (stat)
+ if(stat)
return 0
var/list/listeners = hearers(5,src)
@@ -31,8 +31,8 @@
if(D.client && D.local_transmit)
to_chat(D, "[src] transmits, \"[message]\"")
- for (var/mob/M in player_list)
- if (istype(M, /mob/new_player))
+ for(var/mob/M in player_list)
+ if(istype(M, /mob/new_player))
continue
else if(M.stat == 2 && M.client && M.client.prefs.toggles & CHAT_GHOSTEARS)
to_chat(M, "[src] transmits, \"[message]\"")
diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm
new file mode 100644
index 00000000000..bf7f413708f
--- /dev/null
+++ b/code/modules/mob/living/silicon/robot/emote.dm
@@ -0,0 +1,174 @@
+/mob/living/silicon/robot/emote(var/act, var/m_type=1, var/message = null)
+ var/param = null
+ if(findtext(act, "-", 1, null))
+ var/t1 = findtext(act, "-", 1, null)
+ param = copytext(act, t1 + 1, length(act) + 1)
+ act = copytext(act, 1, t1)
+
+ //Emote Cooldown System (it's so simple!)
+ // proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
+ var/on_CD = 0
+ act = lowertext(act)
+ switch(act)
+ //Cooldown-inducing emotes
+ if("law","flip","flips","halt") //halt is exempt because it's used to stop criminal scum //WHOEVER THOUGHT THAT WAS A GOOD IDEA IS GOING TO GET SHOT.
+ on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
+ //Everything else, including typos of the above emotes
+ else
+ on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown
+
+ if(on_CD == 1) // Check if we need to suppress the emote attempt.
+ return // Suppress emote, you're still cooling off.
+ //--FalseIncarnate
+
+ switch(act)
+
+ if("salute","salutes")
+ if(!src.buckled)
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] salutes to [param]."
+ else
+ message = "[src] salutes."
+ m_type = 1
+ if("bow","bows")
+ if(!src.buckled)
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] bows to [param]."
+ else
+ message = "[src] bows."
+ m_type = 1
+
+ if("clap","claps")
+ if(!src.restrained())
+ message = "[src] claps."
+ m_type = 2
+ if("flap","flaps")
+ if(!src.restrained())
+ message = "[src] flaps its wings."
+ m_type = 2
+
+ if("aflap","aflaps")
+ if(!src.restrained())
+ message = "[src] flaps its wings ANGRILY!"
+ m_type = 2
+
+ if("twitch")
+ message = "[src] twitches violently."
+ m_type = 1
+
+ if("twitch_s","twitches")
+ message = "[src] twitches."
+ m_type = 1
+
+ if("nod","nods")
+ message = "[src] nods."
+ m_type = 1
+
+ if("deathgasp")
+ message = "[src] shudders violently for a moment, then becomes motionless, its eyes slowly darkening."
+ m_type = 1
+
+ if("glare","glares")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] glares at [param]."
+ else
+ message = "[src] glares."
+
+ if("stare","stares")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] stares at [param]."
+ else
+ message = "[src] stares."
+
+ if("look","looks")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] looks at [param]."
+ else
+ message = "[src] looks."
+ m_type = 1
+
+
+ if("law")
+ if(istype(module,/obj/item/weapon/robot_module/security))
+ message = "[src] shows its legal authorization barcode."
+
+ playsound(src.loc, 'sound/voice/biamthelaw.ogg', 50, 0)
+ m_type = 2
+ else
+ to_chat(src, "You are not THE LAW, pal.")
+
+ if("halt")
+ if(istype(module,/obj/item/weapon/robot_module/security))
+ message = "[src] 's speakers skreech, \"Halt! Security!\"."
+
+ playsound(src.loc, 'sound/voice/halt.ogg', 50, 0)
+ m_type = 2
+ else
+ to_chat(src, "You are not security.")
+
+ if("flip","flips")
+ m_type = 1
+ message = "[src] does a flip!"
+ src.SpinAnimation(5,1)
+
+ if("help")
+ to_chat(src, "salute, bow-(none)/mob, clap, flap, aflap, twitch, twitches, nod, deathgasp, glare-(none)/mob, stare-(none)/mob, look,\n law, halt")
+
+ ..(act, m_type, message)
+
+/mob/living/silicon/robot/verb/powerwarn()
+ set category = "Robot Commands"
+ set name = "Power Warning"
+
+ if(!is_component_functioning("power cell") || !cell || !cell.charge)
+ visible_message("The power warning light on [src] flashes urgently.",\
+ "You announce you are operating in low power mode.")
+ playsound(loc, 'sound/machines/buzz-two.ogg', 50, 0)
+ else
+ to_chat(src, "You can only use this emote when you're out of charge. ")
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm
index 8d2af648463..cb207932a9a 100644
--- a/code/modules/mob/living/silicon/robot/examine.dm
+++ b/code/modules/mob/living/silicon/robot/examine.dm
@@ -1,45 +1,51 @@
/mob/living/silicon/robot/examine(mob/user)
+ to_chat(user, "*---------* ")
..(user)
- var/msg = ""
+ var/msg = ""
var/obj/act_module = get_active_hand()
if(act_module)
- msg += "It is holding \icon[act_module] \a [act_module].\n"
+ msg += "It is holding [bicon(act_module)] \a [act_module].\n"
msg += ""
- if (src.getBruteLoss())
- if (src.getBruteLoss() < 75)
+ if(getBruteLoss())
+ if(getBruteLoss() < maxHealth*0.5)
msg += "It looks slightly dented.\n"
else
msg += "It looks severely dented! \n"
- if (src.getFireLoss())
- if (src.getFireLoss() < 75)
+ if(getFireLoss())
+ if(getFireLoss() < maxHealth*0.5)
msg += "It looks slightly charred.\n"
else
msg += "It looks severely burnt and heat-warped! \n"
- if (src.fire_stacks < 0)
+ if(health < -maxHealth*0.5)
+ msg += "It looks barely operational.\n"
+ if(fire_stacks < 0)
msg += "It's covered in water.\n"
- if (src.fire_stacks > 0)
+ else if(fire_stacks > 0)
msg += "It's coated in something flammable.\n"
msg += " "
if(opened)
msg += "Its cover is open and the power cell is [cell ? "installed" : "missing"]. \n"
else
- msg += "Its cover is closed.\n"
+ msg += "Its cover is closed[locked ? "" : ", and looks unlocked"].\n"
- if(!has_power)
- msg += "It appears to be running on backup power. \n"
+ if(cell && cell.charge <= 0)
+ msg += "Its battery indicator is blinking red! \n"
- switch(src.stat)
+ switch(stat)
if(CONSCIOUS)
- if(!src.client) msg += "It appears to be in stand-by mode.\n" //afk
- if(UNCONSCIOUS) msg += "It doesn't seem to be responding. \n"
- if(DEAD) msg += "It looks completely unsalvageable. \n"
+ if(!client)
+ msg += "It appears to be in stand-by mode.\n" //afk
+ if(UNCONSCIOUS)
+ msg += "It doesn't seem to be responding. \n"
+ if(DEAD)
+ msg += "It looks like its system is corrupted and requires a reset. \n"
msg += "*---------* "
if(print_flavor_text()) msg += "\n[print_flavor_text()]\n"
- if (pose)
+ if(pose)
if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 )
pose = addtext(pose,".") //Makes sure all emotes end with a period.
msg += "\nIt is [pose]"
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index 7e824eeb279..d843203ebc3 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -45,7 +45,7 @@
if(activated(O))
to_chat(src, "Already activated")
return
- if (is_component_functioning("power cell") && cell)
+ if(is_component_functioning("power cell") && cell)
if(istype(O, /obj/item/borg))
var/obj/item/borg/B = O
if(B.powerneeded)
diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm
index bc575831537..2a62a0b1cc4 100644
--- a/code/modules/mob/living/silicon/robot/laws.dm
+++ b/code/modules/mob/living/silicon/robot/laws.dm
@@ -7,12 +7,12 @@
laws_sanity_check()
var/who
- if (everyone)
+ if(everyone)
who = world
else
who = src
if(lawupdate)
- if (connected_ai)
+ if(connected_ai)
if(connected_ai.stat || connected_ai.control_disabled)
to_chat(src, "AI signal lost, unable to sync laws. ")
@@ -30,11 +30,11 @@
to_chat(who, "Obey these laws: ")
laws.show_laws(who)
// TODO: Update to new antagonist system.
- if (mind && (mind.special_role == "traitor" && mind.original == src) && connected_ai)
+ if(mind && (mind.special_role == "traitor" && mind.original == src) && connected_ai)
to_chat(who, "Remember, [connected_ai.name] is technically your master, but your objective comes first. ")
- else if (connected_ai)
+ else if(connected_ai)
to_chat(who, "Remember, [connected_ai.name] is your master, other AIs can be ignored. ")
- else if (emagged)
+ else if(emagged)
to_chat(who, "Remember, you are not required to listen to the AI. ")
else
to_chat(who, "Remember, you are not bound to any AI, you are not required to listen to them. ")
@@ -43,7 +43,7 @@
/mob/living/silicon/robot/lawsync()
laws_sanity_check()
var/datum/ai_laws/master = connected_ai && lawupdate ? connected_ai.laws : null
- if (master)
+ if(master)
master.sync(src)
..()
return
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index fa534b66123..b2c8857f040 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -2,14 +2,14 @@
set invisibility = 0
set background = BACKGROUND_ENABLED
- if (src.notransform)
+ if(src.notransform)
return
//Status updates, death etc.
clamp_values()
if(..())
- use_power()
+ handle_robot_cell()
process_locks()
process_queued_alarms()
@@ -17,60 +17,34 @@
SetStunned(min(stunned, 30))
SetParalysis(min(paralysis, 30))
SetWeakened(min(weakened, 20))
- sleeping = 0
- ear_deaf = 0
+ SetSleeping(0)
+/mob/living/silicon/robot/proc/handle_robot_cell()
+ if(stat != DEAD)
+ if(!is_component_functioning("power cell") || !cell)
+ Paralyse(2)
+ uneq_all()
+ low_power_mode = 1
+ update_headlamp()
+ diag_hud_set_borgcell()
+ return
+ if(low_power_mode)
+ if(is_component_functioning("power cell") && cell && cell.charge)
+ low_power_mode = 0
+ update_headlamp()
+ else if(stat == CONSCIOUS)
+ use_power()
/mob/living/silicon/robot/proc/use_power()
- if (stat == DEAD)
- return
- else if (is_component_functioning("power cell") && cell)
- if(module)
- for(var/obj/item/borg/B in get_all_slots())
- if(B.powerneeded)
- if((cell.charge * 100 / cell.maxcharge) < B.powerneeded)
- to_chat(src, "Deactivating [B.name] due to lack of power!")
- uneq_module(B)
- if(cell.charge <= 0)
+ if(is_component_functioning("power cell") && cell && cell.charge)
+ if(cell.charge <= 100)
uneq_all()
- update_headlamp(1)
- stat = UNCONSCIOUS
- has_power = 0
- for(var/V in components)
- var/datum/robot_component/C = components[V]
- if(C.name == "actuator") // Let drained robots move, disable the rest
- continue
- C.consume_power()
- else if(cell.charge <= 100)
- uneq_all()
- cell.use(1)
- else
- if(module_state_1)
- cell.use(4)
- if(module_state_2)
- cell.use(4)
- if(module_state_3)
- cell.use(4)
-
- for(var/V in components)
- var/datum/robot_component/C = components[V]
- C.consume_power()
-
- var/amt = Clamp((lamp_intensity - 2) * 2,1,cell.charge) //Always try to use at least one charge per tick, but allow it to completely drain the cell.
- cell.use(amt) //Usage table: 1/tick if off/lowest setting, 4 = 4/tick, 6 = 8/tick, 8 = 12/tick, 10 = 16/tick
-
- if(!is_component_functioning("actuator"))
- Paralyse(3)
- eye_blind = 0
- // Please, PLEASE be careful with statements like this - make sure they're not
- // dead beforehand, for example -- Crazylemon
- stat = CONSCIOUS
- has_power = 1
+ var/amt = Clamp((lamp_intensity - 2) * 2,1,cell.charge) //Always try to use at least one charge per tick, but allow it to completely drain the cell.
+ cell.use(amt) //Usage table: 1/tick if off/lowest setting, 4 = 4/tick, 6 = 8/tick, 8 = 12/tick, 10 = 16/tick
else
uneq_all()
- stat = UNCONSCIOUS
- update_headlamp(1)
- Paralyse(3)
+ low_power_mode = 1
+ update_headlamp()
diag_hud_set_borgcell()
/mob/living/silicon/robot/handle_regular_status_updates()
@@ -232,7 +206,7 @@
/mob/living/silicon/robot/proc/update_items()
- if (client)
+ if(client)
for(var/obj/I in get_all_slots())
client.screen |= I
if(module_state_1)
@@ -253,12 +227,14 @@
weapon_lock = 0
weaponlock_time = 120
-/mob/living/silicon/robot/update_canmove()
+/mob/living/silicon/robot/update_canmove(delay_action_updates = 0)
if(paralysis || stunned || weakened || buckled || lockcharge)
canmove = 0
else
canmove = 1
update_transform()
+ if(!delay_action_updates)
+ update_action_buttons_icon()
return canmove
//Robots on fire
diff --git a/code/modules/mob/living/silicon/robot/photos.dm b/code/modules/mob/living/silicon/robot/photos.dm
index 33f739c41c9..88bf9c50990 100644
--- a/code/modules/mob/living/silicon/robot/photos.dm
+++ b/code/modules/mob/living/silicon/robot/photos.dm
@@ -1,12 +1,12 @@
/mob/living/silicon/robot/proc/photosync()
var/obj/item/device/camera/siliconcam/master_cam = connected_ai ? connected_ai.aiCamera : null
- if (!master_cam)
+ if(!master_cam)
return
var/synced
synced = 0
for(var/datum/picture/z in aiCamera.aipictures)
- if (!(master_cam.aipictures.Find(z)))
+ if(!(master_cam.aipictures.Find(z)))
aiCamera.printpicture(null, z)
synced = 1
if(synced)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 81c781b51ff..b7f3eec50bc 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -21,6 +21,7 @@ var/list/robot_verbs_default = list(
var/obj/screen/inv2 = null
var/obj/screen/inv3 = null
var/obj/screen/lamp_button = null
+ var/obj/screen/thruster_button = null
var/shown_robot_modules = 0 //Used to determine whether they have the module menu shown or not
var/obj/screen/robot_modules_background
@@ -57,11 +58,9 @@ var/list/robot_verbs_default = list(
var/viewalerts = 0
var/modtype = "Default"
var/lower_mod = 0
- var/jetpack = 0
- var/datum/effect/system/ion_trail_follow/ion_trail = null
var/datum/effect/system/spark_spread/spark_system//So they can initialize sparks whenever/N
var/jeton = 0
- var/has_power = 1
+ var/low_power_mode = 0 //whether the robot has no charge left.
var/weapon_lock = 0
var/weaponlock_time = 120
var/lawupdate = 1 //Cyborgs will sync their laws with their AI by default
@@ -81,12 +80,16 @@ var/list/robot_verbs_default = list(
hud_possible = list(SPECIALROLE_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD,NATIONS_HUD)
- var/jetpackoverlay = 0
var/magpulse = 0
+ var/ionpulse = 0 // Jetpack-like effect.
+ var/ionpulse_on = 0 // Jetpack-like effect.
+ var/datum/effect/system/ion_trail_follow/ion_trail // Ionpulse effect.
var/obj/item/borg/sight/hud/sec/sechud = null
var/obj/item/borg/sight/hud/med/healthhud = null
+ var/datum/action/item_action/toggle_research_scanner/scanner = null
+
/mob/living/silicon/robot/New(loc,var/syndie = 0,var/unfinished = 0, var/alien = 0)
spark_system = new /datum/effect/system/spark_spread()
spark_system.set_up(5, 0, src)
@@ -143,6 +146,7 @@ var/list/robot_verbs_default = list(
cell_component.installed = 1
diag_hud_set_borgcell()
+ scanner = new(src)
scanner.Grant(src)
/mob/living/silicon/robot/proc/init(var/alien=0)
@@ -168,7 +172,7 @@ var/list/robot_verbs_default = list(
setup_PDA()
//We also need to update name of internal camera.
- if (camera)
+ if(camera)
camera.c_tag = newname
//Check for custom sprite
@@ -221,7 +225,7 @@ var/list/robot_verbs_default = list(
// setup the PDA and its name
/mob/living/silicon/robot/proc/setup_PDA()
- if (!rbPDA)
+ if(!rbPDA)
rbPDA = new(src)
rbPDA.set_name_and_job(real_name, braintype)
if(scrambledcodes)
@@ -231,8 +235,6 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/binarycheck()
if(is_component_functioning("comms"))
- var/datum/robot_component/RC = get_component("comms")
- use_power(RC.energy_consumption)
return 1
return 0
@@ -316,7 +318,7 @@ var/list/robot_verbs_default = list(
if(camera && "Robots" in camera.network)
camera.network.Add("Medical")
module_sprites["Basic"] = "Medbot"
- module_sprites["Standard"] = "surgeon"
+ module_sprites["Surgeon"] = "surgeon"
module_sprites["Advanced Droid"] = "droid-medical"
module_sprites["Needles"] = "medicalrobot"
module_sprites["Standard"] = "robotMedi"
@@ -375,7 +377,7 @@ var/list/robot_verbs_default = list(
module.add_subsystems(src)
//Custom_sprite check and entry
- if (custom_sprite == 1)
+ if(custom_sprite == 1)
module_sprites["Custom"] = "[src.ckey]-[modtype]"
hands.icon_state = lowertext(module.module_type)
@@ -411,9 +413,9 @@ var/list/robot_verbs_default = list(
return null
var/dat = "[src.name] Self-Diagnosis Report \n"
- for (var/V in components)
+ for(var/V in components)
var/datum/robot_component/C = components[V]
- dat += "[C.name] Power consumption [C.energy_consumption] Brute Damage: [C.brute_damage] Electronics Damage: [C.electronics_damage] Powered: [(!C.energy_consumption || C.is_powered()) ? "Yes" : "No"] Toggled: [ C.toggled ? "Yes" : "No"]
"
+ dat += "[C.name] Brute Damage: [C.brute_damage] Electronics Damage: [C.electronics_damage] Powered: [C.is_powered() ? "Yes" : "No"] Toggled: [ C.toggled ? "Yes" : "No"]
"
return dat
@@ -466,8 +468,37 @@ var/list/robot_verbs_default = list(
src.verbs -= robot_verbs_default
src.verbs -= silicon_subsystems
+/mob/living/silicon/robot/proc/ionpulse()
+ if(!ionpulse_on)
+ return
+
+ if(cell.charge <= 50)
+ toggle_ionpulse()
+ return
+
+ cell.charge -= 50 // 500 steps on a default cell.
+ return 1
+
+/mob/living/silicon/robot/proc/toggle_ionpulse()
+ if(!ionpulse)
+ to_chat(src, "No thrusters are installed! ")
+ return
+
+ if(!ion_trail)
+ ion_trail = new
+ ion_trail.set_up(src)
+
+ ionpulse_on = !ionpulse_on
+ to_chat(src, "You [ionpulse_on ? null :"de"]activate your ion thrusters. ")
+ if(ionpulse_on)
+ ion_trail.start()
+ else
+ ion_trail.stop()
+ if(thruster_button)
+ thruster_button.icon_state = "ionpulse[ionpulse_on]"
+
/mob/living/silicon/robot/blob_act()
- if (stat != 2)
+ if(stat != 2)
adjustBruteLoss(60)
updatehealth()
return 1
@@ -481,7 +512,7 @@ var/list/robot_verbs_default = list(
..()
if(ticker && ticker.mode.name == "AI malfunction")
var/datum/game_mode/malfunction/malf = ticker.mode
- for (var/datum/mind/malfai in malf.malf_ai)
+ for(var/datum/mind/malfai in malf.malf_ai)
if(connected_ai)
if(connected_ai.mind == malfai)
if(malf.apcs >= 3)
@@ -490,23 +521,6 @@ var/list/robot_verbs_default = list(
stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]")
return 0
-
-// this function displays jetpack pressure in the stat panel
-/mob/living/silicon/robot/proc/show_jetpack_pressure()
- // if you have a jetpack, show the internal tank pressure
- var/obj/item/weapon/tank/jetpack/current_jetpack = installed_jetpack()
- if (current_jetpack)
- stat("Internal Atmosphere Info", current_jetpack.name)
- stat("Tank Pressure", current_jetpack.air_contents.return_pressure())
-
-
-// this function returns the robots jetpack, if one is installed
-/mob/living/silicon/robot/proc/installed_jetpack()
- if(module)
- return (locate(/obj/item/weapon/tank/jetpack) in module.modules)
- return 0
-
-
// this function displays the cyborgs current cell charge in the stat panel
/mob/living/silicon/robot/proc/show_cell_power()
if(cell)
@@ -519,9 +533,8 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/Stat()
..()
statpanel("Status")
- if (client.statpanel == "Status")
+ if(client.statpanel == "Status")
show_cell_power()
- show_jetpack_pressure()
/mob/living/silicon/robot/restrained()
return 0
@@ -533,11 +546,11 @@ var/list/robot_verbs_default = list(
gib()
return
if(2.0)
- if (stat != 2)
+ if(stat != 2)
adjustBruteLoss(60)
adjustFireLoss(60)
if(3.0)
- if (stat != 2)
+ if(stat != 2)
adjustBruteLoss(30)
return
@@ -551,7 +564,7 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/Bump(atom/movable/AM as mob|obj, yes)
spawn( 0 )
- if ((!( yes ) || now_pushing))
+ if((!( yes ) || now_pushing))
return
now_pushing = 1
if(ismob(AM))
@@ -566,13 +579,13 @@ var/list/robot_verbs_default = list(
return
now_pushing = 0
..()
- if (!istype(AM, /atom/movable))
+ if(!istype(AM, /atom/movable))
return
- if (!now_pushing)
+ if(!now_pushing)
now_pushing = 1
- if (!AM.anchored)
+ if(!AM.anchored)
var/t = get_dir(src, AM)
- if (istype(AM, /obj/structure/window/full))
+ if(istype(AM, /obj/structure/window/full))
for(var/obj/structure/window/win in get_step(AM,t))
now_pushing = 0
return
@@ -582,7 +595,7 @@ var/list/robot_verbs_default = list(
return
/mob/living/silicon/robot/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/restraints/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do
+ if(istype(W, /obj/item/weapon/restraints/handcuffs)) // fuck i don't even know why isrobot() in handcuff code isn't working so this will have to do
return
if(opened) // Are they trying to insert something?
@@ -604,15 +617,15 @@ var/list/robot_verbs_default = list(
return
- if (istype(W, /obj/item/weapon/weldingtool) && user.a_intent == I_HELP)
+ if(istype(W, /obj/item/weapon/weldingtool) && user.a_intent == I_HELP)
if(W == module_active)
return
- if (!getBruteLoss())
+ if(!getBruteLoss())
to_chat(user, "Nothing to fix! ")
return
var/obj/item/weapon/weldingtool/WT = W
user.changeNext_move(CLICK_CD_MELEE)
- if (WT.remove_fuel(0))
+ if(WT.remove_fuel(0))
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
adjustBruteLoss(-30)
updatehealth()
@@ -624,7 +637,7 @@ var/list/robot_verbs_default = list(
else if(istype(W, /obj/item/stack/cable_coil) && user.a_intent == I_HELP && (wiresexposed || istype(src,/mob/living/silicon/robot/drone)))
- if (!getFireLoss())
+ if(!getFireLoss())
to_chat(user, "Nothing to fix! ")
return
var/obj/item/stack/cable_coil/coil = W
@@ -634,7 +647,7 @@ var/list/robot_verbs_default = list(
coil.use(1)
user.visible_message("\The [user] fixes some of the burnt wires on \the [src] with \the [coil]. ")
- else if (istype(W, /obj/item/weapon/crowbar)) // crowbar means open or close the cover
+ else if(istype(W, /obj/item/weapon/crowbar)) // crowbar means open or close the cover
if(opened)
if(cell)
to_chat(user, "You close the cover.")
@@ -693,7 +706,7 @@ var/list/robot_verbs_default = list(
opened = 1
update_icons()
- else if (istype(W, /obj/item/weapon/stock_parts/cell) && opened) // trying to put a cell inside
+ else if(istype(W, /obj/item/weapon/stock_parts/cell) && opened) // trying to put a cell inside
var/datum/robot_component/C = components["power cell"]
if(wiresexposed)
to_chat(user, "Close the panel first.")
@@ -713,8 +726,8 @@ var/list/robot_verbs_default = list(
C.electronics_damage = 0
diag_hud_set_borgcell()
- else if (istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/multitool))
- if (wiresexposed)
+ else if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/multitool))
+ if(wiresexposed)
wires.Interact(user)
else
to_chat(user, "You can't reach the wiring.")
@@ -737,7 +750,7 @@ var/list/robot_verbs_default = list(
else
to_chat(user, "Unable to locate a radio.")
- else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card
+ else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card
if(emagged)//still allow them to open the cover
to_chat(user, "The interface seems slightly damaged")
if(opened)
@@ -847,28 +860,28 @@ var/list/robot_verbs_default = list(
to_chat(usr, "You unlock your cover.")
/mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
- if (!ticker)
+ if(!ticker)
to_chat(M, "You cannot attack people before the game has started.")
return
- if (istype(loc, /turf) && istype(loc.loc, /area/start))
+ if(istype(loc, /turf) && istype(loc.loc, /area/start))
to_chat(M, "No attacking people at spawn, you jackass.")
return
switch(M.a_intent)
- if (I_HELP)
+ if(I_HELP)
for(var/mob/O in viewers(src, null))
- if ((O.client && !( O.blinded )))
+ if((O.client && !( O.blinded )))
O.show_message(text("[M] caresses [src]'s plating with its scythe like arm. "), 1)
- if (I_GRAB)
+ if(I_GRAB)
grabbedby(M)
- if (I_HARM)
+ if(I_HARM)
M.do_attack_animation(src)
var/damage = rand(10, 20)
- if (prob(90))
+ if(prob(90))
playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1)
visible_message("[M] has slashed at [src]! ",\
"[M] has slashed at [src]! ")
@@ -881,10 +894,10 @@ var/list/robot_verbs_default = list(
visible_message("[M] took a swipe at [src]! ", \
"[M] took a swipe at [src]! ")
- if (I_DISARM)
+ if(I_DISARM)
if(!(lying))
M.do_attack_animation(src)
- if (prob(85))
+ if(prob(85))
Stun(7)
step(src,get_dir(M,src))
spawn(5)
@@ -960,7 +973,7 @@ var/list/robot_verbs_default = list(
diag_hud_set_borgcell()
if(!opened && (!istype(user, /mob/living/silicon)))
- if (user.a_intent == I_HELP)
+ if(user.a_intent == I_HELP)
user.visible_message("[user] pets [src]! ", \
"You pet [src]! ")
@@ -992,7 +1005,7 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/update_icons()
overlays.Cut()
- if(stat != DEAD && !(paralysis || stunned || weakened)) //Not dead, not stunned.
+ if(stat != DEAD && !(paralysis || stunned || weakened || low_power_mode)) //Not dead, not stunned.
overlays += "eyes-[icon_state]"
else
overlays -= "eyes"
@@ -1015,7 +1028,7 @@ var/list/robot_verbs_default = list(
var/combat = list("Combat","Peacekeeper")
if(modtype in combat)
- if (base_icon == "")
+ if(base_icon == "")
base_icon = icon_state
if(module_active && istype(module_active,/obj/item/borg/combat/mobility))
icon_state = "[base_icon]-roll"
@@ -1024,9 +1037,6 @@ var/list/robot_verbs_default = list(
for(var/obj/item/borg/combat/shield/S in module.modules)
if(activated(S))
overlays += "[base_icon]-shield"
-
- if(jetpackoverlay)
- overlays += "minerjetpack-[icon_state]"
update_fire()
/mob/living/silicon/robot/proc/installed_modules()
@@ -1050,14 +1060,14 @@ var/list/robot_verbs_default = list(
Installed Modules
"}
- for (var/obj in module.modules)
- if (!obj)
+ for(var/obj in module.modules)
+ if(!obj)
dat += text("Resource depleted ")
else if(activated(obj))
dat += text("[obj] Activated ")
else
dat += text("[obj] Activate ")
- if (emagged)
+ if(emagged)
if(activated(module.emag))
dat += text("[module.emag] Activated ")
else
@@ -1081,31 +1091,31 @@ var/list/robot_verbs_default = list(
if(usr != src)
return 1
- if (href_list["mach_close"])
+ if(href_list["mach_close"])
var/t1 = text("window=[href_list["mach_close"]]")
unset_machine()
src << browse(null, t1)
return 1
- if (href_list["showalerts"])
+ if(href_list["showalerts"])
subsystem_alarm_monitor()
return 1
- if (href_list["mod"])
+ if(href_list["mod"])
var/obj/item/O = locate(href_list["mod"])
- if (istype(O) && (O.loc == src))
+ if(istype(O) && (O.loc == src))
O.attack_self(src)
return 1
- if (href_list["act"])
+ if(href_list["act"])
var/obj/item/O = locate(href_list["act"])
- if (!istype(O) || !(O.loc == src || O.loc == src.module))
+ if(!istype(O) || !(O.loc == src || O.loc == src.module))
return 1
activate_module(O)
installed_modules()
- if (href_list["deact"])
+ if(href_list["deact"])
var/obj/item/O = locate(href_list["deact"])
if(activated(O))
if(module_state_1 == O)
@@ -1130,7 +1140,7 @@ var/list/robot_verbs_default = list(
radio.interact(src)//Just use the radio's Topic() instead of bullshit special-snowflake code
/mob/living/silicon/robot/proc/control_headlamp()
- if(stat || lamp_recharging)
+ if(stat || lamp_recharging || low_power_mode)
to_chat(src, "This function is currently offline. ")
return
@@ -1142,7 +1152,7 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/proc/update_headlamp(var/turn_off = 0, var/cooldown = 100)
set_light(0)
- if(lamp_intensity && (turn_off || stat))
+ if(lamp_intensity && (turn_off || stat || low_power_mode))
to_chat(src, "Your headlamp has been deactivated. ")
lamp_intensity = 0
lamp_recharging = 1
@@ -1173,7 +1183,7 @@ var/list/robot_verbs_default = list(
var/turf/tile = loc
if(isturf(tile))
tile.clean_blood()
- if (istype(tile, /turf/simulated))
+ if(istype(tile, /turf/simulated))
var/turf/simulated/S = tile
S.dirt = 0
for(var/A in tile)
@@ -1246,7 +1256,7 @@ var/list/robot_verbs_default = list(
set src = usr
var/obj/item/W = get_active_hand()
- if (W)
+ if(W)
W.attack_self(src)
return
@@ -1271,7 +1281,7 @@ var/list/robot_verbs_default = list(
var/icontype
- if (custom_sprite == 1)
+ if(custom_sprite == 1)
icontype = "Custom"
triesleft = 0
else
@@ -1292,7 +1302,7 @@ var/list/robot_verbs_default = list(
update_icons()
- if (triesleft >= 1)
+ if(triesleft >= 1)
var/choice = input("Look at your icon - is this what you want?") in list("Yes","No")
if(choice=="No")
choose_icon(triesleft, module_sprites)
@@ -1329,7 +1339,7 @@ var/list/robot_verbs_default = list(
sync()
/mob/living/silicon/robot/adjustOxyLoss(var/amount)
- if (suiciding)
+ if(suiciding)
..()
/mob/living/silicon/robot/regenerate_icons()
@@ -1345,6 +1355,7 @@ var/list/robot_verbs_default = list(
faction = list("nanotrasen")
designation = "Nanotrasen Combat"
req_access = list(access_cent_specops)
+ ionpulse = 1
var/searching_for_ckey = 0
/mob/living/silicon/robot/deathsquad/New(loc)
@@ -1392,6 +1403,7 @@ var/list/robot_verbs_default = list(
designation = "Syndicate Assault"
modtype = "Syndicate"
req_access = list(access_syndicate)
+ ionpulse = 1
lawchannel = "State"
var/playstyle_string = "You are a Syndicate assault cyborg! \
You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
@@ -1470,3 +1482,11 @@ var/list/robot_verbs_default = list(
status_flags &= ~CANPUSH
notify_ai(2)
+
+/mob/living/silicon/robot/emp_act(severity)
+ ..()
+ switch(severity)
+ if(1)
+ disable_component("comms", 160)
+ if(2)
+ disable_component("comms", 60)
diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm
index 54bc69b7020..2ef7f30e45b 100644
--- a/code/modules/mob/living/silicon/robot/robot_damage.dm
+++ b/code/modules/mob/living/silicon/robot/robot_damage.dm
@@ -4,12 +4,12 @@
stat = CONSCIOUS
return
health = maxHealth - (getOxyLoss() + getFireLoss() + getBruteLoss())
- if (stat == DEAD && health > 0)
+ if(stat == DEAD && health > 0)
update_revive()
var/mob/dead/observer/ghost = get_ghost()
if(ghost)
to_chat(ghost, "Your cyborg shell has been repaired, re-enter if you want to continue! (Verbs -> Ghost -> Re-enter corpse)")
- to_chat(ghost, sound('sound/effects/genetics.ogg'))
+ ghost << sound('sound/effects/genetics.ogg')
return
diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm
index 13c48d03ac5..84c07ee7c20 100644
--- a/code/modules/mob/living/silicon/robot/robot_items.dm
+++ b/code/modules/mob/living/silicon/robot/robot_items.dm
@@ -17,7 +17,7 @@
select_colour(user)
if("Mode")
- if (mode == 1)
+ if(mode == 1)
mode = 2
else
mode = 1
@@ -30,10 +30,10 @@
// see code\modules\paperwork\paper.dm line 62
/obj/item/weapon/pen/multi/robopen/proc/RenamePaper(mob/user as mob,obj/paper as obj)
- if ( !user || !paper )
+ if( !user || !paper )
return
var/n_name = input(user, "What would you like to label the paper?", "Paper Labelling", null) as text
- if ( !user || !paper )
+ if( !user || !paper )
return
n_name = copytext(n_name, 1, 32)
@@ -87,7 +87,7 @@
set src in range(0)
var/N = input("How much damage should the shield absorb?") in list("5","10","25","50","75","100")
- if (N)
+ if(N)
shield_level = text2num(N)/100
/obj/item/borg/combat/mobility
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 7fb1ba0a8aa..762efbcf02d 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -2,13 +2,12 @@
name = "robot module"
icon = 'icons/obj/module.dmi'
icon_state = "std_module"
- w_class = 100.0
+ w_class = 100
item_state = "electronic"
flags = CONDUCT
var/list/modules = list()
var/obj/item/emag = null
- var/obj/item/borg/upgrade/jetpack = null
var/list/subsystems = list()
var/module_type = "NoMod" // For icon usage
@@ -39,8 +38,6 @@
modules.Cut()
qdel(emag)
emag = null
- qdel(jetpack)
- jetpack = null
return ..()
/obj/item/weapon/robot_module/proc/fix_modules()
@@ -230,7 +227,7 @@
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/soap/nanotrasen(src)
src.modules += new /obj/item/weapon/storage/bag/trash/cyborg(src)
- src.modules += new /obj/item/weapon/mop(src)
+ src.modules += new /obj/item/weapon/mop/advanced/cyborg(src)
src.modules += new /obj/item/device/lightreplacer(src)
src.modules += new /obj/item/weapon/holosign_creator(src)
src.emag = new /obj/item/weapon/reagent_containers/spray(src)
@@ -316,16 +313,18 @@
module_type = "Miner"
/obj/item/weapon/robot_module/miner/New()
- src.modules += new /obj/item/device/flash/cyborg(src)
- src.modules += new /obj/item/borg/sight/meson(src)
- src.modules += new /obj/item/weapon/wrench(src)
- src.modules += new /obj/item/weapon/screwdriver(src)
- src.modules += new /obj/item/device/t_scanner/adv_mining_scanner/cyborg(src)
- src.modules += new /obj/item/weapon/storage/bag/ore/cyborg(src)
- src.modules += new /obj/item/weapon/pickaxe/drill/cyborg(src)
- src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src)
- src.modules += new /obj/item/weapon/gun/energy/kinetic_accelerator/cyborg(src)
- src.emag = new /obj/item/borg/stun(src)
+ modules += new /obj/item/device/flash/cyborg(src)
+ modules += new /obj/item/borg/sight/meson(src)
+ modules += new /obj/item/weapon/storage/bag/ore/cyborg(src)
+ modules += new /obj/item/weapon/pickaxe/drill/cyborg(src)
+ modules += new /obj/item/weapon/shovel(src)
+ modules += new /obj/item/weapon/weldingtool/mini(src)
+ modules += new /obj/item/weapon/extinguisher/mini(src)
+ modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src)
+ modules += new /obj/item/device/t_scanner/adv_mining_scanner/cyborg(src)
+ modules += new /obj/item/weapon/gun/energy/kinetic_accelerator/cyborg(src)
+ modules += new /obj/item/device/gps/cyborg(src)
+ emag = new /obj/item/borg/stun(src)
fix_modules()
@@ -338,7 +337,6 @@
src.modules += new /obj/item/borg/sight/thermal(src)
src.modules += new /obj/item/weapon/melee/energy/sword/cyborg(src)
src.modules += new /obj/item/weapon/gun/energy/pulse/cyborg(src)
- src.modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.emag = null
@@ -354,7 +352,6 @@
src.modules += new /obj/item/weapon/gun/energy/printer(src)
src.modules += new /obj/item/weapon/gun/projectile/revolver/grenadelauncher/multi/cyborg(src)
src.modules += new /obj/item/weapon/card/emag(src)
- src.modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/weapon/pinpointer/operative(src)
src.emag = null
@@ -393,7 +390,6 @@
src.modules += new /obj/item/weapon/surgicaldrill(src)
src.modules += new /obj/item/weapon/melee/energy/sword/cyborg/saw(src) //Energy saw -- primary weapon
src.modules += new /obj/item/weapon/card/emag(src)
- src.modules += new /obj/item/weapon/tank/jetpack/carbondioxide(src)
src.modules += new /obj/item/weapon/crowbar(src)
src.modules += new /obj/item/weapon/pinpointer/operative(src)
src.emag = null
@@ -507,7 +503,7 @@
//checks whether this item is a module of the robot it is located in.
/obj/item/proc/is_robot_module()
- if (!istype(src.loc, /mob/living/silicon/robot))
+ if(!istype(src.loc, /mob/living/silicon/robot))
return 0
var/mob/living/silicon/robot/R = src.loc
diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm
index 00ed6522440..ff28a93a64e 100644
--- a/code/modules/mob/living/silicon/robot/robot_movement.dm
+++ b/code/modules/mob/living/silicon/robot/robot_movement.dm
@@ -1,9 +1,8 @@
/mob/living/silicon/robot/Process_Spacemove(var/movement_dir = 0)
- if(module)
- for(var/obj/item/weapon/tank/jetpack/J in module.modules)
- if(J && istype(J, /obj/item/weapon/tank/jetpack))
- if(J.allow_thrust(0.01)) return 1
- if(..()) return 1
+ if(ionpulse())
+ return 1
+ if(..())
+ return 1
return 0
//No longer needed, but I'll leave it here incase we plan to re-use it.
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index 94ae02a56ce..7f25a743fc7 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -20,7 +20,7 @@
if(message_mode == "department")
return holopad_talk(message, verb, speaking)
else if(message_mode)
- if (aiRadio.disabledAi || aiRestorePowerRoutine || stat)
+ if(aiRadio.disabledAi || aiRestorePowerRoutine || stat)
to_chat(src, "System Error - Transceiver Disabled. ")
return 0
if(message_mode == "general")
@@ -41,9 +41,9 @@
/mob/living/silicon/say_quote(var/text)
var/ending = copytext(text, length(text))
- if (ending == "?")
+ if(ending == "?")
return speak_query
- else if (ending == "!")
+ else if(ending == "!")
return speak_exclamation
return speak_statement
@@ -54,14 +54,14 @@
/mob/living/silicon/say_understands(var/other,var/datum/language/speaking = null)
//These only pertain to common. Languages are handled by mob/say_understands()
- if (!speaking)
- if (istype(other, /mob/living/carbon))
+ if(!speaking)
+ if(istype(other, /mob/living/carbon))
return 1
- if (istype(other, /mob/living/silicon))
+ if(istype(other, /mob/living/silicon))
return 1
- if (istype(other, /mob/living/simple_animal/bot))
+ if(istype(other, /mob/living/simple_animal/bot))
return 1
- if (istype(other, /mob/living/carbon/brain))
+ if(istype(other, /mob/living/carbon/brain))
return 1
return ..()
@@ -72,7 +72,7 @@
message = trim(message)
- if (!message)
+ if(!message)
return
var/obj/machinery/hologram/holopad/T = src.holo
@@ -113,7 +113,7 @@
message = trim(message)
- if (!message)
+ if(!message)
return
var/obj/machinery/hologram/holopad/T = src.holo
@@ -128,6 +128,13 @@
return
return 1
+/mob/living/silicon/ai/emote(var/act, var/type, var/message)
+ var/obj/machinery/hologram/holopad/T = src.holo
+ if(T && T.hologram && T.master == src) //Is the AI using a holopad?
+ src.holopad_emote(message)
+ else //Emote normally, then.
+ ..()
+
#undef IS_AI
#undef IS_ROBOT
#undef IS_PAI
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index e6fc318335b..f467925d309 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -130,7 +130,7 @@
/proc/islinked(var/mob/living/silicon/robot/bot, var/mob/living/silicon/ai/ai)
if(!istype(bot) || !istype(ai))
return 0
- if (bot.connected_ai == ai)
+ if(bot.connected_ai == ai)
return 1
return 0
@@ -163,15 +163,15 @@
return universal_speak || (speaking in src.speech_synthesizer_langs) //need speech synthesizer support to vocalize a language
/mob/living/silicon/add_language(var/language, var/can_speak=1)
- if (..(language) && can_speak)
+ if(..(language) && can_speak)
speech_synthesizer_langs.Add(all_languages[language])
return 1
/mob/living/silicon/remove_language(var/rem_language)
..(rem_language)
- for (var/datum/language/L in speech_synthesizer_langs)
- if (L.name == rem_language)
+ for(var/datum/language/L in speech_synthesizer_langs)
+ if(L.name == rem_language)
speech_synthesizer_langs -= L
/mob/living/silicon/check_languages()
@@ -209,7 +209,7 @@
onclose(src, "airoster")
/mob/living/silicon/Bump(atom/movable/AM as mob|obj, yes) //Allows the AI to bump into mobs if it's itself pushed
- if ((!( yes ) || now_pushing))
+ if((!( yes ) || now_pushing))
return
now_pushing = 1
if(ismob(AM))
@@ -219,13 +219,13 @@
return
now_pushing = 0
..()
- if (!istype(AM, /atom/movable))
+ if(!istype(AM, /atom/movable))
return
- if (!now_pushing)
+ if(!now_pushing)
now_pushing = 1
- if (!AM.anchored)
+ if(!AM.anchored)
var/t = get_dir(src, AM)
- if (istype(AM, /obj/structure/window))
+ if(istype(AM, /obj/structure/window))
if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST)
for(var/obj/structure/window/win in get_step(AM,t))
now_pushing = 0
@@ -278,16 +278,16 @@
var/sensor_type = input("Please select sensor type.", "Sensor Integration", null) in list("Security", "Medical","Diagnostic","Disable")
remove_med_sec_hud()
switch(sensor_type)
- if ("Security")
+ if("Security")
add_sec_hud()
to_chat(src, "Security records overlay enabled. ")
- if ("Medical")
+ if("Medical")
add_med_hud()
to_chat(src, "Life signs monitor overlay enabled. ")
- if ("Diagnostic")
+ if("Diagnostic")
add_diag_hud()
to_chat(src, "Robotics diagnostic overlay enabled. ")
- if ("Disable")
+ if("Disable")
to_chat(src, "Sensor augmentations disabled.")
/mob/living/silicon/proc/receive_alarm(var/datum/alarm_handler/alarm_handler, var/datum/alarm/alarm, was_raised)
@@ -358,4 +358,12 @@
return ..()
/mob/living/silicon/is_mechanical()
- return 1
\ No newline at end of file
+ return 1
+
+/////////////////////////////////// EAR DAMAGE ////////////////////////////////////
+
+/mob/living/silicon/adjustEarDamage()
+ return
+
+/mob/living/silicon/setEarDamage()
+ return
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 700b47da3f3..3cc10b39d42 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -161,7 +161,7 @@
diag_hud.add_hud_to(src)
permanent_huds |= diag_hud
-/mob/living/simple_animal/bot/update_canmove()
+/mob/living/simple_animal/bot/update_canmove(delay_action_updates = 0)
. = ..()
if(!on)
. = 0
@@ -325,7 +325,7 @@
else
to_chat(user, "You attempt to pull [paicard] free... ")
if(do_after(user, 30, target = src))
- if (paicard)
+ if(paicard)
user.visible_message("[user] uses [W] to pull [paicard] out of [bot_name]! ","You pull [paicard] out of [bot_name] with [W]. ")
ejectpai(user)
else
@@ -417,7 +417,7 @@ Pass the desired type path itself, declaring a temporary var beforehand is not r
*/
/mob/living/simple_animal/bot/proc/scan(scan_type, old_target, scan_range = DEFAULT_SCAN_RANGE)
var/final_result
- for (var/scan in shuffle(view(scan_range, src))) //Search for something in range!
+ for(var/scan in shuffle(view(scan_range, src))) //Search for something in range!
if(!istype(scan, scan_type)) //Check that the thing we found is the type we want!
continue //If not, keep searching!
if( (scan in ignore_list) || (scan == old_target) ) //Filter for blacklisted elements, usually unreachable or previously processed oness
@@ -507,7 +507,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, "\icon[src] [name] called to [end_area.name]. [path.len-1] meters to destination. ")
+ to_chat(calling_ai, "[bicon(src)] [name] called to [end_area.name]. [path.len-1] meters to destination. ")
pathset = 1
mode = BOT_RESPONDING
tries = 0
@@ -522,7 +522,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, "\icon[src] [get_turf(src) == ai_waypoint ? "[src] successfully arrived to waypoint. " : "[src] failed to reach waypoint. "]")
+ to_chat(calling_ai, "[bicon(src)] [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/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 34888dd3488..497393cf5d7 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -323,7 +323,7 @@ Auto Patrol[]"},
return
anchored = 0
threatlevel = 0
- for (var/mob/living/carbon/C in view(7,src)) //Let's find us a criminal
+ for(var/mob/living/carbon/C in view(7,src)) //Let's find us a criminal
if((C.stat) || (C.handcuffed))
continue
diff --git a/code/modules/mob/living/simple_animal/bot/emote.dm b/code/modules/mob/living/simple_animal/bot/emote.dm
new file mode 100644
index 00000000000..1bf29d14178
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/bot/emote.dm
@@ -0,0 +1,120 @@
+/mob/living/simple_animal/bot/emote(var/act, var/m_type=1, var/message = null)
+ var/param = null
+ if(findtext(act, "-", 1, null))
+ var/t1 = findtext(act, "-", 1, null)
+ param = copytext(act, t1 + 1, length(act) + 1)
+ act = copytext(act, 1, t1)
+
+ if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
+ act = copytext(act,1,length(act))
+
+ //Emote Cooldown System (it's so simple!)
+ // proc/handle_emote_CD() located in [code\modules\mob\emote.dm]
+ var/on_CD = 0
+ act = lowertext(act)
+ switch(act)
+ //Cooldown-inducing emotes
+ if("scream", "screams")
+ on_CD = handle_emote_CD(50) //longer cooldown
+ if("ping","buzz","beep","yes","no") //halt is exempt because it's used to stop criminal scum //WHOEVER THOUGHT THAT WAS A GOOD IDEA IS GOING TO GET SHOT.
+ on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
+ //Everything else, including typos of the above emotes
+ else
+ on_CD = 0 //If it doesn't induce the cooldown, we won't check for the cooldown
+
+ if(on_CD == 1) // Check if we need to suppress the emote attempt.
+ return // Suppress emote, you're still cooling off.
+ //--FalseIncarnate
+
+ switch(act)
+ if("ping")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] pings at [param]."
+ else
+ message = "[src] pings."
+ playsound(src.loc, 'sound/machines/ping.ogg', 50, 0)
+ m_type = 2
+
+ if("buzz")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] buzzes at [param]."
+ else
+ message = "[src] buzzes."
+ playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0)
+ m_type = 2
+
+ if("beep")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] beeps at [param]."
+ else
+ message = "[src] beeps."
+ playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
+ m_type = 2
+
+ if("yes")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] emits an affirmative blip at [param]."
+ else
+ message = "[src] emits an affirmative blip."
+ playsound(src.loc, 'sound/machines/synth_yes.ogg', 50, 0)
+ m_type = 2
+
+ if("no")
+ var/M = null
+ if(param)
+ for(var/mob/A in view(null, null))
+ if(param == A.name)
+ M = A
+ break
+ if(!M)
+ param = null
+
+ if(param)
+ message = "[src] emits a negative blip at [param]."
+ else
+ message = "[src] emits a negative blip."
+ playsound(src.loc, 'sound/machines/synth_no.ogg', 50, 0)
+ m_type = 2
+
+ if("scream", "screams")
+ message = "[src] screams!"
+ playsound(src.loc, 'sound/goonstation/voice/robot_scream.ogg', 80, 0)
+ m_type = 2
+
+ ..(act, m_type, message)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index e2bad0bcd3b..bb62af5ce35 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -106,8 +106,8 @@
visible_message("[user] crowbars out the power cell from [src].",
"You pry the powercell out of [src]. ")
update_controls()
- else if (istype(I, /obj/item/weapon/wrench))
- if (health < maxHealth)
+ else if(istype(I, /obj/item/weapon/wrench))
+ if(health < maxHealth)
adjustBruteLoss(-25)
updatehealth()
user.visible_message(
@@ -639,7 +639,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, "\icon[src] [src] wirelessly plays a chiming sound! ")
+ to_chat(calling_ai, "[bicon(src)] [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 284584406c2..f89b0a1760f 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -385,7 +385,7 @@ Auto Patrol: []"},
/mob/living/simple_animal/bot/secbot/proc/look_for_perp()
anchored = 0
- for (var/mob/living/carbon/C in view(7,src)) //Let's find us a criminal
+ for(var/mob/living/carbon/C in view(7,src)) //Let's find us a criminal
if((C.stat) || (C.handcuffed))
continue
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index e8ba27fa07d..5f078682947 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -26,17 +26,19 @@
var/obj/item/inventory_head
var/obj/item/inventory_back
var/facehugger
+ var/default_atmos_requirements = 0
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/pet/corgi/New()
..()
+ default_atmos_requirements = src.atmos_requirements
regenerate_icons()
/mob/living/simple_animal/pet/corgi/Life()
. = ..()
regenerate_icons()
-/mob/living/simple_animal/pet/corgi/death()
+/mob/living/simple_animal/pet/corgi/death(gibbed)
..()
regenerate_icons()
@@ -78,8 +80,8 @@
custom_emote(1, "looks at [user] with [pick("an amused","an annoyed","a confused","a resentful", "a happy", "an excited")] expression.")
return
- if (istype(O, /obj/item/weapon/razor))
- if (shaved)
+ if(istype(O, /obj/item/weapon/razor))
+ if(shaved)
to_chat(user, "You can't shave this corgi, it's already been shaved! ")
return
user.visible_message("[user] starts to shave [src] using \the [O].", "You start to shave [src] using \the [O]... ")
@@ -118,6 +120,9 @@
emote_see = list("shakes its head", "shivers")
desc = "It's a corgi."
set_light(0)
+ flags &= ~NO_BREATHE
+ atmos_requirements = default_atmos_requirements
+ minbodytemp = initial(minbodytemp)
inventory_head.loc = src.loc
inventory_head = null
regenerate_icons()
@@ -159,7 +164,7 @@
if(!item_to_add)
usr.visible_message("[usr] pets [src].","You rest your hand on [src]'s back for a moment. ")
return
- if(istype(item_to_add,/obj/item/weapon/c4)) // last thing he ever wears, I guess
+ if(istype(item_to_add,/obj/item/weapon/grenade/plastic/c4)) // last thing he ever wears, I guess
item_to_add.afterattack(src,usr,1)
return
@@ -203,7 +208,7 @@
//Many hats added, Some will probably be removed, just want to see which ones are popular.
/mob/living/simple_animal/pet/corgi/proc/place_on_head(obj/item/item_to_add, var/mob/user as mob)
- if(istype(item_to_add,/obj/item/weapon/c4)) // last thing he ever wears, I guess
+ if(istype(item_to_add,/obj/item/weapon/grenade/plastic/c4)) // last thing he ever wears, I guess
item_to_add.afterattack(src,user,1)
return
@@ -353,6 +358,9 @@
name = "Space Explorer [real_name]"
desc = "That's one small step for a corgi. One giant yap for corgikind."
valid = 1
+ flags |= NO_BREATHE
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
if(/obj/item/clothing/mask/fakemoustache)
name = "Definitely Not [real_name]"
@@ -429,13 +437,13 @@
step_to(src,movement_target,1)
if(movement_target) //Not redundant due to sleeps, Item can be gone in 6 decisecomds
- if (movement_target.loc.x < src.x)
+ if(movement_target.loc.x < src.x)
dir = WEST
- else if (movement_target.loc.x > src.x)
+ else if(movement_target.loc.x > src.x)
dir = EAST
- else if (movement_target.loc.y < src.y)
+ else if(movement_target.loc.y < src.y)
dir = SOUTH
- else if (movement_target.loc.y > src.y)
+ else if(movement_target.loc.y > src.y)
dir = NORTH
else
dir = SOUTH
@@ -463,7 +471,7 @@
/mob/living/simple_animal/pet/corgi/Ian/Bump(atom/movable/AM as mob|obj, yes)
spawn( 0 )
- if ((!( yes ) || now_pushing))
+ if((!( yes ) || now_pushing))
return
now_pushing = 1
if(ismob(AM))
@@ -480,13 +488,13 @@
tmob.LAssailant = src
now_pushing = 0
..()
- if (!( istype(AM, /atom/movable) ))
+ if(!( istype(AM, /atom/movable) ))
return
- if (!( now_pushing ))
+ if(!( now_pushing ))
now_pushing = 1
- if (!( AM.anchored ))
+ if(!( AM.anchored ))
var/t = get_dir(src, AM)
- if (istype(AM, /obj/structure/window/full))
+ if(istype(AM, /obj/structure/window/full))
for(var/obj/structure/window/win in get_step(AM,t))
now_pushing = 0
return
@@ -604,6 +612,8 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
loot = list(/obj/effect/decal/cleanable/blood/gibs/robot)
+ del_on_death = 1
+ deathmessage = "blows apart!"
/mob/living/simple_animal/pet/corgi/Ian/borgi/emag_act(user as mob)
if(!emagged)
@@ -614,7 +624,7 @@
/mob/living/simple_animal/pet/corgi/Ian/borgi/proc/explode()
for(var/mob/M in viewers(src, null))
- if (M.client)
+ if(M.client)
M.show_message("\red [src] makes an odd whining noise.")
sleep(10)
explosion(get_turf(src), 0, 1, 4, 7)
@@ -623,7 +633,7 @@
/mob/living/simple_animal/pet/corgi/Ian/borgi/proc/shootAt(var/atom/movable/target)
var/turf/T = get_turf(src)
var/turf/U = get_turf(target)
- if (!T || !U)
+ if(!T || !U)
return
var/obj/item/projectile/beam/A = new /obj/item/projectile/beam(loc)
A.icon = 'icons/effects/genetics.dmi'
@@ -639,7 +649,7 @@
..()
if(emagged && prob(25))
var/mob/living/carbon/target = locate() in view(10,src)
- if (target)
+ if(target)
shootAt(target)
//spark for no reason
@@ -648,12 +658,8 @@
s.set_up(3, 1, src)
s.start()
-/mob/living/simple_animal/pet/corgi/Ian/borgi/death()
- ..()
- visible_message("[src] blows apart!")
+/mob/living/simple_animal/pet/corgi/Ian/borgi/death(gibbed)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
- respawnable_list += src
- qdel(src)
- return
+ ..()
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm b/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm
index dc687743197..a20c7b73d5f 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi_powers.dm
@@ -4,7 +4,7 @@
set category = "Corgi"
to_chat(src, text("[pick("You dance around","You chase your tail")]."))
for(var/mob/O in oviewers(src, null))
- if ((O.client && !( O.blinded )))
+ if((O.client && !( O.blinded )))
to_chat(O, text("[] [pick("dances around","chases its tail")].", src))
for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2))
dir = i
diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm
index 31da301ce57..5d409814940 100644
--- a/code/modules/mob/living/simple_animal/friendly/crab.dm
+++ b/code/modules/mob/living/simple_animal/friendly/crab.dm
@@ -69,7 +69,7 @@
if(MED.amount <= 0)
qdel(MED)
for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
+ if((M.client && !( M.blinded )))
M.show_message("\blue [user] applies the [MED] on [src]")
else
to_chat(user, "\blue this [src] is dead, medical items won't bring it back to life.")
@@ -77,12 +77,12 @@
if(O.force)
health -= O.force
for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
+ if((M.client && !( M.blinded )))
M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
else
to_chat(usr, "\red This weapon is ineffective, it does no damage.")
for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
+ if((M.client && !( M.blinded )))
M.show_message("\red [user] gently taps [src] with the [O]. ")
/mob/living/simple_animal/crab/Topic(href, href_list)
diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm
index 125061f9275..8bb2ea57f85 100644
--- a/code/modules/mob/living/simple_animal/friendly/diona.dm
+++ b/code/modules/mob/living/simple_animal/friendly/diona.dm
@@ -191,7 +191,7 @@
adult.real_name = pick(diona_names) //I hate this being here of all places but unfortunately dna is based on real_name!
adult.rename_self("diona")
- for (var/obj/item/W in src.contents)
+ for(var/obj/item/W in src.contents)
src.unEquip(W)
qdel(src)
@@ -249,3 +249,26 @@
/mob/living/simple_animal/diona/put_in_active_hand(obj/item/W)
to_chat(src, "You don't have any hands! ")
return
+
+/mob/living/simple_animal/diona/emote(var/act, var/m_type=1, var/message = null)
+ if(stat)
+ return
+
+ var/on_CD = 0
+ act = lowertext(act)
+ switch(act)
+ if("chirp")
+ on_CD = handle_emote_CD()
+ else
+ on_CD = 0
+
+ if(on_CD == 1)
+ return
+
+ switch(act) //IMPORTANT: Emotes MUST NOT CONFLICT anywhere along the chain.
+ if("chirp")
+ message = "\The [src] chirps!"
+ m_type = 2 //audible
+ playsound(src, 'sound/misc/nymphchirp.ogg', 40, 1, 1)
+
+ ..(act, m_type, message)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index 346a04e7851..7dd9a50c828 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -194,7 +194,9 @@
if(.)
amount_grown += rand(1,2)
if(amount_grown >= 100)
- new /mob/living/simple_animal/chicken(src.loc)
+ var/mob/living/simple_animal/chicken/C = new /mob/living/simple_animal/chicken(loc)
+ if(mind)
+ mind.transfer_to(C)
qdel(src)
var/const/MAX_CHICKENS = 50
@@ -239,7 +241,7 @@ var/global/chicken_count = 0
pixel_y = rand(0, 10)
chicken_count += 1
-/mob/living/simple_animal/chicken/death()
+/mob/living/simple_animal/chicken/death(gibbed)
..()
chicken_count -= 1
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index b269256f7a0..4d499e9f54f 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -112,11 +112,11 @@
if( ishuman(AM) )
if(!stat)
var/mob/M = AM
- to_chat(M, "\blue \icon[src] Squeek!")
+ to_chat(M, "\blue [bicon(src)] Squeek!")
M << 'sound/effects/mousesqueek.ogg'
..()
-/mob/living/simple_animal/mouse/death()
+/mob/living/simple_animal/mouse/death(gibbed)
layer = MOB_LAYER
if(client)
client.time_died_as_mouse = world.time
diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm
index eba412580db..30f55a2220f 100644
--- a/code/modules/mob/living/simple_animal/friendly/pet.dm
+++ b/code/modules/mob/living/simple_animal/friendly/pet.dm
@@ -17,7 +17,7 @@
..()
regenerate_icons()
-/mob/living/simple_animal/pet/death()
+/mob/living/simple_animal/pet/death(gibbed)
..()
regenerate_icons()
diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm
index eac1a448571..a76fe47cdba 100644
--- a/code/modules/mob/living/simple_animal/friendly/slime.dm
+++ b/code/modules/mob/living/simple_animal/friendly/slime.dm
@@ -18,7 +18,7 @@
/mob/living/simple_animal/slime/Bump(atom/movable/AM as mob|obj, yes)
spawn( 0 )
- if ((!( yes ) || now_pushing))
+ if((!( yes ) || now_pushing))
return
now_pushing = 1
if(ismob(AM))
@@ -35,13 +35,13 @@
tmob.LAssailant = src
now_pushing = 0
..()
- if (!( istype(AM, /atom/movable) ))
+ if(!( istype(AM, /atom/movable) ))
return
- if (!( now_pushing ))
+ if(!( now_pushing ))
now_pushing = 1
- if (!( AM.anchored ))
+ if(!( AM.anchored ))
var/t = get_dir(src, AM)
- if (istype(AM, /obj/structure/window/full))
+ if(istype(AM, /obj/structure/window/full))
for(var/obj/structure/window/win in get_step(AM,t))
now_pushing = 0
return
@@ -64,21 +64,18 @@
response_harm = "stomps on"
emote_see = list("jiggles", "bounces in place")
var/colour = "grey"
+ del_on_death = 1
/mob/living/simple_animal/adultslime/New()
..()
overlays += "aslime-:33"
-/mob/living/simple_animal/slime/adult/death()
- var/mob/living/simple_animal/slime/S1 = new /mob/living/simple_animal/slime (src.loc)
- S1.icon_state = "[src.colour] baby slime"
- S1.icon_living = "[src.colour] baby slime"
- S1.icon_dead = "[src.colour] baby slime dead"
- S1.colour = "[src.colour]"
- var/mob/living/simple_animal/slime/S2 = new /mob/living/simple_animal/slime (src.loc)
- S2.icon_state = "[src.colour] baby slime"
- S2.icon_living = "[src.colour] baby slime"
- S2.icon_dead = "[src.colour] baby slime dead"
- S2.colour = "[src.colour]"
- qdel(src)
\ No newline at end of file
+/mob/living/simple_animal/slime/adult/death(gibbed)
+ for(var/i in 1 to 2)
+ var/mob/living/simple_animal/slime/S = new /mob/living/simple_animal/slime (src.loc)
+ S.icon_state = "[colour] baby slime"
+ S.icon_living = "[colour] baby slime"
+ S.icon_dead = "[colour] baby slime dead"
+ S.colour = "[colour]"
+ ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
index 590dfa47b5e..b453cfa5ea2 100644
--- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -40,6 +40,8 @@
speak_emote = list("beeps","clicks","chirps")
can_hide = 1
ventcrawler = 2
+ loot = list(/obj/effect/decal/cleanable/blood/gibs/robot)
+ del_on_death = 1
/mob/living/simple_animal/spiderbot/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
@@ -84,9 +86,9 @@
src.update_icon()
return 1
- if (istype(O, /obj/item/weapon/weldingtool))
+ if(istype(O, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = O
- if (WT.remove_fuel(0))
+ if(WT.remove_fuel(0))
if(health < maxHealth)
health += pick(1,1,1,2,2,3)
if(health > maxHealth)
@@ -100,7 +102,7 @@
to_chat(user, "Need more welding fuel!")
return
else if(istype(O, /obj/item/weapon/card/id)||istype(O, /obj/item/device/pda))
- if (!mmi)
+ if(!mmi)
to_chat(user, "\red There's no reason to swipe your ID - the spiderbot has no brain to remove.")
return 0
@@ -128,20 +130,20 @@
else
if(O.force)
var/damage = O.force
- if (O.damtype == STAMINA)
+ if(O.damtype == STAMINA)
damage = 0
adjustBruteLoss(damage)
for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
+ if((M.client && !( M.blinded )))
M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
else
to_chat(usr, "\red This weapon is ineffective, it does no damage.")
for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
+ if((M.client && !( M.blinded )))
M.show_message("\red [user] gently taps [src] with the [O]. ")
/mob/living/simple_animal/spiderbot/emag_act(user as mob)
- if (emagged)
+ if(emagged)
to_chat(user, "\red [src] is already overloaded - better run.")
return 0
else
@@ -163,7 +165,7 @@
/mob/living/simple_animal/spiderbot/proc/explode() //When emagged.
for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
+ if((M.client && !( M.blinded )))
M.show_message("\red [src] makes an odd warbling noise, fizzles, and explodes.")
explosion(get_turf(loc), -1, -1, 3, 5)
eject_brain()
@@ -205,20 +207,14 @@
..()
-/mob/living/simple_animal/spiderbot/death()
-
- living_mob_list -= src
- dead_mob_list += src
-
+/mob/living/simple_animal/spiderbot/death(gibbed)
if(camera)
camera.status = 0
if(held_item)
held_item.forceMove(src.loc)
held_item = null
-
- robogibs(src.loc, viruses)
- qdel(src)
+ ..()
//Cannibalized from the parrot mob. ~Zuhayr
@@ -285,4 +281,4 @@
/mob/living/simple_animal/spiderbot/examine(mob/user)
..(user)
if(src.held_item)
- to_chat(user, "It is carrying \a [src.held_item] \icon[src.held_item].")
+ to_chat(user, "It is carrying \a [src.held_item] [bicon(src.held_item)].")
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index 56f63ee99be..6cd1d147211 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -21,15 +21,16 @@
a_intent = I_HARM
attack_sound = 'sound/weapons/bladeslice.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- var/dead = 0
unsuitable_atmos_damage = 15
+ heat_damage_per_tick = 20
faction = list("alien")
status_flags = CANPUSH
minbodytemp = 0
see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
- heat_damage_per_tick = 20
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
+ death_sound = 'sound/voice/hiss6.ogg'
+ deathmessage = "lets out a waning guttural screech, green blood bubbling from its maw..."
/mob/living/simple_animal/hostile/alien/drone
@@ -47,7 +48,6 @@
/mob/living/simple_animal/hostile/alien/drone/handle_automated_action()
if(!..()) //AIStatus is off
return
-
plant_cooldown--
if(AIStatus == AI_IDLE)
if(!plants_off && prob(10) && plant_cooldown<=0)
@@ -136,14 +136,6 @@
damage = 30
icon_state = "toxin"
-/mob/living/simple_animal/hostile/alien/death()
- ..()
- if(dead == 0)
- dead = 1
- visible_message("[src] lets out a waning guttural screech, green blood bubbling from its maw...")
- playsound(src, 'sound/voice/hiss6.ogg', 100, 1)
-
-
/mob/living/simple_animal/hostile/alien/maid
name = "lusty xenomorph maid"
melee_damage_lower = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index c24b0b6a844..4899eef3aaf 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -39,6 +39,7 @@
//Spaceborn beings don't get hurt by space
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
+ del_on_death = 1
var/datum/reagent/beegent = null //hehe, beegent
var/obj/structure/beebox/beehome = null
@@ -61,8 +62,6 @@
/mob/living/simple_animal/hostile/poison/bees/death(gibbed)
beegent = null
..()
- ghostize()
- qdel(src)
/mob/living/simple_animal/hostile/poison/bees/examine(mob/user)
..()
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index ddd302c3e8c..b7fbbec41fb 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -55,12 +55,8 @@
icon_living = "holocarp"
maxbodytemp = INFINITY
gold_core_spawnable = CHEM_MOB_SPAWN_INVALID
+ del_on_death = 1
-/mob/living/simple_animal/hostile/carp/holocarp/death()
- ..()
- ghostize()
- qdel(src)
- return
/mob/living/simple_animal/hostile/carp/megacarp
icon = 'icons/mob/alienqueen.dmi'
diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
index 94cf8dae65c..b3ea7f442fa 100644
--- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm
@@ -24,6 +24,8 @@
speak_emote = list("states")
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
loot = list(/obj/effect/decal/cleanable/blood/gibs/robot)
+ deathmessage = "blows apart!"
+ del_on_death = 1
/mob/living/simple_animal/hostile/hivebot/range
name = "Hivebot"
@@ -45,15 +47,11 @@
maxHealth = 80
ranged = 1
-/mob/living/simple_animal/hostile/hivebot/death()
- ..()
- visible_message("[src] blows apart!")
+/mob/living/simple_animal/hostile/hivebot/death(gibbed)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
- ghostize()
- qdel(src)
- return
+ ..()
/mob/living/simple_animal/hostile/hivebot/tele//this still needs work
name = "Beacon"
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index faf0cc0f9a3..a3739dfe088 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -219,7 +219,7 @@
//////////////END HOSTILE MOB TARGETTING AND AGGRESSION////////////
-/mob/living/simple_animal/hostile/death()
+/mob/living/simple_animal/hostile/death(gibbed)
LoseAggro()
mouse_opacity = 1
..()
diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm
new file mode 100644
index 00000000000..a770f6b1c32
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm
@@ -0,0 +1,71 @@
+/mob/living/simple_animal/hostile/illusion
+ name = "illusion"
+ desc = "It's a fake!"
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "static"
+ icon_living = "static"
+ icon_dead = "null"
+ melee_damage_lower = 5
+ melee_damage_upper = 5
+ a_intent = "harm"
+ attacktext = "gores"
+ maxHealth = 100
+ health = 100
+ speed = 0
+ faction = list("illusion")
+ var/life_span = INFINITY //how long until they despawn
+ var/mob/living/parent_mob
+ var/multiply_chance = 0 //if we multiply on hit
+ deathmessage = "vanishes into thin air! It was a fake!"
+ del_on_death = 1
+
+
+/mob/living/simple_animal/hostile/illusion/Life()
+ ..()
+ if(world.time > life_span)
+ death()
+
+/mob/living/simple_animal/hostile/illusion/proc/Copy_Parent(mob/living/original, life = 50, health = 100, damage = 0, replicate = 0 )
+ appearance = original.appearance
+ parent_mob = original
+ dir = original.dir
+ life_span = world.time+life
+ melee_damage_lower = damage
+ melee_damage_upper = damage
+ multiply_chance = replicate
+ faction -= "neutral"
+ transform = initial(transform)
+ pixel_y = initial(pixel_y)
+ pixel_x = initial(pixel_x)
+
+/mob/living/simple_animal/hostile/illusion/examine(mob/user)
+ if(parent_mob)
+ parent_mob.examine(user)
+ else
+ return ..()
+
+
+/mob/living/simple_animal/hostile/illusion/AttackingTarget()
+ ..()
+ if(istype(target, /mob/living) && prob(multiply_chance))
+ var/mob/living/L = target
+ if(L.stat == DEAD)
+ return
+ var/mob/living/simple_animal/hostile/illusion/M = new(loc)
+ M.faction = faction.Copy()
+ M.Copy_Parent(parent_mob, 80, health/2, melee_damage_upper, multiply_chance/2)
+ M.GiveTarget(L)
+
+///////Actual Types/////////
+
+/mob/living/simple_animal/hostile/illusion/escape
+ retreat_distance = 10
+ minimum_distance = 10
+ melee_damage_lower = 0
+ melee_damage_upper = 0
+ speed = -1
+ environment_smash = 0
+
+
+/mob/living/simple_animal/hostile/illusion/escape/AttackingTarget()
+ return
diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm
index f14d1bf649a..c0616bc5eea 100644
--- a/code/modules/mob/living/simple_animal/hostile/mimic.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm
@@ -27,18 +27,13 @@
var/is_electronic = 0
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
+ del_on_death = 1
/mob/living/simple_animal/hostile/mimic/FindTarget()
. = ..()
if(.)
custom_emote(1, "growls at [.]")
-/mob/living/simple_animal/hostile/mimic/death()
- ..()
- visible_message("[src] stops moving!")
- ghostize()
- qdel(src)
-
/mob/living/simple_animal/hostile/mimic/emp_act(severity)
if(is_electronic)
switch(severity)
@@ -100,7 +95,7 @@
..()
icon_state = initial(icon_state)
-/mob/living/simple_animal/hostile/mimic/crate/death()
+/mob/living/simple_animal/hostile/mimic/crate/death(gibbed)
var/obj/structure/closet/crate/C = new(get_turf(src))
// Put loot in crate
for(var/obj/O in src)
@@ -135,7 +130,7 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
for(var/mob/living/M in contents) //a fix for animated statues from the flesh to stone spell
death()
-/mob/living/simple_animal/hostile/mimic/copy/death()
+/mob/living/simple_animal/hostile/mimic/copy/death(gibbed)
for(var/atom/movable/M in src)
M.loc = get_turf(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 6d2efd88010..9433f4923af 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -135,6 +135,7 @@
var/alerted = 0
var/ore_eaten = 1
var/chase_time = 100
+ var/will_burrow = 1
/mob/living/simple_animal/hostile/asteroid/goldgrub/New()
..()
@@ -170,7 +171,7 @@
visible_message("The ore was swallowed whole! ")
/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/Burrow()//Begin the chase to kill the goldgrub in time
- if(!alerted)
+ if(!alerted && will_burrow)
alerted = 1
spawn(chase_time)
if(alerted)
@@ -193,7 +194,7 @@
visible_message("The [P.name] was repelled by [src.name]'s girth! ")
return
-/mob/living/simple_animal/hostile/asteroid/goldgrub/death()
+/mob/living/simple_animal/hostile/asteroid/goldgrub/death(gibbed)
alerted = 0
Reward()
..()
@@ -320,14 +321,12 @@
throw_message = "falls right through the strange body of the"
environment_smash = 0
pass_flags = PASSTABLE
+ del_on_death = 1
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/New()
..()
spawn(100)
- qdel(src)
-
-/mob/living/simple_animal/hostile/asteroid/hivelordbrood/death()
- qdel(src)
+ death()
/mob/living/simple_animal/hostile/asteroid/goliath
name = "goliath"
@@ -456,8 +455,8 @@
if(istype(target, /obj/item/clothing/suit/space/rig/mining) || istype(target, /obj/item/clothing/head/helmet/space/rig/mining) || istype(target, /obj/item/clothing/suit/space/eva/plasmaman/miner) || istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman/miner))
var/obj/item/clothing/C = target
var/current_armor = C.armor
- if(current_armor.["melee"] < 80)
- current_armor.["melee"] = min(current_armor.["melee"] + 10, 80)
+ if(current_armor.["melee"] < 60)
+ current_armor.["melee"] = min(current_armor.["melee"] + 10, 60)
to_chat(user, "You strengthen [target], improving its resistance against melee attacks. ")
qdel(src)
else
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index e6dda5e301c..99e6f61431c 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -26,6 +26,7 @@
ventcrawler = 2
robust_searching = 1
speak_emote = list("squeaks")
+ deathmessage = "fainted"
var/powerlevel = 0 //Tracks our general strength level gained from eating other shrooms
var/bruised = 0 //If someone tries to cheat the system by attacking a shroom to lower its health, punish them so that it wont award levels to shrooms that eat it
var/recovery_cooldown = 0 //So you can't repeatedly revive it during a fight
@@ -88,8 +89,7 @@
icon_state = "mushroom_color"
UpdateMushroomCap()
-/mob/living/simple_animal/hostile/mushroom/death()
- visible_message("[src] fainted. ")
+/mob/living/simple_animal/hostile/mushroom/death(gibbed)
..()
UpdateMushroomCap()
diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm
index 89835092ffd..d3fec4bf8d8 100644
--- a/code/modules/mob/living/simple_animal/hostile/pirate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm
@@ -24,6 +24,7 @@
speak_emote = list("yarrs")
loot = list(/obj/effect/landmark/mobcorpse/pirate,
/obj/item/weapon/melee/energy/sword/pirate)
+ del_on_death = 1
faction = list("pirate")
/mob/living/simple_animal/hostile/pirate/ranged
@@ -38,11 +39,4 @@
minimum_distance = 5
projectiletype = /obj/item/projectile/beam
loot = list(/obj/effect/landmark/mobcorpse/pirate/ranged,
- /obj/item/weapon/gun/energy/laser)
-
-
-/mob/living/simple_animal/hostile/pirate/death()
- ..()
- ghostize()
- qdel(src)
- return
\ No newline at end of file
+ /obj/item/weapon/gun/energy/laser)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
index 71d088a425c..9f98b205fc9 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
@@ -40,6 +40,8 @@
var/has_loot = 1
faction = list("malf_drone")
+ deathmessage = "suddenly breaks apart."
+ del_on_death = 1
/mob/living/simple_animal/hostile/retaliate/malf_drone/New()
..()
@@ -77,7 +79,7 @@
//repair a bit of damage
if(prob(1))
- src.visible_message("\red \icon[src] [src] shudders and shakes as some of it's damaged systems come back online.")
+ src.visible_message("\red [bicon(src)] [src] shudders and shakes as some of it's damaged systems come back online.")
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
@@ -92,10 +94,10 @@
//sometimes our targetting sensors malfunction, and we attack anyone nearby
if(prob(disabled ? 0 : 1))
if(hostile_drone)
- src.visible_message("\blue \icon[src] [src] retracts several targetting vanes, and dulls it's running lights.")
+ src.visible_message("\blue [bicon(src)] [src] retracts several targetting vanes, and dulls it's running lights.")
hostile_drone = 0
else
- src.visible_message("\red \icon[src] [src] suddenly lights up, and additional targetting vanes slide into place.")
+ src.visible_message("\red [bicon(src)] [src] suddenly lights up, and additional targetting vanes slide into place.")
hostile_drone = 1
if(health / maxHealth > 0.9)
@@ -116,17 +118,17 @@
exploding = 0
if(!disabled)
if(prob(50))
- src.visible_message("\blue \icon[src] [src] suddenly shuts down!")
+ src.visible_message("\blue [bicon(src)] [src] suddenly shuts down!")
else
- src.visible_message("\blue \icon[src] [src] suddenly lies still and quiet.")
+ src.visible_message("\blue [bicon(src)] [src] suddenly lies still and quiet.")
disabled = rand(150, 600)
walk(src,0)
if(exploding && prob(20))
if(prob(50))
- src.visible_message("\red \icon[src] [src] begins to spark and shake violenty!")
+ src.visible_message("\red [bicon(src)] [src] begins to spark and shake violenty!")
else
- src.visible_message("\red \icon[src] [src] sparks and shakes like it's about to explode!")
+ src.visible_message("\red [bicon(src)] [src] sparks and shakes like it's about to explode!")
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
@@ -149,11 +151,6 @@
hostile_drone = 0
walk(src,0)
-/mob/living/simple_animal/hostile/retaliate/malf_drone/death()
- ..()
- visible_message("\blue \icon[src] [src] suddenly breaks apart.")
- qdel(src)
-
/mob/living/simple_animal/hostile/retaliate/malf_drone/Destroy() //Seriously, what the actual hell.
//some random debris left behind
if(has_loot)
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm
index 210ff43ebda..66972b06d2e 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/undead.dm
@@ -46,6 +46,7 @@
faction = list("undead") // did I mention ghost
loot = list(/obj/item/weapon/reagent_containers/food/snacks/ectoplasm)
+ del_on_death = 1
/mob/living/simple_animal/hostile/retaliate/ghost/Process_Spacemove(var/check_drift = 0)
return 1
@@ -61,10 +62,6 @@
else
invisibility = pick(0,60,60,invisibility)
..()
-/mob/living/simple_animal/hostile/retaliate/ghost/death()
- ..()
- qdel(src)
- return
/mob/living/simple_animal/hostile/retaliate/skeleton
name = "skeleton"
@@ -92,11 +89,7 @@
faction = list("undead")
loot = list(/obj/effect/decal/remains/human)
-
-/mob/living/simple_animal/hostile/retaliate/skeleton/death()
- ..()
- qdel(src)
- return
+ del_on_death = 1
/mob/living/simple_animal/hostile/retaliate/zombie
name = "zombie"
@@ -124,8 +117,4 @@
faction = list("undead")
loot = list(/obj/effect/decal/cleanable/blood/gibs)
-
-/mob/living/simple_animal/hostile/retaliate/zombie/death()
- ..()
- qdel(src)
- return
\ No newline at end of file
+ del_on_death = 1
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm
index 0126dd5c704..30bdb8c95e2 100644
--- a/code/modules/mob/living/simple_animal/hostile/russian.dm
+++ b/code/modules/mob/living/simple_animal/hostile/russian.dm
@@ -24,6 +24,7 @@
status_flags = CANPUSH
loot = list(/obj/effect/landmark/mobcorpse/russian,
/obj/item/weapon/kitchen/knife)
+ del_on_death = 1
/mob/living/simple_animal/hostile/russian/ranged
@@ -39,8 +40,3 @@
loot = list(/obj/effect/landmark/mobcorpse/russian/ranged,
/obj/item/weapon/gun/projectile/shotgun/boltaction)
casingtype = /obj/item/ammo_casing/a762
-
-/mob/living/simple_animal/hostile/russian/death()
- ..()
- qdel(src)
- return
diff --git a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
index a186bbe3d09..c59cdf0570a 100644
--- a/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
+++ b/code/modules/mob/living/simple_animal/hostile/spaceworms.dm
@@ -184,7 +184,7 @@
//Harder to kill the head, but it can kill off the whole worm
-/mob/living/simple_animal/hostile/spaceWorm/wormHead/death()
+/mob/living/simple_animal/hostile/spaceWorm/wormHead/death(gibbed)
..()
if(prob(catastrophicDeathProb))
for(var/mob/living/simple_animal/hostile/spaceWorm/SW in totalWormSegments)
@@ -294,7 +294,7 @@
qdel(src)
-/mob/living/simple_animal/hostile/spaceWorm/death()
+/mob/living/simple_animal/hostile/spaceWorm/death(gibbed)
..()
if(myHead)
myHead.totalWormSegments -= src
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index 1c7836c0a13..cb48c63b66f 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -52,9 +52,9 @@
/mob/living/simple_animal/hostile/statue/New(loc, var/mob/living/creator)
..()
// Give spells
- AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/flicker_lights(src))
- AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/blindness(src))
- AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision(src))
+ AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/flicker_lights(null))
+ AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/blindness(null))
+ AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision(null))
// Give nightvision
see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 32bdf5fc772..d3f63450fe6 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -24,11 +24,7 @@
check_friendly_fire = 1
status_flags = CANPUSH
loot = list(/obj/effect/landmark/mobcorpse/syndicatesoldier)
-
-/mob/living/simple_animal/hostile/syndicate/death()
- ..()
- qdel(src)
- return
+ del_on_death = 1
///////////////Sword and shield////////////
@@ -39,6 +35,7 @@
icon_living = "syndicatemelee"
attacktext = "slashes"
attack_sound = 'sound/weapons/bladeslice.ogg'
+ armour_penetration = 28
status_flags = 0
loot = list(/obj/effect/landmark/mobcorpse/syndicatesoldier, /obj/item/weapon/melee/energy/sword/saber/red, /obj/item/weapon/shield/energy)
@@ -46,7 +43,7 @@
if(O.force)
if(prob(80))
var/damage = O.force
- if (O.damtype == STAMINA)
+ if(O.damtype == STAMINA)
damage = 0
health -= damage
visible_message("\red \b [src] has been attacked with the [O] by [user]. ")
@@ -123,9 +120,5 @@
minbodytemp = 0
flying = 1
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
-
-/mob/living/simple_animal/hostile/viscerator/death()
- ..()
- visible_message("\red [src] is smashed into pieces!")
- qdel(src)
- return
+ del_on_death = 1
+ deathmessage = "is smashed into pieces!"
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index b47312b15df..9d22827a292 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -30,6 +30,8 @@
faction = list("hostile", "winter")
loot = list(/obj/item/stack/sheet/wood)
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
+ deathmessage = "is hacked into pieces!"
+ del_on_death = 1
/mob/living/simple_animal/hostile/tree/FindTarget()
. = ..()
@@ -42,9 +44,4 @@
if(istype(L))
if(prob(15))
L.Weaken(3)
- L.visible_message("\the [src] knocks down \the [L]! ")
-
-/mob/living/simple_animal/hostile/tree/death()
- ..()
- visible_message("\red [src] is hacked into pieces!")
- qdel(src)
\ No newline at end of file
+ L.visible_message("\the [src] knocks down \the [L]! ")
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm b/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm
index 12ede5955ea..6552999aef8 100644
--- a/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/winter_mobs.dm
@@ -33,14 +33,14 @@
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
-/mob/living/simple_animal/hostile/winter/snowman/death()
+/mob/living/simple_animal/hostile/winter/snowman/death(gibbed)
if(prob(50)) //50% chance to drop weapon on death, if it has one to drop
loot = list(/obj/item/weapon/melee/candy_sword)
if(prob(20)) //chance to become a stationary snowman structure instead of a corpse
loot.Add(/obj/structure/snowman)
- visible_message("The [src.name] shimmers as its animating magic fades away! ")
+ deathmessage = "shimmers as its animating magic fades away!"
+ del_on_death = 1
..() //this is just to make sure it gets properly killed before we qdel it
- qdel(src)
else
..()
@@ -73,7 +73,7 @@
icon_living = "santa"
icon_dead = "santa-dead"
-/mob/living/simple_animal/hostile/winter/santa/death()
+/mob/living/simple_animal/hostile/winter/santa/death(gibbed)
..()
if(death_message)
visible_message(death_message)
@@ -121,7 +121,7 @@
melee_damage_lower = 15
melee_damage_upper = 25 //that's gonna leave a mark, for sure
-/mob/living/simple_animal/hostile/winter/santa/stage_4/death()
+/mob/living/simple_animal/hostile/winter/santa/stage_4/death(gibbed)
to_chat(world, " ")
to_chat(world, "THE FAT MAN HAS FALLEN! ")
to_chat(world, "SANTA CLAUS HAS BEEN DEFEATED! ")
diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm
index 6e528516e3e..1266b31f746 100644
--- a/code/modules/mob/living/simple_animal/parrot.dm
+++ b/code/modules/mob/living/simple_animal/parrot.dm
@@ -112,7 +112,7 @@
hear_radio_list -= src
return ..()
-/mob/living/simple_animal/parrot/death()
+/mob/living/simple_animal/parrot/death(gibbed)
if(held_item)
held_item.loc = src.loc
held_item = null
@@ -165,18 +165,18 @@
ears = null
update_speak()
else
- to_chat(usr, "\red There is nothing to remove from its [remove_from].")
+ to_chat(usr, "There is nothing to remove from its [remove_from]. ")
return
show_inv(usr)
else if(href_list["add_inv"])
var/add_to = href_list["add_inv"]
if(!usr.get_active_hand())
- to_chat(usr, "\red You have nothing in your hand to put on its [add_to].")
+ to_chat(usr, "You have nothing in your hand to put on its [add_to]. ")
return
switch(add_to)
if("ears")
if(ears)
- to_chat(usr, "\red It's already wearing something.")
+ to_chat(usr, "It's already wearing something. ")
return
else
var/obj/item/item_to_add = usr.get_active_hand()
@@ -184,7 +184,7 @@
return
if( !istype(item_to_add, /obj/item/device/radio/headset) )
- to_chat(usr, "\red This object won't fit.")
+ to_chat(usr, "This object won't fit. ")
return
var/obj/item/device/radio/headset/headset_to_add = item_to_add
@@ -566,7 +566,7 @@
return -1
if(held_item)
- to_chat(src, "\red You are already holding the [held_item]")
+ to_chat(src, "You are already holding the [held_item] ")
return 1
for(var/obj/item/I in view(1,src))
@@ -579,10 +579,10 @@
held_item = I
I.loc = src
- visible_message("[src] grabs the [held_item]!", "\blue You grab the [held_item]!", "You hear the sounds of wings flapping furiously.")
+ visible_message("[src] grabs the [held_item]!", "You grab the [held_item]! ", "You hear the sounds of wings flapping furiously.")
return held_item
- to_chat(src, "\red There is nothing of interest to take.")
+ to_chat(src, "There is nothing of interest to take. ")
return 0
/mob/living/simple_animal/parrot/proc/steal_from_mob()
@@ -594,7 +594,7 @@
return -1
if(held_item)
- to_chat(src, "\red You are already holding the [held_item]")
+ to_chat(src, "You are already holding the [held_item] ")
return 1
var/obj/item/stolen_item = null
@@ -610,10 +610,10 @@
C.unEquip(stolen_item)
held_item = stolen_item
stolen_item.loc = src
- visible_message("[src] grabs the [held_item] out of [C]'s hand!", "\blue You snag the [held_item] out of [C]'s hand!", "You hear the sounds of wings flapping furiously.")
+ visible_message("[src] grabs the [held_item] out of [C]'s hand!", "You snag the [held_item] out of [C]'s hand! ", "You hear the sounds of wings flapping furiously.")
return held_item
- to_chat(src, "\red There is nothing of interest to take.")
+ to_chat(src, "There is nothing of interest to take. ")
return 0
/mob/living/simple_animal/parrot/verb/drop_held_item_player()
@@ -637,7 +637,7 @@
return -1
if(!held_item)
- to_chat(usr, "\red You have nothing to drop!")
+ to_chat(src, "You have nothing to drop! ")
return 0
if(!drop_gently)
@@ -670,7 +670,7 @@
src.loc = AM.loc
icon_state = "parrot_sit"
return
- to_chat(src, "\red There is no perch nearby to sit on.")
+ to_chat(src, "There is no perch nearby to sit on. ")
return
/*
diff --git a/code/modules/mob/living/simple_animal/posessed_object.dm b/code/modules/mob/living/simple_animal/posessed_object.dm
index 0029bbec7fd..1fc2df4cf76 100644
--- a/code/modules/mob/living/simple_animal/posessed_object.dm
+++ b/code/modules/mob/living/simple_animal/posessed_object.dm
@@ -19,8 +19,8 @@
var/obj/item/possessed_item
-/mob/living/simple_animal/possessed_object/examine()
- possessed_item.examine()
+/mob/living/simple_animal/possessed_object/examine(mob/user)
+ possessed_item.examine(user)
if(health > (maxHealth / 30))
to_chat(usr, "[src] appears to be floating without any support! ")
else
@@ -77,7 +77,7 @@
/mob/living/simple_animal/possessed_object/New(var/atom/loc as obj)
..()
- if (!istype(loc, /obj/item)) // Some silly motherfucker spawned us directly via the game panel.
+ if(!istype(loc, /obj/item)) // Some silly motherfucker spawned us directly via the game panel.
message_admins("Posessed object improperly spawned, deleting. ") // So silly admins with debug off will see the message too and not spam these things.
log_debug("[src] spawned manually, no object to assign attributes to.")
qdel()
diff --git a/code/modules/mob/living/simple_animal/powers.dm b/code/modules/mob/living/simple_animal/powers.dm
index 934c93bb3ad..9177b61ea2d 100644
--- a/code/modules/mob/living/simple_animal/powers.dm
+++ b/code/modules/mob/living/simple_animal/powers.dm
@@ -6,15 +6,15 @@
if(stat != CONSCIOUS)
return
- if (layer != TURF_LAYER+0.2)
+ if(layer != TURF_LAYER+0.2)
layer = TURF_LAYER+0.2
to_chat(src, text("\green You are now hiding."))
for(var/mob/O in oviewers(src, null))
- if ((O.client && !( O.blinded )))
+ if((O.client && !( O.blinded )))
to_chat(O, text("[] scurries to the ground! ", src))
else
layer = MOB_LAYER
to_chat(src, text("\green You have stopped hiding."))
for(var/mob/O in oviewers(src, null))
- if ((O.client && !( O.blinded )))
+ if((O.client && !( O.blinded )))
to_chat(O, text("[] slowly peaks up from the ground...", src))
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
index 9aff96b1fcf..99a65c0052d 100644
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ b/code/modules/mob/living/simple_animal/shade.dm
@@ -25,31 +25,25 @@
faction = list("cult")
status_flags = CANPUSH
loot = list(/obj/item/weapon/reagent_containers/food/snacks/ectoplasm)
+ del_on_death = 1
+ deathmessage = "lets out a contented sigh as their form unwinds."
- death()
- ..()
- for(var/mob/M in viewers(src, null))
- if((M.client && !( M.blinded )))
- M.show_message("\red [src] lets out a contented sigh as their form unwinds. ")
- ghostize()
- qdel(src)
-
attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
if(istype(O, /obj/item/device/soulstone))
O.transfer_soul("SHADE", src, user)
else
if(O.force)
var/damage = O.force
- if (O.damtype == STAMINA)
+ if(O.damtype == STAMINA)
damage = 0
health -= damage
for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
+ if((M.client && !( M.blinded )))
M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
else
to_chat(usr, "\red This weapon is ineffective, it does no damage.")
for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
+ if((M.client && !( M.blinded )))
M.show_message("\red [user] gently taps [src] with the [O]. ")
return
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 9eee62d810a..d2dbd5f14f2 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -49,6 +49,7 @@
//LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly
var/melee_damage_lower = 0
var/melee_damage_upper = 0
+ var/armour_penetration = 0 //How much armour they ignore, as a flat reduction from the targets armour value
var/melee_damage_type = BRUTE //Damage type of a simple mob's melee attack, should it do damage.
var/list/damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) // 1 for full damage , 0 for none , -1 for 1:1 heal from that source
var/attacktext = "attacks"
@@ -70,8 +71,14 @@
var/gold_core_spawnable = CHEM_MOB_SPAWN_INVALID //if CHEM_MOB_SPAWN_HOSTILE can be spawned by plasma with gold core, CHEM_MOB_SPAWN_FRIENDLY are 'friendlies' spawned with blood
var/master_commander = null //holding var for determining who own/controls a sentient simple animal (for sentience potions).
+
+ var/mob/living/simple_animal/hostile/spawner/nest
+
var/sentience_type = SENTIENCE_ORGANIC // Sentience type, for slime potions
var/list/loot = list() //list of things spawned at mob's loc when it dies
+ var/del_on_death = 0 //causes mob to be deleted on death, useful for mobs that spawn lootable corpses
+ var/deathmessage = ""
+ var/death_sound = null //The sound played on death
/mob/living/simple_animal/New()
@@ -307,14 +314,14 @@
switch(M.a_intent)
if(I_HELP)
- if (health > 0)
+ if(health > 0)
visible_message(" [M] [response_help] [src]. ")
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
if(I_GRAB)
- if (M == src || anchored)
+ if(M == src || anchored)
return
- if (!(status_flags & CANPUSH))
+ if(!(status_flags & CANPUSH))
return
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src )
@@ -340,10 +347,10 @@
switch(M.a_intent)
- if (I_HELP)
+ if(I_HELP)
visible_message("[M] caresses [src] with its scythe like arm. ")
- if (I_GRAB)
+ if(I_GRAB)
grabbedby(M)
if(I_HARM, I_DISARM)
@@ -376,13 +383,13 @@
/mob/living/simple_animal/attack_slime(mob/living/carbon/slime/M as mob)
- if (!ticker)
+ if(!ticker)
to_chat(M, "You cannot attack people before the game has started.")
return
if(M.Victim) return // can't attack while eating!
- if (health > 0)
+ if(health > 0)
M.do_attack_animation(src)
visible_message("[M.name] glomps [src]! ", \
"[M.name] glomps [src]! ")
@@ -433,25 +440,25 @@
return
else
user.changeNext_move(CLICK_CD_MELEE)
+ if(attempt_harvest(O, user))
+ return
user.do_attack_animation(src)
if(istype(O) && istype(user) && !O.attack(src, user))
var/damage = 0
if(O.force)
if(O.force >= force_threshold)
damage = O.force
- if (O.damtype == STAMINA)
+ if(O.damtype == STAMINA)
damage = 0
visible_message("[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] [src] with [O]! ",\
"[user] has [O.attack_verb.len ? "[pick(O.attack_verb)]": "attacked"] you with [O]! ")
else
visible_message("[O] bounces harmlessly off of [src]. ",\
"[O] bounces harmlessly off of [src]. ")
- playsound(loc, O.hitsound, 50, 1, -1)
else
user.visible_message("[user] gently taps [src] with [O]. ",\
"This weapon is ineffective, it does no damage. ")
adjustBruteLoss(damage)
- ..()
/mob/living/simple_animal/movement_delay()
@@ -468,25 +475,38 @@
stat(null, "Health: [round((health / maxHealth) * 100)]%")
/mob/living/simple_animal/death(gibbed)
+ if(nest)
+ nest.spawned_mobs -= src
+ nest = null
if(loot.len)
for(var/i in loot)
new i(loc)
- health = 0
- icon_state = icon_dead
- stat = DEAD
- density = 0
if(!gibbed)
- visible_message("\The [src] stops moving... ")
+ if(death_sound)
+ playsound(get_turf(src),death_sound, 200, 1)
+ if(deathmessage)
+ visible_message("\The [src] [deathmessage] ")
+ else if(!del_on_death)
+ visible_message("\The [src] stops moving... ")
+ if(del_on_death)
+ ghostize()
+ qdel(src)
+ else
+ health = 0
+ icon_state = icon_dead
+ stat = DEAD
+ density = 0
+ lying = 1
..()
/mob/living/simple_animal/ex_act(severity)
..()
- switch (severity)
- if (1.0)
+ switch(severity)
+ if(1.0)
gib()
return
- if (2.0)
+ if(2.0)
adjustBruteLoss(60)
@@ -526,17 +546,17 @@
/mob/living/simple_animal/proc/CanAttack(var/atom/the_target)
if(see_invisible < the_target.invisibility)
return 0
- if (isliving(the_target))
+ if(isliving(the_target))
var/mob/living/L = the_target
if(L.stat != CONSCIOUS)
return 0
- if (istype(the_target, /obj/mecha))
+ if(istype(the_target, /obj/mecha))
var/obj/mecha/M = the_target
- if (M.occupant)
+ if(M.occupant)
return 0
- if (istype(the_target,/obj/spacepod))
+ if(istype(the_target,/obj/spacepod))
var/obj/spacepod/S = the_target
- if (S.pilot)
+ if(S.pilot)
return 0
return 1
@@ -616,7 +636,7 @@
return verb
-/mob/living/simple_animal/update_canmove()
+/mob/living/simple_animal/update_canmove(delay_action_updates = 0)
if(paralysis || stunned || weakened || stat || resting)
drop_r_hand()
drop_l_hand()
@@ -626,6 +646,8 @@
else
canmove = 1
update_transform()
+ if(!delay_action_updates)
+ update_action_buttons_icon()
return canmove
/mob/living/simple_animal/update_transform()
@@ -693,3 +715,9 @@
/mob/living/simple_animal/proc/sentience_act() //Called when a simple animal gains sentience via gold slime potion
return
+
+/mob/living/simple_animal/adjustEarDamage()
+ return
+
+/mob/living/simple_animal/setEarDamage()
+ return
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/spawner.dm b/code/modules/mob/living/simple_animal/spawner.dm
new file mode 100644
index 00000000000..0cbf24cf6e2
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/spawner.dm
@@ -0,0 +1,83 @@
+/mob/living/simple_animal/hostile/spawner
+ name = "monster nest"
+ icon = 'icons/mob/animal.dmi'
+ health = 100
+ maxHealth = 100
+ var/list/spawned_mobs = list()
+ var/max_mobs = 5
+ var/spawn_delay = 0
+ var/spawn_time = 300 //30 seconds default
+ var/mob_type = /mob/living/simple_animal/hostile/carp
+ var/spawn_text = "emerges from"
+ status_flags = 0
+ anchored = 1
+ AIStatus = AI_OFF
+ a_intent = "harm"
+ stop_automated_movement = 1
+ wander = 0
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+ maxbodytemp = 350
+ layer = MOB_LAYER-0.1
+ sentience_type = SENTIENCE_BOSS
+
+
+/mob/living/simple_animal/hostile/spawner/Destroy()
+ for(var/mob/living/simple_animal/L in spawned_mobs)
+ if(L.nest == src)
+ L.nest = null
+ spawned_mobs = null
+ return ..()
+
+/mob/living/simple_animal/hostile/spawner/process_ai()
+ ..()
+ spawn_mob()
+
+/mob/living/simple_animal/hostile/spawner/proc/spawn_mob()
+ if(spawned_mobs.len >= max_mobs)
+ return 0
+ if(spawn_delay > world.time)
+ return 0
+ spawn_delay = world.time + spawn_time
+ var/mob/living/simple_animal/L = new mob_type(src.loc)
+ spawned_mobs += L
+ L.nest = src
+ L.faction = src.faction
+ visible_message("[L] [spawn_text] [src]. ")
+
+/mob/living/simple_animal/hostile/spawner/syndicate
+ name = "warp beacon"
+ icon = 'icons/obj/device.dmi'
+ icon_state = "syndbeacon"
+ spawn_text = "warps in from"
+ mob_type = /mob/living/simple_animal/hostile/syndicate/ranged
+ faction = list("syndicate")
+
+/mob/living/simple_animal/hostile/spawner/mining
+ name = "monster den"
+ desc = "A hole dug into the ground, harboring all kinds of monsters found within most caves or mining asteroids."
+ icon_state = "hole"
+ icon_living = "hole"
+ health = 200
+ maxHealth = 200
+ max_mobs = 3
+ icon = 'icons/mob/nest.dmi'
+ spawn_text = "crawls out of"
+ mob_type = /mob/living/simple_animal/hostile/asteroid/goldgrub
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ faction = list("mining")
+
+/mob/living/simple_animal/hostile/spawner/mining/goliath
+ name = "goliath den"
+ desc = "A den housing a nest of goliaths, oh god why?"
+ mob_type = /mob/living/simple_animal/hostile/asteroid/goliath
+
+/mob/living/simple_animal/hostile/spawner/mining/hivelord
+ name = "hivelord den"
+ desc = "A den housing a nest of hivelords."
+ mob_type = /mob/living/simple_animal/hostile/asteroid/hivelord
+
+/mob/living/simple_animal/hostile/spawner/mining/basilisk
+ name = "basilisk den"
+ desc = "A den housing a nest of basilisks, bring a coat."
+ mob_type = /mob/living/simple_animal/hostile/asteroid/basilisk
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/tribbles.dm b/code/modules/mob/living/simple_animal/tribbles.dm
index 23def05f072..b21c3110b1d 100644
--- a/code/modules/mob/living/simple_animal/tribbles.dm
+++ b/code/modules/mob/living/simple_animal/tribbles.dm
@@ -79,7 +79,7 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles,
src.procreate()
-/mob/living/simple_animal/tribble/death() // Gotta make sure to remove tribbles from the list on death
+/mob/living/simple_animal/tribble/death(gibbed) // Gotta make sure to remove tribbles from the list on death
..()
totaltribbles -= 1
@@ -91,7 +91,7 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles,
icon = 'icons/mob/tribbles.dmi'
icon_state = "tribble1"
item_state = "tribble1"
- w_class = 10.0
+ w_class = 10
var/gestation = 0
/obj/item/toy/tribble/attack_self(mob/user as mob) //hug that tribble (and play a sound if we add one)
@@ -115,7 +115,7 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles,
if(istype(O, /obj/item/weapon/scalpel) && src.gestation != null)
gestation = null
to_chat(user, "You neuter the tribble so that it can no longer re-produce. ")
- else if (istype(O, /obj/item/weapon/cautery) && src.gestation == null)
+ else if(istype(O, /obj/item/weapon/cautery) && src.gestation == null)
gestation = 0
to_chat(user, "You fuse some recently cut tubes together, it should be able to reproduce again. ")
@@ -136,16 +136,16 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles,
/obj/structure/tribble_cage/ex_act(severity)
switch(severity)
- if (1)
+ if(1)
new /obj/item/weapon/shard( src.loc )
Break()
qdel(src)
- if (2)
- if (prob(50))
+ if(2)
+ if(prob(50))
src.health -= 15
src.healthcheck()
- if (3)
- if (prob(50))
+ if(3)
+ if(prob(50))
src.health -= 5
src.healthcheck()
@@ -158,15 +158,15 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles,
/obj/structure/tribble_cage/blob_act()
- if (prob(75))
+ if(prob(75))
new /obj/item/weapon/shard( src.loc )
Break()
qdel(src)
/obj/structure/tribble_cage/proc/healthcheck()
- if (src.health <= 0)
- if (!( src.destroyed ))
+ if(src.health <= 0)
+ if(!( src.destroyed ))
src.density = 0
src.destroyed = 1
new /obj/item/weapon/shard( src.loc )
@@ -192,12 +192,12 @@ var/global/totaltribbles = 0 //global variable so it updates for all tribbles,
/obj/structure/tribble_cage/attack_hand(mob/user as mob)
- if (src.destroyed)
+ if(src.destroyed)
return
else
to_chat(usr, text("\blue You kick the lab cage."))
for(var/mob/O in oviewers())
- if ((O.client && !( O.blinded )))
+ if((O.client && !( O.blinded )))
to_chat(O, text("\red [] kicks the lab cage.", usr))
src.health -= 2
healthcheck()
diff --git a/code/modules/mob/living/simple_animal/vox.dm b/code/modules/mob/living/simple_animal/vox.dm
deleted file mode 100644
index 1a46e46e4e4..00000000000
--- a/code/modules/mob/living/simple_animal/vox.dm
+++ /dev/null
@@ -1,169 +0,0 @@
-/mob/living/simple_animal/vox/armalis/
-
- name = "serpentine alien"
- real_name = "serpentine alien"
- desc = "A one-eyed, serpentine creature, half-machine, easily nine feet from tail to beak!"
- icon = 'icons/mob/vox.dmi'
- icon_state = "armalis"
- icon_living = "armalis"
- maxHealth = 500
- health = 500
- response_harm = "slashes at the"
- harm_intent_damage = 0
- melee_damage_lower = 30
- melee_damage_upper = 40
- attacktext = "slammed its enormous claws into"
- speed = -1
- attack_sound = 'sound/weapons/bladeslice.ogg'
- status_flags = 0
- universal_speak = 1
-
- var/armour = null
- var/amp = null
- var/quills = 3
-
-/mob/living/simple_animal/vox/armalis/death(gibbed)
- if(!gibbed)
- stat = DEAD
- visible_message("[src] shudders violently and explodes!","\red You feel your body rupture! ")
- explosion(get_turf(loc), -1, -1, 3, 5)
- gib()
- return
- return ..()
-
-/mob/living/simple_animal/vox/armalis/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
- if(O.force)
- if(O.force >= 25)
- var/damage = O.force
- if (O.damtype == STAMINA)
- damage = 0
- health -= damage
- for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
- M.show_message("\red \b [src] has been attacked with the [O] by [user]. ")
- else
- for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
- M.show_message("\red \b The [O] bounces harmlessly off of [src]. ")
- else
- to_chat(usr, "\red This weapon is ineffective, it does no damage.")
- for(var/mob/M in viewers(src, null))
- if ((M.client && !( M.blinded )))
- M.show_message("\red [user] gently taps [src] with the [O]. ")
-
-/mob/living/simple_animal/vox/armalis/verb/fire_quill(mob/target as mob in oview())
-
- set name = "Fire quill"
- set desc = "Fires a viciously pointed quill at a high speed."
- set category = "Alien"
-
- if(quills<=0)
- return
-
- to_chat(src, "\red You launch a razor-sharp quill at [target]!")
- for(var/mob/O in oviewers())
- if ((O.client && !( O.blinded )))
- to_chat(O, "\red [src] launches a razor-sharp quill at [target]!")
-
- var/obj/item/weapon/quill/Q = new(loc)
- Q.fingerprintslast = src.ckey
- Q.throw_at(target,10,30)
-
- quills--
-
- spawn(100)
- to_chat(src, "\red You feel a fresh quill slide into place.")
- quills++
-
-/obj/item/weapon/quill
- name = "vox quill"
- desc = "A wickedly barbed quill from some bizarre animal."
- icon_state = "quill"
- item_state = "quill"
- throwforce = 5
- w_class = 3.0
- sharp = 1
- edge = 0
-
-/mob/living/simple_animal/vox/armalis/verb/message_mob()
- set category = "Alien"
- set name = "Commune with creature"
- set desc = "Send a telepathic message to an unlucky recipient."
-
- var/list/targets = list()
- var/target = null
- var/text = null
-
- targets += getmobs() //Fill list, prompt user with list
- target = input("Select a creature!", "Speak to creature", null, null) as null|anything in targets
- text = input("What would you like to say?", "Speak to creature", null, null)
-
- if (!target || !text)
- return
-
- var/mob/M = targets[target]
-
- if(istype(M, /mob/dead/observer) || M.stat == DEAD)
- to_chat(src, "Not even the armalis can speak to the dead.")
- return
-
- to_chat(M, "\blue Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]")
- if(istype(M,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- if(H.species.name == "Vox")
- return
- to_chat(H, "\red Your nose begins to bleed...")
- H.drip(1)
-
-/mob/living/simple_animal/vox/armalis/verb/shriek()
- set category = "Alien"
- set name = "Shriek"
- set desc = "Give voice to a psychic shriek."
-
-/mob/living/simple_animal/vox/armalis/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
- if(istype(O,/obj/item/vox/armalis_armour))
- user.drop_item()
- armour = O
- speed = 1
- maxHealth += 200
- health += 200
- O.loc = src
- visible_message("\blue [src] is quickly outfitted in [O] by [user].","\blue You quickly outfit [src] in [O].")
- regenerate_icons()
- return
- if(istype(O,/obj/item/vox/armalis_amp))
- user.drop_item()
- amp = O
- O.loc = src
- visible_message("\blue [src] is quickly outfitted in [O] by [user].","\blue You quickly outfit [src] in [O].")
- regenerate_icons()
- return
- return ..()
-
-/mob/living/simple_animal/vox/armalis/regenerate_icons()
-
- overlays = list()
- if(armour)
- var/icon/armour = image('icons/mob/vox.dmi',"armour")
- speed = 1
- overlays += armour
- if(amp)
- var/icon/amp = image('icons/mob/vox.dmi',"amplifier")
- overlays += amp
- return
-
-/obj/item/vox/armalis_armour
-
- name = "strange armour"
- desc = "Hulking reinforced armour for something huge."
- icon = 'icons/obj/clothing/suits.dmi'
- icon_state = "armour-armalis"
- item_state = "armour-armalis"
-
-/obj/item/vox/armalis_amp
-
- name = "strange lenses"
- desc = "A series of metallic lenses and chains."
- icon = 'icons/obj/clothing/hats.dmi'
- icon_state = "amp"
- item_state = "amp"
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index 5cf956e610a..eec1b92e63d 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -74,12 +74,10 @@
add_click_catcher()
if(viewing_alternate_appearances && viewing_alternate_appearances.len)
- for(var/aakey in viewing_alternate_appearances)
- var/datum/alternate_appearance/AA = viewing_alternate_appearances[aakey]
- if(AA)
- AA.display_to(list(src))
+ for(var/datum/alternate_appearance/AA in viewing_alternate_appearances)
+ AA.display_to(list(src))
- CallHook("Login", list("client" = src.client, "mob" = src))
+ callHook("mob_login", list("client" = client, "mob" = src))
// Calling update_interface() in /mob/Login() causes the Cyborg to immediately be ghosted; because of winget().
// Calling it in the overriden Login, such as /mob/living/Login() doesn't cause this.
diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm
index fdc342876dc..ac13431f6b0 100644
--- a/code/modules/mob/logout.dm
+++ b/code/modules/mob/logout.dm
@@ -3,7 +3,7 @@
player_list -= src
log_access("Logout: [key_name(src)]")
if(admin_datums[src.ckey])
- if (ticker && ticker.current_state == GAME_STATE_PLAYING) //Only report this stuff if we are currently playing.
+ if(ticker && ticker.current_state == GAME_STATE_PLAYING) //Only report this stuff if we are currently playing.
var/admins_number = admins.len
message_admins("Admin logout: [key_name_admin(src)]")
@@ -11,6 +11,6 @@
send2adminirc("[key_name(src)] logged out - no more admins online.")
..()
- CallHook("Logout", list("client" = src.client, "mob" = src))
+ callHook("mob_logout", list("client" = client, "mob" = src))
return 1
\ No newline at end of file
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index f41cef386aa..d470e19c401 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -6,6 +6,7 @@
hud_used = null
if(mind && mind.current == src)
spellremove(src)
+ mobspellremove(src)
for(var/infection in viruses)
qdel(infection)
ghostize()
@@ -14,6 +15,10 @@
following_mobs = null
if(buckled)
buckled.unbuckle_mob()
+ if(viewing_alternate_appearances)
+ for(var/datum/alternate_appearance/AA in viewing_alternate_appearances)
+ AA.viewers -= src
+ viewing_alternate_appearances = null
return ..()
/mob/New()
@@ -23,7 +28,6 @@
else
living_mob_list += src
prepare_huds()
- emoteHandler = new /datum/emoteHandler(src)
..()
/atom/proc/prepare_huds()
@@ -57,20 +61,20 @@
if(!client) return
- if (type)
- if(type & 1 && (sdisabilities & BLIND || blinded || paralysis) )//Vision related
- if (!( alt ))
+ if(type)
+ if(type & 1 && (disabilities & BLIND || blinded || paralysis) )//Vision related
+ if(!( alt ))
return
else
msg = alt
type = alt_type
- if (type & 2 && (sdisabilities & DEAF || ear_deaf))//Hearing related
- if (!( alt ))
+ if(type & 2 && (disabilities & DEAF || ear_deaf))//Hearing related
+ if(!( alt ))
return
else
msg = alt
type = alt_type
- if ((type & 1 && sdisabilities & BLIND))
+ if((type & 1 && disabilities & BLIND))
return
// Added voice muffling for Issue 41.
if(stat == UNCONSCIOUS || (sleeping > 0 && stat != 2))
@@ -146,7 +150,7 @@
/mob/proc/findname(msg)
for(var/mob/M in mob_list)
- if (M.real_name == text("[]", msg))
+ if(M.real_name == text("[]", msg))
return M
return 0
@@ -155,8 +159,6 @@
/mob/proc/Life()
// handle_typing_indicator()
-// if(organStructure)
-// organStructure.ProcessOrgans()
return
@@ -171,7 +173,7 @@
var/obj/item/W = get_active_hand()
if(istype(W))
- if (istype(W, /obj/item/clothing))
+ if(istype(W, /obj/item/clothing))
var/obj/item/clothing/C = W
if(C.rig_restrict_helmet)
to_chat(src, "\red You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit)")// Stop eva helms equipping.
@@ -248,12 +250,12 @@
return // Bag could not be placed in players hands. I don't know what to do here...
//Now, B represents a container we can insert W into.
B.handle_item_insertion(W,1)
+ return B
//The list of slots by priority. equip_to_appropriate_slot() uses this list. Doesn't matter if a mob type doesn't have a slot.
var/list/slot_equipment_priority = list( \
slot_back,\
slot_wear_id,\
- slot_wear_pda,\
slot_w_uniform,\
slot_wear_suit,\
slot_wear_mask,\
@@ -402,7 +404,7 @@ var/list/slot_equipment_priority = list( \
if(slot_w_uniform)
if( !(slot_flags & SLOT_ICLOTHING) )
return 0
- if((FAT in H.mutations) && !(flags & ONESIZEFITSALL))
+ if((FAT in H.mutations) && !(flags_size & ONESIZEFITSALL))
return 0
if(H.w_uniform)
if(!(H.w_uniform.flags & NODROP))
@@ -481,7 +483,7 @@ var/list/slot_equipment_priority = list( \
return 0
return 1
if(slot_in_backpack)
- if (H.back && istype(H.back, /obj/item/weapon/storage/backpack))
+ if(H.back && istype(H.back, /obj/item/weapon/storage/backpack))
var/obj/item/weapon/storage/backpack/B = H.back
if(B.contents.len < B.storage_slots && w_class <= B.max_w_class)
return 1
@@ -490,12 +492,12 @@ var/list/slot_equipment_priority = list( \
//END HUMAN
/mob/proc/reset_view(atom/A)
- if (client)
- if (istype(A, /atom/movable))
+ if(client)
+ if(istype(A, /atom/movable))
client.perspective = EYE_PERSPECTIVE
client.eye = A
else
- if (isturf(loc))
+ if(isturf(loc))
client.eye = client.mob
client.perspective = MOB_PERSPECTIVE
else
@@ -546,7 +548,7 @@ var/list/slot_equipment_priority = list( \
return 0
var/tile = get_turf(A)
- if (!tile)
+ if(!tile)
return 0
changeNext_move(CLICK_CD_POINT)
@@ -559,30 +561,30 @@ var/list/slot_equipment_priority = list( \
return 1
/mob/proc/ret_grab(obj/effect/list_container/mobl/L as obj, flag)
- if ((!( istype(l_hand, /obj/item/weapon/grab) ) && !( istype(r_hand, /obj/item/weapon/grab) )))
- if (!( L ))
+ if((!( istype(l_hand, /obj/item/weapon/grab) ) && !( istype(r_hand, /obj/item/weapon/grab) )))
+ if(!( L ))
return null
else
return L.container
else
- if (!( L ))
+ if(!( L ))
L = new /obj/effect/list_container/mobl( null )
L.container += src
L.master = src
- if (istype(l_hand, /obj/item/weapon/grab))
+ if(istype(l_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = l_hand
- if (!( L.container.Find(G.affecting) ))
+ if(!( L.container.Find(G.affecting) ))
L.container += G.affecting
- if (G.affecting)
+ if(G.affecting)
G.affecting.ret_grab(L, 1)
- if (istype(r_hand, /obj/item/weapon/grab))
+ if(istype(r_hand, /obj/item/weapon/grab))
var/obj/item/weapon/grab/G = r_hand
- if (!( L.container.Find(G.affecting) ))
+ if(!( L.container.Find(G.affecting) ))
L.container += G.affecting
- if (G.affecting)
+ if(G.affecting)
G.affecting.ret_grab(L, 1)
- if (!( flag ))
- if (L.master == src)
+ if(!( flag ))
+ if(L.master == src)
var/list/temp = list( )
temp += L.container
//L = null
@@ -602,12 +604,12 @@ var/list/slot_equipment_priority = list( \
if(hand)
var/obj/item/W = l_hand
- if (W)
+ if(W)
W.attack_self(src)
update_inv_l_hand()
else
var/obj/item/W = r_hand
- if (W)
+ if(W)
W.attack_self(src)
update_inv_r_hand()
return
@@ -647,15 +649,15 @@ var/list/slot_equipment_priority = list( \
/mob/proc/store_memory(msg as message, popup, sane = 1)
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
- if (sane)
+ if(sane)
msg = sanitize(msg)
- if (length(memory) == 0)
+ if(length(memory) == 0)
memory += msg
else
memory += " [msg]"
- if (popup)
+ if(popup)
memory()
/mob/proc/update_flavor_text()
@@ -671,7 +673,7 @@ var/list/slot_equipment_priority = list( \
flavor_text = msg
/mob/proc/print_flavor_text(var/shrink = 1)
- if (flavor_text && flavor_text != "")
+ if(flavor_text && flavor_text != "")
var/msg = replacetext(flavor_text, "\n", " ")
if(lentext(msg) <= 40 || !shrink)
return "[html_encode(msg)] " //Repeat after me, "I will not give players access to decoded HTML."
@@ -688,11 +690,11 @@ var/list/slot_equipment_priority = list( \
set name = "Respawn"
set category = "OOC"
- if (!abandon_allowed)
+ if(!abandon_allowed)
to_chat(usr, "Respawning is disabled. ")
return
- if (stat != DEAD || !ticker)
+ if(stat != DEAD || !ticker)
to_chat(usr, "You must be dead to use this! ")
return
@@ -742,7 +744,7 @@ var/list/slot_equipment_priority = list( \
continue
if(istype(O, /obj/item/weapon/disk/nuclear))
var/name = "Nuclear Disk"
- if (names.Find(name))
+ if(names.Find(name))
namecounts[name]++
name = "[name] ([namecounts[name]])"
else
@@ -752,7 +754,7 @@ var/list/slot_equipment_priority = list( \
if(istype(O, /obj/singularity))
var/name = "Singularity"
- if (names.Find(name))
+ if(names.Find(name))
namecounts[name]++
name = "[name] ([namecounts[name]])"
else
@@ -763,7 +765,7 @@ var/list/slot_equipment_priority = list( \
for(var/mob/M in sortAtom(mob_list))
var/name = M.name
- if (names.Find(name))
+ if(names.Find(name))
namecounts[name]++
name = "[name] ([namecounts[name]])"
else
@@ -780,14 +782,14 @@ var/list/slot_equipment_priority = list( \
var/ok = "[is_admin ? "Admin Observe" : "Observe"]"
eye_name = input("Please, select a player!", ok, null, null) as null|anything in creatures
- if (!eye_name)
+ if(!eye_name)
return
var/mob/mob_eye = creatures[eye_name]
if(client && mob_eye)
client.eye = mob_eye
- if (is_admin)
+ if(is_admin)
client.adminobs = 1
if(mob_eye == client.mob || client.eye == client.mob)
client.adminobs = 0
@@ -869,9 +871,9 @@ var/list/slot_equipment_priority = list( \
//this and stop_pulling really ought to be /mob/living procs
/mob/proc/start_pulling(atom/movable/AM)
- if ( !AM || !src || src==AM || !isturf(AM.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort!
+ if( !AM || !src || src==AM || !isturf(AM.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort!
return
- if (!( AM.anchored ))
+ if(!( AM.anchored ))
AM.add_fingerprint(src)
// If we're pulling something then drop what we're currently pulling and pull this instead.
@@ -957,8 +959,8 @@ var/list/slot_equipment_priority = list( \
if(mind && mind.changeling)
add_stings_to_statpanel(mind.changeling.purchasedpowers)
- if(spell_list && spell_list.len)
- for(var/obj/effect/proc_holder/spell/S in spell_list)
+ if(mob_spell_list && mob_spell_list.len)
+ for(var/obj/effect/proc_holder/spell/S in mob_spell_list)
add_spell_to_statpanel(S)
if(mind && istype(src, /mob/living) && mind.spell_list && mind.spell_list.len)
for(var/obj/effect/proc_holder/spell/S in mind.spell_list)
@@ -991,6 +993,7 @@ var/list/slot_equipment_priority = list( \
for(var/obj/effect/proc_holder/changeling/S in stings)
if(S.chemical_cost >=0 && S.can_be_used_by(src))
statpanel("[S.panel]",((S.chemical_cost > 0) ? "[S.chemical_cost]" : ""),S)
+
/mob/proc/add_spell_to_statpanel(var/obj/effect/proc_holder/spell/S)
switch(S.charge_type)
if("recharge")
@@ -999,17 +1002,6 @@ var/list/slot_equipment_priority = list( \
statpanel(S.panel,"[S.charge_counter]/[S.charge_max]",S)
if("holdervar")
statpanel(S.panel,"[S.holder_var_type] [S.holder_var_amount]",S)
- /* // Why have a duplicate set of turfs in the stat panel?
- if(listed_turf)
- if(get_dist(listed_turf,src) > 1)
- listed_turf = null
- else
- statpanel(listed_turf.name,listed_turf.name,listed_turf)
- for(var/atom/A in listed_turf)
- if(A.invisibility > see_invisible)
- continue
- statpanel(listed_turf.name,A.name,A)
- */
// facing verbs
@@ -1024,7 +1016,7 @@ var/list/slot_equipment_priority = list( \
return 1
//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it.
-/mob/proc/update_canmove()
+/mob/proc/update_canmove(delay_action_updates = 0)
var/ko = weakened || paralysis || stat || (status_flags & FAKEDEATH)
var/buckle_lying = !(buckled && !buckled.buckle_lying)
if(ko || resting || stunned)
@@ -1049,6 +1041,8 @@ var/list/slot_equipment_priority = list( \
layer = initial(layer)
update_transform()
+ if(!delay_action_updates)
+ update_action_buttons_icon()
return canmove
/mob/proc/fall(var/forced)
@@ -1244,7 +1238,7 @@ mob/proc/yank_out_object()
affected.wounds += I
H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 1)
- if (ishuman(U))
+ if(ishuman(U))
var/mob/living/carbon/human/human_user = U
human_user.bloody_hands(H)
@@ -1328,11 +1322,11 @@ mob/proc/yank_out_object()
/mob/proc/get_ghost(even_if_they_cant_reenter = 0)
if(mind)
- for(var/mob/dead/observer/G in dead_mob_list)
- if(G.mind == mind)
- if(G.can_reenter_corpse || even_if_they_cant_reenter)
- return G
- break
+ return mind.get_ghost(even_if_they_cant_reenter)
+
+/mob/proc/grab_ghost(force)
+ if(mind)
+ return mind.grab_ghost(force = force)
/mob/proc/notify_ghost_cloning(var/message = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!", var/sound = 'sound/effects/genetics.ogg', var/atom/source = null)
var/mob/dead/observer/ghost = get_ghost()
@@ -1344,7 +1338,7 @@ mob/proc/yank_out_object()
if(stat==DEAD)
return
var/turf/location = loc
- if (istype(location, /turf/simulated))
+ if(istype(location, /turf/simulated))
if(green)
if(!no_text)
visible_message("[src] vomits up some green goo! ","You vomit up some green goo! ")
@@ -1362,18 +1356,17 @@ mob/proc/yank_out_object()
/mob/proc/setEarDamage()
return
-/mob/proc/AddSpell(var/obj/effect/proc_holder/spell/spell)
- spell_list += spell
- if(!spell.action)
- spell.action = new/datum/action/spell_action
- spell.action.target = spell
- spell.action.name = spell.name
- spell.action.button_icon = spell.action_icon
- spell.action.button_icon_state = spell.action_icon_state
- spell.action.background_icon_state = spell.action_background_icon_state
- if(isliving(src))
- spell.action.Grant(src)
- return
+/mob/proc/AddSpell(obj/effect/proc_holder/spell/S)
+ mob_spell_list += S
+ S.action.Grant(src)
+
+/mob/proc/RemoveSpell(obj/effect/proc_holder/spell/spell) //To remove a specific spell from a mind
+ if(!spell)
+ return
+ for(var/obj/effect/proc_holder/spell/S in mob_spell_list)
+ if(istype(S, spell))
+ qdel(S)
+ mob_spell_list -= S
//override to avoid rotating pixel_xy on mobs
/mob/shuttleRotate(rotation)
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index e9ee311db76..90f84b7fc74 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -26,7 +26,7 @@
plane = HUD_PLANE
item_state = "nothing"
icon = 'icons/mob/screen_gen.dmi'
- w_class = 5.0
+ w_class = 5
/obj/item/weapon/grab/New(var/mob/user, var/mob/victim)
@@ -54,7 +54,7 @@
//check if assailant is grabbed by victim as well
if(assailant.grabbed_by)
- for (var/obj/item/weapon/grab/G in assailant.grabbed_by)
+ for(var/obj/item/weapon/grab/G in assailant.grabbed_by)
if(G.assailant == affecting && G.affecting == assailant)
G.dancing = 1
G.adjust_position()
@@ -362,7 +362,7 @@
msg_admin_attack("[key_name(assailant)] has pressed his fingers into [key_name(affecting)]'s eyes.")
var/obj/item/organ/internal/eyes/eyes = affected.get_int_organ(/obj/item/organ/internal/eyes)
eyes.damage += rand(3,4)
- if (eyes.damage >= eyes.min_broken_damage)
+ if(eyes.damage >= eyes.min_broken_damage)
if(M.stat != 2)
to_chat(M, "\red You go blind!")*///This is a demonstration of adding a new damaging type based on intent as well as hitzone.
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 7e6d1f6dcd3..86cadaa595f 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -22,7 +22,7 @@
return 0
return 1
-/proc/isloyal(A) //Checks to see if the person contains a loyalty implant, then checks that the implant is actually inside of them
+/proc/isloyal(A) //Checks to see if the person contains a mindshield implant, then checks that the implant is actually inside of them
for(var/obj/item/weapon/implant/loyalty/L in A)
if(L && L.implanted)
return 1
@@ -63,7 +63,7 @@ proc/iscuffed(A)
proc/isdeaf(A)
if(istype(A, /mob))
var/mob/M = A
- return (M.sdisabilities & DEAF) || M.ear_deaf
+ return (M.disabilities & DEAF) || M.ear_deaf
return 0
proc/hassensorlevel(A, var/level)
@@ -124,12 +124,12 @@ proc/getsensorlevel(A)
return 0
/proc/stars(n, pr)
- if (pr == null)
+ if(pr == null)
pr = 25
- if (pr <= 0)
+ if(pr <= 0)
return null
else
- if (pr >= 100)
+ if(pr >= 100)
return n
var/te = n
var/t = ""
@@ -137,7 +137,7 @@ proc/getsensorlevel(A)
var/p = null
p = 1
while(p <= n)
- if ((copytext(te, p, p + 1) == " " || prob(pr)))
+ if((copytext(te, p, p + 1) == " " || prob(pr)))
t = text("[][]", t, copytext(te, p, p + 1))
else
t = text("[]*", t)
@@ -176,14 +176,14 @@ proc/slur(phrase, var/list/slurletters = ("'"))//use a different list as an inpu
p = 1//1 is the start of any word
while(p <= n)//while P, which starts at 1 is less or equal to N which is the length.
var/n_letter = copytext(te, p, p + 1)//copies text from a certain distance. In this case, only one letter at a time.
- if (prob(80) && (ckey(n_letter) in list("b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z")))
- if (prob(10))
+ if(prob(80) && (ckey(n_letter) in list("b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z")))
+ if(prob(10))
n_letter = text("[n_letter]-[n_letter]-[n_letter]-[n_letter]")//replaces the current letter with this instead.
else
- if (prob(20))
+ if(prob(20))
n_letter = text("[n_letter]-[n_letter]-[n_letter]")
else
- if (prob(5))
+ if(prob(5))
n_letter = null
else
n_letter = text("[n_letter]-[n_letter]")
@@ -200,14 +200,14 @@ proc/slur(phrase, var/list/slurletters = ("'"))//use a different list as an inpu
while(p <= n)//while P, which starts at 1 is less or equal to N which is the length.
var/robotletter = pick("@", "!", "#", "$", "%", "&", "?") //for beep boop
var/n_letter = copytext(te, p, p + 1)//copies text from a certain distance. In this case, only one letter at a time.
- if (prob(80) && (ckey(n_letter) in list("b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z")))
- if (prob(10))
+ if(prob(80) && (ckey(n_letter) in list("b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z")))
+ if(prob(10))
n_letter = text("[n_letter]-[robotletter]-[n_letter]-[n_letter]")//replaces the current letter with this instead.
else
- if (prob(20))
+ if(prob(20))
n_letter = text("[n_letter]-[robotletter]-[n_letter]")
else
- if (prob(5))
+ if(prob(5))
n_letter = robotletter
else
n_letter = text("[n_letter]-[n_letter]")
@@ -276,7 +276,7 @@ proc/muffledspeech(phrase)
/proc/findname(msg)
for(var/mob/M in mob_list)
- if (M.real_name == text("[msg]"))
+ if(M.real_name == text("[msg]"))
return 1
return 0
@@ -358,7 +358,7 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
/proc/is_blind(A)
if(iscarbon(A))
var/mob/living/carbon/C = A
- if(C.sdisabilities & BLIND || C.blinded)
+ if(C.disabilities & BLIND || C.blinded)
return 1
return 0
@@ -448,7 +448,7 @@ var/list/intents = list(I_HELP,I_DISARM,I_GRAB,I_HARM)
A.overlays += alert_overlay
/mob/proc/switch_to_camera(var/obj/machinery/camera/C)
- if (!C.can_use() || stat || (get_dist(C, src) > 1 || machine != src || blinded || !canmove))
+ if(!C.can_use() || stat || (get_dist(C, src) > 1 || machine != src || blinded || !canmove))
return 0
check_eye(src)
return 1
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 9cf0b902d35..7be09dbed18 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -9,9 +9,9 @@
return 1
if(ismob(mover))
var/mob/moving_mob = mover
- if ((other_mobs && moving_mob.other_mobs))
+ if((other_mobs && moving_mob.other_mobs))
return 1
- if (mover == buckled_mob)
+ if(mover == buckled_mob)
return 1
return (!mover.density || !density || lying)
@@ -107,7 +107,7 @@
set hidden = 1
if(!istype(mob, /mob/living/carbon))
return
- if (!mob.stat && isturf(mob.loc) && !mob.restrained())
+ if(!mob.stat && isturf(mob.loc) && !mob.restrained())
mob:toggle_throw_mode()
else
return
@@ -122,9 +122,9 @@
/client/Center()
/* No 3D movement in 2D spessman game. dir 16 is Z Up
- if (isobj(mob.loc))
+ if(isobj(mob.loc))
var/obj/O = mob.loc
- if (mob.canmove)
+ if(mob.canmove)
return O.relaymove(mob, 16)
*/
return
@@ -251,14 +251,14 @@
L -= mob
var/mob/M = L[1]
if(M)
- if ((get_dist(mob, M) <= 1 || M.loc == mob.loc))
+ if((get_dist(mob, M) <= 1 || M.loc == mob.loc))
. = ..()
- if (isturf(M.loc))
+ if(isturf(M.loc))
var/diag = get_dir(mob, M)
- if ((diag - 1) & diag)
+ if((diag - 1) & diag)
else
diag = null
- if ((get_dist(mob, M) > 1 || diag))
+ if((get_dist(mob, M) > 1 || diag))
step(M, get_dir(M.loc, T))
else
for(var/mob/M in L)
@@ -279,11 +279,11 @@
else
. = ..()
- for (var/obj/item/weapon/grab/G in mob)
- if (G.state == GRAB_NECK)
+ for(var/obj/item/weapon/grab/G in mob)
+ if(G.state == GRAB_NECK)
mob.set_dir(reverse_dir[direct])
G.adjust_position()
- for (var/obj/item/weapon/grab/G in mob.grabbed_by)
+ for(var/obj/item/weapon/grab/G in mob.grabbed_by)
G.adjust_position()
moving = 0
@@ -449,17 +449,17 @@
return 0
/mob/proc/Move_Pulled(atom/A)
- if (!canmove || restrained() || !pulling)
+ if(!canmove || restrained() || !pulling)
return
- if (pulling.anchored)
+ if(pulling.anchored)
return
- if (!pulling.Adjacent(src))
+ if(!pulling.Adjacent(src))
return
- if (A == loc && pulling.density)
+ if(A == loc && pulling.density)
return
- if (!Process_Spacemove(get_dir(pulling.loc, A)))
+ if(!Process_Spacemove(get_dir(pulling.loc, A)))
return
- if (ismob(pulling))
+ if(ismob(pulling))
var/mob/M = pulling
var/atom/movable/t = M.pulling
M.stop_pulling()
diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm
index f7cff248519..c226f3a0176 100644
--- a/code/modules/mob/new_player/login.dm
+++ b/code/modules/mob/new_player/login.dm
@@ -27,7 +27,7 @@
loc = pick(watch_locations)
*/
- CallHook("Login", list("client" = src.client, "mob" = src))
+ callHook("mob_login", list("client" = client, "mob" = src))
new_player_panel()
if(ckey in deadmins)
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index f752b1f4409..0dfa4ef64fe 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -70,8 +70,8 @@
..()
statpanel("Status")
- if (client.statpanel == "Status" && ticker)
- if (ticker.current_state != GAME_STATE_PREGAME)
+ if(client.statpanel == "Status" && ticker)
+ if(ticker.current_state != GAME_STATE_PREGAME)
stat(null, "Station Time: [worldtime2text()]")
statpanel("Lobby")
if(client.statpanel=="Lobby" && ticker)
@@ -90,12 +90,12 @@
if(ticker.current_state == GAME_STATE_PREGAME)
stat("Players:", "[totalPlayers]")
- if(client.holder)
+ if(check_rights(R_ADMIN, 0, src))
stat("Players Ready:", "[totalPlayersReady]")
totalPlayers = 0
totalPlayersReady = 0
for(var/mob/new_player/player in player_list)
- if(client.holder)
+ if(check_rights(R_ADMIN, 0, src))
stat("[player.key]", (player.ready)?("(Playing)"):(null))
totalPlayers++
if(player.ready)
@@ -123,7 +123,7 @@
var/mob/dead/observer/observer = new()
src << browse(null, "window=playersetup")
spawning = 1
- to_chat(src, sound(null, repeat = 0, wait = 0, volume = 85, channel = 1))// MAD JAMS cant last forever yo
+ src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)// MAD JAMS cant last forever yo
observer.started_as_observer = 1
@@ -245,6 +245,8 @@
if(jobban_isbanned(src,rank)) return 0
if(!is_job_whitelisted(src, rank)) return 0
if(!job.player_old_enough(src.client)) return 0
+ if(job.admin_only && !(check_rights(R_ADMIN, 0))) return 0
+
if(config.assistantlimit)
if(job.title == "Civilian")
var/count = 0
@@ -258,9 +260,22 @@
return 0
return 1
+/mob/new_player/proc/IsAdminJob(rank)
+ var/datum/job/job = job_master.GetJob(rank)
+ if(job.admin_only)
+ return 1
+ else
+ return 0
+
+/mob/new_player/proc/IsERTSpawnJob(rank)
+ var/datum/job/job = job_master.GetJob(rank)
+ if(job.spawn_ert)
+ return 1
+ else
+ return 0
/mob/new_player/proc/AttemptLateSpawn(rank,var/spawning_at)
- if (src != usr)
+ if(src != usr)
return 0
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
to_chat(usr, "\red The round is either not ready, or has already finished...")
@@ -300,20 +315,26 @@
var/join_message
var/datum/spawnpoint/S
- if(spawning_at)
- S = spawntypes[spawning_at]
-
- if(S && istype(S))
- if(S.check_job_spawning(rank))
- character.loc = pick(S.turfs)
- join_message = S.msg
+ if(IsAdminJob(rank))
+ if(IsERTSpawnJob(rank))
+ character.loc = pick(ertdirector)
+ else
+ character.loc = pick(aroomwarp)
+ join_message = "has arrived"
+ else
+ if(spawning_at)
+ S = spawntypes[spawning_at]
+ if(S && istype(S))
+ if(S.check_job_spawning(rank))
+ character.loc = pick(S.turfs)
+ join_message = S.msg
+ else
+ to_chat(character, "Your chosen spawnpoint ([S.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead.")
+ character.loc = pick(latejoin)
+ join_message = "has arrived on the station"
else
- to_chat(character, "Your chosen spawnpoint ([S.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead.")
character.loc = pick(latejoin)
join_message = "has arrived on the station"
- else
- character.loc = pick(latejoin)
- join_message = "has arrived on the station"
character.lastarea = get_area(loc)
// Moving wheelchair if they have one
@@ -323,23 +344,27 @@
ticker.mode.latespawn(character)
- if(character.mind.assigned_role != "Cyborg")
+ if(character.mind.assigned_role == "Cyborg")
+ AnnounceCyborg(character, rank, join_message)
+ callHook("latespawn", list(character))
+ else if(IsAdminJob(rank))
+ callHook("latespawn", list(character))
+ else
data_core.manifest_inject(character)
ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn
AnnounceArrival(character, rank, join_message)
callHook("latespawn", list(character))
- else
- AnnounceCyborg(character, rank, join_message)
- callHook("latespawn", list(character))
+
+
qdel(src)
/mob/new_player/proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank, var/join_message)
- if (ticker.current_state == GAME_STATE_PLAYING)
+ if(ticker.current_state == GAME_STATE_PLAYING)
var/ailist[] = list()
- for (var/mob/living/silicon/ai/A in living_mob_list)
+ for(var/mob/living/silicon/ai/A in living_mob_list)
ailist += A
- if (ailist.len)
+ if(ailist.len)
var/mob/living/silicon/ai/announcer = pick(ailist)
if(character.mind)
if((character.mind.assigned_role != "Cyborg") && (character.mind.special_role != "MODE"))
@@ -360,11 +385,11 @@
global_announcer.autosay("[character.real_name],[rank ? " [rank]," : " visitor," ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer")
/mob/new_player/proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message)
- if (ticker.current_state == GAME_STATE_PLAYING)
+ if(ticker.current_state == GAME_STATE_PLAYING)
var/ailist[] = list()
- for (var/mob/living/silicon/ai/A in living_mob_list)
+ for(var/mob/living/silicon/ai/A in living_mob_list)
ailist += A
- if (ailist.len)
+ if(ailist.len)
var/mob/living/silicon/ai/announcer = pick(ailist)
if(character.mind)
if((character.mind.special_role != "MODE"))
@@ -390,21 +415,64 @@
else if(shuttle_master.emergency.mode >= SHUTTLE_CALL)
dat += "The station is currently undergoing evacuation procedures. "
- dat += "Choose from the following open positions: "
+ dat += "Choose from the following open positions: "
+
+ var/list/activePlayers = list()
+ var/list/categorizedJobs = list(
+ "Command" = list(jobs = list(), titles = command_positions, color = "#aac1ee"),
+ "Engineering" = list(jobs = list(), titles = engineering_positions, color = "#ffd699"),
+ "Security" = list(jobs = list(), titles = security_positions, color = "#ff9999"),
+ "Miscellaneous" = list(jobs = list(), titles = list(), color = "#ffffff", colBreak = 1),
+ "Synthetic" = list(jobs = list(), titles = nonhuman_positions, color = "#ccffcc"),
+ "Support / Service" = list(jobs = list(), titles = service_positions, color = "#cccccc"),
+ "Medical" = list(jobs = list(), titles = medical_positions, color = "#99ffe6", colBreak = 1),
+ "Science" = list(jobs = list(), titles = science_positions, color = "#e6b3e6"),
+ "Supply" = list(jobs = list(), titles = supply_positions, color = "#ead4ae"),
+ )
for(var/datum/job/job in job_master.occupations)
if(job && IsJobAvailable(job.title))
- var/active = 0
+ activePlayers[job] = 0
+ var/categorized = 0
// Only players with the job assigned and AFK for less than 10 minutes count as active
- for(var/mob/M in player_list) if(M.mind && M.client && M.mind.assigned_role == job.title && M.client.inactivity <= 10 * 60 * 10)
- active++
- dat += "[job.title] ([job.current_positions]) (Active: [active]) "
+ for(var/mob/M in player_list) if(M.mind && M.client && M.mind.assigned_role == job.title && M.client.inactivity <= 10 MINUTES)
+ activePlayers[job]++
+ for(var/jobcat in categorizedJobs)
+ var/list/jobs = categorizedJobs[jobcat]["jobs"]
+ if(job.title in categorizedJobs[jobcat]["titles"])
+ categorized = 1
+ if(jobcat == "Command") // Put captain at top of command jobs
+ if(job.title == "Captain")
+ jobs.Insert(1, job)
+ else
+ jobs += job
+ else // Put heads at top of non-command jobs
+ if(job.title in command_positions)
+ jobs.Insert(1, job)
+ else
+ jobs += job
+ if(!categorized)
+ categorizedJobs["Miscellaneous"]["jobs"] += job
- dat += ""
+ dat += ""
+ for(var/jobcat in categorizedJobs)
+ if(categorizedJobs[jobcat]["colBreak"])
+ dat += " "
+ if(length(categorizedJobs[jobcat]["jobs"]) < 1)
+ continue
+ var/color = categorizedJobs[jobcat]["color"]
+ dat += ""
+ dat += "[jobcat] "
+ for(var/datum/job/job in categorizedJobs[jobcat]["jobs"])
+ dat += "[job.title] ([job.current_positions]) (Active: [activePlayers[job]]) "
+ dat += " "
+
+ dat += "
"
// Removing the old window method but leaving it here for reference
// src << browse(dat, "window=latechoices;size=300x640;can_close=1")
// Added the new browser window method
- var/datum/browser/popup = new(src, "latechoices", "Choose Profession", 440, 500)
+ var/datum/browser/popup = new(src, "latechoices", "Choose Profession", 900, 600)
popup.add_stylesheet("playeroptions", 'html/browser/playeroptions.css')
+ popup.add_script("delay_interactivity", 'html/browser/delay_interactivity.js')
popup.set_content(dat)
popup.open(0) // 0 is passed to open so that it doesn't use the onclose() proc
@@ -421,7 +489,7 @@
client.prefs.real_name = random_name(client.prefs.gender)
client.prefs.copy_to(new_character)
- to_chat(src, sound(null, repeat = 0, wait = 0, volume = 85, channel = 1))// MAD JAMS cant last forever yo
+ src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)// MAD JAMS cant last forever yo
if(mind)
diff --git a/code/modules/mob/new_player/poll.dm b/code/modules/mob/new_player/poll.dm
index 4ce44be1fd8..beb2c255308 100644
--- a/code/modules/mob/new_player/poll.dm
+++ b/code/modules/mob/new_player/poll.dm
@@ -209,12 +209,12 @@
output += " [optiontext]: "
output += "abstain "
- for (var/j = minvalue; j <= maxvalue; j++)
+ for(var/j = minvalue; j <= maxvalue; j++)
if(j == minvalue && descmin)
output += "[j] ([descmin]) "
- else if (j == midvalue && descmid)
+ else if(j == midvalue && descmid)
output += "[j] ([descmid]) "
- else if (j == maxvalue && descmax)
+ else if(j == maxvalue && descmax)
output += "[j] ([descmax]) "
else
output += "[j] "
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 0632e0af5e8..dc0916ee344 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -260,7 +260,7 @@
// Skin tone
if(current_species && (current_species.bodyflags & HAS_SKIN_TONE))
- if (s_tone >= 0)
+ if(s_tone >= 0)
preview_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
else
preview_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index 70d1e72205a..f280bec0ce1 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -28,12 +28,17 @@
usr.say(message)
-/mob/verb/me_verb()
+/mob/verb/me_verb(message as text)
set name = "Me"
- set category = "Emotes"
+ set category = "IC"
- if(emoteHandler)
- return emoteHandler.runEmote("me")
+ message = strip_html_properly(message)
+
+ set_typing_indicator(0)
+ if(use_me)
+ custom_emote(usr.emote_type, message)
+ else
+ usr.emote(message)
/mob/proc/say_dead(var/message)
@@ -46,26 +51,25 @@
to_chat(usr, "You have deadchat muted. ")
return
- say_dead_direct("[pick("complains","moans","whines","laments","blubbers")], \"[message]\" ", src)
+ say_dead_direct("[pick("complains", "moans", "whines", "laments", "blubbers", "salts")], \"[message]\" ", src)
-/mob/proc/say_understands(var/mob/other,var/datum/language/speaking = null)
-
- if (src.stat == 2) //Dead
+/mob/proc/say_understands(var/mob/other, var/datum/language/speaking = null)
+ if(stat == DEAD)
return 1
//Universal speak makes everything understandable, for obvious reasons.
- else if(src.universal_speak || src.universal_understand)
+ if(universal_speak || universal_understand)
return 1
//Languages are handled after.
- if (!speaking)
+ if(!speaking)
if(!other)
return 1
if(other.universal_speak)
return 1
if(isAI(src) && ispAI(other))
return 1
- if (istype(other, src.type) || istype(src, other.type))
+ if(istype(other, src.type) || istype(src, other.type))
return 1
return 0
@@ -73,7 +77,7 @@
return 1
//Language check.
- for(var/datum/language/L in src.languages)
+ for(var/datum/language/L in languages)
if(speaking.name == L.name)
return 1
@@ -87,18 +91,16 @@
if(speaking)
verb = speaking.get_spoken_verb(ending)
else
- if(ending=="!")
- verb = pick("exclaims","shouts","yells")
- else if(ending=="?")
+ if(ending == "!")
+ verb = pick("exclaims", "shouts", "yells")
+ else if(ending == "?")
verb = "asks"
return verb
/mob/proc/emote(var/act, var/type, var/message)
-
- act = lowertext(act)
- return emoteHandler.runEmote(act, message, type)
-
+ if(act == "me")
+ return custom_emote(type, message)
/mob/proc/get_ear()
@@ -111,17 +113,17 @@
/mob/proc/say_test(var/text)
var/ending = copytext(text, length(text))
- if (ending == "?")
+ if(ending == "?")
return "1"
- else if (ending == "!")
+ else if(ending == "!")
return "2"
return "0"
//parses the message mode code (e.g. :h, :w) from text, such as that supplied to say.
//returns the message mode string or null for no message mode.
//standard mode is the mode returned for the special ';' radio code.
-/mob/proc/parse_message_mode(var/message, var/standard_mode="headset")
- if(length(message) >= 1 && copytext(message,1,2) == ";")
+/mob/proc/parse_message_mode(var/message, var/standard_mode = "headset")
+ if(length(message) >= 1 && copytext(message, 1, 2) == ";")
return standard_mode
if(length(message) >= 2)
@@ -133,17 +135,14 @@
//parses the language code (e.g. :j) from text, such as that supplied to say.
//returns the language object only if the code corresponds to a language that src can speak, otherwise null.
/mob/proc/parse_language(var/message)
- var/prefix = copytext(message,1,2)
+ var/prefix = copytext(message, 1, 2)
if(length(message) >= 1 && prefix == "!")
return all_languages["Noise"]
if(length(message) >= 2)
var/language_prefix = trim_right(lowertext(copytext(message, 1 ,4)))
var/datum/language/L = language_keys[language_prefix]
- if (can_speak(L))
+ if(can_speak(L))
return L
return null
-
-/mob/proc/custom_emote(var/m_type=0, var/message = null)
- return emoteHandler.runEmote("me", message, m_type)
\ No newline at end of file
diff --git a/code/modules/mob/spirit/spirit.dm b/code/modules/mob/spirit/spirit.dm
index f7229a69e1f..cbfbe02d39b 100644
--- a/code/modules/mob/spirit/spirit.dm
+++ b/code/modules/mob/spirit/spirit.dm
@@ -26,7 +26,7 @@ mob/spirit
mob/spirit/proc/is_active()
- if (client && client.inactivity <= 10 * 60 * 10)
+ if(client && client.inactivity <= 10 * 60 * 10)
return TRUE
return FALSE
@@ -39,7 +39,7 @@ mob/spirit/New()
loc = pick(latejoin)
// no nameless spirits
- if (!name)
+ if(!name)
name = "Boogyman"
spirits+=src
@@ -58,10 +58,10 @@ mob/spirit/Topic(href, href_list)
..()
to_chat(usr, "Spirit Href = [href]")
- for (var/tempref in href_list)
+ for(var/tempref in href_list)
to_chat(usr, "Spirit href list [tempref] = [href_list[tempref]]")
- if (href_list["track"])
+ if(href_list["track"])
to_chat(usr, "Got to tracking.")
var/mob/target = locate(href_list["track"]) in mob_list
var/mob/spirit/A = locate(href_list["track2"]) in spirits//should i keep this or no?
diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm
index 49d9a7aad48..9c6c8f2fa73 100644
--- a/code/modules/mob/typing_indicator.dm
+++ b/code/modules/mob/typing_indicator.dm
@@ -15,10 +15,10 @@ var/global/image/typing_indicator
if(ishuman(src))
var/mob/living/carbon/human/H = src
- if(H.sdisabilities & MUTE || H.silent)
+ if(H.disabilities & MUTE || H.silent)
overlays -= typing_indicator
return
-
+
if(client)
if((client.prefs.toggles & SHOW_TYPING) || stat != CONSCIOUS || is_muzzled())
overlays -= typing_indicator
@@ -62,11 +62,11 @@ var/global/image/typing_indicator
if(!(client.prefs.toggles & SHOW_TYPING) && !hud_typing)
var/temp = winget(client, "input", "text")
- if (temp != last_typed)
+ if(temp != last_typed)
last_typed = temp
last_typed_time = world.time
- if (world.time > last_typed_time + TYPING_INDICATOR_LIFETIME)
+ if(world.time > last_typed_time + TYPING_INDICATOR_LIFETIME)
set_typing_indicator(0)
return
if(length(temp) > 5 && findtext(temp, "Say \"", 1, 7))
diff --git a/code/modules/nano/interaction/base.dm b/code/modules/nano/interaction/base.dm
index e70b4423705..0db9eb19eeb 100644
--- a/code/modules/nano/interaction/base.dm
+++ b/code/modules/nano/interaction/base.dm
@@ -12,9 +12,9 @@
return STATUS_CLOSE
/mob/proc/shared_nano_interaction()
- if (src.stat || !client)
+ if(src.stat || !client)
return STATUS_CLOSE // no updates, close the interface
- else if (restrained() || lying || stat || stunned || weakened)
+ else if(restrained() || lying || stat || stunned || weakened)
return STATUS_UPDATE // update only (orange visibility)
return STATUS_INTERACTIVE
@@ -26,7 +26,7 @@
/mob/living/silicon/ai/shared_nano_interaction()
if(lacks_power())
return STATUS_CLOSE
- if (check_unable(1, 0))
+ if(check_unable(1, 0))
return STATUS_CLOSE
return ..()
diff --git a/code/modules/nano/interaction/default.dm b/code/modules/nano/interaction/default.dm
index ad70ec7f484..a97c693ec94 100644
--- a/code/modules/nano/interaction/default.dm
+++ b/code/modules/nano/interaction/default.dm
@@ -64,15 +64,15 @@
return user.shared_living_nano_distance(src_object)
/mob/living/proc/shared_living_nano_distance(var/atom/movable/src_object)
- if (!(src_object in view(4, src))) // If the src object is not in visable, disable updates
+ if(!(src_object in view(4, src))) // If the src object is not in visable, disable updates
return STATUS_CLOSE
var/dist = get_dist(src_object, src)
- if (dist <= 1)
+ if(dist <= 1)
return STATUS_INTERACTIVE // interactive (green visibility)
- else if (dist <= 2)
+ else if(dist <= 2)
return STATUS_UPDATE // update only (orange visibility)
- else if (dist <= 4)
+ else if(dist <= 4)
return STATUS_DISABLED // no updates, completely disabled (red visibility)
return STATUS_CLOSE
diff --git a/code/modules/nano/modules/alarm_monitor.dm b/code/modules/nano/modules/alarm_monitor.dm
index 5c38f480a49..b6a8a70780d 100644
--- a/code/modules/nano/modules/alarm_monitor.dm
+++ b/code/modules/nano/modules/alarm_monitor.dm
@@ -81,7 +81,7 @@
data["categories"] = categories
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "alarm_monitor.tmpl", "Alarm Monitoring Console", 800, 800, state = state)
ui.set_initial_data(data)
ui.open()
diff --git a/code/modules/nano/modules/crew_monitor.dm b/code/modules/nano/modules/crew_monitor.dm
index 848530c3c1d..a587295b582 100644
--- a/code/modules/nano/modules/crew_monitor.dm
+++ b/code/modules/nano/modules/crew_monitor.dm
@@ -5,7 +5,7 @@
if(..())
return 1
var/turf/T = get_turf(nano_host())
- if (!T || !(T.z in config.player_levels))
+ if(!T || !(T.z in config.player_levels))
to_chat(usr, "Unable to establish a connection: You're too far away from the station!")
return 0
if(href_list["track"])
diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm
index 55027a90852..ee289cfec9b 100644
--- a/code/modules/nano/modules/human_appearance.dm
+++ b/code/modules/nano/modules/human_appearance.dm
@@ -213,7 +213,7 @@
data["change_facial_hair_color"] = can_change(APPEARANCE_FACIAL_HAIR_COLOR)
data["change_marking_color"] = can_change_markings()
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "appearance_changer.tmpl", "[src]", 800, 450, state = state)
ui.set_initial_data(data)
ui.open()
diff --git a/code/modules/nano/modules/law_manager.dm b/code/modules/nano/modules/law_manager.dm
index df00504cf1f..9f10759dbe5 100644
--- a/code/modules/nano/modules/law_manager.dm
+++ b/code/modules/nano/modules/law_manager.dm
@@ -170,14 +170,14 @@
data["view"] = current_view
var/channels[0]
- for (var/ch_name in owner.law_channels())
+ for(var/ch_name in owner.law_channels())
channels[++channels.len] = list("channel" = ch_name)
data["channel"] = owner.lawchannel
data["channels"] = channels
data["law_sets"] = package_multiple_laws(data["isAdmin"] ? admin_laws : player_laws)
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "law_manager.tmpl", sanitize("[src] - [owner.name]"), 800, is_malf(user) ? 600 : 400, state = state)
ui.set_initial_data(data)
ui.open()
diff --git a/code/modules/nano/modules/power_monitor.dm b/code/modules/nano/modules/power_monitor.dm
index f2c9297b1a9..9b9ccc8a060 100644
--- a/code/modules/nano/modules/power_monitor.dm
+++ b/code/modules/nano/modules/power_monitor.dm
@@ -19,7 +19,7 @@
data["select_monitor"] = 1
data["powermonitors"] = powermonitor_repository.powermonitor_data()
- if (powermonitor && !isnull(powermonitor.powernet))
+ if(powermonitor && !isnull(powermonitor.powernet))
if(select_monitor && (powermonitor.stat & (NOPOWER|BROKEN)))
powermonitor = null
return
@@ -29,7 +29,7 @@
data["apcs"] = apc_repository.apc_data(powermonitor)
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "power_monitor.tmpl", "Power Monitoring Console", 800, 700, state = state)
ui.set_initial_data(data)
ui.open()
diff --git a/code/modules/nano/nanoexternal.dm b/code/modules/nano/nanoexternal.dm
index 08f9deffa9f..c463f895158 100644
--- a/code/modules/nano/nanoexternal.dm
+++ b/code/modules/nano/nanoexternal.dm
@@ -13,13 +13,13 @@
var/datum/nanoui/ui = locate(uiref)
- if (istype(ui))
+ if(istype(ui))
ui.close()
if(ui.ref)
var/href = "close=1"
src.Topic(href, params2list(href), ui.ref) // this will direct to the atom's Topic() proc via client.Topic()
- else if (ui.on_close_logic)
+ else if(ui.on_close_logic)
// no atomref specified (or not found)
// so just reset the user mob's machine var
if(src && src.mob)
diff --git a/code/modules/nano/nanomanager.dm b/code/modules/nano/nanomanager.dm
index edf8218731e..355397ef6cf 100644
--- a/code/modules/nano/nanomanager.dm
+++ b/code/modules/nano/nanomanager.dm
@@ -19,13 +19,13 @@
* @return /nanoui Returns the found ui, for null if none exists
*/
/datum/nanomanager/proc/try_update_ui(var/mob/user, src_object, ui_key, var/datum/nanoui/ui, data, var/force_open = 0)
- if (isnull(ui)) // no ui has been passed, so we'll search for one
+ if(isnull(ui)) // no ui has been passed, so we'll search for one
{
ui = get_open_ui(user, src_object, ui_key)
}
- if (!isnull(ui))
+ if(!isnull(ui))
// The UI is already open
- if (!force_open)
+ if(!force_open)
ui.push_data(data)
return ui
else
@@ -44,15 +44,15 @@
*/
/datum/nanomanager/proc/get_open_ui(var/mob/user, src_object, ui_key)
var/src_object_key = "\ref[src_object]"
- if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
+ if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
//testing("nanomanager/get_open_ui mob [user.name] [src_object:name] [ui_key] - there are no uis open")
return null
- else if (isnull(open_uis[src_object_key][ui_key]) || !istype(open_uis[src_object_key][ui_key], /list))
+ else if(isnull(open_uis[src_object_key][ui_key]) || !istype(open_uis[src_object_key][ui_key], /list))
//testing("nanomanager/get_open_ui mob [user.name] [src_object:name] [ui_key] - there are no uis open for this object")
return null
- for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key])
- if (ui.user == user)
+ for(var/datum/nanoui/ui in open_uis[src_object_key][ui_key])
+ if(ui.user == user)
return ui
//testing("nanomanager/get_open_ui mob [user.name] [src_object:name] [ui_key] - ui not found")
@@ -67,12 +67,12 @@
*/
/datum/nanomanager/proc/update_uis(src_object)
var/src_object_key = "\ref[src_object]"
- if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
+ if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
return 0
var/update_count = 0
- for (var/ui_key in open_uis[src_object_key])
- for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key])
+ for(var/ui_key in open_uis[src_object_key])
+ for(var/datum/nanoui/ui in open_uis[src_object_key][ui_key])
if(ui && ui.src_object && ui.user && ui.src_object.nano_host())
ui.process(1)
update_count++
@@ -87,12 +87,12 @@
*/
/datum/nanomanager/proc/close_uis(src_object)
var/src_object_key = "\ref[src_object]"
- if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
+ if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
return 0
var/close_count = 0
- for (var/ui_key in open_uis[src_object_key])
- for (var/datum/nanoui/ui in open_uis[src_object_key][ui_key])
+ for(var/ui_key in open_uis[src_object_key])
+ for(var/datum/nanoui/ui in open_uis[src_object_key][ui_key])
if(ui && ui.src_object && ui.user && ui.src_object.nano_host())
ui.close()
close_count++
@@ -108,12 +108,12 @@
* @return int The number of uis updated
*/
/datum/nanomanager/proc/update_user_uis(var/mob/user, src_object = null, ui_key = null)
- if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0)
+ if(isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0)
return 0 // has no open uis
var/update_count = 0
- for (var/datum/nanoui/ui in user.open_uis)
- if ((isnull(src_object) || !isnull(src_object) && ui.src_object == src_object) && (isnull(ui_key) || !isnull(ui_key) && ui.ui_key == ui_key))
+ for(var/datum/nanoui/ui in user.open_uis)
+ if((isnull(src_object) || !isnull(src_object) && ui.src_object == src_object) && (isnull(ui_key) || !isnull(ui_key) && ui.ui_key == ui_key))
ui.process(1)
update_count++
@@ -129,13 +129,13 @@
* @return int The number of uis closed
*/
/datum/nanomanager/proc/close_user_uis(var/mob/user, src_object = null, ui_key = null)
- if (isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0)
+ if(isnull(user.open_uis) || !istype(user.open_uis, /list) || open_uis.len == 0)
//testing("nanomanager/close_user_uis mob [user.name] has no open uis")
return 0 // has no open uis
var/close_count = 0
- for (var/datum/nanoui/ui in user.open_uis)
- if ((isnull(src_object) || !isnull(src_object) && ui.src_object == src_object) && (isnull(ui_key) || !isnull(ui_key) && ui.ui_key == ui_key))
+ for(var/datum/nanoui/ui in user.open_uis)
+ if((isnull(src_object) || !isnull(src_object) && ui.src_object == src_object) && (isnull(ui_key) || !isnull(ui_key) && ui.ui_key == ui_key))
ui.close()
close_count++
@@ -153,9 +153,9 @@
*/
/datum/nanomanager/proc/ui_opened(var/datum/nanoui/ui)
var/src_object_key = "\ref[ui.src_object]"
- if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
+ if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
open_uis[src_object_key] = list(ui.ui_key = list())
- else if (isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list))
+ else if(isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list))
open_uis[src_object_key][ui.ui_key] = list();
ui.user.open_uis.Add(ui)
@@ -174,9 +174,9 @@
*/
/datum/nanomanager/proc/ui_closed(var/datum/nanoui/ui)
var/src_object_key = "\ref[ui.src_object]"
- if (isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
+ if(isnull(open_uis[src_object_key]) || !istype(open_uis[src_object_key], /list))
return 0 // wasn't open
- else if (isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list))
+ else if(isnull(open_uis[src_object_key][ui.ui_key]) || !istype(open_uis[src_object_key][ui.ui_key], /list))
return 0 // wasn't open
processing_uis.Remove(ui)
@@ -214,14 +214,14 @@
*/
/datum/nanomanager/proc/user_transferred(var/mob/oldMob, var/mob/newMob)
//testing("nanomanager/user_transferred from mob [oldMob.name] to mob [newMob.name]")
- if (!oldMob || isnull(oldMob.open_uis) || !istype(oldMob.open_uis, /list) || open_uis.len == 0)
+ if(!oldMob || isnull(oldMob.open_uis) || !istype(oldMob.open_uis, /list) || open_uis.len == 0)
//testing("nanomanager/user_transferred mob [oldMob.name] has no open uis")
return 0 // has no open uis
- if (isnull(newMob.open_uis) || !istype(newMob.open_uis, /list))
+ if(isnull(newMob.open_uis) || !istype(newMob.open_uis, /list))
newMob.open_uis = list()
- for (var/datum/nanoui/ui in oldMob.open_uis)
+ for(var/datum/nanoui/ui in oldMob.open_uis)
ui.user = newMob
newMob.open_uis.Add(ui)
diff --git a/code/modules/nano/nanomapgen.dm b/code/modules/nano/nanomapgen.dm
index 62ad6649e20..710083cb158 100644
--- a/code/modules/nano/nanomapgen.dm
+++ b/code/modules/nano/nanomapgen.dm
@@ -25,31 +25,31 @@
/client/proc/nanomapgen_DumpTile(var/startX = 1, var/startY = 1, var/currentZ = 1, var/endX = -1, var/endY = -1)
- if (endX < 0 || endX > world.maxx)
+ if(endX < 0 || endX > world.maxx)
endX = world.maxx
- if (endY < 0 || endY > world.maxy)
+ if(endY < 0 || endY > world.maxy)
endY = world.maxy
- if (currentZ < 0 || currentZ > world.maxz)
+ if(currentZ < 0 || currentZ > world.maxz)
to_chat(usr, "NanoMapGen: ERROR: currentZ ([currentZ]) must be between 1 and [world.maxz] ")
sleep(3)
return NANOMAP_TERMINALERR
- if (startX > endX)
+ if(startX > endX)
to_chat(usr, "NanoMapGen: ERROR: startX ([startX]) cannot be greater than endX ([endX]) ")
sleep(3)
return NANOMAP_TERMINALERR
- if (startY > endX)
+ if(startY > endX)
to_chat(usr, "NanoMapGen: ERROR: startY ([startY]) cannot be greater than endY ([endY]) ")
sleep(3)
return NANOMAP_TERMINALERR
var/icon/Tile = icon(file("nano/mapbase1024.png"))
- if (Tile.Width() != NANOMAP_MAX_ICON_DIMENSION || Tile.Height() != NANOMAP_MAX_ICON_DIMENSION)
+ if(Tile.Width() != NANOMAP_MAX_ICON_DIMENSION || Tile.Height() != NANOMAP_MAX_ICON_DIMENSION)
log_to_dd("NanoMapGen: ERROR: BASE IMAGE DIMENSIONS ARE NOT [NANOMAP_MAX_ICON_DIMENSION]x[NANOMAP_MAX_ICON_DIMENSION] ")
sleep(3)
return NANOMAP_TERMINALERR
@@ -70,7 +70,7 @@
count++
- if (count % 8000 == 0)
+ if(count % 8000 == 0)
log_to_dd("NanoMapGen: [count] tiles done ")
sleep(1)
@@ -84,7 +84,7 @@
to_chat(usr, "NanoMapGen: Done. File [mapFilename] uploaded to your cache. ")
- if (Tile.Width() != NANOMAP_MAX_ICON_DIMENSION || Tile.Height() != NANOMAP_MAX_ICON_DIMENSION)
+ if(Tile.Width() != NANOMAP_MAX_ICON_DIMENSION || Tile.Height() != NANOMAP_MAX_ICON_DIMENSION)
return NANOMAP_BADOUTPUT
return NANOMAP_SUCCESS
\ No newline at end of file
diff --git a/code/modules/nano/nanoui.dm b/code/modules/nano/nanoui.dm
index d1fbdb6a868..7451005d4b2 100644
--- a/code/modules/nano/nanoui.dm
+++ b/code/modules/nano/nanoui.dm
@@ -85,13 +85,13 @@ nanoui is used to open and update nano browser uis
// add the passed template filename as the "main" template, this is required
add_template("main", ntemplate_filename)
- if (ntitle)
+ if(ntitle)
title = ntitle
- if (nwidth)
+ if(nwidth)
width = nwidth
- if (nheight)
+ if(nheight)
height = nheight
- if (nref)
+ if(nref)
ref = nref
add_common_assets()
@@ -123,14 +123,14 @@ nanoui is used to open and update nano browser uis
* @return nothing
*/
/datum/nanoui/proc/set_status(state, push_update)
- if (state != status) // Only update if it is different
- if (status == STATUS_DISABLED)
+ if(state != status) // Only update if it is different
+ if(status == STATUS_DISABLED)
status = state
- if (push_update)
+ if(push_update)
update()
else
status = state
- if (push_update || status == 0)
+ if(push_update || status == 0)
push_data(null, 1) // Update the UI, force the update in case the status is 0, data is null so that previous data is used
/**
@@ -209,7 +209,7 @@ nanoui is used to open and update nano browser uis
var/list/send_data = list("config" = config_data)
- if (!isnull(data))
+ if(!isnull(data))
send_data["data"] = data
return send_data
@@ -345,14 +345,14 @@ nanoui is used to open and update nano browser uis
var/head_content = ""
- for (var/filename in scripts)
+ for(var/filename in scripts)
head_content += " "
- for (var/filename in stylesheets)
+ for(var/filename in stylesheets)
head_content += " "
var/template_data_json = "{}" // An empty JSON object
- if (templates.len > 0)
+ if(templates.len > 0)
template_data_json = json_encode(templates)
var/list/send_data = get_send_data(initial_data)
@@ -371,7 +371,7 @@ nanoui is used to open and update nano browser uis
{
// We need both jQuery and NanoStateManager to be able to recieve data
// At the moment any data received before those libraries are loaded will be lost
- if (typeof NanoStateManager != 'undefined' && typeof jQuery != 'undefined')
+ if(typeof NanoStateManager != 'undefined' && typeof jQuery != 'undefined')
{
NanoStateManager.receiveUpdateData(jsonString);
}
@@ -406,7 +406,7 @@ nanoui is used to open and update nano browser uis
if(!user.client)
return
var/window_size = ""
- if (width && height)
+ if(width && height)
window_size = "size=[width]x[height];"
update_status(0)
if(status == STATUS_CLOSE)
@@ -450,7 +450,7 @@ nanoui is used to open and update nano browser uis
*/
/datum/nanoui/proc/push_data(data, force_push = 0)
update_status(0)
- if (status == STATUS_DISABLED && !force_push)
+ if(status == STATUS_DISABLED && !force_push)
return // Cannot update UI, no visibility
var/list/send_data = get_send_data(data)
@@ -468,7 +468,7 @@ nanoui is used to open and update nano browser uis
*/
/datum/nanoui/Topic(href, href_list)
update_status(0) // update the status
- if (status != STATUS_INTERACTIVE || user != usr) // If UI is not interactive or usr calling Topic is not the UI user
+ if(status != STATUS_INTERACTIVE || user != usr) // If UI is not interactive or usr calling Topic is not the UI user
return
// This is used to toggle the nano map ui
@@ -481,7 +481,7 @@ nanoui is used to open and update nano browser uis
set_map_z_level(text2num(href_list["mapZLevel"]))
map_update = 1
- if ((src_object && src_object.Topic(href, href_list, 0, state)) || map_update)
+ if((src_object && src_object.Topic(href, href_list, 0, state)) || map_update)
nanomanager.update_uis(src_object) // update all UIs attached to src_object
/**
@@ -493,11 +493,11 @@ nanoui is used to open and update nano browser uis
* @return nothing
*/
/datum/nanoui/proc/process(update = 0)
- if (!src_object || !user)
+ if(!src_object || !user)
close()
return
- if (status && (update || is_auto_updating))
+ if(status && (update || is_auto_updating))
update() // Update the UI (update_status() is called whenever a UI is updated)
else
update_status(1) // Not updating UI, so lets check here if status has changed
diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm
index 5e6a1cbcb32..701c4e7080b 100644
--- a/code/modules/ninja/energy_katana.dm
+++ b/code/modules/ninja/energy_katana.dm
@@ -5,7 +5,7 @@
item_state = "energy_katana"
force = 40
throwforce = 20
- armour_penetration = 15
+ armour_penetration = 50
var/cooldown = 0 // Because spam aint cool, yo.
var/datum/effect/system/spark_spread/spark_system
diff --git a/code/modules/ninja/martial_art.dm b/code/modules/ninja/martial_art.dm
index 0903425f89d..35969ab8d5e 100644
--- a/code/modules/ninja/martial_art.dm
+++ b/code/modules/ninja/martial_art.dm
@@ -165,7 +165,7 @@
if(user.a_intent == "help") // No special move for help intent.
user.pointed(A)
return 0
- if (!(A in range(1,user))) // Is the target within one tile of us?
+ if(!(A in range(1,user))) // Is the target within one tile of us?
user.pointed(A)
return 0
diff --git a/code/modules/ninja/suit/SpiderOS.dm b/code/modules/ninja/suit/SpiderOS.dm
index 871e8215bbd..002e58fbddf 100644
--- a/code/modules/ninja/suit/SpiderOS.dm
+++ b/code/modules/ninja/suit/SpiderOS.dm
@@ -70,7 +70,7 @@
if(1)
dat += " Atmospheric Scan: "//Headers don't need breaks. They are automatically placed.
var/turf/T = get_turf(U.loc)
- if (isnull(T))
+ if(isnull(T))
dat += "Unable to obtain a reading."
else
var/datum/gas_mixture/environment = T.return_air()
@@ -80,7 +80,7 @@
dat += "Air Pressure: [round(pressure,0.1)] kPa"
- if (total_moles)
+ if(total_moles)
var/o2_level = environment.oxygen/total_moles
var/n2_level = environment.nitrogen/total_moles
var/co2_level = environment.carbon_dioxide/total_moles
@@ -101,12 +101,12 @@
dat += " Detected PDAs: "
dat += ""
var/count = 0
- for (var/obj/item/device/pda/P in get_viewable_pdas())
+ for(var/obj/item/device/pda/P in get_viewable_pdas())
dat += "[P] "
dat += " "
count++
dat += " "
- if (count == 0)
+ if(count == 0)
dat += "None detected. "
if(4)
dat += {"
@@ -126,7 +126,7 @@
A mix of traitor, changeling, and wizard. Ninjas rely on energy, or electricity to be precise, to keep their suits running (when out of energy, a suit hibernates). Suits gain energy from objects or creatures that contain electrical charge. APCs, cell batteries, rechargers, SMES batteries, cyborgs, mechs, and exposed wires are currently supported. Through energy ninjas gain access to special powers--while all powers are tied to the ninja suit, the most useful of them are verb activated--to help them in their mission. It is a constant struggle for a ninja to remain hidden long enough to recharge the suit and accomplish their objective; despite their arsenal of abilities, ninjas can die like any other. Unlike wizards, ninjas do not possess good crowd control and are typically forced to play more subdued in order to achieve their goals. Some of their abilities are specifically designed to confuse and disorient others. With that said, it should be perfectly possible to completely flip the fuck out and rampage as a ninja.
Their powers:
There are two primary types: Equipment and Abilties. Passive effect are always on. Active effect must be turned on and remain active only when there is energy to do so. Ability costs are listed next to them.
- Equipment : cannot be tracked by AI (passive), faster speed (passive), stealth (active), vision switch (passive if toggled), voice masking (passive), SpiderOS (passive if toggled), energy drain (passive if toggled).
+ Equipment : cannot be tracked by AI (passive), faster speed (passive), stealth (active), vision switch(passive if toggled), voice masking (passive), SpiderOS (passive if toggled), energy drain (passive if toggled).
Voice masking generates a random name the ninja can use over the radio and in-person. Although, the former use is recommended.
Toggling vision cycles to one of the following: thermal, meson, or darkness vision. The starting mode allows one to scout the identity of those in view, revealing their role. Traitors, revolutionaries, wizards, and other such people will be made known to you.
diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm
index c2fb287b9a8..5cb67e73db6 100644
--- a/code/modules/ninja/suit/shoes.dm
+++ b/code/modules/ninja/suit/shoes.dm
@@ -5,7 +5,7 @@
icon_state = "s-ninja"
permeability_coefficient = 0.01
flags = NOSLIP
- armor = list(melee = 60, bullet = 60, laser = 45,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 60, bullet = 60, laser = 45, energy = 15, bomb = 30, bio = 30, rad = 30)
cold_protection = FEET
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
heat_protection = FEET
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index 936f947758d..73ac456ebf9 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -15,7 +15,7 @@ Contents:
allowed = list(/obj/item/weapon/gun, /obj/item/ammo_box, /obj/item/weapon/melee/baton, /obj/item/weapon/tank, /obj/item/weapon/stock_parts/cell)
slowdown = 0
unacidable = 1
- armor = list(melee = 60, bullet = 60, laser = 45,energy = 15, bomb = 30, bio = 30, rad = 30)
+ armor = list(melee = 60, bullet = 60, laser = 45, energy = 15, bomb = 30, bio = 30, rad = 30)
var/suitActive = 0
var/suitBusy = 0
diff --git a/code/modules/ninja/suit/suit_attackby.dm b/code/modules/ninja/suit/suit_attackby.dm
index 620c2261782..ad4c64decca 100644
--- a/code/modules/ninja/suit/suit_attackby.dm
+++ b/code/modules/ninja/suit/suit_attackby.dm
@@ -6,7 +6,7 @@
var/obj/item/weapon/stock_parts/cell/CELL
if(CELL.maxcharge > cell.maxcharge && suitGloves)
to_chat(U, "Higher maximum capacity detected.\nUpgrading... ")
- if (n_gloves && n_gloves.candrain && do_after(U,s_delay, target = U))
+ if(n_gloves && n_gloves.candrain && do_after(U,s_delay, target = U))
U.drop_item()
CELL.loc = src
CELL.charge = min(CELL.charge+cell.charge, CELL.maxcharge)
diff --git a/code/modules/paperwork/carbonpaper.dm b/code/modules/paperwork/carbonpaper.dm
index 643c5b1fbb7..126112c316a 100644
--- a/code/modules/paperwork/carbonpaper.dm
+++ b/code/modules/paperwork/carbonpaper.dm
@@ -12,7 +12,7 @@
icon_state = "cpaper_words"
return
icon_state = "cpaper"
- else if (copied)
+ else if(copied)
if(info)
icon_state = "paper_words"
return
@@ -30,7 +30,7 @@
set category = "Object"
set src in usr
- if (copied == 0)
+ if(copied == 0)
var/obj/item/weapon/paper/carbon/c = src
var/copycontents = html_decode(c.info)
var/obj/item/weapon/paper/carbon/copy = new /obj/item/weapon/paper/carbon (usr.loc)
diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm
index fbb26b650a8..e8db4c58110 100644
--- a/code/modules/paperwork/clipboard.dm
+++ b/code/modules/paperwork/clipboard.dm
@@ -4,7 +4,7 @@
icon_state = "clipboard"
item_state = "clipboard"
throwforce = 0
- w_class = 2.0
+ w_class = 2
throw_speed = 3
throw_range = 10
var/obj/item/weapon/pen/haspen //The stored pen.
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index c0e7a2bc468..d10e8c9f3f6 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -75,7 +75,7 @@ var/list/alldepartments = list()
data["respectcooldown"] = 0
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "faxmachine.tmpl", "Fax Machine UI", 540, 450)
ui.set_initial_data(data)
ui.open()
@@ -86,12 +86,12 @@ var/list/alldepartments = list()
if(href_list["send"])
if(copyitem && authenticated)
- if ((destination in admin_departments) || (destination in hidden_admin_departments))
+ if((destination in admin_departments) || (destination in hidden_admin_departments))
send_admin_fax(usr, destination)
else
sendfax(destination,usr)
- if (sendcooldown)
+ if(sendcooldown)
spawn(sendcooldown) // cooldown time
sendcooldown = 0
nanomanager.update_uis(src)
@@ -104,7 +104,7 @@ var/list/alldepartments = list()
copyitem = null
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/photo) || istype(I, /obj/item/weapon/paper_bundle))
+ if(istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/photo) || istype(I, /obj/item/weapon/paper_bundle))
usr.drop_item()
copyitem = I
I.loc = src
@@ -135,7 +135,7 @@ var/list/alldepartments = list()
if(copyitem)
var/n_name = sanitize(copytext(input(usr, "What would you like to label the fax?", "Fax Labelling", copyitem.name) as text, 1, MAX_MESSAGE_LEN))
if((copyitem && copyitem.loc == src && usr.stat == 0))
- if (istype(copyitem, /obj/item/weapon/paper))
+ if(istype(copyitem, /obj/item/weapon/paper))
copyitem.name = "[(n_name ? text("[n_name]") : initial(copyitem.name))]"
copyitem.desc = "This is a paper titled '" + copyitem.name + "'."
else if(istype(copyitem, /obj/item/weapon/photo))
@@ -158,7 +158,7 @@ var/list/alldepartments = list()
else
if(!card)
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.loc = src
scan = I
@@ -180,7 +180,7 @@ var/list/alldepartments = list()
if( F.department == destination )
success = F.receivefax(copyitem)
- if (success)
+ if(success)
var/datum/fax/F = new /datum/fax()
F.name = copyitem.name
F.from_department = department
@@ -209,11 +209,11 @@ var/list/alldepartments = list()
// give the sprite some time to flick
sleep(20)
- if (istype(incoming, /obj/item/weapon/paper))
+ if(istype(incoming, /obj/item/weapon/paper))
copy(incoming)
- else if (istype(incoming, /obj/item/weapon/photo))
+ else if(istype(incoming, /obj/item/weapon/photo))
photocopy(incoming)
- else if (istype(incoming, /obj/item/weapon/paper_bundle))
+ else if(istype(incoming, /obj/item/weapon/paper_bundle))
bundlecopy(incoming)
else
return 0
@@ -228,11 +228,11 @@ var/list/alldepartments = list()
use_power(200)
var/obj/item/rcvdcopy
- if (istype(copyitem, /obj/item/weapon/paper))
+ if(istype(copyitem, /obj/item/weapon/paper))
rcvdcopy = copy(copyitem)
- else if (istype(copyitem, /obj/item/weapon/photo))
+ else if(istype(copyitem, /obj/item/weapon/photo))
rcvdcopy = photocopy(copyitem)
- else if (istype(copyitem, /obj/item/weapon/paper_bundle))
+ else if(istype(copyitem, /obj/item/weapon/paper_bundle))
rcvdcopy = bundlecopy(copyitem)
else
visible_message("[src] beeps, \"Error transmitting message.\"")
@@ -251,9 +251,9 @@ var/list/alldepartments = list()
//message badmins that a fax has arrived
switch(destination)
- if ("Central Command")
+ if("Central Command")
message_admins(sender, "CENTCOM FAX", destination, rcvdcopy, "#006100")
- if ("Syndicate")
+ if("Syndicate")
message_admins(sender, "SYNDICATE FAX", destination, rcvdcopy, "#DC143C")
sendcooldown = 1800
sleep(50)
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index cd52d4424e3..ad3bbda5f1e 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -60,7 +60,9 @@
for(var/obj/item/P in src)
dat += "[P.name] "
dat += "
"
- user << browse("[name] [dat]", "window=filingcabinet;size=350x300")
+ var/datum/browser/popup = new(user, "filingcabinet", name, 350, 300)
+ popup.set_content(dat)
+ popup.open(0)
return
@@ -83,7 +85,7 @@
/obj/structure/filingcabinet/Topic(href, href_list)
if(href_list["retrieve"])
- usr << browse("", "window=filingcabinet") // Close the menu
+ usr << browse(null, "window=filingcabinet") // Close the menu
//var/retrieveindex = text2num(href_list["retrieve"])
var/obj/item/P = locate(href_list["retrieve"])//contents[retrieveindex]
diff --git a/code/modules/paperwork/frames.dm b/code/modules/paperwork/frames.dm
index f988cf117cc..46f4e12d97e 100644
--- a/code/modules/paperwork/frames.dm
+++ b/code/modules/paperwork/frames.dm
@@ -224,7 +224,7 @@
explosive.forceMove(user.loc)
explosive = null
qdel(src)
- if(istype(I, /obj/item/weapon/grenade) || istype(I, /obj/item/weapon/c4))
+ if(istype(I, /obj/item/weapon/grenade) || istype(I, /obj/item/weapon/grenade/plastic/c4))
if(explosive)
to_chat(user, "There is already a device attached behind \the [src], remove it first. ")
return 1
@@ -268,11 +268,6 @@
var/obj/item/weapon/grenade/G = explosive
explosive = null
G.prime()
- else if(istype(explosive, /obj/item/weapon/c4))
- var/obj/item/weapon/c4/C = explosive
- explosive = null
- C.target = get_step(get_turf(src), dir)
- C.explode(get_turf(loc))
/obj/structure/sign/picture_frame/proc/toggle_tilt(mob/user)
if(!isliving(usr) || usr.stat)
@@ -312,4 +307,4 @@
/obj/structure/sign/picture_frame/hear_message(mob/living/M as mob, msg)
..()
for(var/obj/O in contents)
- O.hear_message(M, msg)
\ No newline at end of file
+ O.hear_message(M, msg)
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 11f864451b7..a3ec39243a9 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -9,7 +9,7 @@
icon = 'icons/obj/bureaucracy.dmi'
icon_state = "paper"
throwforce = 0
- w_class = 1.0
+ w_class = 1
throw_range = 1
throw_speed = 1
layer = 4
@@ -374,44 +374,44 @@
return
if(istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/photo))
- if (istype(P, /obj/item/weapon/paper/carbon))
+ if(istype(P, /obj/item/weapon/paper/carbon))
var/obj/item/weapon/paper/carbon/C = P
- if (!C.iscopy && !C.copied)
+ if(!C.iscopy && !C.copied)
to_chat(user, "Take off the carbon copy first. ")
add_fingerprint(user)
return
var/obj/item/weapon/paper_bundle/B = new(src.loc)
- if (name != "paper")
+ if(name != "paper")
B.name = name
- else if (P.name != "paper" && P.name != "photo")
+ else if(P.name != "paper" && P.name != "photo")
B.name = P.name
user.unEquip(P)
- if (istype(user, /mob/living/carbon/human))
+ if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/h_user = user
- if (h_user.r_hand == src)
+ if(h_user.r_hand == src)
h_user.unEquip(src)
h_user.put_in_r_hand(B)
- else if (h_user.l_hand == src)
+ else if(h_user.l_hand == src)
h_user.unEquip(src)
h_user.put_in_l_hand(B)
- else if (h_user.l_store == src)
+ else if(h_user.l_store == src)
h_user.unEquip(src)
B.loc = h_user
B.layer = 20
B.plane = HUD_PLANE
h_user.l_store = B
h_user.update_inv_pockets()
- else if (h_user.r_store == src)
+ else if(h_user.r_store == src)
h_user.unEquip(src)
B.loc = h_user
B.layer = 20
B.plane = HUD_PLANE
h_user.r_store = B
h_user.update_inv_pockets()
- else if (h_user.head == src)
+ else if(h_user.head == src)
h_user.unEquip(src)
h_user.put_in_hands(B)
- else if (!istype(src.loc, /turf))
+ else if(!istype(src.loc, /turf))
src.loc = get_turf(h_user)
if(h_user.client) h_user.client.screen -= src
h_user.put_in_hands(B)
@@ -577,7 +577,7 @@
/obj/item/weapon/paper/armory
name = "paper- 'Armory Inventory'"
- info = "4 Deployable Barriers 4 Portable Flashers 1 Mechanical Toolbox 2 Boxes of Spare Handcuffs 1 Box of Flashbangs 1 Box of Spare R.O.B.U.S.T. Cartridges 1 Tracking Implant Kit 1 Chemical Implant Kit 1 Box of Tear Gas Grenades 1 Explosive Ordnance Disposal Suit 1 Biohazard Suit 6 Gas Masks 1 Lockbox of Loyalty Implants 1 Ion Rifle 3 Sets of Riot Equipment 2 Sets of Security Hardsuits 1 Ablative Armor Vest 3 Bulletproof Vests 3 Helmets 2 Riot Shotguns 2 Boxes of Beanbag Shells 3 Laser Guns 3 Energy Guns 3 Advanced Tasers"
+ info = "4 Deployable Barriers 4 Portable Flashers 1 Mechanical Toolbox 2 Boxes of Spare Handcuffs 1 Box of Flashbangs 1 Box of Spare R.O.B.U.S.T. Cartridges 1 Tracking Implant Kit 1 Chemical Implant Kit 1 Box of Tear Gas Grenades 1 Explosive Ordnance Disposal Suit 1 Biohazard Suit 6 Gas Masks 1 Lockbox of Mindshield Implants 1 Ion Rifle 3 Sets of Riot Equipment 2 Sets of Security Hardsuits 1 Ablative Armor Vest 3 Bulletproof Vests 3 Helmets 2 Riot Shotguns 2 Boxes of Beanbag Shells 3 Laser Guns 3 Energy Guns 3 Advanced Tasers"
/obj/item/weapon/paper/firingrange
name = "paper- 'Firing Range Instructions'"
@@ -676,23 +676,32 @@
/obj/item/weapon/paper/evilfax/proc/evilpaper_specialaction(var/mob/living/carbon/target)
spawn(30)
if(istype(target,/mob/living/carbon))
- if(myeffect == "borging")
+ if(myeffect == "Borgification")
+ to_chat(target,"You seem to comprehend the AI a little better. Why are your muscles so stiff? ")
target.ForceContractDisease(new /datum/disease/transformation/robot(0))
- else if(myeffect == "corgifying")
+ else if(myeffect == "Corgification")
+ to_chat(target,"You hear distant howling as the world seems to grow bigger around you. Boy, that itch sure is getting worse! ")
target.ForceContractDisease(new /datum/disease/transformation/corgi(0))
- else if(myeffect == "firedeath")
+ else if(myeffect == "Death By Fire")
+ to_chat(target,"You feel hotter than usual. Maybe you should lowe-wait, is that your hand melting? ")
var/turf/simulated/T = get_turf(target)
new /obj/effect/hotspot(T)
target.adjustFireLoss(150) // hard crit, the burning takes care of the rest.
- else if(myeffect == "braindeath")
- to_chat(target,"A series of bright lights flash across your vision: COGNITOHAZARD YHWH-3 ACTIVATED ")
+ else if(myeffect == "Total Brain Death")
+ to_chat(target,"You see a message appear in front of you in bright red letters: YHWH-3 ACTIVATED. TERMINATION IN 3 SECONDS ")
target.mutations.Add(NOCLONE)
target.adjustBrainLoss(125)
- else if(myeffect == "honktumor")
+ else if(myeffect == "Honk Tumor")
if(!target.get_int_organ(/obj/item/organ/internal/honktumor))
var/obj/item/organ/internal/organ = new /obj/item/organ/internal/honktumor
+ to_chat(target,"Life seems funnier, somehow. ")
organ.insert(target)
- else if(myeffect == "demotion")
+ else if(myeffect == "Cluwne")
+ if(istype(target, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = target
+ to_chat(H, "You feel surrounded by sadness. Sadness... and HONKS! ")
+ H.makeCluwne()
+ else if(myeffect == "Demotion Notice")
command_announcement.Announce("[mytarget] is hereby demoted to the rank of Civilian. Process this demotion immediately. Failure to comply with these orders is grounds for termination.","CC Demotion Order")
else
message_admins("Evil paper [src] was activated without a proper effect set! This is a bug.")
diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm
index 0cd00015af4..0e472c166be 100644
--- a/code/modules/paperwork/paper_bundle.dm
+++ b/code/modules/paperwork/paper_bundle.dm
@@ -5,7 +5,7 @@
icon_state = "paper"
item_state = "paper"
throwforce = 0
- w_class = 1.0
+ w_class = 1
throw_range = 2
throw_speed = 1
layer = 4
@@ -21,9 +21,9 @@
var/obj/item/weapon/paper/P
if(istype(W, /obj/item/weapon/paper))
P = W
- if (istype(P, /obj/item/weapon/paper/carbon))
+ if(istype(P, /obj/item/weapon/paper/carbon))
var/obj/item/weapon/paper/carbon/C = P
- if (!C.iscopy && !C.copied)
+ if(!C.iscopy && !C.copied)
to_chat(user, "Take off the carbon copy first. ")
add_fingerprint(user)
return
@@ -177,7 +177,7 @@
update_icon()
else
to_chat(usr, "You need to hold it in your hands to change pages. ")
- if (istype(src.loc, /mob))
+ if(istype(src.loc, /mob))
src.attack_self(src.loc)
updateUsrDialog()
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index cd3afbd400d..2c5c154bca8 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -48,10 +48,10 @@
/obj/item/weapon/paper_bin/attack_hand(mob/user as mob)
- if (ishuman(user))
+ if(ishuman(user))
var/mob/living/carbon/human/H = user
var/obj/item/organ/external/temp = H.organs_by_name["r_hand"]
- if (H.hand)
+ if(H.hand)
temp = H.organs_by_name["l_hand"]
if(temp && !temp.is_usable())
to_chat(H, "You try to move your [temp.name], but cannot!")
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 46d080adb6f..79d90c18024 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -17,7 +17,7 @@
item_state = "pen"
slot_flags = SLOT_BELT | SLOT_EARS
throwforce = 0
- w_class = 1.0
+ w_class = 1
throw_speed = 3
throw_range = 7
materials = list(MAT_METAL=10)
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index d4a2ad141cb..6895e22c295 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -1,3 +1,5 @@
+#define EMAG_DELAY 50
+
/obj/machinery/photocopier
name = "photocopier"
icon = 'icons/obj/library.dmi'
@@ -9,9 +11,11 @@
idle_power_usage = 30
active_power_usage = 200
power_channel = EQUIP
+ var/emag_cooldown
+ atom_say_verb = "bleeps"
var/obj/item/copyitem = null //what's in the copier!
var/copies = 1 //how many copies to print!
- var/toner = 30 //how much toner is left! woooooo~
+ var/toner = 60 //how much toner is left! woooooo~
var/maxcopies = 10 //how many copies can be copied at once- idea shamelessly stolen from bs12's copier!
var/mob/living/ass = null
@@ -36,7 +40,9 @@
dat += "Current toner level: [toner]"
if(!toner)
dat +=" Please insert a new toner cartridge!"
- user << browse(dat, "window=copier")
+ var/datum/browser/popup = new(user, "copier", name, 400, 400)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "copier")
return
@@ -50,16 +56,19 @@
if(toner <= 0)
break
- if (istype(copyitem, /obj/item/weapon/paper))
+ if(emag_cooldown > world.time)
+ return
+
+ if(istype(copyitem, /obj/item/weapon/paper))
copy(copyitem)
sleep(15)
- else if (istype(copyitem, /obj/item/weapon/photo))
+ else if(istype(copyitem, /obj/item/weapon/photo))
photocopy(copyitem)
sleep(15)
- else if (istype(copyitem, /obj/item/weapon/paper_bundle))
+ else if(istype(copyitem, /obj/item/weapon/paper_bundle))
var/obj/item/weapon/paper_bundle/B = bundlecopy(copyitem)
sleep(15*B.amount)
- else if (ass && ass.loc == src.loc)
+ else if(ass && ass.loc == src.loc)
copyass()
sleep(15)
else
@@ -97,13 +106,13 @@
if(!camera)
return
var/datum/picture/selection = camera.selectpicture()
- if (!selection)
+ if(!selection)
return
playsound(loc, "sound/goonstation/machines/printer_dotmatrix.ogg", 50, 1)
var/obj/item/weapon/photo/p = new /obj/item/weapon/photo (src.loc)
p.construct(selection)
- if (p.desc == "")
+ if(p.desc == "")
p.desc += "Copied by [tempAI.name]"
else
p.desc += " - Copied by [tempAI.name]"
@@ -188,11 +197,11 @@
c.offset_y = copy.offset_y
var/list/temp_overlays = copy.overlays //Iterates through stamps
var/image/img //and puts a matching
- for (var/j = 1, j <= temp_overlays.len, j++) //gray overlay onto the copy
+ for(var/j = 1, j <= temp_overlays.len, j++) //gray overlay onto the copy
if(copy.ico.len)
- if (findtext(copy.ico[j], "cap") || findtext(copy.ico[j], "cent"))
+ if(findtext(copy.ico[j], "cap") || findtext(copy.ico[j], "cent"))
img = image('icons/obj/bureaucracy.dmi', "paper_stamp-circle")
- else if (findtext(copy.ico[j], "deny"))
+ else if(findtext(copy.ico[j], "deny"))
img = image('icons/obj/bureaucracy.dmi', "paper_stamp-x")
else
img = image('icons/obj/bureaucracy.dmi', "paper_stamp-dots")
@@ -228,7 +237,19 @@
var/icon/temp_img
if(!check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on.
return
-
+ if(emagged)
+ if(ishuman(ass))
+ var/mob/living/carbon/human/H = ass
+ to_chat(H, "Something smells toasty... ")
+ var/obj/item/organ/external/G = H.get_organ("groin")
+ G.take_damage(0, 30)
+ spawn(20)
+ H.emote("scream")
+ emag_cooldown = world.time + EMAG_DELAY
+ else
+ to_chat(ass, "Something smells toasty... ")
+ ass.apply_damage(30, BURN)
+ emag_cooldown = world.time + EMAG_DELAY
if(ishuman(ass)) //Suit checks are in check_ass
var/mob/living/carbon/human/H = ass
temp_img = icon('icons/obj/butts.dmi', H.species.butt_sprite)
@@ -283,7 +304,7 @@
/obj/machinery/photocopier/MouseDrop_T(mob/target, mob/user)
check_ass() //Just to make sure that you can re-drag somebody onto it after they moved off.
- if (!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai) || target == ass)
+ if(!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai) || target == ass)
return
src.add_fingerprint(user)
if(target == user && !user.incapacitated())
@@ -308,9 +329,20 @@
updateUsrDialog()
return 0
else
+ playsound(loc, 'sound/machines/ping.ogg', 50, 0)
+ atom_say("Attention: Posterior Placed on Printing Plaque! ")
return 1
+/obj/machinery/photocopier/emag_act(user as mob)
+ if(!emagged)
+ emagged = 1
+ to_chat(user, "You overload the photocopier's laser printing mechanism. ")
+ else
+ to_chat(user, "The photocopier's laser printing mechanism is already overloaded! ")
+
/obj/item/device/toner
name = "toner cartridge"
icon_state = "tonercartridge"
var/toner_amount = 30
+
+#undef EMAG_DELAY
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index b63dcc2750c..689799680ec 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -15,7 +15,7 @@
desc = "A camera film cartridge. Insert it into a camera to reload it."
icon_state = "film"
item_state = "electropack"
- w_class = 1.0
+ w_class = 1
/********
@@ -26,7 +26,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "photo"
item_state = "paper"
- w_class = 2.0
+ w_class = 2
var/icon/img //Big photo image
var/scribble //Scribble on the back.
var/icon/tiny
@@ -141,7 +141,7 @@
desc = "A polaroid camera. 10 photos left."
icon_state = "camera"
item_state = "electropack"
- w_class = 2.0
+ w_class = 2
slot_flags = SLOT_BELT
var/list/matter = list("metal" = 2000)
var/pictures_max = 10
@@ -154,6 +154,7 @@
/obj/item/device/camera/spooky/CheckParts()
+ ..()
var/obj/item/device/camera/C = locate(/obj/item/device/camera) in contents
if(C)
pictures_max = C.pictures_max
@@ -249,7 +250,7 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
// Calculate where we are relative to the center of the photo
var/xoff = (A.x - center.x) * 32 + center_offset
var/yoff = (A.y - center.y) * 32 + center_offset
- if (istype(A,/atom/movable))
+ if(istype(A,/atom/movable))
xoff+=A:step_x
yoff+=A:step_y
res.Blend(img, blendMode2iconMode(A.blend_mode), A.pixel_x + xoff, A.pixel_y + yoff)
@@ -489,7 +490,7 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
desc = "video camera that can send live feed to the entertainment network."
icon_state = "videocam"
item_state = "videocam"
- w_class = 2.0
+ w_class = 2
slot_flags = SLOT_BELT
materials = list(MAT_METAL=2000)
var/on = 0
@@ -523,7 +524,7 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
to_chat(user, "This video camera can send live feeds to the entertainment network. It's [camera ? "" : "in"]active.")
/obj/item/device/videocam/hear_talk(mob/M as mob, msg)
- if (camera && on)
+ if(camera && on)
if(get_dist(src, M) <= canhear_range)
talk_into(M, msg)
for(var/obj/machinery/computer/security/telescreen/T in machines)
@@ -531,7 +532,7 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
T.audible_message("(Newscaster) [M] says, '[msg]'", hearing_distance = 2)
/obj/item/device/videocam/hear_message(mob/M as mob, msg)
- if (camera && on)
+ if(camera && on)
for(var/obj/machinery/computer/security/telescreen/T in machines)
if(T.current == camera)
T.audible_message("(Newscaster) [M] [msg]", hearing_distance = 2)
@@ -545,4 +546,4 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s
'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')
- to_chat(user, pick(creepyasssounds))
+ user << pick(creepyasssounds)
diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm
index 44ecc3f1f12..26e397039d8 100644
--- a/code/modules/paperwork/stamps.dm
+++ b/code/modules/paperwork/stamps.dm
@@ -5,7 +5,7 @@
icon_state = "stamp-ok"
item_state = "stamp"
throwforce = 0
- w_class = 1.0
+ w_class = 1
throw_speed = 3
throw_range = 7
materials = list(MAT_METAL=60)
diff --git a/code/modules/pda/PDA.dm b/code/modules/pda/PDA.dm
index 96c5eedff2d..4dfd8575a22 100755
--- a/code/modules/pda/PDA.dm
+++ b/code/modules/pda/PDA.dm
@@ -10,8 +10,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
icon = 'icons/obj/pda.dmi'
icon_state = "pda"
item_state = "electronic"
- w_class = 1.0
- slot_flags = SLOT_PDA | SLOT_BELT
+ w_class = 1
+ slot_flags = SLOT_ID | SLOT_BELT
//Main variables
var/owner = null
@@ -166,7 +166,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "pda.tmpl", title, 630, 600, state = inventory_state)
@@ -218,7 +218,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
var/mob/user = usr
var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, "main")
var/mob/living/U = usr
- if (usr.stat == DEAD)
+ if(usr.stat == DEAD)
return 0
if(!can_use()) //Why reinvent the wheel? There's a proc that does exactly that.
U.unset_machine()
@@ -246,7 +246,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(A)
start_program(A)
if("Eject")//Ejects the cart, only done from hub.
- if (!isnull(cartridge))
+ if(!isnull(cartridge))
var/turf/T = loc
if(ismob(T))
T = T.loc
@@ -263,7 +263,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
P.unnotify()
cartridge = null
update_shortcuts()
- if ("Authenticate")//Checks for ID
+ if("Authenticate")//Checks for ID
id_check(usr, 1)
if("Retro")
retro_mode = !retro_mode
@@ -274,7 +274,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
. = current_app.Topic(href, href_list)
//EXTRA FUNCTIONS===================================
- if ((honkamt > 0) && (prob(60)))//For clown virus.
+ if((honkamt > 0) && (prob(60)))//For clown virus.
honkamt--
playsound(loc, 'sound/items/bikehorn.ogg', 30, 1)
@@ -295,19 +295,30 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(can_use(usr))
start_program(find_program(/datum/data/pda/app/main_menu))
notifying_programs.Cut()
- overlays.Cut()
+ overlays -= image('icons/obj/pda.dmi', "pda-r")
to_chat(usr, "You press the reset button on \the [src]. ")
else
to_chat(usr, "You cannot do this while restrained. ")
+/obj/item/device/pda/AltClick()
+ if(issilicon(usr))
+ return
+
+ if(can_use(usr))
+ if(id)
+ remove_id()
+ else
+ usr << "This PDA does not have an ID in it! "
+
/obj/item/device/pda/proc/remove_id()
- if (id)
- if (ismob(loc))
+ if(id)
+ if(ismob(loc))
var/mob/M = loc
M.put_in_hands(id)
to_chat(usr, "You remove the ID from the [name]. ")
else
id.forceMove(get_turf(src))
+ overlays -= image('icons/goonstation/objects/pda_overlay.dmi', id.icon_state)
id = null
/obj/item/device/pda/verb/verb_remove_id()
@@ -318,7 +329,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(issilicon(usr))
return
- if ( can_use(usr) )
+ if( can_use(usr) )
if(id)
remove_id()
else
@@ -335,10 +346,10 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(issilicon(usr))
return
- if ( can_use(usr) )
+ if( can_use(usr) )
var/obj/item/weapon/pen/O = locate() in src
if(O)
- if (istype(loc, /mob))
+ if(istype(loc, /mob))
var/mob/M = loc
if(M.get_active_hand() == null)
M.put_in_hands(O)
@@ -353,17 +364,17 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/proc/id_check(mob/user as mob, choice as num)//To check for IDs; 1 for in-pda use, 2 for out of pda use.
if(choice == 1)
- if (id)
+ if(id)
remove_id()
else
var/obj/item/I = user.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id))
+ if(istype(I, /obj/item/weapon/card/id))
user.drop_item()
I.forceMove(src)
id = I
else
var/obj/item/weapon/card/I = user.get_active_hand()
- if (istype(I, /obj/item/weapon/card/id) && I:registered_name)
+ if(istype(I, /obj/item/weapon/card/id) && I:registered_name)
var/obj/old_id = id
user.drop_item()
I.forceMove(src)
@@ -399,7 +410,9 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(((src in user.contents) && (C in user.contents)) || (istype(loc, /turf) && in_range(src, user) && (C in user.contents)) )
if( can_use(user) )//If they can still act.
id_check(user, 2)
- to_chat(user, "You put the ID into \the [src]'s slot. ")
+ to_chat(user, "You put the ID into \the [src]'s slot. You can remove it with ALT click. ")
+ overlays += image('icons/goonstation/objects/pda_overlay.dmi', C.icon_state)
+
else if(istype(C, /obj/item/device/paicard) && !src.pai)
user.drop_item()
C.forceMove(src)
@@ -415,7 +428,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
to_chat(user, "You slide \the [C] into \the [src]. ")
/obj/item/device/pda/attack(mob/living/C as mob, mob/living/user as mob)
- if (istype(C, /mob/living/carbon) && scanmode)
+ if(istype(C, /mob/living/carbon) && scanmode)
scanmode.scan_mob(C, user)
/obj/item/device/pda/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity)
@@ -426,7 +439,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(!src.detonate) return
var/turf/T = get_turf(src.loc)
- if (ismob(loc))
+ if(ismob(loc))
var/mob/M = loc
M.show_message("Your [src] explodes! ", 1)
@@ -440,7 +453,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/Destroy()
PDAs -= src
var/T = get_turf(loc)
- if (id)
+ if(id)
id.forceMove(T)
if(pai)
pai.forceMove(T)
@@ -468,12 +481,12 @@ var/global/list/obj/item/device/pda/PDAs = list()
S = 'sound/machines/twobeep.ogg'
playsound(loc, S, 50, 1)
for(var/mob/O in hearers(3, loc))
- O.show_message(text("\icon[src] *[ttone]*"))
+ O.show_message(text("[bicon(src)] *[ttone]*"))
/obj/item/device/pda/proc/set_ringtone()
var/t = input("Please enter new ringtone", name, ttone) as text
- if (in_range(src, usr) && loc == usr)
- if (t)
+ if(in_range(src, usr) && loc == usr)
+ if(t)
if(hidden_uplink && hidden_uplink.check_trigger(usr, lowertext(t), lowertext(lock_code)))
to_chat(usr, "The PDA softly beeps.")
close(usr)
@@ -483,4 +496,4 @@ var/global/list/obj/item/device/pda/PDAs = list()
return 1
else
close(usr)
- return 0
\ No newline at end of file
+ return 0
diff --git a/code/modules/pda/ai.dm b/code/modules/pda/ai.dm
index bb6bd8e7e63..44cbfee67e1 100644
--- a/code/modules/pda/ai.dm
+++ b/code/modules/pda/ai.dm
@@ -24,9 +24,9 @@
if(!M)
to_chat(usr, "Cannot use messenger! ")
var/list/plist = M.available_pdas()
- if (plist)
+ if(plist)
var/c = input(usr, "Please select a PDA") as null|anything in sortList(plist)
- if (!c) // if the user hasn't selected a PDA file we can't send a message
+ if(!c) // if the user hasn't selected a PDA file we can't send a message
return
var/selected = plist[c]
M.create_message(usr, selected)
@@ -74,7 +74,7 @@
to_chat(usr, "PDA ringer toggled [(M.notify_silent ? "Off" : "On")]! ")
/obj/item/device/pda/silicon/attack_self(mob/user as mob)
- if ((honkamt > 0) && (prob(60)))//For clown virus.
+ if((honkamt > 0) && (prob(60)))//For clown virus.
honkamt--
playsound(loc, 'sound/items/bikehorn.ogg', 30, 1)
return
diff --git a/code/modules/pda/app.dm b/code/modules/pda/app.dm
index 45b2e79aec3..e7c433c65a6 100644
--- a/code/modules/pda/app.dm
+++ b/code/modules/pda/app.dm
@@ -24,14 +24,13 @@
L = get(pda, /mob/living/silicon)
if(L)
- to_chat(L, "\icon[pda] [message]")
+ to_chat(L, "[bicon(pda)] [message]")
nanomanager.update_user_uis(L, pda) // Update the receiving user's PDA UI so that they can see the new message
if(!notify_silent)
pda.play_ringtone()
if(blink && !(src in pda.notifying_programs))
- pda.overlays.Cut()
pda.overlays += image('icons/obj/pda.dmi', "pda-r")
pda.notifying_programs |= src
@@ -39,7 +38,7 @@
if(src in pda.notifying_programs)
pda.notifying_programs -= src
if(!pda.notifying_programs.len)
- pda.overlays.Cut()
+ pda.overlays -= image('icons/obj/pda.dmi', "pda-r")
/datum/data/pda/proc/
@@ -94,4 +93,4 @@
/datum/data/pda/utility/scanmode/proc/scan_mob(mob/living/C as mob, mob/living/user as mob)
-/datum/data/pda/utility/scanmode/proc/scan_atom(atom/A as mob|obj|turf|area, mob/user as mob)
\ No newline at end of file
+/datum/data/pda/utility/scanmode/proc/scan_atom(atom/A as mob|obj|turf|area, mob/user as mob)
diff --git a/code/modules/pda/cart_apps.dm b/code/modules/pda/cart_apps.dm
index 9afb3e52764..55acf9b70eb 100644
--- a/code/modules/pda/cart_apps.dm
+++ b/code/modules/pda/cart_apps.dm
@@ -97,7 +97,7 @@
/datum/data/pda/app/power/update_ui(mob/user as mob, list/data)
update = PDA_APP_UPDATE_SLOW
- if (powmonitor && !isnull(powmonitor.powernet))
+ if(powmonitor && !isnull(powmonitor.powernet))
data["records"] = list(
"powerconnected" = 1,
"poweravail" = powmonitor.powernet.avail,
@@ -143,7 +143,7 @@
switch(href_list["choice"])
if("Records")
var/datum/data/record/R = locate(href_list["target"])
- if (R && (R in data_core.general))
+ if(R && (R in data_core.general))
load_records(R)
if("Back")
general_records = null
@@ -175,7 +175,7 @@
..(R)
for(var/A in data_core.medical)
var/datum/data/record/E = A
- if (E && (E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
+ if(E && (E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
medical_records = E
break
@@ -201,7 +201,7 @@
..(R)
for(var/A in data_core.security)
var/datum/data/record/E = A
- if (E && (E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
+ if(E && (E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
security_records = E
break
diff --git a/code/modules/pda/chatroom.dm b/code/modules/pda/chatroom.dm
index d5758b161f4..94185c7cc98 100644
--- a/code/modules/pda/chatroom.dm
+++ b/code/modules/pda/chatroom.dm
@@ -101,7 +101,7 @@ var/list/chatrooms = list(new /datum/chatroom("General Discussion"))
var/datum/data/pda/app/chatroom/C = P.find_program(/datum/data/pda/app/chatroom)
var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger)
- if (!P.owner || P == pda || PM.m_hidden || (C in current_room.invites) || (C in current_room.users))
+ if(!P.owner || P == pda || PM.m_hidden || (C in current_room.invites) || (C in current_room.users))
continue
pdas += list(list(name = "[P.owner] ([P.ownjob])", ref = "\ref[C]"))
data["people"] = pdas
@@ -180,7 +180,7 @@ var/list/chatrooms = list(new /datum/chatroom("General Discussion"))
return
t = sanitize(copytext(t, 1, MAX_MESSAGE_LEN))
t = readd_quotes(t)
- if (!t || !pda.can_use())
+ if(!t || !pda.can_use())
return
target.post(src, t)
@@ -194,7 +194,7 @@ var/list/chatrooms = list(new /datum/chatroom("General Discussion"))
return
t = sanitize(copytext(t, 1, MAX_MESSAGE_LEN))
t = readd_quotes(t)
- if (!t)
+ if(!t)
return
current_room.topic = t
@@ -238,7 +238,7 @@ var/list/chatrooms = list(new /datum/chatroom("General Discussion"))
return
spawn()
- if (!t || !check_messaging_available() || !pda.can_use())
+ if(!t || !check_messaging_available() || !pda.can_use())
return
// check if already taken
diff --git a/code/modules/pda/core_apps.dm b/code/modules/pda/core_apps.dm
index 4aaaa0667e7..2b5ce32355d 100644
--- a/code/modules/pda/core_apps.dm
+++ b/code/modules/pda/core_apps.dm
@@ -91,7 +91,7 @@
var/pressure = environment.return_pressure()
var/total_moles = environment.total_moles()
- if (total_moles)
+ if(total_moles)
var/o2_level = environment.oxygen/total_moles
var/n2_level = environment.nitrogen/total_moles
var/co2_level = environment.carbon_dioxide/total_moles
diff --git a/code/modules/pda/messenger.dm b/code/modules/pda/messenger.dm
index c5f6375f82f..88d6024ba1b 100644
--- a/code/modules/pda/messenger.dm
+++ b/code/modules/pda/messenger.dm
@@ -43,7 +43,7 @@
var/obj/item/device/pda/P = A
var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger)
- if (!P.owner || PM.toff || P == pda || PM.m_hidden)
+ if(!P.owner || PM.toff || P == pda || PM.m_hidden)
continue
if(conversations.Find("\ref[P]"))
convopdas.Add(list(list("Name" = "[P]", "Reference" = "\ref[P]", "Detonate" = "[P.detonate]", "inconvo" = "1")))
@@ -123,17 +123,17 @@
return
t = sanitize(copytext(t, 1, MAX_MESSAGE_LEN))
t = readd_quotes(t)
- if (!t || !istype(P))
+ if(!t || !istype(P))
return
- if (!in_range(pda, U) && pda.loc != U)
+ if(!in_range(pda, U) && pda.loc != U)
return
var/datum/data/pda/app/messenger/PM = P.find_program(/datum/data/pda/app/messenger)
- if (!PM || PM.toff || toff)
+ if(!PM || PM.toff || toff)
return
- if (last_text && world.time < last_text + 5)
+ if(last_text && world.time < last_text + 5)
return
if(!pda.can_use())
@@ -188,7 +188,7 @@
var/list/plist = list()
var/list/namecounts = list()
- if (toff)
+ if(toff)
to_chat(usr, "Turn on your receiver in order to send messages.")
return
@@ -200,7 +200,7 @@
continue
var/name = P.owner
- if (name in names)
+ if(name in names)
namecounts[name]++
name = text("[name] ([namecounts[name]])")
else
diff --git a/code/modules/pda/messenger_plugins.dm b/code/modules/pda/messenger_plugins.dm
index 98cab31aaf7..8585a26c827 100644
--- a/code/modules/pda/messenger_plugins.dm
+++ b/code/modules/pda/messenger_plugins.dm
@@ -59,7 +59,7 @@
if(prob(difficulty * 12) || (pda.hidden_uplink))
user.show_message("An error flashes on your [pda]. ", 1)
- else if (prob(difficulty * 3))
+ else if(prob(difficulty * 3))
user.show_message("Energy feeds back into your [pda]! ", 1)
pda.close(user)
pda.explode()
diff --git a/code/modules/pda/pdas.dm b/code/modules/pda/pdas.dm
index 6ad7f2b378c..5e7fa98750b 100644
--- a/code/modules/pda/pdas.dm
+++ b/code/modules/pda/pdas.dm
@@ -39,7 +39,7 @@
ttone = "honk"
/obj/item/device/pda/clown/Crossed(AM as mob|obj) //Clown PDA is slippery.
- if (istype(AM, /mob/living/carbon))
+ if(istype(AM, /mob/living/carbon))
var/mob/living/carbon/M = AM
M.slip("pda", 8, 5, 0, 1)
diff --git a/code/modules/pda/radio.dm b/code/modules/pda/radio.dm
index ae43ce10b3d..108dd4178fa 100644
--- a/code/modules/pda/radio.dm
+++ b/code/modules/pda/radio.dm
@@ -51,7 +51,7 @@
frequency.post_signal(src, signal, filter = s_filter)
/obj/item/radio/integrated/receive_signal(datum/signal/signal)
- if (bot_type && istype(signal.source, /obj/machinery/bot_core) && signal.data["type"] == bot_type)
+ if(bot_type && istype(signal.source, /obj/machinery/bot_core) && signal.data["type"] == bot_type)
if(!botlist)
botlist = new()
@@ -173,7 +173,7 @@
/obj/item/radio/integrated/signal/initialize()
if(!radio_controller)
return
- if (src.frequency < PUBLIC_LOW_FREQ || src.frequency > PUBLIC_HIGH_FREQ)
+ if(src.frequency < PUBLIC_LOW_FREQ || src.frequency > PUBLIC_HIGH_FREQ)
src.frequency = sanitize_frequency(src.frequency)
set_frequency(frequency)
diff --git a/code/modules/pda/utilities.dm b/code/modules/pda/utilities.dm
index 0f4fcd79741..837d0c439f5 100644
--- a/code/modules/pda/utilities.dm
+++ b/code/modules/pda/utilities.dm
@@ -67,7 +67,7 @@
/datum/data/pda/utility/scanmode/dna/scan_mob(mob/living/C as mob, mob/living/user as mob)
if(istype(C, /mob/living/carbon/human))
var/mob/living/carbon/human/H = C
- if (!istype(H.dna, /datum/dna))
+ if(!istype(H.dna, /datum/dna))
to_chat(user, "No fingerprints found on [H] ")
else
to_chat(user, "[H]'s Fingerprints: [md5(H.dna.uni_identity)] ")
@@ -77,7 +77,7 @@
scan_blood(A, user)
/datum/data/pda/utility/scanmode/dna/proc/scan_blood(atom/A, mob/user)
- if (!A.blood_DNA)
+ if(!A.blood_DNA)
to_chat(user, "No blood found on [A] ")
if(A.blood_DNA)
qdel(A.blood_DNA)
@@ -121,27 +121,27 @@
icon = "tachometer"
/datum/data/pda/utility/scanmode/gas/scan_atom(atom/A as mob|obj|turf|area, mob/user as mob)
- if (istype(A, /obj/item/weapon/tank))
+ if(istype(A, /obj/item/weapon/tank))
var/obj/item/weapon/tank/T = A
pda.atmosanalyzer_scan(T.air_contents, user, T)
- else if (istype(A, /obj/machinery/portable_atmospherics))
+ else if(istype(A, /obj/machinery/portable_atmospherics))
var/obj/machinery/portable_atmospherics/T = A
pda.atmosanalyzer_scan(T.air_contents, user, T)
- else if (istype(A, /obj/machinery/atmospherics/pipe))
+ else if(istype(A, /obj/machinery/atmospherics/pipe))
var/obj/machinery/atmospherics/pipe/T = A
pda.atmosanalyzer_scan(T.parent.air, user, T)
- else if (istype(A, /obj/machinery/power/rad_collector))
+ else if(istype(A, /obj/machinery/power/rad_collector))
var/obj/machinery/power/rad_collector/T = A
if(T.P)
pda.atmosanalyzer_scan(T.P.air_contents, user, T)
- else if (istype(A, /obj/item/weapon/flamethrower))
+ else if(istype(A, /obj/item/weapon/flamethrower))
var/obj/item/weapon/flamethrower/T = A
if(T.ptank)
pda.atmosanalyzer_scan(T.ptank.air_contents, user, T)
- else if (istype(A, /obj/machinery/portable_atmospherics/scrubber/huge))
+ else if(istype(A, /obj/machinery/portable_atmospherics/scrubber/huge))
var/obj/machinery/portable_atmospherics/scrubber/huge/T = A
pda.atmosanalyzer_scan(T.air_contents, user, T)
- else if (istype(A, /obj/machinery/atmospherics/unary/tank))
+ else if(istype(A, /obj/machinery/atmospherics/unary/tank))
var/obj/machinery/atmospherics/unary/tank/T = A
pda.atmosanalyzer_scan(T.air_contents, user, T)
diff --git a/code/modules/pooling/pool.dm b/code/modules/pooling/pool.dm
index d7ddbbeb082..2d769a020cb 100644
--- a/code/modules/pooling/pool.dm
+++ b/code/modules/pooling/pool.dm
@@ -91,7 +91,7 @@ var/global/list/GlobalPool = list()
GlobalPool[diver.type] |= diver
- if (destroy)
+ if(destroy)
diver.Destroy()
diver.ResetVars()
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index a66eba09713..87ce338afd1 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -99,11 +99,22 @@
var/global/list/status_overlays_lighting
var/global/list/status_overlays_environ
var/indestructible = 0 // If set, prevents aliens from destroying it
+ var/keep_preset_name = 0
var/report_power_alarm = 1
var/shock_proof = 0 //if set to 1, this APC will not arc bolts of electricity if it's overloaded.
+/obj/machinery/power/apc/worn_out
+ name = "\improper Worn out APC"
+ keep_preset_name = 1
+ locked = 0
+ environ = 0
+ equipment = 0
+ lighting = 0
+ operating = 0
+
+
/obj/machinery/power/apc/noalarm
report_power_alarm = 0
@@ -112,7 +123,7 @@
desc = "Heavy-duty switching circuits for power control."
icon = 'icons/obj/module.dmi'
icon_state = "power_mod"
- w_class = 2.0
+ w_class = 2
item_state = "electronic"
flags = CONDUCT
@@ -135,14 +146,14 @@
// offset 24 pixels in direction of dir
// this allows the APC to be embedded in a wall, yet still inside an area
- if (building)
+ if(building)
dir = ndir
src.tdir = dir // to fix Vars bug
dir = SOUTH
pixel_x = (src.tdir & 3)? 0 : (src.tdir == 4 ? 24 : -24)
pixel_y = (src.tdir & 3)? (src.tdir ==1 ? 24 : -24) : 0
- if (building==0)
+ if(building==0)
init()
else
area = src.loc.loc
@@ -158,8 +169,8 @@
/obj/machinery/power/apc/Destroy()
apcs -= src
if(malfai && operating)
- if (ticker.mode.config_tag == "malfunction")
- if (src.z == ZLEVEL_STATION)
+ if(ticker.mode.config_tag == "malfunction")
+ if(src.z == ZLEVEL_STATION)
ticker.mode:apcs--
area.power_light = 0
area.power_equip = 0
@@ -192,15 +203,19 @@
cell.maxcharge = cell_type // cell_type is maximum charge (old default was 1000 or 2500 (values one and two respectively)
cell.charge = start_charge * cell.maxcharge / 100.0 // (convert percentage to actual value)
- var/area/A = src.loc.loc
+ var/area/A = get_area(src)
//if area isn't specified use current
- if(isarea(A) && src.areastring == null)
- src.area = A
+ if(keep_preset_name)
+ if(isarea(A))
+ area = A
+ // no-op, keep the name
+ else if(isarea(A) && src.areastring == null)
+ area = A
name = "\improper [area.name] APC"
else
- src.area = get_area_name(areastring)
+ area = get_area_name(areastring)
name = "\improper [area.name] APC"
area.apc |= src
update_icon()
@@ -218,17 +233,17 @@
if(opened)
if(has_electronics && terminal)
to_chat(user, "The cover is [opened==2?"removed":"open"] and the power cell is [ cell ? "installed" : "missing"].")
- else if (!has_electronics && terminal)
+ else if(!has_electronics && terminal)
to_chat(user, "There are some wires but no any electronics.")
- else if (has_electronics && !terminal)
+ else if(has_electronics && !terminal)
to_chat(user, "Electronics installed but not wired.")
- else /* if (!has_electronics && !terminal) */
+ else /* if(!has_electronics && !terminal) */
to_chat(user, "There is no electronics nor connected wires.")
else
- if (stat & MAINT)
+ if(stat & MAINT)
to_chat(user, "The cover is closed. Something wrong with it: it doesn't work.")
- else if (malfhack)
+ else if(malfhack)
to_chat(user, "The cover is broken. It may be hard to force it open.")
else
to_chat(user, "The cover is closed.")
@@ -237,7 +252,7 @@
// also add overlays for indicator lights
/obj/machinery/power/apc/update_icon()
- if (!status_overlays)
+ if(!status_overlays)
status_overlays = 1
status_overlays_lock = new
status_overlays_charging = new
@@ -359,7 +374,7 @@
else if(charging == 2)
update_overlay |= APC_UPOVERLAY_CHARGEING2
- if (!equipment)
+ if(!equipment)
update_overlay |= APC_UPOVERLAY_EQUIPMENT0
else if(equipment == 1)
update_overlay |= APC_UPOVERLAY_EQUIPMENT1
@@ -411,20 +426,20 @@
//attack with an item - open/close cover, insert cell, or (un)lock interface
/obj/machinery/power/apc/attackby(obj/item/W, mob/living/user, params)
- if (istype(user, /mob/living/silicon) && get_dist(src,user)>1)
+ if(istype(user, /mob/living/silicon) && get_dist(src,user)>1)
return src.attack_hand(user)
- if (istype(W, /obj/item/weapon/crowbar) && opened)
- if (has_electronics==1)
- if (terminal)
+ if(istype(W, /obj/item/weapon/crowbar) && opened)
+ if(has_electronics==1)
+ if(terminal)
to_chat(user, "Disconnect wires first. ")
return
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
to_chat(user, "You are trying to remove the power control board...")//lpeters - fixed grammar issues
if(do_after(user, 50, target = src))
- if (has_electronics==1)
+ if(has_electronics==1)
has_electronics = 0
- if ((stat & BROKEN) || malfhack)
+ if((stat & BROKEN) || malfhack)
user.visible_message(\
"[user.name] has broken the power control board inside [src.name]! ",\
"You broke the charred power control board and remove the remains. ",
@@ -435,22 +450,22 @@
"[user.name] has removed the power control board from [src.name]! ",\
"You remove the power control board. ")
new /obj/item/weapon/apc_electronics(loc)
- else if (opened!=2) //cover isn't removed
+ else if(opened!=2) //cover isn't removed
opened = 0
update_icon()
- else if (istype(W, /obj/item/weapon/crowbar) && !((stat & BROKEN) || malfhack) )
+ else if(istype(W, /obj/item/weapon/crowbar) && !((stat & BROKEN) || malfhack) )
if(coverlocked && !(stat & MAINT))
to_chat(user, "The cover is locked and cannot be opened. ")
return
else
opened = 1
update_icon()
- else if (istype(W, /obj/item/weapon/stock_parts/cell) && opened) // trying to put a cell inside
+ else if(istype(W, /obj/item/weapon/stock_parts/cell) && opened) // trying to put a cell inside
if(cell)
to_chat(user, "There is a power cell already installed.")
return
else
- if (stat & MAINT)
+ if(stat & MAINT)
to_chat(user, "There is no connector for your power cell. ")
return
user.drop_item()
@@ -461,19 +476,19 @@
"You insert the power cell.")
chargecount = 0
update_icon()
- else if (istype(W, /obj/item/weapon/screwdriver)) // haxing
+ else if(istype(W, /obj/item/weapon/screwdriver)) // haxing
if(opened)
- if (cell)
+ if(cell)
to_chat(user, "Close the APC first. ")//Less hints more mystery!
return
else
- if (has_electronics==1 && terminal)
+ if(has_electronics==1 && terminal)
has_electronics = 2
stat &= ~MAINT
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
to_chat(user, "You screw the circuit electronics into place.")
- else if (has_electronics==2)
+ else if(has_electronics==2)
has_electronics = 1
stat |= MAINT
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
@@ -489,7 +504,7 @@
to_chat(user, "The wires have been [wiresexposed ? "exposed" : "unexposed"]")
update_icon()
- else if (istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card
+ else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card
if(emagged)
to_chat(user, "The interface is broken.")
else if(opened)
@@ -505,8 +520,8 @@
update_icon()
else
to_chat(user, "Access denied. ")
- else if (istype(W, /obj/item/stack/cable_coil) && !terminal && opened && has_electronics!=2)
- if (src.loc:intact)
+ else if(istype(W, /obj/item/stack/cable_coil) && !terminal && opened && has_electronics!=2)
+ if(src.loc:intact)
to_chat(user, "You must remove the floor plating in front of the APC first. ")
return
var/obj/item/stack/cable_coil/C = W
@@ -516,10 +531,10 @@
to_chat(user, "You start adding cables to the APC frame...")
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 20, target = src))
- if (C.amount >= 10 && !terminal && opened && has_electronics != 2)
+ if(C.amount >= 10 && !terminal && opened && has_electronics != 2)
var/turf/T = get_turf(src)
var/obj/structure/cable/N = T.get_cable_node()
- if (prob(50) && electrocute_mob(usr, N, N))
+ if(prob(50) && electrocute_mob(usr, N, N))
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
@@ -530,15 +545,15 @@
"You add cables to the APC frame.")
make_terminal()
terminal.connect_to_network()
- else if (istype(W, /obj/item/weapon/wirecutters) && terminal && opened && has_electronics!=2)
- if (src.loc:intact)
+ else if(istype(W, /obj/item/weapon/wirecutters) && terminal && opened && has_electronics!=2)
+ if(src.loc:intact)
to_chat(user, "You must remove the floor plating in front of the APC first. ")
return
to_chat(user, "You begin to cut the cables...")
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 50, target = src))
if(terminal && opened && has_electronics!=2)
- if (prob(50) && electrocute_mob(usr, terminal.powernet, terminal))
+ if(prob(50) && electrocute_mob(usr, terminal.powernet, terminal))
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
@@ -546,7 +561,7 @@
new /obj/item/stack/cable_coil(loc,10)
to_chat(user, "You cut the cables and dismantle the power terminal. ")
qdel(terminal) // qdel
- else if (istype(W, /obj/item/weapon/apc_electronics) && opened && has_electronics==0 && !((stat & BROKEN) || malfhack))
+ else if(istype(W, /obj/item/weapon/apc_electronics) && opened && has_electronics==0 && !((stat & BROKEN) || malfhack))
to_chat(user, "You trying to insert the power control board into the frame...")
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 10, target = src))
@@ -554,12 +569,12 @@
has_electronics = 1
to_chat(user, "You place the power control board inside the frame. ")
qdel(W) // qdel
- else if (istype(W, /obj/item/weapon/apc_electronics) && opened && has_electronics==0 && ((stat & BROKEN) || malfhack))
+ else if(istype(W, /obj/item/weapon/apc_electronics) && opened && has_electronics==0 && ((stat & BROKEN) || malfhack))
to_chat(user, "You cannot put the board inside, the frame is damaged. ")
return
- else if (istype(W, /obj/item/weapon/weldingtool) && opened && has_electronics==0 && !terminal)
+ else if(istype(W, /obj/item/weapon/weldingtool) && opened && has_electronics==0 && !terminal)
var/obj/item/weapon/weldingtool/WT = W
- if (WT.get_fuel() < 3)
+ if(WT.get_fuel() < 3)
to_chat(user, "You need more welding fuel to complete this task. ")
return
user.visible_message("[user.name] welds [src]. ", \
@@ -568,7 +583,7 @@
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
if(do_after(user, 50, target = src))
if(!src || !WT.remove_fuel(3, user)) return
- if (emagged || malfhack || (stat & BROKEN) || opened==2)
+ if(emagged || malfhack || (stat & BROKEN) || opened==2)
new /obj/item/stack/sheet/metal(loc)
user.visible_message(\
"[src] has been cut apart by [user.name] with the weldingtool. ",\
@@ -582,17 +597,17 @@
"You hear welding.")
qdel(src) // qdel
return
- else if (istype(W, /obj/item/mounted/frame/apc_frame) && opened && emagged)
+ else if(istype(W, /obj/item/mounted/frame/apc_frame) && opened && emagged)
emagged = 0
- if (opened==2)
+ if(opened==2)
opened = 1
user.visible_message(\
"[user.name] has replaced the damaged APC frontal panel with a new one. ",\
"You replace the damaged APC frontal panel with a new one.")
qdel(W)
update_icon()
- else if (istype(W, /obj/item/mounted/frame/apc_frame) && opened && ((stat & BROKEN) || malfhack))
- if (has_electronics)
+ else if(istype(W, /obj/item/mounted/frame/apc_frame) && opened && ((stat & BROKEN) || malfhack))
+ if(has_electronics)
to_chat(user, "You cannot repair this APC until you remove the electronics still inside.")
return
to_chat(user, "You begin to replace the damaged APC frame...")
@@ -604,11 +619,11 @@
stat &= ~BROKEN
malfai = null
malfhack = 0
- if (opened==2)
+ if(opened==2)
opened = 1
update_icon()
else
- if (((stat & BROKEN) || malfhack) \
+ if(((stat & BROKEN) || malfhack) \
&& !opened \
&& ( \
(W.force >= 5 && W.w_class >= 3.0) \
@@ -621,9 +636,9 @@
"You hear bang")
update_icon()
else
- if (istype(user, /mob/living/silicon))
+ if(istype(user, /mob/living/silicon))
return src.attack_hand(user)
- if (!opened && wiresexposed && \
+ if(!opened && wiresexposed && \
(istype(W, /obj/item/device/multitool) || \
istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/assembly/signaler)))
return src.attack_hand(user)
@@ -633,7 +648,7 @@
"You hear bang")
/obj/machinery/power/apc/emag_act(user as mob)
- if (!(emagged || malfhack)) // trying to unlock with an emag card
+ if(!(emagged || malfhack)) // trying to unlock with an emag card
if(opened)
to_chat(user, "You must close the cover to swipe an ID card.")
else if(wiresexposed)
@@ -649,7 +664,7 @@
// attack with hand - remove cell (if cover open) or interact with the APC
/obj/machinery/power/apc/attack_hand(mob/user)
-// if (!can_use(user)) This already gets called in interact() and in topic()
+// if(!can_use(user)) This already gets called in interact() and in topic()
// return
if(!user)
return
@@ -748,11 +763,11 @@
/obj/machinery/power/apc/proc/get_malf_status(mob/user)
- if (ticker && ticker.mode && (user.mind in ticker.mode.malf_ai) && istype(user, /mob/living/silicon/ai))
- if (src.malfai == (user:parent ? user:parent : user))
- if (src.occupier == user)
+ if(ticker && ticker.mode && (user.mind in ticker.mode.malf_ai) && istype(user, /mob/living/silicon/ai))
+ if(src.malfai == (user:parent ? user:parent : user))
+ if(src.occupier == user)
return 3 // 3 = User is shunted in this APC
- else if (istype(user.loc, /obj/machinery/power/apc))
+ else if(istype(user.loc, /obj/machinery/power/apc))
return 4 // 4 = User is shunted in another APC
else
return 2 // 2 = APC hacked by user, and user is in its core.
@@ -813,7 +828,7 @@
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
// the ui does not exist, so we'll create a new one
ui = new(user, src, ui_key, "apc.tmpl", "[area.name] - APC", 510, data["siliconUser"] ? 535 : 460)
// When the UI is first opened this is the data it will use
@@ -830,14 +845,14 @@
area.power_light = (lighting > 1)
area.power_equip = (equipment > 1)
area.power_environ = (environ > 1)
-// if (area.name == "AI Chamber")
+// if(area.name == "AI Chamber")
// spawn(10)
// to_chat(world, " [area.name] [area.power_equip]")
else
area.power_light = 0
area.power_equip = 0
area.power_environ = 0
-// if (area.name == "AI Chamber")
+// if(area.name == "AI Chamber")
// to_chat(world, "[area.power_equip]")
area.power_change()
@@ -850,10 +865,10 @@
return 1
autoflag = 5
- if (istype(user, /mob/living/silicon))
+ if(istype(user, /mob/living/silicon))
var/mob/living/silicon/ai/AI = user
var/mob/living/silicon/robot/robot = user
- if ( \
+ if( \
src.aidisabled || \
malfhack && istype(malfai) && \
( \
@@ -867,11 +882,11 @@
user.unset_machine()
return 0
else
- if ((!in_range(src, user) || !istype(src.loc, /turf)))
+ if((!in_range(src, user) || !istype(src.loc, /turf)))
return 0
var/mob/living/carbon/human/H = user
- if (istype(H))
+ if(istype(H))
if(H.getBrainLoss() >= 60)
for(var/mob/M in viewers(src, null))
to_chat(M, "[H] stares cluelessly at [src] and drools. ")
@@ -904,19 +919,19 @@
if(!can_use(usr, 1))
return 1
- if (href_list["lock"])
+ if(href_list["lock"])
if(!is_authenticated(usr))
return
coverlocked = !coverlocked
- else if (href_list["breaker"])
+ else if(href_list["breaker"])
if(!is_authenticated(usr))
return
toggle_breaker()
- else if (href_list["cmode"])
+ else if(href_list["cmode"])
if(!is_authenticated(usr))
return
@@ -925,7 +940,7 @@
charging = 0
update_icon()
- else if (href_list["eqp"])
+ else if(href_list["eqp"])
if(!is_authenticated(usr))
return
@@ -934,7 +949,7 @@
update_icon()
update()
- else if (href_list["lgt"])
+ else if(href_list["lgt"])
if(!is_authenticated(usr))
return
@@ -943,7 +958,7 @@
update_icon()
update()
- else if (href_list["env"])
+ else if(href_list["env"])
if(!is_authenticated(usr))
return
@@ -955,19 +970,19 @@
nanomanager.close_user_uis(usr, src)
return 0
- else if (href_list["close2"])
+ else if(href_list["close2"])
usr << browse(null, "window=apcwires")
return 0
- else if (href_list["overload"])
+ else if(href_list["overload"])
if(istype(usr, /mob/living/silicon) && !aidisabled)
src.overload_lighting()
- else if (href_list["malfhack"])
+ else if(href_list["malfhack"])
var/mob/living/silicon/ai/malfai = usr
if(get_malf_status(malfai)==1)
- if (malfai.malfhacking)
+ if(malfai.malfhacking)
to_chat(malfai, "You are already hacking an APC.")
return 0
to_chat(malfai, "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process.")
@@ -975,12 +990,12 @@
malfai.malfhacking = 1
sleep(600)
if(src)
- if (!src.aidisabled)
+ if(!src.aidisabled)
malfai.malfhack = null
malfai.malfhacking = 0
locked = 1
- if (ticker.mode.config_tag == "malfunction")
- if ((src.z in config.station_levels)) //if (is_type_in_list(get_area(src), the_station_areas))
+ if(ticker.mode.config_tag == "malfunction")
+ if((src.z in config.station_levels)) //if(is_type_in_list(get_area(src), the_station_areas))
ticker.mode:apcs++
if(usr:parent)
src.malfai = usr:parent
@@ -989,15 +1004,15 @@
to_chat(malfai, "Hack complete. The APC is now under your exclusive control.")
update_icon()
- else if (href_list["occupyapc"])
+ else if(href_list["occupyapc"])
if(get_malf_status(usr))
malfoccupy(usr)
- else if (href_list["deoccupyapc"])
+ else if(href_list["deoccupyapc"])
if(get_malf_status(usr))
malfvacate()
- else if (href_list["toggleaccess"])
+ else if(href_list["toggleaccess"])
if(istype(usr, /mob/living/silicon))
if(emagged || aidisabled || (stat & (BROKEN|MAINT)))
to_chat(usr, "The APC does not respond to the command.")
@@ -1011,8 +1026,8 @@
operating = !operating
if(malfai)
- if (ticker.mode.config_tag == "malfunction")
- if ((src.z in config.station_levels)) //if (is_type_in_list(get_area(src), the_station_areas))
+ if(ticker.mode.config_tag == "malfunction")
+ if((src.z in config.station_levels)) //if(is_type_in_list(get_area(src), the_station_areas))
operating ? ticker.mode:apcs++ : ticker.mode:apcs--
src.update()
@@ -1044,7 +1059,7 @@
src.occupier.verbs += /mob/living/silicon/ai/proc/corereturn
src.occupier.verbs += /datum/game_mode/malfunction/proc/takeover
src.occupier.cancel_camera()
- if (seclevel2num(get_security_level()) == SEC_LEVEL_DELTA)
+ if(seclevel2num(get_security_level()) == SEC_LEVEL_DELTA)
for(var/obj/item/weapon/pinpointer/point in world)
point.the_disk = src //the pinpointer will detect the shunted AI
@@ -1057,7 +1072,7 @@
src.occupier.parent.adjustOxyLoss(src.occupier.getOxyLoss())
src.occupier.parent.cancel_camera()
qdel(src.occupier) // qdel
- if (seclevel2num(get_security_level()) == SEC_LEVEL_DELTA)
+ if(seclevel2num(get_security_level()) == SEC_LEVEL_DELTA)
for(var/obj/item/weapon/pinpointer/point in world)
for(var/datum/mind/AI_mind in ticker.mode.malf_ai)
var/mob/living/silicon/ai/A = AI_mind.current // the current mob the mind owns
@@ -1079,7 +1094,7 @@
if(!src.malfhack && (src.z in config.station_levels))
if(prob(3))
src.locked = 1
- if (src.cell.charge > 0)
+ if(src.cell.charge > 0)
// to_chat(world, "blew APC in [src.loc.loc] ")
src.cell.charge = 0
cell.corrupt()
@@ -1280,7 +1295,7 @@
if(last_lt != lighting || last_eq != equipment || last_en != environ)
queue_icon_update()
update()
- else if (last_ch != charging)
+ else if(last_ch != charging)
queue_icon_update()
/obj/machinery/power/apc/proc/autoset(var/val, var/on)
@@ -1320,26 +1335,26 @@
switch(severity)
if(1.0)
//set_broken() //now Destroy() do what we need
- if (cell)
+ if(cell)
cell.ex_act(1.0) // more lags woohoo
qdel(src)
return
if(2.0)
- if (prob(50))
+ if(prob(50))
set_broken()
- if (cell && prob(50))
+ if(cell && prob(50))
cell.ex_act(2.0)
if(3.0)
- if (prob(25))
+ if(prob(25))
set_broken()
- if (cell && prob(25))
+ if(cell && prob(25))
cell.ex_act(3.0)
return
/obj/machinery/power/apc/blob_act()
- if (prob(75))
+ if(prob(75))
set_broken()
- if (cell && prob(5))
+ if(cell && prob(5))
cell.blob_act()
@@ -1350,8 +1365,8 @@
/obj/machinery/power/apc/proc/set_broken()
if(malfai && operating)
- if (ticker.mode.config_tag == "malfunction")
- if ((src.z in config.station_levels)) //if (is_type_in_list(get_area(src), the_station_areas))
+ if(ticker.mode.config_tag == "malfunction")
+ if((src.z in config.station_levels)) //if(is_type_in_list(get_area(src), the_station_areas))
ticker.mode:apcs--
stat |= BROKEN
operating = 0
@@ -1382,4 +1397,4 @@
else
return 0
-#undef APC_UPDATE_ICON_COOLDOWN
\ No newline at end of file
+#undef APC_UPDATE_ICON_COOLDOWN
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 863b231f25a..6a6933db72d 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -128,7 +128,7 @@ By design, d1 is the smallest direction and d2 is the highest
to_chat(user, "\red This cable is connected to nearby breaker box. Use breaker box to interact with it.")
return */
- if (shock(user, 50))
+ if(shock(user, 50))
return
if(src.d1) // 0-X cables are 1 unit, X-X cables are 2 units long
@@ -157,7 +157,7 @@ By design, d1 is the smallest direction and d2 is the highest
else if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/coil = W
- if (coil.get_amount() < 1)
+ if(coil.get_amount() < 1)
to_chat(user, "Not enough cable")
return
coil.cable_join(src, user)
@@ -173,7 +173,7 @@ By design, d1 is the smallest direction and d2 is the highest
shock(user, 5, 0.2)
else
- if (W.flags & CONDUCT)
+ if(W.flags & CONDUCT)
shock(user, 50, 0.7)
src.add_fingerprint(user)
@@ -182,7 +182,7 @@ By design, d1 is the smallest direction and d2 is the highest
/obj/structure/cable/proc/shock(mob/user, prb, var/siemens_coeff = 1.0)
if(!prob(prb))
return 0
- if (electrocute_mob(user, powernet, src, siemens_coeff))
+ if(electrocute_mob(user, powernet, src, siemens_coeff))
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
@@ -196,12 +196,12 @@ By design, d1 is the smallest direction and d2 is the highest
if(1.0)
qdel(src) // qdel
if(2.0)
- if (prob(50))
+ if(prob(50))
new/obj/item/stack/cable_coil(src.loc, src.d1 ? 2 : 1, color)
qdel(src) // qdel
if(3.0)
- if (prob(25))
+ if(prob(25))
new/obj/item/stack/cable_coil(src.loc, src.d1 ? 2 : 1, color)
qdel(src) // qdel
return
@@ -341,7 +341,7 @@ obj/structure/cable/proc/cableColor(var/colorC)
var/turf/T
///// Z-Level Stuff
- /* if (d1 == 11 || d1 == 12)
+ /* if(d1 == 11 || d1 == 12)
var/turf/controllerlocation = locate(1, 1, z)
for(var/obj/effect/landmark/zcontroller/controller in controllerlocation)
if(controller.up && d1 == 12)
@@ -466,7 +466,7 @@ obj/structure/cable/proc/cableColor(var/colorC)
color = COLOR_RED
desc = "A coil of power cable."
throwforce = 10
- w_class = 2.0
+ w_class = 2
throw_speed = 2
throw_range = 5
materials = list(MAT_METAL=10, MAT_GLASS=5)
@@ -485,7 +485,7 @@ obj/structure/cable/proc/cableColor(var/colorC)
/obj/item/stack/cable_coil/New(loc, length = MAXCOIL, var/paramcolor = null)
..()
src.amount = length
- if (paramcolor)
+ if(paramcolor)
color = paramcolor
else
color = color
@@ -526,7 +526,7 @@ obj/structure/cable/proc/cableColor(var/colorC)
return C
/obj/item/stack/cable_coil/update_icon()
- if (!color)
+ if(!color)
color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_ORANGE, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN)
color = color
if(amount == 1)
@@ -541,9 +541,9 @@ obj/structure/cable/proc/cableColor(var/colorC)
/obj/item/stack/cable_coil/proc/update_wclass()
if(amount == 1)
- w_class = 1.0
+ w_class = 1
else
- w_class = 2.0
+ w_class = 2
/obj/item/stack/cable_coil/examine(mob/user)
if(!..(user, 1))
@@ -674,8 +674,8 @@ obj/structure/cable/proc/cableColor(var/colorC)
use(1)
- if (C.shock(user, 50))
- if (prob(50)) //fail
+ if(C.shock(user, 50))
+ if(prob(50)) //fail
new/obj/item/stack/cable_coil(C.loc, 1, C.color)
qdel(C) // qdel
@@ -738,8 +738,8 @@ obj/structure/cable/proc/cableColor(var/colorC)
use(1)
- if (NC.shock(user, 50))
- if (prob(50)) //fail
+ if(NC.shock(user, 50))
+ if(prob(50)) //fail
new/obj/item/stack/cable_coil(NC.loc, 1, NC.color)
qdel(NC) // qdel
@@ -786,8 +786,8 @@ obj/structure/cable/proc/cableColor(var/colorC)
use(1)
- if (C.shock(user, 50))
- if (prob(50)) //fail
+ if(C.shock(user, 50))
+ if(prob(50)) //fail
new/obj/item/stack/cable_coil(C.loc, 2, C.color)
qdel(C) // qdel
return
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 6e61be2a257..e2e97437b68 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -98,13 +98,13 @@
* 10000-cell explosion(T, -1, 1, 3, 3)
* 15000-cell explosion(T, -1, 2, 4, 4)
* */
- if (charge==0)
+ if(charge==0)
return
var/devastation_range = -1 //round(charge/11000)
var/heavy_impact_range = round(sqrt(charge)/60)
var/light_impact_range = round(sqrt(charge)/30)
var/flash_range = light_impact_range
- if (light_impact_range==0)
+ if(light_impact_range==0)
rigged = 0
corrupt()
return
@@ -119,12 +119,12 @@
/obj/item/weapon/stock_parts/cell/proc/corrupt()
charge /= 2
maxcharge /= 2
- if (prob(10))
+ if(prob(10))
rigged = 1 //broken batterys are dangerous
/obj/item/weapon/stock_parts/cell/emp_act(severity)
charge -= 1000 / severity
- if (charge < 0)
+ if(charge < 0)
charge = 0
if(reliability != 100 && prob(50/severity))
reliability -= 10 / severity
@@ -137,16 +137,16 @@
qdel(src)
return
if(2.0)
- if (prob(50))
+ if(prob(50))
qdel(src)
return
- if (prob(50))
+ if(prob(50))
corrupt()
if(3.0)
- if (prob(25))
+ if(prob(25))
qdel(src)
return
- if (prob(25))
+ if(prob(25))
corrupt()
return
@@ -154,34 +154,34 @@
ex_act(1)
/obj/item/weapon/stock_parts/cell/proc/get_electrocute_damage()
- switch (charge)
-/* if (9000 to INFINITY)
+ switch(charge)
+/* if(9000 to INFINITY)
return min(rand(90,150),rand(90,150))
- if (2500 to 9000-1)
+ if(2500 to 9000-1)
return min(rand(70,145),rand(70,145))
- if (1750 to 2500-1)
+ if(1750 to 2500-1)
return min(rand(35,110),rand(35,110))
- if (1500 to 1750-1)
+ if(1500 to 1750-1)
return min(rand(30,100),rand(30,100))
- if (750 to 1500-1)
+ if(750 to 1500-1)
return min(rand(25,90),rand(25,90))
- if (250 to 750-1)
+ if(250 to 750-1)
return min(rand(20,80),rand(20,80))
- if (100 to 250-1)
+ if(100 to 250-1)
return min(rand(20,65),rand(20,65))*/
- if (5000000 to INFINITY)
+ if(5000000 to INFINITY)
return min(rand(200,300),rand(200,300))
- if (4000000 to 5000000-1)
+ if(4000000 to 5000000-1)
return min(rand(80,180),rand(80,180))
- if (1000000 to 4000000-1)
+ if(1000000 to 4000000-1)
return min(rand(50,160),rand(50,160))
- if (200000 to 1000000-1)
+ if(200000 to 1000000-1)
return min(rand(25,80),rand(25,80))
- if (100000 to 200000-1)//Ave powernet
+ if(100000 to 200000-1)//Ave powernet
return min(rand(20,60),rand(20,60))
- if (50000 to 100000-1)
+ if(50000 to 100000-1)
return min(rand(15,40),rand(15,40))
- if (1000 to 50000-1)
+ if(1000 to 50000-1)
return min(rand(10,20),rand(10,20))
else
return 0
diff --git a/code/modules/power/engine.dm b/code/modules/power/engine.dm
index 1d7a97406e4..bf05e7cd2d4 100644
--- a/code/modules/power/engine.dm
+++ b/code/modules/power/engine.dm
@@ -9,7 +9,7 @@
qdel(src)
return
if(2.0)
- if (prob(50))
+ if(prob(50))
ChangeTurf(/turf/space)
qdel(src)
return
@@ -17,7 +17,7 @@
return
/turf/simulated/floor/engine/blob_act()
- if (prob(25))
+ if(prob(25))
ChangeTurf(/turf/space)
qdel(src)
return
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index 0f19ce0990e..3c344f8dd30 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -92,9 +92,9 @@
air1.temperature = air1.temperature - energy_transfer/air1_heat_capacity
//Transfer the air
- if (air1)
+ if(air1)
circ1.air2.merge(air1)
- if (air2)
+ if(air2)
circ2.air2.merge(air2)
//Update the gas networks
@@ -137,7 +137,7 @@
/obj/machinery/power/generator/interact(mob/user)
- if ( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai)))
+ if( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai)))
user.unset_machine()
user << browse(null, "window=teg")
return
@@ -195,7 +195,7 @@
set name = "Rotate Generator (Clockwise)"
set src in view(1)
- if (usr.stat || usr.restrained() || anchored)
+ if(usr.stat || usr.restrained() || anchored)
return
src.dir = turn(src.dir, 90)
@@ -205,7 +205,7 @@
set name = "Rotate Generator (Counterclockwise)"
set src in view(1)
- if (usr.stat || usr.restrained() || anchored)
+ if(usr.stat || usr.restrained() || anchored)
return
src.dir = turn(src.dir, -90)
\ No newline at end of file
diff --git a/code/modules/power/generator_type2.dm b/code/modules/power/generator_type2.dm
index 46a6fe20320..6d2daf9f58c 100644
--- a/code/modules/power/generator_type2.dm
+++ b/code/modules/power/generator_type2.dm
@@ -100,7 +100,7 @@
/obj/machinery/power/generator_type2/interact(mob/user)
- if ( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai)))
+ if( (get_dist(src, user) > 1 ) && (!istype(user, /mob/living/silicon/ai)))
user.unset_machine()
user << browse(null, "window=teg")
return
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 04ffbc5c0a4..8833e047a7e 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -82,6 +82,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
//
/obj/machinery/gravity_generator/main/station/initialize()
+ ..()
setup_parts()
middle.overlays += "activated"
update_list()
@@ -123,7 +124,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
O.main_part = null
qdel(O)
for(var/area/A in world)
- if (!(A.z in config.station_levels)) continue
+ if(!(A.z in config.station_levels)) continue
A.gravitychange(0,A)
shake_everyone()
return ..()
@@ -215,17 +216,17 @@ var/const/GRAV_NEEDS_WRENCH = 3
/obj/machinery/gravity_generator/main/attack_hand(mob/user as mob)
if(!..())
return interact(user)
-
+
/obj/machinery/gravity_generator/main/attack_ai(mob/user as mob)
return 1
-
+
/obj/machinery/gravity_generator/main/attack_ghost(mob/user as mob)
return interact(user)
/obj/machinery/gravity_generator/main/interact(mob/user as mob)
if(stat & BROKEN)
return
-
+
var/dat = "Gravity Generator Breaker: "
if(breaker)
dat += "ON OFF "
@@ -300,7 +301,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
investigate_log("was brought online and is now producing gravity for this level.", "gravity")
message_admins("The gravity generator was brought online. ([area.name] )")
for(var/area/A in world)
- if (!(A.z in config.station_levels)) continue
+ if(!(A.z in config.station_levels)) continue
A.gravitychange(1,A)
else
if(gravity_in_level() == 1)
@@ -308,7 +309,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
investigate_log("was brought offline and there is now no gravity for this level.", "gravity")
message_admins("The gravity generator was brought offline with no backup generator. ([area.name] )")
for(var/area/A in world)
- if (!(A.z in config.station_levels)) continue
+ if(!(A.z in config.station_levels)) continue
A.gravitychange(0,A)
update_icon()
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 78ac0d7093a..a96a4851c81 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -23,7 +23,7 @@
/obj/machinery/light_construct/New()
..()
- if (fixture_type == "bulb")
+ if(fixture_type == "bulb")
icon_state = "bulb-construct-stage1"
/obj/machinery/light_construct/examine(mob/user)
@@ -38,30 +38,30 @@
/obj/machinery/light_construct/attackby(obj/item/weapon/W as obj, mob/living/user as mob, params)
src.add_fingerprint(user)
- if (istype(W, /obj/item/weapon/wrench))
- if (src.stage == 1)
+ if(istype(W, /obj/item/weapon/wrench))
+ if(src.stage == 1)
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
to_chat(usr, "You begin deconstructing [src].")
- if (!do_after(usr, 30, target = src))
+ if(!do_after(usr, 30, target = src))
return
new /obj/item/stack/sheet/metal( get_turf(src.loc), sheets_refunded )
user.visible_message("[user.name] deconstructs [src].", \
"You deconstruct [src].", "You hear a noise.")
playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1)
qdel(src)
- if (src.stage == 2)
+ if(src.stage == 2)
to_chat(usr, "You have to remove the wires first.")
return
- if (src.stage == 3)
+ if(src.stage == 3)
to_chat(usr, "You have to unscrew the case first.")
return
if(istype(W, /obj/item/weapon/wirecutters))
- if (src.stage != 2) return
+ if(src.stage != 2) return
src.stage = 1
switch(fixture_type)
- if ("tube")
+ if("tube")
src.icon_state = "tube-construct-stage1"
if("bulb")
src.icon_state = "bulb-construct-stage1"
@@ -72,11 +72,11 @@
return
if(istype(W, /obj/item/stack/cable_coil))
- if (src.stage != 1) return
+ if(src.stage != 1) return
var/obj/item/stack/cable_coil/coil = W
coil.use(1)
switch(fixture_type)
- if ("tube")
+ if("tube")
src.icon_state = "tube-construct-stage2"
if("bulb")
src.icon_state = "bulb-construct-stage2"
@@ -86,9 +86,9 @@
return
if(istype(W, /obj/item/weapon/screwdriver))
- if (src.stage == 2)
+ if(src.stage == 2)
switch(fixture_type)
- if ("tube")
+ if("tube")
src.icon_state = "tube-empty"
if("bulb")
src.icon_state = "bulb-empty"
@@ -101,7 +101,7 @@
if("tube")
newlight = new /obj/machinery/light/built(src.loc)
- if ("bulb")
+ if("bulb")
newlight = new /obj/machinery/light/small/built(src.loc)
newlight.dir = src.dir
@@ -337,7 +337,7 @@
continue
M.show_message("[user.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2)
if(on && (W.flags & CONDUCT))
- if (prob(12))
+ if(prob(12))
electrocute_mob(user, get_area(src), src, 0.3)
broken()
@@ -373,7 +373,7 @@
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(3, 1, src)
s.start()
- if (prob(75))
+ if(prob(75))
electrocute_mob(user, get_area(src), src, rand(0.7,1.0))
@@ -407,7 +407,7 @@
if(status == LIGHT_EMPTY||status == LIGHT_BROKEN)
to_chat(user, "\green That object is useless to you.")
return
- else if (status == LIGHT_OK||status == LIGHT_BURNED)
+ else if(status == LIGHT_OK||status == LIGHT_BURNED)
user.do_attack_animation(src)
visible_message("[user.name] smashed the light! ", "You hear a tinkle of breaking glass")
broken()
@@ -418,7 +418,7 @@
if(status == LIGHT_EMPTY||status == LIGHT_BROKEN)
to_chat(M, "\red That object is useless to you.")
return
- else if (status == LIGHT_OK||status == LIGHT_BURNED)
+ else if(status == LIGHT_OK||status == LIGHT_BURNED)
M.do_attack_animation(src)
visible_message("[M.name] smashed the light! ", "You hear a tinkle of breaking glass")
broken()
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index bc1599674a2..fdb9fe34ae1 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -179,7 +179,7 @@
//HasFuel() should guarantee us that there is enough fuel left, so no need to check that
//the only thing we need to worry about is if we are going to rollover to the next sheet
- if (needed_sheets > sheet_left)
+ if(needed_sheets > sheet_left)
sheets--
sheet_left = (1 + sheet_left) - needed_sheets
else
@@ -197,7 +197,7 @@
cooling in order to get more power out.
*/
var/datum/gas_mixture/environment = loc.return_air()
- if (environment)
+ if(environment)
var/ratio = min(environment.return_pressure()/ONE_ATMOSPHERE, 1)
var/ambient = environment.temperature - T20C
lower_limit += ambient*ratio
@@ -207,9 +207,9 @@
//calculate the temperature increase
var/bias = 0
- if (temperature < lower_limit)
+ if(temperature < lower_limit)
bias = min(round((average - temperature)/TEMPERATURE_DIVISOR, 1), TEMPERATURE_CHANGE_MAX)
- else if (temperature > upper_limit)
+ else if(temperature > upper_limit)
bias = max(round((temperature - average)/TEMPERATURE_DIVISOR, 1), -TEMPERATURE_CHANGE_MAX)
//limit temperature increase so that it cannot raise temperature above upper_limit,
@@ -218,20 +218,20 @@
var/dec_limit = min(temperature - lower_limit, 0)
temperature += between(dec_limit, rand(-7 + bias, 7 + bias), inc_limit)
- if (temperature > max_temperature)
+ if(temperature > max_temperature)
overheat()
- else if (overheating > 0)
+ else if(overheating > 0)
overheating--
/obj/machinery/power/port_gen/pacman/handleInactive()
var/cooling_temperature = 20
var/datum/gas_mixture/environment = loc.return_air()
- if (environment)
+ if(environment)
var/ratio = min(environment.return_pressure()/ONE_ATMOSPHERE, 1)
var/ambient = environment.temperature - T20C
cooling_temperature += ambient*ratio
- if (temperature > cooling_temperature)
+ if(temperature > cooling_temperature)
var/temp_loss = (temperature - cooling_temperature)/TEMPERATURE_DIVISOR
temp_loss = between(2, round(temp_loss, 1), TEMPERATURE_CHANGE_MAX)
temperature = max(temperature - temp_loss, cooling_temperature)
@@ -242,7 +242,7 @@
/obj/machinery/power/port_gen/pacman/proc/overheat()
overheating++
- if (overheating > 60)
+ if(overheating > 60)
explode()
/obj/machinery/power/port_gen/pacman/explode()
@@ -251,7 +251,7 @@
//1 mol = 10 u? I dunno. 1 mol of carbon is definitely bigger than a pill
/*var/plasma = (sheets+sheet_left)*20
var/datum/gas_mixture/environment = loc.return_air()
- if (environment)
+ if(environment)
environment.adjust_gas("plasma", plasma/10, temperature + T0C)*/
sheets = 0
@@ -259,10 +259,10 @@
..()
/obj/machinery/power/port_gen/pacman/emag_act(var/remaining_charges, var/mob/user)
- if (active && prob(25))
+ if(active && prob(25))
explode() //if they're foolish enough to emag while it's running
- if (!emagged)
+ if(!emagged)
emagged = 1
return 1
@@ -306,7 +306,7 @@
/obj/machinery/power/port_gen/pacman/attack_hand(mob/user as mob)
..()
- if (!anchored)
+ if(!anchored)
return
ui_interact(user)
@@ -343,7 +343,7 @@
data["fuel_type"] = sheet_name
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "pacman.tmpl", src.name, 500, 560)
ui.set_initial_data(data)
ui.open()
@@ -360,17 +360,17 @@
active = 1
icon_state = "portgen1"
if(href_list["action"] == "disable")
- if (active)
+ if(active)
active = 0
icon_state = "portgen0"
if(href_list["action"] == "eject")
if(!active)
DropFuel()
if(href_list["action"] == "lower_power")
- if (power_output > 1)
+ if(power_output > 1)
power_output--
- if (href_list["action"] == "higher_power")
- if (power_output < max_power_output || (emagged && power_output < round(max_power_output*2.5)))
+ if(href_list["action"] == "higher_power")
+ if(power_output < max_power_output || (emagged && power_output < round(max_power_output*2.5)))
power_output++
nanomanager.update_uis(src)
@@ -397,15 +397,15 @@
/obj/machinery/power/port_gen/pacman/super/UseFuel()
//produces a tiny amount of radiation when in use
- if (prob(2*power_output))
- for (var/mob/living/L in range(src, 5))
+ if(prob(2*power_output))
+ for(var/mob/living/L in range(src, 5))
L.apply_effect(1, IRRADIATE) //should amount to ~5 rads per minute at max safe power
..()
/obj/machinery/power/port_gen/pacman/super/explode()
//a nice burst of radiation
var/rads = 50 + (sheets + sheet_left)*1.5
- for (var/mob/living/L in range(src, 10))
+ for(var/mob/living/L in range(src, 10))
//should really fall with the square of the distance, but that makes the rads value drop too fast
//I dunno, maybe physics works different when you live in 2D -- SM radiation also works like this, apparently
L.apply_effect(max(20, round(rads/get_dist(L,src))), IRRADIATE)
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 7aa54d3429b..bab046450a3 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -204,7 +204,7 @@
var/Zdir
if(d==11)
Zdir = 11
- else if (d==12)
+ else if(d==12)
Zdir = 12
else
Zdir = 999
@@ -342,23 +342,23 @@
else if(istype(power_source,/obj/machinery/power/apc))
var/obj/machinery/power/apc/apc = power_source
cell = apc.cell
- if (apc.terminal)
+ if(apc.terminal)
PN = apc.terminal.powernet
- else if (!power_source)
+ else if(!power_source)
return 0
else
log_admin("ERROR: /proc/electrocute_mob([M], [power_source], [source]): wrong power_source")
return 0
- if (!cell && !PN)
+ if(!cell && !PN)
return 0
var/PN_damage = 0
var/cell_damage = 0
- if (PN)
+ if(PN)
PN_damage = PN.get_electrocute_damage()
- if (cell)
+ if(cell)
cell_damage = cell.get_electrocute_damage()
var/shock_damage = 0
- if (PN_damage>=cell_damage)
+ if(PN_damage>=cell_damage)
power_source = PN
shock_damage = PN_damage
else
@@ -367,11 +367,11 @@
var/drained_hp = M.electrocute_act(shock_damage, source, siemens_coeff) //zzzzzzap!
var/drained_energy = drained_hp*20
- if (source_area)
+ if(source_area)
source_area.use_power(drained_energy/CELLRATE)
- else if (istype(power_source,/datum/powernet))
+ else if(istype(power_source,/datum/powernet))
var/drained_power = drained_energy/CELLRATE //convert from "joules" to "watts"
drained_power = PN.draw_power(drained_power)
- else if (istype(power_source, /obj/item/weapon/stock_parts/cell))
+ else if(istype(power_source, /obj/item/weapon/stock_parts/cell))
cell.use(drained_energy)
return drained_energy
diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm
index d40281eae65..416de55f6c3 100644
--- a/code/modules/power/powernet.dm
+++ b/code/modules/power/powernet.dm
@@ -108,7 +108,7 @@
//very simple load balancing. If there was a net excess this tick then it must have been that some APCs used less than perapc, since perapc*numapc = avail
//Therefore we can raise the amount of power rationed out to APCs on the assumption that those APCs that used less than perapc will continue to do so.
//If that assumption fails, then some APCs will miss out on power next tick, however it will be rebalanced for the tick after.
- if (netexcess >= 0)
+ if(netexcess >= 0)
perapc_excess += min(netexcess/numapc, (avail - perapc) - perapc_excess)
else
perapc_excess = 0
@@ -129,19 +129,19 @@
/datum/powernet/proc/get_electrocute_damage()
switch(avail)
- if (5000000 to INFINITY)
+ if(5000000 to INFINITY)
return min(rand(200,300),rand(200,300))
- if (4000000 to 5000000)
+ if(4000000 to 5000000)
return min(rand(80,180),rand(80,180))
- if (1000000 to 4000000)
+ if(1000000 to 4000000)
return min(rand(50,160),rand(50,160))
- if (200000 to 1000000)
+ if(200000 to 1000000)
return min(rand(25,80),rand(25,80))
- if (100000 to 200000)//Ave powernet
+ if(100000 to 200000)//Ave powernet
return min(rand(20,60),rand(20,60))
- if (50000 to 100000)
+ if(50000 to 100000)
return min(rand(15,40),rand(15,40))
- if (1000 to 50000)
+ if(1000 to 50000)
return min(rand(10,20),rand(10,20))
else
return 0
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index dd15f904614..5ec69cf0233 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -84,7 +84,7 @@ var/global/list/rad_collectors = list()
else
disconnect_from_network()
else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda))
- if (src.allowed(user))
+ if(src.allowed(user))
if(active)
src.locked = !src.locked
to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]")
@@ -109,7 +109,7 @@ var/global/list/rad_collectors = list()
/obj/machinery/power/rad_collector/proc/eject()
locked = 0
var/obj/item/weapon/tank/plasma/Z = src.P
- if (!Z)
+ if(!Z)
return
Z.loc = get_turf(src)
Z.layer = initial(Z.layer)
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 06ba1a093f8..89119df21a8 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -64,7 +64,7 @@
set category = "Object"
set src in oview(1)
- if (src.anchored || usr:stat)
+ if(src.anchored || usr:stat)
to_chat(usr, "It is fastened to the floor!")
return 0
src.dir = turn(src.dir, 90)
@@ -117,7 +117,7 @@
return ..()
/obj/machinery/power/emitter/update_icon()
- if (active && powernet && avail(active_power_usage))
+ if(active && powernet && avail(active_power_usage))
icon_state = "emitter_+a"
else
icon_state = "emitter"
@@ -253,12 +253,12 @@
if(0)
to_chat(user, "\red The [src.name] needs to be wrenched to the floor.")
if(1)
- if (WT.remove_fuel(0,user))
+ if(WT.remove_fuel(0,user))
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \
"You start to weld the [src] to the floor.", \
"You hear welding")
- if (do_after(user,20, target = src))
+ if(do_after(user,20, target = src))
if(!src || !WT.isOn()) return
state = 2
to_chat(user, "You weld the [src] to the floor.")
@@ -266,12 +266,12 @@
else
to_chat(user, "\red You need more welding fuel to complete this task.")
if(2)
- if (WT.remove_fuel(0,user))
+ if(WT.remove_fuel(0,user))
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \
"You start to cut the [src] free from the floor.", \
"You hear welding")
- if (do_after(user,20, target = src))
+ if(do_after(user,20, target = src))
if(!src || !WT.isOn()) return
state = 1
to_chat(user, "You cut the [src] free from the floor.")
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 5bf41aac044..ed4d7bbc537 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -125,24 +125,24 @@ field_generator power level display
to_chat(user, "The [src.name] needs to be wrenched to the floor! ")
return
if(1)
- if (WT.remove_fuel(0,user))
+ if(WT.remove_fuel(0,user))
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \
"You start to weld \the [src] to the floor... ", \
"You hear welding. ")
- if (do_after(user,20, target = src))
+ if(do_after(user,20, target = src))
if(!src || !WT.isOn()) return
state = 2
to_chat(user, "You weld the field generator to the floor. ")
else
return
if(2)
- if (WT.remove_fuel(0,user))
+ if(WT.remove_fuel(0,user))
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \
"You start to cut \the [src] free from the floor... ", \
"You hear welding. ")
- if (do_after(user,20, target = src))
+ if(do_after(user,20, target = src))
if(!src || !WT.isOn()) return
state = 1
to_chat(user, "You cut \the [src] free from the floor. ")
@@ -179,7 +179,7 @@ field_generator power level display
active = 0
spawn(1)
src.cleanup()
- while (warming_up>0 && !active)
+ while(warming_up>0 && !active)
sleep(50)
warming_up--
update_icon()
@@ -187,7 +187,7 @@ field_generator power level display
/obj/machinery/field/generator/proc/turn_on()
active = 1
spawn(1)
- while (warming_up<3 && active)
+ while(warming_up<3 && active)
sleep(50)
warming_up++
update_icon()
@@ -204,8 +204,8 @@ field_generator power level display
src.power = field_generator_max_power
var/power_draw = 2
- for (var/obj/machinery/field/containment/F in fields)
- if (isnull(F))
+ for(var/obj/machinery/field/containment/F in fields)
+ if(isnull(F))
continue
power_draw++
if(draw_power(round(power_draw/2,1)))
@@ -303,7 +303,7 @@ field_generator power level display
CF.Crossed(L)
var/listcheck = 0
for(var/obj/machinery/field/generator/FG in connected_gens)
- if (isnull(FG))
+ if(isnull(FG))
continue
if(FG == G)
listcheck = 1
@@ -312,7 +312,7 @@ field_generator power level display
connected_gens.Add(G)
listcheck = 0
for(var/obj/machinery/field/generator/FG2 in G.connected_gens)
- if (isnull(FG2))
+ if(isnull(FG2))
continue
if(FG2 == src)
listcheck = 1
@@ -323,13 +323,13 @@ field_generator power level display
/obj/machinery/field/generator/proc/cleanup()
clean_up = 1
- for (var/obj/machinery/field/containment/F in fields)
- if (isnull(F))
+ for(var/obj/machinery/field/containment/F in fields)
+ if(isnull(F))
continue
qdel(F)
fields = list()
for(var/obj/machinery/field/generator/FG in connected_gens)
- if (isnull(FG))
+ if(isnull(FG))
continue
FG.connected_gens.Remove(src)
if(!FG.clean_up)//Makes the other gens clean up as well
diff --git a/code/modules/power/singularity/investigate.dm b/code/modules/power/singularity/investigate.dm
index bd82ff47c5c..6e22b1ad118 100644
--- a/code/modules/power/singularity/investigate.dm
+++ b/code/modules/power/singularity/investigate.dm
@@ -1,4 +1,4 @@
/area/engine/engineering/power_alert(var/alarming)
- if (alarming)
+ if(alarming)
investigate_log("has a power alarm!","singulo")
..()
\ No newline at end of file
diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm
index 5f858d92448..2232e322dbd 100644
--- a/code/modules/power/singularity/particle_accelerator/particle.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle.dm
@@ -35,7 +35,7 @@
/obj/effect/accelerated_particle/Bump(atom/A)
- if (A)
+ if(A)
if(ismob(A))
toxmob(A)
if((istype(A,/obj/machinery/the_singularitygen))||(istype(A,/obj/singularity/)))
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index cff8c2ee9fa..051440525f3 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -95,7 +95,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
if(usr.stat || !usr.canmove || usr.restrained())
return
- if (src.anchored)
+ if(src.anchored)
to_chat(usr, "It is fastened to the floor!")
return 0
src.dir = turn(src.dir, 270)
@@ -108,7 +108,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
if(usr.stat || !usr.canmove || usr.restrained())
return
- if (src.anchored)
+ if(src.anchored)
to_chat(usr, "It is fastened to the floor!")
return 0
src.dir = turn(src.dir, 90)
@@ -149,11 +149,11 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
qdel(src)
return
if(2.0)
- if (prob(50))
+ if(prob(50))
qdel(src)
return
if(3.0)
- if (prob(25))
+ if(prob(25))
qdel(src)
return
else
@@ -288,7 +288,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
if(usr.stat || !usr.canmove || usr.restrained())
return
- if (src.anchored)
+ if(src.anchored)
to_chat(usr, "It is fastened to the floor!")
return 0
src.dir = turn(src.dir, 270)
@@ -301,7 +301,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
if(usr.stat || !usr.canmove || usr.restrained())
return
- if (src.anchored)
+ if(src.anchored)
to_chat(usr, "It is fastened to the floor!")
return 0
src.dir = turn(src.dir, 90)
@@ -323,11 +323,11 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
qdel(src)
return
if(2.0)
- if (prob(50))
+ if(prob(50))
qdel(src)
return
if(3.0)
- if (prob(25))
+ if(prob(25))
qdel(src)
return
else
diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm
index 8101269762e..a06290e84c5 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_control.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm
@@ -221,7 +221,7 @@
/obj/machinery/particle_accelerator/control_box/proc/toggle_power()
src.active = !src.active
investigate_log("turned [active?"ON ":"OFF "] by [usr ? usr.key : "outside forces"]","singulo")
- if (active)
+ if(active)
msg_admin_attack("PA Control Computer turned ON by [key_name(usr, usr.client)](? ) in ([x],[y],[z] - JMP )",0,1)
log_game("PA Control Computer turned ON by [usr.ckey]([usr]) in ([x],[y],[z])")
use_log += text("\[[time_stamp()]\] [usr.name] ([usr.ckey]) has turned on the PA Control Computer. ")
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 56da613f48b..ce0d22c4165 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -370,7 +370,7 @@
var/toxrange = 10
var/radiation = 15
var/radiationmin = 3
- if (energy>200)
+ if(energy>200)
radiation += round((energy-150)/10,1)
radiationmin = round((radiation/5),1)
for(var/mob/living/M in view(toxrange, src.loc))
@@ -392,7 +392,7 @@
continue
if(M.stat == CONSCIOUS)
- if (istype(M,/mob/living/carbon/human))
+ if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(istype(H.glasses, /obj/item/clothing/glasses/meson))
var/obj/item/clothing/glasses/meson/MS = H.glasses
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index d55394f83bd..66e2e5d68b4 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -105,7 +105,7 @@
if(inputting == 2)
overlays += image('icons/obj/power.dmi', "smes-oc2")
- else if (inputting == 1)
+ else if(inputting == 1)
overlays += image('icons/obj/power.dmi', "smes-oc1")
else
if(input_attempt)
@@ -158,7 +158,7 @@
return
var/turf/T = get_turf(user)
- if (T.intact) //is the floor plating removed ?
+ if(T.intact) //is the floor plating removed ?
to_chat(user, "You must first remove the floor plating! ")
return
@@ -175,7 +175,7 @@
//disassembling the terminal
if(istype(I, /obj/item/weapon/wirecutters) && terminal && panel_open)
var/turf/T = get_turf(terminal)
- if (T.intact) //is the floor plating removed ?
+ if(T.intact) //is the floor plating removed ?
to_chat(user, "You must first expose the power terminal! ")
return
@@ -183,7 +183,7 @@
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
if(do_after(user, 50, target = src))
- if (prob(50) && electrocute_mob(usr, terminal.powernet, terminal)) //animate the electrocution if uncautious and unlucky
+ if(prob(50) && electrocute_mob(usr, terminal.powernet, terminal)) //animate the electrocution if uncautious and unlucky
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
@@ -241,9 +241,9 @@
var/actual_load = draw_power(target_load) // add the load to the terminal side network
charge += actual_load * SMESRATE // increase the charge
- if (actual_load >= target_load) // Did we charge at full rate?
+ if(actual_load >= target_load) // Did we charge at full rate?
inputting = 2
- else if (actual_load) // If not, did we charge at least partially?
+ else if(actual_load) // If not, did we charge at least partially?
inputting = 1
else // Or not at all?
inputting = 0
@@ -301,22 +301,22 @@
//Will return 1 on failure
/obj/machinery/power/smes/proc/make_terminal(const/mob/user)
- if (user.loc == loc)
+ if(user.loc == loc)
to_chat(user, "You must not be on the same tile as the [src]. ")
return 1
//Direction the terminal will face to
var/tempDir = get_dir(user, src)
switch(tempDir)
- if (NORTHEAST, SOUTHEAST)
+ if(NORTHEAST, SOUTHEAST)
tempDir = EAST
- if (NORTHWEST, SOUTHWEST)
+ if(NORTHWEST, SOUTHWEST)
tempDir = WEST
var/turf/tempLoc = get_step(src, reverse_direction(tempDir))
- if (istype(tempLoc, /turf/space))
+ if(istype(tempLoc, /turf/space))
to_chat(user, "You can't build a terminal on space. ")
return 1
- else if (istype(tempLoc))
+ else if(istype(tempLoc))
if(tempLoc.intact)
to_chat(user, "You must remove the floor plating first. ")
return 1
@@ -324,7 +324,7 @@
if(do_after(user, 50, target = src))
var/turf/T = get_turf(user)
var/obj/structure/cable/N = T.get_cable_node() //get the connecting node cable, if there's one
- if (prob(50) && electrocute_mob(user, N, N)) //animate the electrocution if uncautious and unlucky
+ if(prob(50) && electrocute_mob(user, N, N)) //animate the electrocution if uncautious and unlucky
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
@@ -385,7 +385,7 @@
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "smes.tmpl", "SMES Power Storage Unit", 540, 380)
@@ -475,7 +475,7 @@
output_level = rand(0, output_level_max)
input_level = rand(0, input_level_max)
charge -= 1e6/severity
- if (charge < 0)
+ if(charge < 0)
charge = 0
update_icon()
..()
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index c8f5fc312e8..a6a54c75feb 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -69,7 +69,7 @@
user.visible_message("[user] takes the glass off the solar panel.", "You take the glass off the solar panel. ")
qdel(src)
return
- else if (W)
+ else if(W)
src.add_fingerprint(user)
src.health -= W.force
src.healthcheck()
@@ -83,7 +83,7 @@
/obj/machinery/power/solar/proc/healthcheck()
- if (src.health <= 0)
+ if(src.health <= 0)
if(!(stat & BROKEN))
broken()
else
@@ -404,7 +404,7 @@
data["connected_tracker"] = (connected_tracker ? 1 : 0)
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "solar_control.tmpl", name, 490, 420)
ui.set_initial_data(data)
ui.open()
@@ -414,12 +414,12 @@
if(istype(I, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
if(do_after(user, 20, target = src))
- if (src.stat & BROKEN)
+ if(src.stat & BROKEN)
to_chat(user, "The broken glass falls out. ")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
new /obj/item/weapon/shard( src.loc )
var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A )
- for (var/obj/C in src)
+ for(var/obj/C in src)
C.loc = src.loc
A.circuit = M
A.state = 3
@@ -430,7 +430,7 @@
to_chat(user, "You disconnect the monitor. ")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A )
- for (var/obj/C in src)
+ for(var/obj/C in src)
C.loc = src.loc
A.circuit = M
A.state = 4
@@ -479,7 +479,7 @@
if(connected_tracker)
connected_tracker.set_angle(sun.angle)
set_panels(cdir)
- else if (track == 1) //begin manual tracking
+ else if(track == 1) //begin manual tracking
src.targetdir = src.cdir
if(src.trackrate) nexttime = world.time + 36000/abs(trackrate)
set_panels(targetdir)
@@ -525,7 +525,7 @@
broken()
/obj/machinery/power/solar_control/blob_act()
- if (prob(75))
+ if(prob(75))
broken()
src.density = 0
diff --git a/code/modules/power/supermatter/sm_crystals.dm b/code/modules/power/supermatter/sm_crystals.dm
index 910f724d079..cb9448a2b2e 100644
--- a/code/modules/power/supermatter/sm_crystals.dm
+++ b/code/modules/power/supermatter/sm_crystals.dm
@@ -159,11 +159,11 @@
qdel(src)
return
if(2.0)
- if (prob(50))
+ if(prob(50))
qdel(src)
return
if(3.0)
- if (prob(5))
+ if(prob(5))
qdel(src)
return
else
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 5bb36c06187..0f6d41fc145 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -278,7 +278,7 @@
data["detonating"] = 0
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "supermatter_crystal.tmpl", "Supermatter Crystal", 500, 300)
ui.set_initial_data(data)
ui.open()
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index 6c4d1c3d6d0..af3d37e4481 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -62,7 +62,7 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics,
pixel_x = -32
pixel_y = -32
- for (var/ball in orbiting_balls)
+ for(var/ball in orbiting_balls)
tesla_zap(ball, rand(1, Clamp(orbiting_balls.len, 3, 7)), TESLA_MINI_POWER)
else
energy = 0 // ensure we dont have miniballs of miniballs
@@ -94,7 +94,7 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics,
playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, 1, extrarange = 30)
spawn(100)
- if (!loc)
+ if(!loc)
return
var/obj/singularity/energy_ball/EB = new(loc)
@@ -123,14 +123,14 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics,
dust_mobs(A)
/obj/singularity/energy_ball/orbit(obj/singularity/energy_ball/target)
- if (istype(target))
+ if(istype(target))
target.orbiting_balls += src
. = ..()
- if (istype(target))
+ if(istype(target))
target.orbiting_balls -= src
- if (!loc)
+ if(!loc)
qdel(src)
/obj/singularity/energy_ball/proc/dust_mobs(atom/A)
diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm
index 190c971f7cf..63653eab9d1 100644
--- a/code/modules/power/tracker.dm
+++ b/code/modules/power/tracker.dm
@@ -81,4 +81,4 @@
name = "tracker electronics"
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
- w_class = 2.0
+ w_class = 2
diff --git a/code/modules/power/treadmill.dm b/code/modules/power/treadmill.dm
index 8ae75a982a4..0dc2bbb5f76 100644
--- a/code/modules/power/treadmill.dm
+++ b/code/modules/power/treadmill.dm
@@ -138,6 +138,7 @@
var/redeem_immediately = 0 // redeem immediately for holding cell
/obj/machinery/treadmill_monitor/initialize()
+ ..()
if(id)
for(var/obj/machinery/power/treadmill/T in machines)
if(T.id == id)
@@ -222,4 +223,4 @@
#undef FONT_SIZE
#undef FONT_COLOR
#undef FONT_STYLE
-#undef CHARS_PER_LINE
\ No newline at end of file
+#undef CHARS_PER_LINE
diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm
index 7df58795f43..8f1685803f1 100644
--- a/code/modules/power/turbine.dm
+++ b/code/modules/power/turbine.dm
@@ -293,7 +293,7 @@
/obj/machinery/power/turbine/interact(mob/user)
- if ( !Adjacent(user) || (stat & (NOPOWER|BROKEN)) && (!istype(user, /mob/living/silicon)) )
+ if( !Adjacent(user) || (stat & (NOPOWER|BROKEN)) && (!istype(user, /mob/living/silicon)) )
user.unset_machine(src)
user << browse(null, "window=turbine")
return
diff --git a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm
index 78286e416f4..a392105513a 100644
--- a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm
+++ b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm
@@ -35,7 +35,7 @@
/datum/mapGeneratorModule/border/proc/is_border(var/turf/T)
for(var/direction in list(SOUTH,EAST,WEST,NORTH))
- if (get_step(T,direction) in mother.map)
+ if(get_step(T,direction) in mother.map)
continue
return 1
return 0
\ No newline at end of file
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm
index 26dce25ead2..b5a990dec69 100644
--- a/code/modules/projectiles/ammunition.dm
+++ b/code/modules/projectiles/ammunition.dm
@@ -32,7 +32,7 @@
desc = "[initial(desc)][BB ? "" : " This one is spent"]"
/obj/item/ammo_casing/proc/newshot(params) //For energy weapons, shotgun shells and wands (!).
- if (!BB)
+ if(!BB)
BB = new projectile_type(src, params)
return
@@ -42,14 +42,14 @@
if(isturf(loc))
var/boolets = 0
for(var/obj/item/ammo_casing/bullet in loc)
- if (box.stored_ammo.len >= box.max_ammo)
+ if(box.stored_ammo.len >= box.max_ammo)
break
- if (bullet.BB)
- if (box.give_round(bullet, 0))
+ if(bullet.BB)
+ if(box.give_round(bullet, 0))
boolets++
else
continue
- if (boolets > 0)
+ if(boolets > 0)
box.update_icon()
to_chat(user, "You collect [boolets] shell\s. [box] now contains [box.stored_ammo.len] shell\s. ")
else
@@ -109,12 +109,12 @@
return ..()
/obj/item/ammo_box/proc/get_round(keep = 0)
- if (!stored_ammo.len)
+ if(!stored_ammo.len)
return null
else
var/b = stored_ammo[stored_ammo.len]
stored_ammo -= b
- if (keep)
+ if(keep)
stored_ammo.Insert(1,b)
return b
@@ -123,7 +123,7 @@
if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type))
return 0
- if (stored_ammo.len < max_ammo)
+ if(stored_ammo.len < max_ammo)
stored_ammo += R
R.loc = src
return 1
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index a5af74e4d6c..a661c0e3701 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -235,7 +235,7 @@
/obj/item/ammo_casing/shotgun/dart/bioterror/New()
..()
reagents.add_reagent("neurotoxin", 6)
- reagents.add_reagent("spores", 6)
+ reagents.add_reagent("spore", 6)
reagents.add_reagent("mutetoxin", 6) //;HELP OPS IN MAINT
reagents.add_reagent("coniine", 6)
reagents.add_reagent("sodium_thiopental", 6)
@@ -269,7 +269,7 @@
desc = "A caseless bullet casing."
/obj/item/ammo_casing/caseless/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params, distro, quiet)
- if (..())
+ if(..())
loc = null
return 1
else
@@ -298,7 +298,7 @@
/obj/item/ammo_casing/caseless/foam_dart/update_icon()
..()
- if (modified)
+ if(modified)
icon_state = "foamdart_empty"
desc = "Its nerf or nothing! ... Although, this one doesn't look too safe."
if(BB)
@@ -312,11 +312,11 @@
/obj/item/ammo_casing/caseless/foam_dart/attackby(obj/item/A, mob/user, params)
..()
var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
- if (istype(A, /obj/item/weapon/screwdriver) && !modified)
+ if(istype(A, /obj/item/weapon/screwdriver) && !modified)
modified = 1
FD.damage_type = BRUTE
update_icon()
- else if ((istype(A, /obj/item/weapon/pen)) && modified && !FD.pen)
+ else if((istype(A, /obj/item/weapon/pen)) && modified && !FD.pen)
if(!user.unEquip(A))
return
A.loc = FD
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index 7ed6fd4d9ed..a5dc8c62da3 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -35,7 +35,7 @@
/obj/item/ammo_casing/energy/laser/pulse
projectile_type = /obj/item/projectile/beam/pulse
- e_cost = 200
+ e_cost = 2000
select_name = "DESTROY"
fire_sound = 'sound/weapons/pulse.ogg'
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index c77dcc07595..526876ca519 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -83,7 +83,7 @@
multiload = 0
/obj/item/ammo_box/magazine/internal/shot/ammo_count(countempties = 1)
- if (!countempties)
+ if(!countempties)
var/boolets = 0
for(var/obj/item/ammo_casing/bullet in stored_ammo)
if(bullet.BB)
@@ -180,6 +180,10 @@
max_ammo = 8
multiple_sprites = 2
+/obj/item/ammo_box/magazine/m10mm/empty //for maint drops
+ desc = "A gun magazine. Seems to be broken and can only hold one bullet. Pretty useless."
+ max_ammo = 1
+
/obj/item/ammo_box/magazine/m45
name = "handgun magazine (.45)"
icon_state = "45-8"
diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm
index 2a75004f223..773ed4cff72 100644
--- a/code/modules/projectiles/firing.dm
+++ b/code/modules/projectiles/firing.dm
@@ -1,6 +1,6 @@
/obj/item/ammo_casing/proc/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params, distro, quiet, zone_override = "", spread)
distro += variance
- for (var/i = max(1, pellets), i > 0, i--)
+ for(var/i = max(1, pellets), i > 0, i--)
var/targloc = get_turf(target)
ready_proj(target, user, quiet, zone_override)
if(distro) //We have to spread a pixel-precision bullet. throw_proj was called before so angles should exist by now...
@@ -21,11 +21,11 @@
return 1
/obj/item/ammo_casing/proc/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
- if (!BB)
+ if(!BB)
return
BB.original = target
BB.firer = user
- if (zone_override)
+ if(zone_override)
BB.def_zone = zone_override
else
BB.def_zone = user.zone_sel.selecting
@@ -37,7 +37,7 @@
/obj/item/ammo_casing/proc/throw_proj(atom/target, turf/targloc, mob/living/user, params, spread)
var/turf/curloc = get_turf(user)
- if (!istype(targloc) || !istype(curloc) || !BB)
+ if(!istype(targloc) || !istype(curloc) || !BB)
return 0
BB.ammo_casing = src
if(targloc == curloc)
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 74a4bcd8ba6..5d0e190ee04 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -140,7 +140,7 @@
//Exclude lasertag guns from the CLUMSY check.
if(clumsy_check)
if(istype(user))
- if (user.disabilities & CLUMSY && prob(40))
+ if((CLUMSY in user.mutations) && prob(40))
to_chat(user, "You shoot yourself in the foot with \the [src]! ")
var/shot_leg = pick("l_foot", "r_foot")
process_fire(user, user, 0, params, zone_override = shot_leg)
@@ -251,7 +251,9 @@ obj/item/weapon/gun/proc/newshot(params)
I.loc = src
update_icon()
update_gunlight(user)
- verbs += /obj/item/weapon/gun/proc/toggle_gunlight
+ var/datum/action/A = new /datum/action/item_action/toggle_gunlight(src)
+ if(loc == user)
+ A.Grant(user)
if(istype(I, /obj/item/weapon/screwdriver))
if(F && can_flashlight)
@@ -262,7 +264,8 @@ obj/item/weapon/gun/proc/newshot(params)
update_gunlight(user)
S.update_brightness(user)
update_icon()
- verbs -= /obj/item/weapon/gun/proc/toggle_gunlight
+ for(var/datum/action/item_action/toggle_gunlight/TGL in actions)
+ qdel(TGL)
if(unique_rename)
if(istype(I, /obj/item/weapon/pen))
@@ -296,6 +299,10 @@ obj/item/weapon/gun/proc/newshot(params)
else
set_light(0)
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
+
/obj/item/weapon/gun/pickup(mob/user)
..()
if(azoom)
@@ -376,7 +383,7 @@ obj/item/weapon/gun/proc/newshot(params)
/datum/action/toggle_scope_zoom
name = "Toggle Scope"
- check_flags = AB_CHECK_ALIVE|AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING
+ check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING
button_icon_state = "sniper_zoom"
var/obj/item/weapon/gun/gun = null
diff --git a/code/modules/projectiles/guns/dartgun.dm b/code/modules/projectiles/guns/dartgun.dm
index 2e55b19b4a9..ba01fde783c 100644
--- a/code/modules/projectiles/guns/dartgun.dm
+++ b/code/modules/projectiles/guns/dartgun.dm
@@ -121,7 +121,7 @@
src.update_icon()
/obj/item/weapon/gun/dartgun/proc/get_mixed_syringe()
- if (!cartridge)
+ if(!cartridge)
return 0
if(!cartridge.darts)
return 0
@@ -136,7 +136,7 @@
return dart
/obj/item/weapon/gun/dartgun/proc/fire_dart(atom/target, mob/user)
- if (locate (/obj/structure/table, src.loc))
+ if(locate (/obj/structure/table, src.loc))
return
else
var/turf/trg = get_turf(target)
@@ -172,7 +172,7 @@
for(var/datum/reagent/A in D.reagents.reagent_list)
R += A.id + " ("
R += num2text(A.volume) + "),"
- if (istype(M, /mob))
+ if(istype(M, /mob))
M.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] shot [M]/[M.ckey] with a dartgun ([R])"
user.attack_log += "\[[time_stamp()]\] [user]/[user.ckey] shot [M]/[M.ckey] with a dartgun ([R])"
if(M.ckey)
@@ -199,7 +199,7 @@
sleep(1)
- if (D) spawn(10) qdel(D)
+ if(D) spawn(10) qdel(D)
return
@@ -212,14 +212,14 @@
user.set_machine(src)
var/dat = "[src] mixing control: "
- if (beakers.len)
+ if(beakers.len)
var/i = 1
for(var/obj/item/weapon/reagent_containers/glass/beaker/B in beakers)
dat += "Beaker [i] contains: "
if(B.reagents && B.reagents.reagent_list.len)
for(var/datum/reagent/R in B.reagents.reagent_list)
dat += " [R.volume] units of [R.name], "
- if (check_beaker_mixing(B))
+ if(check_beaker_mixing(B))
dat += text("Mixing ")
else
dat += text("Not mixing ")
@@ -257,11 +257,11 @@
if(M == beakers[index])
mixing -= M
break
- else if (href_list["mix"])
+ else if(href_list["mix"])
var/index = text2num(href_list["mix"])
if(index <= beakers.len)
mixing += beakers[index]
- else if (href_list["eject"])
+ else if(href_list["eject"])
var/index = text2num(href_list["eject"])
if(index <= beakers.len)
if(beakers[index])
@@ -270,7 +270,7 @@
mixing -= B
beakers -= B
B.forceMove(get_turf(src))
- else if (href_list["eject_cart"])
+ else if(href_list["eject_cart"])
remove_cartridge()
src.updateUsrDialog()
return
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 76e86d74699..ca6bfd495a6 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -31,7 +31,7 @@
power_supply = new(src)
power_supply.give(power_supply.maxcharge)
var/obj/item/ammo_casing/energy/shot
- for (var/i = 1, i <= ammo_type.len, i++)
+ for(var/i = 1, i <= ammo_type.len, i++)
var/shottype = ammo_type[i]
shot = new shottype(src)
ammo_type[i] = shot
@@ -81,7 +81,7 @@
return power_supply.charge >= shot.e_cost
/obj/item/weapon/gun/energy/newshot(params)
- if (!ammo_type || !power_supply)
+ if(!ammo_type || !power_supply)
return
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
if(power_supply.charge >= shot.e_cost) //if there's enough power in the power_supply cell...
@@ -98,12 +98,12 @@
/obj/item/weapon/gun/energy/proc/select_fire(mob/living/user)
select++
- if (select > ammo_type.len)
+ if(select > ammo_type.len)
select = 1
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
fire_sound = shot.fire_sound
fire_delay = shot.delay
- if (shot.select_name)
+ if(shot.select_name)
to_chat(user, "[src] is now set to [shot.select_name]. ")
update_icon()
return
@@ -116,7 +116,7 @@
var/itemState = null
if(!initial(item_state))
itemState = icon_state
- if (modifystate)
+ if(modifystate)
overlays += "[icon_state]_[shot.select_name]"
iconState += "_[shot.select_name]"
if(itemState)
@@ -142,7 +142,7 @@
toggle_gunlight()
/obj/item/weapon/gun/energy/suicide_act(mob/user)
- if (can_shoot())
+ if(can_shoot())
user.visible_message("[user] is putting the barrel of the [name] in \his mouth. It looks like \he's trying to commit suicide. ")
sleep(25)
if(user.l_hand == src || user.r_hand == src)
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 3c4766fd58b..6affad6284f 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -5,7 +5,7 @@
item_state = null //so the human update icon uses the icon_state instead.
fire_sound = 'sound/weapons/IonRifle.ogg'
origin_tech = "combat=2;magnets=4"
- w_class = 5.0
+ w_class = 5
flags = CONDUCT
slot_flags = SLOT_BACK
ammo_type = list(/obj/item/ammo_casing/energy/ion)
@@ -86,20 +86,49 @@
/obj/item/weapon/gun/energy/kinetic_accelerator
name = "proto-kinetic accelerator"
- desc = "According to Nanotrasen accounting, this is mining equipment. It's been modified for extreme power output to crush rocks, but often serves as a miner's first defense against hostile alien life; it's not very powerful unless used in a low pressure environment."
+ desc = "In the year 2544, only a year after the discovery of a potentially \
+ world-changing substance, now colloquially referred to as plasma, the \
+ Nanotrasen-UEG mining conglomerate introduced a prototype of a gun-like \
+ device intended for quick, effective mining of plasma in the low \
+ pressures of the solar system. Included in this presentation were \
+ demonstrations of the gun being fired at collections of rocks contained \
+ in vacuumed environments, obliterating them instantly while maintaining \
+ the structure of the ores buried within them. Additionally, volunteers \
+ were called from the crowd to have the gun used on them, only proving that \
+ the gun caused little harm to objects in standard pressure. \n\
+ An official from an unnamed, now long dissipated company observed this \
+ presentation and offered to share their self-recharger cells, powered \
+ by the user's bioelectrical field, another new and unknown technology. \
+ They warned that the cells were incredibly experimental and several times \
+ had injured workers, but the scientists as Nanotrasen were unable to resist \
+ the money-saving potential of self recharging cells. Upon accepting this \
+ offer, it took only a matter of days to prove the volatility of these cells, \
+ as they exploded left and right whenever inserted into the prototype devices, \
+ only throwing more money in the bin. \n\
+ Whenever the Nanotrasen scientists were on the edge of giving up, a \
+ breakthrough was made by head researcher Miles Parks McCollum, who \
+ demonstrated that the cells could be stabilized when exposed to radium \
+ then cooled with cryostylane. After this discovery, the low pressure gun, \
+ now named the Kinetic Accelerator, was hastily completed and made compatible \
+ with the self-recharging cells. As a result of poor testing, the currently \
+ used guns lose their charge when not in use, and when two Kinetic Accelerators \
+ come in proximity of one another, they will interfere with each other. Despite \
+ this, the shoddy guns still see use in the mining of plasma to this day."
icon_state = "kineticgun"
item_state = "kineticgun"
ammo_type = list(/obj/item/ammo_casing/energy/kinetic)
cell_type = /obj/item/weapon/stock_parts/cell/emproof
// Apparently these are safe to carry? I'm sure goliaths would disagree.
needs_permit = 0
- var/overheat_time = 16
unique_rename = 1
+ origin_tech = "combat=3;powerstorage=3;engineering=3"
weapon_weight = WEAPON_LIGHT
- origin_tech = "combat=2;powerstorage=1"
+ can_flashlight = 1
+ flight_x_offset = 15
+ flight_y_offset = 9
+ var/overheat_time = 16
var/holds_charge = FALSE
var/unique_frequency = FALSE // modified by KA modkits
-
var/overheat = FALSE
/obj/item/weapon/gun/energy/kinetic_accelerator/super
@@ -122,6 +151,10 @@
holds_charge = TRUE
unique_frequency = TRUE
+/obj/item/weapon/gun/energy/kinetic_accelerator/hyper/cyborg
+ holds_charge = TRUE
+ unique_frequency = TRUE
+
/obj/item/weapon/gun/energy/kinetic_accelerator/New()
. = ..()
if(!holds_charge)
@@ -279,13 +312,13 @@
desc = "A projector that emits high density quantum-coupled bluespace beams."
ammo_type = list(/obj/item/ammo_casing/energy/wormhole, /obj/item/ammo_casing/energy/wormhole/orange)
item_state = null
- icon_state = "wormhole_projector100"
+ icon_state = "wormhole_projector1"
var/obj/effect/portal/blue
var/obj/effect/portal/orange
/obj/item/weapon/gun/energy/wormhole_projector/update_icon()
- icon_state = "[initial(icon_state)][select]"
+ icon_state = "wormhole_projector[select]"
item_state = icon_state
return
@@ -306,6 +339,8 @@
/obj/item/weapon/gun/energy/wormhole_projector/proc/create_portal(obj/item/projectile/beam/wormhole/W)
var/obj/effect/portal/P = new /obj/effect/portal(get_turf(W), null, src)
P.precision = 0
+ P.failchance = 0
+ P.can_multitool_to_remove = 1
if(W.name == "bluespace beam")
qdel(blue)
blue = P
@@ -441,7 +476,7 @@
desc = "A gun that changes the body temperature of its targets. Its temperature cap has been hacked."
/obj/item/weapon/gun/energy/temperature/Topic(href, href_list)
- if (..())
+ if(..())
return
usr.set_machine(src)
add_fingerprint(usr)
@@ -452,7 +487,7 @@
target_temperature = min((500 + 500*emagged), target_temperature+amount)
else
target_temperature = max(0, target_temperature+amount)
- if (istype(loc, /mob))
+ if(istype(loc, /mob))
attack_self(loc)
add_fingerprint(usr)
return
@@ -489,9 +524,9 @@
temperature = target_temperature
update_icon()
- if (istype(loc, /mob/living/carbon))
+ if(istype(loc, /mob/living/carbon))
var /mob/living/carbon/M = loc
- if (src == M.machine)
+ if(src == M.machine)
update_dat()
M << browse("Temperature Gun Configuration [dat]", "window=tempgun;size=510x102")
return
@@ -550,7 +585,7 @@
update_charge()
/obj/item/weapon/gun/energy/temperature/proc/update_user()
- if (istype(loc,/mob/living/carbon))
+ if(istype(loc,/mob/living/carbon))
var/mob/living/carbon/M = loc
M.update_inv_back()
M.update_inv_l_hand()
diff --git a/code/modules/projectiles/guns/energy/telegun.dm b/code/modules/projectiles/guns/energy/telegun.dm
index e8a882d7c80..a52a40c7ef2 100644
--- a/code/modules/projectiles/guns/energy/telegun.dm
+++ b/code/modules/projectiles/guns/energy/telegun.dm
@@ -21,7 +21,7 @@
for(var/obj/item/device/radio/beacon/R in beacons)
var/turf/T = get_turf(R)
- if (!T)
+ if(!T)
continue
if((T.z in config.admin_levels) || T.z > 7)
continue
diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm
index 0c7f54bb21a..860d52d2550 100644
--- a/code/modules/projectiles/guns/magic.dm
+++ b/code/modules/projectiles/guns/magic.dm
@@ -37,7 +37,7 @@
return charges
/obj/item/weapon/gun/magic/newshot(params)
- if (charges && chambered)
+ if(charges && chambered)
chambered.newshot(params)
return
diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm
index 85b483b8363..9ef7de7f369 100644
--- a/code/modules/projectiles/guns/magic/staff.dm
+++ b/code/modules/projectiles/guns/magic/staff.dm
@@ -1,21 +1,22 @@
-obj/item/weapon/gun/magic/staff/
+/obj/item/weapon/gun/magic/staff
slot_flags = SLOT_BACK
+ ammo_type = /obj/item/ammo_casing/magic
-obj/item/weapon/gun/magic/staff/change
+/obj/item/weapon/gun/magic/staff/change
name = "staff of change"
desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself"
ammo_type = /obj/item/ammo_casing/magic/change
icon_state = "staffofchange"
item_state = "staffofchange"
-obj/item/weapon/gun/magic/staff/animate
+/obj/item/weapon/gun/magic/staff/animate
name = "staff of animation"
desc = "An artefact that spits bolts of life-force which causes objects which are hit by it to animate and come to life! This magic doesn't affect machines."
ammo_type = /obj/item/ammo_casing/magic/animate
icon_state = "staffofanimation"
item_state = "staffofanimation"
-obj/item/weapon/gun/magic/staff/healing
+/obj/item/weapon/gun/magic/staff/healing
name = "staff of healing"
desc = "An artefact that spits bolts of restoring magic which can remove ailments of all kinds and even raise the dead."
ammo_type = /obj/item/ammo_casing/magic/heal
@@ -25,7 +26,7 @@ obj/item/weapon/gun/magic/staff/healing
/obj/item/weapon/gun/magic/staff/healing/handle_suicide() //Stops people trying to commit suicide to heal themselves
return
-obj/item/weapon/gun/magic/staff/chaos
+/obj/item/weapon/gun/magic/staff/chaos
name = "staff of chaos"
desc = "An artefact that spits bolts of chaotic magic that can potentially do anything."
ammo_type = /obj/item/ammo_casing/magic/chaos
@@ -35,7 +36,7 @@ obj/item/weapon/gun/magic/staff/chaos
recharge_rate = 2
no_den_usage = 1
-obj/item/weapon/gun/magic/staff/door
+/obj/item/weapon/gun/magic/staff/door
name = "staff of door creation"
desc = "An artefact that spits bolts of transformative magic that can create doors in walls."
ammo_type = /obj/item/ammo_casing/magic/door
@@ -55,7 +56,7 @@ obj/item/weapon/gun/magic/staff/door
max_charges = 4
recharge_rate = 8
-obj/item/weapon/gun/magic/staff/focus
+/obj/item/weapon/gun/magic/staff/focus
name = "mental focus"
desc = "An artefact that channels the will of the user into destructive bolts of force. If you aren't careful with it, you might poke someone's brain out."
icon = 'icons/obj/wizard.dmi'
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index 03519770eee..961a7b91e05 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -136,7 +136,7 @@
return boolets
/obj/item/weapon/gun/projectile/suicide_act(mob/user)
- if (chambered && chambered.BB && !chambered.BB.nodamage)
+ if(chambered && chambered.BB && !chambered.BB.nodamage)
user.visible_message("[user] is putting the barrel of the [name] in \his mouth. It looks like \he's trying to commit suicide. ")
sleep(25)
if(user.l_hand == src || user.r_hand == src)
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index 7544ecc7b50..d0e7efcd26b 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -1,11 +1,11 @@
/obj/item/weapon/gun/projectile/automatic
- w_class = 3.0
+ w_class = 3
var/alarmed = 0
var/select = 1
can_suppress = 1
burst_size = 3
fire_delay = 2
- action_button_name = "Toggle Firemode"
+ actions_types = list(/datum/action/item_action/toggle_firemode)
/obj/item/weapon/gun/projectile/automatic/isHandgun()
return 0
@@ -44,7 +44,7 @@
/obj/item/weapon/gun/projectile/automatic/ui_action_click()
burst_select()
-/obj/item/weapon/gun/projectile/automatic/verb/burst_select()
+/obj/item/weapon/gun/projectile/automatic/proc/burst_select()
var/mob/living/carbon/human/user = usr
select = !select
if(!select)
@@ -58,6 +58,9 @@
playsound(user, 'sound/weapons/empty.ogg', 100, 1)
update_icon()
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
/obj/item/weapon/gun/projectile/automatic/can_shoot()
return get_ammo()
@@ -107,7 +110,7 @@
fire_delay = 2
can_suppress = 0
burst_size = 1
- action_button_name = null
+ actions_types = list()
/obj/item/weapon/gun/projectile/automatic/wt550/update_icon()
..()
@@ -129,7 +132,6 @@
origin_tech = "combat=5;materials=2;syndicate=8"
mag_type = /obj/item/ammo_box/magazine/m556
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
- action_button_name = "Toggle Grenade Launcher"
can_suppress = 0
var/obj/item/weapon/gun/projectile/revolver/grenadelauncher/underbarrel
burst_size = 3
@@ -220,14 +222,14 @@
desc = "A compact, mag-fed semi-automatic shotgun for combat in narrow corridors, nicknamed 'Bulldog' by boarding parties. Compatible only with specialized 8-round drum magazines."
icon_state = "bulldog"
item_state = "bulldog"
- w_class = 3.0
+ w_class = 3
origin_tech = "combat=5;materials=4;syndicate=6"
mag_type = /obj/item/ammo_box/magazine/m12g
fire_sound = 'sound/weapons/Gunshot4.ogg'
can_suppress = 0
burst_size = 1
fire_delay = 0
- action_button_name = null
+ actions_types = list()
/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/New()
..()
diff --git a/code/modules/projectiles/guns/projectile/launchers.dm b/code/modules/projectiles/guns/projectile/launchers.dm
index 635ab22cc8c..462341fdc36 100644
--- a/code/modules/projectiles/guns/projectile/launchers.dm
+++ b/code/modules/projectiles/guns/projectile/launchers.dm
@@ -6,7 +6,7 @@
name = "grenade launcher"
icon_state = "dshotgun-sawn"
item_state = "gun"
- mag_type = /obj/item/ammo_box/magazine/internal/cylinder/grenadelauncher
+ mag_type = /obj/item/ammo_box/magazine/internal/grenadelauncher
fire_sound = 'sound/weapons/grenadelaunch.ogg'
w_class = 3
@@ -39,7 +39,7 @@
mag_type = /obj/item/ammo_box/magazine/m75
burst_size = 1
fire_delay = 0
- action_button_name = null
+ actions_types = list()
/obj/item/weapon/gun/projectile/automatic/gyropistol/isHandgun()
return 1
@@ -65,7 +65,7 @@
burst_size = 1
fire_delay = 0
select = 0
- action_button_name = null
+ actions_types = list()
/obj/item/weapon/gun/projectile/automatic/speargun/update_icon()
return
diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm
index b2c0aa823be..d1d65dcbfc0 100644
--- a/code/modules/projectiles/guns/projectile/pistol.dm
+++ b/code/modules/projectiles/guns/projectile/pistol.dm
@@ -8,7 +8,7 @@
can_suppress = 1
burst_size = 1
fire_delay = 0
- action_button_name = null
+ actions_types = list()
/obj/item/weapon/gun/projectile/automatic/pistol/isHandgun()
return 1
@@ -26,6 +26,12 @@
mag_type = /obj/item/ammo_box/magazine/m45
can_suppress = 0
+/obj/item/weapon/gun/projectile/automatic/pistol/empty //empty stetchshit for maint spawns
+
+/obj/item/weapon/gun/projectile/automatic/pistol/empty/New()
+ magazine = new /obj/item/ammo_box/magazine/m10mm/empty(src)
+ ..()
+
/obj/item/weapon/gun/projectile/automatic/pistol/deagle
name = "desert eagle"
desc = "A robust .50 AE handgun."
@@ -58,4 +64,4 @@
can_suppress = 0
burst_size = 3
fire_delay = 2
- action_button_name = "Toggle Firemode"
+ actions_types = list(/datum/action/item_action/toggle_firemode)
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index 299ffbc9a6c..45849f584ef 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -41,7 +41,7 @@
/obj/item/weapon/gun/projectile/revolver/attack_self(mob/living/user)
var/num_unloaded = 0
chambered = null
- while (get_ammo() > 0)
+ while(get_ammo() > 0)
var/obj/item/ammo_casing/CB
CB = magazine.get_round(0)
if(CB)
@@ -49,7 +49,7 @@
CB.SpinAnimation(10, 1)
CB.update_icon()
num_unloaded++
- if (num_unloaded)
+ if(num_unloaded)
to_chat(user, "You unload [num_unloaded] shell\s from [src]. ")
else
to_chat(user, "[src] is empty! ")
@@ -68,6 +68,7 @@
var/obj/item/ammo_box/magazine/internal/cylinder/C = magazine
C.spin()
chamber_round(0)
+ playsound(loc, 'sound/weapons/revolver_spin.ogg', 50, 1)
usr.visible_message("[usr] spins [src]'s chamber.", "You spin [src]'s chamber. ")
else
verbs -= /obj/item/weapon/gun/projectile/revolver/verb/spin
@@ -77,9 +78,9 @@
/obj/item/weapon/gun/projectile/revolver/get_ammo(countchambered = 0, countempties = 1)
var/boolets = 0 //mature var names for mature people
- if (chambered && countchambered)
+ if(chambered && countchambered)
boolets++
- if (magazine)
+ if(magazine)
boolets += magazine.ammo_count(countempties)
return boolets
@@ -207,14 +208,14 @@
Spin()
else
var/num_unloaded = 0
- while (get_ammo() > 0)
+ while(get_ammo() > 0)
var/obj/item/ammo_casing/CB
CB = magazine.get_round()
chambered = null
CB.loc = get_turf(loc)
CB.update_icon()
num_unloaded++
- if (num_unloaded)
+ if(num_unloaded)
to_chat(user, "You unload [num_unloaded] shell\s from [src]. ")
else
to_chat(user, "[src] is empty. ")
@@ -306,14 +307,14 @@
/obj/item/weapon/gun/projectile/revolver/doublebarrel/attack_self(mob/living/user)
var/num_unloaded = 0
- while (get_ammo() > 0)
+ while(get_ammo() > 0)
var/obj/item/ammo_casing/CB
CB = magazine.get_round(0)
chambered = null
CB.loc = get_turf(loc)
CB.update_icon()
num_unloaded++
- if (num_unloaded)
+ if(num_unloaded)
to_chat(user, "You break open \the [src] and unload [num_unloaded] shell\s. ")
else
to_chat(user, "[src] is empty. ")
@@ -354,7 +355,7 @@
/obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised/update_icon()
..()
- if (slung && (slot_flags & SLOT_BELT) )
+ if(slung && (slot_flags & SLOT_BELT) )
slung = 0
icon_state = "ishotgun-sawn"
@@ -405,7 +406,7 @@
f_name = "a "
f_name += "blood-stained [name]!"
- to_chat(user, "\icon[src] That's [f_name]")
+ to_chat(user, "[bicon(src)] That's [f_name]")
if(desc)
to_chat(user, desc)
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index ddec7543009..35cde243c20 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -3,7 +3,7 @@
desc = "A traditional shotgun with wood furniture and a four-shell capacity underneath."
icon_state = "shotgun"
item_state = "shotgun"
- w_class = 4.0
+ w_class = 4
force = 10
flags = CONDUCT
slot_flags = SLOT_BACK
@@ -64,7 +64,7 @@
/obj/item/weapon/gun/projectile/shotgun/examine(mob/user)
..()
- if (chambered)
+ if(chambered)
to_chat(user, "A [chambered.BB ? "live" : "spent"] one is in the chamber.")
/obj/item/weapon/gun/projectile/shotgun/isHandgun() //You cannot, in fact, holster a shotgun.
@@ -189,7 +189,7 @@
/obj/item/weapon/gun/projectile/shotgun/automatic/dual_tube/New()
..()
- if (!alternate_magazine)
+ if(!alternate_magazine)
alternate_magazine = new mag_type(src)
/obj/item/weapon/gun/projectile/shotgun/automatic/dual_tube/attack_self(mob/living/user)
diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm
index 59bd7fb649b..cf7c2a4bb35 100644
--- a/code/modules/projectiles/guns/projectile/sniper.dm
+++ b/code/modules/projectiles/guns/projectile/sniper.dm
@@ -1,4 +1,4 @@
-/obj/item/weapon/gun/projectile/sniper_rifle
+/obj/item/weapon/gun/projectile/automatic/sniper_rifle
name = "sniper rifle"
desc = "the kind of gun that will leave you crying for mummy before you even realise your leg's missing"
icon_state = "sniper"
@@ -7,6 +7,7 @@
weapon_weight = WEAPON_MEDIUM
mag_type = /obj/item/ammo_box/magazine/sniper_rounds
fire_delay = 40
+ burst_size = 1
origin_tech = "combat=8"
can_unsuppress = 1
can_suppress = 1
@@ -14,14 +15,15 @@
zoomable = TRUE
zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you.
slot_flags = SLOT_BACK
+ actions_types = list()
-/obj/item/weapon/gun/projectile/sniper_rifle/update_icon()
+/obj/item/weapon/gun/projectile/automatic/sniper_rifle/update_icon()
if(magazine)
icon_state = "sniper-mag"
else
icon_state = "sniper"
-/obj/item/weapon/gun/projectile/sniper_rifle/syndicate
+/obj/item/weapon/gun/projectile/automatic/sniper_rifle/syndicate
name = "syndicate sniper rifle"
desc = "Syndicate flavoured sniper rifle, it packs quite a punch, a punch to your face"
origin_tech = "combat=8;syndicate=4"
diff --git a/code/modules/projectiles/guns/projectile/toy.dm b/code/modules/projectiles/guns/projectile/toy.dm
index c0465a83beb..4efeb570e0f 100644
--- a/code/modules/projectiles/guns/projectile/toy.dm
+++ b/code/modules/projectiles/guns/projectile/toy.dm
@@ -26,7 +26,7 @@
can_suppress = 0
burst_size = 1
fire_delay = 0
- action_button_name = null
+ actions_types = list()
/obj/item/weapon/gun/projectile/automatic/toy/pistol/update_icon()
..()
diff --git a/code/modules/projectiles/guns/rocket.dm b/code/modules/projectiles/guns/rocket.dm
index 72ab89bf40e..345d183318f 100644
--- a/code/modules/projectiles/guns/rocket.dm
+++ b/code/modules/projectiles/guns/rocket.dm
@@ -4,7 +4,7 @@
desc = "Say hello to my little friend"
icon_state = "rocket"
item_state = "rocket"
- w_class = 4.0
+ w_class = 4
throw_speed = 2
throw_range = 10
force = 5.0
diff --git a/code/modules/projectiles/guns/throw/crossbow.dm b/code/modules/projectiles/guns/throw/crossbow.dm
index 55e76bec6b7..11d39bf2a38 100644
--- a/code/modules/projectiles/guns/throw/crossbow.dm
+++ b/code/modules/projectiles/guns/throw/crossbow.dm
@@ -153,7 +153,7 @@
icon_state = "bolt"
item_state = "bolt"
throwforce = 20
- w_class = 3.0
+ w_class = 3
sharp = 1
edge = 0
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index d91fd3898f7..838f1acd90c 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -94,7 +94,7 @@
var/atom/T = target.loc
if(isturf(target) && target.density)
CreateDoor(target)
- else if (isturf(T) && T.density)
+ else if(isturf(T) && T.density)
CreateDoor(T)
else if(istype(target, /obj/machinery/door))
OpenDoor(target)
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 53527ef326e..6fc934cd87e 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -140,7 +140,7 @@
if(prob(15))
M.apply_effect((rand(30,80)),IRRADIATE)
M.Weaken(5)
- for (var/mob/V in viewers(src))
+ for(var/mob/V in viewers(src))
V.show_message("[M] writhes in pain as \his vacuoles boil. ", 3, "You hear the crunching of leaves. ", 2)
if(prob(35))
if(prob(80))
@@ -172,7 +172,7 @@
var/mob/living/carbon/human/H = M
if((H.species.flags & IS_PLANT) && (M.nutrition < 500))
M.nutrition += 30
- else if (istype(target, /mob/living/carbon/))
+ else if(istype(target, /mob/living/carbon/))
M.show_message("The radiation beam dissipates harmlessly through your body. ")
else
return 1
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index 9be9ea9c124..bce80d857b1 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -49,7 +49,7 @@ var/const/INGEST = 2
chemical_reactions_list[id] += D
break // Don't bother adding ourselves to other reagent ids, it is redundant.
-/datum/reagents/proc/remove_any(var/amount=1)
+/datum/reagents/proc/remove_any(amount=1)
var/total_transfered = 0
var/current_list_element = 1
@@ -91,18 +91,18 @@ var/const/INGEST = 2
return the_id
-/datum/reagents/proc/trans_to(var/target, var/amount=1, var/multiplier=1, var/preserve_data=1)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred.
- if (!target)
+/datum/reagents/proc/trans_to(target, amount=1, multiplier=1, preserve_data=1)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred.
+ if(!target)
return
if(src.total_volume <= 0)
return
var/datum/reagents/R
if(istype(target, /obj))
var/obj/O = target
- if (!O.reagents )
+ if(!O.reagents )
return
R = O.reagents
- else if (istype(target, /mob/living))
+ else if(istype(target, /mob/living))
var/mob/living/M = target
if(!M.reagents)
return
@@ -115,10 +115,10 @@ var/const/INGEST = 2
amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume)
var/part = amount / src.total_volume
var/trans_data = null
- for (var/datum/reagent/current_reagent in src.reagent_list)
- if (!current_reagent)
+ for(var/datum/reagent/current_reagent in src.reagent_list)
+ if(!current_reagent)
continue
- if (current_reagent.id == "blood" && ishuman(target))
+ if(current_reagent.id == "blood" && ishuman(target))
var/mob/living/carbon/human/H = target
H.inject_blood(my_atom, amount)
continue
@@ -135,7 +135,7 @@ var/const/INGEST = 2
src.handle_reactions()
return amount
-/datum/reagents/proc/copy_to(var/obj/target, var/amount=1, var/multiplier=1, var/preserve_data=1, var/safety = 0)
+/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1, safety = 0)
if(!target)
return
if(!target.reagents || src.total_volume<=0)
@@ -144,7 +144,7 @@ var/const/INGEST = 2
amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume)
var/part = amount / src.total_volume
var/trans_data = null
- for (var/datum/reagent/current_reagent in src.reagent_list)
+ for(var/datum/reagent/current_reagent in src.reagent_list)
var/current_reagent_transfer = current_reagent.volume * part
if(preserve_data)
trans_data = copy_data(current_reagent)
@@ -156,10 +156,10 @@ var/const/INGEST = 2
src.handle_reactions()
return amount
-/datum/reagents/proc/trans_id_to(var/obj/target, var/reagent, var/amount=1, var/preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N
- if (!target)
+/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N
+ if(!target)
return
- if (!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent))
+ if(!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent))
return
var/datum/reagents/R = target.reagents
@@ -167,7 +167,7 @@ var/const/INGEST = 2
amount = src.get_reagent_amount(reagent)
amount = min(amount, R.maximum_volume-R.total_volume)
var/trans_data = null
- for (var/datum/reagent/current_reagent in src.reagent_list)
+ for(var/datum/reagent/current_reagent in src.reagent_list)
if(current_reagent.id == reagent)
if(preserve_data)
trans_data = copy_data(current_reagent)
@@ -182,7 +182,7 @@ var/const/INGEST = 2
return amount
/*
- if (!target) return
+ if(!target) return
var/total_transfered = 0
var/current_list_element = 1
var/datum/reagents/R = target.reagents
@@ -214,12 +214,12 @@ var/const/INGEST = 2
*/
-/datum/reagents/proc/conditional_update_move(var/atom/A, var/Running = 0)
+/datum/reagents/proc/conditional_update_move(atom/A, Running = 0)
for(var/datum/reagent/R in reagent_list)
R.on_move (A, Running)
update_total()
-/datum/reagents/proc/conditional_update(var/atom/A, )
+/datum/reagents/proc/conditional_update(atom/A, )
for(var/datum/reagent/R in reagent_list)
R.on_update (A)
update_total()
@@ -302,14 +302,14 @@ var/const/INGEST = 2
var/list/seen = viewers(4, get_turf(my_atom))
for(var/mob/M in seen)
if(!C.no_message)
- to_chat(M, "\blue \icon[my_atom] [C.mix_message]")
+ to_chat(M, "\blue [bicon(my_atom)] [C.mix_message]")
if(istype(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, "\blue \icon[my_atom] The [my_atom]'s power is consumed in the reaction.")
+ to_chat(M, "\blue [bicon(my_atom)] The [my_atom]'s power is consumed in the reaction.")
ME2.name = "used slime extract"
ME2.desc = "This extract has been used up."
@@ -323,17 +323,17 @@ var/const/INGEST = 2
update_total()
return 0
-/datum/reagents/proc/isolate_reagent(var/reagent)
+/datum/reagents/proc/isolate_reagent(reagent)
for(var/A in reagent_list)
var/datum/reagent/R = A
- if (R.id != reagent)
+ if(R.id != reagent)
del_reagent(R.id)
update_total()
-/datum/reagents/proc/del_reagent(var/reagent)
+/datum/reagents/proc/del_reagent(reagent)
for(var/A in reagent_list)
var/datum/reagent/R = A
- if (R.id == reagent)
+ if(R.id == reagent)
if(istype(my_atom, /mob/living))
var/mob/living/M = my_atom
R.reagent_deleted(M)
@@ -341,8 +341,6 @@ var/const/INGEST = 2
qdel(A)
update_total()
my_atom.on_reagent_change()
- check_gofast(my_atom)
- check_goreallyfast(my_atom)
return 0
@@ -363,7 +361,7 @@ var/const/INGEST = 2
del_reagent(R.id)
return 0
-/datum/reagents/proc/reaction_check(var/mob/M, var/datum/reagent/R)
+/datum/reagents/proc/reaction_check(mob/M, datum/reagent/R)
var/can_process = 0
if(!istype(M, /mob/living)) //Non-living mobs can't metabolize reagents, so don't bother trying (runtime safety check)
return can_process
@@ -436,7 +434,7 @@ var/const/INGEST = 2
var/amt = list_reagents[r_id]
add_reagent(r_id, amt, data)
-/datum/reagents/proc/add_reagent(var/reagent, var/amount, var/list/data=null, var/reagtemp = 300)
+/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300)
if(!isnum(amount)) return 1
update_total()
if(total_volume + amount > maximum_volume) amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen.
@@ -446,7 +444,7 @@ var/const/INGEST = 2
for(var/A in reagent_list)
var/datum/reagent/R = A
- if (R.id == reagent)
+ if(R.id == reagent)
R.volume += amount
update_total()
my_atom.on_reagent_change()
@@ -476,13 +474,13 @@ var/const/INGEST = 2
return 1
-/datum/reagents/proc/remove_reagent(var/reagent, var/amount, var/safety)//Added a safety check for the trans_id_to
+/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to
if(!isnum(amount)) return 1
for(var/A in reagent_list)
var/datum/reagent/R = A
- if (R.id == reagent)
+ if(R.id == reagent)
R.volume -= amount
update_total()
if(!safety)//So it does not handle reactions when it need not to
@@ -492,11 +490,11 @@ var/const/INGEST = 2
return 1
-/datum/reagents/proc/has_reagent(var/reagent, var/amount = -1)
+/datum/reagents/proc/has_reagent(reagent, amount = -1)
for(var/A in reagent_list)
var/datum/reagent/R = A
- if (R.id == reagent)
+ if(R.id == reagent)
if(!amount) return R
else
if(R.volume >= amount) return R
@@ -504,10 +502,10 @@ var/const/INGEST = 2
return 0
-/datum/reagents/proc/get_reagent_amount(var/reagent)
+/datum/reagents/proc/get_reagent_amount(reagent)
for(var/A in reagent_list)
var/datum/reagent/R = A
- if (R.id == reagent)
+ if(R.id == reagent)
return R.volume
return 0
@@ -515,12 +513,15 @@ var/const/INGEST = 2
/datum/reagents/proc/get_reagents()
var/res = ""
for(var/datum/reagent/A in reagent_list)
- if (res != "") res += ","
+ if(res != "") res += ","
res += A.name
return res
-/datum/reagents/proc/remove_all_type(var/reagent_type, var/amount, var/strict = 0, var/safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included.
+/datum/reagents/proc/get_reagent(type)
+ . = locate(type) in reagent_list
+
+/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included.
if(!isnum(amount)) return 1
var/has_removed_reagent = 0
@@ -542,7 +543,7 @@ var/const/INGEST = 2
return has_removed_reagent
// Admin logging.
-/datum/reagents/proc/get_reagent_ids(var/and_amount=0)
+/datum/reagents/proc/get_reagent_ids(and_amount=0)
var/list/stuff = list()
for(var/datum/reagent/A in reagent_list)
if(and_amount)
@@ -552,21 +553,21 @@ var/const/INGEST = 2
return english_list(stuff)
//two helper functions to preserve data across reactions (needed for xenoarch)
-/datum/reagents/proc/get_data(var/reagent_id)
+/datum/reagents/proc/get_data(reagent_id)
for(var/datum/reagent/D in reagent_list)
if(D.id == reagent_id)
// to_chat(world, "proffering a data-carrying reagent ([reagent_id])")
return D.data
-/datum/reagents/proc/set_data(var/reagent_id, var/new_data)
+/datum/reagents/proc/set_data(reagent_id, new_data)
for(var/datum/reagent/D in reagent_list)
if(D.id == reagent_id)
// to_chat(world, "reagent data set ([reagent_id])")
D.data = new_data
-/datum/reagents/proc/copy_data(var/datum/reagent/current_reagent)
- if (!current_reagent || !current_reagent.data) return null
- if (!istype(current_reagent.data, /list)) return current_reagent.data
+/datum/reagents/proc/copy_data(datum/reagent/current_reagent)
+ if(!current_reagent || !current_reagent.data) return null
+ if(!istype(current_reagent.data, /list)) return current_reagent.data
var/list/trans_data = current_reagent.data.Copy()
@@ -588,11 +589,11 @@ var/const/INGEST = 2
// Convenience proc to create a reagents holder for an atom
// Max vol is maximum volume of holder
-atom/proc/create_reagents(var/max_vol)
+atom/proc/create_reagents(max_vol)
reagents = new/datum/reagents(max_vol)
reagents.my_atom = src
-/datum/reagents/proc/get_reagent_from_id(var/id)
+/datum/reagents/proc/get_reagent_from_id(id)
var/datum/reagent/result = null
for(var/datum/reagent/R in reagent_list)
if(R.id == id)
@@ -608,4 +609,4 @@ atom/proc/create_reagents(var/max_vol)
reagent_list.Cut()
reagent_list = null
if(my_atom && my_atom.reagents == src)
- my_atom.reagents = null
\ No newline at end of file
+ my_atom.reagents = null
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 68bcd9306d3..197df4425ec 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -19,7 +19,7 @@
var/hackedcheck = 0
var/list/dispensable_reagents = list("hydrogen", "lithium", "carbon", "nitrogen", "oxygen", "fluorine",
"sodium", "aluminum", "silicon", "phosphorus", "sulfur", "chlorine", "potassium", "iron",
- "copper", "mercury", "plasma", "radium", "water", "ethanol", "sugar", "tungsten", "iodine", "bromine", "silver")
+ "copper", "mercury", "plasma", "radium", "water", "ethanol", "sugar", "iodine", "bromine", "silver")
var/list/hacked_reagents = list("toxin")
var/hack_message = "You disable the safety safeguards, enabling the \"Mad Scientist\" mode."
var/unhack_message = "You re-enable the safety safeguards, enabling the \"NT Standard\" mode."
@@ -89,12 +89,12 @@
qdel(src)
return
if(2.0)
- if (prob(50))
+ if(prob(50))
qdel(src)
return
/obj/machinery/chem_dispenser/blob_act()
- if (prob(50))
+ if(prob(50))
qdel(src)
/**
@@ -108,7 +108,7 @@
* @return nothing
*/
-/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main",var/datum/nanoui/ui = null, var/force_open = 1)
+/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
if(broken_requirements.len)
to_chat(user, "[src] is broken. [broken_requirements[broken_requirements[1]]] ")
return
@@ -129,7 +129,7 @@
beakerCurrentVolume += R.volume
data["beakerContents"] = beakerContents
- if (beaker)
+ if(beaker)
data["beakerCurrentVolume"] = beakerCurrentVolume
data["beakerMaxVolume"] = beaker.volume
else
@@ -137,7 +137,7 @@
data["beakerMaxVolume"] = null
var chemicals[0]
- for (var/re in dispensable_reagents)
+ for(var/re in dispensable_reagents)
var/datum/reagent/temp = chemical_reagents_list[re]
if(temp)
chemicals.Add(list(list("title" = temp.name, "id" = temp.id, "commands" = list("dispense" = temp.id)))) // list in a list because Byond merges the first list...
@@ -145,7 +145,7 @@
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "chem_dispenser.tmpl", ui_title, 390, 655)
@@ -160,13 +160,13 @@
if(href_list["amount"])
amount = round(text2num(href_list["amount"]), 5) // round to nearest 5
- if (amount < 0) // Since the user can actually type the commands himself, some sanity checking
+ if(amount < 0) // Since the user can actually type the commands himself, some sanity checking
amount = 0
- if (amount > 100)
+ if(amount > 100)
amount = 100
if(href_list["dispense"])
- if (dispensable_reagents.Find(href_list["dispense"]) && beaker != null)
+ if(dispensable_reagents.Find(href_list["dispense"]) && beaker != null)
var/obj/item/weapon/reagent_containers/glass/B = src.beaker
var/datum/reagents/R = B.reagents
var/space = R.maximum_volume - R.total_volume
@@ -197,7 +197,7 @@
add_fingerprint(usr)
return 1 // update UIs attached to this object
-/obj/machinery/chem_dispenser/attackby(var/obj/item/weapon/reagent_containers/B as obj, var/mob/user as mob, params)
+/obj/machinery/chem_dispenser/attackby(obj/item/weapon/reagent_containers/B, mob/user, params)
if(isrobot(user))
return
@@ -232,7 +232,7 @@
overlays += icon_beaker
return
-/obj/machinery/chem_dispenser/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob, params)
+/obj/machinery/chem_dispenser/attackby(obj/item/weapon/B, mob/user, params)
..()
if(istype(B, /obj/item/device/multitool))
if(hackedcheck == 0)
@@ -247,13 +247,13 @@
hackedcheck = 0
return
-/obj/machinery/chem_dispenser/attack_ai(mob/user as mob)
+/obj/machinery/chem_dispenser/attack_ai(mob/user)
return src.attack_hand(user)
-/obj/machinery/chem_dispenser/attack_ghost(mob/user as mob)
+/obj/machinery/chem_dispenser/attack_ghost(mob/user)
return src.attack_hand(user)
-/obj/machinery/chem_dispenser/attack_hand(mob/user as mob)
+/obj/machinery/chem_dispenser/attack_hand(mob/user)
if(stat & BROKEN)
return
@@ -280,7 +280,7 @@
energy = 100
max_energy = 100
desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one."
- dispensable_reagents = list("ice", "cream", "cider", "beer", "kahlua", "whiskey", "wine", "vodka", "gin", "rum", "tequilla", "vermouth", "cognac", "ale", "mead", "synthanol")
+ dispensable_reagents = list("ice", "cream", "cider", "beer", "kahlua", "whiskey", "wine", "vodka", "gin", "rum", "tequila", "vermouth", "cognac", "ale", "mead", "synthanol")
hack_message = "You disable the 'nanotrasen-are-cheap-bastards' lock, enabling hidden and very expensive boozes."
unhack_message = "You re-enable the 'nanotrasen-are-cheap-bastards' lock, disabling hidden and very expensive boozes."
hacked_reagents = list("goldschlager", "patron", "absinthe", "ethanol", "nothing")
@@ -297,7 +297,7 @@
amount = 5
recharge_delay = 10
dispensable_reagents = list()
- var/list/special_reagents = list(list("hydrogen", "oxygen", "silicon", "phosphorus", "sulfur", "carbon", "nitrogen", "tungsten", "water"),
+ var/list/special_reagents = list(list("hydrogen", "oxygen", "silicon", "phosphorus", "sulfur", "carbon", "nitrogen", "water"),
list("lithium", "sugar", "copper", "mercury", "sodium","iodine","bromine"),
list("ethanol", "chlorine", "potassium", "aluminum","plasma", "radium", "fluorine", "iron", "silver"),
list("oil", "ash", "acetone", "saltpetre", "ammonia", "diethylamine", "fuel"))
@@ -343,7 +343,7 @@
for(i=1, i<=M.rating, i++)
dispensable_reagents = sortList(dispensable_reagents | special_reagents[i])
-/obj/machinery/chem_dispenser/constructable/attackby(var/obj/item/I, var/mob/user, params)
+/obj/machinery/chem_dispenser/constructable/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/reagent_containers/glass))
if(panel_open)
to_chat(user, "Close the maintenance panel first. ")
@@ -411,12 +411,12 @@
qdel(src)
return
if(2.0)
- if (prob(50))
+ if(prob(50))
qdel(src)
return
/obj/machinery/chem_master/blob_act()
- if (prob(50))
+ if(prob(50))
qdel(src)
/obj/machinery/chem_master/power_change()
@@ -426,7 +426,7 @@
spawn(rand(0, 15))
stat |= NOPOWER
-/obj/machinery/chem_master/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob, params)
+/obj/machinery/chem_master/attackby(obj/item/weapon/B, mob/user, params)
if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B, /obj/item/weapon/reagent_containers/food/drinks/drinkingglass))
@@ -439,7 +439,7 @@
src.beaker = B
B.forceMove(src)
to_chat(user, "You add the beaker to the machine! ")
- src.updateUsrDialog()
+ nanomanager.update_uis(src)
icon_state = "mixer1"
else if(istype(B, /obj/item/weapon/storage/pill_bottle))
@@ -454,7 +454,7 @@
src.loaded_pill_bottle = B
B.forceMove(src)
to_chat(user, "You add the pill bottle into the dispenser slot! ")
- src.updateUsrDialog()
+ nanomanager.update_uis(src)
return
/obj/machinery/chem_master/Topic(href, href_list)
@@ -465,7 +465,7 @@
usr.set_machine(src)
- if (href_list["ejectp"])
+ if(href_list["ejectp"])
if(loaded_pill_bottle)
loaded_pill_bottle.forceMove(src.loc)
loaded_pill_bottle = null
@@ -475,8 +475,8 @@
usr.unset_machine()
return
- if (href_list["print_p"])
- if (!(src.printing))
+ if(href_list["print_p"])
+ if(!(src.printing))
src.printing = 1
for(var/mob/O in viewers(usr))
O.show_message("\blue \the [src] rattles and prints out a sheet of paper.", 1)
@@ -503,7 +503,7 @@
if(beaker)
var/datum/reagents/R = beaker.reagents
- if (href_list["analyze"])
+ if(href_list["analyze"])
var/dat = ""
if(!condi)
if(href_list["name"] == "Blood")
@@ -525,21 +525,21 @@
usr << browse(dat, "window=chem_master;size=575x400")
return
- else if (href_list["add"])
+ else if(href_list["add"])
if(href_list["amount"])
var/id = href_list["add"]
var/amount = text2num(href_list["amount"])
R.trans_id_to(src, id, amount)
- else if (href_list["addcustom"])
+ else if(href_list["addcustom"])
var/id = href_list["addcustom"]
useramount = input("Select the amount to transfer.", 30, useramount) as num
useramount = isgoodnumber(useramount)
src.Topic(null, list("amount" = "[useramount]", "add" = "[id]"))
- else if (href_list["remove"])
+ else if(href_list["remove"])
if(href_list["amount"])
var/id = href_list["remove"]
@@ -550,42 +550,42 @@
reagents.remove_reagent(id, amount)
- else if (href_list["removecustom"])
+ else if(href_list["removecustom"])
var/id = href_list["removecustom"]
useramount = input("Select the amount to transfer.", 30, useramount) as num
useramount = isgoodnumber(useramount)
src.Topic(null, list("amount" = "[useramount]", "remove" = "[id]"))
- else if (href_list["toggle"])
+ else if(href_list["toggle"])
mode = !mode
- else if (href_list["main"])
+ else if(href_list["main"])
attack_hand(usr)
return
- else if (href_list["eject"])
+ else if(href_list["eject"])
if(beaker)
beaker.forceMove(get_turf(src))
beaker = null
reagents.clear_reagents()
icon_state = "mixer0"
- else if (href_list["createpill"] || href_list["createpill_multiple"])
+ else if(href_list["createpill"] || href_list["createpill_multiple"])
if(!condi)
var/count = 1
- if (href_list["createpill_multiple"])
+ if(href_list["createpill_multiple"])
count = input("Select the number of pills to make.", 10, pillamount) as num|null
if(count == null)
return
count = isgoodnumber(count)
- if (count > 20) count = 20 //Pevent people from creating huge stacks of pills easily. Maybe move the number to defines?
- if (count <= 0) return
+ if(count > 20) count = 20 //Pevent people from creating huge stacks of pills easily. Maybe move the number to defines?
+ if(count <= 0) return
var/amount_per_pill = reagents.total_volume/count
- if (amount_per_pill > 50) amount_per_pill = 50
+ if(amount_per_pill > 50) amount_per_pill = 50
var/name = input(usr,"Name:","Name your pill!","[reagents.get_master_reagent_name()] ([amount_per_pill]u)") as text|null
if(!name)
return
name = reject_bad_text(name)
- while (count--)
+ while(count--)
var/obj/item/weapon/reagent_containers/food/pill/P = new/obj/item/weapon/reagent_containers/food/pill(src.loc)
if(!name) name = reagents.get_master_reagent_name()
P.name = "[name] pill"
@@ -608,31 +608,35 @@
P.name = "[name] pack"
P.desc = "A small condiment pack. The label says it contains [name]."
reagents.trans_to(P,10)
- else if (href_list["createpatch"] || href_list["createpatch_multiple"])
+ else if(href_list["createpatch"] || href_list["createpatch_multiple"])
if(!condi)
var/count = 1
- if (href_list["createpatch_multiple"])
+ if(href_list["createpatch_multiple"])
count = input("Select the number of patches to make.", 10, patchamount) as num|null
if(count == null)
return
count = isgoodnumber(count)
if(!count || count <= 0)
return
- if (count > 20) count = 20 //Pevent people from creating huge stacks of patches easily. Maybe move the number to defines?
+ if(count > 20) count = 20 //Pevent people from creating huge stacks of patches easily. Maybe move the number to defines?
var/amount_per_patch = reagents.total_volume/count
- if (amount_per_patch > 40) amount_per_patch = 40
+ if(amount_per_patch > 40) amount_per_patch = 40
var/name = input(usr,"Name:","Name your patch!","[reagents.get_master_reagent_name()] ([amount_per_patch]u)") as text|null
if(!name)
return
name = reject_bad_text(name)
- while (count--)
+ var/is_medical_patch = chemical_safety_check(reagents)
+ while(count--)
var/obj/item/weapon/reagent_containers/food/pill/patch/P = new/obj/item/weapon/reagent_containers/food/pill/patch(src.loc)
if(!name) name = reagents.get_master_reagent_name()
P.name = "[name] patch"
P.pixel_x = rand(-7, 7) //random position
P.pixel_y = rand(-7, 7)
reagents.trans_to(P,amount_per_patch)
- else if (href_list["createbottle"])
+ if(is_medical_patch)
+ P.instant_application = 1
+ P.icon_state = "bandaid_med"
+ else if(href_list["createbottle"])
if(!condi)
var/name = input(usr,"Name:","Name your bottle!",reagents.get_master_reagent_name()) as text|null
if(!name)
@@ -651,101 +655,89 @@
else if(href_list["change_pill"])
#define MAX_PILL_SPRITE 20 //max icon state of the pill sprites
var/dat = ""
+ var/j = 0
for(var/i = 1 to MAX_PILL_SPRITE)
- dat += " "
+ j++
+ if(j == 1)
+ dat += ""
+ dat += " "
+ if(j == 5)
+ dat += " "
+ j = 0
dat += "
"
- usr << browse(dat, "window=chem_master")
+ usr << browse(dat, "window=chem_master_iconsel;size=225x193")
return
else if(href_list["change_bottle"])
#define MAX_BOTTLE_SPRITE 20 //max icon state of the bottle sprites
var/dat = ""
+ var/j = 0
for(var/i = 1 to MAX_BOTTLE_SPRITE)
- dat += " "
+ j++
+ if(j == 1)
+ dat += ""
+ dat += " "
+ if(j == 5)
+ dat += " "
+ j = 0
dat += "
"
- usr << browse(dat, "window=chem_master")
+ usr << browse(dat, "window=chem_master_iconsel;size=225x193")
return
else if(href_list["pill_sprite"])
pillsprite = href_list["pill_sprite"]
+ usr << browse(null, "window=chem_master_iconsel")
else if(href_list["bottle_sprite"])
bottlesprite = href_list["bottle_sprite"]
+ usr << browse(null, "window=chem_master_iconsel")
- src.updateUsrDialog()
+ nanomanager.update_uis(src)
return
-/obj/machinery/chem_master/attack_ai(mob/user as mob)
+/obj/machinery/chem_master/attack_ai(mob/user)
return src.attack_hand(user)
-/obj/machinery/chem_master/attack_ghost(mob/user as mob)
+/obj/machinery/chem_master/attack_ghost(mob/user)
return src.attack_hand(user)
-/obj/machinery/chem_master/attack_hand(mob/user as mob)
- if(stat & BROKEN)
- return
- user.set_machine(src)
- if(!(user.client in has_sprites))
- spawn()
- has_sprites += user.client
- for(var/i = 1 to MAX_PILL_SPRITE)
- usr << browse_rsc(icon('icons/obj/chemical.dmi', "pill" + num2text(i)), "pill[i].png")
- for(var/i = 1 to MAX_BOTTLE_SPRITE)
- usr << browse_rsc(icon('icons/obj/chemical.dmi', "bottle" + num2text(i)), "bottle[i].png")
- var/dat = ""
- if(!beaker)
- dat = "Please insert beaker. "
- if(src.loaded_pill_bottle)
- dat += "Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.storage_slots]\] "
- else
- dat += "No pill bottle inserted. "
- dat += "Close "
- else
- var/datum/reagents/R = beaker.reagents
- dat += "Eject beaker and Clear Buffer "
- if(src.loaded_pill_bottle)
- dat += "Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.storage_slots]\] "
- else
- dat += "No pill bottle inserted. "
- if(!R.total_volume)
- dat += "Beaker is empty."
- else
- dat += "Add to buffer: "
- for(var/datum/reagent/G in R.reagent_list)
- dat += "[G.name] , [G.volume] Units - "
- dat += "(Analyze) "
- dat += "(1) "
- dat += "(5) "
- dat += "(10) "
- dat += "(All) "
- dat += "(Custom) "
-
- dat += " Transfer to [(!mode ? "disposal" : "beaker")]: "
- if(reagents.total_volume)
- for(var/datum/reagent/N in reagents.reagent_list)
- dat += "[N.name] , [N.volume] Units - "
- dat += "(Analyze) "
- dat += "(1) "
- dat += "(5) "
- dat += "(10) "
- dat += "(All) "
- dat += "(Custom) "
- else
- dat += "Empty "
- if(!condi)
- dat += "Create pill (50 units max) "
- dat += "Create multiple pills "
- dat += "Create patch (40 units max) "
- dat += "Create multiple patches "
- dat += "Create bottle (30 units max) "
- else
- dat += "Create pack (10 units max) "
- dat += "Create bottle (50 units max) "
- if(!condi)
- user << browse("Chemmaster 3000 Chemmaster menu: [dat]", "window=chem_master;size=575x400")
- else
- user << browse("Condimaster 3000 Condimaster menu: [dat]", "window=chem_master;size=575x400")
- onclose(user, "chem_master")
+/obj/machinery/chem_master/attack_hand(mob/user)
+ if(..())
+ return 1
+ ui_interact(user)
return
-/obj/machinery/chem_master/proc/isgoodnumber(var/num)
+/obj/machinery/chem_master/ui_interact(mob/user, ui_key="main", datum/nanoui/ui = null, force_open = 1)
+
+ var/datum/asset/chem_master/assets = get_asset_datum(/datum/asset/chem_master)
+ assets.send(user)
+
+ var/data = list()
+
+ data["condi"] = condi
+ data["loaded_pill_bottle"] = (loaded_pill_bottle ? 1 : 0)
+ if(loaded_pill_bottle)
+ data["loaded_pill_bottle_contents_len"] = loaded_pill_bottle.contents.len
+ data["loaded_pill_bottle_storage_slots"] = loaded_pill_bottle.storage_slots
+
+ data["beaker"] = (beaker ? 1 : 0)
+ if(beaker)
+ var/list/beaker_reagents_list = list()
+ data["beaker_reagents"] = beaker_reagents_list
+ for(var/datum/reagent/R in beaker.reagents.reagent_list)
+ beaker_reagents_list[++beaker_reagents_list.len] = list("name" = R.name, "volume" = R.volume, "id" = R.id, "description" = R.description)
+ var/list/buffer_reagents_list = list()
+ data["buffer_reagents"] = buffer_reagents_list
+ for(var/datum/reagent/R in reagents.reagent_list)
+ buffer_reagents_list[++buffer_reagents_list.len] = list("name" = R.name, "volume" = R.volume, "id" = R.id, "description" = R.description)
+
+ data["pillsprite"] = pillsprite
+ data["mode"] = mode
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "chem_master.tmpl", src.name, 575, 400)
+ ui.set_initial_data(data)
+ ui.open()
+
+/obj/machinery/chem_master/proc/isgoodnumber(num)
if(isnum(num))
if(num > 200)
num = 200
@@ -757,6 +749,12 @@
else
return 0
+/obj/machinery/chem_master/proc/chemical_safety_check(datum/reagents/R)
+ var/all_safe = 1
+ for(var/datum/reagent/A in R.reagent_list)
+ if(!safe_chem_list.Find(A.id))
+ all_safe = 0
+ return all_safe
/obj/machinery/chem_master/condimaster
name = "\improper CondiMaster 3000"
@@ -876,13 +874,13 @@
icon_state = "juicer"+num2text(!isnull(beaker))
return
-/obj/machinery/reagentgrinder/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
+/obj/machinery/reagentgrinder/attackby(obj/item/O, mob/user, params)
- if (istype(O,/obj/item/weapon/reagent_containers/glass) || \
+ if(istype(O,/obj/item/weapon/reagent_containers/glass) || \
istype(O,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass) || \
istype(O,/obj/item/weapon/reagent_containers/food/drinks/shaker))
- if (beaker)
+ if(beaker)
return 1
else
if(!user.drop_item())
@@ -901,7 +899,7 @@
//Fill machine with the plantbag!
if(istype(O, /obj/item/weapon/storage/bag/plants))
- for (var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents)
+ for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents)
O.contents -= G
G.forceMove(src)
holdingitems += G
@@ -916,7 +914,7 @@
return 0
- if (!is_type_in_list(O, blend_items) && !is_type_in_list(O, juice_items))
+ if(!is_type_in_list(O, blend_items) && !is_type_in_list(O, juice_items))
to_chat(user, "Cannot refine into a reagent. ")
return 1
@@ -926,14 +924,14 @@
src.updateUsrDialog()
return 0
-/obj/machinery/reagentgrinder/attack_ai(mob/user as mob)
+/obj/machinery/reagentgrinder/attack_ai(mob/user)
return 0
-/obj/machinery/reagentgrinder/attack_hand(mob/user as mob)
+/obj/machinery/reagentgrinder/attack_hand(mob/user)
user.set_machine(src)
interact(user)
-/obj/machinery/reagentgrinder/interact(mob/user as mob) // The microwave Menu
+/obj/machinery/reagentgrinder/interact(mob/user) // The microwave Menu
var/is_chamber_empty = 0
var/is_beaker_ready = 0
var/processing_chamber = ""
@@ -941,13 +939,13 @@
var/dat = ""
if(!inuse)
- for (var/obj/item/O in holdingitems)
+ for(var/obj/item/O in holdingitems)
processing_chamber += "\A [O.name] "
- if (!processing_chamber)
+ if(!processing_chamber)
is_chamber_empty = 1
processing_chamber = "Nothing."
- if (!beaker)
+ if(!beaker)
beaker_contents = "No beaker attached. "
else
is_beaker_ready = 1
@@ -965,12 +963,12 @@
[processing_chamber]
[beaker_contents]
"}
- if (is_beaker_ready && !is_chamber_empty && !(stat & (NOPOWER|BROKEN)))
+ if(is_beaker_ready && !is_chamber_empty && !(stat & (NOPOWER|BROKEN)))
dat += "Grind the reagents "
dat += "Juice the reagents "
if(holdingitems && holdingitems.len > 0)
dat += "Eject the reagents "
- if (beaker)
+ if(beaker)
dat += "Detach the beaker "
else
dat += "Please wait..."
@@ -983,22 +981,22 @@
return
usr.set_machine(src)
switch(href_list["action"])
- if ("grind")
+ if("grind")
grind()
if("juice")
juice()
if("eject")
eject()
- if ("detach")
+ if("detach")
detach()
src.updateUsrDialog()
return
/obj/machinery/reagentgrinder/proc/detach()
- if (usr.stat != 0)
+ if(usr.stat != 0)
return
- if (!beaker)
+ if(!beaker)
return
beaker.forceMove(src.loc)
beaker = null
@@ -1006,9 +1004,9 @@
/obj/machinery/reagentgrinder/proc/eject()
- if (usr.stat != 0)
+ if(usr.stat != 0)
return
- if (holdingitems && holdingitems.len == 0)
+ if(holdingitems && holdingitems.len == 0)
return
for(var/obj/item/O in holdingitems)
@@ -1016,54 +1014,54 @@
holdingitems -= O
holdingitems = list()
-/obj/machinery/reagentgrinder/proc/is_allowed(var/obj/item/weapon/reagent_containers/O)
- for (var/i in blend_items)
+/obj/machinery/reagentgrinder/proc/is_allowed(obj/item/weapon/reagent_containers/O)
+ for(var/i in blend_items)
if(istype(O, i))
return 1
return 0
-/obj/machinery/reagentgrinder/proc/get_allowed_by_id(var/obj/item/weapon/grown/O)
- for (var/i in blend_items)
- if (istype(O, i))
- return blend_items[i]
-
-/obj/machinery/reagentgrinder/proc/get_allowed_snack_by_id(var/obj/item/weapon/reagent_containers/food/snacks/O)
+/obj/machinery/reagentgrinder/proc/get_allowed_by_id(obj/item/weapon/grown/O)
for(var/i in blend_items)
if(istype(O, i))
return blend_items[i]
-/obj/machinery/reagentgrinder/proc/get_allowed_juice_by_id(var/obj/item/weapon/reagent_containers/food/snacks/O)
+/obj/machinery/reagentgrinder/proc/get_allowed_snack_by_id(obj/item/weapon/reagent_containers/food/snacks/O)
+ for(var/i in blend_items)
+ if(istype(O, i))
+ return blend_items[i]
+
+/obj/machinery/reagentgrinder/proc/get_allowed_juice_by_id(obj/item/weapon/reagent_containers/food/snacks/O)
for(var/i in juice_items)
if(istype(O, i))
return juice_items[i]
-/obj/machinery/reagentgrinder/proc/get_allowed_snack_by_tag(var/obj/item/weapon/reagent_containers/food/snacks/grown/O)
+/obj/machinery/reagentgrinder/proc/get_allowed_snack_by_tag(obj/item/weapon/reagent_containers/food/snacks/grown/O)
for(var/i in blend_tags)
if(O.seed.kitchen_tag == i)
return blend_tags[i]
-/obj/machinery/reagentgrinder/proc/get_allowed_juice_by_tag(var/obj/item/weapon/reagent_containers/food/snacks/grown/O)
+/obj/machinery/reagentgrinder/proc/get_allowed_juice_by_tag(obj/item/weapon/reagent_containers/food/snacks/grown/O)
for(var/i in juice_tags)
if(O.seed.kitchen_tag == i)
return juice_tags[i]
-/obj/machinery/reagentgrinder/proc/get_grownweapon_amount(var/obj/item/weapon/grown/O)
- if (!istype(O))
+/obj/machinery/reagentgrinder/proc/get_grownweapon_amount(obj/item/weapon/grown/O)
+ if(!istype(O))
return 5
- else if (O.potency == -1)
+ else if(O.potency == -1)
return 5
else
return round(O.potency)
-/obj/machinery/reagentgrinder/proc/get_juice_amount(var/obj/item/weapon/reagent_containers/food/snacks/grown/O)
- if (!istype(O))
+/obj/machinery/reagentgrinder/proc/get_juice_amount(obj/item/weapon/reagent_containers/food/snacks/grown/O)
+ if(!istype(O))
return 5
- else if (O.potency == -1)
+ else if(O.potency == -1)
return 5
else
return round(5*sqrt(O.potency))
-/obj/machinery/reagentgrinder/proc/remove_object(var/obj/item/O)
+/obj/machinery/reagentgrinder/proc/remove_object(obj/item/O)
holdingitems -= O
qdel(O)
@@ -1071,7 +1069,7 @@
power_change()
if(stat & (NOPOWER|BROKEN))
return
- if (!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
+ if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
return
playsound(src.loc, 'sound/machines/juicer.ogg', 20, 1)
var/offset = prob(50) ? -2 : 2
@@ -1082,8 +1080,8 @@
inuse = 0
interact(usr)
//Snacks
- for (var/obj/item/weapon/reagent_containers/food/snacks/O in holdingitems)
- if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ for(var/obj/item/weapon/reagent_containers/food/snacks/O in holdingitems)
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
var/allowed = null
@@ -1094,14 +1092,14 @@
if(isnull(allowed))
break
- for (var/r_id in allowed)
+ for(var/r_id in allowed)
var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
var/amount = get_juice_amount(O)
beaker.reagents.add_reagent(r_id, min(amount, space))
- if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
remove_object(O)
@@ -1111,7 +1109,7 @@
power_change()
if(stat & (NOPOWER|BROKEN))
return
- if (!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
+ if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
return
playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
var/offset = prob(50) ? -2 : 2
@@ -1122,8 +1120,8 @@
inuse = 0
interact(usr)
//Snacks and Plants
- for (var/obj/item/weapon/reagent_containers/food/snacks/O in holdingitems)
- if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ for(var/obj/item/weapon/reagent_containers/food/snacks/O in holdingitems)
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
var/allowed = null
@@ -1134,85 +1132,85 @@
if(isnull(allowed))
break
- for (var/r_id in allowed)
+ for(var/r_id in allowed)
var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
var/amount = allowed[r_id]
if(amount <= 0) //Negative amounts are multipliers for the reagent amount (Example: "amount = -5" means "reagent_amount * 5")
if(amount == 0)
- if (O.reagents != null && O.reagents.has_reagent("nutriment"))
+ if(O.reagents != null && O.reagents.has_reagent("nutriment"))
beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("nutriment"), space))
O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space))
- if (O.reagents != null && O.reagents.has_reagent("plantmatter"))
+ if(O.reagents != null && O.reagents.has_reagent("plantmatter"))
beaker.reagents.add_reagent(r_id, min(O.reagents.get_reagent_amount("plantmatter"), space))
O.reagents.remove_reagent("plantmatter", min(O.reagents.get_reagent_amount("plantmatter"), space))
else
- if (O.reagents != null && O.reagents.has_reagent("nutriment"))
+ if(O.reagents != null && O.reagents.has_reagent("nutriment"))
beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("nutriment")*abs(amount)), space))
O.reagents.remove_reagent("nutriment", min(O.reagents.get_reagent_amount("nutriment"), space))
- if (O.reagents != null && O.reagents.has_reagent("plantmatter"))
+ if(O.reagents != null && O.reagents.has_reagent("plantmatter"))
beaker.reagents.add_reagent(r_id, min(round(O.reagents.get_reagent_amount("plantmatter")*abs(amount)), space))
O.reagents.remove_reagent("plantmatter", min(O.reagents.get_reagent_amount("plantmatter"), space))
else
O.reagents.trans_id_to(beaker, r_id, min(amount, space))
- if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
if(O.reagents.reagent_list.len == 0)
remove_object(O)
//Sheets
- for (var/obj/item/stack/sheet/O in holdingitems)
+ for(var/obj/item/stack/sheet/O in holdingitems)
var/allowed = get_allowed_by_id(O)
- if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
for(var/i = 1; i <= round(O.amount, 1); i++)
- for (var/r_id in allowed)
+ for(var/r_id in allowed)
var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
var/amount = allowed[r_id]
beaker.reagents.add_reagent(r_id,min(amount, space))
- if (space < amount)
+ if(space < amount)
break
- if (i == round(O.amount, 1))
+ if(i == round(O.amount, 1))
remove_object(O)
break
//Plants
- for (var/obj/item/weapon/grown/O in holdingitems)
- if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ for(var/obj/item/weapon/grown/O in holdingitems)
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
var/allowed = get_allowed_by_id(O)
- for (var/r_id in allowed)
+ for(var/r_id in allowed)
var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
var/amount = allowed[r_id]
- if (amount == 0)
- if (O.reagents != null && O.reagents.has_reagent(r_id))
+ if(amount == 0)
+ if(O.reagents != null && O.reagents.has_reagent(r_id))
beaker.reagents.add_reagent(r_id,min(O.reagents.get_reagent_amount(r_id), space))
else
beaker.reagents.add_reagent(r_id,min(amount, space))
- if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
remove_object(O)
//xenoarch
/*for(var/obj/item/weapon/rocksliver/O in holdingitems)
- if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
var/allowed = get_allowed_by_id(O)
- for (var/r_id in allowed)
+ for(var/r_id in allowed)
var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
var/amount = allowed[r_id]
beaker.reagents.add_reagent(r_id,min(amount, space), O.geological_data)
- if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
remove_object(O)*/
//Everything else - Transfers reagents from it into beaker
- for (var/obj/item/weapon/reagent_containers/O in holdingitems)
- if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+ for(var/obj/item/weapon/reagent_containers/O in holdingitems)
+ if(beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
var/amount = O.reagents.total_volume
O.reagents.trans_to(beaker, amount)
diff --git a/code/modules/reagents/newchem/Blob-Reagents.dm b/code/modules/reagents/newchem/Blob-Reagents.dm
index f4fcdf9a2b1..e451b561469 100644
--- a/code/modules/reagents/newchem/Blob-Reagents.dm
+++ b/code/modules/reagents/newchem/Blob-Reagents.dm
@@ -29,7 +29,7 @@
message = "The blob splashes you with burning oil"
message_living = ", and you feel your skin char and melt"
-/datum/reagent/blob/boiling_oil/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
+/datum/reagent/blob/boiling_oil/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == TOUCH)
M.adjust_fire_stacks(round(volume/12))
volume = ..()
@@ -49,7 +49,7 @@
volume = ..()
M.apply_damage(0.6*volume, TOX)
M.hallucination += 0.6*volume
- M.reagents.add_reagent("spores", 0.4*volume)
+ M.reagents.add_reagent("spore", 0.4*volume)
/datum/reagent/blob/lexorin_jelly //does tons of oxygen damage and a little brute
name = "Lexorin Jelly"
@@ -97,7 +97,7 @@
color = "#61407E"
message = "You feel a thrum as the blob strikes you, and everything flies at you"
-/datum/reagent/blob/dark_matter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
+/datum/reagent/blob/dark_matter/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == TOUCH)
reagent_vortex(M, 0, volume)
volume = ..()
@@ -110,7 +110,7 @@
color = "#808000"
message = "The blob slams into you, and sends you flying"
-/datum/reagent/blob/b_sorium/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
+/datum/reagent/blob/b_sorium/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == TOUCH)
reagent_vortex(M, 1, volume)
volume = ..()
@@ -145,7 +145,7 @@
if(!step_towards(X, pull))
break
-/datum/reagent/blob/proc/send_message(var/mob/living/M as mob)
+/datum/reagent/blob/proc/send_message(mob/living/M)
var/totalmessage = message
if(message_living && !issilicon(M))
totalmessage += message_living
diff --git a/code/modules/reagents/newchem/chem_heater.dm b/code/modules/reagents/newchem/chem_heater.dm
index b3c6c6a5e8c..daea5802d64 100644
--- a/code/modules/reagents/newchem/chem_heater.dm
+++ b/code/modules/reagents/newchem/chem_heater.dm
@@ -18,7 +18,7 @@
component_parts += new /obj/item/weapon/stock_parts/micro_laser(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
RefreshParts()
-
+
/obj/machinery/chem_heater/upgraded/New()
..()
component_parts = list()
@@ -68,7 +68,7 @@
stat |= NOPOWER
nanomanager.update_uis(src)
-/obj/machinery/chem_heater/attackby(var/obj/item/I as obj, var/mob/user as mob)
+/obj/machinery/chem_heater/attackby(obj/item/I, mob/user)
if(isrobot(user))
return
@@ -96,10 +96,10 @@
default_deconstruction_crowbar(I)
return 1
-/obj/machinery/chem_heater/attack_hand(var/mob/user as mob)
+/obj/machinery/chem_heater/attack_hand(mob/user)
ui_interact(user)
-/obj/machinery/chem_heater/attack_ai(mob/user as mob)
+/obj/machinery/chem_heater/attack_ai(mob/user)
src.add_hiddenprint(user)
return src.attack_hand(user)
@@ -126,8 +126,9 @@
eject_beaker()
. = 0 //updated in eject_beaker() already
-/obj/machinery/chem_heater/ui_interact(var/mob/user, ui_key = "main", var/datum/nanoui/ui = null)
- if(user.stat || user.restrained()) return
+/obj/machinery/chem_heater/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null)
+ if(user.stat || user.restrained())
+ return
var/data[0]
data["targetTemp"] = desired_temp
@@ -147,7 +148,7 @@
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "chem_heater.tmpl", "ChemHeater", 350, 270)
ui.set_initial_data(data)
ui.open()
\ No newline at end of file
diff --git a/code/modules/reagents/newchem/disease.dm b/code/modules/reagents/newchem/disease.dm
index aa0a2db6ae0..6f8e7fd6308 100644
--- a/code/modules/reagents/newchem/disease.dm
+++ b/code/modules/reagents/newchem/disease.dm
@@ -19,8 +19,7 @@
description = "Microscopic construction robots."
color = "#535E66" // rgb: 83, 94, 102
-/datum/reagent/nanomachines/on_mob_life(var/mob/living/carbon/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/nanomachines/on_mob_life(mob/living/carbon/M)
if(volume > 1.5)
M.ForceContractDisease(new /datum/disease/transformation/robot(0))
..()
@@ -32,8 +31,7 @@
description = "Microbes with an entirely alien cellular structure."
color = "#535E66" // rgb: 83, 94, 102
-/datum/reagent/xenomicrobes/on_mob_life(var/mob/living/carbon/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/xenomicrobes/on_mob_life(mob/living/carbon/M)
if(volume > 1.5)
M.ContractDisease(new /datum/disease/transformation/xeno(0))
..()
@@ -44,8 +42,7 @@
description = "Active fungal spores."
color = "#92D17D" // rgb: 146, 209, 125
-/datum/reagent/fungalspores/on_mob_life(var/mob/living/carbon/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/fungalspores/on_mob_life(mob/living/carbon/M)
if(volume > 2.5)
M.ForceContractDisease(new /datum/disease/tuberculosis(0))
..()
@@ -57,8 +54,7 @@
reagent_state = SOLID
color = "#FA0000" // rgb: 250, 0, 0
-/datum/reagent/jagged_crystals/on_mob_life(var/mob/living/carbon/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/jagged_crystals/on_mob_life(mob/living/carbon/M)
M.ForceContractDisease(new /datum/disease/berserker(0))
..()
@@ -69,8 +65,7 @@
reagent_state = LIQUID
color = "#1E4600"
-/datum/reagent/salmonella/on_mob_life(var/mob/living/carbon/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/salmonella/on_mob_life(mob/living/carbon/M)
M.ForceContractDisease(new /datum/disease/food_poisoning(0))
..()
@@ -81,8 +76,7 @@
reagent_state = LIQUID
color = "#FF0000"
-/datum/reagent/gibbis/on_mob_life(var/mob/living/carbon/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/gibbis/on_mob_life(mob/living/carbon/M)
if(volume > 2.5)
M.ForceContractDisease(new /datum/disease/gbs/curable(0))
..()
@@ -94,8 +88,7 @@
reagent_state = LIQUID
color = "#FFFFFF"
-/datum/reagent/prions/on_mob_life(var/mob/living/carbon/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/prions/on_mob_life(mob/living/carbon/M)
if(volume > 4.5)
M.ForceContractDisease(new /datum/disease/kuru(0))
..()
@@ -107,8 +100,7 @@
reagent_state = LIQUID
color = "#465046"
-/datum/reagent/grave_dust/on_mob_life(var/mob/living/carbon/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/grave_dust/on_mob_life(mob/living/carbon/M)
if(volume > 4.5)
M.ForceContractDisease(new /datum/disease/vampire(0))
..()
@@ -120,8 +112,7 @@
reagent_state = SOLID
color = "#925D6C"
-/datum/reagent/heartworms/on_mob_life(var/mob/living/carbon/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/heartworms/on_mob_life(mob/living/carbon/M)
if(volume > 4.5)
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -131,32 +122,6 @@
qdel(ate_heart)
..()
-/datum/reagent/spore
- name = "Blob Spores"
- id = "spore"
- description = "Spores of some blob creature thingy."
- reagent_state = LIQUID
- color = "#CE760A" // rgb: 206, 118, 10
- var/client/blob_client = null
- var/blob_point_rate = 3
-
-/datum/reagent/spore/on_mob_life(var/mob/living/M)
- if(!M) M = holder.my_atom
- if(holder.has_reagent("atrazine",45))
- holder.del_reagent("spore") //apparently this never metabolizes and stays in forever unless you have 45 units of atrazine in you or some stupid thing like that.
- if(prob(1))
- to_chat(M, "Your mouth tastes funny. ")
- if(prob(1) && prob(25))
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- if(directory[ckey(C.key)])
- blob_client = directory[ckey(C.key)]
- C.gib()
- if(blob_client)
- var/obj/effect/blob/core/core = new(get_turf(C), 200, blob_client, blob_point_rate)
- if(core.overmind && core.overmind.mind)
- core.overmind.mind.name = C.name
-
//virus food
/datum/reagent/virus_food
name = "Virus Food"
diff --git a/code/modules/reagents/newchem/drinks.dm b/code/modules/reagents/newchem/drinks.dm
index a9912f8722b..4790b4d01ec 100644
--- a/code/modules/reagents/newchem/drinks.dm
+++ b/code/modules/reagents/newchem/drinks.dm
@@ -14,8 +14,7 @@
mix_message = "The drink turns electric blue and starts quivering violently."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-/datum/reagent/ginsonic/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/ginsonic/on_mob_life(mob/living/M)
M.drowsyness = max(0, M.drowsyness-5)
if(prob(25))
M.AdjustParalysis(-1)
@@ -29,7 +28,6 @@
else
to_chat(M, "[sonic_message ] ")
..()
- return
/datum/reagent/ethanol/applejack
name = "Applejack"
@@ -72,13 +70,12 @@
color = "#DC0000"
alcohol_perc = 1
-/datum/reagent/ethanol/dragons_breath/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+/datum/reagent/ethanol/dragons_breath/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == INGEST && prob(20))
if(M.on_fire)
M.adjust_fire_stacks(3)
-/datum/reagent/ethanol/dragons_breath/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/ethanol/dragons_breath/on_mob_life(mob/living/M)
if(M.reagents.has_reagent("milk"))
to_chat(M, "The milk stops the burning. Ahhh. ")
M.reagents.del_reagent("milk")
@@ -128,7 +125,7 @@
mix_message = "The chemicals mix to create shiny, blue substance."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-/datum/reagent/ethanol/synthanol/on_mob_life(var/mob/living/M as mob, var/alien)
+/datum/reagent/ethanol/synthanol/on_mob_life(mob/living/M)
if(!M.isSynthetic())
holder.remove_reagent(id, 3.6) //gets removed from organics very fast
if(prob(25))
@@ -136,7 +133,7 @@
M.fakevomit()
..()
-datum/reagent/ethanol/synthanol/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
+/datum/reagent/ethanol/synthanol/reaction_mob(mob/M, method=TOUCH, volume)
if(!istype(M, /mob/living))
return
if(M.isSynthetic())
@@ -204,7 +201,7 @@ datum/reagent/ethanol/synthanol/reaction_mob(var/mob/M, var/method=TOUCH, var/vo
name = "Uplink"
id = "uplink"
result = "uplink"
- required_reagents = list("rum" = 1, "vodka" = 1, "tequilla" = 1, "whiskey" = 1, "synthanol" = 1)
+ required_reagents = list("rum" = 1, "vodka" = 1, "tequila" = 1, "whiskey" = 1, "synthanol" = 1)
result_amount = 5
/datum/reagent/ethanol/synthanol/synthnsoda
diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm
index 20607ac87a4..ac9f2bdcc39 100644
--- a/code/modules/reagents/newchem/drugs.dm
+++ b/code/modules/reagents/newchem/drugs.dm
@@ -12,9 +12,9 @@
color = "#60A584" // rgb: 96, 165, 132
overdose_threshold = 35
addiction_chance = 70
+ heart_rate_increase = 1
-/datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/nicotine/on_mob_life(mob/living/M)
var/smoke_message = pick("You feel relaxed.", "You feel calmed.", "You feel less stressed.", "You feel more placid.", "You feel more undivided.")
if(prob(5))
to_chat(M, "[smoke_message] ")
@@ -24,9 +24,8 @@
M.AdjustWeakened(-1)
M.adjustStaminaLoss(-1*REM)
..()
- return
-/datum/reagent/nicotine/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/nicotine/overdose_process(mob/living/M, severity)
var/effect = ..()
if(severity == 1)
if(effect <= 2)
@@ -75,8 +74,7 @@
overdose_threshold = 20
addiction_chance = 50
-/datum/reagent/crank/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/crank/on_mob_life(mob/living/M)
M.AdjustParalysis(-2)
M.AdjustStunned(-2)
M.AdjustWeakened(-2)
@@ -95,9 +93,8 @@
M.jitteriness += 30
M.emote(pick("groan", "moan"))
..()
- return
-/datum/reagent/crank/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/crank/overdose_process(mob/living/M, severity)
var/effect = ..()
if(severity == 1)
if(effect <= 2)
@@ -146,12 +143,11 @@
mix_sound = 'sound/goonstation/effects/crystalshatter.ogg'
min_temp = 390
-/datum/chemical_reaction/crank/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/crank/on_reaction(datum/reagents/holder, created_volume)
var/turf/T = get_turf(holder.my_atom)
for(var/turf/turf in range(1,T))
new /obj/effect/hotspot(turf)
explosion(T,0,0,2)
- return
/datum/reagent/krokodil
name = "Krokodil"
@@ -163,8 +159,7 @@
addiction_chance = 50
-/datum/reagent/krokodil/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/krokodil/on_mob_life(mob/living/M)
M.jitteriness -= 40
if(prob(25))
M.adjustBrainLoss(1)
@@ -185,9 +180,8 @@
to_chat(M, "Your skin feels all rough and dry. ")
M.adjustBruteLoss(2)
..()
- return
-/datum/reagent/krokodil/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/krokodil/overdose_process(mob/living/M, severity)
var/effect = ..()
if(severity == 1)
if(effect <= 2)
@@ -241,9 +235,9 @@
overdose_threshold = 20
addiction_chance = 60
metabolization_rate = 0.6
+ heart_rate_increase = 1
-/datum/reagent/methamphetamine/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/methamphetamine/on_mob_life(mob/living/M)
if(prob(5))
M.emote(pick("twitch_s","blink_r","shiver"))
if(current_cycle >= 25)
@@ -258,9 +252,12 @@
if(prob(50))
M.adjustBrainLoss(1.0)
..()
- return
-/datum/reagent/methamphetamine/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/methamphetamine/reagent_deleted(mob/living/M)
+ M.status_flags &= ~GOTTAGOREALLYFAST
+ ..()
+
+/datum/reagent/methamphetamine/overdose_process(mob/living/M, severity)
var/effect = ..()
if(severity == 1)
if(effect <= 2)
@@ -293,15 +290,15 @@
result_amount = 4
min_temp = 374
-/datum/chemical_reaction/methamphetamine/on_reaction(var/datum/reagents/holder)
+/datum/chemical_reaction/methamphetamine/on_reaction(datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
T.visible_message("The solution generates a strong vapor! ")
for(var/mob/living/carbon/C in range(T, 1))
- if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT)))
+ if(C.can_breathe_gas())
C.emote("gasp")
C.losebreath++
- C.reagents.add_reagent("toxin",10)
- C.reagents.add_reagent("neurotoxin2",20)
+ C.reagents.add_reagent("toxin", 10)
+ C.reagents.add_reagent("neurotoxin2", 20)
/datum/chemical_reaction/saltpetre
name = "saltpetre"
@@ -328,8 +325,7 @@
addiction_chance = 80
metabolization_rate = 0.6
-/datum/reagent/bath_salts/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/bath_salts/on_mob_life(mob/living/M)
var/check = rand(0,100)
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -361,7 +357,7 @@
to_chat(M, "THEY'RE GONNA GET YOU! ")
..()
-/datum/reagent/bath_salts/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+/datum/reagent/bath_salts/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == INGEST)
to_chat(M, "You feel FUCKED UP!!!!!! ")
M << 'sound/effects/singlebeat.ogg'
@@ -372,7 +368,7 @@
else
to_chat(M, "You feel a bit more salty than usual. ")
-/datum/reagent/bath_salts/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/bath_salts/overdose_process(mob/living/M, severity)
var/effect = ..()
if(severity == 1)
if(effect <= 2)
@@ -434,11 +430,11 @@
mix_message = "The mixture ferments into a filthy morass."
mix_sound = 'sound/effects/blobattack.ogg'
-/datum/chemical_reaction/jenkem/on_reaction(var/datum/reagents/holder)
+/datum/chemical_reaction/jenkem/on_reaction(datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
T.visible_message("The solution generates a strong vapor! ")
for(var/mob/living/carbon/C in range(T, 1))
- if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT)))
+ if(C.can_breathe_gas())
C.reagents.add_reagent("jenkem", 25)
/datum/reagent/jenkem
@@ -449,8 +445,7 @@
color = "#644600"
addiction_chance = 30
-/datum/reagent/jenkem/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/jenkem/on_mob_life(mob/living/M)
M.Dizzy(5)
if(prob(10))
M.emote(pick("twitch_s","drool","moan"))
@@ -471,8 +466,7 @@
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
-/datum/reagent/aranesp/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/aranesp/on_mob_life(mob/living/M)
M.adjustStaminaLoss(-40)
if(prob(90))
M.adjustToxLoss(1)
@@ -487,7 +481,6 @@
M.Stun(1)
M.losebreath++
..()
- return
/datum/reagent/thc
name = "Tetrahydrocannabinol"
@@ -497,8 +490,7 @@
color = "#0FBE0F"
-/datum/reagent/thc/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/thc/on_mob_life(mob/living/M)
M.stuttering += rand(0,2)
if(prob(5))
M.emote(pick("laugh","giggle","smile"))
@@ -510,7 +502,6 @@
if(prob(10))
M.drowsyness = max(M.drowsyness, 10)
..()
- return
/datum/reagent/fliptonium
name = "Fliptonium"
@@ -531,15 +522,14 @@
result_amount = 4
mix_message = "The mixture swirls around excitedly!"
-/datum/reagent/fliptonium/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
+/datum/reagent/fliptonium/reaction_mob(mob/M, method=TOUCH, volume)
if(!istype(M, /mob/living))
return
if(method == INGEST || method == TOUCH)
M.SpinAnimation(speed = 12, loops = -1)
..()
-/datum/reagent/fliptonium/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/fliptonium/on_mob_life(mob/living/M)
if(current_cycle == 5)
M.SpinAnimation(speed = 11, loops = -1)
if(current_cycle == 10)
@@ -564,12 +554,11 @@
M.adjustStaminaLoss(-1.5)
M.SetSleeping(0)
..()
- return
-/datum/reagent/fliptonium/reagent_deleted(var/mob/living/M as mob)
+/datum/reagent/fliptonium/reagent_deleted(mob/living/M)
M.SpinAnimation(speed = 12, loops = -1)
-/datum/reagent/fliptonium/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/fliptonium/overdose_process(mob/living/M, severity)
var/effect = ..()
if(severity == 1)
if(effect <= 2)
@@ -587,7 +576,7 @@
M.visible_message("[M]'s hands flip out and flail everywhere! ")
M.drop_l_hand()
M.drop_r_hand()
- else if (effect <= 4)
+ else if(effect <= 4)
M.visible_message("[M] falls to the floor and flails uncontrollably! ")
M.Jitter(5)
M.Weaken(5)
@@ -619,8 +608,7 @@
result_amount = 2
mix_message = "The mixture darkens and appears to partially vaporize into a chilling aerosol."
-/datum/reagent/lube/ultra/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/lube/ultra/on_mob_life(mob/living/M)
var/high_message = pick("You feel your servos whir!", "You feel like you need to go faster.", "You feel like you were just overclocked!")
if(prob(1))
if(prob(1))
@@ -637,9 +625,12 @@
if(prob(5))
M.emote(pick("twitch", "shiver"))
..()
- return
-/datum/reagent/lube/ultra/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/lube/ultra/reagent_deleted(mob/living/M)
+ M.status_flags &= ~GOTTAGOREALLYFAST
+ ..()
+
+/datum/reagent/lube/ultra/overdose_process(mob/living/M, severity)
if(prob(20))
M.emote("ping")
if(prob(33))
@@ -647,10 +638,10 @@
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
- ..()
if(prob(50))
M.adjustFireLoss(10)
M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1))
+ ..()
//Surge: Krokodil
/datum/reagent/surge
@@ -665,8 +656,7 @@
addiction_chance = 50
-/datum/reagent/surge/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/surge/on_mob_life(mob/living/M)
M.druggy = max(M.druggy, 15)
var/high_message = pick("You feel calm.", "You feel collected.", "You feel like you need to relax.")
if(prob(1))
@@ -675,9 +665,8 @@
if(prob(5))
to_chat(M, "[high_message] ")
..()
- return
-/datum/reagent/surge/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/surge/overdose_process(mob/living/M, severity)
//Hit them with the same effects as an electrode!
M.Stun(5)
M.Weaken(5)
diff --git a/code/modules/reagents/newchem/food.dm b/code/modules/reagents/newchem/food.dm
index 97643169e6f..c1b78581534 100644
--- a/code/modules/reagents/newchem/food.dm
+++ b/code/modules/reagents/newchem/food.dm
@@ -6,7 +6,7 @@
color = "#63DE63"
metabolization_rate = 0.4
-datum/reagent/questionmark/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
+/datum/reagent/questionmark/reaction_mob(mob/M, method=TOUCH, volume)
if(!istype(M, /mob/living))
return
if(method == INGEST)
@@ -15,23 +15,21 @@ datum/reagent/questionmark/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
to_chat(M, "Ugh! Eating that was a terrible idea! ")
M.ForceContractDisease(new /datum/disease/food_poisoning(0))
-datum/reagent/egg
+/datum/reagent/egg
name = "Egg"
id = "egg"
description = "A runny and viscous mixture of clear and yellow fluids."
reagent_state = LIQUID
color = "#F0C814"
-datum/reagent/egg/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/egg/on_mob_life(mob/living/M)
if(prob(8))
M.emote("fart")
if(prob(3))
M.reagents.add_reagent("cholesterol", rand(1,2))
..()
- return
-datum/reagent/triple_citrus
+/datum/reagent/triple_citrus
name = "Triple Citrus"
id = "triple_citrus"
description = "A refreshing mixed drink of orange, lemon and lime juice."
@@ -47,13 +45,13 @@ datum/reagent/triple_citrus
mix_message = "The citrus juices begin to blend together."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-datum/reagent/triple_citrus/reaction_mob(var/mob/living/carbon/M as mob, var/method=TOUCH, var/volume)
+/datum/reagent/triple_citrus/reaction_mob(mob/living/carbon/M, method=TOUCH, volume)
if(!istype(M, /mob/living/carbon))
return
if(method == INGEST)
M.adjustToxLoss(-rand(1,2))
-datum/reagent/corn_starch
+/datum/reagent/corn_starch
name = "Corn Starch"
id = "corn_starch"
description = "The powdered starch of maize, derived from the kernel's endosperm. Used as a thickener for gravies and puddings."
@@ -69,18 +67,16 @@ datum/reagent/corn_starch
min_temp = 374
mix_message = "The mixture forms a viscous, clear fluid!"
-datum/reagent/corn_syrup
+/datum/reagent/corn_syrup
name = "Corn Syrup"
id = "corn_syrup"
description = "A sweet syrup derived from corn starch that has had its starches converted into maltose and other sugars."
reagent_state = LIQUID
color = "#C8A5DC"
-datum/reagent/corn_syrup/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/corn_syrup/on_mob_life(mob/living/M)
M.reagents.add_reagent("sugar", 1.2)
..()
- return
/datum/chemical_reaction/vhfcs
name = "vhfcs"
@@ -91,18 +87,16 @@ datum/reagent/corn_syrup/on_mob_life(var/mob/living/M as mob)
result_amount = 1
mix_message = "The mixture emits a sickly-sweet smell."
-datum/reagent/vhfcs
+/datum/reagent/vhfcs
name = "Very-high-fructose corn syrup"
id = "vhfcs"
description = "An incredibly sweet syrup, created from corn syrup treated with enzymes to convert its sugars into fructose."
reagent_state = LIQUID
color = "#C8A5DC"
-datum/reagent/vhfcs/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/vhfcs/on_mob_life(mob/living/M)
M.reagents.add_reagent("sugar", 2.4)
..()
- return
/datum/chemical_reaction/cola
name = "cola"
@@ -120,14 +114,11 @@ datum/reagent/vhfcs/on_mob_life(var/mob/living/M as mob)
reagent_state = LIQUID
color = "#d3a308"
-datum/reagent/honey/on_mob_life(var/mob/living/M as mob)
- if(!M)
- M = holder.my_atom
+/datum/reagent/honey/on_mob_life(mob/living/M)
M.reagents.add_reagent("sugar", 0.4)
if(prob(20))
M.heal_organ_damage(3,1)
..()
- return
/datum/reagent/chocolate
name = "Chocolate"
@@ -137,18 +128,15 @@ datum/reagent/honey/on_mob_life(var/mob/living/M as mob)
nutriment_factor = 5 * REAGENTS_METABOLISM //same as pure cocoa powder, because it makes no sense that chocolate won't fill you up and make you fat
color = "#2E2418"
-/datum/reagent/chocolate/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/chocolate/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
M.reagents.add_reagent("sugar", 0.8)
..()
- return
-/datum/reagent/chocolate/reaction_turf(var/turf/T, var/volume)
+/datum/reagent/chocolate/reaction_turf(turf/T, volume)
src = null
if(volume >= 5)
new /obj/item/weapon/reagent_containers/food/snacks/choc_pile(T)
- return
/datum/reagent/mugwort
name = "Mugwort"
@@ -157,8 +145,7 @@ datum/reagent/honey/on_mob_life(var/mob/living/M as mob)
reagent_state = LIQUID
color = "#21170E"
-datum/reagent/mugwort/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/mugwort/on_mob_life(mob/living/M)
if(istype(M, /mob/living/carbon/human) && M.mind)
if(M.mind.special_role == "Wizard")
M.adjustToxLoss(-1*REM)
@@ -166,7 +153,6 @@ datum/reagent/mugwort/on_mob_life(var/mob/living/M as mob)
M.adjustBruteLoss(-1*REM)
M.adjustFireLoss(-1*REM)
..()
- return
/datum/reagent/porktonium
name = "Porktonium"
@@ -177,7 +163,7 @@ datum/reagent/mugwort/on_mob_life(var/mob/living/M as mob)
metabolization_rate = 0.2
overdose_threshold = 133
-/datum/reagent/porktonium/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/porktonium/overdose_process(mob/living/M, severity)
if(prob(15))
M.reagents.add_reagent("cholesterol", rand(1,3))
if(prob(8))
@@ -191,7 +177,7 @@ datum/reagent/mugwort/on_mob_life(var/mob/living/M as mob)
reagent_state = LIQUID
color = "#C87D28"
-datum/reagent/fungus/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
+/datum/reagent/fungus/reaction_mob(mob/M, method=TOUCH, volume)
if(!istype(M, /mob/living))
return
if(method == INGEST)
@@ -213,10 +199,9 @@ datum/reagent/fungus/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
color = "#B4B400"
metabolization_rate = 0.2
-/datum/reagent/chicken_soup/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/chicken_soup/on_mob_life(mob/living/M)
M.nutrition += 2
..()
- return
/datum/reagent/msg
name = "Monosodium glutamate"
@@ -226,14 +211,14 @@ datum/reagent/fungus/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
color = "#F5F5F5"
metabolization_rate = 0.2
-datum/reagent/msg/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
+/datum/reagent/msg/reaction_mob(mob/M, method=TOUCH, volume)
if(!istype(M, /mob/living))
return
if(method == INGEST)
to_chat(M, "That tasted amazing! ")
-/datum/reagent/msg/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/msg/on_mob_life(mob/living/M)
if(prob(5))
if(prob(10))
M.adjustToxLoss(rand(2.4))
@@ -241,7 +226,6 @@ datum/reagent/msg/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
to_chat(M, "A horrible migraine overpowers you. ")
M.Stun(rand(2,5))
..()
- return
/datum/reagent/cheese
name = "Cheese"
@@ -252,16 +236,15 @@ datum/reagent/msg/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
metabolization_rate = 0 //heheheh
-/datum/reagent/cheese/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/cheese/on_mob_life(mob/living/M)
if(prob(3))
M.reagents.add_reagent("cholesterol", rand(1,2))
..()
-datum/reagent/cheese/reaction_turf(var/turf/T, var/volume)
+/datum/reagent/cheese/reaction_turf(turf/T, volume)
src = null
if(volume >= 5)
new /obj/item/weapon/reagent_containers/food/snacks/cheesewedge(T)
- return
/datum/chemical_reaction/cheese
name = "cheese"
@@ -271,7 +254,7 @@ datum/reagent/cheese/reaction_turf(var/turf/T, var/volume)
result_amount = 1
mix_message = "The mixture curdles up."
-/datum/chemical_reaction/cheese/on_reaction(var/datum/reagents/holder)
+/datum/chemical_reaction/cheese/on_reaction(datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
T.visible_message("A faint cheesy smell drifts through the air... ")
@@ -283,7 +266,7 @@ datum/reagent/cheese/reaction_turf(var/turf/T, var/volume)
color = "#B2B139"
overdose_threshold = 50
-/datum/reagent/fake_cheese/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/fake_cheese/overdose_process(mob/living/M, severity)
if(prob(8))
to_chat(M, "You feel something squirming in your stomach. Your thoughts turn to cheese and you begin to sweat. ")
M.adjustToxLoss(rand(1,2))
@@ -297,16 +280,15 @@ datum/reagent/cheese/reaction_turf(var/turf/T, var/volume)
metabolization_rate = 0 //heheheh
addiction_chance = 5
-/datum/reagent/weird_cheese/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/weird_cheese/on_mob_life(mob/living/M)
if(prob(5))
M.reagents.add_reagent("cholesterol", rand(1,3))
..()
-datum/reagent/weird_cheese/reaction_turf(var/turf/T, var/volume)
+/datum/reagent/weird_cheese/reaction_turf(turf/T, volume)
src = null
if(volume >= 5)
new /obj/item/weapon/reagent_containers/food/snacks/weirdcheesewedge(T)
- return
/datum/chemical_reaction/weird_cheese
name = "Weird cheese"
@@ -317,23 +299,21 @@ datum/reagent/weird_cheese/reaction_turf(var/turf/T, var/volume)
mix_message = "The disgusting mixture sloughs together horribly, emitting a foul stench."
mix_sound = 'sound/goonstation/misc/gurggle.ogg'
-/datum/chemical_reaction/weird_cheese/on_reaction(var/datum/reagents/holder)
+/datum/chemical_reaction/weird_cheese/on_reaction(datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
T.visible_message("A horrible smell assaults your nose! What in space is it? ")
-datum/reagent/beans
+/datum/reagent/beans
name = "Refried beans"
id = "beans"
description = "A dish made of mashed beans cooked with lard."
reagent_state = LIQUID
color = "#684435"
-datum/reagent/beans/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/beans/on_mob_life(mob/living/M)
if(prob(10))
M.emote("fart")
..()
- return
/datum/reagent/bread
name = "Bread"
@@ -342,11 +322,10 @@ datum/reagent/beans/on_mob_life(var/mob/living/M as mob)
reagent_state = SOLID
color = "#9C5013"
-datum/reagent/bread/reaction_turf(var/turf/T, var/volume)
+/datum/reagent/bread/reaction_turf(turf/T, volume)
src = null
if(volume >= 5)
new /obj/item/weapon/reagent_containers/food/snacks/breadslice(T)
- return
/datum/reagent/vomit
name = "Vomit"
@@ -355,12 +334,11 @@ datum/reagent/bread/reaction_turf(var/turf/T, var/volume)
reagent_state = LIQUID
color = "#FFFF00"
-datum/reagent/vomit/reaction_turf(var/turf/T, var/volume)
+/datum/reagent/vomit/reaction_turf(turf/T, volume)
src = null
if(volume >= 5)
new /obj/effect/decal/cleanable/vomit(T)
playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
- return
/datum/reagent/greenvomit
name = "Green vomit"
@@ -369,12 +347,11 @@ datum/reagent/vomit/reaction_turf(var/turf/T, var/volume)
reagent_state = LIQUID
color = "#78FF74"
-datum/reagent/greenvomit/reaction_turf(var/turf/T, var/volume)
+/datum/reagent/greenvomit/reaction_turf(turf/T, volume)
src = null
if(volume >= 5)
new /obj/effect/decal/cleanable/vomit/green(T)
playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
- return
/datum/reagent/ectoplasm
@@ -385,25 +362,23 @@ datum/reagent/greenvomit/reaction_turf(var/turf/T, var/volume)
color = "#8EAE7B"
process_flags = ORGANIC | SYNTHETIC //Because apparently ghosts in the shell
-datum/reagent/ectoplasm/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
+/datum/reagent/ectoplasm/reaction_mob(mob/M, method=TOUCH, volume)
if(!istype(M, /mob/living))
return
if(method == INGEST)
var/spooky_eat = pick("Ugh, why did you eat that? Your mouth feels haunted. Haunted with bad flavors.", "Ugh, why did you eat that? It has the texture of ham aspic. From the 1950s. Left out in the sun.", "Ugh, why did you eat that? It tastes like a ghost fart.", "Ugh, why did you eat that? It tastes like flavor died.")
to_chat(M, "[spooky_eat] ")
-/datum/reagent/ectoplasm/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/ectoplasm/on_mob_life(mob/living/M)
var/spooky_message = pick("You notice something moving out of the corner of your eye, but nothing is there...", "Your eyes twitch, you feel like something you can't see is here...", "You've got the heebie-jeebies.", "You feel uneasy.", "You shudder as if cold...", "You feel something gliding across your back...")
if(prob(8))
to_chat(M, "[spooky_message] ")
..()
- return
-datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume)
+/datum/reagent/ectoplasm/reaction_turf(turf/T, volume)
src = null
if(volume >= 10)
new /obj/item/weapon/reagent_containers/food/snacks/ectoplasm(T)
- return
/datum/reagent/soybeanoil
name = "Space-soybean oil"
@@ -412,13 +387,12 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume)
reagent_state = LIQUID
color = "#B1B0B0"
-/datum/reagent/soybeanoil/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/soybeanoil/on_mob_life(mob/living/M)
if(prob(10))
M.reagents.add_reagent("cholesterol", rand(1,3))
if(prob(8))
M.reagents.add_reagent("porktonium", 5)
..()
- return
/datum/reagent/hydrogenated_soybeanoil
name = "Partially hydrogenated space-soybean oil"
@@ -429,7 +403,7 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume)
metabolization_rate = 0.2
overdose_threshold = 75
-/datum/reagent/hydrogenated_soybeanoil/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/hydrogenated_soybeanoil/on_mob_life(mob/living/M)
if(prob(15))
M.reagents.add_reagent("cholesterol", rand(1,3))
if(prob(8))
@@ -439,9 +413,8 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume)
else
metabolization_rate = 0.2
..()
- return
-/datum/reagent/hydrogenated_soybeanoil/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/hydrogenated_soybeanoil/overdose_process(mob/living/M, severity)
if(prob(33))
to_chat(M, "You feel horribly weak. ")
if(prob(10))
@@ -469,12 +442,12 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume)
reagent_state = LIQUID
color = "#EBD7D7"
-/datum/reagent/meatslurry/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/meatslurry/on_mob_life(mob/living/M)
if(prob(4))
M.reagents.add_reagent("cholesterol", rand(1,3))
..()
-/datum/reagent/meatslurry/reaction_turf(var/turf/T, var/volume)
+/datum/reagent/meatslurry/reaction_turf(turf/T, volume)
src = null
if(volume >= 5 && prob(10))
new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T)
@@ -519,7 +492,7 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume)
reagent_state = SOLID
color = "#AC7E67"
-/datum/reagent/beff/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/beff/on_mob_life(mob/living/M)
if(prob(5))
M.reagents.add_reagent("cholesterol", rand(1,3))
if(prob(8))
@@ -528,7 +501,6 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume)
to_chat(M, "[pick("You feel ill.","Your stomach churns.","You feel queasy.","You feel sick.")] ")
M.emote(pick("groan","moan"))
..()
- return
/datum/chemical_reaction/beff
name = "Beff"
@@ -546,7 +518,7 @@ datum/reagent/ectoplasm/reaction_turf(var/turf/T, var/volume)
reagent_state = SOLID
color = "#AC7E67"
-datum/reagent/pepperoni/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+/datum/reagent/pepperoni/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == TOUCH)
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -584,7 +556,7 @@ datum/reagent/pepperoni/reaction_mob(var/mob/living/M, var/method=TOUCH, var/vol
reagent_state = LIQUID
color = "#FFFAC8"
-/datum/reagent/cholesterol/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/cholesterol/on_mob_life(mob/living/M)
if(volume >= 25 && prob(volume*0.15))
to_chat(M, "Your chest feels [pick("weird","uncomfortable","nasty","gross","odd","unusual","warm")]! ")
M.adjustToxLoss(rand(1,2))
diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm
index a1e990ec51e..5b5e5722c46 100644
--- a/code/modules/reagents/newchem/medicine.dm
+++ b/code/modules/reagents/newchem/medicine.dm
@@ -4,7 +4,7 @@
#define REM REAGENTS_EFFECT_MULTIPLIER
-datum/reagent/silver_sulfadiazine
+/datum/reagent/silver_sulfadiazine
name = "Silver Sulfadiazine"
id = "silver_sulfadiazine"
description = "This antibacterial compound is used to treat burn victims."
@@ -12,7 +12,7 @@ datum/reagent/silver_sulfadiazine
color = "#F0C814"
metabolization_rate = 3
-datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
+/datum/reagent/silver_sulfadiazine/reaction_mob(mob/living/M, method=TOUCH, volume, show_message = 1)
if(iscarbon(M))
if(method == TOUCH)
M.adjustFireLoss(-volume)
@@ -23,15 +23,12 @@ datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/meth
if(show_message)
to_chat(M, "You feel sick... ")
..()
- return
-datum/reagent/silver_sulfadiazine/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/silver_sulfadiazine/on_mob_life(mob/living/M)
M.adjustFireLoss(-2*REM)
..()
- return
-datum/reagent/styptic_powder
+/datum/reagent/styptic_powder
name = "Styptic Powder"
id = "styptic_powder"
description = "Styptic (aluminium sulfate) powder helps control bleeding and heal physical wounds."
@@ -39,7 +36,7 @@ datum/reagent/styptic_powder
color = "#C8A5DC"
metabolization_rate = 3
-datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
+/datum/reagent/styptic_powder/reaction_mob(mob/living/M, method=TOUCH, volume, show_message = 1)
if(iscarbon(M))
if(method == TOUCH)
M.adjustBruteLoss(-volume)
@@ -51,15 +48,12 @@ datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TO
if(show_message)
to_chat(M, "You feel gross! ")
..()
- return
-datum/reagent/styptic_powder/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/styptic_powder/on_mob_life(mob/living/M)
M.adjustBruteLoss(-2*REM)
..()
- return
-datum/reagent/salglu_solution
+/datum/reagent/salglu_solution
name = "Saline-Glucose Solution"
id = "salglu_solution"
description = "This saline and glucose solution can help stabilize critically injured patients and cleanse wounds."
@@ -68,23 +62,24 @@ datum/reagent/salglu_solution
penetrates_skin = 1
metabolization_rate = 0.15
-datum/reagent/salglu_solution/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/salglu_solution/on_mob_life(mob/living/M)
if(prob(33))
M.adjustBruteLoss(-2*REM)
M.adjustFireLoss(-2*REM)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(!H.species.exotic_blood && !(H.species.flags & NO_BLOOD) && prob(33))
+ H.vessel.add_reagent("blood", 1)
..()
- return
-datum/reagent/synthflesh
+/datum/reagent/synthflesh
name = "Synthflesh"
id = "synthflesh"
description = "A resorbable microfibrillar collagen and protein mixture that can rapidly heal injuries when applied topically."
reagent_state = LIQUID
color = "#FFEBEB"
-datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume,var/show_message = 1)
- if(!M) M = holder.my_atom
+/datum/reagent/synthflesh/reaction_mob(mob/living/M, method=TOUCH, volume, show_message = 1)
if(iscarbon(M))
if(method == TOUCH)
M.adjustBruteLoss(-1.5*volume)
@@ -92,31 +87,27 @@ datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/vo
if(show_message)
to_chat(M, "The synthetic flesh integrates itself into your wounds, healing you. ")
..()
- return
-datum/reagent/synthflesh/reaction_turf(var/turf/T, var/volume) //let's make a mess!
+/datum/reagent/synthflesh/reaction_turf(turf/T, volume) //let's make a mess!
src = null
if(volume >= 5)
new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T)
playsound(T, 'sound/effects/splat.ogg', 50, 1, -3)
- return
-datum/reagent/charcoal
+/datum/reagent/charcoal
name = "Charcoal"
id = "charcoal"
description = "Activated charcoal helps to absorb toxins."
reagent_state = LIQUID
color = "#000000"
-datum/reagent/charcoal/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/charcoal/on_mob_life(mob/living/M)
M.adjustToxLoss(-1.5*REM)
if(prob(50))
for(var/datum/reagent/R in M.reagents.reagent_list)
if(R != src)
M.reagents.remove_reagent(R.id,1)
..()
- return
/datum/chemical_reaction/charcoal
name = "Charcoal"
@@ -161,7 +152,7 @@ datum/reagent/charcoal/on_mob_life(var/mob/living/M as mob)
result_amount = 4
mix_message = "The solution yields an astringent powder."
-datum/reagent/omnizine
+/datum/reagent/omnizine
name = "Omnizine"
id = "omnizine"
description = "Omnizine is a highly potent healing medication that can be used to treat a wide range of injuries."
@@ -171,8 +162,7 @@ datum/reagent/omnizine
overdose_threshold = 30
addiction_chance = 5
-/datum/reagent/omnizine/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/omnizine/on_mob_life(mob/living/M)
M.adjustToxLoss(-1*REM)
M.adjustOxyLoss(-1*REM)
M.adjustBruteLoss(-2*REM)
@@ -180,9 +170,8 @@ datum/reagent/omnizine
if(prob(50))
M.losebreath -= 1
..()
- return
-/datum/reagent/omnizine/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/omnizine/overdose_process(mob/living/M, severity)
var/effect = ..()
if(severity == 1) //lesser
M.stuttering += 1
@@ -216,7 +205,7 @@ datum/reagent/omnizine
M.Dizzy(5)
M.Weaken(3)
-datum/reagent/calomel
+/datum/reagent/calomel
name = "Calomel"
id = "calomel"
description = "This potent purgative rids the body of impurities. It is highly toxic however and close supervision is required."
@@ -224,8 +213,7 @@ datum/reagent/calomel
color = "#22AB35"
metabolization_rate = 0.8
-datum/reagent/calomel/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/calomel/on_mob_life(mob/living/M)
for(var/datum/reagent/R in M.reagents.reagent_list)
if(R != src)
M.reagents.remove_reagent(R.id,5)
@@ -234,7 +222,6 @@ datum/reagent/calomel/on_mob_life(var/mob/living/M as mob)
if(prob(6))
M.fakevomit()
..()
- return
/datum/chemical_reaction/calomel
name = "Calomel"
@@ -245,19 +232,17 @@ datum/reagent/calomel/on_mob_life(var/mob/living/M as mob)
min_temp = 374
mix_message = "Stinging vapors rise from the solution."
-datum/reagent/potass_iodide
+/datum/reagent/potass_iodide
name = "Potassium Iodide"
id = "potass_iodide"
description = "Potassium Iodide is a medicinal drug used to counter the effects of radiation poisoning."
reagent_state = LIQUID
color = "#B4DCBE"
-datum/reagent/potass_iodide/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/potass_iodide/on_mob_life(mob/living/M)
if(prob(80))
M.radiation = max(0, M.radiation-1)
..()
- return
/datum/chemical_reaction/potass_iodide
name = "Potassium Iodide"
@@ -267,15 +252,14 @@ datum/reagent/potass_iodide/on_mob_life(var/mob/living/M as mob)
result_amount = 2
mix_message = "The solution settles calmly and emits gentle fumes."
-datum/reagent/pen_acid
+/datum/reagent/pen_acid
name = "Pentetic Acid"
id = "pen_acid"
description = "Pentetic Acid is an aggressive chelation agent. May cause tissue damage. Use with caution."
reagent_state = LIQUID
color = "#C8A5DC"
-datum/reagent/pen_acid/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/pen_acid/on_mob_life(mob/living/M)
for(var/datum/reagent/R in M.reagents.reagent_list)
if(R != src)
M.reagents.remove_reagent(R.id,4)
@@ -296,7 +280,7 @@ datum/reagent/pen_acid/on_mob_life(var/mob/living/M as mob)
result_amount = 6
mix_message = "The substance becomes very still, emitting a curious haze."
-datum/reagent/sal_acid
+/datum/reagent/sal_acid
name = "Salicylic Acid"
id = "sal_acid"
description = "This is a is a standard salicylate pain reliever and fever reducer."
@@ -306,8 +290,7 @@ datum/reagent/sal_acid
shock_reduction = 25
overdose_threshold = 25
-datum/reagent/sal_acid/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/sal_acid/on_mob_life(mob/living/M)
if(prob(55))
M.adjustBruteLoss(-2*REM)
if(ishuman(M))
@@ -315,7 +298,6 @@ datum/reagent/sal_acid/on_mob_life(var/mob/living/M as mob)
if(H.traumatic_shock < 100)
H.shock_stage = 0
..()
- return
/datum/chemical_reaction/sal_acid
name = "Salicyclic Acid"
@@ -326,7 +308,7 @@ datum/reagent/sal_acid/on_mob_life(var/mob/living/M as mob)
mix_message = "The mixture crystallizes."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-datum/reagent/salbutamol
+/datum/reagent/salbutamol
name = "Salbutamol"
id = "salbutamol"
description = "Salbutamol is a common bronchodilation medication for asthmatics. It may help with other breathing problems as well."
@@ -334,12 +316,10 @@ datum/reagent/salbutamol
color = "#00FFFF"
metabolization_rate = 0.2
-datum/reagent/salbutamol/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/salbutamol/on_mob_life(mob/living/M)
M.adjustOxyLoss(-6*REM)
M.losebreath = max(0, M.losebreath-4)
..()
- return
/datum/chemical_reaction/salbutamol
name = "Salbutamol"
@@ -350,7 +330,7 @@ datum/reagent/salbutamol/on_mob_life(var/mob/living/M as mob)
mix_message = "The solution bubbles freely, creating a head of bluish foam."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-datum/reagent/perfluorodecalin
+/datum/reagent/perfluorodecalin
name = "Perfluorodecalin"
id = "perfluorodecalin"
description = "This experimental perfluoronated solvent has applications in liquid breathing and tissue oxygenation. Use with caution."
@@ -359,8 +339,7 @@ datum/reagent/perfluorodecalin
metabolization_rate = 0.2
addiction_chance = 20
-datum/reagent/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/perfluorodecalin/on_mob_life(mob/living/carbon/human/M)
M.adjustOxyLoss(-25*REM)
if(volume >= 4)
M.losebreath = max(M.losebreath, 6)
@@ -369,7 +348,6 @@ datum/reagent/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob)
M.adjustBruteLoss(-1*REM)
M.adjustFireLoss(-1*REM)
..()
- return
/datum/chemical_reaction/perfluorodecalin
name = "Perfluorodecalin"
@@ -391,8 +369,7 @@ datum/reagent/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob)
overdose_threshold = 35
addiction_chance = 25
-/datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/ephedrine/on_mob_life(mob/living/M)
M.drowsyness = max(0, M.drowsyness-5)
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
@@ -407,9 +384,8 @@ datum/reagent/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob)
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
..()
- return
-/datum/reagent/ephedrine/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/ephedrine/overdose_process(mob/living/M, severity)
var/effect = ..()
if(severity == 1)
if(effect <= 1)
@@ -438,7 +414,7 @@ datum/reagent/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob)
result_amount = 4
mix_message = "The solution fizzes and gives off toxic fumes."
-datum/reagent/diphenhydramine
+/datum/reagent/diphenhydramine
name = "Diphenhydramine"
id = "diphenhydramine"
description = "Anti-allergy medication. May cause drowsiness, do not operate heavy machinery while using this."
@@ -446,8 +422,7 @@ datum/reagent/diphenhydramine
color = "#5BCBE1"
addiction_chance = 10
-datum/reagent/diphenhydramine/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/diphenhydramine/on_mob_life(mob/living/M)
M.jitteriness = max(0, M.jitteriness-20)
M.reagents.remove_reagent("histamine",3)
M.reagents.remove_reagent("itching_powder",3)
@@ -458,7 +433,6 @@ datum/reagent/diphenhydramine/on_mob_life(var/mob/living/M as mob)
M.drowsyness += 1
M.visible_message("[M] looks a bit dazed. ")
..()
- return
/datum/chemical_reaction/diphenhydramine
name = "Diphenhydramine"
@@ -469,7 +443,7 @@ datum/reagent/diphenhydramine/on_mob_life(var/mob/living/M as mob)
mix_message = "The mixture fizzes gently."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-datum/reagent/morphine
+/datum/reagent/morphine
name = "Morphine"
id = "morphine"
description = "A strong but highly addictive opiate painkiller with sedative side effects."
@@ -479,8 +453,7 @@ datum/reagent/morphine
addiction_chance = 50
shock_reduction = 50
-datum/reagent/morphine/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/morphine/on_mob_life(mob/living/M)
M.jitteriness = max(0, M.jitteriness-25)
switch(current_cycle)
if(1 to 15)
@@ -496,10 +469,8 @@ datum/reagent/morphine/on_mob_life(var/mob/living/M as mob)
if(H.traumatic_shock < 100)
H.shock_stage = 0
..()
- return
-datum/reagent/oculine/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/oculine/on_mob_life(mob/living/M)
if(prob(80))
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -507,17 +478,16 @@ datum/reagent/oculine/on_mob_life(var/mob/living/M as mob)
if(istype(E))
E.damage = max(E.damage-1, 0)
M.eye_blurry = max(M.eye_blurry-1 , 0)
- M.ear_damage = max(M.ear_damage-1, 0)
+ M.adjustEarDamage(-1,0)
if(prob(50))
M.disabilities &= ~NEARSIGHTED
if(prob(30))
- M.sdisabilities &= ~BLIND
+ M.disabilities &= ~BLIND
M.eye_blind = 0
if(M.ear_damage <= 25)
if(prob(30))
- M.ear_deaf = 0
+ M.setEarDamage(-1,0)
..()
- return
/datum/chemical_reaction/oculine
name = "Oculine"
@@ -527,7 +497,7 @@ datum/reagent/oculine/on_mob_life(var/mob/living/M as mob)
result_amount = 3
mix_message = "The mixture settles, becoming a milky white."
-datum/reagent/oculine
+/datum/reagent/oculine
name = "Oculine"
id = "oculine"
description = "Oculine is a saline eye medication with mydriatic and antibiotic effects."
@@ -536,7 +506,7 @@ datum/reagent/oculine
metabolization_rate = 0.4
var/cycle_amount = 0
-datum/reagent/atropine
+/datum/reagent/atropine
name = "Atropine"
id = "atropine"
description = "Atropine is a potent cardiac resuscitant but it can causes confusion, dizzyness and hyperthermia."
@@ -545,8 +515,7 @@ datum/reagent/atropine
metabolization_rate = 0.2
overdose_threshold = 25
-datum/reagent/atropine/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/atropine/on_mob_life(mob/living/M)
M.dizziness += 1
M.confused = max(M.confused, 5)
if(prob(4))
@@ -563,7 +532,6 @@ datum/reagent/atropine/on_mob_life(var/mob/living/M as mob)
M.adjustToxLoss(1)
M.reagents.remove_reagent("sarin", 20)
..()
- return
/datum/chemical_reaction/atropine
name = "Atropine"
@@ -573,7 +541,7 @@ datum/reagent/atropine/on_mob_life(var/mob/living/M as mob)
result_amount = 5
mix_message = "A horrid smell like something died drifts from the mixture."
-datum/reagent/epinephrine
+/datum/reagent/epinephrine
name = "Epinephrine"
id = "epinephrine"
description = "Epinephrine is a potent neurotransmitter, used in medical emergencies to halt anaphylactic shock and prevent cardiac arrest."
@@ -582,8 +550,7 @@ datum/reagent/epinephrine
metabolization_rate = 0.2
overdose_threshold = 20
-datum/reagent/epinephrine/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/epinephrine/on_mob_life(mob/living/M)
M.drowsyness = max(0, M.drowsyness-5)
if(prob(20))
M.AdjustParalysis(-1)
@@ -605,11 +572,10 @@ datum/reagent/epinephrine/on_mob_life(var/mob/living/M as mob)
M.adjustBruteLoss(-1*REM)
M.adjustFireLoss(-1*REM)
..()
- return
-/datum/reagent/epinephrine/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/epinephrine/overdose_process(mob/living/M, severity)
var/effect = ..()
- if (severity == 1)
+ if(severity == 1)
if(effect <= 1)
M.visible_message("[M] suddenly and violently vomits! ")
M.fakevomit(no_text = 1)
@@ -637,7 +603,7 @@ datum/reagent/epinephrine/on_mob_life(var/mob/living/M as mob)
mix_message = "Tiny white crystals precipitate out of the solution."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-datum/reagent/strange_reagent
+/datum/reagent/strange_reagent
name = "Strange Reagent"
id = "strange_reagent"
description = "A glowing green fluid highly reminiscent of nuclear waste."
@@ -645,7 +611,7 @@ datum/reagent/strange_reagent
color = "#A0E85E"
metabolization_rate = 0.2
-datum/reagent/strange_reagent/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
+/datum/reagent/strange_reagent/reaction_mob(mob/living/M, method=TOUCH, volume)
if(isanimal(M))
if(method == TOUCH)
var/mob/living/simple_animal/SM = M
@@ -664,7 +630,7 @@ datum/reagent/strange_reagent/reaction_mob(var/mob/living/M as mob, var/method=T
var/mob/dead/observer/ghost = M.get_ghost()
if(ghost)
to_chat(ghost, "Your are attempting to be revived with Strange Reagent. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)")
- to_chat(ghost, sound('sound/effects/genetics.ogg'))
+ ghost << sound('sound/effects/genetics.ogg')
M.visible_message("[M] doesn't appear to respond, perhaps try again later? ")
if(!M.suiciding && !ghost && !(NOCLONE in M.mutations))
M.visible_message("[M] seems to rise from the dead! ")
@@ -676,15 +642,12 @@ datum/reagent/strange_reagent/reaction_mob(var/mob/living/M as mob, var/method=T
M.stat = UNCONSCIOUS
add_logs(M, M, "revived", object="strange reagent")
..()
- return
-datum/reagent/strange_reagent/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/strange_reagent/on_mob_life(mob/living/M)
if(prob(10))
M.adjustBruteLoss(2*REM)
M.adjustToxLoss(2*REM)
..()
- return
/datum/chemical_reaction/strange_reagent
name = "Strange Reagent"
@@ -694,7 +657,7 @@ datum/reagent/strange_reagent/on_mob_life(var/mob/living/M as mob)
result_amount = 3
mix_message = "The substance begins moving on its own somehow."
-datum/reagent/life
+/datum/reagent/life
name = "Life"
id = "life"
description = "Can create a life form, however it is not guaranteed to be friendly. May want to have Security on hot standby."
@@ -710,13 +673,12 @@ datum/reagent/life
result_amount = 3
min_temp = 374
-/datum/chemical_reaction/life/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/life/on_reaction(datum/reagents/holder, created_volume)
chemical_mob_spawn(holder, 1, "Life")
-/datum/reagent/mannitol/on_mob_life(mob/living/M as mob)
+/datum/reagent/mannitol/on_mob_life(mob/living/M)
M.adjustBrainLoss(-3)
..()
- return
/datum/chemical_reaction/mannitol
name = "Mannitol"
@@ -732,9 +694,9 @@ datum/reagent/life
description = "Mannitol is a sugar alcohol that can help alleviate cranial swelling."
color = "#D1D1F1"
-/datum/reagent/mutadone/on_mob_life(var/mob/living/carbon/human/M as mob)
+/datum/reagent/mutadone/on_mob_life(mob/living/carbon/human/M)
M.jitteriness = 0
- var/needs_update = M.mutations.len > 0 || M.disabilities > 0 || M.sdisabilities > 0
+ var/needs_update = M.mutations.len > 0 || M.disabilities > 0
if(needs_update)
for(var/block=1;block<=DNA_SE_LENGTH;block++)
@@ -749,7 +711,6 @@ datum/reagent/life
var/mob/living/carbon/human/H = M
H.update_mutations()
..()
- return
/datum/chemical_reaction/mutadone
name = "Mutadone"
@@ -766,13 +727,13 @@ datum/reagent/life
description = "Mutadone is an experimental bromide that can cure genetic abnomalities."
color = "#5096C8"
-datum/reagent/antihol
+/datum/reagent/antihol
name = "Antihol"
id = "antihol"
description = "A medicine which quickly eliminates alcohol in the body."
color = "#009CA8"
-datum/reagent/antihol/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/antihol/on_mob_life(mob/living/M)
M.slurring = 0
M.AdjustDrunk(-4)
M.reagents.remove_all_type(/datum/reagent/ethanol, 8, 0, 1)
@@ -796,8 +757,7 @@ datum/reagent/antihol/on_mob_life(var/mob/living/M as mob)
color = "#C8A5DC"
metabolization_rate = 0.4
-datum/reagent/stimulants/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/stimulants/on_mob_life(mob/living/M)
if(volume > 5)
M.adjustOxyLoss(-5*REM)
M.adjustToxLoss(-5*REM)
@@ -819,11 +779,9 @@ datum/reagent/stimulants/on_mob_life(var/mob/living/M as mob)
M.Stun(3)
..()
-datum/reagent/stimulants/reagent_deleted(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/stimulants/reagent_deleted(mob/living/M)
M.status_flags |= CANSTUN | CANWEAKEN | CANPARALYSE
..()
- return
/datum/reagent/medicine/stimulative_agent
name = "Stimulative Agent"
@@ -846,24 +804,26 @@ datum/reagent/stimulants/reagent_deleted(var/mob/living/M as mob)
M.adjustStaminaLoss(-5*REM)
..()
+/datum/reagent/medicine/stimulative_agent/reagent_deleted(mob/living/M)
+ M.status_flags &= ~GOTTAGOFAST
+ ..()
+
/datum/reagent/medicine/stimulative_agent/overdose_process(mob/living/M, severity)
if(prob(33))
M.adjustStaminaLoss(2.5*REM)
M.adjustToxLoss(1*REM)
M.losebreath++
-datum/reagent/insulin
+/datum/reagent/insulin
name = "Insulin"
id = "insulin"
description = "A hormone generated by the pancreas responsible for metabolizing carbohydrates and fat in the bloodstream."
reagent_state = LIQUID
color = "#C8A5DC"
-datum/reagent/insulin/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/insulin/on_mob_life(mob/living/M)
M.reagents.remove_reagent("sugar", 5)
..()
- return
/datum/reagent/simethicone
@@ -880,7 +840,7 @@ datum/reagent/insulin/on_mob_life(var/mob/living/M as mob)
result_amount = 4
-datum/reagent/teporone
+/datum/reagent/teporone
name = "Teporone"
id = "teporone"
description = "This experimental plasma-based compound seems to regulate body temperature."
@@ -889,14 +849,12 @@ datum/reagent/teporone
addiction_chance = 20
overdose_threshold = 50
-datum/reagent/teporone/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/teporone/on_mob_life(mob/living/M)
if(M.bodytemperature > 310)
- M.bodytemperature -= 10
- if(M.bodytemperature < 310)
- M.bodytemperature += 10
+ M.bodytemperature = max(310, M.bodytemperature - (40 * TEMPERATURE_DAMAGE_COEFFICIENT))
+ else if(M.bodytemperature < 311)
+ M.bodytemperature = min(310, M.bodytemperature + (40 * TEMPERATURE_DAMAGE_COEFFICIENT))
..()
- return
/datum/chemical_reaction/teporone
name = "Teporone"
@@ -907,15 +865,14 @@ datum/reagent/teporone/on_mob_life(var/mob/living/M as mob)
mix_message = "The mixture turns an odd lavender color."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-datum/reagent/haloperidol
+/datum/reagent/haloperidol
name = "Haloperidol"
id = "haloperidol"
description = "Haloperidol is a powerful antipsychotic and sedative. Will help control psychiatric problems, but may cause brain damage."
reagent_state = LIQUID
color = "#FFDCFF"
-datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/haloperidol/on_mob_life(mob/living/M)
M.reagents.remove_reagent("crank", 5)
M.reagents.remove_reagent("methamphetamine", 5)
M.reagents.remove_reagent("space_drugs", 5)
@@ -936,7 +893,6 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
if(prob(20))
M.adjustBrainLoss(1)
..()
- return
/datum/chemical_reaction/haloperidol
name = "Haloperidol"
@@ -954,8 +910,7 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
reagent_state = LIQUID
color = "#96DEDE"
-/datum/reagent/ether/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/ether/on_mob_life(mob/living/M)
M.jitteriness = max(M.jitteriness-25,0)
switch(current_cycle)
if(1 to 15)
@@ -967,7 +922,6 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
M.Paralyse(15)
M.drowsyness = max(M.drowsyness, 20)
..()
- return
/datum/chemical_reaction/ether
name = "Ether"
@@ -997,15 +951,15 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
required_reagents = list("oil" = 1, "sterilizine" = 1)
result_amount = 2
-/datum/reagent/degreaser/reaction_turf(var/turf/simulated/T, var/volume)
- if (!istype(T)) return
+/datum/reagent/degreaser/reaction_turf(turf/simulated/T, volume)
+ if(!istype(T))
+ return
src = null
if(volume >= 1)
if(istype(T) && T.wet)
T.MakeDry(TURF_WET_LUBE)
-/datum/reagent/degreaser/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/degreaser/on_mob_life(mob/living/M)
if(prob(50)) //Same effects as coffee, to help purge ill effects like paralysis
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
@@ -1019,7 +973,6 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
else
M.reagents.remove_reagent(R.id,1)
..()
- return
//Liquid Solder: Mannitol
/datum/reagent/liquid_solder
@@ -1030,10 +983,9 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
color = "#D7B395"
process_flags = SYNTHETIC
-/datum/reagent/liquid_solder/on_mob_life(mob/living/M as mob)
+/datum/reagent/liquid_solder/on_mob_life(mob/living/M)
M.adjustBrainLoss(-3)
..()
- return
/datum/chemical_reaction/liquid_solder
name = "Liquid Solder"
@@ -1045,19 +997,18 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
mix_message = "The solution gently swirls with a metallic sheen."
-datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs
+/datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs
name = "Restorative Nanites"
id = "syndicate_nanites"
description = "Miniature medical robots that swiftly restore bodily damage. May begin to attack their host's cells in high amounts."
reagent_state = SOLID
color = "#555555"
-datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/M)
+/datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/M)
M.adjustBruteLoss(-5*REM) //A ton of healing - this is a 50 telecrystal investment.
M.adjustFireLoss(-5*REM)
M.adjustOxyLoss(-15*REM)
M.adjustToxLoss(-5*REM)
M.adjustBrainLoss(-15*REM)
M.adjustCloneLoss(-3*REM)
- ..()
- return
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm
index 8f3fa6204d2..4508125387e 100644
--- a/code/modules/reagents/newchem/newchem_procs.dm
+++ b/code/modules/reagents/newchem/newchem_procs.dm
@@ -12,16 +12,18 @@
var/chem_temp = 300
var/list/datum/reagent/addiction_list = new/list()
-/datum/reagents/proc/metabolize(var/mob/M)
+/datum/reagents/proc/metabolize(mob/living/M)
if(M)
- if(!istype(M, /mob/living)) //Non-living mobs can't metabolize reagents, so don't bother trying (runtime safety check)
- return
chem_temp = M.bodytemperature
handle_reactions()
for(var/A in reagent_list)
var/datum/reagent/R = A
if(!istype(R))
continue
+ if(!R.holder)
+ continue
+ if(!M)
+ M = R.holder.my_atom
if(ishuman(M))
var/mob/living/carbon/human/H = M
//Check if this mob's species is set and can process this type of reagent
@@ -82,6 +84,18 @@
addiction_list.Remove(R)
update_total()
+/datum/reagents/proc/death_metabolize(mob/living/M)
+ if(!M)
+ return
+ if(M.stat != DEAD) //what part of DEATH_metabolize don't you get?
+ return
+ for(var/A in reagent_list)
+ var/datum/reagent/R = A
+ if(!istype(R))
+ continue
+ if(M && R)
+ R.on_mob_death(M)
+
/datum/reagents/proc/overdose_list()
var/od_chems[0]
for(var/datum/reagent/R in reagent_list)
@@ -95,42 +109,28 @@
R.on_tick()
return
-/datum/reagents/proc/check_gofast(var/mob/M)
- if(istype(M, /mob))
- if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")||M.reagents.has_reagent("stimulative_agent"))
- return 1
- else
- M.status_flags &= ~GOTTAGOFAST
-
-/datum/reagents/proc/check_goreallyfast(var/mob/M)
- if(istype(M, /mob))
- if(M.reagents.has_reagent("methamphetamine"))
- return 1
- else
- M.status_flags &= ~GOTTAGOREALLYFAST
-
// Called every time reagent containers process.
-/datum/reagent/proc/on_tick(var/data)
+/datum/reagent/proc/on_tick(data)
return
// Called when the reagent container is hit by an explosion
-/datum/reagent/proc/on_ex_act(var/severity)
+/datum/reagent/proc/on_ex_act(severity)
return
// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects
-/datum/reagent/proc/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/proc/overdose_process(mob/living/M, severity)
var/effect = rand(1, 100) - severity
- if (effect <= 8)
+ if(effect <= 8)
M.adjustToxLoss(severity)
return effect
-/datum/reagent/proc/overdose_start(var/mob/living/M as mob)
+/datum/reagent/proc/overdose_start(mob/living/M)
return
-/datum/reagent/proc/addiction_act_stage1(var/mob/living/M as mob)
+/datum/reagent/proc/addiction_act_stage1(mob/living/M)
return
-/datum/reagent/proc/addiction_act_stage2(var/mob/living/M as mob)
+/datum/reagent/proc/addiction_act_stage2(mob/living/M)
if(prob(8))
M.emote("shiver")
if(prob(8))
@@ -138,7 +138,7 @@
if(prob(4))
to_chat(M, "You feel a dull headache. ")
-/datum/reagent/proc/addiction_act_stage3(var/mob/living/M as mob)
+/datum/reagent/proc/addiction_act_stage3(mob/living/M)
if(prob(8))
M.emote("twitch_s")
if(prob(8))
@@ -146,7 +146,7 @@
if(prob(4))
to_chat(M, "You begin craving [name]! ")
-/datum/reagent/proc/addiction_act_stage4(var/mob/living/M as mob)
+/datum/reagent/proc/addiction_act_stage4(mob/living/M)
if(prob(8))
M.emote("twitch")
if(prob(4))
@@ -154,7 +154,7 @@
if(prob(4))
to_chat(M, "You REALLY crave some [name]! ")
-/datum/reagent/proc/addiction_act_stage5(var/mob/living/M as mob)
+/datum/reagent/proc/addiction_act_stage5(mob/living/M)
if(prob(8))
M.emote("twitch")
if(prob(6))
diff --git a/code/modules/reagents/newchem/other.dm b/code/modules/reagents/newchem/other.dm
index 1e31ba5b506..44d506a026a 100644
--- a/code/modules/reagents/newchem/other.dm
+++ b/code/modules/reagents/newchem/other.dm
@@ -5,67 +5,64 @@
var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700")
-datum/reagent/oil
+/datum/reagent/oil
name = "Oil"
id = "oil"
description = "A decent lubricant for machines. High in benzene, naptha and other hydrocarbons."
reagent_state = LIQUID
color = "#3C3C3C"
-datum/reagent/iodine
+/datum/reagent/iodine
name = "Iodine"
id = "iodine"
description = "A purple gaseous element."
reagent_state = GAS
color = "#493062"
-datum/reagent/carpet
+/datum/reagent/carpet
name = "Carpet"
id = "carpet"
description = "A covering of thick fabric used on floors. This type looks particularly gross."
reagent_state = LIQUID
color = "#701345"
-/datum/reagent/carpet/reaction_turf(var/turf/simulated/T, var/volume)
+/datum/reagent/carpet/reaction_turf(turf/simulated/T, volume)
if(istype(T, /turf/simulated/floor/plating) || istype(T, /turf/simulated/floor/plasteel))
var/turf/simulated/floor/F = T
F.ChangeTurf(/turf/simulated/floor/carpet)
..()
- return
-datum/reagent/bromine
+/datum/reagent/bromine
name = "Bromine"
id = "bromine"
description = "A red-brown liquid element."
reagent_state = LIQUID
color = "#4E3A3A"
-datum/reagent/phenol
+/datum/reagent/phenol
name = "Phenol"
id = "phenol"
description = "Also known as carbolic acid, this is a useful building block in organic chemistry."
reagent_state = LIQUID
color = "#525050"
-datum/reagent/ash
+/datum/reagent/ash
name = "Ash"
id = "ash"
description = "Ashes to ashes, dust to dust."
reagent_state = LIQUID
color = "#191919"
-datum/reagent/acetone
+/datum/reagent/acetone
name = "Acetone"
id = "acetone"
description = "Pure 100% nail polish remover, also works as an industrial solvent."
reagent_state = LIQUID
color = "#474747"
-/datum/reagent/acetone/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/acetone/on_mob_life(mob/living/M)
M.adjustToxLoss(1.5)
..()
- return
/datum/chemical_reaction/acetone
name = "acetone"
@@ -111,7 +108,7 @@ datum/reagent/acetone
mix_sound = null
no_message = 1
-datum/reagent/colorful_reagent
+/datum/reagent/colorful_reagent
name = "Colorful Reagent"
id = "colorful_reagent"
description = "It's pure liquid colors. That's a thing now."
@@ -126,22 +123,20 @@ datum/reagent/colorful_reagent
result_amount = 6
mix_message = "The substance flashes multiple colors and emits the smell of a pocket protector."
-datum/reagent/colorful_reagent/reaction_mob(var/mob/living/simple_animal/M, var/method=TOUCH, var/volume)
+/datum/reagent/colorful_reagent/reaction_mob(mob/living/simple_animal/M, method=TOUCH, volume)
if(M && istype(M))
M.color = pick(random_color_list)
..()
- return
-datum/reagent/colorful_reagent/reaction_obj(var/obj/O, var/volume)
+/datum/reagent/colorful_reagent/reaction_obj(obj/O, volume)
if(O)
O.color = pick(random_color_list)
..()
- return
-datum/reagent/colorful_reagent/reaction_turf(var/turf/T, var/volume)
+
+/datum/reagent/colorful_reagent/reaction_turf(turf/T, volume)
if(T)
T.color = pick(random_color_list)
..()
- return
/datum/chemical_reaction/corgium
name = "corgium"
@@ -151,19 +146,17 @@ datum/reagent/colorful_reagent/reaction_turf(var/turf/T, var/volume)
result_amount = 3
min_temp = 374
-datum/reagent/corgium
+/datum/reagent/corgium
name = "Corgium"
id = "corgium"
description = "Corgi in liquid form. Don't ask."
reagent_state = LIQUID
color = "#F9A635"
-/datum/chemical_reaction/corgium/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/corgium/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
new /mob/living/simple_animal/pet/corgi(location)
..()
- return
-
/datum/chemical_reaction/flaptonium
name = "Flaptonium"
@@ -174,14 +167,12 @@ datum/reagent/corgium
min_temp = 374
mix_message = "The substance turns an airy sky-blue and foams up into a new shape."
-/datum/chemical_reaction/flaptonium/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/flaptonium/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
new /mob/living/simple_animal/parrot(location)
..()
- return
-
-datum/reagent/hair_dye
+/datum/reagent/hair_dye
name = "Quantum Hair Dye"
id = "hair_dye"
description = "A rather tubular and gnarly way of coloring totally bodacious hair. Duuuudddeee."
@@ -195,7 +186,7 @@ datum/reagent/hair_dye
required_reagents = list("colorful_reagent" = 1, "hairgrownium" = 1)
result_amount = 2
-datum/reagent/hair_dye/reaction_mob(var/mob/living/M, var/volume)
+/datum/reagent/hair_dye/reaction_mob(mob/living/M, volume)
if(M && ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
@@ -208,9 +199,8 @@ datum/reagent/hair_dye/reaction_mob(var/mob/living/M, var/volume)
H.update_hair()
H.update_fhair()
..()
- return
-datum/reagent/hairgrownium
+/datum/reagent/hairgrownium
name = "Hairgrownium"
id = "hairgrownium"
description = "A mysterious chemical purported to help grow hair. Often found on late-night TV infomercials."
@@ -226,7 +216,7 @@ datum/reagent/hairgrownium
result_amount = 3
mix_message = "The liquid becomes slightly hairy."
-datum/reagent/hairgrownium/reaction_mob(var/mob/living/M, var/volume)
+/datum/reagent/hairgrownium/reaction_mob(mob/living/M, volume)
if(M && ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
@@ -235,9 +225,8 @@ datum/reagent/hairgrownium/reaction_mob(var/mob/living/M, var/volume)
H.update_hair()
H.update_fhair()
..()
- return
-datum/reagent/super_hairgrownium
+/datum/reagent/super_hairgrownium
name = "Super Hairgrownium"
id = "super_hairgrownium"
description = "A mysterious and powerful chemical purported to cause rapid hair growth."
@@ -254,7 +243,7 @@ datum/reagent/super_hairgrownium
result_amount = 3
mix_message = "The liquid becomes amazingly furry and smells peculiar."
-datum/reagent/super_hairgrownium/reaction_mob(var/mob/living/M, var/volume)
+/datum/reagent/super_hairgrownium/reaction_mob(mob/living/M, volume)
if(M && ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
@@ -278,9 +267,8 @@ datum/reagent/super_hairgrownium/reaction_mob(var/mob/living/M, var/volume)
H.equip_to_slot(fakemoustache, slot_wear_mask)
to_chat(H, "Hair bursts forth from your every follicle!")
..()
- return
-datum/reagent/fartonium
+/datum/reagent/fartonium
name = "Fartonium"
id = "fartonium"
description = "Oh god it never ends, IT NEVER STOPS!"
@@ -295,9 +283,7 @@ datum/reagent/fartonium
result_amount = 2
mix_message = "The substance makes a little 'toot' noise and starts to smell pretty bad."
-datum/reagent/fartonium/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
-
+/datum/reagent/fartonium/on_mob_life(mob/living/M)
if(prob(66))
M.emote("fart")
@@ -312,8 +298,6 @@ datum/reagent/fartonium/on_mob_life(var/mob/living/M as mob)
M.emote("scream")
M.adjustBruteLoss(4)
..()
- return
-
/datum/chemical_reaction/soapification
name = "Soapification"
@@ -327,7 +311,6 @@ datum/reagent/fartonium/on_mob_life(var/mob/living/M as mob)
/datum/chemical_reaction/soapification/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
new /obj/item/weapon/soap/homemade(location)
- return
/datum/chemical_reaction/candlefication
name = "Candlefication"
@@ -340,8 +323,6 @@ datum/reagent/fartonium/on_mob_life(var/mob/living/M as mob)
/datum/chemical_reaction/candlefication/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
new /obj/item/candle(location)
- return
-
/datum/chemical_reaction/meatification
name = "Meatification"
@@ -353,7 +334,6 @@ datum/reagent/fartonium/on_mob_life(var/mob/living/M as mob)
/datum/chemical_reaction/meatification/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatproduct(location)
- return
/datum/chemical_reaction/lye
name = "lye"
@@ -376,12 +356,10 @@ datum/reagent/fartonium/on_mob_life(var/mob/living/M as mob)
reagent_state = LIQUID
color = "#FF83A5"
-/datum/reagent/love/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+/datum/reagent/love/reaction_mob(mob/living/M, method=TOUCH, volume)
to_chat(M, "You feel loved! ")
-/datum/reagent/love/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
-
+/datum/reagent/love/on_mob_life(mob/living/M)
if(M.a_intent == I_HARM)
M.a_intent = I_HELP
@@ -410,35 +388,35 @@ datum/reagent/fartonium/on_mob_life(var/mob/living/M as mob)
///Alchemical Reagents
-datum/reagent/eyenewt
+/datum/reagent/eyenewt
name = "Eye of newt"
id = "eyenewt"
description = "A potent alchemic ingredient."
reagent_state = LIQUID
color = "#050519"
-datum/reagent/toefrog
+/datum/reagent/toefrog
name = "Toe of frog"
id = "toefrog"
description = "A potent alchemic ingredient."
reagent_state = LIQUID
color = "#092D09"
-datum/reagent/woolbat
+/datum/reagent/woolbat
name = "Wool of bat"
id = "woolbat"
description = "A potent alchemic ingredient."
reagent_state = LIQUID
color = "#080808"
-datum/reagent/tonguedog
+/datum/reagent/tonguedog
name = "Tongue of dog"
id = "tonguedog"
description = "A potent alchemic ingredient."
reagent_state = LIQUID
color = "#2D0909"
-datum/reagent/triplepiss
+/datum/reagent/triplepiss
name = "Triplepiss"
id = "triplepiss"
description = "Ewwwwwwwww."
diff --git a/code/modules/reagents/newchem/paradise_pop.dm b/code/modules/reagents/newchem/paradise_pop.dm
new file mode 100644
index 00000000000..055b96020db
--- /dev/null
+++ b/code/modules/reagents/newchem/paradise_pop.dm
@@ -0,0 +1,139 @@
+
+/*
+ Paradise Pop reagents
+ Created through the bottler machine via bottler_recipes, not through standard reactions
+ Eventually will have special effects (minor mostly) tied to their reagents, but for now are purely for flavor
+
+ Make sure to yell at me to finish giving them effects later
+ -FalseIncarnate
+*/
+
+
+//Paradise Punch: No effect, aside from maybe messages about how tasty it is or something
+/datum/reagent/paradise_punch
+ name = "Paradise Punch"
+ id = "paradise_punch"
+ description = "Tastes just how you'd think Paradise would if you could bottle it."
+ reagent_state = LIQUID
+ color = "#cc0044"
+
+//Apple-pocalypse: Low chance to cause a goonchem vortex that pulls things within a very small radius (2 tiles?) towards the drinker
+/datum/reagent/apple_pocalypse
+ name = "Apple-pocalypse"
+ id = "apple-pocalypse"
+ description = "If doomsday came in fruit form, it'd probably be apples."
+ reagent_state = LIQUID
+ color = "#44FF44"
+
+/datum/reagent/apple_pocalypse/on_mob_life(mob/living/M)
+ if(prob(1))
+ var/turf/simulated/T = get_turf(M)
+ goonchem_vortex(T, 0, 2, 1)
+ to_chat(M, "You briefly feel super-massive, like a black hole. Probably just your imagination... ")
+ ..()
+
+//Berry Banned: This one is tasty and safe to drink, might have a low chance of healing a random damage type?
+/datum/reagent/berry_banned
+ name = "Berry Banned"
+ id = "berry_banned"
+ description = "Reason for ban: Excessive Flavor."
+ reagent_state = LIQUID
+ color = "#FF44FF"
+
+/datum/reagent/berry_banned/on_mob_life(mob/living/M)
+ if(prob(10))
+ var/heal_type = rand(0, 5) //still prefer the string version
+ switch(heal_type)
+ if(0)
+ M.adjustBruteLoss(-0.5*REM)
+ if(1)
+ M.adjustFireLoss(-0.5*REM)
+ if(2)
+ M.adjustToxLoss(-0.5*REM)
+ if(3)
+ M.adjustOxyLoss(-0.5*REM)
+ if(4)
+ M.adjustCloneLoss(-0.5*REM)
+ if(5)
+ M.adjustBrainLoss(-1*REM)
+ to_chat(M, "You feel slightly rejuvinated! ")
+ ..()
+
+//Berry Banned 2: This one is tasty and toxic. Deals toxin damage and MAYBE plays the "BWOINK!" sound if it kills someone?
+/datum/reagent/berry_banned2
+ name = "Berry Banned"
+ id = "berry_banned2"
+ description = "Reason for ban: Excessive Flavor."
+ reagent_state = LIQUID
+ color = "#FF44FF"
+
+/datum/reagent/berry_banned2/on_mob_life(mob/living/M)
+ if(prob(50))
+ M.adjustToxLoss(2*REM) //double strength of poison berry juice alone, because it's concentrated (this is equal to the damage of normal toxin, less often)
+ if(prob(10))
+ to_chat(M, "You feel slightly rejuvinated! ") //meta this!
+ ..()
+
+/datum/reagent/berry_banned2/on_mob_death(mob/living/M)
+ M << sound('sound/effects/adminhelp.ogg',0,1,0,25)
+ to_chat(M, "PM from-Administrator : BWOINK! ")
+ ..()
+
+//Blackeye Brew: Chance to make the drinker say greytider-themed things like "I thought clown was valid!"
+/datum/reagent/blackeye_brew
+ name = "Blackeye Brew"
+ id = "blackeye_brew"
+ description = "Creamy, smooth flavor, just like the bald heads of the masses. Supposedly aged for 30 years."
+ reagent_state = LIQUID
+ color = "#4d2600"
+
+/datum/reagent/blackeye_brew/on_mob_life(mob/living/M)
+ if(prob(25))
+ var/list/tider_talk = list("CLOWN IS VALID, RIGHT?",
+ "SHITMINS! SHITMINS! SHITMINS!",
+ "FURRIES ARE OPPRESSED!",
+ "I OWN THIS SERVER NOW, I JUST BOUGHT IT.",
+ "SECRET TECHNIQUE: TOOLBOX TO THE FACE!",
+ "SECRET TECHNIQUE: PLASMA CANISTER FIRE!",
+ "SECRET TECHNIQUE: TABLE AND DISPOSAL!",
+ "[pick("MY BROTHER", " MY DOG", "MY BEST FRIEND", "THE BORER", "GEORGE MELONS", "SHITMINS")] DID IT!",
+ "WHAT DO YOU MEAN [pick("Barrack Obama", "John Cena", "Hughe Jass", "Hitler", "xX360noscopeXx")] ISN'T AN ACCEPTABLE NAME?",
+ "WHAT THE FUCK DID YOU JUST FUCKING SAY ABOUT ME, YOU LITTLE BITCH? I'LL HAVE YOU KNOW I GRADUATED TOP OF MY CLASS IN...")
+ M.say(pick(tider_talk))
+ ..()
+
+//Grape Granade: causes the drinker to sometimes burp, has a low chance to cause a goonchem vortex that pushes things within a very small radius (1-2 tiles) away from the drinker
+/datum/reagent/grape_granade
+ name = "Grape Granade"
+ id = "grape_granade"
+ description = "Exploding with grape flavor and a favorite among ERT members system-wide."
+ reagent_state = LIQUID
+ color = "#9933ff"
+
+/datum/reagent/grape_granade/on_mob_life(mob/living/M)
+ if(prob(1))
+ var/turf/simulated/T = get_turf(M)
+ goonchem_vortex(T, 1, 1, 2)
+ M.emote("burp")
+ to_chat(M, "You feel ready to burst! Oh wait, just a burp... ")
+ else if(prob(25))
+ M.emote("burp")
+ ..()
+
+//Meteor Malt: Sometimes causes screen shakes for the drinker like a meteor impact, low chance to add 1-5 units of a random mineral reagent to the drinker's blood (iron, copper, silver, gold, uranium, carbon, etc)
+/datum/reagent/meteor_malt
+ name = "Meteor Malt"
+ id = "meteor_malt"
+ description = "Soft drinks have been detected on collision course with your tastebuds."
+ reagent_state = LIQUID
+ color = "#cc9900"
+
+/datum/reagent/meteor_malt/on_mob_life(mob/living/M)
+ if(prob(25))
+ M << sound('sound/effects/meteorimpact.ogg',0,1,0,25)
+ shake_camera(M, 3, 1)
+ if(prob(5))
+ var/amount = rand(1, 5)
+ var/mineral = pick("copper", "iron", "gold", "carbon", "silver", "aluminum", "silicon", "sodiumchloride", "plasma")
+ M.reagents.add_reagent(mineral, amount)
+ ..()
diff --git a/code/modules/reagents/newchem/patch.dm b/code/modules/reagents/newchem/patch.dm
index 793b6f8ae6f..2392dd26db5 100644
--- a/code/modules/reagents/newchem/patch.dm
+++ b/code/modules/reagents/newchem/patch.dm
@@ -18,34 +18,23 @@
desc = "Helps with brute injuries."
icon_state = "bandaid_brute"
instant_application = 1
-
-/obj/item/weapon/reagent_containers/food/pill/patch/styptic/New()
- ..()
- reagents.add_reagent("styptic_powder", 40)
+ list_reagents = list("styptic_powder" = 40)
/obj/item/weapon/reagent_containers/food/pill/patch/silver_sulf
name = "burn patch"
desc = "Helps with burn injuries."
icon_state = "bandaid_burn"
instant_application = 1
-
-/obj/item/weapon/reagent_containers/food/pill/patch/silver_sulf/New()
- ..()
- reagents.add_reagent("silver_sulfadiazine", 40)
+ list_reagents = list("silver_sulfadiazine" = 40)
/obj/item/weapon/reagent_containers/food/pill/patch/synthflesh
name = "syntheflesh patch"
desc = "Helps with burn injuries."
+ icon_state = "bandaid_med"
instant_application = 1
-
-/obj/item/weapon/reagent_containers/food/pill/patch/synthflesh/New()
- ..()
- reagents.add_reagent("synthflesh", 20)
+ list_reagents = list("synthflesh" = 20)
/obj/item/weapon/reagent_containers/food/pill/patch/nicotine
name = "nicotine patch"
desc = "Helps temporarily curb the cravings of nicotine dependency."
-
-/obj/item/weapon/reagent_containers/food/pill/patch/nicotine/New()
- ..()
- reagents.add_reagent("nicotine", 20)
\ No newline at end of file
+ list_reagents = list("nicotine" = 20)
\ No newline at end of file
diff --git a/code/modules/reagents/newchem/pyro.dm b/code/modules/reagents/newchem/pyro.dm
index 655b8e996eb..96cbecf3680 100644
--- a/code/modules/reagents/newchem/pyro.dm
+++ b/code/modules/reagents/newchem/pyro.dm
@@ -36,20 +36,17 @@
result_amount = 2
min_temp = 424
-/datum/reagent/clf3/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/clf3/on_mob_life(mob/living/M)
M.adjust_fire_stacks(4)
M.adjustFireLoss(0.35*M.fire_stacks)
..()
- return
-/datum/chemical_reaction/clf3/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/clf3/on_reaction(datum/reagents/holder, created_volume)
var/turf/T = get_turf(holder.my_atom)
for(var/turf/turf in range(1,T))
new /obj/effect/hotspot(turf)
- return
-/datum/reagent/clf3/reaction_turf(var/turf/simulated/T, var/volume)
+/datum/reagent/clf3/reaction_turf(turf/simulated/T, volume)
if(istype(T, /turf/simulated/floor/plating))
var/turf/simulated/floor/plating/F = T
if(prob(1))
@@ -66,14 +63,12 @@
W.ChangeTurf(/turf/simulated/floor)
if(istype(T, /turf/simulated/shuttle/))
new /obj/effect/hotspot(T)
- return
-/datum/reagent/clf3/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+/datum/reagent/clf3/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == TOUCH && isliving(M))
M.adjust_fire_stacks(5)
M.IgniteMob()
M.bodytemperature += 30
- return
/datum/reagent/sorium
name = "Sorium"
@@ -96,11 +91,11 @@
required_reagents = list("sorium" = 1)
min_temp = 474
-/datum/chemical_reaction/sorium_vortex/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
goonchem_vortex(T, 1, 5, 6)
-/datum/chemical_reaction/sorium/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/sorium/on_reaction(datum/reagents/holder, created_volume)
if(holder.has_reagent("stabilizing_agent"))
return
holder.remove_reagent("sorium", created_volume)
@@ -128,19 +123,18 @@
required_reagents = list("liquid_dark_matter" = 1)
min_temp = 474
-/datum/chemical_reaction/ldm_vortex/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
goonchem_vortex(T, 0, 5, 6)
- return
-/datum/chemical_reaction/liquid_dark_matter/on_reaction(var/datum/reagents/holder, var/created_volume)
+
+/datum/chemical_reaction/liquid_dark_matter/on_reaction(datum/reagents/holder, created_volume)
if(holder.has_reagent("stabilizing_agent"))
return
holder.remove_reagent("liquid_dark_matter", created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
goonchem_vortex(T, 0, 5, 6)
- return
-/proc/goonchem_vortex(var/turf/simulated/T, var/setting_type, var/range, var/pull_times)
+/proc/goonchem_vortex(turf/simulated/T, setting_type, range, pull_times)
for(var/atom/movable/X in orange(range, T))
if(istype(X, /obj/effect))
continue //stop pulling smoke and hotspots please
@@ -182,21 +176,19 @@
no_message = 1
mix_sound = null
-datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
+/datum/reagent/blackpowder/reaction_turf(turf/T, volume) //oh shit
src = null
if(volume >= 5)
if(!locate(/obj/effect/decal/cleanable/dirt/blackpowder) in get_turf(T)) //let's not have hundreds of decals of black powder on the same turf
new /obj/effect/decal/cleanable/dirt/blackpowder(T)
- return
-/datum/chemical_reaction/blackpowder_explosion/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/blackpowder_explosion/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(2, 1, location)
s.start()
sleep(rand(20,30))
blackpowder_detonate(holder, created_volume)
- return
/*
/datum/reagent/blackpowder/on_ex_act()
@@ -209,7 +201,7 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
holder.remove_reagent("blackpowder", volume)
return */
-/proc/blackpowder_detonate(var/datum/reagents/holder, var/created_volume)
+/proc/blackpowder_detonate(datum/reagents/holder, created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
var/ex_severe = round(created_volume / 100)
var/ex_heavy = round(created_volume / 42)
@@ -220,7 +212,6 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
if(istype(holder.my_atom, /obj/effect/decal/cleanable/dirt/blackpowder))
spawn(0)
qdel(holder.my_atom)
- return
/datum/reagent/flash_powder
name = "Flash Powder"
@@ -243,7 +234,7 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
required_reagents = list("flash_powder" = 1)
min_temp = 374
-/datum/chemical_reaction/flash_powder_flash/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/flash_powder_flash/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(2, 1, location)
@@ -256,7 +247,7 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
C.Stun(5)
-/datum/chemical_reaction/flash_powder/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/flash_powder/on_reaction(datum/reagents/holder, created_volume)
if(holder.has_reagent("stabilizing_agent"))
return
var/location = get_turf(holder.my_atom)
@@ -295,7 +286,7 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
mix_message = "The mixture quickly turns into a pall of smoke!"
var/forbidden_reagents = list("sugar", "phosphorus", "potassium", "stimulants") //Do not transfer this stuff through smoke.
-/datum/chemical_reaction/smoke/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/smoke/on_reaction(datum/reagents/holder, created_volume)
for(var/f_reagent in forbidden_reagents)
if(holder.has_reagent(f_reagent))
holder.remove_reagent(f_reagent, holder.get_reagent_amount(f_reagent))
@@ -316,7 +307,6 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
S.start(4)
if(holder && holder.my_atom)
holder.clear_reagents()
- return
/datum/chemical_reaction/smoke/smoke_powder
name = "smoke_powder_smoke"
@@ -350,7 +340,7 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
required_reagents = list("sonic_powder" = 1)
min_temp = 374
-/datum/chemical_reaction/sonic_powder_deafen/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/sonic_powder_deafen/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
playsound(location, 'sound/effects/bang.ogg', 25, 1)
for(var/mob/living/M in hearers(5, location))
@@ -366,18 +356,17 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
if(!ear_safety)
M.Stun(max(10/distance, 3))
M.Weaken(max(10/distance, 3))
- M.ear_damage += rand(0, 5)
- M.ear_deaf = max(M.ear_deaf,15)
- if (M.ear_damage >= 15)
+ M.setEarDamage(M.ear_damage + rand(0, 5), max(M.ear_deaf,15))
+ if(M.ear_damage >= 15)
to_chat(M, "Your ears start to ring badly! ")
if(prob(M.ear_damage - 10 + 5))
to_chat(M, "You can't hear anything! ")
M.disabilities |= DEAF
else
- if (M.ear_damage >= 5)
+ if(M.ear_damage >= 5)
to_chat(M, "Your ears start to ring! ")
-/datum/chemical_reaction/sonic_powder/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/sonic_powder/on_reaction(datum/reagents/holder, created_volume)
if(holder.has_reagent("stabilizing_agent"))
return
var/location = get_turf(holder.my_atom)
@@ -395,15 +384,14 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
if(!ear_safety)
M.Stun(max(10/distance, 3))
M.Weaken(max(10/distance, 3))
- M.ear_damage += rand(0, 5)
- M.ear_deaf = max(M.ear_deaf,15)
- if (M.ear_damage >= 15)
+ M.setEarDamage(M.ear_damage + rand(0, 5), max(M.ear_deaf,15))
+ if(M.ear_damage >= 15)
to_chat(M, "Your ears start to ring badly! ")
if(prob(M.ear_damage - 10 + 5))
to_chat(M, "You can't hear anything! ")
M.disabilities |= DEAF
else
- if (M.ear_damage >= 5)
+ if(M.ear_damage >= 5)
to_chat(M, "Your ears start to ring! ")
holder.remove_reagent("sonic_powder", created_volume)
@@ -422,21 +410,18 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
required_reagents = list("phosphorus" = 1, "sacid" = 1, "plasma" = 1)
result_amount = 3
-/datum/chemical_reaction/phlogiston/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/phlogiston/on_reaction(datum/reagents/holder, created_volume)
if(holder.has_reagent("stabilizing_agent"))
return
var/turf/simulated/T = get_turf(holder.my_atom)
for(var/turf/simulated/turf in range(min(created_volume/10,4),T))
new /obj/effect/hotspot(turf)
- return
-/datum/reagent/phlogiston/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/phlogiston/on_mob_life(mob/living/M)
M.adjust_fire_stacks(1)
M.IgniteMob()
M.adjustFireLoss(0.2*M.fire_stacks)
..()
- return
/datum/reagent/napalm
name = "Napalm"
@@ -446,16 +431,13 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
color = "#FF9999"
process_flags = ORGANIC | SYNTHETIC
-/datum/reagent/napalm/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/napalm/on_mob_life(mob/living/M)
M.adjust_fire_stacks(1)
..()
- return
-/datum/reagent/napalm/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+/datum/reagent/napalm/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == TOUCH && isliving(M))
M.adjust_fire_stacks(7)
- return
/datum/chemical_reaction/napalm
name = "Napalm"
@@ -464,7 +446,7 @@ datum/reagent/blackpowder/reaction_turf(var/turf/T, var/volume) //oh shit
required_reagents = list("sugar" = 1, "fuel" = 1, "ethanol" = 1 )
result_amount = 1
-datum/reagent/cryostylane
+/datum/reagent/cryostylane
name = "Cryostylane"
id = "cryostylane"
description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K."
@@ -479,27 +461,25 @@ datum/reagent/cryostylane
result_amount = 3
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-datum/reagent/cryostylane/on_mob_life(var/mob/living/M as mob) //TODO: code freezing into an ice cube
+/datum/reagent/cryostylane/on_mob_life(mob/living/M) //TODO: code freezing into an ice cube
if(M.reagents.has_reagent("oxygen"))
M.reagents.remove_reagent("oxygen", 1)
M.bodytemperature -= 30
..()
- return
-datum/reagent/cryostylane/on_tick()
+/datum/reagent/cryostylane/on_tick()
if(holder.has_reagent("oxygen"))
holder.remove_reagent("oxygen", 1)
holder.chem_temp -= 10
holder.handle_reactions()
..()
- return
-datum/reagent/cryostylane/reaction_turf(var/turf/simulated/T, var/volume)
+/datum/reagent/cryostylane/reaction_turf(turf/simulated/T, volume)
if(volume >= 5)
for(var/mob/living/carbon/slime/M in T)
M.adjustToxLoss(rand(15,30))
-datum/reagent/pyrosium
+/datum/reagent/pyrosium
name = "Pyrosium"
id = "pyrosium"
description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly cools all other reagents in the mob down to 0K."
@@ -513,20 +493,18 @@ datum/reagent/pyrosium
required_reagents = list("plasma" = 1, "radium" = 1, "phosphorus" = 1)
result_amount = 3
-datum/reagent/pyrosium/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/pyrosium/on_mob_life(mob/living/M)
if(M.reagents.has_reagent("oxygen"))
M.reagents.remove_reagent("oxygen", 1)
M.bodytemperature += 30
..()
- return
-datum/reagent/pyrosium/on_tick()
+/datum/reagent/pyrosium/on_tick()
if(holder.has_reagent("oxygen"))
holder.remove_reagent("oxygen", 1)
holder.chem_temp += 10
holder.handle_reactions()
..()
- return
/datum/chemical_reaction/azide
name = "azide"
@@ -535,13 +513,13 @@ datum/reagent/pyrosium/on_tick()
required_reagents = list("chlorine" = 1, "oxygen" = 1, "nitrogen" = 1, "ammonia" = 1, "sodium" = 1, "silver" = 1)
result_amount = 1
mix_message = "The substance violently detonates!"
+ mix_sound = 'sound/effects/bang.ogg'
-/datum/chemical_reaction/azide/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/azide/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
- explosion(location,0,1,4)
- return
+ explosion(location, 0, 1, 4)
-datum/reagent/firefighting_foam
+/datum/reagent/firefighting_foam
name = "Firefighting foam"
id = "firefighting_foam"
description = "Carbon Tetrachloride is a foam used for fire suppression."
@@ -558,7 +536,7 @@ datum/reagent/firefighting_foam
mix_message = "The mixture bubbles gently."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-datum/reagent/firefighting_foam/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+/datum/reagent/firefighting_foam/reaction_mob(mob/living/M, method=TOUCH, volume)
if(!istype(M, /mob/living))
return
@@ -567,10 +545,10 @@ datum/reagent/firefighting_foam/reaction_mob(var/mob/living/M, var/method=TOUCH,
M.adjust_fire_stacks(-(volume / 5)) // more effective than water
if(M.fire_stacks <= 0)
M.ExtinguishMob()
- return
-datum/reagent/firefighting_foam/reaction_turf(var/turf/simulated/T, var/volume)
- if (!istype(T)) return
+/datum/reagent/firefighting_foam/reaction_turf(turf/simulated/T, volume)
+ if(!istype(T))
+ return
var/CT = cooling_temperature
src = null
if(!istype(T, /turf/space))
@@ -582,9 +560,8 @@ datum/reagent/firefighting_foam/reaction_turf(var/turf/simulated/T, var/volume)
lowertemp.react()
T.assume_air(lowertemp)
qdel(hotspot)
- return
-datum/reagent/firefighting_foam/reaction_obj(var/obj/O, var/volume)
+/datum/reagent/firefighting_foam/reaction_obj(obj/O, volume)
src = null
var/turf/T = get_turf(O)
var/hotspot = (locate(/obj/effect/hotspot) in T)
@@ -594,7 +571,6 @@ datum/reagent/firefighting_foam/reaction_obj(var/obj/O, var/volume)
lowertemp.react()
T.assume_air(lowertemp)
qdel(hotspot)
- return
/datum/chemical_reaction/clf3_firefighting
name = "clf3_firefighting"
@@ -603,11 +579,11 @@ datum/reagent/firefighting_foam/reaction_obj(var/obj/O, var/volume)
required_reagents = list("firefighting_foam" = 1, "clf3" = 1)
result_amount = 1
mix_message = "The substance violently detonates!"
+ mix_sound = 'sound/effects/bang.ogg'
-/datum/chemical_reaction/clf3_firefighting/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/clf3_firefighting/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
- explosion(location,-1,0,2)
- return
+ explosion(location, -1, 0, 2)
/datum/chemical_reaction/shock_explosion
name = "shock_explosion"
@@ -618,14 +594,13 @@ datum/reagent/firefighting_foam/reaction_obj(var/obj/O, var/volume)
mix_message = "The reaction releases an electrical blast! "
mix_sound = 'sound/magic/lightningbolt.ogg'
-/datum/chemical_reaction/shock_explosion/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/shock_explosion/on_reaction(datum/reagents/holder, created_volume)
var/turf/T = get_turf(holder.my_atom)
for(var/mob/living/carbon/C in view(6, T))
C.Beam(T,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5) //What? Why are we beaming from the mob to the turf? Turf to mob generates really odd results.
C.electrocute_act(3.5, "electrical blast")
holder.del_reagent("teslium") //Clear all remaining Teslium and Uranium, but leave all other reagents untouched.
holder.del_reagent("uranium")
- return
/datum/reagent/plasma_dust
name = "Plasma Dust"
diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm
index ae8b80ac1cd..e9729b47f10 100644
--- a/code/modules/reagents/newchem/toxins.dm
+++ b/code/modules/reagents/newchem/toxins.dm
@@ -13,11 +13,9 @@
metabolization_rate = 0.1
penetrates_skin = 1
-/datum/reagent/polonium/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/polonium/on_mob_life(mob/living/M)
M.apply_effect(8, IRRADIATE, negate_armor = 1)
..()
- return
/datum/reagent/histamine
@@ -29,7 +27,7 @@
metabolization_rate = 0.2
overdose_threshold = 40
-/datum/reagent/histamine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) //dumping histamine on someone is VERY mean.
+/datum/reagent/histamine/reaction_mob(mob/living/M, method=TOUCH, volume) //dumping histamine on someone is VERY mean.
if(iscarbon(M))
if(method == TOUCH)
M.reagents.add_reagent("histamine",10)
@@ -37,8 +35,7 @@
to_chat(M, "You feel a burning sensation in your throat... ")
M.emote("drool")
-/datum/reagent/histamine/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/histamine/on_mob_life(mob/living/M)
if(prob(20))
M.emote(pick("twitch", "grumble", "sneeze", "cough"))
if(prob(10))
@@ -53,9 +50,8 @@
to_chat(M, "You're getting a rash! ")
M.adjustBruteLoss(2)
..()
- return
-/datum/reagent/histamine/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/histamine/overdose_process(mob/living/M, severity)
var/effect = ..()
if(severity == 1)
if(effect <= 2)
@@ -103,13 +99,11 @@
color = "#DED6D0"
penetrates_skin = 1
-/datum/reagent/formaldehyde/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/formaldehyde/on_mob_life(mob/living/M)
M.adjustToxLoss(1*REM)
if(prob(10))
M.reagents.add_reagent("histamine",rand(5,15))
..()
- return
/datum/chemical_reaction/formaldehyde
name = "formaldehyde"
@@ -129,8 +123,7 @@
metabolization_rate = 0.2
overdose_threshold = 40
-/datum/reagent/venom/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/venom/on_mob_life(mob/living/M)
if(prob(25))
M.reagents.add_reagent("histamine",rand(5,10))
if(volume < 20)
@@ -142,9 +135,8 @@
M.adjustToxLoss(2)
M.adjustBruteLoss(2)
..()
- return
-/datum/reagent/venom/overdose_process(var/mob/living/M as mob)
+/datum/reagent/venom/overdose_process(mob/living/M)
if(volume >= 40)
if(prob(4))
M.visible_message("[M] starts convulsing violently! ", "You feel as if your body is tearing itself apart!")
@@ -161,7 +153,7 @@
color = "#60A584"
metabolization_rate = 1
-/datum/reagent/neurotoxin2/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/neurotoxin2/on_mob_life(mob/living/M)
switch(current_cycle)
if(1 to 4)
current_cycle++
@@ -189,7 +181,6 @@
M.emote("drool")
M.adjustToxLoss(1)
..()
- return
/datum/chemical_reaction/neurotoxin2
name = "neurotoxin2"
@@ -210,8 +201,7 @@
metabolization_rate = 0.1
penetrates_skin = 1
-/datum/reagent/cyanide/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/cyanide/on_mob_life(mob/living/M)
M.adjustToxLoss(1.5*REM)
if(prob(5))
M.emote("drool")
@@ -224,7 +214,6 @@
M.Stun(2)
M.adjustToxLoss(2)
..()
- return
/datum/chemical_reaction/cyanide
name = "Cyanide"
@@ -236,12 +225,12 @@
mix_message = "The mixture gives off a faint scent of almonds."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-/datum/chemical_reaction/cyanide/on_reaction(var/datum/reagents/holder)
+/datum/chemical_reaction/cyanide/on_reaction(datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
T.visible_message("The solution generates a strong vapor! ")
for(var/mob/living/carbon/C in range(T, 1))
- if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT)))
- C.reagents.add_reagent("cyanide",7)
+ if(C.can_breathe_gas())
+ C.reagents.add_reagent("cyanide", 7)
/datum/reagent/itching_powder
name = "Itching Powder"
@@ -252,8 +241,7 @@
metabolization_rate = 0.3
penetrates_skin = 1
-/datum/reagent/itching_powder/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/itching_powder/on_mob_life(mob/living/M)
if(prob(25))
M.emote(pick("twitch", "laugh", "sneeze", "cry"))
if(prob(20))
@@ -277,7 +265,6 @@
M.visible_message("[M] falls to the floor, scratching themselves violently! ")
M.emote("scream")
..()
- return
/datum/chemical_reaction/itching_powder
name = "Itching Powder"
@@ -288,12 +275,10 @@
mix_message = "The mixture congeals and dries up, leaving behind an abrasive powder."
mix_sound = 'sound/effects/blobattack.ogg'
-/datum/reagent/facid/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/facid/on_mob_life(mob/living/M)
M.adjustToxLoss(1*REM)
M.adjustFireLoss(1)
..()
- return
/datum/reagent/facid
name = "Fluorosulfuric Acid"
@@ -303,7 +288,7 @@
color = "#4141D2"
process_flags = ORGANIC | SYNTHETIC
-/datum/reagent/facid/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+/datum/reagent/facid/reaction_mob(mob/living/M, method=TOUCH, volume)
if(!istype(M, /mob/living))
return //wooo more runtime fixin
if(method == TOUCH || method == INGEST)
@@ -347,7 +332,7 @@
H.emote("scream")
H.status_flags |= DISFIGURED
-/datum/reagent/facid/reaction_obj(var/obj/O, var/volume)
+/datum/reagent/facid/reaction_obj(obj/O, volume)
if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom)))
if(!O.unacidable)
var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc)
@@ -373,8 +358,7 @@
color = "#7F10C0"
metabolization_rate = 0.4
-/datum/reagent/initropidril/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/initropidril/on_mob_life(mob/living/M)
if(prob(33))
M.adjustToxLoss(rand(5,25))
if(prob(33))
@@ -395,7 +379,6 @@
if(!H.heart_attack)
H.heart_attack = 1 // rip in pepperoni
..()
- return
/datum/chemical_reaction/initropidril
name = "Initropidril"
@@ -414,8 +397,7 @@
color = "#AB1CCF"
metabolization_rate = 0.4
-/datum/reagent/concentrated_initro/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/concentrated_initro/on_mob_life(mob/living/M)
if(volume >=5)
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -430,8 +412,7 @@
color = "#1E4664"
metabolization_rate = 0.2
-/datum/reagent/pancuronium/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/pancuronium/on_mob_life(mob/living/M)
switch(current_cycle)
if(1 to 5)
if(prob(10))
@@ -454,7 +435,6 @@
to_chat(M, "You can't breathe! ")
M.losebreath += 3
..()
- return
/datum/reagent/sodium_thiopental
name = "Sodium Thiopental"
@@ -464,8 +444,7 @@
color = "#5F8BE1"
metabolization_rate = 0.7
-/datum/reagent/sodium_thiopental/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/sodium_thiopental/on_mob_life(mob/living/M)
switch(current_cycle)
if(1)
M.emote("drool")
@@ -482,7 +461,6 @@
M.emote("drool")
M.adjustBrainLoss(1)
..()
- return
/datum/reagent/ketamine
name = "Ketamine"
@@ -493,8 +471,7 @@
metabolization_rate = 0.8
penetrates_skin = 1
-/datum/reagent/ketamine/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/ketamine/on_mob_life(mob/living/M)
switch(current_cycle)
if(1 to 5)
if(prob(25))
@@ -509,7 +486,6 @@
if(11 to INFINITY)
M.Paralyse(25)
..()
- return
/datum/reagent/sulfonal
name = "Sulfonal"
@@ -528,8 +504,7 @@
mix_message = "The mixture gives off quite a stench."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-/datum/reagent/sulfonal/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/sulfonal/on_mob_life(mob/living/M)
M.jitteriness = max(0, M.jitteriness-30)
switch(current_cycle)
if(1 to 10)
@@ -546,7 +521,6 @@
M.drowsyness = max(M.drowsyness, 20)
M.adjustToxLoss(1)
..()
- return
/datum/reagent/amanitin
name = "Amanitin"
@@ -555,16 +529,9 @@
reagent_state = LIQUID
color = "#D9D9D9"
-/datum/reagent/amanitin/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- ..()
- return
-
-/datum/reagent/amanitin/reagent_deleted(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/amanitin/reagent_deleted(mob/living/M)
M.adjustToxLoss(current_cycle*rand(2,4))
..()
- return
/datum/reagent/lipolicide
name = "Lipolicide"
@@ -581,8 +548,7 @@
required_reagents = list("mercury" = 1, "diethylamine" = 1, "ephedrine" = 1)
result_amount = 3
-/datum/reagent/lipolicide/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/lipolicide/on_mob_life(mob/living/M)
if(!M.nutrition)
switch(rand(1,3))
if(1)
@@ -596,7 +562,6 @@
M.nutrition = max(0, M.nutrition-fat_to_burn)
M.overeatduration = 0
..()
- return
/datum/reagent/coniine
name = "Coniine"
@@ -606,12 +571,10 @@
color = "#C2D8CD"
metabolization_rate = 0.05
-/datum/reagent/coniine/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/coniine/on_mob_life(mob/living/M)
M.adjustToxLoss(2)
M.losebreath += 5
..()
- return
/datum/reagent/curare
name = "Curare"
@@ -622,8 +585,7 @@
metabolization_rate = 0.1
penetrates_skin = 1
-/datum/reagent/curare/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/curare/on_mob_life(mob/living/M)
M.adjustToxLoss(1)
M.adjustOxyLoss(1)
switch(current_cycle)
@@ -646,7 +608,6 @@
to_chat(M, "You can't [pick("breathe", "move", "feel your legs", "feel your face", "feel anything")]! ")
M.losebreath++
..()
- return
/datum/reagent/sarin
name = "Sarin"
@@ -668,15 +629,14 @@
min_temp = 374
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-/datum/chemical_reaction/sarin/on_reaction(var/datum/reagents/holder)
+/datum/chemical_reaction/sarin/on_reaction(datum/reagents/holder)
var/turf/T = get_turf(holder.my_atom)
T.visible_message("The solution generates a strong vapor! ")
for(var/mob/living/carbon/C in range(T, 2))
- if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT)))
- C.reagents.add_reagent("sarin",4)
+ if(C.can_breathe_gas())
+ C.reagents.add_reagent("sarin", 4)
-/datum/reagent/sarin/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/sarin/on_mob_life(mob/living/M)
switch(current_cycle)
if(1 to 15)
M.jitteriness += 20
@@ -721,7 +681,6 @@
M.adjustBrainLoss(1)
M.adjustFireLoss(1)
..()
- return
/datum/reagent/atrazine
name = "Atrazine"
@@ -730,14 +689,12 @@
reagent_state = LIQUID
color = "#17002D"
-/datum/reagent/atrazine/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/atrazine/on_mob_life(mob/living/M)
M.adjustToxLoss(2)
..()
- return
// Clear off wallrot fungi
-/datum/reagent/atrazine/reaction_turf(var/turf/T, var/volume)
+/datum/reagent/atrazine/reaction_turf(turf/T, volume)
if(istype(T, /turf/simulated/wall))
var/turf/simulated/wall/W = T
if(W.rotting)
@@ -749,7 +706,7 @@
for(var/mob/O in viewers(W, null))
O.show_message(text("\blue The fungi are completely dissolved by the solution!"), 1)
-/datum/reagent/atrazine/reaction_obj(var/obj/O, var/volume)
+/datum/reagent/atrazine/reaction_obj(obj/O, volume)
if(istype(O,/obj/structure/alien/weeds/))
var/obj/structure/alien/weeds/alien_weeds = O
alien_weeds.health -= rand(15,35) // Kills alien weeds pretty fast
@@ -760,7 +717,7 @@
if(prob(50)) qdel(O) //Kills kudzu too.
// Damage that is done to growing plants is separately at code/game/machinery/hydroponics at obj/item/hydroponics
-/datum/reagent/atrazine/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+/datum/reagent/atrazine/reaction_mob(mob/living/M, method=TOUCH, volume)
src = null
if(iscarbon(M))
var/mob/living/carbon/C = M
@@ -772,12 +729,10 @@
if(H.species.flags & IS_PLANT) //plantmen take a LOT of damage
H.adjustToxLoss(50)
..()
- return
else if(istype(M,/mob/living/simple_animal/diona)) //plantmen monkeys (diona) take EVEN MORE damage
var/mob/living/simple_animal/diona/D = M
- D.adjustToxLoss(100)
+ D.adjustHealth(100)
..()
- return
/datum/chemical_reaction/atrazine
name = "atrazine"
@@ -793,6 +748,7 @@
description = "A rare drug that causes the user to appear dead for some time."
reagent_state = LIQUID
color = "#60A584"
+ heart_rate_stop = 1
/datum/chemical_reaction/capulettium
name = "capulettium"
@@ -802,8 +758,7 @@
result_amount = 1
mix_message = "The smell of death wafts up from the solution."
-/datum/reagent/capulettium/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/capulettium/on_mob_life(mob/living/M)
switch(current_cycle)
if(1 to 5)
M.eye_blurry += 10
@@ -817,7 +772,6 @@
if(61 to INFINITY)
M.eye_blurry += 10
..()
- return
/datum/reagent/capulettium_plus
name = "Capulettium Plus"
@@ -825,6 +779,7 @@
description = "A rare and expensive drug that causes the user to appear dead for some time while they retain consciousness and vision."
reagent_state = LIQUID
color = "#60A584"
+ heart_rate_stop = 1
/datum/chemical_reaction/capulettium_plus
name = "capulettium_plus"
@@ -834,11 +789,9 @@
result_amount = 3
mix_message = "The solution begins to slosh about violently by itself."
-/datum/reagent/capulettium_plus/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/capulettium_plus/on_mob_life(mob/living/M)
M.silent = max(M.silent, 2)
..()
- return
/datum/reagent/toxic_slurry
name = "Toxic Slurry"
@@ -847,8 +800,7 @@
reagent_state = LIQUID
color = "#00C81E"
-/datum/reagent/toxic_slurry/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/toxic_slurry/on_mob_life(mob/living/M)
if(prob(10))
M.adjustToxLoss(rand(2.4))
if(prob(7))
@@ -857,7 +809,6 @@
if(prob(7))
M.fakevomit(1)
..()
- return
/datum/reagent/glowing_slurry
name = "Glowing Slurry"
@@ -866,7 +817,7 @@
reagent_state = LIQUID
color = "#00FD00"
-/datum/reagent/glowing_slurry/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //same as mutagen
+/datum/reagent/glowing_slurry/reaction_mob(mob/M, method=TOUCH, volume) //same as mutagen
if(!..()) return
if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
src = null
@@ -874,10 +825,8 @@
randmutb(M)
domutcheck(M, null)
M.UpdateAppearance()
- return
-/datum/reagent/glowing_slurry/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/glowing_slurry/on_mob_life(mob/living/M)
M.apply_effect(2, IRRADIATE, 0, negate_armor = 1)
if(prob(15))
randmutb(M)
@@ -886,7 +835,6 @@
domutcheck(M, null)
M.UpdateAppearance()
..()
- return
/datum/reagent/ants
name = "Ants"
@@ -896,7 +844,7 @@
color = "#993333"
process_flags = ORGANIC | SYNTHETIC
-/datum/reagent/ants/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume) //NOT THE ANTS
+/datum/reagent/ants/reaction_mob(mob/living/M, method=TOUCH, volume) //NOT THE ANTS
if(iscarbon(M))
if(method == TOUCH || method==INGEST)
to_chat(M, "OH SHIT ANTS!!!! ")
@@ -904,11 +852,9 @@
M.adjustBruteLoss(4)
-/datum/reagent/ants/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/ants/on_mob_life(mob/living/M)
M.adjustBruteLoss(2)
..()
- return
/datum/reagent/teslium //Teslium. Causes periodic shocks, and makes shocks against the target much more effective.
name = "Teslium"
@@ -938,9 +884,8 @@
min_temp = 400
mix_sound = null
-/datum/chemical_reaction/teslium/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/teslium/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(6, 1, location)
- s.start()
- return
\ No newline at end of file
+ s.start()
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/chemical_reaction/_chemical_reaction_base.dm b/code/modules/reagents/oldchem/chemical_reaction/_chemical_reaction_base.dm
index 6b5656c8dc5..3b4cc507415 100644
--- a/code/modules/reagents/oldchem/chemical_reaction/_chemical_reaction_base.dm
+++ b/code/modules/reagents/oldchem/chemical_reaction/_chemical_reaction_base.dm
@@ -19,5 +19,5 @@
var/mix_sound = 'sound/effects/bubbles.ogg'
var/no_message = 0
-/datum/chemical_reaction/proc/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume)
return
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm
index 10b5ff13344..1b69b88e071 100644
--- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm
+++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_drink.dm
@@ -44,7 +44,7 @@
name = "Patron"
id = "patron"
result = "patron"
- required_reagents = list("tequilla" = 10, "silver" = 1)
+ required_reagents = list("tequila" = 10, "silver" = 1)
result_amount = 10
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
@@ -228,15 +228,15 @@
name = "Brave Bull"
id = "bravebull"
result = "bravebull"
- required_reagents = list("tequilla" = 2, "kahlua" = 1)
+ required_reagents = list("tequila" = 2, "kahlua" = 1)
result_amount = 3
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
-/datum/chemical_reaction/tequilla_sunrise
- name = "Tequilla Sunrise"
- id = "tequillasunrise"
- result = "tequillasunrise"
- required_reagents = list("tequilla" = 2, "orangejuice" = 1)
+/datum/chemical_reaction/tequila_sunrise
+ name = "Tequila Sunrise"
+ id = "tequilasunrise"
+ result = "tequilasunrise"
+ required_reagents = list("tequila" = 2, "orangejuice" = 1)
result_amount = 3
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
@@ -317,7 +317,7 @@
name = "Margarita"
id = "margarita"
result = "margarita"
- required_reagents = list("tequilla" = 2, "limejuice" = 1)
+ required_reagents = list("tequila" = 2, "limejuice" = 1)
result_amount = 3
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
@@ -325,7 +325,7 @@
name = "Long Island Iced Tea"
id = "longislandicedtea"
result = "longislandicedtea"
- required_reagents = list("vodka" = 1, "gin" = 1, "tequilla" = 1, "cubalibre" = 1)
+ required_reagents = list("vodka" = 1, "gin" = 1, "tequila" = 1, "cubalibre" = 1)
result_amount = 4
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm
index 5f96f794b34..b43c9b344f1 100644
--- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm
+++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_food.dm
@@ -7,11 +7,10 @@
required_catalysts = list("enzyme" = 5)
result_amount = 1
-/datum/chemical_reaction/tofu/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/tofu/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/weapon/reagent_containers/food/snacks/tofu(location)
- return
/datum/chemical_reaction/chocolate_bar
name = "Chocolate Bar"
@@ -20,11 +19,10 @@
required_reagents = list("soymilk" = 2, "cocoa" = 2, "sugar" = 2)
result_amount = 1
-/datum/chemical_reaction/chocolate_bar/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/chocolate_bar/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/weapon/reagent_containers/food/snacks/chocolatebar(location)
- return
/datum/chemical_reaction/chocolate_bar2
name = "Chocolate Bar"
@@ -33,11 +31,10 @@
required_reagents = list("milk" = 2, "cocoa" = 2, "sugar" = 2)
result_amount = 1
-/datum/chemical_reaction/chocolate_bar2/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/chocolate_bar2/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/weapon/reagent_containers/food/snacks/chocolatebar(location)
- return
/datum/chemical_reaction/soysauce
name = "Soy Sauce"
@@ -54,10 +51,10 @@
required_catalysts = list("enzyme" = 5)
result_amount = 1
-/datum/chemical_reaction/cheesewheel/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/cheesewheel/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
- new /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel(location)
- return
+ for(var/i = 1, i <= created_volume, i++)
+ new /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel(location)
/datum/chemical_reaction/syntiflesh
name = "Syntiflesh"
@@ -66,10 +63,10 @@
required_reagents = list("blood" = 5, "cryoxadone" = 1)
result_amount = 1
-/datum/chemical_reaction/syntiflesh/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/syntiflesh/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
- new /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh(location)
- return
+ for(var/i = 1, i <= created_volume, i++)
+ new /obj/item/weapon/reagent_containers/food/snacks/meat/syntiflesh(location)
/datum/chemical_reaction/hot_ramen
name = "Hot Ramen"
@@ -131,5 +128,4 @@
/datum/chemical_reaction/dough/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
- new /obj/item/weapon/reagent_containers/food/snacks/dough(location)
- return
+ new /obj/item/weapon/reagent_containers/food/snacks/dough(location)
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm
index 3a5cf0e73dd..afcd0d398ce 100644
--- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm
+++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_harm.dm
@@ -7,12 +7,11 @@
result_amount = 2
mix_message = "The mixture explodes!"
-/datum/chemical_reaction/explosion_potassium/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/explosion_potassium/on_reaction(datum/reagents/holder, created_volume)
var/datum/effect/system/reagents_explosion/e = new()
e.set_up(round (created_volume/10, 1), holder.my_atom, 0, 0)
e.start()
holder.clear_reagents()
- return
/datum/chemical_reaction/emp_pulse
name = "EMP Pulse"
@@ -21,13 +20,12 @@
required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense
result_amount = 2
-/datum/chemical_reaction/emp_pulse/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/emp_pulse/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
// 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes.
// 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades.
empulse(location, round(created_volume / 24), round(created_volume / 14), 1)
holder.clear_reagents()
- return
/datum/chemical_reaction/mutagen
name = "Unstable mutagen"
@@ -58,13 +56,11 @@
required_reagents = list("glycerol" = 1, "facid" = 1, "sacid" = 1)
result_amount = 2
-/datum/chemical_reaction/nitroglycerin/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/nitroglycerin/on_reaction(datum/reagents/holder, created_volume)
var/datum/effect/system/reagents_explosion/e = new()
e.set_up(round(created_volume/2, 1), holder.my_atom, 0, 0)
e.start()
-
holder.clear_reagents()
- return
/datum/chemical_reaction/condensedcapsaicin
name = "Condensed Capsaicin"
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm
index 6d89c5a8e9c..8a5dedf218b 100644
--- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm
+++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_misc.dm
@@ -15,7 +15,7 @@
required_reagents = list("fluorosurfactant" = 1, "water" = 1)
result_amount = 2
-/datum/chemical_reaction/foam/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/foam/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
holder.my_atom.visible_message("The solution spews out foam! ")
@@ -32,7 +32,7 @@
required_reagents = list("aluminum" = 3, "fluorosurfactant" = 1, "sacid" = 1)
result_amount = 5
-/datum/chemical_reaction/metalfoam/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
holder.my_atom.visible_message("The solution spews out a metalic foam! ")
@@ -49,7 +49,7 @@
required_reagents = list("iron" = 3, "fluorosurfactant" = 1, "sacid" = 1)
result_amount = 5
-/datum/chemical_reaction/ironfoam/on_reaction(var/datum/reagents/holder, var/created_volume)
+/datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
holder.my_atom.visible_message(" 310)
+ M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT))
+ M.Jitter(5)
..()
- M:nutrition += nutriment_factor
- M:drowsyness = max(0,M:drowsyness-7)
- //if(!M:sleeping_willingly)
- // M:sleeping = max(0,M.sleeping-2)
- if (M.bodytemperature > 310)
- M.bodytemperature = max(310, M.bodytemperature-5)
- M.Jitter(1)
- return
/////////////////////////////////////////////////////////////////cocktail entities//////////////////////////////////////////////
@@ -334,9 +324,9 @@
color = "#664300" // rgb: 102, 67, 0
alcohol_perc = 0.3
-/datum/reagent/ethanol/tequilla_sunrise
+/datum/reagent/ethanol/tequila_sunrise
name = "Tequila Sunrise"
- id = "tequillasunrise"
+ id = "tequilasunrise"
description = "Tequila and orange juice. Much like a Screwdriver, only Mexican~"
reagent_state = LIQUID
color = "#664300" // rgb: 102, 67, 0
@@ -350,6 +340,11 @@
color = "#664300" // rgb: 102, 67, 0
alcohol_perc = 0.5
+/datum/reagent/ethanol/toxins_special/on_mob_life(mob/living/M)
+ if(M.bodytemperature < 330)
+ M.bodytemperature = min(330, M.bodytemperature + (15 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
+ ..()
+
/datum/reagent/ethanol/beepsky_smash
name = "Beepsky Smash"
id = "beepskysmash"
@@ -458,6 +453,11 @@
color = "#664300" // rgb: 102, 67, 0
alcohol_perc = 0.2
+/datum/reagent/ethanol/antifreeze/on_mob_life(mob/living/M)
+ if(M.bodytemperature < 330)
+ M.bodytemperature = min(330, M.bodytemperature + (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
+ ..()
+
/datum/reagent/ethanol/barefoot
name = "Barefoot"
id = "barefoot"
@@ -526,11 +526,10 @@
color = "#664300" // rgb: 102, 67, 0
alcohol_perc = 0.4
-/datum/reagent/ethanol/sbiten/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/ethanol/sbiten/on_mob_life(mob/living/M)
+ if(M.bodytemperature < 360)
+ M.bodytemperature = min(360, M.bodytemperature + (50 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
..()
- if (M.bodytemperature < 360)
- M.bodytemperature = min(360, M.bodytemperature+50) //310 is the normal bodytemp. 310.055
- return
/datum/reagent/ethanol/devilskiss
name = "Devils Kiss"
@@ -564,11 +563,10 @@
color = "#664300" // rgb: 102, 67, 0
alcohol_perc = 0.2
-/datum/reagent/ethanol/iced_beer/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/ethanol/iced_beer/on_mob_life(mob/living/M)
+ if(M.bodytemperature > 270)
+ M.bodytemperature = max(270, M.bodytemperature - (20 * TEMPERATURE_DAMAGE_COEFFICIENT)) //310 is the normal bodytemp. 310.055
..()
- if (M.bodytemperature < 270)
- M.bodytemperature = min(270, M.bodytemperature-40) //310 is the normal bodytemp. 310.055
- return
/datum/reagent/ethanol/grog
name = "Grog"
@@ -624,17 +622,17 @@
description = "A strong neurotoxin that puts the subject into a death-like state."
reagent_state = LIQUID
color = "#2E2E61" // rgb: 46, 46, 97
- alcohol_perc = 0.7
-
-/datum/reagent/ethanol/neurotoxin/on_mob_life(var/mob/living/M as mob)
- M.weakened = max(M.weakened, 3)
dizzy_adj = 6
+ alcohol_perc = 0.7
+ heart_rate_decrease = 1
+
+/datum/reagent/ethanol/neurotoxin/on_mob_life(mob/living/M)
+ M.weakened = max(M.weakened, 3)
if(current_cycle >=55)
M.druggy = max(M.druggy, 55)
if(current_cycle >=200)
M.adjustToxLoss(2)
..()
- return
/datum/reagent/ethanol/changelingsting
name = "Changeling Sting"
@@ -644,10 +642,9 @@
color = "#2E6671" // rgb: 46, 102, 113
alcohol_perc = 0.7
-/datum/reagent/ethanol/changelingsting/on_mob_life(var/mob/living/M as mob)
- ..()
+/datum/reagent/ethanol/changelingsting/on_mob_life(mob/living/M)
M.dizziness +=5
- return
+ ..()
/datum/reagent/ethanol/irishcarbomb
name = "Irish Car Bomb"
@@ -657,10 +654,9 @@
color = "#2E6671" // rgb: 46, 102, 113
alcohol_perc = 0.3
-/datum/reagent/ethanol/irishcarbomb/on_mob_life(var/mob/living/M as mob)
- ..()
+/datum/reagent/ethanol/irishcarbomb/on_mob_life(mob/living/M)
M.dizziness +=5
- return
+ ..()
/datum/reagent/ethanol/syndicatebomb
name = "Syndicate Bomb"
@@ -686,15 +682,12 @@
color = "#2E6671" // rgb: 46, 102, 113
alcohol_perc = 0.5
-/datum/reagent/ethanol/driestmartini/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/ethanol/driestmartini/on_mob_life(mob/living/M)
M.dizziness +=10
- if(current_cycle >= 55 && current_cycle <115)
- if (!M.stuttering) M.stuttering = 1
+ if(current_cycle >= 55 && current_cycle < 115)
M.stuttering += 10
..()
- return
-
/datum/reagent/ethanol/kahlua
name = "Kahlua"
id = "kahlua"
@@ -702,10 +695,9 @@
color = "#664300" // rgb: 102, 67, 0
alcohol_perc = 0.2
-/datum/reagent/ethanol/kahlua/on_mob_life(var/mob/living/M as mob)
- M.dizziness = max(0,M.dizziness-5)
- M.drowsyness = max(0,M.drowsyness-3)
- M.sleeping = max(0,M.sleeping-2)
+/datum/reagent/ethanol/kahlua/on_mob_life(mob/living/M)
+ M.dizziness = max(0, M.dizziness-5)
+ M.drowsyness = max(0, M.drowsyness-3)
+ M.AdjustSleeping(-2)
M.Jitter(5)
- ..()
- return
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm
index d52743c6ae6..418fc80daf4 100644
--- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm
+++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink.dm
@@ -4,10 +4,10 @@
description = "Both delicious AND rich in Vitamin C, what more do you need?"
color = "#E78108" // rgb: 231, 129, 8
-/datum/reagent/drink/orangejuicde/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/drink/orangejuicde/on_mob_life(mob/living/M)
+ if(M.getOxyLoss() && prob(30))
+ M.adjustOxyLoss(-1*REM)
..()
- if(M.getOxyLoss() && prob(30)) M.adjustOxyLoss(-1*REM)
- return
/datum/reagent/drink/tomatojuice
name = "Tomato Juice"
@@ -15,10 +15,10 @@
description = "Tomatoes made into juice. What a waste of big, juicy tomatoes, huh?"
color = "#731008" // rgb: 115, 16, 8
-/datum/reagent/drink/tomatojuice/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/drink/tomatojuice/on_mob_life(mob/living/M)
+ if(M.getFireLoss() && prob(20))
+ M.adjustFireLoss(-1)
..()
- if(M.getFireLoss() && prob(20)) M.adjustFireLoss(-1)
- return
/datum/reagent/drink/limejuice
name = "Lime Juice"
@@ -26,11 +26,10 @@
description = "The sweet-sour juice of limes."
color = "#365E30" // rgb: 54, 94, 48
-/datum/reagent/drink/limejuice/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/drink/limejuice/on_mob_life(mob/living/M)
+ if(M.getToxLoss() && prob(20))
+ M.adjustToxLoss(-1)
..()
- if(M.getToxLoss() && prob(20)) M.adjustToxLoss(-1)
- return
-
/datum/reagent/drink/carrotjuice
name = "Carrot juice"
@@ -38,19 +37,16 @@
description = "It is just like a carrot but without crunching."
color = "#973800" // rgb: 151, 56, 0
-/datum/reagent/drink/carrotjuicde/on_mob_life(var/mob/living/M as mob)
- ..()
+/datum/reagent/drink/carrotjuicde/on_mob_life(mob/living/M)
M.eye_blurry = max(M.eye_blurry-1 , 0)
M.eye_blind = max(M.eye_blind-1 , 0)
- if(!data) data = 1
- switch(data)
+ switch(current_cycle)
if(1 to 20)
//nothing
if(21 to INFINITY)
- if (prob(data-10))
+ if(prob(current_cycle-10))
M.disabilities &= ~NEARSIGHTED
- data++
- return
+ ..()
/datum/reagent/drink/doctor_delight
name = "The Doctor's Delight"
@@ -59,11 +55,10 @@
reagent_state = LIQUID
color = "#FF8CFF" // rgb: 255, 140, 255
-/datum/reagent/drink/doctors_delight/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(M.getToxLoss() && prob(20)) M.adjustToxLoss(-1)
+/datum/reagent/drink/doctors_delight/on_mob_life(mob/living/M)
+ if(M.getToxLoss() && prob(20))
+ M.adjustToxLoss(-1)
..()
- return
/datum/reagent/drink/berryjuice
name = "Berry Juice"
@@ -77,10 +72,9 @@
description = "A tasty juice blended from various kinds of very deadly and toxic berries."
color = "#863353" // rgb: 134, 51, 83
-/datum/reagent/drink/poisonberryjuice/on_mob_life(var/mob/living/M as mob)
- ..()
+/datum/reagent/drink/poisonberryjuice/on_mob_life(mob/living/M)
M.adjustToxLoss(1)
- return
+ ..()
/datum/reagent/drink/watermelonjuice
name = "Watermelon Juice"
@@ -106,15 +100,11 @@
description = "The raw essence of a banana."
color = "#863333" // rgb: 175, 175, 0
-/datum/reagent/drink/banana/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/drink/banana/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
- if(istype(M, /mob/living/carbon/human) && M.job in list("Clown"))
- if(!M) M = holder.my_atom
+ if((istype(M, /mob/living/carbon/human) && M.job in list("Clown") ) || issmall(M))
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
- M.nutrition += nutriment_factor
- ..()
- return
..()
/datum/reagent/drink/nothing
@@ -122,15 +112,11 @@
id = "nothing"
description = "Absolutely nothing."
-/datum/reagent/drink/nothing/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/drink/nothing/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
if(istype(M, /mob/living/carbon/human) && M.job in list("Mime"))
- if(!M) M = holder.my_atom
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
- M.nutrition += nutriment_factor
- ..()
- return
..()
/datum/reagent/drink/potato_juice
@@ -146,12 +132,12 @@
description = "An opaque white liquid produced by the mammary glands of mammals."
color = "#DFDFDF" // rgb: 223, 223, 223
-/datum/reagent/drink/milk/on_mob_life(var/mob/living/M as mob)
- if(M.getBruteLoss() && prob(20)) M.adjustBruteLoss(-1)
+/datum/reagent/drink/milk/on_mob_life(mob/living/M)
+ if(M.getBruteLoss() && prob(20))
+ M.adjustBruteLoss(-1)
if(holder.has_reagent("capsaicin"))
holder.remove_reagent("capsaicin", 2)
..()
- return
/datum/reagent/drink/milk/soymilk
name = "Soy Milk"
@@ -177,7 +163,7 @@
description = "Made with love! And coco beans."
nutriment_factor = 2 * FOOD_METABOLISM
color = "#403010" // rgb: 64, 48, 16
- adj_temp = 5
+ adj_temp_hot = 5
/datum/reagent/drink/coffee
name = "Coffee"
@@ -187,11 +173,12 @@
adj_dizzy = -5
adj_drowsy = -3
adj_sleepy = -2
- adj_temp = 25
+ adj_temp_hot = 25
overdose_threshold = 45
addiction_chance = 1 // It's true.
+ heart_rate_increase = 1
-/datum/reagent/drink/coffee/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/drink/coffee/on_mob_life(mob/living/M)
if(holder.has_reagent("frostoil"))
holder.remove_reagent("frostoil", 5)
if(prob(50))
@@ -199,9 +186,8 @@
M.AdjustStunned(-1)
M.AdjustWeakened(-1)
..()
- return
-/datum/reagent/drink/coffee/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/drink/coffee/overdose_process(mob/living/M, severity)
if(volume > 45)
M.Jitter(5)
@@ -210,7 +196,8 @@
id = "icecoffee"
description = "Coffee and ice, refreshing and cool."
color = "#102838" // rgb: 16, 40, 56
- adj_temp = -5
+ adj_temp_hot = 0
+ adj_temp_cool = 5
/datum/reagent/drink/coffee/soy_latte
name = "Soy Latte"
@@ -218,13 +205,13 @@
description = "A nice and tasty beverage while you are reading your hippie books."
color = "#664300" // rgb: 102, 67, 0
adj_sleepy = 0
- adj_temp = 5
+ adj_temp_hot = 5
-/datum/reagent/drink/coffee/soy_latte/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/drink/coffee/soy_latte/on_mob_life(mob/living/M)
..()
- M.sleeping = 0
- if(M.getBruteLoss() && prob(20)) M.adjustBruteLoss(-1)
- return
+ M.SetSleeping(0)
+ if(M.getBruteLoss() && prob(20))
+ M.adjustBruteLoss(-1)
/datum/reagent/drink/coffee/cafe_latte
name = "Cafe Latte"
@@ -232,14 +219,13 @@
description = "A nice, strong and tasty beverage while you are reading."
color = "#664300" // rgb: 102, 67, 0
adj_sleepy = 0
- adj_temp = 5
+ adj_temp_hot = 5
-/datum/reagent/drink/coffee/cafe_latte/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/drink/coffee/cafe_latte/on_mob_life(mob/living/M)
..()
- M.sleeping = 0
+ M.SetSleeping(0)
if(M.getBruteLoss() && prob(20))
M.adjustBruteLoss(-1)
- return
/datum/reagent/drink/coffee/cafe_latte/cafe_mocha
name = "Cafe Mocha"
@@ -255,20 +241,20 @@
adj_dizzy = -2
adj_drowsy = -1
adj_sleepy = -3
- adj_temp = 20
+ adj_temp_hot = 20
-/datum/reagent/drink/tea/on_mob_life(var/mob/living/M as mob)
- ..()
+/datum/reagent/drink/tea/on_mob_life(mob/living/M)
if(M.getToxLoss() && prob(20))
M.adjustToxLoss(-1)
- return
+ ..()
/datum/reagent/drink/tea/icetea
name = "Iced Tea"
id = "icetea"
description = "No relation to a certain rap artist/ actor."
color = "#104038" // rgb: 16, 64, 56
- adj_temp = -5
+ adj_temp_hot = 0
+ adj_temp_cool = 5
/datum/reagent/drink/bananahonk
name = "Banana Mama"
@@ -277,15 +263,11 @@
nutriment_factor = 1 * FOOD_METABOLISM
color = "#664300" // rgb: 102, 67, 0
-/datum/reagent/drink/bananahonk/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/drink/bananahonk/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
- if(istype(M, /mob/living/carbon/human) && M.job in list("Clown"))
- if(!M) M = holder.my_atom
+ if((istype(M, /mob/living/carbon/human) && M.job in list("Clown") ) || issmall(M))
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
- M.nutrition += nutriment_factor
- ..()
- return
..()
/datum/reagent/drink/silencer
@@ -295,13 +277,9 @@
nutriment_factor = 1 * FOOD_METABOLISM
color = "#664300" // rgb: 102, 67, 0
-/datum/reagent/drink/silencer/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/drink/silencer/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
if(istype(M, /mob/living/carbon/human) && M.job in list("Mime"))
- if(!M) M = holder.my_atom
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
- M.nutrition += nutriment_factor
- ..()
- return
..()
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm
index 848b20ccb41..1868489adb7 100644
--- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm
+++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink_base.dm
@@ -8,16 +8,21 @@
var/adj_dizzy = 0
var/adj_drowsy = 0
var/adj_sleepy = 0
- var/adj_temp = 0
+ var/adj_temp_hot = 0
+ var/adj_temp_cool = 0
-/datum/reagent/drink/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/drink/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
- if (adj_dizzy) M.dizziness = max(0,M.dizziness + adj_dizzy)
- if (adj_drowsy) M.drowsyness = max(0,M.drowsyness + adj_drowsy)
- if (adj_sleepy) M.sleeping = max(0,M.sleeping + adj_sleepy)
- if (adj_temp)
- if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
- M.bodytemperature = min(310, M.bodytemperature + (25 * TEMPERATURE_DAMAGE_COEFFICIENT))
- ..()
- return
+ if(adj_dizzy)
+ M.dizziness = max(0, M.dizziness + adj_dizzy)
+ if(adj_drowsy)
+ M.drowsyness = max(0, M.drowsyness + adj_drowsy)
+ if(adj_sleepy)
+ M.AdjustSleeping(adj_sleepy)
+ if(adj_temp_hot)
+ if(M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
+ M.bodytemperature = min(310, M.bodytemperature + (adj_temp_hot * TEMPERATURE_DAMAGE_COEFFICIENT))
+ if(adj_temp_cool)
+ if(M.bodytemperature > 310)//310 is the normal bodytemp. 310.055
+ M.bodytemperature = max(310, M.bodytemperature - (adj_temp_cool * TEMPERATURE_DAMAGE_COEFFICIENT))
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm
index 8a7ff800550..fe54ed97246 100644
--- a/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm
+++ b/code/modules/reagents/oldchem/reagents/drink/reagents_drink_cold.dm
@@ -1,6 +1,6 @@
/datum/reagent/drink/cold
name = "Cold drink"
- adj_temp = -5
+ adj_temp_cool = 5
/datum/reagent/drink/cold/tonic
name = "Tonic Water"
@@ -25,6 +25,11 @@
description = "Frozen water, your dentist wouldn't like you chewing this."
reagent_state = SOLID
color = "#619494" // rgb: 97, 148, 148
+ adj_temp_cool = 0
+
+/datum/reagent/drink/cold/ice/on_mob_life(mob/living/M)
+ M.bodytemperature = max(M.bodytemperature - 5 * TEMPERATURE_DAMAGE_COEFFICIENT, 0)
+ ..()
/datum/reagent/drink/cold/space_cola
name = "Cola"
@@ -32,7 +37,7 @@
description = "A refreshing beverage."
reagent_state = LIQUID
color = "#100800" // rgb: 16, 8, 0
- adj_drowsy = -3
+ adj_drowsy = -5
/datum/reagent/drink/cold/nuka_cola
name = "Nuka Cola"
@@ -41,14 +46,17 @@
color = "#100800" // rgb: 16, 8, 0
adj_sleepy = -2
-/datum/reagent/drink/cold/nuka_cola/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/drink/cold/nuka_cola/on_mob_life(mob/living/M)
M.Jitter(20)
M.druggy = max(M.druggy, 30)
M.dizziness +=5
M.drowsyness = 0
M.status_flags |= GOTTAGOFAST
..()
- return
+
+/datum/reagent/drink/cold/nuka_cola/reagent_deleted(mob/living/M)
+ M.status_flags &= ~GOTTAGOFAST
+ ..()
/datum/reagent/drink/cold/spacemountainwind
name = "Space Mountain Wind"
@@ -70,14 +78,14 @@
id = "space_up"
description = "Tastes like a hull breach in your mouth."
color = "#202800" // rgb: 32, 40, 0
- adj_temp = -8
+ adj_temp_cool = 8
/datum/reagent/drink/cold/lemon_lime
name = "Lemon Lime"
description = "A tangy substance made of 0.5% natural citrus!"
id = "lemon_lime"
color = "#878F00" // rgb: 135, 40, 0
- adj_temp = -8
+ adj_temp_cool = 8
/datum/reagent/drink/cold/lemonade
name = "Lemonade"
@@ -93,40 +101,17 @@
/datum/reagent/drink/cold/brownstar
name = "Brown Star"
- description = "Its not what it sounds like..."
+ description = "It's not what it sounds like..."
id = "brownstar"
color = "#9F3400" // rgb: 159, 052, 000
- adj_temp = - 2
+ adj_temp_cool = 2
/datum/reagent/drink/cold/milkshake
name = "Milkshake"
description = "Glorious brainfreezing mixture."
id = "milkshake"
color = "#AEE5E4" // rgb" 174, 229, 228
- adj_temp = -9
-
-/datum/reagent/drink/cold/milkshake/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(!data) data = 1
- switch(data)
- if(1 to 15)
- M.bodytemperature -= 5 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(holder.has_reagent("capsaicin"))
- holder.remove_reagent("capsaicin", 5)
- if(istype(M, /mob/living/carbon/slime))
- M.bodytemperature -= rand(5,20)
- if(15 to 25)
- M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(istype(M, /mob/living/carbon/slime))
- M.bodytemperature -= rand(10,20)
- if(25 to INFINITY)
- M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(prob(1)) M.emote("shiver")
- if(istype(M, /mob/living/carbon/slime))
- M.bodytemperature -= rand(15,20)
- data++
- ..()
- return
+ adj_temp_cool = 9
/datum/reagent/drink/cold/rewriter
name = "Rewriter"
@@ -134,7 +119,6 @@
id = "rewriter"
color = "#485000" // rgb:72, 080, 0
-/datum/reagent/drink/cold/rewriter/on_mob_life(var/mob/living/M as mob)
- ..()
+/datum/reagent/drink/cold/rewriter/on_mob_life(mob/living/M)
M.Jitter(5)
- return
\ No newline at end of file
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_admin.dm b/code/modules/reagents/oldchem/reagents/reagents_admin.dm
index 92cfbfd4c36..ccc617d2aaa 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_admin.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_admin.dm
@@ -5,13 +5,9 @@
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
process_flags = ORGANIC | SYNTHETIC //Adminbuse knows no bounds!
- admin_only=1
+ admin_only = 1
-/datum/reagent/adminordrazine/on_mob_life(var/mob/living/carbon/M as mob)
- if(!M) M = holder.my_atom ///This can even heal dead people.
- for(var/datum/reagent/R in M.reagents.reagent_list)
- if(R != src)
- M.reagents.remove_reagent(R.id,5)
+/datum/reagent/adminordrazine/on_mob_life(mob/living/carbon/M)
M.setCloneLoss(0)
M.setOxyLoss(0)
M.radiation = 0
@@ -20,15 +16,17 @@
M.adjustToxLoss(-5)
M.hallucination = 0
M.setBrainLoss(0)
- M.disabilities = 0
- M.sdisabilities = 0
- M.eye_blurry = 0
- M.eye_blind = 0
if(ishuman(M))
var/mob/living/carbon/human/H = M
- var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes)
- if(istype(E))
- E.damage = max(E.damage-5 , 0)
+ for(var/name in H.internal_organs)
+ var/obj/item/organ/internal/I = H.get_int_organ(name)
+ I.damage = max(0, I.damage-5)
+ for(var/obj/item/organ/external/E in H.organs)
+ if(E.mend_fracture())
+ E.perma_injury = 0
+ M.disabilities = 0
+ M.eye_blurry = 0
+ M.eye_blind = 0
M.SetWeakened(0)
M.SetStunned(0)
M.SetParalysis(0)
@@ -38,12 +36,15 @@
M.stuttering = 0
M.slurring = 0
M.confused = 0
- M.sleeping = 0
+ M.SetSleeping(0)
M.jitteriness = 0
- if(istype(M,/mob/living/carbon)) // make sure to only use it on carbon mobs
- var/mob/living/carbon/C = M
- for(var/datum/disease/D in C.viruses)
- D.cure(0)
+ for(var/datum/disease/D in M.viruses)
+ if(D.severity == NONTHREAT)
+ continue
+ D.spread_text = "Remissive"
+ D.stage--
+ if(D.stage < 1)
+ D.cure()
..()
/datum/reagent/adminordrazine/nanites
@@ -59,7 +60,7 @@
for(var/tocheck in incoming)
if(ispath(tocheck))
var/check = new tocheck
- if (istype(check, /atom))
+ if(istype(check, /atom))
var/atom/reagentCheck = check
var/datum/reagents/reagents = reagentCheck.reagents
var/admin = 0
diff --git a/code/modules/reagents/oldchem/reagents/reagents_drugs.dm b/code/modules/reagents/oldchem/reagents/reagents_drugs.dm
index 0529a1ed4b0..7cbc79b41b0 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_drugs.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_drugs.dm
@@ -6,12 +6,11 @@
color = "#202040" // rgb: 20, 20, 40
metabolization_rate = 0.25 * REAGENTS_METABOLISM
-/datum/reagent/serotrotium/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/serotrotium/on_mob_life(mob/living/M)
if(ishuman(M))
if(prob(7))
M.emote(pick("twitch","drool","moan","gasp"))
..()
- return
/datum/reagent/lithium
@@ -21,14 +20,12 @@
reagent_state = SOLID
color = "#808080" // rgb: 128, 128, 128
-/datum/reagent/lithium/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/lithium/on_mob_life(mob/living/M)
if(isturf(M.loc) && !istype(M.loc, /turf/space))
if(M.canmove && !M.restrained())
step(M, pick(cardinal))
if(prob(5)) M.emote(pick("twitch","drool","moan"))
..()
- return
/datum/reagent/hippies_delight
@@ -39,31 +36,26 @@
color = "#664300" // rgb: 102, 67, 0
metabolization_rate = 0.2 * REAGENTS_METABOLISM
-/datum/reagent/hippies_delight/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/hippies_delight/on_mob_life(mob/living/M)
M.druggy = max(M.druggy, 50)
- if(!data) data = 1
- switch(data)
+ switch(current_cycle)
if(1 to 5)
- if (!M.stuttering) M.stuttering = 1
+ if(!M.stuttering) M.stuttering = 1
M.Dizzy(10)
if(prob(10)) M.emote(pick("twitch","giggle"))
if(5 to 10)
- if (!M.stuttering) M.stuttering = 1
+ if(!M.stuttering) M.stuttering = 1
M.Jitter(20)
M.Dizzy(20)
M.druggy = max(M.druggy, 45)
if(prob(20)) M.emote(pick("twitch","giggle"))
- if (10 to INFINITY)
- if (!M.stuttering) M.stuttering = 1
+ if(10 to INFINITY)
+ if(!M.stuttering) M.stuttering = 1
M.Jitter(40)
M.Dizzy(40)
M.druggy = max(M.druggy, 60)
if(prob(30)) M.emote(pick("twitch","giggle"))
- data++
..()
- return
-
/datum/reagent/lsd
name = "Lysergic acid diethylamide"
@@ -72,13 +64,10 @@
reagent_state = LIQUID
color = "#0000D8"
-/datum/reagent/lsd/on_mob_life(var/mob/living/M)
- if(!M) M = holder.my_atom
+/datum/reagent/lsd/on_mob_life(mob/living/M)
M.druggy = max(M.druggy, 15)
M.hallucination += 10
..()
- return
-
/datum/reagent/space_drugs
name = "Space drugs"
@@ -88,13 +77,39 @@
color = "#9087A2"
metabolization_rate = 0.2
addiction_chance = 65
+ heart_rate_decrease = 1
-/datum/reagent/space_drugs/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/space_drugs/on_mob_life(mob/living/M)
M.druggy = max(M.druggy, 15)
if(isturf(M.loc) && !istype(M.loc, /turf/space))
if(M.canmove && !M.restrained())
step(M, pick(cardinal))
if(prob(7)) M.emote(pick("twitch","drool","moan","giggle"))
..()
- return
\ No newline at end of file
+
+/datum/reagent/psilocybin
+ name = "Psilocybin"
+ id = "psilocybin"
+ description = "A strong psycotropic derived from certain species of mushroom."
+ color = "#E700E7" // rgb: 231, 0, 231
+
+/datum/reagent/psilocybin/on_mob_life(mob/living/M)
+ M.druggy = max(M.druggy, 30)
+ switch(current_cycle)
+ if(1 to 5)
+ if(!M.stuttering) M.stuttering = 1
+ M.Dizzy(5)
+ if(prob(10)) M.emote(pick("twitch","giggle"))
+ if(5 to 10)
+ if(!M.stuttering) M.stuttering = 1
+ M.Jitter(10)
+ M.Dizzy(10)
+ M.druggy = max(M.druggy, 35)
+ if(prob(20)) M.emote(pick("twitch","giggle"))
+ if(10 to INFINITY)
+ if(!M.stuttering) M.stuttering = 1
+ M.Jitter(20)
+ M.Dizzy(20)
+ M.druggy = max(M.druggy, 40)
+ if(prob(30)) M.emote(pick("twitch","giggle"))
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_flammable.dm b/code/modules/reagents/oldchem/reagents/reagents_flammable.dm
index 8494ff3957b..45059ed84dd 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_flammable.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_flammable.dm
@@ -5,7 +5,7 @@
reagent_state = LIQUID
color = "#060606"
-/datum/reagent/fuel/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with welding fuel to make them easy to ignite!
+/datum/reagent/fuel/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with welding fuel to make them easy to ignite!
if(!istype(M, /mob/living))
return
if(method == TOUCH)
@@ -18,6 +18,7 @@
id = "unholywater"
description = "Something that shouldn't exist on this plane of existance."
process_flags = ORGANIC | SYNTHETIC //ethereal means everything processes it.
+ metabolization_rate = 1
/datum/reagent/fuel/unholywater/on_mob_life(mob/living/M)
M.adjustBrainLoss(3)
@@ -32,7 +33,11 @@
M.adjustFireLoss(2)
M.adjustOxyLoss(2)
M.adjustBruteLoss(2)
- holder.remove_reagent(src.id, 1)
+ ..()
+
+/datum/reagent/fuel/unholywater/reagent_deleted(mob/living/M)
+ M.status_flags &= ~GOTTAGOFAST
+ ..()
/datum/reagent/plasma
name = "Plasma"
@@ -41,8 +46,7 @@
reagent_state = LIQUID
color = "#7A2B94"
-/datum/reagent/plasma/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/plasma/on_mob_life(mob/living/M)
M.adjustToxLoss(1*REM)
if(holder.has_reagent("epinephrine"))
holder.remove_reagent("epinephrine", 2)
@@ -50,15 +54,13 @@
var/mob/living/carbon/C = M
C.adjustPlasma(10)
..()
- return
-/datum/reagent/plasma/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with plasma is stronger than fuel!
+/datum/reagent/plasma/reaction_mob(mob/living/M, method=TOUCH, volume)//Splashing people with plasma is stronger than fuel!
if(!istype(M, /mob/living))
return
if(method == TOUCH)
M.adjust_fire_stacks(volume / 5)
..()
- return
/datum/reagent/thermite
@@ -69,26 +71,17 @@
color = "#673910" // rgb: 103, 57, 16
process_flags = ORGANIC | SYNTHETIC
-/datum/reagent/thermite/reaction_turf(var/turf/T, var/volume)
+/datum/reagent/thermite/reaction_turf(turf/T, volume)
src = null
if(volume >= 5)
if(istype(T, /turf/simulated/wall))
T:thermite = 1
T.overlays.Cut()
T.overlays = image('icons/effects/effects.dmi',icon_state = "thermite")
- return
/datum/reagent/glycerol
name = "Glycerol"
id = "glycerol"
description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity."
reagent_state = LIQUID
- color = "#808080" // rgb: 128, 128, 128
-
-
-/datum/reagent/nitroglycerin
- name = "Nitroglycerin"
- id = "nitroglycerin"
- description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol."
- reagent_state = LIQUID
color = "#808080" // rgb: 128, 128, 128
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_food.dm b/code/modules/reagents/oldchem/reagents/reagents_food.dm
index 4c284d7d7cc..57dfd93c19d 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_food.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_food.dm
@@ -8,64 +8,59 @@
reagent_state = SOLID
nutriment_factor = 12 * REAGENTS_METABOLISM
color = "#664330" // rgb: 102, 67, 48
+ var/diet_flags = DIET_OMNI | DIET_HERB | DIET_CARN
-/datum/reagent/nutriment/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/nutriment/on_mob_life(mob/living/M)
if(!(M.mind in ticker.mode.vampires))
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.can_eat()) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients
+ if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients
H.nutrition += nutriment_factor // For hunger and fatness
- if(prob(50)) M.adjustBruteLoss(-1)
- if(istype(M,/mob/living/simple_animal)) //Any nutrients can heal simple animals
- if(prob(50)) M.heal_organ_damage(1,0)
+ if(prob(50))
+ M.adjustBruteLoss(-1)
+ if(H.species.exotic_blood)
+ H.vessel.add_reagent(H.species.exotic_blood, 0.4)
+ else
+ if(!(H.species.flags & NO_BLOOD))
+ H.vessel.add_reagent("blood", 0.4)
..()
- return
-
-/datum/reagent/protein // Meat-based protein, digestable by carnivores and omnivores, worthless to herbivores
+/datum/reagent/nutriment/protein // Meat-based protein, digestable by carnivores and omnivores, worthless to herbivores
name = "Protein"
id = "protein"
description = "Various essential proteins and fats commonly found in animal flesh and blood."
- reagent_state = SOLID
nutriment_factor = 15 * REAGENTS_METABOLISM
- color = "#664330" // rgb: 102, 67, 48
+ diet_flags = DIET_CARN | DIET_OMNI
-/datum/reagent/protein/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(!(M.mind in ticker.mode.vampires))
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(H.can_eat(DIET_CARN | DIET_OMNI)) //Make sure that it is not a herbivore
- H.nutrition += nutriment_factor // For hunger and fatness
- if(prob(50)) M.adjustBruteLoss(-1)
- if(istype(M,/mob/living/simple_animal)) //Any nutrients can heal simple animals
- if(prob(50)) M.heal_organ_damage(1,0)
- ..()
- return
-
-
-/datum/reagent/plantmatter // Plant-based biomatter, digestable by herbivores and omnivores, worthless to carnivores
+/datum/reagent/nutriment/plantmatter // Plant-based biomatter, digestable by herbivores and omnivores, worthless to carnivores
name = "Plant-matter"
id = "plantmatter"
description = "Vitamin-rich fibers and natural sugars commonly found in fresh produce."
- reagent_state = SOLID
nutriment_factor = 15 * REAGENTS_METABOLISM
+ diet_flags = DIET_HERB | DIET_OMNI
+
+
+/datum/reagent/vitamin
+ name = "Vitamin"
+ id = "vitamin"
+ description = "All the best vitamins, minerals, and carbohydrates the body needs in pure form."
+ reagent_state = SOLID
+ nutriment_factor = 1 * REAGENTS_METABOLISM
color = "#664330" // rgb: 102, 67, 48
-/datum/reagent/plantmatter/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(!(M.mind in ticker.mode.vampires))
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- if(H.can_eat(DIET_HERB | DIET_OMNI)) //Make sure that it is not a carnivore
- H.nutrition += nutriment_factor // For hunger and fatness
- if(prob(50)) M.adjustBruteLoss(-1)
- if(istype(M,/mob/living/simple_animal)) //Any nutrients can heal simple animals
- if(prob(50)) M.heal_organ_damage(1,0)
+/datum/reagent/vitamin/on_mob_life(mob/living/M) //everyone needs vitamins, so this works on everyone, regardless of diet or if they're a vampire.
+ M.nutrition += nutriment_factor
+ if(prob(50))
+ M.adjustBruteLoss(-1)
+ M.adjustFireLoss(-1)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.species.exotic_blood)
+ H.vessel.add_reagent(H.species.exotic_blood, 0.5)
+ else
+ if(!(H.species.flags & NO_BLOOD))
+ H.vessel.add_reagent("blood", 0.5)
..()
- return
-
/datum/reagent/soysauce
name = "Soysauce"
@@ -91,10 +86,8 @@
reagent_state = LIQUID
color = "#B31008" // rgb: 179, 16, 8
-/datum/reagent/capsaicin/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(!data) data = 1
- switch(data)
+/datum/reagent/capsaicin/on_mob_life(mob/living/M)
+ switch(current_cycle)
if(1 to 15)
M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT
if(holder.has_reagent("frostoil"))
@@ -113,9 +106,7 @@
M.bodytemperature += 20 * TEMPERATURE_DAMAGE_COEFFICIENT
if(istype(M, /mob/living/carbon/slime))
M.bodytemperature += rand(20,25)
- data++
..()
- return
/datum/reagent/frostoil
name = "Frost Oil"
@@ -125,10 +116,8 @@
color = "#8BA6E9" // rgb: 139, 166, 233
process_flags = ORGANIC | SYNTHETIC
-/datum/reagent/frostoil/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if(!data) data = 1
- switch(data)
+/datum/reagent/frostoil/on_mob_life(mob/living/M)
+ switch(current_cycle)
if(1 to 15)
M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT
if(holder.has_reagent("capsaicin"))
@@ -151,11 +140,9 @@
M.emote("shiver")
if(istype(M, /mob/living/carbon/slime))
M.bodytemperature -= rand(20,25)
- data++
..()
- return
-/datum/reagent/frostoil/reaction_turf(var/turf/simulated/T, var/volume)
+/datum/reagent/frostoil/reaction_turf(turf/simulated/T, volume)
if(volume >= 5)
for(var/mob/living/carbon/slime/M in T)
M.adjustToxLoss(rand(15,30))
@@ -169,19 +156,16 @@
color = "#B1B0B0"
overdose_threshold = 100
-/datum/reagent/sodiumchloride/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/sodiumchloride/overdose_process(mob/living/M, severity)
if(prob(70))
M.adjustBrainLoss(1)
..()
- return
-
/datum/reagent/blackpepper
name = "Black Pepper"
id = "blackpepper"
description = "A powder ground from peppercorns. *AAAACHOOO*"
reagent_state = SOLID
- // no color (ie, black)
/datum/reagent/cocoa
name = "Cocoa Powder"
@@ -191,10 +175,9 @@
nutriment_factor = 5 * REAGENTS_METABOLISM
color = "#302000" // rgb: 48, 32, 0
-/datum/reagent/cocoa/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/cocoa/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
..()
- return
/datum/reagent/hot_coco
name = "Hot Chocolate"
@@ -204,45 +187,11 @@
nutriment_factor = 2 * REAGENTS_METABOLISM
color = "#403010" // rgb: 64, 48, 16
-/datum/reagent/hot_coco/on_mob_life(var/mob/living/M as mob)
- if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
+/datum/reagent/hot_coco/on_mob_life(mob/living/M)
+ if(M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
M.bodytemperature = min(310, M.bodytemperature + (5 * TEMPERATURE_DAMAGE_COEFFICIENT))
M.nutrition += nutriment_factor
..()
- return
-
-
-/datum/reagent/psilocybin
- name = "Psilocybin"
- id = "psilocybin"
- description = "A strong psycotropic derived from certain species of mushroom."
- color = "#E700E7" // rgb: 231, 0, 231
-
-/datum/reagent/psilocybin/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.druggy = max(M.druggy, 30)
- if(!data) data = 1
- switch(data)
- if(1 to 5)
- if (!M.stuttering) M.stuttering = 1
- M.Dizzy(5)
- if(prob(10)) M.emote(pick("twitch","giggle"))
- if(5 to 10)
- if (!M.stuttering) M.stuttering = 1
- M.Jitter(10)
- M.Dizzy(10)
- M.druggy = max(M.druggy, 35)
- if(prob(20)) M.emote(pick("twitch","giggle"))
- if (10 to INFINITY)
- if (!M.stuttering) M.stuttering = 1
- M.Jitter(20)
- M.Dizzy(20)
- M.druggy = max(M.druggy, 40)
- if(prob(30)) M.emote(pick("twitch","giggle"))
- data++
- ..()
- return
-
/datum/reagent/sprinkles
name = "Sprinkles"
@@ -251,15 +200,11 @@
nutriment_factor = 1 * REAGENTS_METABOLISM
color = "#FF00FF" // rgb: 255, 0, 255
-/datum/reagent/sprinkles/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/sprinkles/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
- if(istype(M, /mob/living/carbon/human) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden"))
- if(!M) M = holder.my_atom
+ if(istype(M, /mob/living/carbon/human) && M.job in list("Security Officer", "Security Pod Pilot", "Detective", "Warden", "Head of Security", "Brig Physician", "Internal Affairs Agent", "Magistrate"))
M.adjustBruteLoss(-1)
M.adjustFireLoss(-1)
- M.nutrition += nutriment_factor
- ..()
- return
..()
@@ -271,13 +216,12 @@
nutriment_factor = 20 * REAGENTS_METABOLISM
color = "#302000" // rgb: 48, 32, 0
-/datum/reagent/cornoil/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/cornoil/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
..()
- return
-/datum/reagent/cornoil/reaction_turf(var/turf/simulated/T, var/volume)
- if (!istype(T)) return
+/datum/reagent/cornoil/reaction_turf(turf/simulated/T, volume)
+ if(!istype(T)) return
src = null
if(volume >= 3)
T.MakeSlippery()
@@ -306,10 +250,9 @@
nutriment_factor = 1 * REAGENTS_METABOLISM
color = "#302000" // rgb: 48, 32, 0
-/datum/reagent/dry_ramen/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/dry_ramen/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
..()
- return
/datum/reagent/hot_ramen
@@ -320,12 +263,11 @@
nutriment_factor = 5 * REAGENTS_METABOLISM
color = "#302000" // rgb: 48, 32, 0
-/datum/reagent/hot_ramen/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/hot_ramen/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
- if (M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
+ if(M.bodytemperature < 310)//310 is the normal bodytemp. 310.055
M.bodytemperature = min(310, M.bodytemperature + (10 * TEMPERATURE_DAMAGE_COEFFICIENT))
..()
- return
/datum/reagent/hell_ramen
@@ -336,11 +278,10 @@
nutriment_factor = 5 * REAGENTS_METABOLISM
color = "#302000" // rgb: 48, 32, 0
-/datum/reagent/hell_ramen/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/hell_ramen/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT
..()
- return
/datum/reagent/flour
@@ -351,12 +292,11 @@
nutriment_factor = 1 * REAGENTS_METABOLISM
color = "#FFFFFF" // rgb: 0, 0, 0
-/datum/reagent/flour/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/flour/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
..()
- return
-/datum/reagent/flour/reaction_turf(var/turf/T, var/volume)
+/datum/reagent/flour/reaction_turf(turf/T, volume)
src = null
if(!istype(T, /turf/space))
new /obj/effect/decal/cleanable/flour(T)
@@ -370,10 +310,9 @@
nutriment_factor = 1 * REAGENTS_METABOLISM
color = "#FFFFFF" // rgb: 0, 0, 0
-/datum/reagent/rice/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/rice/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
..()
- return
/datum/reagent/cherryjelly
@@ -384,11 +323,9 @@
nutriment_factor = 1 * REAGENTS_METABOLISM
color = "#801E28" // rgb: 128, 30, 40
-/datum/reagent/cherryjelly/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/cherryjelly/on_mob_life(mob/living/M)
M.nutrition += nutriment_factor
..()
- return
-
/datum/reagent/toxin/coffeepowder
name = "Coffee Grounds"
@@ -410,7 +347,6 @@
id = "fertilizer"
description = "A chemical mix good for growing plants with."
reagent_state = LIQUID
-// toxpwr = 0.2 //It's not THAT poisonous.
color = "#664330" // rgb: 102, 67, 48
/datum/reagent/toxin/fertilizer/eznutrient
@@ -434,7 +370,7 @@
color = "#FFFFFF" // rgb: 255, 255, 255
overdose_threshold = 200 // Hyperglycaemic shock
-/datum/reagent/sugar/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/sugar/on_mob_life(mob/living/M)
M.drowsyness = max(0, M.drowsyness-5)
if(current_cycle >= 90)
M.jitteriness += 2
@@ -445,14 +381,13 @@
if(prob(4))
M.reagents.add_reagent("epinephrine", 1.2)
..()
- return
-/datum/reagent/sugar/overdose_start(var/mob/living/M as mob)
+/datum/reagent/sugar/overdose_start(mob/living/M)
to_chat(M, "You pass out from hyperglycemic shock! ")
M.emote("collapse")
..()
-/datum/reagent/sugar/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/sugar/overdose_process(mob/living/M, severity)
M.Paralyse(3 * severity)
M.Weaken(4 * severity)
if(prob(8))
diff --git a/code/modules/reagents/oldchem/reagents/reagents_med.dm b/code/modules/reagents/oldchem/reagents/reagents_med.dm
index 0a2fa0396bf..cc5592dd42e 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_med.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_med.dm
@@ -7,14 +7,12 @@
metabolization_rate = 0.3 // Lasts 1.5 minutes for 15 units
shock_reduction = 200
-/datum/reagent/hydrocodone/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/hydrocodone/on_mob_life(mob/living/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.traumatic_shock < 100)
H.shock_stage = 0
..()
- return
/datum/reagent/sterilizine
name = "Sterilizine"
@@ -24,14 +22,14 @@
color = "#C8A5DC" // rgb: 200, 165, 220
//makes you squeaky clean
-/datum/reagent/sterilizine/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
- if (method == TOUCH)
+/datum/reagent/sterilizine/reaction_mob(mob/living/M, method=TOUCH, volume)
+ if(method == TOUCH)
M.germ_level -= min(volume*20, M.germ_level)
-/datum/reagent/sterilizine/reaction_obj(var/obj/O, var/volume)
+/datum/reagent/sterilizine/reaction_obj(obj/O, volume)
O.germ_level -= min(volume*20, O.germ_level)
-/datum/reagent/sterilizine/reaction_turf(var/turf/T, var/volume)
+/datum/reagent/sterilizine/reaction_turf(turf/T, volume)
T.germ_level -= min(volume*20, T.germ_level)
/datum/reagent/synaptizine
@@ -42,8 +40,7 @@
color = "#FA46FA"
overdose_threshold = 40
-/datum/reagent/synaptizine/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/synaptizine/on_mob_life(mob/living/M)
M.drowsyness = max(0, M.drowsyness-5)
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
@@ -52,9 +49,8 @@
if(prob(50))
M.adjustBrainLoss(-1.0)
..()
- return
-/datum/reagent/synaptizine/overdose_process(var/mob/living/M as mob, severity)
+/datum/reagent/synaptizine/overdose_process(mob/living/M, severity)
var/effect = ..()
if(severity == 1)
if(effect <= 1)
@@ -82,8 +78,7 @@
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
-/datum/reagent/mitocholide/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/mitocholide/on_mob_life(mob/living/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -93,9 +88,8 @@
if(I.damage > 0)
I.damage = max(I.damage-0.4, 0)
..()
- return
-/datum/reagent/mitocholide/reaction_obj(var/obj/O, var/volume)
+/datum/reagent/mitocholide/reaction_obj(obj/O, volume)
if(istype(O, /obj/item/organ))
var/obj/item/organ/Org = O
Org.rejuvenate()
@@ -106,9 +100,9 @@
description = "A plasma mixture with almost magical healing powers. Its main limitation is that the targets body temperature must be under 265K for it to metabolise correctly."
reagent_state = LIQUID
color = "#0000C8" // rgb: 200, 165, 220
+ heart_rate_decrease = 1
-/datum/reagent/cryoxadone/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/cryoxadone/on_mob_life(mob/living/M)
if(M.bodytemperature < 265)
M.adjustCloneLoss(-4)
M.adjustOxyLoss(-10)
@@ -117,7 +111,6 @@
M.adjustFireLoss(-12)
M.status_flags &= ~DISFIGURED
..()
- return
/datum/reagent/rezadone
name = "Rezadone"
@@ -134,7 +127,6 @@
M.adjustFireLoss(-1)
M.status_flags &= ~DISFIGURED
..()
- return
/datum/reagent/rezadone/overdose_process(mob/living/M, severity)
M.adjustToxLoss(1)
diff --git a/code/modules/reagents/oldchem/reagents/reagents_misc.dm b/code/modules/reagents/oldchem/reagents/reagents_misc.dm
index 889a2011d48..c4fec24d054 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_misc.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_misc.dm
@@ -98,7 +98,7 @@
reagent_state = SOLID
color = "#1C1300" // rgb: 30, 20, 0
-/datum/reagent/carbon/reaction_turf(var/turf/T, var/volume)
+/datum/reagent/carbon/reaction_turf(turf/T, volume)
src = null
// Only add one dirt per turf. Was causing people to crash.
if(!istype(T, /turf/space) && !(locate(/obj/effect/decal/cleanable/dirt) in T))
@@ -150,20 +150,13 @@
description = "Pure iron is a metal."
reagent_state = SOLID
color = "#C8A5DC" // rgb: 200, 165, 220
-/*
-/datum/reagent/iron/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if((M.virus) && (prob(8) && (M.virus.name=="Magnitis")))
- if(M.virus.spread == "Airborne")
- M.virus.spread = "Remissive"
- M.virus.stage--
- if(M.virus.stage <= 0)
- M.resistances += M.virus.type
- M.virus = null
- holder.remove_reagent(src.id, 0.2)
- return
-*/
+/datum/reagent/iron/on_mob_life(mob/living/M)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(!H.species.exotic_blood && !(H.species.flags & NO_BLOOD))
+ H.vessel.add_reagent("blood", 0.8)
+ ..()
//foam
diff --git a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm
index 8dcb1a77d6e..20ccb420e85 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_toxin.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_toxin.dm
@@ -5,12 +5,9 @@
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
-/datum/reagent/toxin/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/toxin/on_mob_life(mob/living/M)
M.adjustToxLoss(2)
..()
- return
-
/datum/reagent/spider_venom
name = "Spider venom"
@@ -19,12 +16,9 @@
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
-/datum/reagent/spider_venom/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- M.adjustToxLoss(1.5)
- ..()
- return
-
+/datum/reagent/spider_venom/on_mob_life(mob/living/M)
+ M.adjustToxLoss(1.5)
+ ..()
/datum/reagent/plasticide
name = "Plasticide"
@@ -33,11 +27,9 @@
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
-/datum/reagent/plasticide/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/plasticide/on_mob_life(mob/living/M)
M.adjustToxLoss(1.5)
..()
- return
/datum/reagent/minttoxin
@@ -47,13 +39,10 @@
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
-/datum/reagent/minttoxin/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
- if (FAT in M.mutations)
+/datum/reagent/minttoxin/on_mob_life(mob/living/M)
+ if(FAT in M.mutations)
M.gib()
..()
- return
-
/datum/reagent/slimejelly
name = "Slime Jelly"
@@ -62,14 +51,13 @@
reagent_state = LIQUID
color = "#801E28" // rgb: 128, 30, 40
-/datum/reagent/slimejelly/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/slimejelly/on_mob_life(mob/living/M)
if(prob(10))
to_chat(M, "\red Your insides are burning!")
M.adjustToxLoss(rand(20,60)*REM)
else if(prob(40))
M.adjustBruteLoss(-5*REM)
..()
- return
/datum/reagent/slimetoxin
name = "Mutation Toxin"
@@ -78,8 +66,7 @@
reagent_state = LIQUID
color = "#13BC5E" // rgb: 19, 188, 94
-/datum/reagent/slimetoxin/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/slimetoxin/on_mob_life(mob/living/M)
if(ishuman(M))
var/mob/living/carbon/human/human = M
if(human.species.name != "Shadow")
@@ -89,7 +76,6 @@
to_chat(M, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
human.set_species("Shadow")
..()
- return
/datum/reagent/aslimetoxin
name = "Advanced Mutation Toxin"
@@ -98,7 +84,7 @@
reagent_state = LIQUID
color = "#13BC5E" // rgb: 19, 188, 94
-/datum/reagent/aslimetoxin/reaction_mob(mob/M, method=TOUCH, reac_volume)
+/datum/reagent/aslimetoxin/reaction_mob(mob/M, method=TOUCH, volume)
if(method != TOUCH)
M.ForceContractDisease(new /datum/disease/transformation/slime(0))
@@ -112,13 +98,10 @@
metabolization_rate = 0.2
penetrates_skin = 1
-/datum/reagent/mercury/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/mercury/on_mob_life(mob/living/M)
if(prob(70))
M.adjustBrainLoss(1)
..()
- return
-
/datum/reagent/chlorine
name = "Chlorine"
@@ -129,11 +112,9 @@
penetrates_skin = 1
process_flags = ORGANIC | SYNTHETIC
-/datum/reagent/chlorine/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/chlorine/on_mob_life(mob/living/M)
M.adjustFireLoss(1)
..()
- return
/datum/reagent/fluorine
name = "Fluorine"
@@ -144,13 +125,10 @@
penetrates_skin = 1
process_flags = ORGANIC | SYNTHETIC
-/datum/reagent/fluorine/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/fluorine/on_mob_life(mob/living/M)
M.adjustFireLoss(1)
M.adjustToxLoss(1*REM)
..()
- return
-
/datum/reagent/radium
name = "Radium"
@@ -161,13 +139,12 @@
metabolization_rate = 0.4
penetrates_skin = 1
-/datum/reagent/radium/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/radium/on_mob_life(mob/living/M)
if(M.radiation < 80)
M.apply_effect(4, IRRADIATE, negate_armor = 1)
..()
-/datum/reagent/radium/reaction_turf(var/turf/T, var/volume)
+/datum/reagent/radium/reaction_turf(turf/T, volume)
src = null
if(volume >= 3)
if(!istype(T, /turf/space))
@@ -183,7 +160,7 @@
color = "#04DF27"
metabolization_rate = 0.3
-/datum/reagent/mutagen/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
+/datum/reagent/mutagen/reaction_mob(mob/M, method=TOUCH, volume)
if(!..()) return
if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
src = null
@@ -191,16 +168,13 @@
randmutb(M)
domutcheck(M, null)
M.UpdateAppearance()
- return
-/datum/reagent/mutagen/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/mutagen/on_mob_life(mob/living/M)
if(!M.dna) return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
- if(!M) M = holder.my_atom
M.apply_effect(2*REM, IRRADIATE, negate_armor = 1)
if(prob(4))
randmutb(M)
..()
- return
/datum/reagent/uranium
@@ -210,13 +184,11 @@
reagent_state = SOLID
color = "#B8B8C0" // rgb: 184, 184, 192
-/datum/reagent/uranium/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/uranium/on_mob_life(mob/living/M)
M.apply_effect(2, IRRADIATE, negate_armor = 1)
..()
- return
-/datum/reagent/uranium/reaction_turf(var/turf/T, var/volume)
+/datum/reagent/uranium/reaction_turf(turf/T, volume)
src = null
if(volume >= 3)
if(!istype(T, /turf/space))
@@ -231,13 +203,9 @@
color = "#52685D"
metabolization_rate = 0.2
-/datum/reagent/lexorin/on_mob_life(var/mob/living/M as mob)
- if(M.stat == 2.0)
- return
- if(!M) M = holder.my_atom
+/datum/reagent/lexorin/on_mob_life(mob/living/M)
M.adjustToxLoss(1)
..()
- return
/datum/reagent/sacid
@@ -248,13 +216,11 @@
color = "#00D72B"
process_flags = ORGANIC | SYNTHETIC
-/datum/reagent/sacid/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/sacid/on_mob_life(mob/living/M)
M.adjustFireLoss(1)
..()
- return
-/datum/reagent/sacid/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+/datum/reagent/sacid/reaction_mob(mob/living/M, method=TOUCH, volume)
if(!istype(M, /mob/living))
return
if(method == TOUCH)
@@ -307,7 +273,7 @@
else
M.take_organ_damage(0,20)
-/datum/reagent/sacid/reaction_obj(var/obj/O, var/volume)
+/datum/reagent/sacid/reaction_obj(obj/O, volume)
if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom)) && prob(40))
if(!O.unacidable)
var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc)
@@ -322,14 +288,15 @@
id = "hell_water"
description = "YOUR FLESH! IT BURNS!"
process_flags = ORGANIC | SYNTHETIC //Admin-bus has no brakes! KILL THEM ALL.
+ metabolization_rate = 1
-/datum/reagent/hellwater/on_mob_life(var/mob/living/M as mob)
- M.fire_stacks = min(5,M.fire_stacks + 3)
+/datum/reagent/hellwater/on_mob_life(mob/living/M)
+ M.fire_stacks = min(5, M.fire_stacks + 3)
M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire
M.adjustToxLoss(1)
M.adjustFireLoss(1) //Hence the other damages... ain't I a bastard?
M.adjustBrainLoss(5)
- holder.remove_reagent(src.id, 1)
+ ..()
/datum/reagent/carpotoxin
@@ -339,12 +306,9 @@
reagent_state = LIQUID
color = "#003333" // rgb: 0, 51, 51
-/datum/reagent/carpotoxin/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/carpotoxin/on_mob_life(mob/living/M)
M.adjustToxLoss(2*REM)
..()
- return
-
/datum/reagent/staminatoxin
name = "Tirizene"
@@ -354,25 +318,23 @@
color = "#6E2828"
data = 13
-/datum/reagent/staminatoxin/on_mob_life(var/mob/living/M)
+/datum/reagent/staminatoxin/on_mob_life(mob/living/M)
M.adjustStaminaLoss(REM * data)
data = max(data - 1, 3)
..()
-/datum/reagent/spores
+/datum/reagent/spore
name = "Spore Toxin"
- id = "spores"
- description = "A toxic spore cloud which blocks vision when ingested."
+ id = "spore"
+ description = "A natural toxin produced by blob spores that inhibits vision when ingested."
color = "#9ACD32"
-/datum/reagent/spores/on_mob_life(var/mob/living/M as mob)
+/datum/reagent/spores/on_mob_life(mob/living/M)
M.adjustToxLoss(1)
M.damageoverlaytemp = 60
M.eye_blurry = max(M.eye_blurry, 3)
..()
- return
-
/datum/reagent/beer2 //disguised as normal beer for use by emagged brobots
name = "Beer"
@@ -381,18 +343,14 @@
color = "#664300" // rgb: 102, 67, 0
metabolization_rate = 1.5 * REAGENTS_METABOLISM
-/datum/reagent/beer2/on_mob_life(var/mob/living/M as mob)
- if(!data)
- data = 1
- switch(data)
+/datum/reagent/beer2/on_mob_life(mob/living/M)
+ switch(current_cycle)
if(1 to 50)
- M.sleeping += 1
+ M.AdjustSleeping(1)
if(51 to INFINITY)
- M.sleeping += 1
- M.adjustToxLoss((data - 50)*REM)
- data++
+ M.AdjustSleeping(1)
+ M.adjustToxLoss((current_cycle - 50)*REM)
..()
- return
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
/datum/reagent/condensedcapsaicin
@@ -402,7 +360,7 @@
reagent_state = LIQUID
color = "#B31008" // rgb: 179, 16, 8
-/datum/reagent/condensedcapsaicin/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+/datum/reagent/condensedcapsaicin/reaction_mob(mob/living/M, method=TOUCH, volume)
if(!istype(M, /mob/living))
return
if(method == TOUCH)
@@ -412,27 +370,27 @@
var/eyes_covered = 0
var/obj/item/safe_thing = null
if( victim.wear_mask )
- if ( victim.wear_mask.flags & MASKCOVERSEYES )
+ if( victim.wear_mask.flags & MASKCOVERSEYES )
eyes_covered = 1
safe_thing = victim.wear_mask
- if ( victim.wear_mask.flags & MASKCOVERSMOUTH )
+ if( victim.wear_mask.flags & MASKCOVERSMOUTH )
mouth_covered = 1
safe_thing = victim.wear_mask
if( victim.head )
- if ( victim.head.flags & MASKCOVERSEYES )
+ if( victim.head.flags & MASKCOVERSEYES )
eyes_covered = 1
safe_thing = victim.head
- if ( victim.head.flags & MASKCOVERSMOUTH )
+ if( victim.head.flags & MASKCOVERSMOUTH )
mouth_covered = 1
safe_thing = victim.head
if(victim.glasses)
eyes_covered = 1
- if ( !safe_thing )
+ if( !safe_thing )
safe_thing = victim.glasses
- if ( eyes_covered && mouth_covered )
+ if( eyes_covered && mouth_covered )
to_chat(victim, "\red Your [safe_thing] protects you from the pepperspray!")
return
- else if ( mouth_covered ) // Reduced effects if partially protected
+ else if( mouth_covered ) // Reduced effects if partially protected
to_chat(victim, "\red Your [safe_thing] protect you from most of the pepperspray!")
if(prob(5))
victim.emote("scream")
@@ -443,7 +401,7 @@
victim.Weaken(3)
victim.drop_item()
return
- else if ( eyes_covered ) // Eye cover is better than mouth cover
+ else if( eyes_covered ) // Eye cover is better than mouth cover
to_chat(victim, "\red Your [safe_thing] protects your eyes from the pepperspray!")
victim.eye_blurry = max(M.eye_blurry, 3)
victim.damageoverlaytemp = 30
@@ -459,9 +417,7 @@
victim.Weaken(5)
victim.drop_item()
-/datum/reagent/condensedcapsaicin/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/condensedcapsaicin/on_mob_life(mob/living/M)
if(prob(5))
M.visible_message("[M] [pick("dry heaves!","coughs!","splutters!")] ")
- ..()
- return
\ No newline at end of file
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/oldchem/reagents/reagents_water.dm b/code/modules/reagents/oldchem/reagents/reagents_water.dm
index 11a5759fa5b..7df0fd3fdba 100644
--- a/code/modules/reagents/oldchem/reagents/reagents_water.dm
+++ b/code/modules/reagents/oldchem/reagents/reagents_water.dm
@@ -16,7 +16,7 @@
var/cooling_temperature = 2
process_flags = ORGANIC | SYNTHETIC
-/datum/reagent/water/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+/datum/reagent/water/reaction_mob(mob/living/M, method=TOUCH, volume)
if(!istype(M, /mob/living))
return
@@ -27,8 +27,9 @@
M.ExtinguishMob()
return
-/datum/reagent/water/reaction_turf(var/turf/simulated/T, var/volume)
- if (!istype(T)) return
+/datum/reagent/water/reaction_turf(turf/simulated/T, volume)
+ if(!istype(T))
+ return
src = null
if(volume >= 3)
T.MakeSlippery()
@@ -43,9 +44,8 @@
lowertemp.react()
T.assume_air(lowertemp)
qdel(hotspot)
- return
-/datum/reagent/water/reaction_obj(var/obj/O, var/volume)
+/datum/reagent/water/reaction_obj(obj/O, volume)
src = null
var/turf/T = get_turf(O)
var/hotspot = (locate(/obj/effect/hotspot) in T)
@@ -73,8 +73,8 @@
reagent_state = LIQUID
color = "#1BB1AB"
-/datum/reagent/lube/reaction_turf(var/turf/simulated/T, var/volume)
- if (!istype(T)) return
+/datum/reagent/lube/reaction_turf(turf/simulated/T, volume)
+ if(!istype(T)) return
src = null
if(volume >= 1)
T.MakeSlippery(TURF_WET_LUBE)
@@ -87,7 +87,7 @@
reagent_state = LIQUID
color = "#61C2C2"
-/datum/reagent/space_cleaner/reaction_obj(var/obj/O, var/volume)
+/datum/reagent/space_cleaner/reaction_obj(obj/O, volume)
if(O && !istype(O, /atom/movable/lighting_overlay))
O.color = initial(O.color)
if(istype(O,/obj/effect/decal/cleanable))
@@ -96,7 +96,7 @@
if(O)
O.clean_blood()
-/datum/reagent/space_cleaner/reaction_turf(var/turf/T, var/volume)
+/datum/reagent/space_cleaner/reaction_turf(turf/T, volume)
if(volume >= 1)
if(T)
T.color = initial(T.color)
@@ -110,7 +110,7 @@
var/turf/simulated/S = T
S.dirt = 0
-/datum/reagent/space_cleaner/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
+/datum/reagent/space_cleaner/reaction_mob(mob/M, method=TOUCH, volume)
if(iscarbon(M))
var/mob/living/carbon/C = M
if(istype(M,/mob/living/carbon/human))
@@ -151,7 +151,7 @@
reagent_state = LIQUID
color = "#C80000" // rgb: 200, 0, 0
-/datum/reagent/blood/reaction_mob(mob/M, method=TOUCH, reac_volume)
+/datum/reagent/blood/reaction_mob(mob/M, method=TOUCH, volume)
if(data && data["viruses"])
for(var/datum/disease/D in data["viruses"])
@@ -194,15 +194,15 @@
color = mix_data["blood_colour"]
return 1
-/datum/reagent/blood/on_update(var/atom/A)
+/datum/reagent/blood/on_update(atom/A)
if(data["blood_colour"])
color = data["blood_colour"]
return ..()
-/datum/reagent/blood/reaction_turf(turf/simulated/T, reac_volume)//splash the blood all over the place
+/datum/reagent/blood/reaction_turf(turf/simulated/T, volume)//splash the blood all over the place
if(!istype(T))
return
- if(reac_volume < 3)
+ if(volume < 3)
return
if(!data["donor"] || istype(data["donor"], /mob/living/carbon/human))
var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T //find some blood here
@@ -232,7 +232,7 @@
id = "vaccine"
color = "#C81040" // rgb: 200, 16, 64
-/datum/reagent/vaccine/reaction_mob(mob/M, method=TOUCH, reac_volume)
+/datum/reagent/vaccine/reaction_mob(mob/M, method=TOUCH, volume)
if(islist(data) && (method == INGEST))
for(var/datum/disease/D in M.viruses)
if(D.GetDiseaseID() in data)
@@ -250,21 +250,19 @@
reagent_state = LIQUID
color = "#757547"
-/datum/reagent/fishwater/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
+/datum/reagent/fishwater/reaction_mob(mob/M, method=TOUCH, volume)
if(!istype(M, /mob/living))
return
if(method == INGEST)
to_chat(M, "Oh god, why did you drink that?")
-/datum/reagent/fishwater/on_mob_life(var/mob/living/M as mob)
- if(!M) M = holder.my_atom
+/datum/reagent/fishwater/on_mob_life(mob/living/M)
if(prob(30)) // Nasty, you drank this stuff? 30% chance of the fakevomit (non-stunning version)
if(prob(50)) // 50/50 chance of green vomit vs normal vomit
M.fakevomit(1)
else
M.fakevomit(0)
..()
- return
/datum/reagent/fishwater/toiletwater
name = "Toilet Water"
@@ -273,7 +271,7 @@
reagent_state = LIQUID
color = "#757547"
-/datum/reagent/fishwater/toiletwater/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //For shennanigans
+/datum/reagent/fishwater/toiletwater/reaction_mob(mob/M, method=TOUCH, volume) //For shennanigans
return
/datum/reagent/holywater
@@ -284,18 +282,14 @@
color = "#0064C8" // rgb: 0, 100, 200
process_flags = ORGANIC | SYNTHETIC
-/datum/reagent/holywater/on_mob_life(var/mob/living/M as mob)
- if(!data) data = 1
- data++
+/datum/reagent/holywater/on_mob_life(mob/living/M)
M.jitteriness = max(M.jitteriness-5,0)
- if(data >= 30) // 12 units, 60 seconds @ metabolism 0.4 units & tick rate 2.0 sec
- if (!M.stuttering) M.stuttering = 1
+ if(current_cycle >= 30) // 12 units, 60 seconds @ metabolism 0.4 units & tick rate 2.0 sec
M.stuttering += 4
M.Dizzy(5)
if(iscultist(M) && prob(5))
M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","Egkau'haom'nai en Chaous","Ho Diak'nos tou Ap'iron","R'ge Na'sie","Diabo us Vo'iscum","Si gn'um Co'nu"))
- if(data >= 75 && prob(33)) // 30 units, 150 seconds
- if (!M.confused) M.confused = 1
+ if(current_cycle >= 75 && prob(33)) // 30 units, 150 seconds
M.confused += 3
if(isvampirethrall(M))
ticker.mode.remove_vampire_mind(M.mind)
@@ -312,7 +306,7 @@
M.confused = 0
return
if(ishuman(M) && M.mind && M.mind.vampire && !M.mind.vampire.get_ability(/datum/vampire_passive/full) && prob(80))
- switch(data)
+ switch(current_cycle)
if(1 to 4)
to_chat(M, "Something sizzles in your veins! ")
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
@@ -331,7 +325,7 @@
..()
-/datum/reagent/holywater/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+/datum/reagent/holywater/reaction_mob(mob/living/M, method=TOUCH, volume)
// Vampires have their powers weakened by holy water applied to the skin.
if(ishuman(M) && M.mind && M.mind.vampire && !M.mind.vampire.get_ability(/datum/vampire_passive/full))
var/mob/living/carbon/human/H=M
@@ -347,7 +341,7 @@
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
-/datum/reagent/holywater/reaction_turf(var/turf/simulated/T, var/volume)
+/datum/reagent/holywater/reaction_turf(turf/simulated/T, volume)
..()
if(!istype(T)) return
if(volume>=10)
@@ -363,7 +357,7 @@
description = "You don't even want to think about what's in here."
reagent_state = LIQUID
-/datum/reagent/liquidgibs/reaction_turf(var/turf/T, var/volume) //yes i took it from synthflesh...
+/datum/reagent/liquidgibs/reaction_turf(turf/T, volume) //yes i took it from synthflesh...
src = null
if(volume >= 5)
new /obj/effect/decal/cleanable/blood/gibs/cleangibs(T)
@@ -386,11 +380,11 @@
reagent_state = LIQUID
color = "#A70FFF"
-/datum/reagent/drying_agent/reaction_turf(turf/simulated/T, reac_volume)
+/datum/reagent/drying_agent/reaction_turf(turf/simulated/T, volume)
if(istype(T) && T.wet)
T.MakeDry(TURF_WET_WATER)
-/datum/reagent/drying_agent/reaction_obj(obj/O, reac_volume)
+/datum/reagent/drying_agent/reaction_obj(obj/O, volume)
if(istype(O, /obj/item/clothing/shoes/galoshes))
var/t_loc = get_turf(O)
qdel(O)
diff --git a/code/modules/reagents/pandemic.dm b/code/modules/reagents/pandemic.dm
index bec2b92f049..d39b274db8c 100644
--- a/code/modules/reagents/pandemic.dm
+++ b/code/modules/reagents/pandemic.dm
@@ -74,7 +74,7 @@
usr.set_machine(src)
if(!beaker) return
- if (href_list["create_vaccine"])
+ if(href_list["create_vaccine"])
if(!src.wait)
var/obj/item/weapon/reagent_containers/glass/bottle/B = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
if(B)
@@ -104,7 +104,7 @@
src.temp_html = "The replicator is not ready yet."
src.updateUsrDialog()
return
- else if (href_list["create_virus_culture"])
+ else if(href_list["create_virus_culture"])
if(!wait)
var/type = GetVirusTypeByIndex(text2num(href_list["create_virus_culture"]))//the path is received as string - converting
var/datum/disease/D = null
@@ -135,11 +135,11 @@
src.temp_html = "The replicator is not ready yet."
src.updateUsrDialog()
return
- else if (href_list["empty_beaker"])
+ else if(href_list["empty_beaker"])
beaker.reagents.clear_reagents()
src.updateUsrDialog()
return
- else if (href_list["eject"])
+ else if(href_list["eject"])
beaker:loc = src.loc
beaker = null
icon_state = "mixer0"
@@ -265,7 +265,9 @@
dat += "Eject beaker [((R.total_volume&&R.reagent_list.len) ? "-- Empty beaker ":"")] "
dat += "Close "
- user << browse("[src.name] [dat]", "window=pandemic;size=575x400")
+ var/datum/browser/popup = new(user, "pandemic", name, 575, 400)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "pandemic")
return
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index 237dd9ac46b..f977047d700 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -22,12 +22,12 @@
if(amount_per_transfer_from_this in possible_transfer_amounts)
default = amount_per_transfer_from_this
var/N = input("Amount per transfer from this:", "[src]", default) as null|anything in possible_transfer_amounts
- if (N)
+ if(N)
amount_per_transfer_from_this = N
/obj/item/weapon/reagent_containers/New()
..()
- if (!possible_transfer_amounts)
+ if(!possible_transfer_amounts)
src.verbs -= /obj/item/weapon/reagent_containers/verb/set_APTFT
var/datum/reagents/R = new/datum/reagents(volume)
reagents = R
@@ -56,7 +56,7 @@
reagents.handle_reactions()
..()
-/obj/item/weapon/reagent_containers/attack_self(mob/user as mob)
+/obj/item/weapon/reagent_containers/attack_self(mob/user)
return
// this prevented pills, food, and other things from being picked up by bags.
@@ -69,10 +69,10 @@
/obj/item/weapon/reagent_containers/afterattack(obj/target, mob/user , flag)
return
-/obj/item/weapon/reagent_containers/proc/reagentlist(var/obj/item/weapon/reagent_containers/snack) //Attack logs for regents in pills
+/obj/item/weapon/reagent_containers/proc/reagentlist(obj/item/weapon/reagent_containers/snack) //Attack logs for regents in pills
var/data
if(snack && snack.reagents && snack.reagents.reagent_list && snack.reagents.reagent_list.len) //find a reagent list if there is and check if it has entries
- for (var/datum/reagent/R in snack.reagents.reagent_list) //no reagents will be left behind
+ for(var/datum/reagent/R in snack.reagents.reagent_list) //no reagents will be left behind
data += "[R.id]([R.volume] units); " //Using IDs because SOME chemicals(I'm looking at you, chlorhydrate-beer) have the same names as other chemicals.
return data
else return "No reagents"
diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm
index 3312ec09af8..a04087603ad 100644
--- a/code/modules/reagents/reagent_containers/blood_pack.dm
+++ b/code/modules/reagents/reagent_containers/blood_pack.dm
@@ -7,22 +7,25 @@
var/blood_type = null
- New()
- ..()
- if(blood_type != null)
- name = "BloodPack [blood_type]"
- reagents.add_reagent("blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null))
- update_icon()
-
- on_reagent_change()
+/obj/item/weapon/reagent_containers/blood/New()
+ ..()
+ if(blood_type != null)
+ name = "BloodPack [blood_type]"
+ reagents.add_reagent("blood", 200, list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null))
update_icon()
+/obj/item/weapon/reagent_containers/blood/on_reagent_change()
update_icon()
- var/percent = round((reagents.total_volume / volume) * 100)
- switch(percent)
- if(0 to 9) icon_state = "empty"
- if(10 to 50) icon_state = "half"
- if(51 to INFINITY) icon_state = "full"
+
+/obj/item/weapon/reagent_containers/blood/update_icon()
+ var/percent = round((reagents.total_volume / volume) * 100)
+ switch(percent)
+ if(0 to 9)
+ icon_state = "empty"
+ if(10 to 50)
+ icon_state = "half"
+ if(51 to INFINITY)
+ icon_state = "full"
/obj/item/weapon/reagent_containers/blood/random/New()
blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-")
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 9d67bb22881..6f53f4c423b 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -60,7 +60,7 @@
return 1
// Use this to add more chemicals for the borghypo to produce.
-/obj/item/weapon/reagent_containers/borghypo/proc/add_reagent(var/reagent)
+/obj/item/weapon/reagent_containers/borghypo/proc/add_reagent(reagent)
reagent_ids |= reagent
var/datum/reagents/RG = new(30)
RG.my_atom = src
@@ -69,14 +69,14 @@
var/datum/reagents/R = reagent_list[reagent_list.len]
R.add_reagent(reagent, 30)
-/obj/item/weapon/reagent_containers/borghypo/attack(mob/living/M as mob, mob/user as mob)
+/obj/item/weapon/reagent_containers/borghypo/attack(mob/living/M, mob/user)
var/datum/reagents/R = reagent_list[mode]
if(!R.total_volume)
to_chat(user, "The injector is empty. ")
return
- if (!istype(M))
+ if(!istype(M))
return
- if (R.total_volume && M.can_inject(user, 1, penetrate_thick = bypass_protection))
+ if(R.total_volume && M.can_inject(user, 1, penetrate_thick = bypass_protection))
to_chat(user, "You inject [M] with the injector. ")
to_chat(M, "You feel a tiny prick! ")
@@ -94,7 +94,7 @@
to_chat(user, "[trans] units injected. [R.total_volume] units remaining. ")
return
-/obj/item/weapon/reagent_containers/borghypo/attack_self(mob/user as mob)
+/obj/item/weapon/reagent_containers/borghypo/attack_self(mob/user)
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) //Change the mode
mode++
if(mode > reagent_list.len)
diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm
similarity index 78%
rename from code/modules/reagents/reagent_containers/glass/bottle.dm
rename to code/modules/reagents/reagent_containers/bottle.dm
index ca4b15fc211..95fb36d439d 100644
--- a/code/modules/reagents/reagent_containers/glass/bottle.dm
+++ b/code/modules/reagents/reagent_containers/bottle.dm
@@ -1,417 +1,349 @@
-
-//Not to be confused with /obj/item/weapon/reagent_containers/food/drinks/bottle
-
-/obj/item/weapon/reagent_containers/glass/bottle
- name = "bottle"
- desc = "A small bottle."
- icon = 'icons/obj/chemical.dmi'
- icon_state = null
- item_state = "atoxinbottle"
- amount_per_transfer_from_this = 10
- possible_transfer_amounts = list(5,10,15,25,30)
- flags = OPENCONTAINER
- volume = 30
-
- New()
- ..()
- if(!icon_state)
- icon_state = "bottle[rand(1,20)]"
-
-
- //Copypasta from /obj/item/weapon/reagent_containers/glass/beaker
- on_reagent_change()
- update_icon()
-
- pickup(mob/user)
- ..()
- update_icon()
-
- dropped(mob/user)
- ..()
- update_icon()
-
- attack_hand()
- ..()
- update_icon()
-
- update_icon()
- overlays.Cut()
-
- if(reagents.total_volume)
- var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]10")
-
- var/percent = round((reagents.total_volume / volume) * 100)
- switch(percent)
- if(0 to 24) filling.icon_state = "[icon_state]10"
- if(25 to 49) filling.icon_state = "[icon_state]25"
- if(50 to 74) filling.icon_state = "[icon_state]50"
- if(75 to 90) filling.icon_state = "[icon_state]75"
- if(91 to INFINITY) filling.icon_state = "[icon_state]100"
-
- filling.icon += mix_color_from_reagents(reagents.reagent_list)
- overlays += filling
-
- if (!is_open_container())
- var/image/lid = image(icon, src, "lid_bottle")
- overlays += lid
-
-/obj/item/weapon/reagent_containers/glass/bottle/toxin
- name = "toxin bottle"
- desc = "A small bottle of toxins. Do not drink, it is poisonous."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle12"
-
- New()
- ..()
- reagents.add_reagent("toxin", 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/cyanide
- name = "cyanide bottle"
- desc = "A small bottle of cyanide. Bitter almonds?"
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle12"
-
- New()
- ..()
- reagents.add_reagent("cyanide", 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/mutagen
- name = "unstable mutagen bottle"
- desc = "A small bottle of unstable mutagen. Randomly changes the DNA structure of whoever comes in contact."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle20"
-
- New()
- ..()
- reagents.add_reagent("mutagen", 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/ammonia
- name = "ammonia bottle"
- desc = "A small bottle."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle20"
-
- New()
- ..()
- reagents.add_reagent("ammonia", 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/diethylamine
- name = "diethylamine bottle"
- desc = "A small bottle."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle17"
-
- New()
- ..()
- reagents.add_reagent("diethylamine", 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/facid
- name = "Fluorosulfuric Acid Bottle"
- desc = "A small bottle. Contains a small amount of Fluorosulfuric Acid"
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle17"
- New()
- ..()
- reagents.add_reagent("facid", 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/adminordrazine
- name = "Adminordrazine Bottle"
- desc = "A small bottle. Contains the liquid essence of the gods."
- icon = 'icons/obj/drinks.dmi'
- icon_state = "holyflask"
- New()
- ..()
- reagents.add_reagent("adminordrazine", 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/capsaicin
- name = "Capsaicin Bottle"
- desc = "A small bottle. Contains hot sauce."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle3"
- New()
- ..()
- reagents.add_reagent("capsaicin", 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/frostoil
- name = "Frost Oil Bottle"
- desc = "A small bottle. Contains cold sauce."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle17"
- New()
- ..()
- reagents.add_reagent("frostoil", 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/morphine
- name = "Morphine Bottle"
- desc = "A small bottle. Contains morphine."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle17"
- New()
- ..()
- reagents.add_reagent("morphine", 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/ether
- name = "Ether Bottle"
- desc = "A small bottle. Contains ether."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle17"
- New()
- ..()
- reagents.add_reagent("ether", 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/charcoal
- name = "Charcoal Bottle"
- desc = "A small bottle. Contains charcoal."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle17"
- New()
- ..()
- reagents.add_reagent("charcoal", 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/epinephrine
- name = "Epinephrine Bottle"
- desc = "A small bottle. Contains epinephrine."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle17"
- New()
- ..()
- reagents.add_reagent("epinephrine", 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/pancuronium
- name = "Pancuronium Bottle"
- desc = "A small bottle of pancuronium."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle14"
-
- New()
- ..()
- reagents.add_reagent("pancuronium", 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/sulfonal
- name = "Sulfonal Bottle"
- desc = "A small bottle of Sulfonal."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle19"
-
- New()
- ..()
- reagents.add_reagent("sulfonal", 30)
-
-//Reagent bottles
-
-/obj/item/weapon/reagent_containers/glass/bottle/reagent
- name = "Reagent Bottle"
- desc = "A bottle for storing reagents"
- icon_state = "rbottle"
- volume = 50
-
-/obj/item/weapon/reagent_containers/glass/bottle/reagent/oil
- name = "Oil Bottle"
- desc = "A reagent bottle. Contains oil."
- icon_state = "rbottle1"
- New()
- ..()
- reagents.add_reagent("oil", 50)
-
-/obj/item/weapon/reagent_containers/glass/bottle/reagent/phenol
- name = "Phenol Bottle"
- desc = "A reagent bottle. Contains phenol."
- icon_state = "rbottle2"
- New()
- ..()
- reagents.add_reagent("phenol", 50)
-
-/obj/item/weapon/reagent_containers/glass/bottle/reagent/acetone
- name = "Acetone Bottle"
- desc = "A reagent bottle. Contains acetone."
- icon_state = "rbottle3"
- New()
- ..()
- reagents.add_reagent("acetone", 50)
-
-/obj/item/weapon/reagent_containers/glass/bottle/reagent/ammonia
- name = "Ammonia Bottle"
- desc = "A reagent bottle. Contains ammonia."
- icon_state = "rbottle4"
- New()
- ..()
- reagents.add_reagent("ammonia", 50)
-
-/obj/item/weapon/reagent_containers/glass/bottle/reagent/diethylamine
- name = "Diethylamine Bottle"
- desc = "A reagent bottle. Contains diethylamine."
- icon_state = "rbottle5"
- New()
- ..()
- reagents.add_reagent("diethylamine", 50)
-
-/obj/item/weapon/reagent_containers/glass/bottle/reagent/acid
- name = "Acid Bottle"
- desc = "A reagent bottle. Contains sulfuric acid."
- icon_state = "rbottle6"
- New()
- ..()
- reagents.add_reagent("sacid", 50)
-
-/obj/item/weapon/reagent_containers/glass/bottle/reagent/formaldehyde
- name = "Formaldehyde Bottle"
- desc = "A reagent bottle. Contains formaldehyde."
- icon_state = "rbottle"
- New()
- ..()
- reagents.add_reagent("formaldehyde", 50)
-
-/obj/item/weapon/reagent_containers/glass/bottle/reagent/morphine
- name = "Morphine Bottle"
- desc = "A reagent bottle. Contains morphine."
- New()
- ..()
- reagents.add_reagent("morphine", 50)
-
-/obj/item/weapon/reagent_containers/glass/bottle/reagent/insulin
- name = "Insulin Bottle"
- desc = "A reagent bottle. Contains insulin."
- New()
- ..()
- reagents.add_reagent("insulin", 50)
-
-
-/obj/item/weapon/reagent_containers/glass/bottle/reagent/hairgrownium
- name = "Hair Grow Gel"
- desc = "A bottle full of a stimulative hair growth formula"
- New()
- ..()
- reagents.add_reagent("hairgrownium", 50)
-
-/obj/item/weapon/reagent_containers/glass/bottle/reagent/hair_dye
- name = "Quantum Hair Dye Bottle"
- desc = "A bottle of the ever-changing quantum hair dye."
- New()
- ..()
- reagents.add_reagent("hair_dye", 50)
-
-////////////////////Traitor Poison Bottle//////////////////////////////
-
-/obj/item/weapon/reagent_containers/glass/bottle/traitor
- desc = "It has a small skull and crossbones on it. Uh-oh!"
- possible_transfer_amounts = list(5,10,15,25,30,40)
- volume = 40
-
- New()
- ..()
- reagents.add_reagent(pick_list("chemistry_tools.json", "traitor_poison_bottle"), 40)
-
-/obj/item/weapon/reagent_containers/glass/bottle/plasma
- name = "plasma dust bottle"
- desc = "A small bottle of plasma in dust form. Extremely toxic and reacts with micro-organisms inside blood."
- icon_state = "bottle8"
- list_reagents = list("plasma_dust" = 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/diphenhydramine
- name = "diphenhydramine bottle"
- desc = "A small bottle of diphenhydramine."
- icon_state = "bottle20"
- list_reagents = list("diphenhydramine" = 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/flu_virion
- name = "Flu virion culture bottle"
- desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium."
- icon_state = "bottle3"
- spawned_disease = /datum/disease/advance/flu
-
-/obj/item/weapon/reagent_containers/glass/bottle/epiglottis_virion
- name = "Epiglottis virion culture bottle"
- desc = "A small bottle. Contains Epiglottis virion culture in synthblood medium."
- icon_state = "bottle3"
- spawned_disease = /datum/disease/advance/voice_change
-
-/obj/item/weapon/reagent_containers/glass/bottle/liver_enhance_virion
- name = "Liver enhancement virion culture bottle"
- desc = "A small bottle. Contains liver enhancement virion culture in synthblood medium."
- icon_state = "bottle3"
- spawned_disease = /datum/disease/advance/heal
-
-/obj/item/weapon/reagent_containers/glass/bottle/hullucigen_virion
- name = "Hullucigen virion culture bottle"
- desc = "A small bottle. Contains hullucigen virion culture in synthblood medium."
- icon_state = "bottle3"
- spawned_disease = /datum/disease/advance/hullucigen
-
-/obj/item/weapon/reagent_containers/glass/bottle/pierrot_throat
- name = "Pierrot's Throat culture bottle"
- desc = "A small bottle. Contains H0NI<42 virion culture in synthblood medium."
- icon_state = "bottle3"
- spawned_disease = /datum/disease/pierrot_throat
-
-/obj/item/weapon/reagent_containers/glass/bottle/cold
- name = "Rhinovirus culture bottle"
- desc = "A small bottle. Contains XY-rhinovirus culture in synthblood medium."
- icon_state = "bottle3"
- spawned_disease = /datum/disease/advance/cold
-
-/obj/item/weapon/reagent_containers/glass/bottle/retrovirus
- name = "Retrovirus culture bottle"
- desc = "A small bottle. Contains a retrovirus culture in a synthblood medium."
- icon_state = "bottle3"
- spawned_disease = /datum/disease/dna_retrovirus
-
-/obj/item/weapon/reagent_containers/glass/bottle/gbs
- name = "GBS culture bottle"
- desc = "A small bottle. Contains Gravitokinetic Bipotential SADS+ culture in synthblood medium."//Or simply - General BullShit
- icon_state = "bottle3"
- amount_per_transfer_from_this = 5
- spawned_disease = /datum/disease/gbs
-
-/obj/item/weapon/reagent_containers/glass/bottle/fake_gbs
- name = "GBS culture bottle"
- desc = "A small bottle. Contains Gravitokinetic Bipotential SADS- culture in synthblood medium."//Or simply - General BullShit
- icon_state = "bottle3"
- spawned_disease = /datum/disease/fake_gbs
-
-/obj/item/weapon/reagent_containers/glass/bottle/brainrot
- name = "Brainrot culture bottle"
- desc = "A small bottle. Contains Cryptococcus Cosmosis culture in synthblood medium."
- icon_state = "bottle3"
- spawned_disease = /datum/disease/brainrot
-
-/obj/item/weapon/reagent_containers/glass/bottle/magnitis
- name = "Magnitis culture bottle"
- desc = "A small bottle. Contains a small dosage of Fukkos Miracos."
- icon_state = "bottle3"
- spawned_disease = /datum/disease/magnitis
-
-/obj/item/weapon/reagent_containers/glass/bottle/wizarditis
- name = "Wizarditis culture bottle"
- desc = "A small bottle. Contains a sample of Rincewindus Vulgaris."
- icon_state = "bottle3"
- spawned_disease = /datum/disease/wizarditis
-
-/obj/item/weapon/reagent_containers/glass/bottle/anxiety
- name = "Severe Anxiety culture bottle"
- desc = "A small bottle. Contains a sample of Lepidopticides."
- icon_state = "bottle3"
- spawned_disease = /datum/disease/anxiety
-
-/obj/item/weapon/reagent_containers/glass/bottle/beesease
- name = "Beesease culture bottle"
- desc = "A small bottle. Contains a sample of invasive Apidae."
- icon_state = "bottle3"
- spawned_disease = /datum/disease/beesease
-
-/obj/item/weapon/reagent_containers/glass/bottle/fluspanish
- name = "Spanish flu culture bottle"
- desc = "A small bottle. Contains a sample of Inquisitius."
- icon_state = "bottle3"
- spawned_disease = /datum/disease/fluspanish
-
-/obj/item/weapon/reagent_containers/glass/bottle/tuberculosis
- name = "Fungal Tuberculosis culture bottle"
- desc = "A small bottle. Contains a sample of Fungal Tubercle bacillus."
- icon_state = "bottle3"
- spawned_disease = /datum/disease/tuberculosis
-
-/obj/item/weapon/reagent_containers/glass/bottle/tuberculosiscure
- name = "BVAK bottle"
- desc = "A small bottle containing Bio Virus Antidote Kit."
- icon_state = "bottle5"
- list_reagents = list("atropine" = 5, "epinephrine" = 5, "salbutamol" = 10, "spaceacillin" = 10)
+
+//Not to be confused with /obj/item/weapon/reagent_containers/food/drinks/bottle
+
+/obj/item/weapon/reagent_containers/glass/bottle
+ name = "bottle"
+ desc = "A small bottle."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = null
+ item_state = "atoxinbottle"
+ amount_per_transfer_from_this = 10
+ possible_transfer_amounts = list(5,10,15,25,30)
+ flags = OPENCONTAINER
+ volume = 30
+
+/obj/item/weapon/reagent_containers/glass/bottle/New()
+ ..()
+ if(!icon_state)
+ icon_state = "bottle[rand(1,20)]"
+
+/obj/item/weapon/reagent_containers/glass/bottle/on_reagent_change()
+ update_icon()
+
+/obj/item/weapon/reagent_containers/glass/bottle/update_icon()
+ overlays.Cut()
+
+ if(reagents.total_volume)
+ var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]10")
+
+ var/percent = round((reagents.total_volume / volume) * 100)
+ switch(percent)
+ if(0 to 24)
+ filling.icon_state = "[icon_state]10"
+ if(25 to 49)
+ filling.icon_state = "[icon_state]25"
+ if(50 to 74)
+ filling.icon_state = "[icon_state]50"
+ if(75 to 90)
+ filling.icon_state = "[icon_state]75"
+ if(91 to INFINITY)
+ filling.icon_state = "[icon_state]100"
+
+ filling.icon += mix_color_from_reagents(reagents.reagent_list)
+ overlays += filling
+
+ if(!is_open_container())
+ var/image/lid = image(icon, src, "lid_bottle")
+ overlays += lid
+
+/obj/item/weapon/reagent_containers/glass/bottle/toxin
+ name = "toxin bottle"
+ desc = "A small bottle of toxins. Do not drink, it is poisonous."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle12"
+ list_reagents = list("toxin" = 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/cyanide
+ name = "cyanide bottle"
+ desc = "A small bottle of cyanide. Bitter almonds?"
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle12"
+ list_reagents = list("cyanide" = 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/mutagen
+ name = "unstable mutagen bottle"
+ desc = "A small bottle of unstable mutagen. Randomly changes the DNA structure of whoever comes in contact."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle20"
+ list_reagents = list("mutagen" = 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/ammonia
+ name = "ammonia bottle"
+ desc = "A small bottle."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle20"
+ list_reagents = list("ammonia" = 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/diethylamine
+ name = "diethylamine bottle"
+ desc = "A small bottle."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle17"
+ list_reagents = list("diethylamine" = 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/facid
+ name = "Fluorosulfuric Acid Bottle"
+ desc = "A small bottle. Contains a small amount of Fluorosulfuric Acid"
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle17"
+ list_reagents = list("facid" = 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/adminordrazine
+ name = "Adminordrazine Bottle"
+ desc = "A small bottle. Contains the liquid essence of the gods."
+ icon = 'icons/obj/drinks.dmi'
+ icon_state = "holyflask"
+ list_reagents = list("adminordrazine" = 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/capsaicin
+ name = "Capsaicin Bottle"
+ desc = "A small bottle. Contains hot sauce."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle3"
+ list_reagents = list("capsaicin" = 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/frostoil
+ name = "Frost Oil Bottle"
+ desc = "A small bottle. Contains cold sauce."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle17"
+ list_reagents = list("frostoil" = 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/morphine
+ name = "Morphine Bottle"
+ desc = "A small bottle. Contains morphine."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle17"
+ list_reagents = list("morphine" = 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/ether
+ name = "Ether Bottle"
+ desc = "A small bottle. Contains ether."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle17"
+ list_reagents = list("ether" = 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/charcoal
+ name = "Charcoal Bottle"
+ desc = "A small bottle. Contains charcoal."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle17"
+ list_reagents = list("charcoal" = 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/epinephrine
+ name = "Epinephrine Bottle"
+ desc = "A small bottle. Contains epinephrine."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle17"
+ list_reagents = list("epinephrine" = 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/pancuronium
+ name = "Pancuronium Bottle"
+ desc = "A small bottle of pancuronium."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle14"
+ list_reagents = list("pancuronium" = 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/sulfonal
+ name = "Sulfonal Bottle"
+ desc = "A small bottle of Sulfonal."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle19"
+ list_reagents = list("sulfonal" = 30)
+
+//Reagent bottles
+
+/obj/item/weapon/reagent_containers/glass/bottle/reagent
+ name = "Reagent Bottle"
+ desc = "A bottle for storing reagents"
+ icon_state = "rbottle"
+ volume = 50
+
+/obj/item/weapon/reagent_containers/glass/bottle/reagent/oil
+ name = "Oil Bottle"
+ desc = "A reagent bottle. Contains oil."
+ icon_state = "rbottle1"
+ list_reagents = list("oil" = 50)
+
+/obj/item/weapon/reagent_containers/glass/bottle/reagent/phenol
+ name = "Phenol Bottle"
+ desc = "A reagent bottle. Contains phenol."
+ icon_state = "rbottle2"
+ list_reagents = list("phenol" = 50)
+
+/obj/item/weapon/reagent_containers/glass/bottle/reagent/acetone
+ name = "Acetone Bottle"
+ desc = "A reagent bottle. Contains acetone."
+ icon_state = "rbottle3"
+ list_reagents = list("acetone" = 50)
+
+/obj/item/weapon/reagent_containers/glass/bottle/reagent/ammonia
+ name = "Ammonia Bottle"
+ desc = "A reagent bottle. Contains ammonia."
+ icon_state = "rbottle4"
+ list_reagents = list("ammonia" = 50)
+
+/obj/item/weapon/reagent_containers/glass/bottle/reagent/diethylamine
+ name = "Diethylamine Bottle"
+ desc = "A reagent bottle. Contains diethylamine."
+ icon_state = "rbottle5"
+ list_reagents = list("diethylamine" = 50)
+
+/obj/item/weapon/reagent_containers/glass/bottle/reagent/acid
+ name = "Acid Bottle"
+ desc = "A reagent bottle. Contains sulfuric acid."
+ icon_state = "rbottle6"
+ list_reagents = list("sacid" = 50)
+
+/obj/item/weapon/reagent_containers/glass/bottle/reagent/formaldehyde
+ name = "Formaldehyde Bottle"
+ desc = "A reagent bottle. Contains formaldehyde."
+ icon_state = "rbottle"
+ list_reagents = list("formaldehyde" = 50)
+
+/obj/item/weapon/reagent_containers/glass/bottle/reagent/morphine
+ name = "Morphine Bottle"
+ desc = "A reagent bottle. Contains morphine."
+ list_reagents = list("morphine" = 50)
+
+/obj/item/weapon/reagent_containers/glass/bottle/reagent/insulin
+ name = "Insulin Bottle"
+ desc = "A reagent bottle. Contains insulin."
+ list_reagents = list("insulin" = 50)
+
+
+/obj/item/weapon/reagent_containers/glass/bottle/reagent/hairgrownium
+ name = "Hair Grow Gel"
+ desc = "A bottle full of a stimulative hair growth formula"
+ list_reagents = list("hairgrownium" = 50)
+
+/obj/item/weapon/reagent_containers/glass/bottle/reagent/hair_dye
+ name = "Quantum Hair Dye Bottle"
+ desc = "A bottle of the ever-changing quantum hair dye."
+ list_reagents = list("hair_dye" = 50)
+
+////////////////////Traitor Poison Bottle//////////////////////////////
+
+/obj/item/weapon/reagent_containers/glass/bottle/traitor
+ desc = "It has a small skull and crossbones on it. Uh-oh!"
+ possible_transfer_amounts = list(5,10,15,25,30,40)
+ volume = 40
+
+/obj/item/weapon/reagent_containers/glass/bottle/traitor/New()
+ ..()
+ reagents.add_reagent(pick_list("chemistry_tools.json", "traitor_poison_bottle"), 40)
+
+/obj/item/weapon/reagent_containers/glass/bottle/plasma
+ name = "plasma dust bottle"
+ desc = "A small bottle of plasma in dust form. Extremely toxic and reacts with micro-organisms inside blood."
+ icon_state = "bottle8"
+ list_reagents = list("plasma_dust" = 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/diphenhydramine
+ name = "diphenhydramine bottle"
+ desc = "A small bottle of diphenhydramine."
+ icon_state = "bottle20"
+ list_reagents = list("diphenhydramine" = 30)
+
+/obj/item/weapon/reagent_containers/glass/bottle/flu_virion
+ name = "Flu virion culture bottle"
+ desc = "A small bottle. Contains H13N1 flu virion culture in synthblood medium."
+ icon_state = "bottle3"
+ spawned_disease = /datum/disease/advance/flu
+
+/obj/item/weapon/reagent_containers/glass/bottle/epiglottis_virion
+ name = "Epiglottis virion culture bottle"
+ desc = "A small bottle. Contains Epiglottis virion culture in synthblood medium."
+ icon_state = "bottle3"
+ spawned_disease = /datum/disease/advance/voice_change
+
+/obj/item/weapon/reagent_containers/glass/bottle/liver_enhance_virion
+ name = "Liver enhancement virion culture bottle"
+ desc = "A small bottle. Contains liver enhancement virion culture in synthblood medium."
+ icon_state = "bottle3"
+ spawned_disease = /datum/disease/advance/heal
+
+/obj/item/weapon/reagent_containers/glass/bottle/hullucigen_virion
+ name = "Hullucigen virion culture bottle"
+ desc = "A small bottle. Contains hullucigen virion culture in synthblood medium."
+ icon_state = "bottle3"
+ spawned_disease = /datum/disease/advance/hullucigen
+
+/obj/item/weapon/reagent_containers/glass/bottle/pierrot_throat
+ name = "Pierrot's Throat culture bottle"
+ desc = "A small bottle. Contains H0NI<42 virion culture in synthblood medium."
+ icon_state = "bottle3"
+ spawned_disease = /datum/disease/pierrot_throat
+
+/obj/item/weapon/reagent_containers/glass/bottle/cold
+ name = "Rhinovirus culture bottle"
+ desc = "A small bottle. Contains XY-rhinovirus culture in synthblood medium."
+ icon_state = "bottle3"
+ spawned_disease = /datum/disease/advance/cold
+
+/obj/item/weapon/reagent_containers/glass/bottle/retrovirus
+ name = "Retrovirus culture bottle"
+ desc = "A small bottle. Contains a retrovirus culture in a synthblood medium."
+ icon_state = "bottle3"
+ spawned_disease = /datum/disease/dna_retrovirus
+
+/obj/item/weapon/reagent_containers/glass/bottle/gbs
+ name = "GBS culture bottle"
+ desc = "A small bottle. Contains Gravitokinetic Bipotential SADS+ culture in synthblood medium."//Or simply - General BullShit
+ icon_state = "bottle3"
+ amount_per_transfer_from_this = 5
+ spawned_disease = /datum/disease/gbs
+
+/obj/item/weapon/reagent_containers/glass/bottle/fake_gbs
+ name = "GBS culture bottle"
+ desc = "A small bottle. Contains Gravitokinetic Bipotential SADS- culture in synthblood medium."//Or simply - General BullShit
+ icon_state = "bottle3"
+ spawned_disease = /datum/disease/fake_gbs
+
+/obj/item/weapon/reagent_containers/glass/bottle/brainrot
+ name = "Brainrot culture bottle"
+ desc = "A small bottle. Contains Cryptococcus Cosmosis culture in synthblood medium."
+ icon_state = "bottle3"
+ spawned_disease = /datum/disease/brainrot
+
+/obj/item/weapon/reagent_containers/glass/bottle/magnitis
+ name = "Magnitis culture bottle"
+ desc = "A small bottle. Contains a small dosage of Fukkos Miracos."
+ icon_state = "bottle3"
+ spawned_disease = /datum/disease/magnitis
+
+/obj/item/weapon/reagent_containers/glass/bottle/wizarditis
+ name = "Wizarditis culture bottle"
+ desc = "A small bottle. Contains a sample of Rincewindus Vulgaris."
+ icon_state = "bottle3"
+ spawned_disease = /datum/disease/wizarditis
+
+/obj/item/weapon/reagent_containers/glass/bottle/anxiety
+ name = "Severe Anxiety culture bottle"
+ desc = "A small bottle. Contains a sample of Lepidopticides."
+ icon_state = "bottle3"
+ spawned_disease = /datum/disease/anxiety
+
+/obj/item/weapon/reagent_containers/glass/bottle/beesease
+ name = "Beesease culture bottle"
+ desc = "A small bottle. Contains a sample of invasive Apidae."
+ icon_state = "bottle3"
+ spawned_disease = /datum/disease/beesease
+
+/obj/item/weapon/reagent_containers/glass/bottle/fluspanish
+ name = "Spanish flu culture bottle"
+ desc = "A small bottle. Contains a sample of Inquisitius."
+ icon_state = "bottle3"
+ spawned_disease = /datum/disease/fluspanish
+
+/obj/item/weapon/reagent_containers/glass/bottle/tuberculosis
+ name = "Fungal Tuberculosis culture bottle"
+ desc = "A small bottle. Contains a sample of Fungal Tubercle bacillus."
+ icon_state = "bottle3"
+ spawned_disease = /datum/disease/tuberculosis
+
+/obj/item/weapon/reagent_containers/glass/bottle/tuberculosiscure
+ name = "BVAK bottle"
+ desc = "A small bottle containing Bio Virus Antidote Kit."
+ icon_state = "bottle5"
+ list_reagents = list("atropine" = 5, "epinephrine" = 5, "salbutamol" = 10, "spaceacillin" = 10)
diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm
index 13f4904369c..419325445f0 100644
--- a/code/modules/reagents/reagent_containers/dropper.dm
+++ b/code/modules/reagents/reagent_containers/dropper.dm
@@ -11,111 +11,98 @@
volume = 5
var/filled = 0
- afterattack(obj/target, mob/user , flag)
- if(!target.reagents) return
-
- if(filled)
-
- if(target.reagents.total_volume >= target.reagents.maximum_volume)
- to_chat(user, "\red [target] is full.")
- return
-
- if(!target.is_open_container() && !ismob(target) && !istype(target,/obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/clothing/mask/cigarette)) //You can inject humans and food but you cant remove the shit.
- to_chat(user, "\red You cannot directly fill this object.")
- return
-
- var/trans = 0
-
- if(ismob(target))
- if(istype(target , /mob/living/carbon/human))
- var/mob/living/carbon/human/victim = target
-
- var/obj/item/safe_thing = null
- if( victim.wear_mask )
- if ( victim.wear_mask.flags & MASKCOVERSEYES )
- safe_thing = victim.wear_mask
- if( victim.head )
- if ( victim.head.flags & MASKCOVERSEYES )
- safe_thing = victim.head
- if(victim.glasses)
- if ( !safe_thing )
- safe_thing = victim.glasses
-
- if(safe_thing)
- if(!safe_thing.reagents)
- safe_thing.create_reagents(100)
- trans = src.reagents.trans_to(safe_thing, amount_per_transfer_from_this)
-
- for(var/mob/O in viewers(world.view, user))
- O.show_message(text("\red [] tries to squirt something into []'s eyes, but fails! ", user, target), 1)
- spawn(5)
- src.reagents.reaction(safe_thing, TOUCH)
-
-
-
- to_chat(user, "\blue You transfer [trans] units of the solution.")
- if (src.reagents.total_volume<=0)
- filled = 0
- icon_state = "[initial(icon_state)]"
- return
-
-
- for(var/mob/O in viewers(world.view, user))
- O.show_message(text("\red [] squirts something into []'s eyes! ", user, target), 1)
- src.reagents.reaction(target, TOUCH)
-
- var/mob/living/M = target
-
- var/list/injected = list()
- for(var/datum/reagent/R in src.reagents.reagent_list)
- injected += R.name
- var/contained = english_list(injected)
- M.attack_log += text("\[[time_stamp()]\] Has been squirted with [src.name] by [key_name(user)]. Reagents: [contained] ")
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to squirt [key_name(M)]. Reagents: [contained] ")
- if(M.ckey)
- msg_admin_attack("[key_name_admin(user)] squirted [key_name_admin(M)] with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])")
- if(!iscarbon(user))
- M.LAssailant = null
- else
- M.LAssailant = user
-
- // /vg/: Logging transfers of bad things
- if(isobj(target))
- if(target.reagents_to_log.len)
- var/list/badshit=list()
- for(var/bad_reagent in target.reagents_to_log)
- if(reagents.has_reagent(bad_reagent))
- badshit += reagents_to_log[bad_reagent]
- if(badshit.len)
- var/hl="\red ([english_list(badshit)]) \black"
- message_admins("[key_name_admin(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl]")
- log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].")
-
- trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
- to_chat(user, "\blue You transfer [trans] units of the solution.")
- if (src.reagents.total_volume<=0)
- filled = 0
- icon_state = "[initial(icon_state)]"
-
- else
-
- if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers))
- to_chat(user, "\red You cannot directly remove reagents from [target].")
- return
-
- if(!target.reagents.total_volume)
- to_chat(user, "\red [target] is empty.")
- return
-
- var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
-
- to_chat(user, "\blue You fill the [src] with [trans] units of the solution.")
-
- filled = 1
- icon_state = "[initial(icon_state)][filled]"
-
+/obj/item/weapon/reagent_containers/dropper/afterattack(obj/target, mob/user , flag)
+ if(!target.reagents)
return
+ if(filled)
+
+ if(target.reagents.total_volume >= target.reagents.maximum_volume)
+ to_chat(user, "\red [target] is full.")
+ return
+
+ if(!target.is_open_container() && !ismob(target) && !istype(target,/obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/clothing/mask/cigarette)) //You can inject humans and food but you cant remove the shit.
+ to_chat(user, "\red You cannot directly fill this object.")
+ return
+
+ var/trans = 0
+
+ if(ismob(target))
+ if(istype(target , /mob/living/carbon/human))
+ var/mob/living/carbon/human/victim = target
+
+ var/obj/item/safe_thing = null
+ if( victim.wear_mask )
+ if( victim.wear_mask.flags & MASKCOVERSEYES )
+ safe_thing = victim.wear_mask
+ if( victim.head )
+ if( victim.head.flags & MASKCOVERSEYES )
+ safe_thing = victim.head
+ if(victim.glasses)
+ if( !safe_thing )
+ safe_thing = victim.glasses
+
+ if(safe_thing)
+ if(!safe_thing.reagents)
+ safe_thing.create_reagents(100)
+ trans = src.reagents.trans_to(safe_thing, amount_per_transfer_from_this)
+
+ for(var/mob/O in viewers(world.view, user))
+ O.show_message(text("\red [] tries to squirt something into []'s eyes, but fails! ", user, target), 1)
+ spawn(5)
+ src.reagents.reaction(safe_thing, TOUCH)
+
+
+
+ to_chat(user, "\blue You transfer [trans] units of the solution.")
+ if(src.reagents.total_volume<=0)
+ filled = 0
+ icon_state = "[initial(icon_state)]"
+ return
+
+
+ for(var/mob/O in viewers(world.view, user))
+ O.show_message(text("\red [] squirts something into []'s eyes! ", user, target), 1)
+ src.reagents.reaction(target, TOUCH)
+
+ var/mob/living/M = target
+
+ var/list/injected = list()
+ for(var/datum/reagent/R in src.reagents.reagent_list)
+ injected += R.name
+ var/contained = english_list(injected)
+ M.attack_log += text("\[[time_stamp()]\] Has been squirted with [src.name] by [key_name(user)]. Reagents: [contained] ")
+ user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to squirt [key_name(M)]. Reagents: [contained] ")
+ if(M.ckey)
+ msg_admin_attack("[key_name_admin(user)] squirted [key_name_admin(M)] with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])")
+ if(!iscarbon(user))
+ M.LAssailant = null
+ else
+ M.LAssailant = user
+
+ trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
+ to_chat(user, "\blue You transfer [trans] units of the solution.")
+ if(src.reagents.total_volume<=0)
+ filled = 0
+ icon_state = "[initial(icon_state)]"
+
+ else
+
+ if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers))
+ to_chat(user, "\red You cannot directly remove reagents from [target].")
+ return
+
+ if(!target.reagents.total_volume)
+ to_chat(user, "\red [target] is empty.")
+ return
+
+ var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
+
+ to_chat(user, "\blue You fill the [src] with [trans] units of the solution.")
+
+ filled = 1
+ icon_state = "[initial(icon_state)][filled]"
+
/obj/item/weapon/reagent_containers/dropper/cyborg
name = "Industrial Dropper"
desc = "A larger dropper. Transfers 10 units."
diff --git a/code/modules/reagents/reagent_containers/drugs.dm b/code/modules/reagents/reagent_containers/drugs.dm
deleted file mode 100644
index db162b6f7cc..00000000000
--- a/code/modules/reagents/reagent_containers/drugs.dm
+++ /dev/null
@@ -1,132 +0,0 @@
-/obj/item/weapon/reagent_containers/drugs
- name = " "
- var/base_name = " "
- desc = " "
- icon = 'icons/obj/chemical.dmi'
- icon_state = "baggie"
- item_state = "beaker"
- amount_per_transfer_from_this = 2
- possible_transfer_amounts = 2
- volume = 10
- flags = OPENCONTAINER
-
- var/label_text = ""
-
- New()
- ..()
- src.pixel_x = rand(-10.0, 10) //Randomizes postion
- src.pixel_y = rand(-10.0, 10)
- base_name = name
-
- afterattack(obj/target, mob/user, proximity)
- if(!proximity) return
-
- if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
-
- if(!target.reagents.total_volume && target.reagents)
- to_chat(user, "\red [target] is empty.")
- return
-
- if(reagents.total_volume >= reagents.maximum_volume)
- to_chat(user, "\red [src] is full.")
- return
-
- for(var/datum/reagent/A in target.reagents.reagent_list)
- if(A.reagent_state != 1)
- to_chat(user, "\red You can only put powders in [src].")
- return
-
- var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this)
- to_chat(user, "\blue You fill [src] with [trans] units of the contents of [target].")
-
- else if(target.is_open_container() && target.reagents) //Something like a glass. Player probably wants to transfer TO it.
- if(!reagents.total_volume)
- to_chat(user, "\red [src] is empty.")
- return
-
- if(target.reagents.total_volume >= target.reagents.maximum_volume)
- to_chat(user, "\red [target] is full.")
- return
-
- // /vg/: Logging transfers of bad things
- if(target.reagents_to_log.len)
- var/list/badshit=list()
- for(var/bad_reagent in target.reagents_to_log)
- if(reagents.has_reagent(bad_reagent))
- badshit += reagents_to_log[bad_reagent]
- if(badshit.len)
- var/hl="\red ([english_list(badshit)]) \black"
- message_admins("[key_name_admin(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl]")
- log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].")
-
- var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
- to_chat(user, "\blue You transfer [trans] units of the solution to [target].")
-
- //Safety for dumping stuff into a ninja suit. It handles everything through attackby() and this is unnecessary.
-
- /*else if(istype(target, /obj/machinery/bunsen_burner))
- return
-
- else if(istype(target, /obj/machinery/radiocarbon_spectrometer))
- return*/
-
-
- attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/device/flashlight/pen))
- var/tmp_label = sanitize(input(user, "Enter a label for [src.name]","Label",src.label_text))
- if(length(tmp_label) > 10)
- to_chat(user, "\red The label can be at most 10 characters long.")
- else
- to_chat(user, "\blue You set the label to \"[tmp_label]\".")
- src.label_text = tmp_label
- src.update_name_label()
-
- proc/update_name_label()
- if(src.label_text == "")
- src.name = src.base_name
- else
- src.name = "[src.base_name] ([src.label_text])"
-
-/obj/item/weapon/reagent_containers/drugs/baggie
- name = "baggie"
- desc = "A baggie. Can hold up to 10 units."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "baggie"
- item_state = "beaker"
-
- on_reagent_change()
- update_icon()
-
- pickup(mob/user)
- ..()
- update_icon()
-
- dropped(mob/user)
- ..()
- update_icon()
-
- attack_hand()
- ..()
- update_icon()
-
- update_icon()
- overlays.Cut()
-
- if(reagents.total_volume)
- var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]2")
-
- switch(reagents.total_volume)
- if(0 to 2) filling.icon_state = "[icon_state]2"
- if(3 to 4) filling.icon_state = "[icon_state]4"
- if(5 to 6) filling.icon_state = "[icon_state]6"
- if(7 to 8) filling.icon_state = "[icon_state]8"
- if(9 to 10) filling.icon_state = "[icon_state]10"
-
-
- filling.icon += mix_color_from_reagents(reagents.reagent_list)
- overlays += filling
-
-/obj/item/weapon/reagent_containers/drugs/baggie/meth
- New()
- ..()
- reagents.add_reagent("methamphetamine", 10)
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/food.dm b/code/modules/reagents/reagent_containers/food.dm
index 50a3ecd1a1d..6bf920f5e64 100644
--- a/code/modules/reagents/reagent_containers/food.dm
+++ b/code/modules/reagents/reagent_containers/food.dm
@@ -13,6 +13,6 @@
var/instant_application = 0 //if we want to bypass the forcedfeed delay
/obj/item/weapon/reagent_containers/food/New()
- ..()
- src.pixel_x = rand(-10.0, 10) //Randomizes postion
- src.pixel_y = rand(-10.0, 10)
\ No newline at end of file
+ ..()
+ pixel_x = rand(-10, 10) //Randomizes postion
+ pixel_y = rand(-10, 10)
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/food/cans.dm b/code/modules/reagents/reagent_containers/food/cans.dm
index f037fe6612a..6d72ec2221c 100644
--- a/code/modules/reagents/reagent_containers/food/cans.dm
+++ b/code/modules/reagents/reagent_containers/food/cans.dm
@@ -1,13 +1,14 @@
/obj/item/weapon/reagent_containers/food/drinks/cans
- var canopened = 0
- var is_glass = 0
+ var/canopened = 0
+ var/is_glass = 0
+ var/is_plastic = 0
/obj/item/weapon/reagent_containers/food/drinks/cans/New()
..()
flags &= ~OPENCONTAINER
-/obj/item/weapon/reagent_containers/food/drinks/cans/attack_self(mob/user as mob)
- if (canopened == 0)
+/obj/item/weapon/reagent_containers/food/drinks/cans/attack_self(mob/user)
+ if(canopened == 0)
playsound(src.loc,'sound/effects/canopen.ogg', rand(10,50), 1)
to_chat(user, "You open the drink with an audible pop! ")
canopened = 1
@@ -16,6 +17,9 @@
/obj/item/weapon/reagent_containers/food/drinks/cans/proc/crush(mob/user)
var/obj/item/trash/can/crushed_can = new /obj/item/trash/can(user.loc)
crushed_can.icon_state = icon_state
+ //inherit material vars for recycling purposes
+ crushed_can.is_glass = is_glass
+ crushed_can.is_plastic = is_plastic
if(is_glass)
playsound(user.loc, 'sound/effects/Glassbr3.ogg', rand(10, 50), 1)
crushed_can.name = "broken bottle"
@@ -24,7 +28,7 @@
qdel(src)
return crushed_can
-/obj/item/weapon/reagent_containers/food/drinks/cans/attack(mob/M as mob, mob/user as mob, proximity)
+/obj/item/weapon/reagent_containers/food/drinks/cans/attack(mob/M, mob/user, proximity)
if(canopened == 0)
to_chat(user, "You need to open the drink! ")
return
@@ -54,93 +58,46 @@
else
return ..(target, user, proximity)
-/* examine(mob/user)
- if(!..(user, 1))
- return
- if(!reagents || reagents.total_volume==0)
- to_chat(user, "\blue \The [src] is empty!")
- else if (reagents.total_volume<=src.volume/4)
- to_chat(user, "\blue \The [src] is almost empty!")
- else if (reagents.total_volume<=src.volume*0.66)
- to_chat(user, "\blue \The [src] is half full!")
- else if (reagents.total_volume<=src.volume*0.90)
- to_chat(user, "\blue \The [src] is almost full!")
- else
- to_chat(user, "\blue \The [src] is full!")*/
-
-
-//DRINKS
-
/obj/item/weapon/reagent_containers/food/drinks/cans/cola
name = "Space Cola"
desc = "Cola. in space."
icon_state = "cola"
- New()
- ..()
- reagents.add_reagent("cola", 30)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("cola" = 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle
name = "Bottled Water"
desc = "Introduced to the vending machines by Skrellian request, this water comes straight from the Martian poles."
icon_state = "waterbottle"
- New()
- ..()
- reagents.add_reagent("water", 30)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ is_plastic = 1
+ list_reagents = list("water" = 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/beer
name = "Space Beer"
desc = "Contains only water, malt and hops."
icon_state = "beer"
is_glass = 1
- New()
- ..()
- reagents.add_reagent("beer", 30)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("beer" = 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/adminbooze
name = "Admin Booze"
desc = "Bottled Griffon tears. Drink with caution."
icon_state = "adminbooze"
is_glass = 1
- New()
- ..()
- reagents.add_reagent("adminordrazine", 5)
- reagents.add_reagent("capsaicin", 5)
- reagents.add_reagent("methamphetamine", 20)
- reagents.add_reagent("thirteenloko", 20)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("adminordrazine" = 5, "capsaicin" = 5, "methamphetamine"= 20, "thirteenloko" = 20)
/obj/item/weapon/reagent_containers/food/drinks/cans/madminmalt
name = "Madmin Malt"
desc = "Bottled essence of angry admins. Drink with EXTREME caution."
icon_state = "madminmalt"
is_glass = 1
- New()
- ..()
- reagents.add_reagent("hell_water", 20)
- reagents.add_reagent("neurotoxin", 15)
- reagents.add_reagent("thirteenloko", 15)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("hell_water" = 20, "neurotoxin" = 15, "thirteenloko" = 15)
/obj/item/weapon/reagent_containers/food/drinks/cans/badminbrew
name = "Badmin Brew"
desc = "Bottled trickery and terrible admin work. Probably shouldn't drink this one at all."
icon_state = "badminbrew"
is_glass = 1
- New()
- ..()
- reagents.add_reagent("mutagen", 25)
- reagents.add_reagent("charcoal", 10)
- reagents.add_reagent("thirteenloko", 15)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("mutagen" = 25, "charcoal" = 10, "thirteenloko" = 15)
/obj/item/weapon/reagent_containers/food/drinks/cans/ale
name = "Magm-Ale"
@@ -148,114 +105,119 @@
icon_state = "alebottle"
item_state = "beer"
is_glass = 1
- New()
- ..()
- reagents.add_reagent("ale", 30)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
-
+ list_reagents = list("ale" = 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind
name = "Space Mountain Wind"
desc = "Blows right through you like a space wind."
icon_state = "space_mountain_wind"
- New()
- ..()
- reagents.add_reagent("spacemountainwind", 30)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("spacemountainwind" = 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/thirteenloko
name = "Thirteen Loko"
desc = "The CMO has advised crew members that consumption of Thirteen Loko may result in seizures, blindness, drunkeness, or even death. Please Drink Responsibly."
icon_state = "thirteen_loko"
- New()
- ..()
- reagents.add_reagent("thirteenloko", 25)
- reagents.add_reagent("psilocybin", 5)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("thirteenloko" = 25, "psilocybin" = 5)
/obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb
name = "Dr. Gibb"
desc = "A delicious mixture of 42 different flavors."
icon_state = "dr_gibb"
- New()
- ..()
- reagents.add_reagent("dr_gibb", 30)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("dr_gibb" = 30)
+
/obj/item/weapon/reagent_containers/food/drinks/cans/starkist
name = "Star-kist"
desc = "The taste of a star in liquid form. And, a bit of tuna...?"
icon_state = "starkist"
- New()
- ..()
- reagents.add_reagent("brownstar", 30)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("brownstar" = 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/space_up
name = "Space-Up"
desc = "Tastes like a hull breach in your mouth."
icon_state = "space-up"
- New()
- ..()
- reagents.add_reagent("space_up", 30)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("space_up" = 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/lemon_lime
name = "Lemon-Lime"
desc = "You wanted ORANGE. It gave you Lemon Lime."
icon_state = "lemon-lime"
- New()
- ..()
- reagents.add_reagent("lemon_lime", 30)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("lemon_lime" = 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea
name = "Vrisk Serket Iced Tea"
desc = "That sweet, refreshing southern earthy flavor. That's where it's from, right? South Earth?"
icon_state = "ice_tea_can"
- New()
- ..()
- reagents.add_reagent("icetea", 30)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("icetea" = 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice
name = "Grapel Juice"
desc = "500 pages of rules of how to appropriately enter into a combat with this juice!"
icon_state = "purple_can"
- New()
- ..()
- reagents.add_reagent("grapejuice", 30)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("grapejuice" = 30)
/obj/item/weapon/reagent_containers/food/drinks/cans/tonic
name = "T-Borg's Tonic Water"
desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
icon_state = "tonic"
- New()
- ..()
- reagents.add_reagent("tonic", 50)
+ list_reagents = list("tonic" = 50)
/obj/item/weapon/reagent_containers/food/drinks/cans/sodawater
name = "Soda Water"
desc = "A can of soda water. Still water's more refreshing cousin."
icon_state = "sodawater"
- New()
- ..()
- reagents.add_reagent("sodawater", 50)
+ list_reagents = list("sodawater" = 50)
/obj/item/weapon/reagent_containers/food/drinks/cans/synthanol
name = "Beep's Classic Synthanol"
desc = "A can of IPC booze, however that works."
icon_state = "synthanolcan"
- New()
- ..()
- reagents.add_reagent("synthanol", 50)
+ list_reagents = list("synthanol" = 50)
+
+/obj/item/weapon/reagent_containers/food/drinks/cans/bottler
+ name = "generic beverage container"
+ desc = "this shouldn't ever be spawned. shame on you"
+ icon_state = "glass_bottle"
+
+/obj/item/weapon/reagent_containers/food/drinks/cans/bottler/on_reagent_change()
+ update_icon()
+
+/obj/item/weapon/reagent_containers/food/drinks/cans/bottler/update_icon()
+ overlays.Cut()
+
+ if(reagents.total_volume)
+ var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]10")
+
+ switch(round(reagents.total_volume))
+ if(0 to 9)
+ filling.icon_state = "[icon_state]-10"
+ if(10 to 19)
+ filling.icon_state = "[icon_state]10"
+ if(20 to 29)
+ filling.icon_state = "[icon_state]20"
+ if(30 to 39)
+ filling.icon_state = "[icon_state]30"
+ if(40 to 49)
+ filling.icon_state = "[icon_state]40"
+ if(50 to INFINITY)
+ filling.icon_state = "[icon_state]50"
+
+ filling.icon += mix_color_from_reagents(reagents.reagent_list)
+ overlays += filling
+
+/obj/item/weapon/reagent_containers/food/drinks/cans/bottler/glass_bottle
+ name = "glass bottle"
+ desc = "A glass bottle suitable for beverages."
+ icon_state = "glass_bottle"
+ is_glass = 1
+
+/obj/item/weapon/reagent_containers/food/drinks/cans/bottler/plastic_bottle
+ name = "plastic bottle"
+ desc = "A plastic bottle suitable for beverages."
+ icon_state = "plastic_bottle"
+ is_plastic = 1
+
+/obj/item/weapon/reagent_containers/food/drinks/cans/bottler/metal_can
+ name = "metal can"
+ desc = "A metal can suitable for beverages."
+ icon_state = "metal_can"
diff --git a/code/modules/reagents/reagent_containers/food/condiment.dm b/code/modules/reagents/reagent_containers/food/condiment.dm
index 2b53bfb2e6d..85cd8c05a87 100644
--- a/code/modules/reagents/reagent_containers/food/condiment.dm
+++ b/code/modules/reagents/reagent_containers/food/condiment.dm
@@ -8,10 +8,10 @@
/obj/item/weapon/reagent_containers/food/condiment
name = "condiment container"
desc = "Just your average condiment container."
- icon = 'icons/obj/food/food.dmi'
+ icon = 'icons/obj/food/containers.dmi'
icon_state = "emptycondiment"
flags = OPENCONTAINER
- possible_transfer_amounts = list(1,5,10)
+ possible_transfer_amounts = list(1, 5, 10, 15, 20, 25, 30, 50)
volume = 50
//Possible_states has the reagent id as key and a list of, in order, the icon_state, the name and the desc as values. Used in the on_reagent_change() to change names, descs and sprites.
var/list/possible_states = list(
@@ -21,90 +21,69 @@
"soysauce" = list("soysauce", "soy sauce bottle", "A salty soy-based flavoring"),
"frostoil" = list("coldsauce", "coldsauce bottle", "Leaves the tongue numb in it's passage"),
"sodiumchloride" = list("saltshakersmall", "salt shaker", "Salt. From space oceans, presumably"),
- "blackpepper" = list("pepermillsmall", "pepper mill", "Often used to flavor food or make people sneeze"),
+ "blackpepper" = list("peppermillsmall", "pepper mill", "Often used to flavor food or make people sneeze"),
"cornoil" = list("oliveoil", "corn oil bottle", "A delicious oil used in cooking. Made from corn"),
- "sugar" = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!"),
- "flour" =list("flour", "flour sack", "A big bag of flour. Good for baking!"),
- "rice" =list("rice", "rice sack", "A big bag of rice. Good for cooking!"))
+ "sugar" = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!"))
+ var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters.
-
-/obj/item/weapon/reagent_containers/food/condiment/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+/obj/item/weapon/reagent_containers/food/condiment/attackby(obj/item/weapon/W, mob/user, params)
return
-
-/obj/item/weapon/reagent_containers/food/condiment/attack_self(mob/user as mob)
+/obj/item/weapon/reagent_containers/food/condiment/attack_self(mob/user)
return
-/obj/item/weapon/reagent_containers/food/condiment/attack(mob/M as mob, mob/user as mob, def_zone)
- var/datum/reagents/R = src.reagents
+/obj/item/weapon/reagent_containers/food/condiment/attack(mob/M, mob/user, def_zone)
- if(!R || !R.total_volume)
- to_chat(user, "\red None of [src] left, oh no!")
+ if(!reagents || !reagents.total_volume)
+ to_chat(user, "None of [src] left, oh no! ")
return 0
if(M == user)
- to_chat(M, "\blue You swallow some of contents of the [src].")
- if(reagents.total_volume)
- reagents.reaction(M, INGEST)
- spawn(0)
- reagents.trans_to(M, 10)
+ to_chat(M, "You swallow some of contents of \the [src]. ")
+ else
+ user.visible_message("[user] attempts to feed [M] from [src]. ")
+ if(!do_mob(user, M))
+ return
+ if(!reagents || !reagents.total_volume)
+ return // The condiment might be empty after the delay.
+ user.visible_message("[user] feeds [M] from [src]. ")
+ add_logs(M, user, "fed", reagentlist(src))
- playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
- return 1
- else if( istype(M, /mob/living/carbon/human) )
+ var/fraction = min(10/reagents.total_volume, 1)
+ reagents.reaction(M, INGEST, fraction)
+ reagents.trans_to(M, 10)
+ playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
+ return 1
- for(var/mob/O in viewers(world.view, user))
- O.show_message("\red [user] attempts to feed [M] [src].", 1)
- if(!do_mob(user, M)) return
- for(var/mob/O in viewers(world.view, user))
- O.show_message("\red [user] feeds [M] [src].", 1)
-
- M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [key_name(user)] Reagents: [reagentlist(src)] ")
- user.attack_log += text("\[[time_stamp()]\] Fed [src.name] by [key_name(M)] Reagents: [reagentlist(src)] ")
- if(M.ckey)
- msg_admin_attack("[key_name_admin(user)] fed [key_name_admin(M)] with [src.name] (INTENT: [uppertext(user.a_intent)])")
- if(!iscarbon(user))
- M.LAssailant = null
- else
- M.LAssailant = user
-
- if(reagents.total_volume)
- reagents.reaction(M, INGEST)
- spawn(0)
- reagents.trans_to(M, 10)
-
- playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
- return 1
- return 0
-
-/obj/item/weapon/reagent_containers/food/condiment/attackby(obj/item/I as obj, mob/user as mob, params)
+/obj/item/weapon/reagent_containers/food/condiment/attackby(obj/item/I, mob/user, params)
return
/obj/item/weapon/reagent_containers/food/condiment/afterattack(obj/target, mob/user , proximity)
- if(!proximity) return
+ if(!proximity)
+ return
if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
if(!target.reagents.total_volume)
- to_chat(user, "\red [target] is empty.")
+ to_chat(user, "[target] is empty! ")
return
if(reagents.total_volume >= reagents.maximum_volume)
- to_chat(user, "\red [src] is full.")
+ to_chat(user, "[src] is full! ")
return
- var/trans = target.reagents.trans_to(src, target:amount_per_transfer_from_this)
- to_chat(user, "\blue You fill [src] with [trans] units of the contents of [target].")
+ var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this)
+ to_chat(user, "You fill [src] with [trans] units of the contents of [target]. ")
//Something like a glass or a food item. Player probably wants to transfer TO it.
else if(target.is_open_container() || istype(target, /obj/item/weapon/reagent_containers/food/snacks))
if(!reagents.total_volume)
- to_chat(user, "\red [src] is empty.")
+ to_chat(user, "[src] is empty! ")
return
if(target.reagents.total_volume >= target.reagents.maximum_volume)
- to_chat(user, "\red you can't add anymore to [target].")
+ to_chat(user, "you can't add anymore to [target]! ")
return
var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
- to_chat(user, "\blue You transfer [trans] units of the condiment to [target].")
+ to_chat(user, "You transfer [trans] units of the condiment to [target]. ")
/obj/item/weapon/reagent_containers/food/condiment/on_reagent_change()
if(!possible_states.len)
@@ -118,9 +97,9 @@
desc = temp_list[3]
else
- name = "condiment bottle"
+ name = "[originalname] bottle"
main_reagent = reagents.get_master_reagent_name()
- if (reagents.reagent_list.len==1)
+ if(reagents.reagent_list.len==1)
desc = "Looks like it is [lowertext(main_reagent)], but you are not sure."
else
desc = "A mixture of various condiments. [lowertext(main_reagent)] is one of them."
@@ -129,46 +108,17 @@
icon_state = "emptycondiment"
name = "condiment bottle"
desc = "An empty condiment bottle."
- return
-
/obj/item/weapon/reagent_containers/food/condiment/enzyme
name = "universal enzyme"
desc = "Used in cooking various dishes."
icon_state = "enzyme"
- New()
- ..()
- reagents.add_reagent("enzyme", 50)
+ list_reagents = list("enzyme" = 50)
/obj/item/weapon/reagent_containers/food/condiment/sugar
name = "sugar bottle"
desc = "Tasty spacey sugar!"
-
- New()
- ..()
- reagents.add_reagent("sugar", 50)
-
-/obj/item/weapon/reagent_containers/food/condiment/flour
- name = "flour sack"
- desc = "A big bag of flour. Good for baking!"
- icon_state = "flour"
- item_state = "flour"
- possible_states = list()
-
- New()
- ..()
- reagents.add_reagent("flour", 30)
-
-/obj/item/weapon/reagent_containers/food/condiment/rice
- name = "rice sack"
- desc = "A big bag of rice. Good for cooking!"
- icon_state = "rice"
- item_state = "flour"
- possible_states = list()
-
- New()
- ..()
- reagents.add_reagent("rice", 30)
+ list_reagents = list("sugar" = 50)
/obj/item/weapon/reagent_containers/food/condiment/saltshaker //Seperate from above since it's a small shaker rather then
name = "salt shaker" // a large one.
@@ -177,12 +127,9 @@
possible_transfer_amounts = list(1,20) //for clown turning the lid off
amount_per_transfer_from_this = 1
volume = 20
+ list_reagents = list("sodiumchloride" = 20)
possible_states = list()
- New()
- ..()
- reagents.add_reagent("sodiumchloride", 20)
-
/obj/item/weapon/reagent_containers/food/condiment/saltshaker/suicide_act(mob/user)
user.visible_message("[user] begins to swap forms with the salt shaker! It looks like \he's trying to commit suicide. ")
var/newname = "[name]"
@@ -190,7 +137,7 @@
user.name = newname
user.real_name = newname
desc = "Salt. From dead crew, presumably."
- return TOXLOSS
+ return (TOXLOSS)
/obj/item/weapon/reagent_containers/food/condiment/peppermill
name = "pepper mill"
@@ -199,38 +146,66 @@
possible_transfer_amounts = list(1,20) //for clown turning the lid off
amount_per_transfer_from_this = 1
volume = 20
+ list_reagents = list("blackpepper" = 20)
possible_states = list()
- New()
- ..()
- reagents.add_reagent("blackpepper", 20)
+/obj/item/weapon/reagent_containers/food/condiment/milk
+ name = "space milk"
+ desc = "It's milk. White and nutritious goodness!"
+ icon_state = "milk"
+ item_state = "carton"
+ list_reagents = list("milk" = 50)
+ possible_states = list()
+
+/obj/item/weapon/reagent_containers/food/condiment/flour
+ name = "flour sack"
+ desc = "A big bag of flour. Good for baking!"
+ icon_state = "flour"
+ item_state = "flour"
+ list_reagents = list("flour" = 30)
+ possible_states = list()
+
+/obj/item/weapon/reagent_containers/food/condiment/soymilk
+ name = "soy milk"
+ desc = "It's soy milk. White and nutritious goodness!"
+ icon_state = "soymilk"
+ item_state = "carton"
+ list_reagents = list("soymilk" = 50)
+ possible_states = list()
+
+/obj/item/weapon/reagent_containers/food/condiment/rice
+ name = "rice sack"
+ desc = "A big bag of rice. Good for cooking!"
+ icon_state = "rice"
+ item_state = "flour"
+ list_reagents = list("rice" = 30)
+ possible_states = list()
+
+/obj/item/weapon/reagent_containers/food/condiment/soysauce
+ name = "soy sauce"
+ desc = "A salty soy-based flavoring."
+ icon_state = "soysauce"
+ list_reagents = list("soysauce" = 50)
+ possible_states = list()
/obj/item/weapon/reagent_containers/food/condiment/syndisauce
name = "\improper Chef Excellence's Special Sauce"
desc = "A potent sauce extracted from the potent amanita mushrooms. Death never tasted quite so delicious."
- amount_per_transfer_from_this = 5
- volume = 50
- New()
- ..()
- reagents.add_reagent("amanitin", 50)
+ list_reagents = list("amanitin" = 50)
+ possible_states = list()
//Food packs. To easily apply deadly toxi... delicious sauces to your food!
+
/obj/item/weapon/reagent_containers/food/condiment/pack
name = "condiment pack"
desc = "A small plastic pack with condiments to put on your food"
icon_state = "condi_empty"
volume = 10
amount_per_transfer_from_this = 10
- possible_transfer_amounts = 10
+ possible_transfer_amounts = list()
possible_states = list("ketchup" = list("condi_ketchup", "Ketchup", "You feel more American already."), "capsaicin" = list("condi_hotsauce", "Hotsauce", "You can almost TASTE the stomach ulcers now!"), "soysauce" = list("condi_soysauce", "Soy Sauce", "A salty soy-based flavoring"), "frostoil" = list("condi_frostoil", "Coldsauce", "Leaves the tongue numb in it's passage"), "sodiumchloride" = list("condi_salt", "Salt Shaker", "Salt. From space oceans, presumably"), "blackpepper" = list("condi_pepper", "Pepper Mill", "Often used to flavor food or make people sneeze"), "cornoil" = list("condi_cornoil", "Corn Oil", "A delicious oil used in cooking. Made from corn"), "sugar" = list("condi_sugar", "Sugar", "Tasty spacey sugar!"))
- var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters.
-/obj/item/weapon/reagent_containers/food/condiment/pack/New()
- ..()
- pixel_x = rand(-7, 7)
- pixel_y = rand(-7, 7)
-
-/obj/item/weapon/reagent_containers/food/condiment/pack/attack(mob/M as mob, mob/user as mob, def_zone) //Can't feed these to people directly.
+/obj/item/weapon/reagent_containers/food/condiment/pack/attack(mob/M, mob/user, def_zone) //Can't feed these to people directly.
return
/obj/item/weapon/reagent_containers/food/condiment/pack/afterattack(obj/target, mob/user , proximity)
@@ -243,8 +218,7 @@
qdel(src)
return
if(target.reagents.total_volume >= target.reagents.maximum_volume)
- to_chat(user, "You tear open [src], but [target] is stacked so high that it just drips off! ")//Not sure if food can ever be full, but better safe than sorry.
-
+ to_chat(user, "You tear open [src], but [target] is stacked so high that it just drips off! ") //Not sure if food can ever be full, but better safe than sorry.
qdel(src)
return
else
@@ -268,18 +242,12 @@
//Ketchup
/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup
- name = "Ketchup pack"
- originalname = "Ketchup"
-
-/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup/New()
- ..()
- reagents.add_reagent("ketchup", 10)
+ name = "ketchup pack"
+ originalname = "ketchup"
+ list_reagents = list("ketchup" = 10)
//Hot sauce
/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce
- name = "Hotsauce pack"
- originalname = "Hotsauce"
-
-/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce/New()
- ..()
- reagents.add_reagent("capsaicin", 10)
\ No newline at end of file
+ name = "hotsauce pack"
+ originalname = "hotsauce"
+ list_reagents = list("capsaicin" = 10)
diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm
index d6a5d37012a..41486497be2 100644
--- a/code/modules/reagents/reagent_containers/food/drinks.dm
+++ b/code/modules/reagents/reagent_containers/food/drinks.dm
@@ -8,19 +8,21 @@
icon_state = null
flags = OPENCONTAINER
consume_sound = 'sound/items/drink.ogg'
- possible_transfer_amounts = list(5,10,25)
+ possible_transfer_amounts = list(5,10,15,20,25,30,50)
volume = 50
/obj/item/weapon/reagent_containers/food/drinks/New()
..()
+ pixel_x = rand(-5, 5)
+ pixel_y = rand(-5, 5)
bitesize = amount_per_transfer_from_this
if(bitesize < 5)
bitesize = 5
-/obj/item/weapon/reagent_containers/food/drinks/attack_self(mob/user as mob)
+/obj/item/weapon/reagent_containers/food/drinks/attack_self(mob/user)
return
-/obj/item/weapon/reagent_containers/food/drinks/attack(mob/M as mob, mob/user as mob, def_zone)
+/obj/item/weapon/reagent_containers/food/drinks/attack(mob/M, mob/user, def_zone)
if(!reagents || !reagents.total_volume)
to_chat(user, " None of [src] left, oh no! ")
return 0
@@ -42,7 +44,7 @@
if(!proximity) return
// Moved from the can code; not necessary since closed cans aren't open containers now, but, eh.
- if (istype(target, /obj/item/weapon/reagent_containers/food/drinks/cans))
+ if(istype(target, /obj/item/weapon/reagent_containers/food/drinks/cans))
var/obj/item/weapon/reagent_containers/food/drinks/cans/cantarget = target
if(cantarget.canopened == 0)
to_chat(user, "You need to open the drink you want to pour into! ")
@@ -95,7 +97,7 @@
return
-/obj/item/weapon/reagent_containers/food/drinks/attackby(var/obj/item/I, mob/user as mob, params)
+/obj/item/weapon/reagent_containers/food/drinks/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird
return
if(is_hot(I))
@@ -109,12 +111,12 @@
return
if(!reagents || reagents.total_volume==0)
to_chat(user, " \The [src] is empty! ")
- else if (reagents.total_volume<=src.volume/4)
+ else if(reagents.total_volume<=src.volume/4)
to_chat(user, " \The [src] is almost empty! ")
- else if (reagents.total_volume<=src.volume*0.66)
+ else if(reagents.total_volume<=src.volume*0.66)
to_chat(user, " \The [src] is half full! ")// We're all optimistic, right?!
- else if (reagents.total_volume<=src.volume*0.90)
+ else if(reagents.total_volume<=src.volume*0.90)
to_chat(user, " \The [src] is almost full! ")
else
to_chat(user, " \The [src] is full! ")
@@ -123,22 +125,51 @@
/// Drinks. END
////////////////////////////////////////////////////////////////////////////////
-/obj/item/weapon/reagent_containers/food/drinks/golden_cup
- desc = "A golden cup"
- name = "golden cup"
+/obj/item/weapon/reagent_containers/food/drinks/trophy
+ name = "pewter cup"
+ desc = "Everyone gets a trophy."
+ icon_state = "pewter_cup"
+ w_class = 1
+ force = 1
+ throwforce = 1
+ amount_per_transfer_from_this = 5
+ materials = list(MAT_METAL=100)
+ possible_transfer_amounts = list()
+ volume = 5
+ flags = CONDUCT | OPENCONTAINER
+
+/obj/item/weapon/reagent_containers/food/drinks/trophy/gold_cup
+ name = "gold cup"
+ desc = "You're winner!"
icon_state = "golden_cup"
- item_state = "golden_cup" //yup :)
w_class = 4
force = 14
throwforce = 10
amount_per_transfer_from_this = 20
materials = list(MAT_GOLD=1000)
- possible_transfer_amounts = null
volume = 150
- flags = CONDUCT | OPENCONTAINER
-/obj/item/weapon/reagent_containers/food/drinks/golden_cup/tournament_26_06_2011
- desc = "A golden cup. It will be presented to a winner of tournament 26 june and name of the winner will be graved on it."
+/obj/item/weapon/reagent_containers/food/drinks/trophy/silver_cup
+ name = "silver cup"
+ desc = "Best loser!"
+ icon_state = "silver_cup"
+ w_class = 3
+ force = 10
+ throwforce = 8
+ amount_per_transfer_from_this = 15
+ materials = list(MAT_SILVER=800)
+ volume = 100
+
+/obj/item/weapon/reagent_containers/food/drinks/trophy/bronze_cup
+ name = "bronze cup"
+ desc = "At least you ranked!"
+ icon_state = "bronze_cup"
+ w_class = 2
+ force = 5
+ throwforce = 4
+ amount_per_transfer_from_this = 10
+ materials = list(MAT_METAL=400)
+ volume = 25
///////////////////////////////////////////////Drinks
@@ -146,158 +177,84 @@
// rather then having to add it to something else first. They should only contain liquids. They have a default container size of 50.
// Formatting is the same as food.
-/obj/item/weapon/reagent_containers/food/drinks/milk
- name = "\improper Space Milk"
- desc = "It's milk. White and nutritious goodness!"
- icon_state = "milk"
- item_state = "carton"
- New()
- ..()
- reagents.add_reagent("milk", 50)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
-
-/* Flour is no longer a reagent
-/obj/item/weapon/reagent_containers/food/drinks/flour
- name = "flour sack"
- desc = "A big bag of flour. Good for baking!"
- icon = 'icons/obj/food/food.dmi'
- icon_state = "flour"
- item_state = "flour"
- New()
- ..()
- reagents.add_reagent("flour", 50)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
-*/
-
-/obj/item/weapon/reagent_containers/food/drinks/soymilk
- name = "\improper SoyMilk"
- desc = "It's soy milk. White and nutritious goodness!"
- icon_state = "soymilk"
- item_state = "carton"
- New()
- ..()
- reagents.add_reagent("soymilk", 50)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
/obj/item/weapon/reagent_containers/food/drinks/coffee
- name = "\improper Robust Coffee"
+ name = "Robust Coffee"
desc = "Careful, the beverage you're about to enjoy is extremely hot."
icon_state = "coffee"
- New()
- ..()
- reagents.add_reagent("coffee", 30)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("coffee" = 30)
+
+/obj/item/weapon/reagent_containers/food/drinks/ice
+ name = "Ice Cup"
+ desc = "Careful, cold ice, do not chew."
+ icon_state = "coffee"
+ list_reagents = list("ice" = 30)
/obj/item/weapon/reagent_containers/food/drinks/tea
- name = "\improper Duke Purple Tea"
+ name = "Duke Purple Tea"
desc = "An insult to Duke Purple is an insult to the Space Queen! Any proper gentleman will fight you, if you sully this tea."
- icon_state = "teacup"
- item_state = "coffee"
- New()
- ..()
- reagents.add_reagent("tea", 30)
- if(prob(20))
- reagents.add_reagent("mugwort", 3)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("tea" = 30)
+
+/obj/item/weapon/reagent_containers/food/drinks/tea/New()
+ ..()
+ if(prob(20))
+ reagents.add_reagent("mugwort", 3)
/obj/item/weapon/reagent_containers/food/drinks/mugwort
- name = "\improper Mugwort Tea"
+ name = "Mugwort Tea"
desc = "A bitter herbal tea."
icon_state = "manlydorfglass"
item_state = "coffee"
- New()
- ..()
- reagents.add_reagent("mugwort", 30)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
-
-/obj/item/weapon/reagent_containers/food/drinks/ice
- name = "\improper Ice Cup"
- desc = "Careful, cold ice, do not chew."
- icon_state = "coffee"
- New()
- ..()
- reagents.add_reagent("ice", 30)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("mugwort" = 30)
/obj/item/weapon/reagent_containers/food/drinks/h_chocolate
- name = "\improper Dutch Hot Coco"
+ name = "Dutch Hot Coco"
desc = "Made in Space South America."
- icon_state = "hot_coco"
- item_state = "coffee"
- New()
- ..()
- reagents.add_reagent("hot_coco", 30)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("hot_coco" = 30, "sugar" = 5)
/obj/item/weapon/reagent_containers/food/drinks/chocolate
- name = "\improper Hot Chocolate"
+ name = "Hot Chocolate"
desc = "Made in Space Switzerland."
icon_state = "hot_coco"
item_state = "coffee"
- New()
- ..()
- reagents.add_reagent("chocolate", 45)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("chocolate" = 30)
/obj/item/weapon/reagent_containers/food/drinks/weightloss
- name = "\improper Weight-Loss Shake"
+ name = "Weight-Loss Shake"
desc = "A shake designed to cause weight loss. The package proudly proclaims that it is 'tapeworm free.'"
icon_state = "coffee"
item_state = "coffee"
- New()
- ..()
- reagents.add_reagent("lipolicide", 30)
- reagents.add_reagent("chocolate", 5)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
-
+ list_reagents = list("lipolicide" = 30, "chocolate" = 5)
/obj/item/weapon/reagent_containers/food/drinks/dry_ramen
- name = "\improper Cup Ramen"
- desc = "Just add 10ml water, self heats! A taste that reminds you of your school years."
+ name = "Cup Ramen"
+ desc = "Just add 10ml of water, self heats! A taste that reminds you of your school years."
icon_state = "ramen"
- New()
- ..()
- reagents.add_reagent("dry_ramen", 30)
- if(prob(20))
- reagents.add_reagent("enzyme", 3)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("dry_ramen" = 30)
+
+/obj/item/weapon/reagent_containers/food/drinks/dry_ramen/New()
+ ..()
+ if(prob(20))
+ reagents.add_reagent("enzyme", 3)
/obj/item/weapon/reagent_containers/food/drinks/chicken_soup
- name = "\improper Cup Chicken Soup"
+ name = "Cup Chicken Soup"
desc = "A delicious and soothing cup of chicken noodle soup; just like spessmom used to make it."
icon_state = "ramen"
- New()
- ..()
- reagents.add_reagent("chicken_soup", 30)
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
+ list_reagents = list("chicken_soup" = 30)
/obj/item/weapon/reagent_containers/food/drinks/sillycup
name = "paper cup"
desc = "A paper water cup."
icon_state = "water_cup_e"
- possible_transfer_amounts = null
+ possible_transfer_amounts = list()
volume = 10
- New()
- ..()
- src.pixel_x = rand(-10.0, 10)
- src.pixel_y = rand(-10.0, 10)
- on_reagent_change()
- if(reagents.total_volume)
- icon_state = "water_cup"
- else
- icon_state = "water_cup_e"
+
+/obj/item/weapon/reagent_containers/food/drinks/sillycup/on_reagent_change()
+ if(reagents.total_volume)
+ icon_state = "water_cup"
+ else
+ icon_state = "water_cup_e"
//////////////////////////drinkingglass and shaker//
//Note by Darem: This code handles the mixing of drinks. New drinks go in three places: In Chemistry-Reagents.dm (for the drink
@@ -308,20 +265,14 @@
name = "shaker"
desc = "A metal shaker to mix drinks in."
icon_state = "shaker"
+ materials = list(MAT_METAL=1500)
amount_per_transfer_from_this = 10
volume = 100
/obj/item/weapon/reagent_containers/food/drinks/flask
- name = "Captain's Flask"
- desc = "A metal flask belonging to the captain"
+ name = "flask"
+ desc = "Every good spaceman knows it's a good idea to bring along a couple of pints of whiskey wherever they go."
icon_state = "flask"
- materials = list(MAT_SILVER=500)
- volume = 60
-
-/obj/item/weapon/reagent_containers/food/drinks/flask/detflask
- name = "Detective's Flask"
- desc = "A metal flask with a leather band and golden badge belonging to the detective."
- icon_state = "detflask"
materials = list(MAT_METAL=250)
volume = 60
@@ -329,19 +280,25 @@
name = "flask"
desc = "For those who can't be bothered to hang out at the bar to drink."
icon_state = "barflask"
- volume = 60
-/obj/item/weapon/reagent_containers/food/drinks/britcup
- name = "cup"
- desc = "A cup with the british flag emblazoned on it."
- icon_state = "britcup"
- volume = 30
+/obj/item/weapon/reagent_containers/food/drinks/flask/gold
+ name = "captain's flask"
+ desc = "A gold flask belonging to the captain."
+ icon_state = "flask_gold"
+ materials = list(MAT_GOLD=500)
+
+/obj/item/weapon/reagent_containers/food/drinks/flask/detflask
+ name = "detective's flask"
+ desc = "The detective's only true friend."
+ icon_state = "detflask"
+ list_reagents = list("whiskey" = 30)
/obj/item/weapon/reagent_containers/food/drinks/flask/hand_made
name = "handmade flask"
desc = "A wooden flask with a silver lid and bottom. It has a matte, dark blue paint on it with the initials \"W.H.\" etched in black."
icon = 'icons/obj/custom_items.dmi'
icon_state = "williamhackett"
+ materials = list()
/obj/item/weapon/reagent_containers/food/drinks/flask/thermos
name = "vintage thermos"
@@ -361,3 +318,10 @@
icon = 'icons/obj/custom_items.dmi'
icon_state = "lithiumflask"
volume = 50
+
+
+/obj/item/weapon/reagent_containers/food/drinks/britcup
+ name = "cup"
+ desc = "A cup with the british flag emblazoned on it."
+ icon_state = "britcup"
+ volume = 30
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
index 17b52aaf5a7..678078bc7fd 100644
--- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
+++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
@@ -7,18 +7,21 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle
amount_per_transfer_from_this = 10
volume = 100
+ throwforce = 15
item_state = "broken_beer" //Generic held-item sprite until unique ones are made.
var/const/duration = 13 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets)
var/isGlass = 1 //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it
-/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target as mob, mob/living/user as mob)
+/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/smash(mob/living/target, mob/living/user, ranged = 0)
//Creates a shattering noise and replaces the bottle with a broken_bottle
- user.drop_item()
- var/obj/item/weapon/broken_bottle/B = new /obj/item/weapon/broken_bottle(user.loc)
- user.put_in_active_hand(B)
- if(prob(33))
- new /obj/item/weapon/shard(target.loc) // Create a glass shard at the target's location!
+ var/new_location = get_turf(loc)
+ var/obj/item/weapon/broken_bottle/B = new /obj/item/weapon/broken_bottle(new_location)
+ if(ranged)
+ B.loc = new_location
+ else
+ user.drop_item()
+ user.put_in_active_hand(B)
B.icon_state = src.icon_state
var/icon/I = new('icons/obj/drinks.dmi', src.icon_state)
@@ -26,13 +29,20 @@
I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0))
B.icon = I
- playsound(src, "shatter", 70, 1)
- user.put_in_active_hand(B)
- src.transfer_fingerprints_to(B)
+ if(isGlass)
+ if(prob(33))
+ new/obj/item/weapon/shard(new_location)
+ playsound(src, "shatter", 70, 1)
+ else
+ B.name = "broken carton"
+ B.force = 0
+ B.throwforce = 0
+ B.desc = "A carton with the bottom half burst open. Might give you a papercut."
+ transfer_fingerprints_to(B)
qdel(src)
-/obj/item/weapon/reagent_containers/food/drinks/bottle/attack(mob/living/target as mob, mob/living/user as mob)
+/obj/item/weapon/reagent_containers/food/drinks/bottle/attack(mob/living/target, mob/living/user)
if(!target)
return
@@ -40,25 +50,24 @@
if(user.a_intent != I_HARM || !isGlass)
return ..()
-
force = 15 //Smashing bottles over someoen's head hurts.
var/obj/item/organ/external/affecting = user.zone_sel.selecting //Find what the player is aiming at
- var/armor_block = 0 //Get the target's armour values for normal attack damage.
+ var/armor_block = 0 //Get the target's armor values for normal attack damage.
var/armor_duration = 0 //The more force the bottle has, the longer the duration.
//Calculating duration and calculating damage.
if(ishuman(target))
var/mob/living/carbon/human/H = target
- var/headarmor = 0 // Target's head armour
- armor_block = H.run_armor_check(affecting, "melee", armour_penetration = armour_penetration) // For normal attack damage
+ var/headarmor = 0 // Target's head armor
+ armor_block = H.run_armor_check(affecting, "melee","","",armour_penetration) // For normal attack damage
//If they have a hat/helmet and the user is targeting their head.
if(istype(H.head, /obj/item/clothing/head) && affecting == "head")
- // If their head has an armour value, assign headarmor to it, else give it 0.
+ // If their head has an armor value, assign headarmor to it, else give it 0.
if(H.head.armor["melee"])
headarmor = H.head.armor["melee"]
else
@@ -70,221 +79,201 @@
armor_duration = (duration - headarmor) + force
else
- //Only humans can have armour, right?
+ //Only humans can have armor, right?
armor_block = target.run_armor_check(affecting, "melee")
if(affecting == "head")
armor_duration = duration + force
armor_duration /= 10
//Apply the damage!
- target.apply_damage(force, BRUTE, affecting, armor_block, sharp=0)
+ armor_block = min(90, armor_block)
+ target.apply_damage(force, BRUTE, affecting, armor_block)
// You are going to knock someone out for longer if they are not wearing a helmet.
- if(affecting == "head" && istype(target, /mob/living/carbon/))
-
- //Display an attack message.
- for(var/mob/O in viewers(user, null))
- if(target != user) O.show_message(text("\red [target] has been hit over the head with a bottle of [src.name], by [user]! "), 1)
- else O.show_message(text("\red [target] hit himself with a bottle of [src.name] on the head! "), 1)
+ var/head_attack_message = ""
+ if(affecting == "head" && iscarbon(target))
+ head_attack_message = " on the head"
//Weaken the target for the duration that we calculated and divide it by 5.
if(armor_duration)
target.apply_effect(min(armor_duration, 10) , WEAKEN) // Never weaken more than a flash!
+ //Display an attack message.
+ if(target != user)
+ target.visible_message("[user] has hit [target][head_attack_message] with a bottle of [src.name]! ", \
+ "[user] has hit [target][head_attack_message] with a bottle of [src.name]! ")
else
- //Default attack message and don't weaken the target.
- for(var/mob/O in viewers(user, null))
- if(target != user) O.show_message(text("\red [target] has been attacked with a bottle of [src.name], by [user]! "), 1)
- else O.show_message(text("\red [target] has attacked himself with a bottle of [src.name]! "), 1)
+ user.visible_message("[target] hits \himself with a bottle of [src.name][head_attack_message]! ", \
+ "[target] hits \himself with a bottle of [src.name][head_attack_message]! ")
//Attack logs
- user.attack_log += text("\[[time_stamp()]\] Has attacked [key_name(target)] with a bottle! ")
- target.attack_log += text("\[[time_stamp()]\] Has been smashed with a bottle by [key_name(user)] ")
- if(target.ckey)
- msg_admin_attack("[key_name_admin(user)] attacked [key_name_admin(target)] with a bottle. (INTENT: [uppertext(user.a_intent)])")
- if(!iscarbon(user))
- target.LAssailant = null
- else
- target.LAssailant = user
+ add_logs(target, user, "attacked", src)
//The reagents in the bottle splash all over the target, thanks for the idea Nodrak
- if(src.reagents)
- for(var/mob/O in viewers(user, null))
- O.show_message(text("\blue The contents of the [src] splashes all over [target]! "), 1)
- src.reagents.reaction(target, TOUCH)
+ SplashReagents(target)
//Finally, smash the bottle. This kills (del) the bottle.
- src.smash(target, user)
+ smash(target, user)
- return
+/obj/item/weapon/reagent_containers/food/drinks/bottle/proc/SplashReagents(mob/M)
+ if(reagents && reagents.total_volume)
+ M.visible_message("The contents of \the [src] splashes all over [M]! ")
+ reagents.reaction(M, TOUCH)
+ reagents.clear_reagents()
//Keeping this here for now, I'll ask if I should keep it here.
/obj/item/weapon/broken_bottle
-
- name = "broken bottle"
+ name = "Broken Bottle"
desc = "A bottle with a sharp broken bottom."
icon = 'icons/obj/drinks.dmi'
icon_state = "broken_bottle"
- force = 9.0
- throwforce = 5.0
+ force = 9
+ throwforce = 5
throw_speed = 3
throw_range = 5
+ w_class = 1
item_state = "beer"
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("stabbed", "slashed", "attacked")
- sharp = 1
- edge = 0
var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken")
+ sharp = 1
+ edge = 1
/obj/item/weapon/reagent_containers/food/drinks/bottle/gin
- name = "\improper Griffeater Gin"
+ name = "Griffeater Gin"
desc = "A bottle of high quality gin, produced in the New London Space Station."
icon_state = "ginbottle"
- New()
- ..()
- reagents.add_reagent("gin", 100)
+ list_reagents = list("gin" = 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey
- name = "\improper Uncle Git's Special Reserve"
+ name = "Uncle Git's Special Reserve"
desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES."
icon_state = "whiskeybottle"
- New()
- ..()
- reagents.add_reagent("whiskey", 100)
+ list_reagents = list("whiskey" = 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka
- name = "\improper Tunguska Triple Distilled"
+ name = "Tunguska Triple Distilled"
desc = "Aah, vodka. Prime choice of drink AND fuel by Russians worldwide."
icon_state = "vodkabottle"
- New()
- ..()
- reagents.add_reagent("vodka", 100)
+ list_reagents = list("vodka" = 100)
-/obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla
- name = "\improper Caccavo Guaranteed Quality Tequilla"
+/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka/badminka
+ name = "Badminka Vodka"
+ desc = "The label's written in Cyrillic. All you can make out is the name and a word that looks vaguely like 'Vodka'."
+ icon_state = "badminka"
+ list_reagents = list("vodka" = 100)
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/tequila
+ name = "Caccavo Guaranteed Quality Tequila"
desc = "Made from premium petroleum distillates, pure thalidomide and other fine quality ingredients!"
- icon_state = "tequillabottle"
- New()
- ..()
- reagents.add_reagent("tequilla", 100)
+ icon_state = "tequilabottle"
+ list_reagents = list("tequila" = 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofnothing
- name = "\improper Bottle of Nothing"
- desc = "A bottle filled with nothing"
+ name = "Bottle of Nothing"
+ desc = "A bottle filled with nothing."
icon_state = "bottleofnothing"
- New()
- ..()
- reagents.add_reagent("nothing", 100)
+ list_reagents = list("nothing" = 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/patron
- name = "\improper Wrapp Artiste Patron"
- desc = "Silver laced tequilla, served in space night clubs across the galaxy."
+ name = "Wrapp Artiste Patron"
+ desc = "Silver laced tequila, served in space night clubs across the galaxy."
icon_state = "patronbottle"
- New()
- ..()
- reagents.add_reagent("patron", 100)
+ list_reagents = list("patron" = 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/rum
- name = "\improper Captain Pete's Cuban Spiced Rum"
+ name = "Captain Pete's Cuban Spiced Rum"
desc = "This isn't just rum, oh no. It's practically GRIFF in a bottle."
icon_state = "rumbottle"
- New()
- ..()
- reagents.add_reagent("rum", 100)
+ list_reagents = list("rum" = 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater
- name = "\improper Flask of Holy Water"
+ name = "Flask of Holy Water"
desc = "A flask of the chaplain's holy water."
icon_state = "holyflask"
- New()
- ..()
- reagents.add_reagent("holywater", 100)
+ list_reagents = list("holywater" = 100)
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/holywater/hell
+ desc = "A flask of holy water...it's been sitting in the Necropolis a while though."
+ list_reagents = list("hell_water" = 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth
- name = "\improper Goldeneye Vermouth"
+ name = "Goldeneye Vermouth"
desc = "Sweet, sweet dryness~"
icon_state = "vermouthbottle"
- New()
- ..()
- reagents.add_reagent("vermouth", 100)
+ list_reagents = list("vermouth" = 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua
- name = "\improper Robert Robust's Coffee Liqueur"
- desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK"
+ name = "Robert Robust's Coffee Liqueur"
+ desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK."
icon_state = "kahluabottle"
- New()
- ..()
- reagents.add_reagent("kahlua", 100)
+ list_reagents = list("kahlua" = 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager
- name = "\improper College Girl Goldschlager"
+ name = "College Girl Goldschlager"
desc = "Because they are the only ones who will drink 100 proof cinnamon schnapps."
icon_state = "goldschlagerbottle"
- New()
- ..()
- reagents.add_reagent("goldschlager", 100)
+ list_reagents = list("goldschlager" = 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac
- name = "\improper Chateau De Baton Premium Cognac"
+ name = "Chateau De Baton Premium Cognac"
desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time."
icon_state = "cognacbottle"
- New()
- ..()
- reagents.add_reagent("cognac", 100)
+ list_reagents = list("cognac" = 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/wine
- name = "\improper Doublebeard Bearded Special Wine"
+ name = "Doublebeard Bearded Special Wine"
desc = "A faint aura of unease and asspainery surrounds the bottle."
icon_state = "winebottle"
- New()
- ..()
- reagents.add_reagent("wine", 100)
+ list_reagents = list("wine" = 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe
- name = "\improper Jailbreaker Verte"
- desc = "One sip of this and you just know you're gonna have a good time."
+ name = "Extra-Strong Absinthe"
+ desc = "An strong alcoholic drink brewed and distributed by"
icon_state = "absinthebottle"
- New()
- ..()
- reagents.add_reagent("absinthe", 100)
+ list_reagents = list("absinthe" = 100)
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe/premium
+ name = "Gwyn's Premium Absinthe"
+ desc = "A potent alcoholic beverage, almost makes you forget the ash in your lungs."
+ icon_state = "absinthepremium"
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/hcider
+ name = "Jian Hard Cider"
+ desc = "Apple juice for adults."
+ icon_state = "hcider"
+ volume = 50
+ list_reagents = list("suicider" = 50)
//////////////////////////JUICES AND STUFF ///////////////////////
/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice
- name = "orange juice"
+ name = "Orange Juice"
desc = "Full of vitamins and deliciousness!"
icon_state = "orangejuice"
item_state = "carton"
isGlass = 0
- New()
- ..()
- reagents.add_reagent("orangejuice", 100)
+ list_reagents = list("orangejuice" = 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/cream
- name = "milk cream"
+ name = "Milk Cream"
desc = "It's cream. Made from milk. What else did you think you'd find in there?"
icon_state = "cream"
item_state = "carton"
isGlass = 0
- New()
- ..()
- reagents.add_reagent("cream", 100)
+ list_reagents = list("cream" = 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice
- name = "tomato juice"
+ name = "Tomato Juice"
desc = "Well, at least it LOOKS like tomato juice. You can't tell with all that redness."
icon_state = "tomatojuice"
item_state = "carton"
isGlass = 0
- New()
- ..()
- reagents.add_reagent("tomatojuice", 100)
+ list_reagents = list("tomatojuice" = 100)
/obj/item/weapon/reagent_containers/food/drinks/bottle/limejuice
- name = "lime juice"
+ name = "Lime Juice"
desc = "Sweet-sour goodness."
icon_state = "limejuice"
item_state = "carton"
isGlass = 0
- New()
- ..()
- reagents.add_reagent("limejuice", 100)
+ list_reagents = list("limejuice" = 100)
diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle/robot.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle/robot.dm
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm
index 981bb7148a2..23ce26cf5e4 100644
--- a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm
+++ b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm
@@ -11,626 +11,549 @@
righthand_file = 'icons/goonstation/mob/inhands/items_righthand.dmi'
materials = list(MAT_GLASS=500)
-
- proc/smash(mob/living/target as mob, mob/living/user as mob)
- //Creates a shattering noise and replaces the drinking glass with a glass shard
- user.drop_item()
- var/obj/item/weapon/shard/S = new /obj/item/weapon/shard(user.loc)
- user.put_in_active_hand(S)
-
- playsound(src, "shatter", 70, 1)
- user.put_in_active_hand(S)
- src.transfer_fingerprints_to(S)
-
- qdel(src)
-
-
- attack(mob/living/target as mob, mob/living/user as mob)
-
- if(!target)
+/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/egg)) //breaking eggs
+ var/obj/item/weapon/reagent_containers/food/snacks/egg/E = I
+ if(reagents)
+ if(reagents.total_volume >= reagents.maximum_volume)
+ to_chat(user, "[src] is full. ")
+ else
+ to_chat(user, "You break [E] in [src]. ")
+ E.reagents.trans_to(src, E.reagents.total_volume)
+ qdel(E)
return
+ else
+ ..()
- if(user.a_intent != I_HARM)
- return ..()
-
- force = 5
-
- var/obj/item/organ/external/affecting = user.zone_sel.selecting //Find what the player is aiming at
-
- var/armor_block = 0 //Get the target's armour values for normal attack damage.
-
- //Calculating damage.
- if(ishuman(target))
-
- var/mob/living/carbon/human/H = target
- armor_block = H.run_armor_check(affecting, "melee") // For normal attack damage
-
- else
- //Only humans can have armour, right?
- armor_block = target.run_armor_check(affecting, "melee")
-
- //Apply the damage!
- target.apply_damage(force, BRUTE, affecting, armor_block)
-
- if(affecting == "head" && istype(target, /mob/living/carbon/))
-
- //Display an attack message.
- for(var/mob/O in viewers(user, null))
- if(target != user) O.show_message(text("\red [target] has been hit over the head with a [src.name], by [user]! "), 1)
- else O.show_message(text("\red [target] hit himself with a [src.name] on the head! "), 1)
-
- else
- //Default attack message
- for(var/mob/O in viewers(user, null))
- if(target != user) O.show_message(text("\red [target] has been attacked with a [src.name], by [user]! "), 1)
- else O.show_message(text("\red [target] has attacked himself with a [src.name]! "), 1)
-
- //Attack logs
- user.attack_log += text("\[[time_stamp()]\] Has attacked [target.name] ([target.ckey]) with a drinking glass! ")
- target.attack_log += text("\[[time_stamp()]\] Has been smashed with a drinking glass by [user.name] ([user.ckey]) ")
- log_attack("[user.name] ([user.ckey]) attacked [target.name] with a drinking glass. ([target.ckey]) ")
- if(!iscarbon(user))
- target.LAssailant = null
- else
- target.LAssailant = user
-
- //The reagents in the bottle splash all over the target, thanks for the idea Nodrak
- if(src.reagents)
- for(var/mob/O in viewers(user, null))
- O.show_message(text("\blue The contents of the [src] splashes all over [target]! "), 1)
- src.reagents.reaction(target, TOUCH)
-
- //Finally, smash the bottle. This kills (del) the bottle.
- src.smash(target, user)
+/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/on_reagent_change() // *scream
+ if(reagents.reagent_list.len > 0)
+ switch(reagents.get_master_reagent_id())
+ if("beer")
+ icon_state = "beerglass"
+ name = "Beer glass"
+ desc = "A freezing pint of beer"
+ if("cider")
+ icon_state = "rewriter"
+ name = "Cider"
+ desc = "a refreshing glass of traditional cider"
+ if("beer2")
+ icon_state = "beerglass"
+ name = "Beer glass"
+ desc = "A freezing pint of beer"
+ if("ale")
+ icon_state = "aleglass"
+ name = "Ale glass"
+ desc = "A freezing pint of delicious Ale"
+ if("milk")
+ icon_state = "glass_white"
+ name = "Glass of milk"
+ desc = "White and nutritious goodness!"
+ if("cream")
+ icon_state = "glass_white"
+ name = "Glass of cream"
+ desc = "Ewwww..."
+ if("chocolate")
+ icon_state = "chocolateglass"
+ name = "Glass of chocolate"
+ desc = "Tasty"
+ if("hot_coco")
+ icon_state = "hot_coco"
+ name = "Glass of hot coco"
+ desc = "Delicious and cozy"
+ if("lemonjuice")
+ icon_state = "lemonglass"
+ name = "Glass of lemonjuice"
+ desc = "Sour..."
+ if("cola")
+ icon_state = "glass_brown"
+ name = "Glass of Space Cola"
+ desc = "A glass of refreshing Space Cola"
+ if("nuka_cola")
+ icon_state = "nuka_colaglass"
+ name = "Nuka Cola"
+ desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland"
+ if("orangejuice")
+ icon_state = "glass_orange"
+ name = "Glass of Orange juice"
+ desc = "Vitamins! Yay!"
+ if("tomatojuice")
+ icon_state = "glass_red"
+ name = "Glass of Tomato juice"
+ desc = "Are you sure this is tomato juice?"
+ if("blood")
+ icon_state = "glass_red"
+ name = "Glass of Tomato juice"
+ desc = "Are you sure this is tomato juice?"
+ if("limejuice")
+ icon_state = "glass_green"
+ name = "Glass of Lime juice"
+ desc = "A glass of sweet-sour lime juice."
+ if("whiskey")
+ icon_state = "whiskeyglass"
+ name = "Glass of whiskey"
+ desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy."
+ if("gin")
+ icon_state = "ginvodkaglass"
+ name = "Glass of gin"
+ desc = "A crystal clear glass of Griffeater gin."
+ if("vodka")
+ icon_state = "ginvodkaglass"
+ name = "Glass of vodka"
+ desc = "The glass contain wodka. Xynta."
+ if("sake")
+ icon_state = "ginvodkaglass"
+ name = "Glass of Sake"
+ desc = "A glass of Sake."
+ if("goldschlager")
+ icon_state = "ginvodkaglass"
+ name = "Glass of goldschlager"
+ desc = "100 proof that teen girls will drink anything with gold in it."
+ if("wine")
+ icon_state = "wineglass"
+ name = "Glass of wine"
+ desc = "A very classy looking drink."
+ if("cognac")
+ icon_state = "cognacglass"
+ name = "Glass of cognac"
+ desc = "Damn, you feel like some kind of French aristocrat just by holding this."
+ if("kahlua")
+ icon_state = "kahluaglass"
+ name = "Glass of RR coffee Liquor"
+ desc = "DAMN, THIS THING LOOKS ROBUST"
+ if("vermouth")
+ icon_state = "vermouthglass"
+ name = "Glass of Vermouth"
+ desc = "You wonder why you're even drinking this straight."
+ if("triple_citrus")
+ icon_state = "triplecitrus"
+ name = "Glass of Triplecitrus Juice"
+ desc = "As colorful and healthy as it is delicious."
+ if("mojito")
+ icon_state = "mojito"
+ name = "Glass of Mojito"
+ desc = "Fresh from Spesscuba."
+ if("tequila")
+ icon_state = "tequilaglass"
+ name = "Glass of Tequila"
+ desc = "Now all that's missing is the weird colored shades!"
+ if("patron")
+ icon_state = "patronglass"
+ name = "Glass of Patron"
+ desc = "Drinking patron in the bar, with all the subpar ladies."
+ if("rum")
+ icon_state = "rumglass"
+ name = "Glass of Rum"
+ desc = "Now you want to Pray for a pirate suit, don't you?"
+ if("absinthe")
+ icon_state = "absinthebottle"
+ name = "Glass of Absinthe"
+ desc = "The green fairy is going to get you now!"
+ if("gintonic")
+ icon_state = "gintonicglass"
+ name = "Gin and Tonic"
+ desc = "A mild but still great cocktail. Drink up, like a true Englishman."
+ if("ginsonic")
+ icon_state = "ginsonic"
+ name = "Gin and Sonic"
+ desc = "An extremely high amperage drink. Absolutely not for the true Englishman."
+ if("whiskeycola")
+ icon_state = "whiskeycolaglass"
+ name = "Whiskey Cola"
+ desc = "An innocent-looking mixture of cola and Whiskey. Delicious."
+ if("whiterussian")
+ icon_state = "whiterussianglass"
+ name = "White Russian"
+ desc = "A very nice looking drink. But that's just, like, your opinion, man."
+ if("screwdrivercocktail")
+ icon_state = "screwdriverglass"
+ name = "Screwdriver"
+ desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer."
+ if("bloodymary")
+ icon_state = "bloodymaryglass"
+ name = "Bloody Mary"
+ desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder."
+ if("martini")
+ icon_state = "martiniglass"
+ name = "Classic Martini"
+ desc = "Damn, the bartender even stirred it, not shook it."
+ if("vodkamartini")
+ icon_state = "martiniglass"
+ name = "Vodka martini"
+ desc ="A bastardisation of the classic martini. Still great."
+ if("gargleblaster")
+ icon_state = "gargleblasterglass"
+ name = "Pan-Galactic Gargle Blaster"
+ desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy."
+ if("bravebull")
+ icon_state = "bravebullglass"
+ name = "Brave Bull"
+ desc = "Tequila and Coffee liquor, brought together in a mouthwatering mixture. Drink up."
+ if("tequilasunrise")
+ icon_state = "tequilasunriseglass"
+ name = "Tequila Sunrise"
+ desc = "Oh great, now you feel nostalgic about sunrises back on Terra..."
+ if("toxinsspecial")
+ icon_state = "toxinsspecialglass"
+ name = "Toxins Special"
+ desc = "Whoah, this thing is on FIRE"
+ if("beepskysmash")
+ icon_state = "beepskysmashglass"
+ name = "Beepsky Smash"
+ desc = "Heavy, hot and strong. Just like the Iron fist of the LAW."
+ if("doctorsdelight")
+ icon_state = "doctorsdelightglass"
+ name = "Doctor's Delight"
+ desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place."
+ if("manlydorf")
+ icon_state = "manlydorfglass"
+ name = "The Manly Dorf"
+ desc = "A manly concotion made from Ale and Beer. Intended for true men only."
+ if("irishcream")
+ icon_state = "irishcreamglass"
+ name = "Irish Cream"
+ desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?"
+ if("cubalibre")
+ icon_state = "cubalibreglass"
+ name = "Cuba Libre"
+ desc = "A classic mix of rum and cola."
+ if("b52")
+ icon_state = "b52glass"
+ name = "B-52"
+ desc = "Kahlua, Irish Cream, and congac. You will get bombed."
+ if("atomicbomb")
+ icon_state = "atomicbombglass"
+ name = "Atomic Bomb"
+ desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing."
+ if("longislandicedtea")
+ icon_state = "longislandicedteaglass"
+ name = "Long Island Iced Tea"
+ desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only."
+ if("threemileisland")
+ icon_state = "threemileislandglass"
+ name = "Three Mile Island Ice Tea"
+ desc = "A glass of this is sure to prevent a meltdown."
+ if("margarita")
+ icon_state = "margaritaglass"
+ name = "Margarita"
+ desc = "On the rocks with salt on the rim. Arriba~!"
+ if("blackrussian")
+ icon_state = "blackrussianglass"
+ name = "Black Russian"
+ desc = "For the lactose-intolerant. Still as classy as a White Russian."
+ if("vodkatonic")
+ icon_state = "vodkatonicglass"
+ name = "Vodka and Tonic"
+ desc = "For when a gin and tonic isn't russian enough."
+ if("manhattan")
+ icon_state = "manhattanglass"
+ name = "Manhattan"
+ desc = "The Detective's undercover drink of choice. He never could stomach gin..."
+ if("manhattan_proj")
+ icon_state = "proj_manhattanglass"
+ name = "Manhattan Project"
+ desc = "A scienitst drink of choice, for thinking how to blow up the station."
+ if("ginfizz")
+ icon_state = "ginfizzglass"
+ name = "Gin Fizz"
+ desc = "Refreshingly lemony, deliciously dry."
+ if("irishcoffee")
+ icon_state = "irishcoffeeglass"
+ name = "Irish Coffee"
+ desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning."
+ if("suicider")
+ icon_state = "suicider"
+ name = "Suicider"
+ desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
+ if("whiskeysoda")
+ icon_state = "whiskeysodaglass2"
+ name = "Whiskey Soda"
+ desc = "Ultimate refreshment."
+ if("tonic")
+ icon_state = "glass_clear"
+ name = "Glass of Tonic Water"
+ desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
+ if("sodawater")
+ icon_state = "glass_clear"
+ name = "Glass of Soda Water"
+ desc = "Soda water. Why not make a scotch and soda?"
+ if("water")
+ icon_state = "glass_clear"
+ name = "Glass of Water"
+ desc = "The father of all refreshments."
+ if("spacemountainwind")
+ icon_state = "Space_mountain_wind_glass"
+ name = "Glass of Space Mountain Wind"
+ desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind."
+ if("thirteenloko")
+ icon_state = "thirteen_loko_glass"
+ name = "Glass of Thirteen Loko"
+ desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass"
+ if("dr_gibb")
+ icon_state = "dr_gibb_glass"
+ name = "Glass of Dr. Gibb"
+ desc = "Dr. Gibb. Not as dangerous as the name might imply."
+ if("space_up")
+ icon_state = "space-up_glass"
+ name = "Glass of Space-up"
+ desc = "Space-up. It helps keep your cool."
+ if("moonshine")
+ icon_state = "glass_clear"
+ name = "Moonshine"
+ desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
+ if("soymilk")
+ icon_state = "glass_white"
+ name = "Glass of soy milk"
+ desc = "White and nutritious soy goodness!"
+ if("berryjuice")
+ icon_state = "berryjuice"
+ name = "Glass of berry juice"
+ desc = "Berry juice. Or maybe its jam. Who cares?"
+ if("poisonberryjuice")
+ icon_state = "poisonberryjuice"
+ name = "Glass of poison berry juice"
+ desc = "A glass of deadly juice."
+ if("carrotjuice")
+ icon_state = "carrotjuice"
+ name = "Glass of carrot juice"
+ desc = "It is just like a carrot but without crunching."
+ if("potato")
+ icon_state = "glass_brown"
+ name = "Glass of potato juice"
+ desc = "Who in the hell requests this? Gross!"
+ if("banana")
+ icon_state = "banana"
+ name = "Glass of banana juice"
+ desc = "The raw essence of a banana. HONK"
+ if("bahama_mama")
+ icon_state = "bahama_mama"
+ name = "Bahama Mama"
+ desc = "Tropic cocktail"
+ if("singulo")
+ icon_state = "singulo"
+ name = "Singulo"
+ desc = "A blue-space beverage."
+ if("alliescocktail")
+ icon_state = "alliescocktail"
+ name = "Allies cocktail"
+ desc = "A drink made from your allies."
+ if("antifreeze")
+ icon_state = "antifreeze"
+ name = "Anti-freeze"
+ desc = "The ultimate refreshment."
+ if("barefoot")
+ icon_state = "b&p"
+ name = "Barefoot"
+ desc = "Barefoot and pregnant"
+ if("demonsblood")
+ icon_state = "demonsblood"
+ name = "Demons Blood"
+ desc = "Just looking at this thing makes the hair at the back of your neck stand up."
+ if("booger")
+ icon_state = "booger"
+ name = "Booger"
+ desc = "Ewww..."
+ if("snowwhite")
+ icon_state = "snowwhite"
+ name = "Snow White"
+ desc = "A cold refreshment."
+ if("aloe")
+ icon_state = "aloe"
+ name = "Aloe"
+ desc = "Very, very, very good."
+ if("andalusia")
+ icon_state = "andalusia"
+ name = "Andalusia"
+ desc = "A nice, strange named drink."
+ if("sbiten")
+ icon_state = "sbitenglass"
+ name = "Sbiten"
+ desc = "A spicy mix of Vodka and Spice. Very hot."
+ if("red_mead")
+ icon_state = "red_meadglass"
+ name = "Red Mead"
+ desc = "A True Vikings Beverage, though its color is strange."
+ if("mead")
+ icon_state = "meadglass"
+ name = "Mead"
+ desc = "A Vikings Beverage, though a cheap one."
+ if("iced_beer")
+ icon_state = "iced_beerglass"
+ name = "Iced Beer"
+ desc = "A beer so frosty, the air around it freezes."
+ if("grog")
+ icon_state = "grogglass"
+ name = "Grog"
+ desc = "A fine and cepa drink for Space."
+ if("soy_latte")
+ icon_state = "soy_latte"
+ name = "Soy Latte"
+ desc = "A nice and refrshing beverage while you are reading."
+ if("cafe_latte")
+ icon_state = "cafe_latte"
+ name = "Cafe Latte"
+ desc = "A nice, strong and refreshing beverage while you are reading."
+ if("cafe_mocha")
+ icon_state = "cafe_latte"
+ name = "Cafe Mocha"
+ desc = "The perfect blend of coffe, milk, and chocolate."
+ if("acidspit")
+ icon_state = "acidspitglass"
+ name = "Acid Spit"
+ desc = "A drink from Nanotrasen. Made from live aliens."
+ if("amasec")
+ icon_state = "amasecglass"
+ name = "Amasec"
+ desc = "Always handy before COMBAT!!!"
+ if("neurotoxin")
+ icon_state = "neurotoxinglass"
+ name = "Neurotoxin"
+ desc = "A drink that is guaranteed to knock you silly."
+ if("hippiesdelight")
+ icon_state = "hippiesdelightglass"
+ name = "Hippie's Delight"
+ desc = "A drink enjoyed by people during the 1960's."
+ if("bananahonk")
+ icon_state = "bananahonkglass"
+ name = "Banana Honk"
+ desc = "A drink from Banana Heaven."
+ if("silencer")
+ icon_state = "silencerglass"
+ name = "Silencer"
+ desc = "A drink from mime Heaven."
+ if("nothing")
+ icon_state = "nothing"
+ name = "Nothing"
+ desc = "Absolutely nothing."
+ if("devilskiss")
+ icon_state = "devilskiss"
+ name = "Devils Kiss"
+ desc = "Creepy time!"
+ if("changelingsting")
+ icon_state = "changelingsting"
+ name = "Changeling Sting"
+ desc = "A stingy drink."
+ if("irishcarbomb")
+ icon_state = "irishcarbomb"
+ name = "Irish Car Bomb"
+ desc = "An irish car bomb."
+ if("syndicatebomb")
+ icon_state = "syndicatebomb"
+ name = "Syndicate Bomb"
+ desc = "A syndicate bomb."
+ if("erikasurprise")
+ icon_state = "erikasurprise"
+ name = "Erika Surprise"
+ desc = "The surprise is, it's green!"
+ if("driestmartini")
+ icon_state = "driestmartiniglass"
+ name = "Driest Martini"
+ desc = "Only for the experienced. You think you see sand floating in the glass."
+ if("ice")
+ icon_state = "iceglass"
+ name = "Glass of ice"
+ desc = "Generally, you're supposed to put something else in there too..."
+ if("icecoffee")
+ icon_state = "icedcoffeeglass"
+ name = "Iced Coffee"
+ desc = "A drink to perk you up and refresh you!"
+ if("coffee")
+ icon_state = "glass_brown"
+ name = "Glass of coffee"
+ desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere."
+ if("bilk")
+ icon_state = "glass_brown"
+ name = "Glass of bilk"
+ desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis."
+ if("fuel")
+ icon_state = "dr_gibb_glass"
+ name = "Glass of welder fuel"
+ desc = "Unless you are an industrial tool, this is probably not safe for consumption."
+ if("brownstar")
+ icon_state = "brownstar"
+ name = "Brown Star"
+ desc = "Its not what it sounds like..."
+ if("tea")
+ icon_state = "glass_brown"
+ name = "Glass of Tea"
+ desc = "A glass of hot tea. Perhaps a cup with a handle would have been smarter?"
+ if("icetea")
+ icon_state = "icetea"
+ name = "Iced Tea"
+ desc = "No relation to a certain rap artist/ actor."
+ if("milkshake")
+ icon_state = "milkshake"
+ name = "Milkshake"
+ desc = "Glorious brainfreezing mixture."
+ if("lemonade")
+ icon_state = "lemonade"
+ name = "Lemonade"
+ desc = "Oh the nostalgia..."
+ if("kiraspecial")
+ icon_state = "kiraspecial"
+ name = "Kira Special"
+ desc = "Long live the guy who everyone had mistaken for a girl. Baka!"
+ if("rewriter")
+ icon_state = "rewriter"
+ name = "Rewriter"
+ desc = "The secert of the sanctuary of the Libarian..."
+ if("applejack")
+ icon_state = "cognacglass"
+ name = "Glass of applejack"
+ desc = "When cider isn't strong enough, you gotta jack it."
+ if("jackrose")
+ icon_state = "patronglass"
+ name = "Jack Rose"
+ desc = "Drinking this makes you feel like you belong in a luxury hotel bar during the 1920s."
+ if("synthanol")
+ icon_state = "synthanolglass"
+ name = "Glass of Synthanol"
+ desc = "The equivalent of alcohol for synthetic crewmembers. They'd find it awful if they had tastebuds too."
+ if("robottears")
+ icon_state = "robottearsglass"
+ name = "Glass of Robot Tears"
+ desc = "No robots were hurt in the making of this drink."
+ if("trinary")
+ icon_state = "trinaryglass"
+ name = "Glass of Trinary"
+ desc = "Colorful drink made for synthetic crewmembers. It doesn't seem like it would taste well."
+ if("servo")
+ icon_state = "servoglass"
+ name = "Glass of Servo"
+ desc = "Chocolate - based drink made for IPCs. Not sure if anyone's actually tried out the recipe."
+ if("synthnsoda")
+ icon_state = "synthnsodaglass"
+ name = "Glass of Synth 'n Soda"
+ desc = "Classic drink altered to fit the tastes of a robot. Bad idea to drink if you're made of carbon."
+ if("synthignon")
+ icon_state = "synthignonglass"
+ name = "Glass of Synthignon"
+ desc = "Someone mixed good wine and robot booze. Romantic, but atrocious."
+ if("uplink")
+ icon_state = "uplinkglass"
+ name = "Glass of Uplink"
+ desc = "An exquisite mix of the finest liquoirs and synthanol. Meant only for synthetics."
+ if("holywater")
+ icon_state = "glass_clear"
+ name = "Glass of Water"
+ desc = "The father of all refreshments."
- on_reagent_change()
- /*if(reagents.reagent_list.len > 1 )
- icon_state = "glass_brown"
- name = "Glass of Hooch"
- desc = "Two or more drinks, mixed together."*/
- /*else if(reagents.reagent_list.len == 1)
- for(var/datum/reagent/R in reagents.reagent_list)
- switch(R.id)*/
- if (reagents.reagent_list.len > 0)
- //mrid = R.get_master_reagent_id()
- switch(reagents.get_master_reagent_id())
- if("beer")
- icon_state = "beerglass"
- name = "Beer glass"
- desc = "A freezing pint of beer"
- if("cider")
- icon_state = "rewriter"
- name = "Cider"
- desc = "a refreshing glass of traditional cider"
- if("beer2")
- icon_state = "beerglass"
- name = "Beer glass"
- desc = "A freezing pint of beer"
- if("ale")
- icon_state = "aleglass"
- name = "Ale glass"
- desc = "A freezing pint of delicious Ale"
- if("milk")
- icon_state = "glass_white"
- name = "Glass of milk"
- desc = "White and nutritious goodness!"
- if("cream")
- icon_state = "glass_white"
- name = "Glass of cream"
- desc = "Ewwww..."
- if("chocolate")
- icon_state = "chocolateglass"
- name = "Glass of chocolate"
- desc = "Tasty"
- if("hot_coco")
- icon_state = "hot_coco"
- name = "Glass of hot coco"
- desc = "Delicious and cozy"
- if("lemonjuice")
- icon_state = "lemonglass"
- name = "Glass of lemonjuice"
- desc = "Sour..."
- if("cola")
- icon_state = "glass_brown"
- name = "Glass of Space Cola"
- desc = "A glass of refreshing Space Cola"
- if("nuka_cola")
- icon_state = "nuka_colaglass"
- name = "Nuka Cola"
- desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland"
- if("orangejuice")
- icon_state = "glass_orange"
- name = "Glass of Orange juice"
- desc = "Vitamins! Yay!"
- if("tomatojuice")
- icon_state = "glass_red"
- name = "Glass of Tomato juice"
- desc = "Are you sure this is tomato juice?"
- if("blood")
- icon_state = "glass_red"
- name = "Glass of Tomato juice"
- desc = "Are you sure this is tomato juice?"
- if("limejuice")
- icon_state = "glass_green"
- name = "Glass of Lime juice"
- desc = "A glass of sweet-sour lime juice."
- if("whiskey")
- icon_state = "whiskeyglass"
- name = "Glass of whiskey"
- desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy."
- if("gin")
- icon_state = "ginvodkaglass"
- name = "Glass of gin"
- desc = "A crystal clear glass of Griffeater gin."
- if("vodka")
- icon_state = "ginvodkaglass"
- name = "Glass of vodka"
- desc = "The glass contain wodka. Xynta."
- if("sake")
- icon_state = "ginvodkaglass"
- name = "Glass of Sake"
- desc = "A glass of Sake."
- if("goldschlager")
- icon_state = "ginvodkaglass"
- name = "Glass of goldschlager"
- desc = "100 proof that teen girls will drink anything with gold in it."
- if("wine")
- icon_state = "wineglass"
- name = "Glass of wine"
- desc = "A very classy looking drink."
- if("cognac")
- icon_state = "cognacglass"
- name = "Glass of cognac"
- desc = "Damn, you feel like some kind of French aristocrat just by holding this."
- if ("kahlua")
- icon_state = "kahluaglass"
- name = "Glass of RR coffee Liquor"
- desc = "DAMN, THIS THING LOOKS ROBUST"
- if("vermouth")
- icon_state = "vermouthglass"
- name = "Glass of Vermouth"
- desc = "You wonder why you're even drinking this straight."
- if("triple_citrus")
- icon_state = "triplecitrus"
- name = "Glass of Triplecitrus Juice"
- desc = "As colorful and healthy as it is delicious."
- if("mojito")
- icon_state = "mojito"
- name = "Glass of Mojito"
- desc = "Fresh from Spesscuba."
- if("tequilla")
- icon_state = "tequillaglass"
- name = "Glass of Tequilla"
- desc = "Now all that's missing is the weird colored shades!"
- if("patron")
- icon_state = "patronglass"
- name = "Glass of Patron"
- desc = "Drinking patron in the bar, with all the subpar ladies."
- if("rum")
- icon_state = "rumglass"
- name = "Glass of Rum"
- desc = "Now you want to Pray for a pirate suit, don't you?"
- if("absinthe")
- icon_state = "absinthebottle"
- name = "Glass of Absinthe"
- desc = "The green fairy is going to get you now!"
- if("gintonic")
- icon_state = "gintonicglass"
- name = "Gin and Tonic"
- desc = "A mild but still great cocktail. Drink up, like a true Englishman."
- if("ginsonic")
- icon_state = "ginsonic"
- name = "Gin and Sonic"
- desc = "An extremely high amperage drink. Absolutely not for the true Englishman."
- if("whiskeycola")
- icon_state = "whiskeycolaglass"
- name = "Whiskey Cola"
- desc = "An innocent-looking mixture of cola and Whiskey. Delicious."
- if("whiterussian")
- icon_state = "whiterussianglass"
- name = "White Russian"
- desc = "A very nice looking drink. But that's just, like, your opinion, man."
- if("screwdrivercocktail")
- icon_state = "screwdriverglass"
- name = "Screwdriver"
- desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer."
- if("bloodymary")
- icon_state = "bloodymaryglass"
- name = "Bloody Mary"
- desc = "Tomato juice, mixed with Vodka and a lil' bit of lime. Tastes like liquid murder."
- if("martini")
- icon_state = "martiniglass"
- name = "Classic Martini"
- desc = "Damn, the bartender even stirred it, not shook it."
- if("vodkamartini")
- icon_state = "martiniglass"
- name = "Vodka martini"
- desc ="A bastardisation of the classic martini. Still great."
- if("gargleblaster")
- icon_state = "gargleblasterglass"
- name = "Pan-Galactic Gargle Blaster"
- desc = "Does... does this mean that Arthur and Ford are on the station? Oh joy."
- if("bravebull")
- icon_state = "bravebullglass"
- name = "Brave Bull"
- desc = "Tequilla and Coffee liquor, brought together in a mouthwatering mixture. Drink up."
- if("tequillasunrise")
- icon_state = "tequillasunriseglass"
- name = "Tequilla Sunrise"
- desc = "Oh great, now you feel nostalgic about sunrises back on Terra..."
- if("toxinsspecial")
- icon_state = "toxinsspecialglass"
- name = "Toxins Special"
- desc = "Whoah, this thing is on FIRE"
- if("beepskysmash")
- icon_state = "beepskysmashglass"
- name = "Beepsky Smash"
- desc = "Heavy, hot and strong. Just like the Iron fist of the LAW."
- if("doctorsdelight")
- icon_state = "doctorsdelightglass"
- name = "Doctor's Delight"
- desc = "A healthy mixture of juices, guaranteed to keep you healthy until the next toolboxing takes place."
- if("manlydorf")
- icon_state = "manlydorfglass"
- name = "The Manly Dorf"
- desc = "A manly concotion made from Ale and Beer. Intended for true men only."
- if("irishcream")
- icon_state = "irishcreamglass"
- name = "Irish Cream"
- desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?"
- if("cubalibre")
- icon_state = "cubalibreglass"
- name = "Cuba Libre"
- desc = "A classic mix of rum and cola."
- if("b52")
- icon_state = "b52glass"
- name = "B-52"
- desc = "Kahlua, Irish Cream, and congac. You will get bombed."
- if("atomicbomb")
- icon_state = "atomicbombglass"
- name = "Atomic Bomb"
- desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing."
- if("longislandicedtea")
- icon_state = "longislandicedteaglass"
- name = "Long Island Iced Tea"
- desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only."
- if("threemileisland")
- icon_state = "threemileislandglass"
- name = "Three Mile Island Ice Tea"
- desc = "A glass of this is sure to prevent a meltdown."
- if("margarita")
- icon_state = "margaritaglass"
- name = "Margarita"
- desc = "On the rocks with salt on the rim. Arriba~!"
- if("blackrussian")
- icon_state = "blackrussianglass"
- name = "Black Russian"
- desc = "For the lactose-intolerant. Still as classy as a White Russian."
- if("vodkatonic")
- icon_state = "vodkatonicglass"
- name = "Vodka and Tonic"
- desc = "For when a gin and tonic isn't russian enough."
- if("manhattan")
- icon_state = "manhattanglass"
- name = "Manhattan"
- desc = "The Detective's undercover drink of choice. He never could stomach gin..."
- if("manhattan_proj")
- icon_state = "proj_manhattanglass"
- name = "Manhattan Project"
- desc = "A scienitst drink of choice, for thinking how to blow up the station."
- if("ginfizz")
- icon_state = "ginfizzglass"
- name = "Gin Fizz"
- desc = "Refreshingly lemony, deliciously dry."
- if("irishcoffee")
- icon_state = "irishcoffeeglass"
- name = "Irish Coffee"
- desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning."
- if("suicider")
- icon_state = "suicider"
- name = "Suicider"
- desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
- if("whiskeysoda")
- icon_state = "whiskeysodaglass2"
- name = "Whiskey Soda"
- desc = "Ultimate refreshment."
- if("tonic")
- icon_state = "glass_clear"
- name = "Glass of Tonic Water"
- desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
- if("sodawater")
- icon_state = "glass_clear"
- name = "Glass of Soda Water"
- desc = "Soda water. Why not make a scotch and soda?"
- if("water")
- icon_state = "glass_clear"
- name = "Glass of Water"
- desc = "The father of all refreshments."
- if("spacemountainwind")
- icon_state = "Space_mountain_wind_glass"
- name = "Glass of Space Mountain Wind"
- desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind."
- if("thirteenloko")
- icon_state = "thirteen_loko_glass"
- name = "Glass of Thirteen Loko"
- desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass"
- if("dr_gibb")
- icon_state = "dr_gibb_glass"
- name = "Glass of Dr. Gibb"
- desc = "Dr. Gibb. Not as dangerous as the name might imply."
- if("space_up")
- icon_state = "space-up_glass"
- name = "Glass of Space-up"
- desc = "Space-up. It helps keep your cool."
- if("moonshine")
- icon_state = "glass_clear"
- name = "Moonshine"
- desc = "You've really hit rock bottom now... your liver packed its bags and left last night."
- if("soymilk")
- icon_state = "glass_white"
- name = "Glass of soy milk"
- desc = "White and nutritious soy goodness!"
- if("berryjuice")
- icon_state = "berryjuice"
- name = "Glass of berry juice"
- desc = "Berry juice. Or maybe its jam. Who cares?"
- if("poisonberryjuice")
- icon_state = "poisonberryjuice"
- name = "Glass of poison berry juice"
- desc = "A glass of deadly juice."
- if("carrotjuice")
- icon_state = "carrotjuice"
- name = "Glass of carrot juice"
- desc = "It is just like a carrot but without crunching."
- if("potato")
- icon_state = "glass_brown"
- name = "Glass of potato juice"
- desc = "Who in the hell requests this? Gross!"
- if("banana")
- icon_state = "banana"
- name = "Glass of banana juice"
- desc = "The raw essence of a banana. HONK"
- if("bahama_mama")
- icon_state = "bahama_mama"
- name = "Bahama Mama"
- desc = "Tropic cocktail"
- if("singulo")
- icon_state = "singulo"
- name = "Singulo"
- desc = "A blue-space beverage."
- if("alliescocktail")
- icon_state = "alliescocktail"
- name = "Allies cocktail"
- desc = "A drink made from your allies."
- if("antifreeze")
- icon_state = "antifreeze"
- name = "Anti-freeze"
- desc = "The ultimate refreshment."
- if("barefoot")
- icon_state = "b&p"
- name = "Barefoot"
- desc = "Barefoot and pregnant"
- if("demonsblood")
- icon_state = "demonsblood"
- name = "Demons Blood"
- desc = "Just looking at this thing makes the hair at the back of your neck stand up."
- if("booger")
- icon_state = "booger"
- name = "Booger"
- desc = "Ewww..."
- if("snowwhite")
- icon_state = "snowwhite"
- name = "Snow White"
- desc = "A cold refreshment."
- if("aloe")
- icon_state = "aloe"
- name = "Aloe"
- desc = "Very, very, very good."
- if("andalusia")
- icon_state = "andalusia"
- name = "Andalusia"
- desc = "A nice, strange named drink."
- if("sbiten")
- icon_state = "sbitenglass"
- name = "Sbiten"
- desc = "A spicy mix of Vodka and Spice. Very hot."
- if("red_mead")
- icon_state = "red_meadglass"
- name = "Red Mead"
- desc = "A True Vikings Beverage, though its color is strange."
- if("mead")
- icon_state = "meadglass"
- name = "Mead"
- desc = "A Vikings Beverage, though a cheap one."
- if("iced_beer")
- icon_state = "iced_beerglass"
- name = "Iced Beer"
- desc = "A beer so frosty, the air around it freezes."
- if("grog")
- icon_state = "grogglass"
- name = "Grog"
- desc = "A fine and cepa drink for Space."
- if("soy_latte")
- icon_state = "soy_latte"
- name = "Soy Latte"
- desc = "A nice and refrshing beverage while you are reading."
- if("cafe_latte")
- icon_state = "cafe_latte"
- name = "Cafe Latte"
- desc = "A nice, strong and refreshing beverage while you are reading."
- if("cafe_mocha")
- icon_state = "cafe_latte"
- name = "Cafe Mocha"
- desc = "The perfect blend of coffe, milk, and chocolate."
- if("acidspit")
- icon_state = "acidspitglass"
- name = "Acid Spit"
- desc = "A drink from Nanotrasen. Made from live aliens."
- if("amasec")
- icon_state = "amasecglass"
- name = "Amasec"
- desc = "Always handy before COMBAT!!!"
- if("neurotoxin")
- icon_state = "neurotoxinglass"
- name = "Neurotoxin"
- desc = "A drink that is guaranteed to knock you silly."
- if("hippiesdelight")
- icon_state = "hippiesdelightglass"
- name = "Hippie's Delight"
- desc = "A drink enjoyed by people during the 1960's."
- if("bananahonk")
- icon_state = "bananahonkglass"
- name = "Banana Honk"
- desc = "A drink from Banana Heaven."
- if("silencer")
- icon_state = "silencerglass"
- name = "Silencer"
- desc = "A drink from mime Heaven."
- if("nothing")
- icon_state = "nothing"
- name = "Nothing"
- desc = "Absolutely nothing."
- if("devilskiss")
- icon_state = "devilskiss"
- name = "Devils Kiss"
- desc = "Creepy time!"
- if("changelingsting")
- icon_state = "changelingsting"
- name = "Changeling Sting"
- desc = "A stingy drink."
- if("irishcarbomb")
- icon_state = "irishcarbomb"
- name = "Irish Car Bomb"
- desc = "An irish car bomb."
- if("syndicatebomb")
- icon_state = "syndicatebomb"
- name = "Syndicate Bomb"
- desc = "A syndicate bomb."
- if("erikasurprise")
- icon_state = "erikasurprise"
- name = "Erika Surprise"
- desc = "The surprise is, it's green!"
- if("driestmartini")
- icon_state = "driestmartiniglass"
- name = "Driest Martini"
- desc = "Only for the experienced. You think you see sand floating in the glass."
- if("ice")
- icon_state = "iceglass"
- name = "Glass of ice"
- desc = "Generally, you're supposed to put something else in there too..."
- if("icecoffee")
- icon_state = "icedcoffeeglass"
- name = "Iced Coffee"
- desc = "A drink to perk you up and refresh you!"
- if("coffee")
- icon_state = "glass_brown"
- name = "Glass of coffee"
- desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere."
- if("bilk")
- icon_state = "glass_brown"
- name = "Glass of bilk"
- desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis."
- if("fuel")
- icon_state = "dr_gibb_glass"
- name = "Glass of welder fuel"
- desc = "Unless you are an industrial tool, this is probably not safe for consumption."
- if("brownstar")
- icon_state = "brownstar"
- name = "Brown Star"
- desc = "Its not what it sounds like..."
- if("tea")
- icon_state = "glass_brown"
- name = "Glass of Tea"
- desc = "A glass of hot tea. Perhaps a cup with a handle would have been smarter?"
- if("icetea")
- icon_state = "icetea"
- name = "Iced Tea"
- desc = "No relation to a certain rap artist/ actor."
- if("milkshake")
- icon_state = "milkshake"
- name = "Milkshake"
- desc = "Glorious brainfreezing mixture."
- if("lemonade")
- icon_state = "lemonade"
- name = "Lemonade"
- desc = "Oh the nostalgia..."
- if("kiraspecial")
- icon_state = "kiraspecial"
- name = "Kira Special"
- desc = "Long live the guy who everyone had mistaken for a girl. Baka!"
- if("rewriter")
- icon_state = "rewriter"
- name = "Rewriter"
- desc = "The secert of the sanctuary of the Libarian..."
- if("applejack")
- icon_state = "cognacglass"
- name = "Glass of applejack"
- desc = "When cider isn't strong enough, you gotta jack it."
- if("jackrose")
- icon_state = "patronglass"
- name = "Jack Rose"
- desc = "Drinking this makes you feel like you belong in a luxury hotel bar during the 1920s."
- if("synthanol")
- icon_state = "synthanolglass"
- name = "Glass of Synthanol"
- desc = "The equivalent of alcohol for synthetic crewmembers. They'd find it awful if they had tastebuds too."
- if("robottears")
- icon_state = "robottearsglass"
- name = "Glass of Robot Tears"
- desc = "No robots were hurt in the making of this drink."
- if("trinary")
- icon_state = "trinaryglass"
- name = "Glass of Trinary"
- desc = "Colorful drink made for synthetic crewmembers. It doesn't seem like it would taste well."
- if("servo")
- icon_state = "servoglass"
- name = "Glass of Servo"
- desc = "Chocolate - based drink made for IPCs. Not sure if anyone's actually tried out the recipe."
- if("synthnsoda")
- icon_state = "synthnsodaglass"
- name = "Glass of Synth 'n Soda"
- desc = "Classic drink altered to fit the tastes of a robot. Bad idea to drink if you're made of carbon."
- if("synthignon")
- icon_state = "synthignonglass"
- name = "Glass of Synthignon"
- desc = "Someone mixed good wine and robot booze. Romantic, but atrocious."
- if("uplink")
- icon_state = "uplinkglass"
- name = "Glass of Uplink"
- desc = "An exquisite mix of the finest liquoirs and synthanol. Meant only for synthetics."
- if("holywater")
- icon_state = "glass_clear"
- name = "Glass of Water"
- desc = "The father of all refreshments."
-
-
- else
- icon_state ="glass_brown"
- name = "Glass of ..what?"
- desc = "You can't really tell what this is."
- else
- icon_state = "glass_empty"
- name = "glass"
- desc = "Your standard drinking glass."
-// center_of_mass = list("x"=16, "y"=10)
- return
+ else
+ icon_state ="glass_brown"
+ name = "Glass of ..what?"
+ desc = "You can't really tell what this is."
+ else
+ icon_state = "glass_empty"
+ name = "glass"
+ desc = "Your standard drinking glass."
// for /obj/machinery/vending/sovietsoda
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/soda
- New()
- ..()
- reagents.add_reagent("sodawater", 50)
- on_reagent_change()
+ list_reagents = list("sodawater" = 50)
+
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/cola
- New()
- ..()
- reagents.add_reagent("cola", 50)
- on_reagent_change()
+ list_reagents = list("cola" = 50)
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/devilskiss
- New()
- ..()
- reagents.add_reagent("devilskiss", 50)
- on_reagent_change()
+ list_reagents = list("devilskiss" = 50)
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/food/drinks/jar.dm b/code/modules/reagents/reagent_containers/food/drinks/jar.dm
deleted file mode 100644
index c28aee6b6cc..00000000000
--- a/code/modules/reagents/reagent_containers/food/drinks/jar.dm
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-///jar
-
-/obj/item/weapon/reagent_containers/food/drinks/jar
- name = "empty jar"
- desc = "A jar. You're not sure what it's supposed to hold."
- icon_state = "jar"
- item_state = "beaker"
- New()
- ..()
- reagents.add_reagent("slimejelly", 50)
-
- on_reagent_change()
- if (reagents.reagent_list.len > 0)
- switch(reagents.get_master_reagent_id())
- if("slimejelly")
- icon_state = "jar_slime"
- name = "slime jam"
- desc = "A jar of slime jam. Delicious!"
- else
- icon_state ="jar_what"
- name = "jar of something"
- desc = "You can't really tell what this is."
- else
- icon_state = "jar"
- name = "empty jar"
- desc = "A jar. You're not sure what it's supposed to hold."
- return
diff --git a/code/modules/reagents/reagent_containers/food/drinks/shotglass.dm b/code/modules/reagents/reagent_containers/food/drinks/shotglass.dm
index 46289547909..42781cd1e57 100644
--- a/code/modules/reagents/reagent_containers/food/drinks/shotglass.dm
+++ b/code/modules/reagents/reagent_containers/food/drinks/shotglass.dm
@@ -11,10 +11,15 @@
if(reagents.total_volume)
var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]1")
- switch(reagents.total_volume)
- if(0 to 4) filling.icon_state = "[icon_state]1"
- if(5 to 11) filling.icon_state = "[icon_state]5"
- if(12 to INFINITY) filling.icon_state = "[icon_state]12"
+
+ var/percent = round((reagents.total_volume / volume) * 100)
+ switch(percent)
+ if(0 to 25)
+ filling.icon_state = "[icon_state]1"
+ if(26 to 79)
+ filling.icon_state = "[icon_state]5"
+ if(80 to INFINITY)
+ filling.icon_state = "[icon_state]12"
filling.icon += mix_color_from_reagents(reagents.reagent_list)
overlays += filling
diff --git a/code/modules/reagents/reagent_containers/food/sandwich.dm b/code/modules/reagents/reagent_containers/food/sandwich.dm
deleted file mode 100644
index 75919c4314f..00000000000
--- a/code/modules/reagents/reagent_containers/food/sandwich.dm
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
-
-/obj/item/weapon/reagent_containers/food/snacks/breadslice/attackby(obj/item/W as obj, mob/user as mob, params)
-
- if(istype(W,/obj/item/weapon/shard) || istype(W,/obj/item/weapon/reagent_containers/food/snacks))
- var/obj/item/weapon/reagent_containers/food/snacks/csandwich/S = new(get_turf(src))
- S.attackby(W,user, params)
- qdel(src)
- ..()
-
-/obj/item/weapon/reagent_containers/food/snacks/csandwich
- name = "sandwich"
- desc = "The best thing since sliced bread."
- icon_state = "breadslice"
- trash = /obj/item/trash/plate
- bitesize = 2
-
- var/list/ingredients = list()
-
-/obj/item/weapon/reagent_containers/food/snacks/csandwich/attackby(obj/item/W as obj, mob/user as mob, params)
-
- var/sandwich_limit = 4
- for(var/obj/item/O in ingredients)
- if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/breadslice))
- sandwich_limit += 4
-
- if(src.contents.len > sandwich_limit)
- to_chat(user, "\red If you put anything else on \the [src] it's going to collapse.")
- return
- else if(istype(W,/obj/item/weapon/shard))
- to_chat(user, "\blue You hide [W] in \the [src].")
- user.drop_item()
- W.loc = src
- update()
- return
- else if(istype(W,/obj/item/weapon/reagent_containers/food/snacks))
- to_chat(user, "\blue You layer [W] over \the [src].")
- var/obj/item/weapon/reagent_containers/F = W
- F.reagents.trans_to(src, F.reagents.total_volume)
- user.drop_item()
- W.loc = src
- ingredients += W
- update()
- return
- ..()
-
-/obj/item/weapon/reagent_containers/food/snacks/csandwich/proc/update()
- var/fullname = "" //We need to build this from the contents of the var.
- var/i = 0
-
- overlays.Cut()
-
- for(var/obj/item/weapon/reagent_containers/food/snacks/O in ingredients)
-
- i++
- if(i == 1)
- fullname += "[O.name]"
- else if(i == ingredients.len)
- fullname += " and [O.name]"
- else
- fullname += ", [O.name]"
-
- var/image/I = new(src.icon, "sandwich_filling")
- I.color = O.filling_color
- I.pixel_x = pick(list(-1,0,1))
- I.pixel_y = (i*2)+1
- overlays += I
-
- var/image/T = new(src.icon, "sandwich_top")
- T.pixel_x = pick(list(-1,0,1))
- T.pixel_y = (ingredients.len * 2)+1
- overlays += T
-
- name = lowertext("[fullname] sandwich")
- if(length(name) > 80) name = "[pick(list("absurd","colossal","enormous","ridiculous"))] sandwich"
- w_class = n_ceil(Clamp((ingredients.len/2),1,3))
-
-/obj/item/weapon/reagent_containers/food/snacks/csandwich/Destroy()
- for(var/obj/item/O in ingredients)
- qdel(O)
- return ..()
-
-/obj/item/weapon/reagent_containers/food/snacks/csandwich/examine(mob/user)
- ..(user)
- var/obj/item/O = pick(contents)
- to_chat(user, "\blue You think you can see [O.name] in there.")
-
-/obj/item/weapon/reagent_containers/food/snacks/csandwich/attack(mob/M as mob, mob/user as mob, def_zone)
-
- var/obj/item/shard
- for(var/obj/item/O in contents)
- if(istype(O,/obj/item/weapon/shard))
- shard = O
- break
-
- var/mob/living/H
- if(istype(M,/mob/living))
- H = M
-
- if(H && shard && M == user) //This needs a check for feeding the food to other people, but that could be abusable.
- to_chat(H, "\red You lacerate your mouth on a [shard.name] in the sandwich!")
- H.adjustBruteLoss(5) //TODO: Target head if human.
- ..()
-*/
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index 8538db0b13d..c63a857ea0a 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -61,11 +61,11 @@
/obj/item/weapon/reagent_containers/food/snacks/examine(mob/user)
if(..(user, 0))
- if (bitecount==0)
+ if(bitecount==0)
return
- else if (bitecount==1)
+ else if(bitecount==1)
to_chat(user, "\blue \The [src] was bitten by someone!")
- else if (bitecount<=3)
+ else if(bitecount<=3)
to_chat(user, "\blue \The [src] was bitten [bitecount] times!")
else
to_chat(user, "\blue \The [src] was bitten multiple times!")
@@ -138,7 +138,7 @@
return 1
to_chat(user, "\red You slip [W] inside [src].")
user.unEquip(W)
- if ((user.client && user.s_active != src))
+ if((user.client && user.s_active != src))
user.client.screen -= W
W.dropped(user)
add_fingerprint(user)
@@ -146,7 +146,7 @@
return
else
return 1
- if ( \
+ if( \
!isturf(src.loc) || \
!(locate(/obj/structure/table) in src.loc) && \
!(locate(/obj/machinery/optable) in src.loc) && \
@@ -155,7 +155,7 @@
to_chat(user, "\red You cannot slice [src] here! You need a table or at least a tray to do it.")
return 1
var/slices_lost = 0
- if (!inaccurate)
+ if(!inaccurate)
user.visible_message( \
"\blue [user] slices \the [src]!", \
"\blue You slice \the [src]!" \
@@ -712,6 +712,18 @@
reagents.add_reagent("toxin", 3)
bitesize = 3
+/obj/item/weapon/reagent_containers/food/snacks/lizardmeat
+ name = "mutant lizard meat"
+ desc = "Seems to be a slab of meat from some mutant lizard thing?"
+ icon_state = "xenomeat"
+ filling_color = "#43DE18"
+
+ New()
+ ..()
+ reagents.add_reagent("protein", 3)
+ reagents.add_reagent("toxin", 3)
+ bitesize = 3
+
/obj/item/weapon/reagent_containers/food/snacks/spiderleg
name = "spider leg"
desc = "A still twitching leg of a giant spider... you don't really want to eat this, do you?"
@@ -1578,6 +1590,27 @@
reagents.add_reagent("tomatojuice", 2)
bitesize = 5
+/obj/item/weapon/reagent_containers/food/snacks/raw_bacon
+ name = "raw bacon"
+ desc = "It's fleshy and pink!"
+ icon_state = "raw_bacon"
+ bitesize = 2
+ New()
+ ..()
+ reagents.add_reagent("nutriment", 1)
+ reagents.add_reagent("porktonium", 10)
+
+/obj/item/weapon/reagent_containers/food/snacks/bacon
+ name = "bacon"
+ desc = "It looks juicy and tastes amazing!"
+ icon_state = "bacon2"
+ bitesize = 2
+ New()
+ ..()
+ reagents.add_reagent("nutriment", 4)
+ reagents.add_reagent("porktonium", 10)
+ reagents.add_reagent("msg", 4)
+
/obj/item/weapon/reagent_containers/food/snacks/telebacon
name = "Tele Bacon"
@@ -2687,6 +2720,23 @@
..()
reagents.add_reagent("nutriment", 1)
+/obj/item/weapon/reagent_containers/food/snacks/rawcutlet
+ name = "raw cutlet"
+ desc = "A thin piece of raw meat."
+ icon = 'icons/obj/food/food_ingredients.dmi'
+ icon_state = "rawcutlet"
+ bitesize = 1
+ New()
+ ..()
+ reagents.add_reagent("protein", 1)
+ attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W,/obj/item/weapon/kitchen/knife))
+ user.visible_message( \
+ "[user] cuts the raw cutlet with the knife!", \
+ "You cut the raw cutlet with your knife! " \
+ )
+ new /obj/item/weapon/reagent_containers/food/snacks/raw_bacon(src.loc)
+ qdel(src)
/////////////////////////////////////////////////PIZZA////////////////////////////////////////
@@ -3269,16 +3319,6 @@
..()
reagents.add_reagent("nutriment", 7)
-/obj/item/weapon/reagent_containers/food/snacks/rawcutlet
- name = "raw cutlet"
- desc = "A thin piece of raw meat."
- icon = 'icons/obj/food/food_ingredients.dmi'
- icon_state = "rawcutlet"
- bitesize = 1
- New()
- ..()
- reagents.add_reagent("protein", 1)
-
/obj/item/weapon/reagent_containers/food/snacks/cutlet
name = "cutlet"
desc = "A tasty meat slice."
@@ -3361,4 +3401,4 @@
New()
..()
reagents.add_reagent("nutriment", 6)
- bitesize = 2
\ No newline at end of file
+ bitesize = 2
diff --git a/code/modules/reagents/reagent_containers/food/snacks/candy.dm b/code/modules/reagents/reagent_containers/food/snacks/candy.dm
index 1370eff0093..d13eb7ec145 100644
--- a/code/modules/reagents/reagent_containers/food/snacks/candy.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks/candy.dm
@@ -139,13 +139,13 @@
reagents.add_reagent("sugar", 3)
bitesize = 5
-/obj/item/weapon/reagent_containers/food/snacks/candy_corn
+/obj/item/weapon/reagent_containers/food/snacks/candy/candy_corn
name = "candy corn"
desc = "It's a handful of candy corn. Cannot be stored in a detective's hat, alas."
- icon_state = "candy_corn"
+ icon_state = "candycorn"
filling_color = "#FFFCB0"
-/obj/item/weapon/reagent_containers/food/snacks/candy_corn/New()
+/obj/item/weapon/reagent_containers/food/snacks/candy/candy_corn/New()
..()
reagents.add_reagent("nutriment", 4)
reagents.add_reagent("sugar", 2)
diff --git a/code/modules/reagents/reagent_containers/food/snacks/meat.dm b/code/modules/reagents/reagent_containers/food/snacks/meat.dm
index dc9999a7f4c..2572c42c69d 100644
--- a/code/modules/reagents/reagent_containers/food/snacks/meat.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks/meat.dm
@@ -51,4 +51,4 @@
desc = "Taste like bacon."
New()
..()
- reagents.add_reagent("porktonium", 10)
\ No newline at end of file
+ reagents.add_reagent("porktonium", 10)
diff --git a/code/modules/reagents/reagent_containers/glass/bottle/robot.dm b/code/modules/reagents/reagent_containers/glass/bottle/robot.dm
deleted file mode 100644
index 6a8eb261bb4..00000000000
--- a/code/modules/reagents/reagent_containers/glass/bottle/robot.dm
+++ /dev/null
@@ -1,32 +0,0 @@
-
-/obj/item/weapon/reagent_containers/glass/bottle/robot
- amount_per_transfer_from_this = 10
- possible_transfer_amounts = list(5,10,15,25,30,50,100)
- flags = OPENCONTAINER
- volume = 60
- var/reagent = ""
-
-
-/obj/item/weapon/reagent_containers/glass/bottle/robot/epinephrine
- name = "internal epinephrine bottle"
- desc = "A small bottle. Contains epinephrine - used to stabilize patients."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle16"
- reagent = "epinephrine"
-
-/obj/item/weapon/reagent_containers/glass/bottle/robot/epinephrine/New()
- ..()
- reagents.add_reagent("epinephrine", 60)
- return
-
-/obj/item/weapon/reagent_containers/glass/bottle/robot/charcoal
- name = "internal charcoal bottle"
- desc = "A small bottle of charcoal. Counters poisons and repairs damage."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle17"
- reagent = "charcoal"
-
-/obj/item/weapon/reagent_containers/glass/bottle/robot/charcoal/New()
- ..()
- reagents.add_reagent("charcoal", 60)
- return
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm
index 457f473c8bb..2dbc77e0ba7 100644
--- a/code/modules/reagents/reagent_containers/glass_containers.dm
+++ b/code/modules/reagents/reagent_containers/glass_containers.dm
@@ -48,12 +48,12 @@
/obj/item/weapon/reagent_containers/glass/examine(mob/user)
if(!..(user, 2))
return
- if (!is_open_container())
+ if(!is_open_container())
to_chat(user, "Airtight lid seals it completely. ")
/obj/item/weapon/reagent_containers/glass/attack_self()
..()
- if (is_open_container())
+ if(is_open_container())
to_chat(usr, "You put the lid on \the [src]. ")
flags ^= OPENCONTAINER
else
@@ -63,7 +63,7 @@
/obj/item/weapon/reagent_containers/glass/afterattack(obj/target, mob/user, proximity)
if(!proximity) return
- if (!is_open_container())
+ if(!is_open_container())
return
for(var/type in can_be_placed_into)
@@ -114,17 +114,6 @@
to_chat(user, "[target] is full. ")
return
- // /vg/: Logging transfers of bad things
- if(target.reagents_to_log.len)
- var/list/badshit=list()
- for(var/bad_reagent in target.reagents_to_log)
- if(reagents.has_reagent(bad_reagent))
- badshit += reagents_to_log[bad_reagent]
- if(badshit.len)
- var/hl="\red ([english_list(badshit)]) \black"
- message_admins("[key_name_admin(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl]")
- log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].")
-
var/trans = reagents.trans_to(target, amount_per_transfer_from_this)
to_chat(user, "You transfer [trans] units of the solution to [target]. ")
@@ -132,12 +121,6 @@
to_chat(user, "You cannot fill [target] while it is sealed. ")
return
- /*else if(istype(target, /obj/machinery/bunsen_burner))
- return
-
- else if(istype(target, /obj/machinery/radiocarbon_spectrometer))
- return*/
-
else if(istype(target, /obj/effect/decal/cleanable)) //stops splashing while scooping up fluids
return
@@ -148,7 +131,7 @@
return
-/obj/item/weapon/reagent_containers/glass/attackby(var/obj/item/I, mob/user as mob, params)
+/obj/item/weapon/reagent_containers/glass/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird
return
if(is_hot(I))
@@ -181,22 +164,11 @@
item_state = "beaker"
materials = list(MAT_GLASS=500)
var/obj/item/device/assembly_holder/assembly = null
+ var/can_assembly = 1
/obj/item/weapon/reagent_containers/glass/beaker/on_reagent_change()
update_icon()
-/obj/item/weapon/reagent_containers/glass/beaker/pickup(mob/user)
- ..()
- update_icon()
-
-/obj/item/weapon/reagent_containers/glass/beaker/dropped(mob/user)
- ..()
- update_icon()
-
-/obj/item/weapon/reagent_containers/glass/beaker/attack_hand()
- ..()
- update_icon()
-
/obj/item/weapon/reagent_containers/glass/beaker/update_icon()
overlays.Cut()
@@ -205,18 +177,25 @@
var/percent = round((reagents.total_volume / volume) * 100)
switch(percent)
- if(0 to 9) filling.icon_state = "[icon_state]-10"
- if(10 to 24) filling.icon_state = "[icon_state]10"
- if(25 to 49) filling.icon_state = "[icon_state]25"
- if(50 to 74) filling.icon_state = "[icon_state]50"
- if(75 to 79) filling.icon_state = "[icon_state]75"
- if(80 to 90) filling.icon_state = "[icon_state]80"
- if(91 to INFINITY) filling.icon_state = "[icon_state]100"
+ if(0 to 9)
+ filling.icon_state = "[icon_state]-10"
+ if(10 to 24)
+ filling.icon_state = "[icon_state]10"
+ if(25 to 49)
+ filling.icon_state = "[icon_state]25"
+ if(50 to 74)
+ filling.icon_state = "[icon_state]50"
+ if(75 to 79)
+ filling.icon_state = "[icon_state]75"
+ if(80 to 90)
+ filling.icon_state = "[icon_state]80"
+ if(91 to INFINITY)
+ filling.icon_state = "[icon_state]100"
filling.icon += mix_color_from_reagents(reagents.reagent_list)
overlays += filling
- if (!is_open_container())
+ if(!is_open_container())
var/image/lid = image(icon, src, "lid_[initial(icon_state)]")
overlays += lid
if(assembly)
@@ -226,9 +205,9 @@
set name = "Remove Assembly"
set category = "Object"
set src in usr
- if(usr.stat || !usr.canmove || usr.restrained())
+ if(usr.incapacitated())
return
- if (assembly)
+ if(assembly)
to_chat(usr, "You detach [assembly] from \the [src] ")
usr.put_in_hands(assembly)
assembly = null
@@ -241,9 +220,9 @@
reagents.chem_temp += 30
reagents.handle_reactions()
-/obj/item/weapon/reagent_containers/glass/beaker/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W,/obj/item/device/assembly_holder))
- if (assembly)
+/obj/item/weapon/reagent_containers/glass/beaker/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W, /obj/item/device/assembly_holder) && can_assembly)
+ if(assembly)
to_chat(usr, "The [src] already has an assembly. ")
return ..()
assembly = W
@@ -261,7 +240,7 @@
if(assembly)
assembly.Crossed(AM)
-/obj/item/weapon/reagent_containers/glass/beaker/on_found(mob/finder as mob) //for mousetraps
+/obj/item/weapon/reagent_containers/glass/beaker/on_found(mob/finder) //for mousetraps
if(assembly)
assembly.on_found(finder)
@@ -292,6 +271,17 @@
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25)
flags = OPENCONTAINER
+ can_assembly = 0
+
+/obj/item/weapon/reagent_containers/glass/beaker/drugs
+ name = "baggie"
+ desc = "A baggie. Can hold up to 10 units."
+ icon_state = "baggie"
+ amount_per_transfer_from_this = 2
+ possible_transfer_amounts = 2
+ volume = 10
+ flags = OPENCONTAINER
+ can_assembly = 0
/obj/item/weapon/reagent_containers/glass/beaker/noreact
name = "cryostasis beaker"
@@ -312,20 +302,20 @@
possible_transfer_amounts = list(5,10,15,25,30,50,100,300)
flags = OPENCONTAINER
-/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone/New()
- ..()
- reagents.add_reagent("cryoxadone", 30)
- update_icon()
-/obj/item/weapon/reagent_containers/glass/beaker/sulphuric/New()
- ..()
- reagents.add_reagent("sacid", 50)
- update_icon()
+/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone
+ list_reagents = list("cryoxadone" = 30)
+
+/obj/item/weapon/reagent_containers/glass/beaker/sulphuric
+ list_reagents = list("sacid" = 50)
+
+
+/obj/item/weapon/reagent_containers/glass/beaker/slime
+ list_reagents = list("slimejelly" = 50)
+
+/obj/item/weapon/reagent_containers/glass/beaker/drugs/meth
+ list_reagents = list("methamphetamine" = 10)
-/obj/item/weapon/reagent_containers/glass/beaker/slime/New()
- ..()
- reagents.add_reagent("slimejelly", 50)
- update_icon()
/obj/item/weapon/reagent_containers/glass/bucket
desc = "It's a bucket."
@@ -334,13 +324,13 @@
icon_state = "bucket"
item_state = "bucket"
materials = list(MAT_METAL=200)
- w_class = 3.0
+ w_class = 3
amount_per_transfer_from_this = 20
possible_transfer_amounts = list(5,10,15,20,25,30,50,80,100,120)
volume = 120
flags = OPENCONTAINER
-/obj/item/weapon/reagent_containers/glass/bucket/attackby(var/obj/D, mob/user as mob, params)
+/obj/item/weapon/reagent_containers/glass/bucket/attackby(obj/D, mob/user, params)
if(isprox(D))
to_chat(user, "You add [D] to [src].")
qdel(D)
@@ -348,62 +338,4 @@
user.unEquip(src)
qdel(src)
else
- ..()
-
-/obj/item/weapon/reagent_containers/glass/beaker/vial
- name = "vial"
- desc = "Small glass vial. Looks fragile."
- icon_state = "vial"
- materials = list(MAT_GLASS=500)
- volume = 15
- amount_per_transfer_from_this = 5
- possible_transfer_amounts = list(1,5,15)
- flags = OPENCONTAINER
-
-/*
-/obj/item/weapon/reagent_containers/glass/blender_jug
- name = "Blender Jug"
- desc = "A blender jug, part of a blender."
- icon = 'icons/obj/kitchen.dmi'
- icon_state = "blender_jug_e"
- volume = 100
-
- on_reagent_change()
- switch(src.reagents.total_volume)
- if(0)
- icon_state = "blender_jug_e"
- if(1 to 75)
- icon_state = "blender_jug_h"
- if(76 to 100)
- icon_state = "blender_jug_f"
-
-/obj/item/weapon/reagent_containers/glass/canister //not used apparantly
- desc = "It's a canister. Mainly used for transporting fuel."
- name = "canister"
- icon = 'icons/obj/tank.dmi'
- icon_state = "canister"
- item_state = "canister"
- materials = list(MAT_METAL=300)
- w_class = 4.0
-
- amount_per_transfer_from_this = 20
- possible_transfer_amounts = list(10,20,30,60)
- volume = 120
-
-/obj/item/weapon/reagent_containers/glass/dispenser
- name = "reagent glass"
- desc = "A reagent glass."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "beaker0"
- amount_per_transfer_from_this = 10
- flags = OPENCONTAINER
-
-/obj/item/weapon/reagent_containers/glass/dispenser/surfactant
- name = "reagent glass (surfactant)"
- icon_state = "liquid"
-
- New()
- ..()
- reagents.add_reagent("fluorosurfactant", 20)
-
-*/
+ ..()
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index a9181138a85..dd69297780a 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -17,37 +17,30 @@
/obj/item/weapon/reagent_containers/hypospray/attack(mob/living/M, mob/user)
if(!reagents.total_volume)
- to_chat(user, "\red [src] is empty.")
+ to_chat(user, "[src] is empty! ")
return
- if(!istype(M))
+ if(!iscarbon(M))
return
- if(reagents.total_volume && (ignore_flags || M.can_inject(user, 1)))
- to_chat(user, "\blue You inject [M] with [src].")
- to_chat(M, "\red You feel a tiny prick!")
- src.reagents.add_reagent(M)
+ if(reagents.total_volume && (ignore_flags || M.can_inject(user, 1))) // Ignore flag should be checked first or there will be an error message.
+ to_chat(M, "You feel a tiny prick! ")
+ to_chat(user, "You inject [M] with [src]. ")
+
if(M.reagents)
var/list/injected = list()
- for(var/datum/reagent/R in src.reagents.reagent_list)
+ for(var/datum/reagent/R in reagents.reagent_list)
injected += R.name
- var/contained = english_list(injected)
- M.attack_log += text("\[[time_stamp()]\] Has been injected with [src.name] by [key_name(user)]. Reagents: [contained] ")
- user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to inject [key_name(M)]. Reagents: [contained] ")
- if(M.ckey)
- msg_admin_attack("[key_name_admin(user)] injected [key_name_admin(M)] with [src.name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)])")
- if(!iscarbon(user))
- M.LAssailant = null
- else
- M.LAssailant = user
var/trans = reagents.trans_to(M, amount_per_transfer_from_this)
- to_chat(user, "\blue [trans] units injected. [reagents.total_volume] units remaining in [src].")
- return
+ to_chat(user, "[trans] unit\s injected. [reagents.total_volume] unit\s remaining in [src]. ")
-/obj/item/weapon/reagent_containers/hypospray/CMO/New()
- ..()
- reagents.add_reagent("omnizine", 30)
+ var/contained = english_list(injected)
+
+ add_logs(M, user, "injected", src, "([contained])")
+
+/obj/item/weapon/reagent_containers/hypospray/CMO
+ list_reagents = list("omnizine" = 30)
/obj/item/weapon/reagent_containers/hypospray/combat
name = "combat stimulant injector"
@@ -55,21 +48,14 @@
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(10)
icon_state = "combat_hypo"
- volume = 60
+ volume = 75
ignore_flags = 1 // So they can heal their comrades.
-
-/obj/item/weapon/reagent_containers/hypospray/combat/New()
- ..()
- reagents.add_reagent("synaptizine", 30)
+ list_reagents = list("epinephrine" = 30, "omnizine" = 30, "teporone" = 15)
/obj/item/weapon/reagent_containers/hypospray/combat/nanites
- name = "combat stimulant injector"
- desc = "A modified air-needle autoinjector filled with expensive regeneration nanites."
+ desc = "A modified air-needle autoinjector for use in combat situations. Prefilled with expensive medical nanites for rapid healing."
volume = 100
-
-/obj/item/weapon/reagent_containers/hypospray/combat/nanites/New()
- ..()
- reagents.add_reagent("nanites", 70)
+ list_reagents = list("nanites" = 100)
/obj/item/weapon/reagent_containers/hypospray/autoinjector
name = "emergency autoinjector"
@@ -81,56 +67,41 @@
volume = 10
ignore_flags = 1 //so you can medipen through hardsuits
flags = null
+ list_reagents = list("epinephrine" = 10)
-/obj/item/weapon/reagent_containers/hypospray/autoinjector/New()
- ..()
- reagents.add_reagent("epinephrine", 10)
- update_icon()
- return
-
-/obj/item/weapon/reagent_containers/hypospray/autoinjector/attack(mob/M as mob, mob/user as mob)
+/obj/item/weapon/reagent_containers/hypospray/autoinjector/attack(mob/M, mob/user)
+ if(!reagents.total_volume)
+ to_chat(user, "[src] is empty! ")
+ return
..()
update_icon()
- return
/obj/item/weapon/reagent_containers/hypospray/autoinjector/update_icon()
if(reagents.total_volume > 0)
- icon_state = "[initial(icon_state)]1"
+ icon_state = initial(icon_state)
else
icon_state = "[initial(icon_state)]0"
-/obj/item/weapon/reagent_containers/hypospray/autoinjector/examine(mob/user)
- ..(user)
+/obj/item/weapon/reagent_containers/hypospray/autoinjector/examine()
+ ..()
if(reagents && reagents.reagent_list.len)
- to_chat(user, "\blue It is currently loaded.")
+ to_chat(usr, "It is currently loaded. ")
else
- to_chat(user, "\blue It is spent.")
+ to_chat(usr, "It is spent. ")
/obj/item/weapon/reagent_containers/hypospray/autoinjector/teporone //basilisks
name = "teporone autoinjector"
- desc = "A rapid way to regulate your body's temperature in the event of a hardsuit malfunction at the cost of some shortness of breath."
+ desc = "A rapid way to regulate your body's temperature in the event of a hardsuit malfunction."
icon_state = "lepopen"
-
-/obj/item/weapon/reagent_containers/hypospray/autoinjector/teporone/New()
- ..()
- reagents.remove_reagent("epinephrine", 10)
- reagents.add_reagent("teporone", 9)
- reagents.add_reagent("lexorin", 1)
- update_icon()
- return
+ list_reagents = list("teporone" = 10)
/obj/item/weapon/reagent_containers/hypospray/autoinjector/stimpack //goliath kiting
name = "stimpack autoinjector"
- desc = "A rapid way to stimulate your body's adrenaline, allowing for freer movement in restrictive armor at the cost of some shortness of breath."
+ desc = "A rapid way to stimulate your body's adrenaline, allowing for freer movement in restrictive armor."
icon_state = "stimpen"
-
-/obj/item/weapon/reagent_containers/hypospray/autoinjector/stimpack/New()
- ..()
- reagents.remove_reagent("epinephrine", 10)
- reagents.add_reagent("methamphetamine", 9)
- reagents.add_reagent("lexorin", 1)
- update_icon()
- return
+ volume = 20
+ amount_per_transfer_from_this = 20
+ list_reagents = list("methamphetamine" = 10, "coffee" = 10)
/obj/item/weapon/reagent_containers/hypospray/autoinjector/stimulants
name = "Stimulants autoinjector"
@@ -139,10 +110,4 @@
amount_per_transfer_from_this = 50
possible_transfer_amounts = list(50)
volume = 50
-
-/obj/item/weapon/reagent_containers/hypospray/autoinjector/stimulants/New()
- ..()
- reagents.remove_reagent("epinephrine", 10)
- reagents.add_reagent("stimulants", 50)
- update_icon()
- return
\ No newline at end of file
+ list_reagents = list("stimulants" = 50)
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index 4af5ab79bc7..1da5f07b2e5 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -11,14 +11,15 @@
volume = 50
consume_sound = null
- New()
- ..()
- if(!icon_state)
- icon_state = "pill[rand(1,20)]"
+/obj/item/weapon/reagent_containers/food/pill/New()
+ ..()
+ if(!icon_state)
+ icon_state = "pill[rand(1,20)]"
-/obj/item/weapon/reagent_containers/food/pill/attack_self(mob/user as mob)
- return
-/obj/item/weapon/reagent_containers/food/pill/attack(var/mob/living/carbon/M, mob/user as mob, def_zone)
+/obj/item/weapon/reagent_containers/food/pill/attack_self(mob/user)
+ return
+
+/obj/item/weapon/reagent_containers/food/pill/attack(mob/living/carbon/M, mob/user, def_zone)
if(!istype(M))
return 0
bitesize = reagents.total_volume
@@ -29,24 +30,14 @@
return 0
/obj/item/weapon/reagent_containers/food/pill/afterattack(obj/target, mob/user, proximity)
- if(!proximity) return
+ if(!proximity)
+ return
if(target.is_open_container() != 0 && target.reagents)
if(!target.reagents.total_volume)
to_chat(user, "[target] is empty. Cant dissolve [src]. ")
return
- // /vg/: Logging transfers of bad things
- if(target.reagents_to_log.len)
- var/list/badshit=list()
- for(var/bad_reagent in target.reagents_to_log)
- if(reagents.has_reagent(bad_reagent))
- badshit += reagents_to_log[bad_reagent]
- if(badshit.len)
- var/hl="\red ([english_list(badshit)]) \black"
- message_admins("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl] (JMP )")
- log_game("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].")
-
to_chat(user, "You dissolve [src] in [target]. ")
reagents.trans_to(target, reagents.total_volume)
for(var/mob/O in viewers(2, user))
@@ -54,8 +45,6 @@
spawn(5)
qdel(src)
- return
-
////////////////////////////////////////////////////////////////////////////////
/// Pills. END
////////////////////////////////////////////////////////////////////////////////
@@ -65,89 +54,64 @@
name = "Toxins pill"
desc = "Highly toxic."
icon_state = "pill5"
- New()
- ..()
- reagents.add_reagent("toxin", 50)
+ list_reagents = list("toxin" = 50)
/obj/item/weapon/reagent_containers/food/pill/initropidril
name = "initropidril pill"
desc = "Don't swallow this."
icon_state = "pill5"
- New()
- ..()
- reagents.add_reagent("initropidril", 50)
+ list_reagents = list("initropidril" = 50)
/obj/item/weapon/reagent_containers/food/pill/adminordrazine
name = "Adminordrazine pill"
desc = "It's magic. We don't have to explain it."
icon_state = "pill16"
- New()
- ..()
- reagents.add_reagent("adminordrazine", 50)
+ list_reagents = list("adminordrazine" = 50)
/obj/item/weapon/reagent_containers/food/pill/methamphetamine
name = "Methamphetamine pill"
desc = "Helps improve the ability to concentrate."
icon_state = "pill8"
- New()
- ..()
- reagents.add_reagent("methamphetamine", 5)
+ list_reagents = list("methamphetamine" = 5)
/obj/item/weapon/reagent_containers/food/pill/haloperidol
name = "Haloperidol pill"
desc = "Haloperidol is an anti-psychotic use to treat psychiatric problems."
icon_state = "pill8"
- New()
- ..()
- reagents.add_reagent("haloperidol", 15)
+ list_reagents = list("haloperidol" = 15)
/obj/item/weapon/reagent_containers/food/pill/paroxetine
name = "Paroxetine pill"
desc = "Heavy anti-depressant."
icon_state = "pill8"
- New()
- ..()
- reagents.add_reagent("paroxetine", 15)
-
+ list_reagents = list("paroxetine" = 15)
/obj/item/weapon/reagent_containers/food/pill/happy
name = "Happy pill"
desc = "Happy happy joy joy!"
icon_state = "pill18"
- New()
- ..()
- reagents.add_reagent("space_drugs", 15)
- reagents.add_reagent("sugar", 15)
+ list_reagents = list("space_drugs" = 15, "sugar" = 15)
/obj/item/weapon/reagent_containers/food/pill/zoom
name = "Zoom pill"
desc = "Zoooom!"
icon_state = "pill18"
- New()
- ..()
- reagents.add_reagent("synaptizine", 5)
- reagents.add_reagent("methamphetamine", 5)
+ list_reagents = list("synaptizine" = 5, "methamphetamine" = 5)
/obj/item/weapon/reagent_containers/food/pill/charcoal
name = "Charcoal pill"
desc = "Neutralizes many common toxins."
icon_state = "pill17"
- New()
- ..()
- reagents.add_reagent("charcoal", 25)
+ list_reagents = list("charcoal" = 25)
/obj/item/weapon/reagent_containers/food/pill/salicylic
name = "Salicylic Acid pill"
desc = "Commonly used to treat moderate pain and fevers."
icon_state = "pill4"
- New()
- ..()
- reagents.add_reagent("sal_acid", 20)
+ list_reagents = list("sal_acid" = 20)
/obj/item/weapon/reagent_containers/food/pill/salbutamol
name = "Salbutamol pill"
desc = "Used to treat respiratory distress."
icon_state = "pill8"
- New()
- ..()
- reagents.add_reagent("salbutamol", 20)
\ No newline at end of file
+ list_reagents = list("salbutamol" = 20)
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index efc6a48b1f9..205d025383f 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -7,7 +7,7 @@
flags = OPENCONTAINER | NOBLUDGEON
slot_flags = SLOT_BELT
throwforce = 0
- w_class = 2.0
+ w_class = 2
throw_speed = 3
throw_range = 7
var/spray_maxrange = 3 //what the sprayer will set spray_currentrange to in the attack_self.
@@ -17,7 +17,7 @@
possible_transfer_amounts = null
-/obj/item/weapon/reagent_containers/spray/afterattack(atom/A as mob|obj, mob/user as mob)
+/obj/item/weapon/reagent_containers/spray/afterattack(atom/A, mob/user)
if(istype(A, /obj/item/weapon/storage) || istype(A, /obj/structure/table) || istype(A, /obj/structure/rack) || istype(A, /obj/structure/closet) \
|| istype(A, /obj/item/weapon/reagent_containers) || istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/portable_atmospherics/hydroponics))
return
@@ -92,7 +92,7 @@
set src in usr
if(usr.stat || !usr.canmove || usr.restrained())
return
- if (alert(usr, "Are you sure you want to empty that?", "Empty Bottle:", "Yes", "No") != "Yes")
+ if(alert(usr, "Are you sure you want to empty that?", "Empty Bottle:", "Yes", "No") != "Yes")
return
if(isturf(usr.loc) && src.loc == usr)
to_chat(usr, "You empty \the [src] onto the floor. ")
@@ -103,20 +103,13 @@
/obj/item/weapon/reagent_containers/spray/cleaner
name = "space cleaner"
desc = "BLAM!-brand non-foaming space cleaner!"
-
-
-/obj/item/weapon/reagent_containers/spray/cleaner/New()
- ..()
- reagents.add_reagent("cleaner", 250)
+ list_reagents = list("cleaner" = 250)
/obj/item/weapon/reagent_containers/spray/cleaner/drone
name = "space cleaner"
desc = "BLAM!-brand non-foaming space cleaner!"
volume = 50
-
-/obj/item/weapon/reagent_containers/spray/cleaner/New()
- ..()
- reagents.add_reagent("cleaner", src.volume)
+ list_reagents = list("cleaner" = 50)
//pepperspray
/obj/item/weapon/reagent_containers/spray/pepper
@@ -128,11 +121,7 @@
volume = 40
spray_maxrange = 4
amount_per_transfer_from_this = 5
-
-
-/obj/item/weapon/reagent_containers/spray/pepper/New()
- ..()
- reagents.add_reagent("condensedcapsaicin", 40)
+ list_reagents = list("condensedcapsaicin" = 40)
//water flower
/obj/item/weapon/reagent_containers/spray/waterflower
@@ -143,12 +132,9 @@
item_state = "sunflower"
amount_per_transfer_from_this = 1
volume = 10
+ list_reagents = list("water" = 10)
-/obj/item/weapon/reagent_containers/spray/waterflower/New()
- ..()
- reagents.add_reagent("water", 10)
-
-/obj/item/weapon/reagent_containers/spray/waterflower/attack_self(var/mob/user) //Don't allow changing how much the flower sprays
+/obj/item/weapon/reagent_containers/spray/waterflower/attack_self(mob/user) //Don't allow changing how much the flower sprays
return
//chemsprayer
@@ -159,7 +145,7 @@
icon_state = "chemsprayer"
item_state = "chemsprayer"
throwforce = 0
- w_class = 3.0
+ w_class = 3
spray_maxrange = 7
spray_currentrange = 7
amount_per_transfer_from_this = 10
@@ -218,20 +204,16 @@
icon_state = "plantbgone"
item_state = "plantbgone"
volume = 100
+ list_reagents = list("atrazine" = 100)
-/obj/item/weapon/reagent_containers/spray/plantbgone/New()
- ..()
- reagents.add_reagent("atrazine", 100)
-
-
-/obj/item/weapon/reagent_containers/spray/plantbgone/afterattack(atom/A as mob|obj, mob/user as mob, proximity)
+/obj/item/weapon/reagent_containers/spray/plantbgone/afterattack(atom/A, mob/user, proximity)
if(!proximity) return
- if (istype(A, /obj/machinery/portable_atmospherics/hydroponics)) // We are targeting hydrotray
+ if(istype(A, /obj/machinery/portable_atmospherics/hydroponics)) // We are targeting hydrotray
return
- if (istype(A, /obj/effect/blob)) // blob damage in blob code
+ if(istype(A, /obj/effect/blob)) // blob damage in blob code
return
..()
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 610abd27950..71232fa1dad 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -19,6 +19,12 @@
var/mode = SYRINGE_DRAW
var/projectile_type = /obj/item/projectile/bullet/dart/syringe
+/obj/item/weapon/reagent_containers/syringe/New()
+ ..()
+ if(list_reagents) //syringe starts in inject mode if its already got something inside
+ mode = SYRINGE_INJECT
+ update_icon()
+
/obj/item/weapon/reagent_containers/syringe/on_reagent_change()
update_icon()
@@ -30,8 +36,7 @@
..()
update_icon()
-/obj/item/weapon/reagent_containers/syringe/attack_self(mob/user as mob)
-
+/obj/item/weapon/reagent_containers/syringe/attack_self(mob/user)
switch(mode)
if(SYRINGE_DRAW)
mode = SYRINGE_INJECT
@@ -45,10 +50,10 @@
..()
update_icon()
-/obj/item/weapon/reagent_containers/syringe/attack(mob/living/M as mob, mob/living/user as mob, def_zone)
+/obj/item/weapon/reagent_containers/syringe/attack(mob/living/M, mob/living/user, def_zone)
return
-/obj/item/weapon/reagent_containers/syringe/attackby(obj/item/I as obj, mob/user as mob, params)
+/obj/item/weapon/reagent_containers/syringe/attackby(obj/item/I, mob/user, params)
if(istype(I,/obj/item/weapon/storage/bag))
..()
return
@@ -66,13 +71,6 @@
to_chat(user, "\red This syringe is broken!")
return
-/* if (user.a_intent == I_HARM && ismob(target))
- if((CLUMSY in user.mutations) && prob(50))
- target = user
- syringestab(target, user)
- return */
-
-
switch(mode)
if(SYRINGE_DRAW)
@@ -126,7 +124,7 @@
else
B = T.take_blood(src,amount)
- if (B)
+ if(B)
src.reagents.reagent_list |= B
src.reagents.update_total()
src.on_reagent_change()
@@ -150,7 +148,7 @@
var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares?
to_chat(user, "\blue You fill the syringe with [trans] units of the solution.")
- if (reagents.total_volume >= reagents.maximum_volume)
+ if(reagents.total_volume >= reagents.maximum_volume)
mode=!mode
update_icon()
@@ -211,40 +209,15 @@
if(ismob(target) && target == user)
src.reagents.reaction(target, INGEST)
- if(isobj(target))
- // /vg/: Logging transfers of bad things
- if(target.reagents_to_log.len)
- var/list/badshit=list()
- for(var/bad_reagent in target.reagents_to_log)
- if(reagents.has_reagent(bad_reagent))
- badshit += reagents_to_log[bad_reagent]
- if(badshit.len)
- var/hl="\red ([english_list(badshit)]) \black"
- message_admins("[key_name_admin(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl] ")
- log_game("[key_name(user)] added [reagents.get_reagent_ids(1)] to \a [target] with [src].")
-
spawn(5)
var/datum/reagent/blood/B
for(var/datum/reagent/blood/d in src.reagents.reagent_list)
B = d
break
- var/datum/reagent/water/W
- for(var/datum/reagent/water/r in src.reagents.reagent_list)
- W = r
- break
var/trans
- if(W && istype(target,/mob/living/carbon/human/slime))
- var/mob/living/carbon/human/slime/S = target
- S.vessel.add_reagent("water", 5)
- S.vessel.update_total()
if(B && istype(target,/mob/living/carbon))
- if(istype(target,/mob/living/carbon/human/slime))
- var/mob/living/carbon/human/slime/S = target
- S.reagents.add_reagent("blood", 5)
- S.reagents.update_total()
- else
- var/mob/living/carbon/C = target
- C.inject_blood(src,5)
+ var/mob/living/carbon/C = target
+ C.inject_blood(src, 5)
else
trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
to_chat(user, "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.")
@@ -254,7 +227,7 @@
to_chat(user, "You break the medical seal on the [P]! ")
P.instant_application = 0
- if (reagents.total_volume <= 0 && mode==SYRINGE_INJECT)
+ if(reagents.total_volume <= 0 && mode==SYRINGE_INJECT)
mode = SYRINGE_DRAW
update_icon()
@@ -270,9 +243,9 @@
if(ismob(loc))
var/injoverlay
switch(mode)
- if (SYRINGE_DRAW)
+ if(SYRINGE_DRAW)
injoverlay = "draw"
- if (SYRINGE_INJECT)
+ if(SYRINGE_INJECT)
injoverlay = "inject"
overlays += injoverlay
icon_state = "[rounded_vol]"
@@ -286,60 +259,6 @@
filling.icon += mix_color_from_reagents(reagents.reagent_list)
overlays += filling
-
-/obj/item/weapon/reagent_containers/syringe/proc/syringestab(mob/living/carbon/target as mob, mob/living/carbon/user as mob)
-
- user.attack_log += "\[[time_stamp()]\] Attacked [target.name] ([target.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) "
- target.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) "
- if(target.ckey)
- msg_admin_attack("[key_name_admin(user)] attacked [key_name_admin(target)] with [src.name] (INTENT: [uppertext(user.a_intent)])")
- if(!iscarbon(user))
- target.LAssailant = null
- else
- target.LAssailant = user
-
- if(istype(target, /mob/living/carbon/human))
-
- var/target_zone = ran_zone(check_zone(user.zone_sel.selecting, target))
- var/obj/item/organ/external/affecting = target:get_organ(target_zone)
-
- if (!affecting || (affecting.status & ORGAN_DESTROYED) || affecting.is_stump())
- to_chat(user, "They are missing that limb! ")
- return
- var/hit_area = affecting.name
-
- var/mob/living/carbon/human/H = target
- if((user != target) && H.check_shields(7, "the [src.name]"))
- return
-
- if (target != user && target.getarmor(target_zone, "melee") > 5 && prob(50))
- for(var/mob/O in viewers(world.view, user))
- O.show_message(text("\red [user] tries to stab [target] in \the [hit_area] with [src.name], but the attack is deflected by armor! "), 1)
- user.unEquip(src)
- qdel(src)
- return
-
- for(var/mob/O in viewers(world.view, user))
- O.show_message(text("\red [user] stabs [target] in \the [hit_area] with [src.name]! "), 1)
-
- if(affecting.take_damage(3))
- target:UpdateDamageIcon()
-
- else
- for(var/mob/O in viewers(world.view, user))
- O.show_message(text("\red [user] stabs [target] with [src.name]! "), 1)
- target.take_organ_damage(3)// 7 is the same as crowbar punch
-
- src.reagents.reaction(target, INGEST)
- var/syringestab_amount_transferred = rand(0, (reagents.total_volume - 5)) //nerfed by popular demand
- src.reagents.trans_to(target, syringestab_amount_transferred)
- src.desc += " It is broken."
- src.mode = SYRINGE_BROKEN
- src.add_blood(target)
- src.add_fingerprint(usr)
- src.update_icon()
-
-
/obj/item/weapon/reagent_containers/ld50_syringe
name = "Lethal Injection Syringe"
desc = "A syringe used for lethal injections."
@@ -351,104 +270,101 @@
volume = 50
var/mode = SYRINGE_DRAW
- on_reagent_change()
- update_icon()
+/obj/item/weapon/reagent_containers/ld50_syringe/on_reagent_change()
+ update_icon()
- pickup(mob/user)
- ..()
- update_icon()
+/obj/item/weapon/reagent_containers/ld50_syringe/pickup(mob/user)
+ ..()
+ update_icon()
- dropped(mob/user)
- ..()
- update_icon()
+/obj/item/weapon/reagent_containers/ld50_syringe/dropped(mob/user)
+ ..()
+ update_icon()
- attack_self(mob/user as mob)
- mode = !mode
- update_icon()
+/obj/item/weapon/reagent_containers/ld50_syringe/attack_self(mob/user)
+ mode = !mode
+ update_icon()
- attack_hand()
- ..()
- update_icon()
+/obj/item/weapon/reagent_containers/ld50_syringe/attack_hand()
+ ..()
+ update_icon()
+/obj/item/weapon/reagent_containers/ld50_syringe/attackby(obj/item/I, mob/user)
+ return
- attackby(obj/item/I as obj, mob/user as mob)
-
+/obj/item/weapon/reagent_containers/ld50_syringe/afterattack(obj/target, mob/user , flag)
+ if(!target.reagents)
return
- afterattack(obj/target, mob/user , flag)
- if(!target.reagents) return
+ switch(mode)
+ if(SYRINGE_DRAW)
- switch(mode)
- if(SYRINGE_DRAW)
+ if(reagents.total_volume >= reagents.maximum_volume)
+ to_chat(user, "\red The syringe is full.")
+ return
- if(reagents.total_volume >= reagents.maximum_volume)
- to_chat(user, "\red The syringe is full.")
+ if(ismob(target))
+ if(istype(target, /mob/living/carbon))//I Do not want it to suck 50 units out of people
+ to_chat(usr, "This needle isn't designed for drawing blood.")
+ return
+ else //if not mob
+ if(!target.reagents.total_volume)
+ to_chat(user, "\red [target] is empty.")
return
- if(ismob(target))
- if(istype(target, /mob/living/carbon))//I Do not want it to suck 50 units out of people
- to_chat(usr, "This needle isn't designed for drawing blood.")
- return
- else //if not mob
- if(!target.reagents.total_volume)
- to_chat(user, "\red [target] is empty.")
- return
+ if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers))
+ to_chat(user, "\red You cannot directly remove reagents from this object.")
+ return
- if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers))
- to_chat(user, "\red You cannot directly remove reagents from this object.")
- return
+ var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares?
- var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares?
+ to_chat(user, "\blue You fill the syringe with [trans] units of the solution.")
+ if(reagents.total_volume >= reagents.maximum_volume)
+ mode=!mode
+ update_icon()
- to_chat(user, "\blue You fill the syringe with [trans] units of the solution.")
- if (reagents.total_volume >= reagents.maximum_volume)
- mode=!mode
+ if(SYRINGE_INJECT)
+ if(!reagents.total_volume)
+ to_chat(user, "\red The Syringe is empty.")
+ return
+ if(istype(target, /obj/item/weapon/implantcase/chem))
+ return
+ if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food))
+ to_chat(user, "\red You cannot directly fill this object.")
+ return
+ if(target.reagents.total_volume >= target.reagents.maximum_volume)
+ to_chat(user, "\red [target] is full.")
+ return
+
+ if(ismob(target) && target != user)
+ for(var/mob/O in viewers(world.view, user))
+ O.show_message(text("\red [] is trying to inject [] with a giant syringe! ", user, target), 1)
+ if(!do_mob(user, target, 300)) return
+ for(var/mob/O in viewers(world.view, user))
+ O.show_message(text("\red [] injects [] with a giant syringe!", user, target), 1)
+ src.reagents.reaction(target, INGEST)
+ if(ismob(target) && target == user)
+ src.reagents.reaction(target, INGEST)
+ spawn(5)
+ var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
+ to_chat(user, "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.")
+ if(reagents.total_volume >= reagents.maximum_volume && mode==SYRINGE_INJECT)
+ mode = SYRINGE_DRAW
update_icon()
+/obj/item/weapon/reagent_containers/ld50_syringe/update_icon()
+ var/rounded_vol = round(reagents.total_volume,50)
+ if(ismob(loc))
+ var/mode_t
+ switch(mode)
+ if(SYRINGE_DRAW)
+ mode_t = "d"
if(SYRINGE_INJECT)
- if(!reagents.total_volume)
- to_chat(user, "\red The Syringe is empty.")
- return
- if(istype(target, /obj/item/weapon/implantcase/chem))
- return
- if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food))
- to_chat(user, "\red You cannot directly fill this object.")
- return
- if(target.reagents.total_volume >= target.reagents.maximum_volume)
- to_chat(user, "\red [target] is full.")
- return
-
- if(ismob(target) && target != user)
- for(var/mob/O in viewers(world.view, user))
- O.show_message(text("\red [] is trying to inject [] with a giant syringe! ", user, target), 1)
- if(!do_mob(user, target, 300)) return
- for(var/mob/O in viewers(world.view, user))
- O.show_message(text("\red [] injects [] with a giant syringe!", user, target), 1)
- src.reagents.reaction(target, INGEST)
- if(ismob(target) && target == user)
- src.reagents.reaction(target, INGEST)
- spawn(5)
- var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this)
- to_chat(user, "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.")
- if (reagents.total_volume >= reagents.maximum_volume && mode==SYRINGE_INJECT)
- mode = SYRINGE_DRAW
- update_icon()
- return
-
-
- update_icon()
- var/rounded_vol = round(reagents.total_volume,50)
- if(ismob(loc))
- var/mode_t
- switch(mode)
- if (SYRINGE_DRAW)
- mode_t = "d"
- if (SYRINGE_INJECT)
- mode_t = "i"
- icon_state = "[mode_t][rounded_vol]"
- else
- icon_state = "[rounded_vol]"
- item_state = "syringe_[rounded_vol]"
+ mode_t = "i"
+ icon_state = "[mode_t][rounded_vol]"
+ else
+ icon_state = "[rounded_vol]"
+ item_state = "syringe_[rounded_vol]"
////////////////////////////////////////////////////////////////////////////////
@@ -459,85 +375,27 @@
/obj/item/weapon/reagent_containers/syringe/antiviral
name = "Syringe (spaceacillin)"
desc = "Contains antiviral agents."
- New()
- ..()
- reagents.add_reagent("spaceacillin", 15)
- mode = SYRINGE_INJECT
- update_icon()
+ list_reagents = list("spaceacillin" = 15)
/obj/item/weapon/reagent_containers/ld50_syringe/lethal
- New()
- ..()
- reagents.add_reagent("cyanide", 10)
- reagents.add_reagent("neurotoxin2", 40)
- mode = SYRINGE_INJECT
- update_icon()
-
-
-//Robot syringes
-//Not special in any way, code wise. They don't have added variables or procs.
-/obj/item/weapon/reagent_containers/syringe/robot/charcoal
- name = "Syringe (charcoal)"
- desc = "Contains charcoal."
- New()
- ..()
- reagents.add_reagent("charcoal", 15)
- mode = SYRINGE_INJECT
- update_icon()
-
-/obj/item/weapon/reagent_containers/syringe/robot/epinephrine
- name = "Syringe (Epinephrine)"
- desc = "Contains epinephrine - used to stabilize patients."
- New()
- ..()
- reagents.add_reagent("epinephrine", 15)
- mode = SYRINGE_INJECT
- update_icon()
-
-/obj/item/weapon/reagent_containers/syringe/robot/mixed
- name = "Syringe (mixed)"
- desc = "Contains epinephrine & charcoal."
- New()
- ..()
- reagents.add_reagent("epinephrine", 7)
- reagents.add_reagent("charcoal", 8)
- mode = SYRINGE_INJECT
- update_icon()
+ list_reagents = list("cyanide" = 10, "neurotoxin2" = 40)
/obj/item/weapon/reagent_containers/syringe/charcoal
name = "Syringe (charcoal)"
desc = "Contains charcoal - used to treat toxins and damage from toxins."
- New()
- ..()
- reagents.add_reagent("charcoal", 15)
- mode = SYRINGE_INJECT
- update_icon()
+ list_reagents = list("charcoal" = 15)
/obj/item/weapon/reagent_containers/syringe/epinephrine
name = "Syringe (Epinephrine)"
desc = "Contains epinephrine - used to stabilize patients."
- New()
- ..()
- reagents.add_reagent("epinephrine", 15)
- mode = SYRINGE_INJECT
- update_icon()
+ list_reagents = list("epinephrine" = 15)
/obj/item/weapon/reagent_containers/syringe/insulin
name = "Syringe (insulin)"
desc = "Contains insulin - used to treat diabetes."
- New()
- ..()
- reagents.add_reagent("insulin", 15)
- mode = SYRINGE_INJECT
- update_icon()
+ list_reagents = list("insulin" = 15)
/obj/item/weapon/reagent_containers/syringe/bioterror
name = "bioterror syringe"
desc = "Contains several paralyzing reagents."
- New()
- ..()
- reagents.add_reagent("neurotoxin", 5)
- reagents.add_reagent("capulettium_plus", 5)
- reagents.add_reagent("sodium_thiopental", 5)
- mode = SYRINGE_INJECT
- update_icon()
+ list_reagents = list("neurotoxin" = 5, "capulettium_plus" = 5, "sodium_thiopental" = 5)
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 70f8060a670..5d2323b9b6e 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -12,14 +12,14 @@
var/amount_per_transfer_from_this = 10
var/possible_transfer_amounts = list(10,25,50,100)
-/obj/structure/reagent_dispensers/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+/obj/structure/reagent_dispensers/attackby(obj/item/weapon/W, mob/user, params)
return
/obj/structure/reagent_dispensers/New()
var/datum/reagents/R = new/datum/reagents(1000)
reagents = R
R.my_atom = src
- if (!possible_transfer_amounts)
+ if(!possible_transfer_amounts)
src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT
..()
@@ -40,7 +40,7 @@
if(usr.stat || !usr.canmove || usr.restrained())
return
var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts
- if (N)
+ if(N)
amount_per_transfer_from_this = N
/obj/structure/reagent_dispensers/ex_act(severity)
@@ -49,12 +49,12 @@
qdel(src)
return
if(2.0)
- if (prob(50))
+ if(prob(50))
new /obj/effect/effect/water(src.loc)
qdel(src)
return
if(3.0)
- if (prob(5))
+ if(prob(5))
new /obj/effect/effect/water(src.loc)
qdel(src)
return
@@ -131,7 +131,7 @@
to_chat(usr, "There is some kind of device rigged to the tank.")
/obj/structure/reagent_dispensers/fueltank/attack_hand()
- if (rig)
+ if(rig)
usr.visible_message("[usr] begins to detach [rig] from \the [src].", "You begin to detach [rig] from \the [src]")
if(do_after(usr, 20, target = src))
usr.visible_message("\blue [usr] detaches [rig] from \the [src].", "\blue You detach [rig] from \the [src]")
@@ -139,9 +139,9 @@
rig = null
overlays = new/list()
-/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W,/obj/item/device/assembly_holder) && accepts_rig)
- if (rig)
+/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W,/obj/item/device/assembly_holder) && accepts_rig)
+ if(rig)
to_chat(user, "\red There is another device in the way.")
return ..()
user.visible_message("[user] begins rigging [W] to \the [src].", "You begin rigging [W] to \the [src]")
@@ -149,7 +149,7 @@
user.visible_message("\blue [user] rigs [W] to \the [src].", "\blue You rig [W] to \the [src]")
var/obj/item/device/assembly_holder/H = W
- if (istype(H.a_left,/obj/item/device/assembly/igniter) || istype(H.a_right,/obj/item/device/assembly/igniter))
+ if(istype(H.a_left,/obj/item/device/assembly/igniter) || istype(H.a_right,/obj/item/device/assembly/igniter))
msg_admin_attack("[key_name_admin(user)] rigged a fueltank for explosion (JMP )")
log_game("[key_name(user)] rigged fueltank a fueltank for explosion at [loc.x], [loc.y], [loc.z]")
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index cb3737824e0..9024904f7e3 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -54,6 +54,7 @@
/obj/machinery/disposal/initialize()
// this will get a copy of the air turf and take a SEND PRESSURE amount of air from it
+ ..()
var/atom/L = loc
var/datum/gas_mixture/env = new
env.copy_from(L.return_air())
@@ -125,14 +126,14 @@
if(istype(G)) // handle grabbed mob
if(ismob(G.affecting))
var/mob/GM = G.affecting
- for (var/mob/V in viewers(usr))
+ for(var/mob/V in viewers(usr))
V.show_message("[usr] starts putting [GM.name] into the disposal.", 3)
if(do_after(usr, 20, target = GM))
- if (GM.client)
+ if(GM.client)
GM.client.perspective = EYE_PERSPECTIVE
GM.client.eye = src
GM.loc = src
- for (var/mob/C in viewers(src))
+ for(var/mob/C in viewers(src))
C.show_message("\red [GM.name] has been placed in the [src] by [user].", 3)
qdel(G)
usr.attack_log += text("\[[time_stamp()]\] Has placed [key_name(GM)] in disposals. ")
@@ -158,13 +159,13 @@
// mouse drop another mob or self
//
/obj/machinery/disposal/MouseDrop_T(mob/target, mob/user)
- if (!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai))
+ if(!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai))
return
if(isanimal(user) && target != user) return //animals cannot put mobs other than themselves into disposal
src.add_fingerprint(user)
var/target_loc = target.loc
var/msg
- for (var/mob/V in viewers(usr))
+ for(var/mob/V in viewers(usr))
if(target == user && !user.stat && !user.weakened && !user.stunned && !user.paralysis)
V.show_message("[usr] starts climbing into the disposal.", 3)
if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis)
@@ -188,12 +189,12 @@
msg_admin_attack("[key_name_admin(user)] placed [key_name_admin(target)] in a disposals unit")
else
return
- if (target.client)
+ if(target.client)
target.client.perspective = EYE_PERSPECTIVE
target.client.eye = src
target.loc = src
- for (var/mob/C in viewers(src))
+ for(var/mob/C in viewers(src))
if(C == user)
continue
C.show_message(msg, 3)
@@ -215,7 +216,7 @@
// leave the disposal
/obj/machinery/disposal/proc/go_out(mob/user)
- if (user.client)
+ if(user.client)
user.client.eye = user.client.mob
user.client.perspective = MOB_PERSPECTIVE
user.loc = src.loc
@@ -272,7 +273,7 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "disposal_bin.tmpl", "Waste Disposal Unit", 395, 250)
ui.set_initial_data(data)
ui.open()
@@ -298,7 +299,7 @@
if(usr.stat || usr.restrained() || src.flushing)
return
- if (istype(src.loc, /turf))
+ if(istype(src.loc, /turf))
if(href_list["pump"])
if(text2num(href_list["pump"]))
mode = 1
@@ -467,7 +468,7 @@
qdel(H)
/obj/machinery/disposal/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if (istype(mover,/obj/item) && mover.throwing)
+ if(istype(mover,/obj/item) && mover.throwing)
var/obj/item/I = mover
if(istype(I, /obj/item/projectile))
return
@@ -630,13 +631,13 @@
var/mob/living/U = user
- if (U.stat || U.last_special <= world.time)
+ if(U.stat || U.last_special <= world.time)
return
U.last_special = world.time+100
- if (src.loc)
- for (var/mob/M in hearers(src.loc.loc))
+ if(src.loc)
+ for(var/mob/M in hearers(src.loc.loc))
to_chat(M, "CLONG, clong! ")
playsound(src.loc, 'sound/effects/clang.ogg', 50, 0, 0)
@@ -1159,7 +1160,7 @@
var/obj/machinery/disposal/D = locate() in src.loc
if(D)
linked = D
- if (!D.trunk)
+ if(!D.trunk)
D.trunk = src
var/obj/structure/disposaloutlet/O = locate() in src.loc
@@ -1354,7 +1355,7 @@
// check if mob has client, if so restore client view on eject
/mob/pipe_eject(var/direction)
- if (src.client)
+ if(src.client)
src.client.perspective = MOB_PERSPECTIVE
src.client.eye = src
@@ -1376,4 +1377,4 @@
else
dirs = alldirs.Copy()
- src.streak(dirs)
\ No newline at end of file
+ src.streak(dirs)
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index f10a50be115..02b13b903f2 100755
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -204,10 +204,10 @@
var/dat = "TagMaster 2.2 "
dat += ""
- for (var/i = 1, i <= TAGGERLOCATIONS.len, i++)
+ for(var/i = 1, i <= TAGGERLOCATIONS.len, i++)
dat += "[TAGGERLOCATIONS[i]] "
- if (i%4==0)
+ if(i%4==0)
dat += " "
dat += "
Current Selection: [currTag ? TAGGERLOCATIONS[currTag] : "None"] "
@@ -279,7 +279,7 @@
O.sortTag = 1
for(var/obj/item/smallDelivery/O in src)
deliveryCheck = 1
- if (O.sortTag == 0)
+ if(O.sortTag == 0)
O.sortTag = 1
if(deliveryCheck == 0)
H.destinationTag = 1
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index 146f803edfb..82bf6b43989 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -66,7 +66,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
efficiency_coeff = 2 ** (T - 1) //Only 1 manipulator here, you're making runtimes Razharas
/obj/machinery/r_n_d/circuit_imprinter/blob_act()
- if (prob(50))
+ if(prob(50))
qdel(src)
@@ -86,9 +86,9 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
return g_amount + gold_amount + diamond_amount
/obj/machinery/r_n_d/circuit_imprinter/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
- if (shocked)
+ if(shocked)
shock(user,50)
- if (default_deconstruction_screwdriver(user, "circuit_imprinter_t", "circuit_imprinter", O))
+ if(default_deconstruction_screwdriver(user, "circuit_imprinter_t", "circuit_imprinter", O))
if(linked_console)
linked_console.linked_imprinter = null
linked_console = null
@@ -97,7 +97,7 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
if(exchange_parts(user, O))
return
- if (panel_open)
+ if(panel_open)
if(istype(O, /obj/item/weapon/crowbar))
for(var/obj/I in component_parts)
if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker))
@@ -121,23 +121,23 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
else
to_chat(user, "You can't load the [src.name] while it's opened. ")
return
- if (disabled)
+ if(disabled)
return
- if (!linked_console)
+ if(!linked_console)
to_chat(user, "The [name] must be linked to an R&D console first! ")
return 1
- if (O.is_open_container())
+ if(O.is_open_container())
return
- if (!istype(O, /obj/item/stack/sheet/glass) && !istype(O, /obj/item/stack/sheet/mineral/gold) && !istype(O, /obj/item/stack/sheet/mineral/diamond))
+ if(!istype(O, /obj/item/stack/sheet/glass) && !istype(O, /obj/item/stack/sheet/mineral/gold) && !istype(O, /obj/item/stack/sheet/mineral/diamond))
to_chat(user, "You cannot insert this item into the [name]! ")
return
- if (stat)
+ if(stat)
return
- if (busy)
+ if(busy)
to_chat(user, "The [name] is busy. Please wait for completion of previous operation. ")
return
var/obj/item/stack/sheet/stack = O
- if ((TotalMaterials() + stack.perunit) > max_material_amount)
+ if((TotalMaterials() + stack.perunit) > max_material_amount)
to_chat(user, "The [name] is full. Please remove glass from the protolathe in order to insert more. ")
return
diff --git a/code/modules/research/designs/equipment_designs.dm b/code/modules/research/designs/equipment_designs.dm
index 8a056d3e67d..0f23b2a6532 100644
--- a/code/modules/research/designs/equipment_designs.dm
+++ b/code/modules/research/designs/equipment_designs.dm
@@ -21,6 +21,16 @@
build_path = /obj/item/clothing/glasses/hud/health
category = list("Equipment")
+/datum/design/health_hud_night
+ name = "Night Vision Health Scanner HUD"
+ desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness."
+ id = "health_hud_night"
+ req_tech = list("biotech" = 4, "magnets" = 5)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_URANIUM = 1000, MAT_SILVER = 250)
+ build_path = /obj/item/clothing/glasses/hud/health/night
+ category = list("Equipment")
+
/datum/design/magboots
name = "Magnetic Boots"
desc = "Magnetic boots, often used during extravehicular activity to ensure the user remains safely attached to the vehicle."
@@ -41,14 +51,14 @@
build_path = /obj/item/clothing/glasses/night
category = list("Equipment")
-/datum/design/health_hud_night
- name = "Night Vision Health Scanner HUD"
- desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness."
- id = "health_hud_night"
- req_tech = list("biotech" = 4, "magnets" = 5)
+/datum/design/security_hud
+ name = "Security HUD"
+ desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status."
+ id = "security_hud"
+ req_tech = list("magnets" = 3, "combat" = 2)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 200, MAT_GLASS = 200, MAT_URANIUM = 1000, MAT_SILVER = 250)
- build_path = /obj/item/clothing/glasses/hud/health/night
+ materials = list(MAT_METAL = 50, MAT_GLASS = 50)
+ build_path = /obj/item/clothing/glasses/hud/security
category = list("Equipment")
/datum/design/security_hud_night
@@ -61,16 +71,6 @@
build_path = /obj/item/clothing/glasses/hud/security/night
category = list("Equipment")
-/datum/design/nvgmesons
- name = "Night Vision Optical Meson Scanners"
- desc = "Prototype meson scanners fitted with an extra sensor which amplifies the visible light spectrum and overlays it to the UHD display."
- id = "nvgmesons"
- req_tech = list("materials" = 5, "magnets" = 5, "engineering" = 4)
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 300, MAT_GLASS = 400, MAT_PLASMA = 250, MAT_URANIUM = 1000)
- build_path = /obj/item/clothing/glasses/meson/night
- category = list("Equipment")
-
/datum/design/mesons
name = "Optical Meson Scanners"
desc = "Used for seeing walls, floors, and stuff through anything."
@@ -81,14 +81,14 @@
build_path = /obj/item/clothing/glasses/meson
category = list("Equipment")
-/datum/design/security_hud
- name = "Security HUD"
- desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status."
- id = "security_hud"
- req_tech = list("magnets" = 3, "combat" = 2)
+/datum/design/nvgmesons
+ name = "Night Vision Optical Meson Scanners"
+ desc = "Prototype meson scanners fitted with an extra sensor which amplifies the visible light spectrum and overlays it to the UHD display."
+ id = "nvgmesons"
+ req_tech = list("materials" = 5, "magnets" = 5, "engineering" = 4)
build_type = PROTOLATHE
- materials = list(MAT_METAL = 50, MAT_GLASS = 50)
- build_path = /obj/item/clothing/glasses/hud/security
+ materials = list(MAT_METAL = 300, MAT_GLASS = 400, MAT_PLASMA = 250, MAT_URANIUM = 1000)
+ build_path = /obj/item/clothing/glasses/meson/night
category = list("Equipment")
/datum/design/air_horn
@@ -170,3 +170,23 @@
materials = list("$metal" = 200, "$glass" = 200, "$uranium" = 1000, "$plasma" = 300)
build_path = /obj/item/clothing/glasses/hud/diagnostic/night
category = list("Equipment")
+
+/datum/design/hydroponic_hud
+ name = "Hydroponic HUD"
+ desc = "A HUD used to analyze the health and status of plants growing in hydro trays and soil."
+ id = "hydroponic_hud"
+ req_tech = list("magnets" = 3, "biotech" = 3)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 50, "$glass" = 50)
+ build_path = /obj/item/clothing/glasses/hud/hydroponic
+ category = list("Equipment")
+
+/datum/design/hydroponic_hud_night
+ name = "Night Vision Hydroponic HUD"
+ desc = "A HUD used to analyze the health and status of plants growing in low-light environments."
+ id = "hydroponic_hud_night"
+ req_tech = list("magnets" = 5, "biotech" = 4)
+ build_type = PROTOLATHE
+ materials = list("$metal" = 200, "$glass" = 200, "$uranium" = 1000, "$plasma" = 200)
+ build_path = /obj/item/clothing/glasses/hud/hydroponic/night
+ category = list("Equipment")
\ No newline at end of file
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index 385969c3f3f..e1f826eb9ca 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -192,16 +192,6 @@
build_path = /obj/item/weapon/circuitboard/sleeper
category = list("Medical Machinery")
-/datum/design/sleep_console
- name = "Machine Board (Sleeper Console)"
- desc = "Allows for the construction of circuit boards used to build a Sleeper Console."
- id = "sleeper_console"
- req_tech = list("programming" = 3, "biotech" = 2, "materials" = 3, "engineering" = 3)
- build_type = IMPRINTER
- materials = list(MAT_GLASS = 1000, "sacid" = 20)
- build_path = /obj/item/weapon/circuitboard/sleep_console
- category = list("Medical Machinery")
-
/datum/design/biogenerator
name = "Machine Board (Biogenerator)"
desc = "The circuit board for a Biogenerator."
@@ -432,6 +422,16 @@
build_path = /obj/item/weapon/circuitboard/candy_maker
category = list("Misc. Machinery")
+/datum/design/deepfryer
+ name = "Machine Board (Deep Fryer)"
+ desc = "The circuit board for a Deep Fryer."
+ id = "deepfryer"
+ req_tech = list("programming" = 2)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS = 1000, "sacid" = 20)
+ build_path = /obj/item/weapon/circuitboard/deepfryer
+ category = list("Misc. Machinery")
+
/datum/design/orion_trail
name = "Machine Board (Orion Trail Arcade Machine)"
desc = "Allows for the construction of circuit boards used to build a new Orion Trail machine."
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index 941083c5da6..8f2b16626d3 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -960,34 +960,13 @@
category = list("Exosuit Equipment")
//Cyborg Upgrade Modules
-/datum/design/borg_syndicate_module
- name = "Borg Illegal Weapons Upgrade"
- desc = "Allows for the construction of illegal upgrades for cyborgs"
- id = "borg_syndicate_module"
- build_type = MECHFAB
- req_tech = list("combat" = 4, "syndicate" = 3)
- build_path = /obj/item/borg/upgrade/syndicate
- materials = list(MAT_METAL=10000,MAT_GLASS=15000,MAT_DIAMOND = 10000)
- construction_time = 120
- category = list("Cyborg Upgrade Modules")
-/datum/design/borg_upgrade_jetpack
- name = "Cyborg Upgrade Module (Mining Jetpack)"
- id = "borg_upgrade_jetpack"
+/datum/design/borg_upgrade_reset
+ name = "Cyborg Upgrade Module (Reset)"
+ id = "borg_upgrade_reset"
build_type = MECHFAB
- build_path = /obj/item/borg/upgrade/jetpack
- req_tech = list("engineering" = 4, "power" = 4)
- materials = list(MAT_METAL=10000, MAT_PLASMA=5000, MAT_URANIUM = 6000)
- construction_time = 120
- category = list("Cyborg Upgrade Modules")
-
-/datum/design/borg_upgrade_disablercooler
- name = "Cyborg Upgrade Module (Rapid Disabler Cooling)"
- id = "borg_upgrade_disablercooler"
- build_type = MECHFAB
- build_path = /obj/item/borg/upgrade/disablercooler
- req_tech = list("combat" = 5, "power" = 4)
- materials = list(MAT_METAL=80000 , MAT_GLASS=6000 , MAT_GOLD= 2000, MAT_DIAMOND = 500)
+ build_path = /obj/item/borg/upgrade/reset
+ materials = list(MAT_METAL=10000)
construction_time = 120
category = list("Cyborg Upgrade Modules")
@@ -1000,15 +979,6 @@
construction_time = 120
category = list("Cyborg Upgrade Modules")
-/datum/design/borg_upgrade_reset
- name = "Cyborg Upgrade Module (Reset)"
- id = "borg_upgrade_reset"
- build_type = MECHFAB
- build_path = /obj/item/borg/upgrade/reset
- materials = list(MAT_METAL=10000)
- construction_time = 120
- category = list("Cyborg Upgrade Modules")
-
/datum/design/borg_upgrade_restart
name = "Cyborg Upgrade Module (Restart)"
id = "borg_upgrade_restart"
@@ -1028,6 +998,26 @@
construction_time = 120
category = list("Cyborg Upgrade Modules")
+/datum/design/borg_upgrade_thrusters
+ name = "Cyborg Upgrade (Ion Thrusters)"
+ id = "borg_upgrade_thrusters"
+ build_type = MECHFAB
+ build_path = /obj/item/borg/upgrade/thrusters
+ req_tech = list("engineering" = 4, "powerstorage" = 4)
+ materials = list(MAT_METAL=10000, MAT_PLASMA=5000, MAT_URANIUM = 6000)
+ construction_time = 120
+ category = list("Cyborg Upgrade Modules")
+
+/datum/design/borg_upgrade_disablercooler
+ name = "Cyborg Upgrade Module (Rapid Disabler Cooling)"
+ id = "borg_upgrade_disablercooler"
+ build_type = MECHFAB
+ build_path = /obj/item/borg/upgrade/disablercooler
+ req_tech = list("combat" = 5, "power" = 4)
+ materials = list(MAT_METAL=80000 , MAT_GLASS=6000 , MAT_GOLD= 2000, MAT_DIAMOND = 500)
+ construction_time = 120
+ category = list("Cyborg Upgrade Modules")
+
/datum/design/borg_upgrade_diamonddrill
name = "Cyborg Upgrade (Diamond Drill)"
id = "borg_upgrade_diamonddrill"
@@ -1048,6 +1038,36 @@
construction_time = 120
category = list("Cyborg Upgrade Modules")
+/datum/design/borg_upgrade_hyperka
+ name = "Cyborg Upgrade (Hyper-Kinetic Accelerator)"
+ id = "borg_upgrade_hyperka"
+ req_tech = list("materials" = 7, "powerstorage" = 5, "engineering" = 5, "magnets" = 5, "combat" = 4)
+ build_type = MECHFAB //Reqs same as human Hyper KA
+ materials = list(MAT_METAL = 8000, MAT_GLASS = 1500, MAT_SILVER = 2000, MAT_GOLD = 2000, MAT_DIAMOND = 2000)
+ build_path = /obj/item/borg/upgrade/hyperka
+ construction_time = 120
+ category = list("Cyborg Upgrade Modules")
+
+/datum/design/borg_syndicate_module
+ name = "Cyborg Upgrade (Illegal Modules)"
+ id = "borg_syndicate_module"
+ build_type = MECHFAB
+ req_tech = list("combat" = 4, "syndicate" = 3)
+ build_path = /obj/item/borg/upgrade/syndicate
+ materials = list(MAT_METAL=10000,MAT_GLASS=15000,MAT_DIAMOND = 10000)
+ construction_time = 120
+ category = list("Cyborg Upgrade Modules")
+
+/datum/design/borg_upgrade_selfrepair
+ name = "Cyborg Upgrade (Self-repair)"
+ id = "borg_upgrade_selfrepair"
+ build_type = MECHFAB
+ build_path = /obj/item/borg/upgrade/selfrepair
+ req_tech = list("materials" = 4, "engineering" = 4)
+ materials = list(MAT_METAL=15000, MAT_GLASS=15000)
+ construction_time = 120
+ category = list("Cyborg Upgrade Modules")
+
//Misc
/datum/design/mecha_tracking
name = "Exosuit Tracking Beacon"
diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm
index 5a3bba6ae86..e8bbbd62db7 100644
--- a/code/modules/research/destructive_analyzer.dm
+++ b/code/modules/research/destructive_analyzer.dm
@@ -47,9 +47,9 @@ Note: Must be placed within 3 tiles of the R&D Console
/obj/machinery/r_n_d/destructive_analyzer/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
- if (shocked)
+ if(shocked)
shock(user,50)
- if (default_deconstruction_screwdriver(user, "d_analyzer_t", "d_analyzer", O))
+ if(default_deconstruction_screwdriver(user, "d_analyzer_t", "d_analyzer", O))
if(linked_console)
linked_console.linked_destroy = null
linked_console = null
@@ -60,20 +60,20 @@ Note: Must be placed within 3 tiles of the R&D Console
default_deconstruction_crowbar(O)
- if (disabled)
+ if(disabled)
return
- if (!linked_console)
+ if(!linked_console)
to_chat(user, "The [src.name] must be linked to an R&D console first! ")
return
- if (busy)
+ if(busy)
to_chat(user, "The [src.name] is busy right now. ")
return
- if (istype(O, /obj/item) && !loaded_item)
+ if(istype(O, /obj/item) && !loaded_item)
if(!O.origin_tech)
to_chat(user, "This doesn't seem to have a tech origin! ")
return
var/list/temp_tech = ConvertReqString2List(O.origin_tech)
- if (temp_tech.len == 0)
+ if(temp_tech.len == 0)
to_chat(user, "You cannot deconstruct this item! ")
return
if(!user.drop_item())
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index c9ed686645a..30c58cce776 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -113,10 +113,10 @@
return TRUE
/obj/machinery/r_n_d/experimentor/attackby(obj/item/O, mob/user, params)
- if (shocked)
+ if(shocked)
shock(user,50)
- if (default_deconstruction_screwdriver(user, "h_lathe_maint", "h_lathe", O))
+ if(default_deconstruction_screwdriver(user, "h_lathe_maint", "h_lathe", O))
if(linked_console)
linked_console.linked_destroy = null
linked_console = null
@@ -133,20 +133,20 @@
to_chat(user, "The [O] is not yet valid for the [src] and must be completed! ")
return
- if (disabled)
+ if(disabled)
return
- if (!linked_console)
+ if(!linked_console)
to_chat(user, "The [src] must be linked to an R&D console first! ")
return
- if (loaded_item)
+ if(loaded_item)
to_chat(user, "The [src] is already loaded. ")
return
- if (istype(O, /obj/item))
+ if(istype(O, /obj/item))
if(!O.origin_tech)
to_chat(user, "This doesn't seem to have a tech origin! ")
return
var/list/temp_tech = ConvertReqString2List(O.origin_tech)
- if (temp_tech.len == 0)
+ if(temp_tech.len == 0)
to_chat(user, "You cannot experiment on this item! ")
return
if(O.reliability < 90 && O.crit_fail == 0)
diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm
index a528c643809..651f278cdd8 100644
--- a/code/modules/research/message_server.dm
+++ b/code/modules/research/message_server.dm
@@ -87,12 +87,12 @@ var/global/list/obj/machinery/message_server/message_servers = list()
/obj/machinery/message_server/proc/send_rc_message(var/recipient = "",var/sender = "",var/message = "",var/stamp = "", var/id_auth = "", var/priority = 1)
rc_msgs += new/datum/data_rc_msg(recipient,sender,message,stamp,id_auth)
var/authmsg = "[message] "
- if (id_auth)
+ if(id_auth)
authmsg += "[id_auth] "
- if (stamp)
+ if(stamp)
authmsg += "[stamp] "
- for (var/obj/machinery/requests_console/Console in allConsoles)
- if (ckey(Console.department) == ckey(recipient))
+ for(var/obj/machinery/requests_console/Console in allConsoles)
+ if(ckey(Console.department) == ckey(recipient))
if(Console.inoperable())
Console.message_log += "Message lost due to console failure. Please contact [station_name()] system adminsitrator or AI for technical assistance. "
continue
@@ -103,12 +103,12 @@ var/global/list/obj/machinery/message_server/message_servers = list()
if(2)
if(!Console.silent)
playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1)
- Console.audible_message(text("\icon[Console] *The Requests Console beeps: 'PRIORITY Alert in [sender]'"),,5)
+ Console.audible_message(text("[bicon(Console)] *The Requests Console beeps: 'PRIORITY Alert in [sender]'"),,5)
Console.message_log += "High Priority message from [sender] [authmsg]"
else
if(!Console.silent)
playsound(Console.loc, 'sound/machines/twobeep.ogg', 50, 1)
- Console.audible_message(text("\icon[Console] *The Requests Console beeps: 'Message from [sender]'"),,4)
+ Console.audible_message(text("[bicon(Console)] *The Requests Console beeps: 'Message from [sender]'"),,4)
Console.message_log += "Message from [sender] [authmsg]"
Console.set_light(2)
@@ -123,7 +123,7 @@ var/global/list/obj/machinery/message_server/message_servers = list()
/obj/machinery/message_server/update_icon()
if((stat & (BROKEN|NOPOWER)))
icon_state = "server-nopower"
- else if (!active)
+ else if(!active)
icon_state = "server-off"
else
icon_state = "server-on"
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index cff54b3bd32..81392aa99e5 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -87,9 +87,9 @@ Note: Must be placed west/left of and R&D console to function.
return A
/obj/machinery/r_n_d/protolathe/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
- if (shocked)
+ if(shocked)
shock(user,50)
- if (default_deconstruction_screwdriver(user, "protolathe_t", "protolathe", O))
+ if(default_deconstruction_screwdriver(user, "protolathe_t", "protolathe", O))
if(linked_console)
linked_console.linked_lathe = null
linked_console = null
@@ -98,7 +98,7 @@ Note: Must be placed west/left of and R&D console to function.
if(exchange_parts(user, O))
return
- if (panel_open)
+ if(panel_open)
if(istype(O, /obj/item/weapon/crowbar))
for(var/obj/I in component_parts)
if(istype(I, /obj/item/weapon/reagent_containers/glass/beaker))
@@ -114,17 +114,17 @@ Note: Must be placed west/left of and R&D console to function.
else
to_chat(user, "You can't load the [src.name] while it's opened. ")
return 1
- if (disabled)
+ if(disabled)
return
- if (!linked_console)
+ if(!linked_console)
to_chat(user, " The [src.name] must be linked to an R&D console first! ")
return 1
- if (busy)
+ if(busy)
to_chat(user, "The [src.name] is busy. Please wait for completion of previous operation. ")
return 1
- if (O.is_open_container())
+ if(O.is_open_container())
return
- if (stat)
+ if(stat)
return 1
if(!istype(O,/obj/item/stack/sheet))
return 1
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index 2fdb61a706f..7debbe2bd3d 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -46,11 +46,11 @@ won't update every console in existence) but it's more of a hassle to do. Also,
var/obj/machinery/r_n_d/circuit_imprinter/linked_imprinter = null //Linked Circuit Imprinter
var/screen = 1.0 //Which screen is currently showing.
-
+
var/menu = 0 // Current menu.
var/submenu = 0
var/wait_message = 0
-
+
var/id = 0 //ID of the computer (for server restrictions).
var/sync = 1 //If sync = 0, it doesn't show up on Server Control Console
@@ -76,7 +76,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
proc/CallMaterialName(ID)
var/datum/reagent/temp_reagent
var/return_name = null
- if (copytext(ID, 1, 2) == "$")
+ if(copytext(ID, 1, 2) == "$")
return_name = copytext(ID, 2)
switch(return_name)
if("metal")
@@ -168,7 +168,7 @@ proc/CallMaterialName(ID)
return
if(istype(D, /obj/item/weapon/disk/tech_disk)) t_disk = D
- else if (istype(D, /obj/item/weapon/disk/design_disk)) d_disk = D
+ else if(istype(D, /obj/item/weapon/disk/design_disk)) d_disk = D
else
to_chat(user, "Machine cannot accept disks in that format. ")
return
@@ -221,7 +221,7 @@ proc/CallMaterialName(ID)
if(href_list["category"] in D.category)
matching_designs.Add(D)
submenu = 1
-
+
selected_category = "Viewing Category [href_list["category"]]"
else if(href_list["updt_tech"]) //Update the research holder with information from the technology disk.
@@ -432,13 +432,13 @@ proc/CallMaterialName(ID)
if(linked_lathe.busy)
g2g = 0
var/key = usr.key //so we don't lose the info during the spawn delay
- if (!(being_built.build_type & PROTOLATHE))
+ if(!(being_built.build_type & PROTOLATHE))
g2g = 0
message_admins("Protolathe exploit attempted by [key_name(usr, usr.client)]!")
- if (g2g) //If input is incorrect, nothing happens
+ if(g2g) //If input is incorrect, nothing happens
var/enough_materials = 1
linked_lathe.busy = 1
flick("protolathe_n",linked_lathe)
@@ -466,9 +466,9 @@ proc/CallMaterialName(ID)
var/P = being_built.build_path //lets save these values before the spawn() just in case. Nobody likes runtimes.
var/O = being_built.locked
-
+
coeff *= being_built.lathe_time_factor
-
+
spawn(32*amount/coeff)
if(g2g) //And if we only fail the material requirements, we still spend time and power
for(var/i = 0, i= time_per_spawn)
time_spent_spawning = 0
use_power = 1
- src.visible_message("\blue \icon[src] [src] pings!")
+ src.visible_message("\blue [bicon(src)] [src] pings!")
icon_state = "cellold1"
desc = "It's full of a bubbling viscous liquid, and is lit by a mysterious glow."
if(spawn_type)
@@ -81,7 +81,7 @@
if(previous_power_state)
previous_power_state = 0
icon_state = "cellold0"
- src.visible_message("\blue \icon[src] [src] suddenly shuts down.")
+ src.visible_message("\blue [bicon(src)] [src] suddenly shuts down.")
//cloned mob slowly breaks down
time_spent_spawning = max(time_spent_spawning + last_process - world.time, 0)
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm b/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
index b32bc190aee..b8c868237e3 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
+++ b/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm
@@ -78,7 +78,7 @@
viables.Remove(type)
construction[button_desc] = type
- fail_message = "\blue \icon[src] a [pick("loud","soft","sinister","eery","triumphant","depressing","cheerful","angry")] \
+ fail_message = "\blue [bicon(src)] a [pick("loud","soft","sinister","eery","triumphant","depressing","cheerful","angry")] \
[pick("horn","beep","bing","bleep","blat","honk","hrumph","ding")] sounds and a \
[pick("yellow","purple","green","blue","red","orange","white")] \
[pick("light","dial","meter","window","protrusion","knob","antenna","swirly thing")] \
@@ -90,7 +90,7 @@
if(spawning_types.len && powered())
spawn_progress_time += world.time - last_process_time
if(spawn_progress_time > max_spawn_time)
- src.visible_message("\blue \icon[src] [src] pings!")
+ src.visible_message("\blue [bicon(src)] [src] pings!")
var/obj/source_material = pop(stored_materials)
var/spawn_type = pop(spawning_types)
@@ -113,7 +113,7 @@
icon_state = "borgcharger0(old)"
else if(prob(5))
- src.visible_message("\blue \icon[src] [src] [pick("clicks","whizzes","whirrs","whooshes","clanks","clongs","clonks","bangs")].")
+ src.visible_message("\blue [bicon(src)] [src] [pick("clicks","whizzes","whirrs","whooshes","clanks","clongs","clonks","bangs")].")
last_process_time = world.time
@@ -141,9 +141,9 @@
if(index > 0 && index <= construction.len)
if(stored_materials.len > spawning_types.len)
if(spawning_types.len)
- src.visible_message("\blue \icon[src] a [pick("light","dial","display","meter","pad")] on [src]'s front [pick("blinks","flashes")] [pick("red","yellow","blue","orange","purple","green","white")].")
+ src.visible_message("\blue [bicon(src)] a [pick("light","dial","display","meter","pad")] on [src]'s front [pick("blinks","flashes")] [pick("red","yellow","blue","orange","purple","green","white")].")
else
- src.visible_message("\blue \icon[src] [src]'s front compartment slides shut.")
+ src.visible_message("\blue [bicon(src)] [src]'s front compartment slides shut.")
spawning_types.Add(construction[construction[index]])
spawn_progress_time = 0
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm
index d9041733d57..7a4b36707f9 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm
+++ b/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm
@@ -220,7 +220,7 @@ var/list/valid_secondary_effect_types = list(\
secondary_effect.ToggleActivate(0)
/obj/machinery/artifact/attack_hand(var/mob/user as mob)
- if (get_dist(user, src) > 1)
+ if(get_dist(user, src) > 1)
to_chat(user, "\red You can't reach [src] from here.")
return
if(ishuman(user) && user:gloves)
@@ -238,7 +238,7 @@ var/list/valid_secondary_effect_types = list(\
if(prob(25) && secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH)
secondary_effect.ToggleActivate(0)
- if (my_effect.effect == EFFECT_TOUCH)
+ if(my_effect.effect == EFFECT_TOUCH)
my_effect.DoEffectTouch(user)
if(secondary_effect && secondary_effect.effect == EFFECT_TOUCH && secondary_effect.activated)
@@ -246,7 +246,7 @@ var/list/valid_secondary_effect_types = list(\
/obj/machinery/artifact/attackby(obj/item/weapon/W as obj, mob/living/user as mob, params)
- if (istype(W, /obj/item/weapon/reagent_containers/))
+ if(istype(W, /obj/item/weapon/reagent_containers/))
if(W.reagents.has_reagent("hydrogen", 1) || W.reagents.has_reagent("water", 1))
if(my_effect.trigger == TRIGGER_WATER)
my_effect.ToggleActivate()
@@ -272,12 +272,12 @@ var/list/valid_secondary_effect_types = list(\
istype(W,/obj/item/weapon/melee/cultblade) ||\
istype(W,/obj/item/weapon/card/emag) ||\
istype(W,/obj/item/device/multitool))
- if (my_effect.trigger == TRIGGER_ENERGY)
+ if(my_effect.trigger == TRIGGER_ENERGY)
my_effect.ToggleActivate()
if(secondary_effect && secondary_effect.trigger == TRIGGER_ENERGY && prob(25))
secondary_effect.ToggleActivate(0)
- else if (istype(W,/obj/item/weapon/match) && W:lit ||\
+ else if(istype(W,/obj/item/weapon/match) && W:lit ||\
istype(W,/obj/item/weapon/weldingtool) && W:welding ||\
istype(W,/obj/item/weapon/lighter) && W:lit)
if(my_effect.trigger == TRIGGER_HEAT)
@@ -286,7 +286,7 @@ var/list/valid_secondary_effect_types = list(\
secondary_effect.ToggleActivate(0)
else
..()
- if (my_effect.trigger == TRIGGER_FORCE && W.force >= 10)
+ if(my_effect.trigger == TRIGGER_FORCE && W.force >= 10)
my_effect.ToggleActivate()
if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25))
secondary_effect.ToggleActivate(0)
@@ -302,14 +302,14 @@ var/list/valid_secondary_effect_types = list(\
else if(ishuman(M) && !istype(M:gloves,/obj/item/clothing/gloves))
var/warn = 0
- if (my_effect.trigger == TRIGGER_TOUCH && prob(50))
+ if(my_effect.trigger == TRIGGER_TOUCH && prob(50))
my_effect.ToggleActivate()
warn = 1
if(secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH && prob(25))
secondary_effect.ToggleActivate(0)
warn = 1
- if (my_effect.effect == EFFECT_TOUCH && prob(50))
+ if(my_effect.effect == EFFECT_TOUCH && prob(50))
my_effect.DoEffectTouch(M)
warn = 1
if(secondary_effect && secondary_effect.effect == EFFECT_TOUCH && secondary_effect.activated && prob(50))
@@ -340,7 +340,7 @@ var/list/valid_secondary_effect_types = list(\
switch(severity)
if(1.0) qdel(src)
if(2.0)
- if (prob(50))
+ if(prob(50))
qdel(src)
else
if(my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT)
@@ -348,7 +348,7 @@ var/list/valid_secondary_effect_types = list(\
if(secondary_effect && (secondary_effect.trigger == TRIGGER_FORCE || secondary_effect.trigger == TRIGGER_HEAT) && prob(25))
secondary_effect.ToggleActivate(0)
if(3.0)
- if (my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT)
+ if(my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT)
my_effect.ToggleActivate()
if(secondary_effect && (secondary_effect.trigger == TRIGGER_FORCE || secondary_effect.trigger == TRIGGER_HEAT) && prob(25))
secondary_effect.ToggleActivate(0)
diff --git a/code/modules/research/xenoarchaeology/artifact/effect.dm b/code/modules/research/xenoarchaeology/artifact/effect.dm
index 0518e677419..727c016849b 100644
--- a/code/modules/research/xenoarchaeology/artifact/effect.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effect.dm
@@ -64,7 +64,7 @@
var/atom/toplevelholder = holder
while(!istype(toplevelholder.loc, /turf))
toplevelholder = toplevelholder.loc
- toplevelholder.visible_message("\red \icon[toplevelholder] [toplevelholder] [display_msg]")
+ toplevelholder.visible_message("\red [bicon(toplevelholder)] [toplevelholder] [display_msg]")
/datum/artifact_effect/proc/DoEffectTouch(var/mob/user)
/datum/artifact_effect/proc/DoEffectAura(var/atom/holder)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm
index 93a025336a0..373b5d9454f 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm
@@ -28,7 +28,7 @@
/datum/artifact_effect/badfeeling/DoEffectTouch(var/mob/user)
if(user)
- if (istype(user, /mob/living/carbon/human))
+ if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
if(prob(50))
if(prob(75))
@@ -42,7 +42,7 @@
/datum/artifact_effect/badfeeling/DoEffectAura()
if(holder)
var/turf/T = get_turf(holder)
- for (var/mob/living/carbon/human/H in range(src.effectrange,T))
+ for(var/mob/living/carbon/human/H in range(src.effectrange,T))
if(prob(5))
if(prob(75))
to_chat(H, "[pick(messages)] ")
@@ -56,7 +56,7 @@
/datum/artifact_effect/badfeeling/DoEffectPulse()
if(holder)
var/turf/T = get_turf(holder)
- for (var/mob/living/carbon/human/H in range(src.effectrange,T))
+ for(var/mob/living/carbon/human/H in range(src.effectrange,T))
if(prob(50))
if(prob(95))
to_chat(H, "[pick(drastic_messages)] ")
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm
index ab66d1d0c6c..d67c33d1e4e 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm
@@ -8,7 +8,7 @@
if(user)
if(istype(user, /mob/living/silicon/robot))
var/mob/living/silicon/robot/R = user
- for (var/obj/item/weapon/stock_parts/cell/D in R.contents)
+ for(var/obj/item/weapon/stock_parts/cell/D in R.contents)
D.charge += rand() * 100 + 50
to_chat(R, "\blue SYSTEM ALERT: Large energy boost detected!")
return 1
@@ -16,13 +16,13 @@
/datum/artifact_effect/cellcharge/DoEffectAura()
if(holder)
var/turf/T = get_turf(holder)
- for (var/obj/machinery/power/apc/C in range(200, T))
- for (var/obj/item/weapon/stock_parts/cell/B in C.contents)
+ for(var/obj/machinery/power/apc/C in range(200, T))
+ for(var/obj/item/weapon/stock_parts/cell/B in C.contents)
B.charge += 25
- for (var/obj/machinery/power/smes/S in range (src.effectrange,src))
+ for(var/obj/machinery/power/smes/S in range (src.effectrange,src))
S.charge += 25
- for (var/mob/living/silicon/robot/M in mob_list)
- for (var/obj/item/weapon/stock_parts/cell/D in M.contents)
+ for(var/mob/living/silicon/robot/M in mob_list)
+ for(var/obj/item/weapon/stock_parts/cell/D in M.contents)
D.charge += 25
to_chat(M, "\blue SYSTEM ALERT: Energy boost detected!")
return 1
@@ -30,13 +30,13 @@
/datum/artifact_effect/cellcharge/DoEffectPulse()
if(holder)
var/turf/T = get_turf(holder)
- for (var/obj/machinery/power/apc/C in range(200, T))
- for (var/obj/item/weapon/stock_parts/cell/B in C.contents)
+ for(var/obj/machinery/power/apc/C in range(200, T))
+ for(var/obj/item/weapon/stock_parts/cell/B in C.contents)
B.charge += rand() * 100
- for (var/obj/machinery/power/smes/S in range (src.effectrange,src))
+ for(var/obj/machinery/power/smes/S in range (src.effectrange,src))
S.charge += 250
- for (var/mob/living/silicon/robot/M in mob_list)
- for (var/obj/item/weapon/stock_parts/cell/D in M.contents)
+ for(var/mob/living/silicon/robot/M in mob_list)
+ for(var/obj/item/weapon/stock_parts/cell/D in M.contents)
D.charge += rand() * 100
to_chat(M, "\blue SYSTEM ALERT: Energy boost detected!")
return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm
index 97c113b2fef..fcba3be4dec 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm
@@ -8,7 +8,7 @@
if(user)
if(istype(user, /mob/living/silicon/robot))
var/mob/living/silicon/robot/R = user
- for (var/obj/item/weapon/stock_parts/cell/D in R.contents)
+ for(var/obj/item/weapon/stock_parts/cell/D in R.contents)
D.charge = max(D.charge - rand() * 100, 0)
to_chat(R, "\blue SYSTEM ALERT: Energy drain detected!")
return 1
@@ -18,13 +18,13 @@
/datum/artifact_effect/celldrain/DoEffectAura()
if(holder)
var/turf/T = get_turf(holder)
- for (var/obj/machinery/power/apc/C in range(200, T))
- for (var/obj/item/weapon/stock_parts/cell/B in C.contents)
+ for(var/obj/machinery/power/apc/C in range(200, T))
+ for(var/obj/item/weapon/stock_parts/cell/B in C.contents)
B.charge = max(B.charge - 50,0)
- for (var/obj/machinery/power/smes/S in range (src.effectrange,src))
+ for(var/obj/machinery/power/smes/S in range (src.effectrange,src))
S.charge = max(S.charge - 100,0)
- for (var/mob/living/silicon/robot/M in mob_list)
- for (var/obj/item/weapon/stock_parts/cell/D in M.contents)
+ for(var/mob/living/silicon/robot/M in mob_list)
+ for(var/obj/item/weapon/stock_parts/cell/D in M.contents)
D.charge = max(D.charge - 50,0)
to_chat(M, "\red SYSTEM ALERT: Energy drain detected!")
return 1
@@ -32,13 +32,13 @@
/datum/artifact_effect/celldrain/DoEffectPulse()
if(holder)
var/turf/T = get_turf(holder)
- for (var/obj/machinery/power/apc/C in range(200, T))
- for (var/obj/item/weapon/stock_parts/cell/B in C.contents)
+ for(var/obj/machinery/power/apc/C in range(200, T))
+ for(var/obj/item/weapon/stock_parts/cell/B in C.contents)
B.charge = max(B.charge - rand() * 150,0)
- for (var/obj/machinery/power/smes/S in range (src.effectrange,src))
+ for(var/obj/machinery/power/smes/S in range (src.effectrange,src))
S.charge = max(S.charge - 250,0)
- for (var/mob/living/silicon/robot/M in mob_list)
- for (var/obj/item/weapon/stock_parts/cell/D in M.contents)
+ for(var/mob/living/silicon/robot/M in mob_list)
+ for(var/obj/item/weapon/stock_parts/cell/D in M.contents)
D.charge = max(D.charge - rand() * 150,0)
to_chat(M, "\red SYSTEM ALERT: Energy drain detected!")
return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm
index f52e8125e3f..08639dec98f 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm
@@ -26,7 +26,7 @@
/datum/artifact_effect/goodfeeling/DoEffectTouch(var/mob/user)
if(user)
- if (istype(user, /mob/living/carbon/human))
+ if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
if(prob(50))
if(prob(75))
@@ -40,7 +40,7 @@
/datum/artifact_effect/goodfeeling/DoEffectAura()
if(holder)
var/turf/T = get_turf(holder)
- for (var/mob/living/carbon/human/H in range(src.effectrange,T))
+ for(var/mob/living/carbon/human/H in range(src.effectrange,T))
if(prob(5))
if(prob(75))
to_chat(H, "[pick(messages)] ")
@@ -54,7 +54,7 @@
/datum/artifact_effect/goodfeeling/DoEffectPulse()
if(holder)
var/turf/T = get_turf(holder)
- for (var/mob/living/carbon/human/H in range(src.effectrange,T))
+ for(var/mob/living/carbon/human/H in range(src.effectrange,T))
if(prob(50))
if(prob(95))
to_chat(H, "[pick(drastic_messages)] ")
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm
index c46549d0d50..cde5632eaa5 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm
@@ -38,7 +38,7 @@
//todo: check over this properly
if(holder)
var/turf/T = get_turf(holder)
- for (var/mob/living/carbon/C in range(src.effectrange,T))
+ for(var/mob/living/carbon/C in range(src.effectrange,T))
var/weakness = GetAnomalySusceptibility(C)
if(prob(weakness * 100))
if(prob(10))
@@ -54,7 +54,7 @@
//todo: check over this properly
if(holder)
var/turf/T = get_turf(holder)
- for (var/mob/living/carbon/C in range(src.effectrange,T))
+ for(var/mob/living/carbon/C in range(src.effectrange,T))
var/weakness = GetAnomalySusceptibility(C)
if(prob(weakness * 100))
to_chat(C, "\blue A wave of energy invigorates you.")
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm
index fd221b470fb..399b7252d20 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm
@@ -22,7 +22,7 @@
/datum/artifact_effect/hurt/DoEffectAura()
if(holder)
var/turf/T = get_turf(holder)
- for (var/mob/living/carbon/C in range(src.effectrange,T))
+ for(var/mob/living/carbon/C in range(src.effectrange,T))
var/weakness = GetAnomalySusceptibility(C)
if(prob(weakness * 100))
if(prob(10))
@@ -37,7 +37,7 @@
/datum/artifact_effect/hurt/DoEffectPulse()
if(holder)
var/turf/T = get_turf(holder)
- for (var/mob/living/carbon/C in range(effectrange, T))
+ for(var/mob/living/carbon/C in range(effectrange, T))
var/weakness = GetAnomalySusceptibility(C)
if(prob(weakness * 100))
to_chat(C, "\red A wave of painful energy strikes you!")
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_radiate.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_radiate.dm
index 4310ffb2e71..f27a4f4219b 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_radiate.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_radiate.dm
@@ -17,7 +17,7 @@
/datum/artifact_effect/radiate/DoEffectAura()
if(holder)
var/turf/T = get_turf(holder)
- for (var/mob/living/M in range(src.effectrange,T))
+ for(var/mob/living/M in range(src.effectrange,T))
M.apply_effect(radiation_amount,IRRADIATE,0)
M.updatehealth()
return 1
@@ -25,7 +25,7 @@
/datum/artifact_effect/radiate/DoEffectPulse()
if(holder)
var/turf/T = get_turf(holder)
- for (var/mob/living/M in range(src.effectrange,T))
+ for(var/mob/living/M in range(src.effectrange,T))
M.apply_effect(radiation_amount * 25,IRRADIATE,0)
M.updatehealth()
return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm
index 6f698bb8ee3..30316fc3342 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm
@@ -8,7 +8,7 @@
/datum/artifact_effect/roboheal/DoEffectTouch(var/mob/user)
if(user)
- if (istype(user, /mob/living/silicon/robot))
+ if(istype(user, /mob/living/silicon/robot))
var/mob/living/silicon/robot/R = user
to_chat(R, "\blue Your systems report damaged components mending by themselves!")
R.adjustBruteLoss(rand(-10,-30))
@@ -18,7 +18,7 @@
/datum/artifact_effect/roboheal/DoEffectAura()
if(holder)
var/turf/T = get_turf(holder)
- for (var/mob/living/silicon/robot/M in range(src.effectrange,T))
+ for(var/mob/living/silicon/robot/M in range(src.effectrange,T))
if(prob(10))
to_chat(M, "\blue SYSTEM ALERT: Beneficial energy field detected!")
M.adjustBruteLoss(-1)
@@ -29,7 +29,7 @@
/datum/artifact_effect/roboheal/DoEffectPulse()
if(holder)
var/turf/T = get_turf(holder)
- for (var/mob/living/silicon/robot/M in range(src.effectrange,T))
+ for(var/mob/living/silicon/robot/M in range(src.effectrange,T))
to_chat(M, "\blue SYSTEM ALERT: Structural damage has been repaired by energy pulse!")
M.adjustBruteLoss(-10)
M.adjustFireLoss(-10)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm
index c7f4d7f9775..da22a45b32b 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm
@@ -8,7 +8,7 @@
/datum/artifact_effect/robohurt/DoEffectTouch(var/mob/user)
if(user)
- if (istype(user, /mob/living/silicon/robot))
+ if(istype(user, /mob/living/silicon/robot))
var/mob/living/silicon/robot/R = user
to_chat(R, "\red Your systems report severe damage has been inflicted!")
R.adjustBruteLoss(rand(10,50))
@@ -18,7 +18,7 @@
/datum/artifact_effect/robohurt/DoEffectAura()
if(holder)
var/turf/T = get_turf(holder)
- for (var/mob/living/silicon/robot/M in range(src.effectrange,T))
+ for(var/mob/living/silicon/robot/M in range(src.effectrange,T))
if(prob(10))
to_chat(M, "\red SYSTEM ALERT: Harmful energy field detected!")
M.adjustBruteLoss(1)
@@ -29,7 +29,7 @@
/datum/artifact_effect/robohurt/DoEffectPulse()
if(holder)
var/turf/T = get_turf(holder)
- for (var/mob/living/silicon/robot/M in range(src.effectrange,T))
+ for(var/mob/living/silicon/robot/M in range(src.effectrange,T))
to_chat(M, "\red SYSTEM ALERT: Structural damage inflicted by energy pulse!")
M.adjustBruteLoss(10)
M.adjustFireLoss(10)
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm
index 7ff0af5bab1..bbb16d76a3d 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm
@@ -23,14 +23,14 @@
/datum/artifact_effect/sleepy/DoEffectAura()
if(holder)
var/turf/T = get_turf(holder)
- for (var/mob/living/carbon/human/H in range(src.effectrange,T))
+ for(var/mob/living/carbon/human/H in range(src.effectrange,T))
var/weakness = GetAnomalySusceptibility(H)
if(prob(weakness * 100))
if(prob(10))
to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired."))
H.drowsyness = min(H.drowsyness + 1 * weakness, 25 * weakness)
H.eye_blurry = min(H.eye_blurry + 1 * weakness, 25 * weakness)
- for (var/mob/living/silicon/robot/R in range(src.effectrange,holder))
+ for(var/mob/living/silicon/robot/R in range(src.effectrange,holder))
to_chat(R, "\red SYSTEM ALERT: CPU cycles slowing down.")
return 1
@@ -43,6 +43,6 @@
to_chat(H, pick("\blue You feel like taking a nap.","\blue You feel a yawn coming on.","\blue You feel a little tired."))
H.drowsyness = min(H.drowsyness + rand(5,15) * weakness, 50 * weakness)
H.eye_blurry = min(H.eye_blurry + rand(5,15) * weakness, 50 * weakness)
- for (var/mob/living/silicon/robot/R in range(src.effectrange,holder))
+ for(var/mob/living/silicon/robot/R in range(src.effectrange,holder))
to_chat(R, "\red SYSTEM ALERT: CPU cycles slowing down.")
return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm
index 5c924d2bb6e..327e732fa12 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm
@@ -19,7 +19,7 @@
/datum/artifact_effect/stun/DoEffectAura()
if(holder)
var/turf/T = get_turf(holder)
- for (var/mob/living/carbon/C in range(src.effectrange,T))
+ for(var/mob/living/carbon/C in range(src.effectrange,T))
var/susceptibility = GetAnomalySusceptibility(C)
if(prob(10 * susceptibility))
to_chat(C, "\red Your body goes numb for a moment.")
@@ -33,7 +33,7 @@
/datum/artifact_effect/stun/DoEffectPulse()
if(holder)
var/turf/T = get_turf(holder)
- for (var/mob/living/carbon/C in range(src.effectrange,T))
+ for(var/mob/living/carbon/C in range(src.effectrange,T))
var/susceptibility = GetAnomalySusceptibility(C)
if(prob(100 * susceptibility))
to_chat(C, "\red A wave of energy overwhelms your senses!")
diff --git a/code/modules/research/xenoarchaeology/chemistry.dm b/code/modules/research/xenoarchaeology/chemistry.dm
index f417fc49792..ea91ef76b35 100644
--- a/code/modules/research/xenoarchaeology/chemistry.dm
+++ b/code/modules/research/xenoarchaeology/chemistry.dm
@@ -1,88 +1,10 @@
-
-//chemistry stuff here so that it can be easily viewed/modified
-datum
- reagent
- tungsten
- name = "Tungsten"
- id = "tungsten"
- description = "A chemical element, and a strong oxidising agent."
- reagent_state = SOLID
- color = "#808080" // rgb: 128, 128, 128
- //todo: make this silvery grey
-
- lithiumsodiumtungstate
- name = "Lithium Sodium Tungstate"
- id = "lithiumsodiumtungstate"
- description = "A reducing agent for geological compounds."
- reagent_state = LIQUID
- color = "#808080" // rgb: 128, 128, 128
- //todo: make this silvery grey
-
- ground_rock
- name = "Ground Rock"
- id = "ground_rock"
- description = "A fine dust made of ground up rock."
- reagent_state = SOLID
- color = "#C81040" //rgb: 200, 16, 64
- //todo: make this brown
-
- density_separated_sample
- name = "Density separated sample"
- id = "density_separated_sample"
- description = "A watery paste used in chemical analysis, there are some chunks floating in it."
- reagent_state = LIQUID
- color = "#C81040" //rgb: 200, 16, 64
- //todo: make this browny-white
-
- analysis_sample
- name = "Analysis liquid"
- id = "analysis_sample"
- description = "A watery paste used in chemical analysis."
- reagent_state = LIQUID
- color = "#C81040" //rgb: 200, 16, 64
- //todo: make this white
-
- chemical_waste
- name = "Chemical Waste"
- id = "chemical_waste"
- description = "A viscous, toxic liquid left over from many chemical processes."
- reagent_state = LIQUID
- color = "#C81040" //rgb: 200, 16, 64
- //todo: make this fluoro/bright green
-
-datum
- chemical_reaction
- lithiumsodiumtungstate //LiNa2WO4, not the easiest chem to mix
- name = "Lithium Sodium Tungstate"
- id = "lithiumsodiumtungstate"
- result = "lithiumsodiumtungstate"
- required_reagents = list("lithium" = 1, "sodium" = 2, "tungsten" = 1, "oxygen" = 4)
- result_amount = 8
-
- density_separated_liquid
- name = "Density separated sample"
- id = "density_separated_sample"
- result = "density_separated_sample"
- secondary_results = list("chemical_waste" = 1)
- required_reagents = list("ground_rock" = 1, "lithiumsodiumtungstate" = 2)
- result_amount = 2
-
- analysis_liquid
- name = "Analysis sample"
- id = "analysis_sample"
- result = "analysis_sample"
- secondary_results = list("chemical_waste" = 1)
- required_reagents = list("density_separated_sample" = 5)
- result_amount = 4
- min_temp = 375
-
/obj/item/weapon/reagent_containers/glass/solution_tray
name = "solution tray"
desc = "A small, open-topped glass container for delicate research samples. It sports a re-useable strip for labelling with a pen."
icon = 'icons/obj/device.dmi'
icon_state = "solution_tray"
materials = list(MAT_GLASS=5)
- w_class = 1.0
+ w_class = 1
amount_per_transfer_from_this = 1
possible_transfer_amounts = list(1, 2)
volume = 2
@@ -111,55 +33,22 @@ obj/item/weapon/reagent_containers/glass/solution_tray/attackby(obj/item/weapon/
new /obj/item/weapon/reagent_containers/glass/solution_tray( src )
new /obj/item/weapon/reagent_containers/glass/solution_tray( src )
-/obj/item/weapon/reagent_containers/glass/beaker/tungsten
- name = "beaker 'tungsten'"
- New()
- ..()
- reagents.add_reagent("tungsten",50)
- update_icon()
-
/obj/item/weapon/reagent_containers/glass/beaker/oxygen
name = "beaker 'oxygen'"
- New()
- ..()
- reagents.add_reagent("oxygen",50)
- update_icon()
+ list_reagents = list("oxygen" = 50)
/obj/item/weapon/reagent_containers/glass/beaker/sodium
name = "beaker 'sodium'"
- New()
- ..()
- reagents.add_reagent("sodium",50)
- update_icon()
+ list_reagents = list("sodium" = 50)
/obj/item/weapon/reagent_containers/glass/beaker/lithium
name = "beaker 'lithium'"
-
- New()
- ..()
- reagents.add_reagent("lithium",50)
- update_icon()
+ list_reagents = list("lithium" = 50)
/obj/item/weapon/reagent_containers/glass/beaker/water
name = "beaker 'water'"
-
- New()
- ..()
- reagents.add_reagent("water",50)
- update_icon()
-
-/obj/item/weapon/reagent_containers/glass/beaker/water
- name = "beaker 'water'"
-
- New()
- ..()
- reagents.add_reagent("water",50)
- update_icon()
+ list_reagents = list("water" = 50)
/obj/item/weapon/reagent_containers/glass/beaker/fuel
name = "beaker 'fuel'"
-
- New()
- ..()
- reagents.add_reagent("fuel",50)
- update_icon()
+ list_reagents = list("fuel" = 50)
\ No newline at end of file
diff --git a/code/modules/research/xenoarchaeology/finds/finds.dm b/code/modules/research/xenoarchaeology/finds/finds.dm
index 6cbe31a7ed9..1b1788eb1a1 100644
--- a/code/modules/research/xenoarchaeology/finds/finds.dm
+++ b/code/modules/research/xenoarchaeology/finds/finds.dm
@@ -296,9 +296,7 @@
if(20)
//arcane clothing
apply_prefix = 0
- var/list/possible_spawns = list(/obj/item/clothing/head/culthood,
- /obj/item/clothing/head/magus,
- /obj/item/clothing/head/culthood/alt,
+ var/list/possible_spawns = list(/obj/item/clothing/head/magus,
/obj/item/clothing/head/helmet/space/cult)
var/new_type = pick(possible_spawns)
diff --git a/code/modules/research/xenoarchaeology/finds/finds_fossils.dm b/code/modules/research/xenoarchaeology/finds/finds_fossils.dm
index 206280770e9..be176c114f4 100644
--- a/code/modules/research/xenoarchaeology/finds/finds_fossils.dm
+++ b/code/modules/research/xenoarchaeology/finds/finds_fossils.dm
@@ -80,7 +80,7 @@
..()
else if(istype(W,/obj/item/weapon/pen))
plaque_contents = input("What would you like to write on the plaque:","Skeleton plaque","")
- user.visible_message("[user] writes something on the base of [src].","You relabel the plaque on the base of \icon[src] [src].")
+ user.visible_message("[user] writes something on the base of [src].","You relabel the plaque on the base of [bicon(src)] [src].")
if(src.contents.Find(/obj/item/weapon/fossil/skull/horned))
src.desc = "A creature made of [src.contents.len-1] assorted bones and a horned skull. The plaque reads \'[plaque_contents]\'."
else
diff --git a/code/modules/research/xenoarchaeology/finds/finds_misc.dm b/code/modules/research/xenoarchaeology/finds/finds_misc.dm
index e94049a74f1..0c4f8e8369d 100644
--- a/code/modules/research/xenoarchaeology/finds/finds_misc.dm
+++ b/code/modules/research/xenoarchaeology/finds/finds_misc.dm
@@ -25,11 +25,11 @@
return
/obj/item/weapon/shard/plasma/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if ( istype(W, /obj/item/weapon/weldingtool))
+ if( istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0, user))
var/obj/item/stack/sheet/plasmaglass/NG = new (user.loc)
- for (var/obj/item/stack/sheet/plasmaglass/G in user.loc)
+ for(var/obj/item/stack/sheet/plasmaglass/G in user.loc)
if(G==NG)
continue
if(G.amount>=G.max_amount)
diff --git a/code/modules/research/xenoarchaeology/finds/finds_special.dm b/code/modules/research/xenoarchaeology/finds/finds_special.dm
index dc315b80640..ce6fb4c2663 100644
--- a/code/modules/research/xenoarchaeology/finds/finds_special.dm
+++ b/code/modules/research/xenoarchaeology/finds/finds_special.dm
@@ -99,7 +99,7 @@
if(charges >= 0.1)
if(prob(5))
- src.visible_message("\red \icon[src] [src]'s eyes glow ruby red for a moment!")
+ src.visible_message("\red [bicon(src)] [src]'s eyes glow ruby red for a moment!")
charges -= 0.1
//check on our shadow wights
diff --git a/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm b/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm
index 9cea4d29494..69b9d449f2c 100644
--- a/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm
+++ b/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm
@@ -57,7 +57,7 @@
var/list/options = list("[holder_atom] seems to be listening intently to [source]...",\
"[holder_atom] seems to be focussing on [source]...",\
"[holder_atom] seems to turn it's attention to [source]...")
- holder_atom.loc.visible_message("\blue \icon[holder_atom] [pick(options)]")
+ holder_atom.loc.visible_message("\blue [bicon(holder_atom)] [pick(options)]")
if(prob(20))
spawn(2)
@@ -113,13 +113,13 @@
var/list/listening = viewers(holder_atom)
for(var/mob/M in mob_list)
- if (!M.client)
+ if(!M.client)
continue //skip monkeys and leavers
- if (istype(M, /mob/new_player))
+ if(istype(M, /mob/new_player))
continue
if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS)
listening|=M
for(var/mob/M in listening)
- to_chat(M, "\icon[holder_atom] [holder_atom] reverberates, \blue\"[msg]\"")
+ to_chat(M, "[bicon(holder_atom)] [holder_atom] reverberates, \blue\"[msg]\"")
last_talk_time = world.time
diff --git a/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm b/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm
index 1e491f1ac48..d43d7996e1a 100644
--- a/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm
+++ b/code/modules/research/xenoarchaeology/genetics/reconstitutor.dm
@@ -54,14 +54,14 @@ datum/genesequence
W.loc = src.loc
switch(scan_fossil(W))
if(1)
- src.visible_message("\red \icon[src] [src] scans the fossil and rejects it.")
+ src.visible_message("\red [bicon(src)] [src] scans the fossil and rejects it.")
if(2)
- visible_message("\red \icon[src] [src] can not extract any more genetic data from new fossils.")
+ visible_message("\red [bicon(src)] [src] can not extract any more genetic data from new fossils.")
if(4)
- src.visible_message("\blue \icon[src] [user] inserts [W] into [src], the fossil is consumed as [src] extracts genetic data from it.")
+ src.visible_message("\blue [bicon(src)] [user] inserts [W] into [src], the fossil is consumed as [src] extracts genetic data from it.")
qdel(W)
updateDialog()
- else if (istype(W, /obj/item/weapon/storage))
+ else if(istype(W, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = W
S.hide_from(usr)
var/numaccepted = 0
@@ -182,13 +182,13 @@ datum/genesequence
var/datum/genesequence/cloned_genesequence = completed_genesequences[sequence_num]
if(pod1)
if(pod1.occupant)
- visible_message("\red \icon[src] The cloning pod is currently occupied.")
+ visible_message("\red [bicon(src)] The cloning pod is currently occupied.")
else if(pod1.biomass < CLONE_BIOMASS)
- visible_message("\red \icon[src] Not enough biomass in the cloning pod.")
+ visible_message("\red [bicon(src)] Not enough biomass in the cloning pod.")
else if(pod1.mess)
- visible_message("\red \icon[src] Error: clonepod malfunction.")
+ visible_message("\red [bicon(src)] Error: clonepod malfunction.")
else
- visible_message("\blue \icon[src] [src] clones something from a reconstituted gene sequence!")
+ visible_message("\blue [bicon(src)] [src] clones something from a reconstituted gene sequence!")
playsound(src.loc, 'sound/effects/screech.ogg', 50, 1, -3)
pod1.occupant = new cloned_genesequence.spawned_type(pod1)
pod1.locked = 1
@@ -196,7 +196,7 @@ datum/genesequence
//pod1.occupant.name = "[pod1.occupant.name] ([rand(0,999)])"
pod1.biomass -= CLONE_BIOMASS
else
- to_chat(usr, "\red \icon[src] Unable to locate cloning pod!")
+ to_chat(usr, "\red [bicon(src)] Unable to locate cloning pod!")
else
..()
@@ -240,7 +240,7 @@ datum/genesequence
else if(href_list["clone"])
var/sequence_num = text2num(href_list["sequence_num"])
var/datum/genesequence/cloned_genesequence = completed_genesequences[sequence_num]
- visible_message("\blue \icon[src] [src] clones a packet of seeds from a reconstituted gene sequence!")
+ visible_message("\blue [bicon(src)] [src] clones a packet of seeds from a reconstituted gene sequence!")
playsound(src.loc, 'sound/effects/screech.ogg', 50, 1, -3)
new cloned_genesequence.spawned_type(src.loc)
diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm
index 77b6f688458..0e7c3736ca2 100644
--- a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm
+++ b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm
@@ -78,7 +78,7 @@
P.name = "[src] report #[++report_num]"
P.info = "[src] analysis report #[report_num] "
P.info += " "
- P.info += "\icon[scanned_object] [results]"
+ P.info += "[bicon(scanned_object)] [results]"
P.stamped = list(/obj/item/weapon/stamp)
P.overlays = list("paper_stamped")
diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm b/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm
index 017dcb7157d..9819275c0d1 100644
--- a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm
+++ b/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm
@@ -116,7 +116,7 @@
/obj/machinery/artifact_harvester/Topic(href, href_list)
- if (href_list["harvest"])
+ if(href_list["harvest"])
if(!inserted_battery)
src.visible_message("[src] states, \"Cannot harvest. No battery inserted.\"")
@@ -213,7 +213,7 @@
inserted_battery.battery_effect = E
inserted_battery.stored_charge = 0
- if (href_list["stopharvest"])
+ if(href_list["stopharvest"])
if(harvesting)
if(harvesting < 0 && inserted_battery.battery_effect && inserted_battery.battery_effect.activated)
inserted_battery.battery_effect.ToggleActivate()
@@ -224,11 +224,11 @@
src.visible_message("[name] states, \"Energy harvesting interrupted.\"")
icon_state = "incubator"
- if (href_list["ejectbattery"])
+ if(href_list["ejectbattery"])
src.inserted_battery.loc = src.loc
src.inserted_battery = null
- if (href_list["drainbattery"])
+ if(href_list["drainbattery"])
if(inserted_battery)
if(inserted_battery.battery_effect && inserted_battery.stored_charge > 0)
if(alert("This action will dump all charge, safety gear is recommended before proceeding","Warning","Continue","Cancel"))
diff --git a/code/modules/research/xenoarchaeology/machinery/coolant.dm b/code/modules/research/xenoarchaeology/machinery/coolant.dm
index b2dd9ce2a9e..f0750f6388e 100644
--- a/code/modules/research/xenoarchaeology/machinery/coolant.dm
+++ b/code/modules/research/xenoarchaeology/machinery/coolant.dm
@@ -1,29 +1,21 @@
-datum/reagent/coolant
+/datum/reagent/coolant
name = "Coolant"
id = "coolant"
description = "Industrial cooling substance."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
-datum/chemical_reaction/coolant
- name = "Coolant"
- id = "coolant"
- result = "coolant"
- required_reagents = list("tungsten" = 1, "oxygen" = 1, "water" = 1)
- result_amount = 3
-
-
-
/obj/structure/reagent_dispensers/coolanttank
name = "coolant tank"
desc = "A tank of industrial coolant"
icon = 'icons/obj/objects.dmi'
icon_state = "coolanttank"
amount_per_transfer_from_this = 10
- New()
- ..()
- reagents.add_reagent("coolant",1000)
+
+/obj/structure/reagent_dispensers/coolanttank/New()
+ ..()
+ reagents.add_reagent("coolant",1000)
/obj/structure/reagent_dispensers/coolanttank/bullet_act(var/obj/item/projectile/Proj)
if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
@@ -47,9 +39,9 @@ datum/chemical_reaction/coolant
var/datum/gas_mixture/env = src.loc.return_air()
if(env)
- if (reagents.total_volume > 750)
+ if(reagents.total_volume > 750)
env.temperature = 0
- else if (reagents.total_volume > 500)
+ else if(reagents.total_volume > 500)
env.temperature -= 100
else
env.temperature -= 50
diff --git a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm
index 22d644b5aa5..8bb917d3df4 100644
--- a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm
+++ b/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm
@@ -97,8 +97,8 @@
fresh_coolant = 0
coolant_purity = 0
var/num_reagent_types = 0
- for (var/datum/reagent/current_reagent in src.reagents.reagent_list)
- if (!current_reagent)
+ for(var/datum/reagent/current_reagent in src.reagents.reagent_list)
+ if(!current_reagent)
continue
var/cur_purity = coolant_reagents_purity[current_reagent.id]
if(!cur_purity)
@@ -144,7 +144,7 @@
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "geoscanner.tmpl", "High Res Radiocarbon Spectrometer", 900, 825)
@@ -228,16 +228,16 @@
//emergency stop if seal integrity reaches 0
if(scanner_seal_integrity <= 0 || (scanner_temperature >= 1273 && !rad_shield))
stop_scanning()
- src.visible_message("\blue \icon[src] buzzes unhappily. It has failed mid-scan!", 2)
+ src.visible_message("\blue [bicon(src)] buzzes unhappily. It has failed mid-scan!", 2)
if(prob(5))
- src.visible_message("\blue \icon[src] [pick("whirrs","chuffs","clicks")][pick(" excitedly"," energetically"," busily")].", 2)
+ src.visible_message("\blue [bicon(src)] [pick("whirrs","chuffs","clicks")][pick(" excitedly"," energetically"," busily")].", 2)
else
//gradually cool down over time
if(scanner_temperature > 0)
scanner_temperature = max(scanner_temperature - 5 - 10 * rand(), 0)
if(prob(0.75))
- src.visible_message("\blue \icon[src] [pick("plinks","hisses")][pick(" quietly"," softly"," sadly"," plaintively")].", 2)
+ src.visible_message("\blue [bicon(src)] [pick("plinks","hisses")][pick(" quietly"," softly"," sadly"," plaintively")].", 2)
last_process_worldtime = world.time
/obj/machinery/radiocarbon_spectrometer/proc/stop_scanning()
@@ -255,7 +255,7 @@
used_coolant = 0
/obj/machinery/radiocarbon_spectrometer/proc/complete_scan()
- src.visible_message("\blue \icon[src] makes an insistent chime.", 2)
+ src.visible_message("\blue [bicon(src)] makes an insistent chime.", 2)
if(scanned_item)
//create report
diff --git a/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm b/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm
index 9d6cf4fa460..11999b51d92 100644
--- a/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm
+++ b/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm
@@ -103,9 +103,9 @@
if(interval > 0)
//apply the touch effect to the holder
if(holder)
- to_chat(holder, "the \icon[src] [src] held by [holder] shudders in your grasp.")
+ to_chat(holder, "the [bicon(src)] [src] held by [holder] shudders in your grasp.")
else
- src.loc.visible_message("the \icon[src] [src] shudders.")
+ src.loc.visible_message("the [bicon(src)] [src] shudders.")
inserted_battery.battery_effect.DoEffectTouch(holder)
//consume power
@@ -131,13 +131,13 @@
//work out if we need to shutdown
if(inserted_battery.stored_charge <= 0)
- src.loc.visible_message("\blue \icon[src] [src] buzzes.", "\blue \icon[src] You hear something buzz.")
+ src.loc.visible_message("\blue [bicon(src)] [src] buzzes.", "\blue [bicon(src)] You hear something buzz.")
shutdown_emission()
else if(world.time > time_end)
- src.loc.visible_message("\blue \icon[src] [src] chimes.", "\blue \icon[src] You hear something chime.")
+ src.loc.visible_message("\blue [bicon(src)] [src] chimes.", "\blue [bicon(src)] You hear something chime.")
shutdown_emission()
else
- src.visible_message("\blue \icon[src] [src] buzzes.", "\blue \icon[src] You hear something buzz.")
+ src.visible_message("\blue [bicon(src)] [src] buzzes.", "\blue [bicon(src)] You hear something buzz.")
shutdown_emission()
last_process = world.time
@@ -164,7 +164,7 @@
if(href_list["startup"])
if(inserted_battery && inserted_battery.battery_effect && (inserted_battery.stored_charge > 0) )
activated = 1
- src.visible_message("\blue \icon[src] [src] whirrs.", "\icon[src]\blue You hear something whirr.")
+ src.visible_message("\blue [bicon(src)] [src] whirrs.", "[bicon(src)]\blue You hear something whirr.")
if(!inserted_battery.battery_effect.activated)
inserted_battery.battery_effect.ToggleActivate(1)
time_end = world.time + duration
@@ -195,7 +195,7 @@
return ..()
/obj/item/weapon/anodevice/attack(mob/living/M as mob, mob/living/user as mob, def_zone)
- if (!istype(M))
+ if(!istype(M))
return
if(activated && inserted_battery.battery_effect.effect == EFFECT_TOUCH && !isnull(inserted_battery))
diff --git a/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm b/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm
index 0d4e64d67ee..9e9de74e73e 100644
--- a/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm
+++ b/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm
@@ -5,21 +5,23 @@
desc = "A sealed bio suit capable of insulating against exotic alien energies"
icon_state = "engspace_suit"
item_state = "engspace_suit"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
+ species_fit = null
+ sprite_sheets = null
/obj/item/clothing/head/bio_hood/anomaly
name = "Anomaly hood"
desc = "A sealed bio hood capable of insulating against exotic alien energies."
icon_state = "engspace_helmet"
item_state = "engspace_helmet"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
/obj/item/clothing/suit/space/eva/anomaly
name = "Excavation suit"
desc = "A pressure resistant excavation suit partially capable of insulating against exotic alien energies."
icon_state = "cespace_suit"
item_state = "cespace_suit"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank)
/obj/item/clothing/head/helmet/space/eva/anomaly
@@ -27,4 +29,4 @@
desc = "A pressure resistant excavation hood partially capable of insulating against exotic alien energies."
icon_state = "cespace_helmet"
item_state = "cespace_helmet"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100)
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100)
diff --git a/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm b/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm
index c05eb88c8bb..3e7b4a05c12 100644
--- a/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm
+++ b/code/modules/research/xenoarchaeology/tools/bunsen_burner.dm
@@ -37,7 +37,7 @@
to_chat(user, "\red There is nothing on the [src].")
/obj/machinery/bunsen_burner/proc/try_heating()
- src.visible_message("\blue \icon[src] [src] hisses.")
+ src.visible_message("\blue [bicon(src)] [src] hisses.")
if(held_container && heating)
heated = 1
held_container.reagents.handle_reactions()
diff --git a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm
index 0a26c42a821..127502b85c2 100644
--- a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm
+++ b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm
@@ -22,7 +22,7 @@
/obj/machinery/suspension_gen/process()
//set background = 1
- if (suspension_field)
+ if(suspension_field)
cell.charge -= power_use
var/turf/T = get_turf(suspension_field)
@@ -126,11 +126,11 @@
if(href_list["select_field"])
field_type = href_list["select_field"]
else if(href_list["insertcard"])
- if (istype(usr, /mob/living/silicon))
+ if(istype(usr, /mob/living/silicon))
locked = 0
else
var/obj/item/I = usr.get_active_hand()
- if (istype(I, /obj/item/weapon/card))
+ if(istype(I, /obj/item/weapon/card))
usr.drop_item()
I.loc = src
auth_card = I
@@ -169,14 +169,14 @@
to_chat(user, "You remove the power cell ")
/obj/machinery/suspension_gen/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/screwdriver))
+ if(istype(W, /obj/item/weapon/screwdriver))
if(!open)
if(screwed)
screwed = 0
else
screwed = 1
to_chat(user, "You [screwed ? "screw" : "unscrew"] the battery panel. ")
- else if (istype(W, /obj/item/weapon/crowbar))
+ else if(istype(W, /obj/item/weapon/crowbar))
if(!locked)
if(!screwed)
if(!suspension_field)
@@ -192,7 +192,7 @@
to_chat(user, "Unscrew [src]'s battery panel first. ")
else
to_chat(user, "[src]'s security locks are engaged. ")
- else if (istype(W, /obj/item/weapon/wrench))
+ else if(istype(W, /obj/item/weapon/wrench))
if(!suspension_field)
if(anchored)
anchored = 0
@@ -205,7 +205,7 @@
desc = "It has stubby legs bolted up against it's body for stabilising."
else
to_chat(user, "You are unable to secure [src] while it is active! ")
- else if (istype(W, /obj/item/weapon/stock_parts/cell))
+ else if(istype(W, /obj/item/weapon/stock_parts/cell))
if(open)
if(cell)
to_chat(user, "There is a power cell already installed. ")
@@ -248,7 +248,7 @@
success = 1
for(var/mob/living/carbon/C in T)
C.AdjustWeakened(5)
- C.visible_message("\blue \icon[C] [C] begins to float in the air!","You feel tingly and light, but it is difficult to move.")
+ C.visible_message("\blue [bicon(C)] [C] begins to float in the air!","You feel tingly and light, but it is difficult to move.")
if("nitrogen")
success = 1
//
@@ -271,19 +271,19 @@
success = 1
for(var/mob/living/silicon/R in T)
R.AdjustWeakened(5)
- R.visible_message("\blue \icon[R] [R] begins to float in the air!","You feel tingly and light, but it is difficult to move.")
+ R.visible_message("\blue [bicon(R)] [R] begins to float in the air!","You feel tingly and light, but it is difficult to move.")
//
//in case we have a bad field type
if(!success)
return
for(var/mob/living/simple_animal/C in T)
- C.visible_message("\blue \icon[C] [C] begins to float in the air!","You feel tingly and light, but it is difficult to move.")
+ C.visible_message("\blue [bicon(C)] [C] begins to float in the air!","You feel tingly and light, but it is difficult to move.")
C.AdjustWeakened(5)
suspension_field = new(T)
suspension_field.field_type = field_type
- src.visible_message("\blue \icon[src] [src] activates with a low hum.")
+ src.visible_message("\blue [bicon(src)] [src] activates with a low hum.")
icon_state = "suspension3"
for(var/obj/item/I in T)
@@ -293,7 +293,7 @@
if(collected)
suspension_field.icon_state = "energynet"
suspension_field.overlays += "shield2"
- src.visible_message("\blue \icon[suspension_field] [suspension_field] gently absconds [collected > 1 ? "something" : "several things"].")
+ src.visible_message("\blue [bicon(suspension_field)] [suspension_field] gently absconds [collected > 1 ? "something" : "several things"].")
else
if(istype(T,/turf/simulated/mineral) || istype(T,/turf/simulated/wall))
suspension_field.icon_state = "shieldsparkles"
@@ -308,7 +308,7 @@
to_chat(M, "You no longer feel like floating. ")
M.SetWeakened(min(M.weakened, 3))
- src.visible_message("\blue \icon[src] [src] deactivates with a gentle shudder.")
+ src.visible_message("\blue [bicon(src)] [src] deactivates with a gentle shudder.")
qdel(suspension_field)
icon_state = "suspension2"
diff --git a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm
index 3ae1c15f660..d020845784c 100644
--- a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm
+++ b/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/xenoarchaeology.dmi'
icon_state = "flashgun"
item_state = "lampgreen"
- w_class = 1.0
+ w_class = 1
slot_flags = SLOT_BELT
var/nearest_artifact_id = "unknown"
var/nearest_artifact_distance = -1
diff --git a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm
index c1d8bda97ee..e8daea89b74 100644
--- a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm
+++ b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm
@@ -19,7 +19,7 @@
icon = 'icons/obj/device.dmi'
icon_state = "sampler0"
item_state = "screwdriver_brown"
- w_class = 1.0
+ w_class = 1
//slot_flags = SLOT_BELT
var/sampled_turf = ""
var/num_stored_bags = 10
diff --git a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm
index 6bf829ba220..69812bdaa3f 100644
--- a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm
+++ b/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm
@@ -9,7 +9,7 @@
icon = 'icons/obj/pda.dmi'
icon_state = "crap"
item_state = "analyzer"
- w_class = 1.0
+ w_class = 1
slot_flags = SLOT_BELT
var/list/positive_locations = list()
var/datum/depth_scan/current
@@ -46,7 +46,7 @@
positive_locations.Add(D)
for(var/mob/L in range(src, 1))
- to_chat(L, "\blue \icon[src] [src] pings.")
+ to_chat(L, "\blue [bicon(src)] [src] pings.")
else if(istype(A,/obj/structure/boulder))
var/obj/structure/boulder/B = A
@@ -65,7 +65,7 @@
positive_locations.Add(D)
for(var/mob/L in range(src, 1))
- to_chat(L, "\blue \icon[src] [src] pings [pick("madly","wildly","excitedly","crazily")]!.")
+ to_chat(L, "\blue [bicon(src)] [src] pings [pick("madly","wildly","excitedly","crazily")]!.")
/obj/item/device/depth_scanner/attack_self(var/mob/user as mob)
return src.interact(user)
diff --git a/code/modules/research/xenoarchaeology/tools/tools_locater.dm b/code/modules/research/xenoarchaeology/tools/tools_locater.dm
index 751476a6579..1ceb45d00e6 100644
--- a/code/modules/research/xenoarchaeology/tools/tools_locater.dm
+++ b/code/modules/research/xenoarchaeology/tools/tools_locater.dm
@@ -52,9 +52,9 @@
scan_ticks = 0
var/turf/T = get_turf(src)
if(target_radio)
- T.visible_message("\icon[src] [src] [pick("chirps","chirrups","cheeps")] happily.")
+ T.visible_message("[bicon(src)] [src] [pick("chirps","chirrups","cheeps")] happily.")
else
- T.visible_message("\icon[src] [src] [pick("chirps","chirrups","cheeps")] sadly.")
+ T.visible_message("[bicon(src)] [src] [pick("chirps","chirrups","cheeps")] sadly.")
else
icon_state = "pinoff"
@@ -86,7 +86,7 @@
target_radio = null
else if(href_list["freq"])
var/new_frequency = (frequency + text2num(href_list["freq"]))
- if (frequency < RADIO_LOW_FREQ || frequency > RADIO_HIGH_FREQ)
+ if(frequency < RADIO_LOW_FREQ || frequency > RADIO_HIGH_FREQ)
new_frequency = sanitize_frequency(new_frequency, 1499)
frequency = new_frequency
diff --git a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm b/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
index 48a5e0514d4..1dd6b769390 100644
--- a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
+++ b/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
@@ -111,7 +111,7 @@
attack_self(var/mob/user as mob)
var/N = input("Excavation amount (in centimeters):", "[src]") as null|anything in possible_excavation_amounts
- if (N)
+ if(N)
excavation_amount = N / 2
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
index 96746f780d8..4eb8d06ceb3 100644
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ b/code/modules/research/xenobiology/xenobio_camera.dm
@@ -16,11 +16,11 @@
name = "Slime management console"
desc = "A computer used for remotely handling slimes."
networks = list("SS13")
- off_action = new/datum/action/camera_off/xenobio
- var/datum/action/slime_place/slime_place_action = new
- var/datum/action/slime_pick_up/slime_up_action = new
- var/datum/action/feed_slime/feed_slime_action = new
- var/datum/action/monkey_recycle/monkey_recycle_action = new
+ off_action = new /datum/action/innate/camera_off/xenobio
+ var/datum/action/innate/slime_place/slime_place_action = new
+ var/datum/action/innate/slime_pick_up/slime_up_action = new
+ var/datum/action/innate/feed_slime/feed_slime_action = new
+ var/datum/action/innate/monkey_recycle/monkey_recycle_action = new
var/list/stored_slimes = list()
var/max_slimes = 5
@@ -62,7 +62,7 @@
return
return ..()
-/datum/action/camera_off/xenobio/Activate()
+/datum/action/innate/camera_off/xenobio/Activate()
if(!target || !ishuman(target))
return
var/mob/living/carbon/C = target
@@ -88,12 +88,11 @@
src.Remove(C)
-/datum/action/slime_place
+/datum/action/innate/slime_place
name = "Place Slimes"
- action_type = AB_INNATE
button_icon_state = "slime_down"
-/datum/action/slime_place/Activate()
+/datum/action/innate/slime_place/Activate()
if(!target || !ishuman(owner))
return
var/mob/living/carbon/human/C = owner
@@ -106,12 +105,11 @@
S.visible_message("[S] warps in!")
X.stored_slimes -= S
-/datum/action/slime_pick_up
+/datum/action/innate/slime_pick_up
name = "Pick up Slime"
- action_type = AB_INNATE
button_icon_state = "slime_up"
-/datum/action/slime_pick_up/Activate()
+/datum/action/innate/slime_pick_up/Activate()
if(!target || !ishuman(owner))
return
var/mob/living/carbon/human/C = owner
@@ -131,12 +129,11 @@
X.stored_slimes += S
-/datum/action/feed_slime
+/datum/action/innate/feed_slime
name = "Feed Slimes"
- action_type = AB_INNATE
button_icon_state = "monkey_down"
-/datum/action/feed_slime/Activate()
+/datum/action/innate/feed_slime/Activate()
if(!target || !ishuman(owner))
return
var/mob/living/carbon/human/C = owner
@@ -151,12 +148,11 @@
to_chat(owner, "[X] now has [X.monkeys] monkeys left.")
-/datum/action/monkey_recycle
+/datum/action/innate/monkey_recycle
name = "Recycle Monkeys"
- action_type = AB_INNATE
button_icon_state = "monkey_up"
-/datum/action/monkey_recycle/Activate()
+/datum/action/innate/monkey_recycle/Activate()
if(!target || !ishuman(owner))
return
var/mob/living/carbon/human/C = owner
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index de551e94b75..e3a59183abf 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -125,7 +125,7 @@
origin_tech = "biotech=4"
/obj/item/slimepotion/afterattack(obj/item/weapon/reagent_containers/target, mob/user , proximity)
- if (istype(target))
+ if(istype(target))
to_chat(user, "You cannot transfer [src] to [target]! It appears the potion must be given directly to a slime to absorb. ") // le fluff faec
return
@@ -154,7 +154,7 @@
qdel(M)
var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN))
- if (!newname)
+ if(!newname)
newname = "pet slime"
pet.name = newname
pet.real_name = newname
@@ -168,7 +168,7 @@
qdel(M)
var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN))
- if (!newname)
+ if(!newname)
newname = "pet slime"
pet.name = newname
pet.real_name = newname
diff --git a/code/modules/ruins/ruin_areas.dm b/code/modules/ruins/ruin_areas.dm
new file mode 100644
index 00000000000..fc51dcc0155
--- /dev/null
+++ b/code/modules/ruins/ruin_areas.dm
@@ -0,0 +1,49 @@
+//Parent types
+
+/area/ruin/
+ name = "\improper Unexplored Location"
+ icon_state = "away"
+ has_gravity = 1
+ there_can_be_many = 1
+
+
+/area/ruin/unpowered
+ always_unpowered = 0
+
+/area/ruin/unpowered/no_grav
+ has_gravity = 0
+
+/area/ruin/powered
+ requires_power = 0
+
+
+
+
+//Areas
+
+/area/ruin/unpowered/no_grav/way_home
+ name = "\improper Salvation"
+ icon_state = "away"
+
+/area/ruin/powered/snow_biodome
+
+/area/ruin/powered/golem_ship
+ name = "Free Golem Ship"
+
+// Ruins of "onehalf" ship
+/area/ruin/onehalf/hallway
+ name = "Hallway"
+ icon_state = "hallC"
+
+
+/area/ruin/onehalf/drone_bay
+ name = "Mining Drone Bay"
+ icon_state = "engine"
+
+/area/ruin/onehalf/dorms_med
+ name = "Crew Quarters"
+ icon_state = "Sleep"
+
+/area/ruin/onehalf/bridge
+ name = "Bridge"
+ icon_state = "bridge"
diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm
index 273ccb67d0e..722c21e3ef3 100644
--- a/code/modules/scripting/Implementations/Telecomms.dm
+++ b/code/modules/scripting/Implementations/Telecomms.dm
@@ -60,7 +60,7 @@
return
interpreter.container = src
-
+
interpreter.CreateGlobalScope() // Reset the variables.
interpreter.curScope = interpreter.globalScope
@@ -242,7 +242,14 @@
/* Okay, so, the original 'sanitizing' code... did fucking nothing. Then PJB fixed it, which means no HTML.
But I like HTML, so back to no sanitizing.*/
- signal.data["message"] = interpreter.GetVar("$content", signal.data["message"])
+ var/message = interpreter.GetVar("$content")
+ var/regex/bannedTags = new ("(
-
-
[left_part]
-
+
[list_queue()]
-
-
- "}
- user << browse(dat, "window=mecha_fabricator;size=1000x430")
+
"}
+ var/datum/browser/popup = new(user, "mecha_fabricator", name, 1000, 430)
+ popup.set_content(dat)
+ popup.open(0)
onclose(user, "mecha_fabricator")
return
@@ -430,7 +427,7 @@
if(href_list["custom_eject"])
amount = input("How many sheets would you like to eject from the machine?", "How much?", 1) as null|num
amount = max(0,min(round(resources[material]/MINERAL_MATERIAL_AMOUNT),amount)) // Rounding errors aren't scary, as the mineral eject proc is smart
- if (!amount)
+ if(!amount)
return
amount = round(amount)
if(amount < 0 || amount > resources[material]) //href protection
diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm
index 2156977d6fe..a7cd09b63ac 100644
--- a/code/modules/spacepods/spacepod.dm
+++ b/code/modules/spacepods/spacepod.dm
@@ -82,7 +82,7 @@
cargo_hold.max_combined_w_class = 0 //you can optimize your stash with larger items
/obj/spacepod/Destroy()
- if (equipment_system.cargo_system)
+ if(equipment_system.cargo_system)
equipment_system.cargo_system.removed(null)
qdel(equipment_system)
equipment_system = null
@@ -168,14 +168,14 @@
S.channel = 0 //Any channel
S.volume = 50
for(var/mob/M in passengers)
- to_chat(M, S)
+ M << S
if(passengers && oldhealth > health && !health)
var/sound/S = sound('sound/effects/engine_alert1.ogg')
S.wait = 0
S.channel = 0
S.volume = 50
for(var/mob/M in passengers)
- to_chat(M, S)
+ M << S
if(!health)
spawn(0)
if(passengers)
@@ -294,7 +294,7 @@
if(istype(W, /obj/item/device/spacepod_key) && istype(equipment_system.lock_system, /obj/item/device/spacepod_equipment/lock/keyed))
var/obj/item/device/spacepod_key/key = W
- if (key.id == equipment_system.lock_system.id)
+ if(key.id == equipment_system.lock_system.id)
lock_pod()
return
else
@@ -309,7 +309,7 @@
if(!WT.isOn())
to_chat(user, "\red The welder must be on for this task.")
return
- if (health < initial(health))
+ if(health < initial(health))
to_chat(user, "\blue You start welding the spacepod...")
playsound(loc, 'sound/items/Welder.ogg', 50, 1)
if(do_after(user, 20, target = src))
@@ -322,7 +322,7 @@
if(istype(W, /obj/item/device/lock_buster))
var/obj/item/device/lock_buster/L = W
- if(L.on & equipment_system.lock_system)
+ if(L.on && equipment_system.lock_system)
user.visible_message(user, "[user] is drilling through the [src]'s lock! ",
"You start drilling through the [src]'s lock! ")
if(do_after(user, 100, target = src))
@@ -467,7 +467,7 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
L += S.return_inv()
for(var/obj/item/weapon/gift/G in src)
L += G.gift
- if (istype(G.gift, /obj/item/weapon/storage))
+ if(istype(G.gift, /obj/item/weapon/storage))
var/obj/item/weapon/storage/inv = G.gift
L += inv.return_inv()
return L
@@ -645,7 +645,7 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
to_chat(user, "\The [src] already has \an [C.storage] ")
/obj/spacepod/proc/enter_pod(mob/user)
- if (usr.stat != CONSCIOUS)
+ if(usr.stat != CONSCIOUS)
return 0
if(equipment_system.lock_system && !unlocked)
@@ -732,7 +732,7 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
if(!istype(user))
return
- if (user.stat != CONSCIOUS || user.incapacitated()) // unconscious and restrained people can't let themselves out
+ if(user.stat != CONSCIOUS || user.incapacitated()) // unconscious and restrained people can't let themselves out
return
occupant_sanity_check()
@@ -939,8 +939,8 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/device/spacepod_equipment
if(moveship)
Move(get_step(src, direction), direction)
if(equipment_system.cargo_system)
- for (var/turf/T in locs)
- for (var/obj/item/I in T.contents)
+ for(var/turf/T in locs)
+ for(var/obj/item/I in T.contents)
equipment_system.cargo_system.passover(I)
else
diff --git a/code/modules/spacial_allocator/zlevel.dm b/code/modules/spacial_allocator/zlevel.dm
new file mode 100644
index 00000000000..8b8bec70b87
--- /dev/null
+++ b/code/modules/spacial_allocator/zlevel.dm
@@ -0,0 +1,73 @@
+/datum/zlevel
+ var/flags = 0
+ var/dirt_count = 0
+ var/zpos
+ var/list/init_list = list()
+
+/datum/zlevel/New(z)
+ zpos = z
+
+/datum/zlevel/proc/resume_init()
+ if(dirt_count > 0)
+ throw EXCEPTION("Init told to resume when z-level still dirty. Z level: '[zpos]'")
+ log_debug("Releasing freeze on z-level '[zpos]'!")
+ log_debug("Beginning initialization!")
+ var/list/our_atoms = init_list // OURS NOW!!! (Keeping this list to ourselves will prevent hijack)
+ init_list = list()
+ var/list/late_maps = list()
+ var/list/pipes = list()
+ var/list/cables = list()
+ var/watch = start_watch()
+ for(var/schmoo in our_atoms)
+ var/atom/movable/AM = schmoo
+ if(AM) // to catch stuff like the nuke disk that no longer exists
+
+ // This can mess with our state - we leave these for last
+ if(istype(AM, /obj/effect/landmark/map_loader))
+ late_maps.Add(AM)
+ continue
+ AM.initialize()
+ if(istype(AM, /obj/machinery/atmospherics))
+ pipes.Add(AM)
+ else if(istype(AM, /obj/structure/cable))
+ cables.Add(AM)
+ log_debug("Primary initialization finished in [stop_watch(watch)]s.")
+ our_atoms.Cut()
+ if(pipes.len)
+ do_pipes(pipes)
+ if(cables.len)
+ do_cables(cables)
+ if(late_maps.len)
+ do_late_maps(late_maps)
+
+/datum/zlevel/proc/do_pipes(list/pipes)
+ var/watch = start_watch()
+ log_debug("Building pipenets on z-level '[zpos]'!")
+ for(var/schmoo in pipes)
+ var/obj/machinery/atmospherics/machine = schmoo
+ if(machine)
+ machine.build_network()
+ pipes.Cut()
+ log_debug("Took [stop_watch(watch)]s")
+
+/datum/zlevel/proc/do_cables(list/cables)
+ var/watch = start_watch()
+ log_debug("Building powernets on z-level '[zpos]'!")
+ for(var/schmoo in cables)
+ var/obj/structure/cable/C = schmoo
+ if(C)
+ makepowernet_for(C)
+ cables.Cut()
+ log_debug("Took [stop_watch(watch)]s")
+
+/datum/zlevel/proc/do_late_maps(list/late_maps)
+ var/watch = start_watch()
+ log_debug("Loading map templates on z-level '[zpos]'!")
+ zlevels.add_dirt(zpos) // Let's not repeatedly resume init for each template
+ for(var/schmoo in late_maps)
+ var/obj/effect/landmark/map_loader/ML = schmoo
+ if(ML)
+ ML.initialize()
+ late_maps.Cut()
+ zlevels.remove_dirt(zpos)
+ log_debug("Took [stop_watch(watch)]s")
diff --git a/code/modules/spacial_allocator/zlevel_manager.dm b/code/modules/spacial_allocator/zlevel_manager.dm
new file mode 100644
index 00000000000..3c6fb0a0048
--- /dev/null
+++ b/code/modules/spacial_allocator/zlevel_manager.dm
@@ -0,0 +1,89 @@
+var/global/datum/zlev_manager/zlevels = new
+
+/datum/zlev_manager
+ // A list of z-levels
+ var/list/z_list = list()
+
+
+// Populate our z level list
+/datum/zlev_manager/proc/initialize()
+ z_list.len = world.maxz
+ for(var/i = 1, i <= world.maxz, i++)
+ z_list[i] = new /datum/zlevel(i)
+
+
+
+/datum/zlev_manager/proc/get_zlev(z)
+ if(z < 1)
+ throw EXCEPTION("Non-positive z level given!")
+ else if(z > z_list.len)
+ throw EXCEPTION("Untracked z level: '[z]'")
+ else
+ return z_list[z]
+
+// For when you need the z-level to be at a certain point
+/datum/zlev_manager/proc/increase_max_zlevel_to(new_maxz)
+ if(world.maxz>=new_maxz)
+ return
+ while(world.maxznew_maxz)
+ kill_topmost_zlevel()
+
+// Decrements the max z-level by one
+// not normally used, but hey the swapmap loader wanted it
+/datum/zlev_manager/proc/kill_topmost_zlevel()
+ var/our_z = world.maxz
+ qdel(z_list[our_z])
+ z_list.len--
+ world.maxz--
+
+/*
+* "Dirt" management
+* "Dirt" is used to keep track of whether a z level should automatically have
+* stuff on it initialize or not - the map loaders, when set to defer init, place
+* a freeze on the z levels they touch so as to prevent atmos from exploding,
+* among other things
+*/
+
+
+// Returns whether the given z level has a freeze on initialization
+/datum/zlev_manager/proc/is_zlevel_dirty(z)
+ var/datum/zlevel/our_z = get_zlev(z)
+ return (our_z.dirt_count > 0)
+
+
+// Increases the dirt count on a z level
+/datum/zlev_manager/proc/add_dirt(z)
+ var/datum/zlevel/our_z = get_zlev(z)
+ if(our_z.dirt_count == 0)
+ log_debug("Placing an init freeze on z-level '[our_z.zpos]'!")
+ our_z.dirt_count++
+
+
+// Decreases the dirt count on a z level
+/datum/zlev_manager/proc/remove_dirt(z)
+ var/datum/zlevel/our_z = get_zlev(z)
+ our_z.dirt_count--
+ if(our_z.dirt_count == 0)
+ our_z.resume_init()
+ if(our_z.dirt_count < 0)
+ log_debug("WARNING: Imbalanced dirt removal")
+ our_z.dirt_count = 0
+
+/datum/zlev_manager/proc/postpone_init(z, thing)
+ var/datum/zlevel/our_z = get_zlev(z)
+ our_z.init_list.Add(thing)
diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm
index 66ce40bf4cf..a32186f2827 100644
--- a/code/modules/surgery/bones.dm
+++ b/code/modules/surgery/bones.dm
@@ -47,7 +47,7 @@
/datum/surgery_step/glue_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (affected.stage == 0)
+ if(affected.stage == 0)
user.visible_message("[user] starts applying medication to the damaged bones in [target]'s [affected.name] with \the [tool]." , \
"You start applying medication to the damaged bones in [target]'s [affected.name] with \the [tool].")
target.custom_pain("Something in your [affected.name] is causing you a lot of pain!",1)
@@ -90,7 +90,7 @@
/datum/surgery_step/set_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (affected.status & ORGAN_BROKEN)
+ if(affected.status & ORGAN_BROKEN)
user.visible_message(" [user] sets the bone in [target]'s [affected.name] in place with \the [tool]. ", \
" You set the bone in [target]'s [affected.name] in place with \the [tool]. ")
affected.stage = 2
diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm
index 2810617bd12..2595d9bf95d 100644
--- a/code/modules/surgery/dental_implant.dm
+++ b/code/modules/surgery/dental_implant.dm
@@ -47,7 +47,7 @@
name = "Activate Pill"
/datum/action/item_action/hands_free/activate_pill/Trigger()
- if(!Checks())
+ if(!..())
return
to_chat(owner, "You grit your teeth and burst the implanted [target]! ")
add_logs(owner, null, "swallowed an implanted pill", target)
diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm
index 4c4a328bc0a..90460f34c21 100644
--- a/code/modules/surgery/encased.dm
+++ b/code/modules/surgery/encased.dm
@@ -9,7 +9,7 @@
/datum/surgery_step/open_encased/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -27,14 +27,14 @@
time = 54
/datum/surgery_step/open_encased/saw/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return ..() && affected && affected.open == 2
/datum/surgery_step/open_encased/saw/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -45,7 +45,7 @@
/datum/surgery_step/open_encased/saw/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -56,7 +56,7 @@
/datum/surgery_step/open_encased/saw/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -80,14 +80,14 @@
time = 24
/datum/surgery_step/open_encased/retract/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return ..() && affected && affected.open == 2.5
/datum/surgery_step/open_encased/retract/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -99,7 +99,7 @@
/datum/surgery_step/open_encased/retract/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -113,7 +113,7 @@
/datum/surgery_step/open_encased/retract/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -138,14 +138,14 @@
/datum/surgery_step/open_encased/close/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return ..() && affected && affected.open == 3
/datum/surgery_step/open_encased/close/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -157,7 +157,7 @@
/datum/surgery_step/open_encased/close/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -171,7 +171,7 @@
/datum/surgery_step/open_encased/close/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -195,14 +195,14 @@
/datum/surgery_step/open_encased/mend/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return ..() && affected && affected.open == 2.5
/datum/surgery_step/open_encased/mend/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -214,7 +214,7 @@
/datum/surgery_step/open_encased/mend/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm
index aac39bacf8c..1c1ad5dfa1d 100644
--- a/code/modules/surgery/face.dm
+++ b/code/modules/surgery/face.dm
@@ -24,10 +24,10 @@
can_infect = 0
/datum/surgery_step/face/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (!affected || (affected.status & ORGAN_ROBOT))
+ if(!affected || (affected.status & ORGAN_ROBOT))
return 0
return target_zone == "mouth"
@@ -159,7 +159,7 @@
" You cauterize the incision on [target]'s face and neck with \the [tool]. ")
affected.open = 0
affected.status &= ~ORGAN_BLEEDING
- //if (target.op_stage.face == 3)//I NEED TO REPLACE THE OPSTAGE SHIT!
+ //if(target.op_stage.face == 3)//I NEED TO REPLACE THE OPSTAGE SHIT!
var/obj/item/organ/external/head/h = affected
h.disfigured = 0
h.update_icon()
diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm
index 842eaf84af5..d02787eb3b5 100644
--- a/code/modules/surgery/generic.dm
+++ b/code/modules/surgery/generic.dm
@@ -7,16 +7,16 @@
can_infect = 1
/datum/surgery_step/generic/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (target_zone == "eyes") //there are specific steps for eye surgery
+ if(target_zone == "eyes") //there are specific steps for eye surgery
return 0
- if (!hasorgans(target))
+ if(!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (affected == null)
+ if(affected == null)
return 0
- if (affected.status & ORGAN_DESTROYED)
+ if(affected.status & ORGAN_DESTROYED)
return 0
- if (affected.status & ORGAN_ROBOT)
+ if(affected.status & ORGAN_ROBOT)
return 0
return 1
@@ -130,10 +130,10 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
var/msg = "[user] starts to pry open the incision on [target]'s [affected.name] with \the [tool]."
var/self_msg = "You start to pry open the incision on [target]'s [affected.name] with \the [tool]."
- if (target_zone == "chest")
+ if(target_zone == "chest")
msg = "[user] starts to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
self_msg = "You start to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
- if (target_zone == "groin")
+ if(target_zone == "groin")
msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
user.visible_message(msg, self_msg)
@@ -144,10 +144,10 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
var/msg = " [user] keeps the incision open on [target]'s [affected.name] with \the [tool]. "
var/self_msg = " You keep the incision open on [target]'s [affected.name] with \the [tool]. "
- if (target_zone == "chest")
+ if(target_zone == "chest")
msg = " [user] keeps the ribcage open on [target]'s torso with \the [tool]. "
self_msg = " You keep the ribcage open on [target]'s torso with \the [tool]."
- if (target_zone == "groin")
+ if(target_zone == "groin")
msg = " [user] keeps the incision open on [target]'s lower abdomen with \the [tool]. "
self_msg = " You keep the incision open on [target]'s lower abdomen with \the [tool]. "
user.visible_message(msg, self_msg)
@@ -158,10 +158,10 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
var/msg = " [user]'s hand slips, tearing the edges of incision on [target]'s [affected.name] with \the [tool]! "
var/self_msg = " Your hand slips, tearing the edges of incision on [target]'s [affected.name] with \the [tool]! "
- if (target_zone == "chest")
+ if(target_zone == "chest")
msg = " [user]'s hand slips, damaging several organs [target]'s torso with \the [tool]! "
self_msg = " Your hand slips, damaging several organs [target]'s torso with \the [tool]! "
- if (target_zone == "groin")
+ if(target_zone == "groin")
msg = " [user]'s hand slips, damaging several organs [target]'s lower abdomen with \the [tool] "
self_msg = " Your hand slips, damaging several organs [target]'s lower abdomen with \the [tool]! "
user.visible_message(msg, self_msg)
@@ -239,14 +239,14 @@
time = 100
/datum/surgery_step/generic/amputate/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (target_zone == "eyes") //there are specific steps for eye surgery
+ if(target_zone == "eyes") //there are specific steps for eye surgery
return 0
- if (!hasorgans(target))
+ if(!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (affected == null)
+ if(affected == null)
return 0
- if (affected.status & ORGAN_DESTROYED)
+ if(affected.status & ORGAN_DESTROYED)
return 0
return !affected.cannot_amputate
diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm
index 88b2f42416c..1aec72f1d63 100644
--- a/code/modules/surgery/implant.dm
+++ b/code/modules/surgery/implant.dm
@@ -42,22 +42,22 @@
return affected && affected.open == (affected.encased ? 3 : 2) && !(affected.status & ORGAN_BLEEDING)
/datum/surgery_step/cavity/proc/get_max_wclass(obj/item/organ/external/affected)
- switch (affected.limb_name)
- if ("head")
+ switch(affected.limb_name)
+ if("head")
return 1
- if ("chest")
+ if("chest")
return 3
- if ("groin")
+ if("groin")
return 2
return 0
/datum/surgery_step/cavity/proc/get_cavity(obj/item/organ/external/affected)
- switch (affected.limb_name)
- if ("head")
+ switch(affected.limb_name)
+ if("head")
return "cranial"
- if ("chest")
+ if("chest")
return "thoracic"
- if ("groin")
+ if("groin")
return "abdominal"
return ""
@@ -142,7 +142,7 @@
/datum/surgery_step/cavity/place_item/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!ishuman(target))
+ if(!ishuman(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
var/can_fit = affected && !affected.hidden && affected.cavity && tool.w_class <= get_max_wclass(affected)
@@ -292,10 +292,10 @@
/datum/surgery_step/cavity/implant_removal/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
..()
var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
- if (affected.implants.len)
+ if(affected.implants.len)
var/fail_prob = 10
fail_prob += 100 - tool_quality(tool)
- if (prob(fail_prob))
+ if(prob(fail_prob))
var/obj/item/weapon/implant/imp = affected.implants[1]
user.visible_message(" Something beeps inside [target]'s [affected.name]! ")
playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3)
diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm
index 8c0d20224e9..ad0a1973b8f 100644
--- a/code/modules/surgery/limb_reattach.dm
+++ b/code/modules/surgery/limb_reattach.dm
@@ -68,10 +68,10 @@
/datum/surgery_step/limb/
can_infect = 0
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (affected)
+ if(affected)
return 0
var/list/organ_data = target.species.has_limbs["[target_zone]"]
return !isnull(organ_data)
@@ -95,6 +95,11 @@
E.replaced(target)
E.forceMove(target)
if(target.get_species() == "Machine")//as this is the only step needed for ipc put togethers
+ if(!(E.dna) && E.robotic == 2 && target.dna)
+ E.dna = target.dna.Clone()
+ if(!E.blood_DNA)
+ E.blood_DNA = list()
+ E.blood_DNA[target.dna.unique_enzymes] = target.dna.b_type
if(target_zone == "head")
var/obj/item/organ/external/head/H = target.get_organ("head")
var/datum/robolimb/robohead = all_robolimbs[H.model]
@@ -170,8 +175,8 @@
/datum/surgery_step/limb/mechanize/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/obj/item/robot_parts/p = tool
- if (p.part)
- if (!(target_zone in p.part))
+ if(p.part)
+ if(!(target_zone in p.part))
return 0
return isnull(target.get_organ(target_zone))
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index b753bcf71a5..2fa12d1a0dc 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -49,7 +49,7 @@
implant_color = "#DE7E00"
slot = "brain_antidrop"
origin_tech = "materials=5;programming=4;biotech=4"
- organ_action_name = "Toggle Anti-Drop"
+ actions_types = list(/datum/action/item_action/organ_action/toggle)
/obj/item/organ/internal/cyberimp/brain/anti_drop/ui_action_click()
active = !active
@@ -263,7 +263,7 @@
implant_color = "#007ACC"
slot = "shoulders"
origin_tech = "materials=5;biotech=4;powerstorage=4"
- organ_action_name = "Toggle Arm Mod"
+ actions_types = list(/datum/action/item_action/organ_action/toggle)
var/obj/holder//is defined as the retractable item itself. ensure this is defined somewhere!
var/out = 0//determines if the item is in the owner's hand or not
var/overloaded = 0//is set to 1 when owner gets EMPed. if set to 1, implant doesn't work.
@@ -319,7 +319,7 @@
desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arms and remains in the shoulders when not in use."
icon_state = "armcannon_tase_implant"
origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4"
- organ_action_name = "Toggle Arm Cannon Taser"
+ actions_types = list(/datum/action/item_action/organ_action/toggle)
/obj/item/organ/internal/cyberimp/chest/arm_mod/tase/New()//when the implant is created...
holder = new /obj/item/weapon/gun/energy/gun/advtaser/mounted(src)//assign a brand new item to it. (in this case, a gun)
@@ -329,7 +329,7 @@
desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arms and remains in the shoulders when not in use."
icon_state = "armcannon_lase_implant"
origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4;syndicate=5"//this is kinda nutty and i might lower it
- organ_action_name = "Toggle Arm Cannon Laser"
+ actions_types = list(/datum/action/item_action/organ_action/toggle)
/obj/item/organ/internal/cyberimp/chest/arm_mod/lase/New()
holder = new /obj/item/weapon/gun/energy/laser/mounted(src)
diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm
index c1a1c7562a9..d549b2ec997 100644
--- a/code/modules/surgery/organs/blood.dm
+++ b/code/modules/surgery/organs/blood.dm
@@ -1,14 +1,8 @@
/****************************************************
BLOOD SYSTEM
****************************************************/
-//Blood levels
-var/const/BLOOD_VOLUME_SAFE = 501
-var/const/BLOOD_VOLUME_OKAY = 336
-var/const/BLOOD_VOLUME_BAD = 224
-var/const/BLOOD_VOLUME_SURVIVE = 122
/mob/living/carbon/human/var/datum/reagents/vessel //Container for blood and BLOOD ONLY. Do not transfer other chems here.
-/mob/living/carbon/human/var/var/pale = 0 //Should affect how mob sprite is drawn, but currently doesn't.
//Initializes blood vessels
/mob/living/carbon/human/proc/make_blood()
@@ -60,12 +54,8 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
blood_volume = round(vessel.get_reagent_amount(blood_reagent))
if(blood_volume < max_blood && blood_volume)
vessel.add_reagent(blood_reagent, 0.1) // regenerate blood VERY slowly
- if (reagents.has_reagent("nutriment")) //Getting food speeds it up
+ if(reagents.has_reagent(blood_reagent))
vessel.add_reagent(blood_reagent, 0.4)
- reagents.remove_reagent("nutriment", 0.1)
- else if (reagents.has_reagent(blood_reagent))
- vessel.add_reagent(blood_reagent, 0.4)
- reagents.remove_reagent(blood_reagent, 0.4)
else
blood_volume = round(vessel.get_reagent_amount("blood"))
@@ -73,14 +63,13 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
if(blood_volume < max_blood && blood_volume)
var/datum/reagent/blood/B = locate() in vessel.reagent_list //Grab some blood
if(B) // Make sure there's some blood at all
-
- if(src.mind) //Handles vampires "eating" blood that isn't their own.
- if(src.mind in ticker.mode.vampires)
+ if(mind) //Handles vampires "eating" blood that isn't their own.
+ if(mind in ticker.mode.vampires)
for(var/datum/reagent/blood/BL in vessel.reagent_list)
- if(src.nutrition >= 450)
+ if(nutrition >= 450)
break //We don't want blood tranfusions making vampires fat.
if(BL.data["donor"] != src)
- src.nutrition += (15 * REAGENTS_METABOLISM)
+ nutrition += (15 * REAGENTS_METABOLISM)
BL.volume -= REAGENTS_METABOLISM
if(BL.volume <= 0)
qdel(BL)
@@ -93,86 +82,49 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
break
vessel.add_reagent("blood", 0.1) // regenerate blood VERY slowly
- if (reagents.has_reagent("nutriment")) //Getting food speeds it up
- vessel.add_reagent("blood", 0.4)
- reagents.remove_reagent("nutriment", 0.1)
- if (reagents.has_reagent("iron")) //Hematogen candy anyone?
- vessel.add_reagent("blood", 0.8)
- reagents.remove_reagent("iron", 0.1)
- if (reagents.has_reagent("salglu_solution")) //saline is good for blood regeneration
- if(prob(33))
- vessel.add_reagent("blood", 1.0)
- // Damaged heart virtually reduces the blood volume, as the blood isn't
- // being pumped properly anymore.
- var/obj/item/organ/internal/heart/heart = get_int_organ(/obj/item/organ/internal/heart)
-
- if(heart)
- if(heart.damage > 1 && heart.damage < heart.min_bruised_damage)
- blood_volume *= 0.8
- else if(heart.damage >= heart.min_bruised_damage && heart.damage < heart.min_broken_damage)
- blood_volume *= 0.6
- else if(heart.damage >= heart.min_broken_damage && heart.damage < INFINITY)
- blood_volume *= 0.3
//Effects of bloodloss
+ var/oxy_immune = species.flags & NO_BREATHE //Some species have blood, but don't breathe; they should still suffer the effects of bloodloss.
+
switch(blood_volume)
- if(BLOOD_VOLUME_SAFE to 10000)
- if(pale)
- pale = 0
- update_body()
if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
- if(!pale)
- pale = 1
- update_body()
- var/word = pick("dizzy","woosey","faint")
- to_chat(src, "\red You feel [word]")
- if(prob(1))
- var/word = pick("dizzy","woosey","faint")
- to_chat(src, "\red You feel [word]")
- if(oxyloss < 20)
- oxyloss += 3
+ if(prob(5))
+ to_chat(src, "You feel [pick("dizzy","woozy","faint")]. ")
+ if(oxy_immune)
+ adjustToxLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1))
+ else
+ adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1))
if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY)
- if(!pale)
- pale = 1
- update_body()
- eye_blurry += 6
- if(oxyloss < 50)
- oxyloss += 10
- oxyloss += 1
- if(prob(15))
- Paralyse(rand(1,3))
- var/word = pick("dizzy","woosey","faint")
- to_chat(src, "\red You feel very [word]")
+ if(oxy_immune)
+ adjustToxLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1))
+ else
+ adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1))
+ if(prob(5))
+ eye_blurry = max(eye_blurry, 6)
+ var/word = pick("dizzy","woozy","faint")
+ to_chat(src, "You feel very [word]. ")
if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD)
- if(!pale)
- pale = 1
- update_body()
- if(oxyloss > 20)
- eye_blurry += 6
- oxyloss += 12
+ if(oxy_immune)
+ adjustToxLoss(5)
+ else
+ adjustOxyLoss(5)
if(prob(15))
Paralyse(rand(1,3))
- var/word = pick("dizzy","woosey","faint")
- to_chat(src, "\red You feel extremely [word]")
+ var/word = pick("dizzy","woozy","faint")
+ to_chat(src, "You feel extremely [word]. ")
if(0 to BLOOD_VOLUME_SURVIVE)
death()
- // Without enough blood you slowly go hungry.
- if(blood_volume < BLOOD_VOLUME_SAFE)
- if(nutrition >= 300)
- nutrition -= 10
- else if(nutrition >= 200)
- nutrition -= 3
-
//Bleeding out
var/blood_max = 0
for(var/obj/item/organ/external/temp in organs)
if(!(temp.status & ORGAN_BLEEDING) || temp.status & ORGAN_ROBOT)
continue
- for(var/datum/wound/W in temp.wounds) if(W.bleeding())
- blood_max += W.damage / 4
- if (temp.open)
+ for(var/datum/wound/W in temp.wounds)
+ if(W.bleeding())
+ blood_max += W.damage / 4
+ if(temp.open)
blood_max += 2 //Yer stomach is cut open
drip(blood_max)
@@ -188,7 +140,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
var/amm = 0.1 * amt
var/turf/T = get_turf(src)
- if(src.species.exotic_blood)
+ if(species.exotic_blood)
vessel.remove_reagent(species.exotic_blood,amm)
if(vessel.total_volume)
var/fraction = amm / vessel.total_volume
@@ -197,7 +149,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
else
vessel.remove_reagent("blood",amm)
- blood_splatter(src,src)
+ blood_splatter(src, src)
/****************************************************
@@ -263,13 +215,13 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
/mob/living/carbon/proc/inject_blood(obj/item/weapon/reagent_containers/container, var/amount)
var/datum/reagent/blood/injected = get_blood(container.reagents)
- if (!istype(injected))
+ if(!istype(injected))
return
var/list/chems = list()
chems = params2list(injected.data["trace_chem"])
for(var/C in chems)
- src.reagents.add_reagent(C, (text2num(chems[C]) / 560) * amount)//adds trace chemicals to owner's blood
+ src.reagents.add_reagent(C, (text2num(chems[C]) / BLOOD_VOLUME_NORMAL) * amount)//adds trace chemicals to owner's blood
reagents.update_total()
container.reagents.remove_reagent("blood", amount)
@@ -286,7 +238,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
var/datum/reagent/blood/our = get_blood(vessel)
- if (!istype(injected) || !istype(our))
+ if(!istype(injected) || !istype(our))
return
if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"]) )
reagents.add_reagent("toxin",amount * 0.5)
diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm
index 9c1398c6405..5e49a97fc59 100644
--- a/code/modules/surgery/organs/organ.dm
+++ b/code/modules/surgery/organs/organ.dm
@@ -22,7 +22,7 @@ var/list/organ_cache = list()
// links chemical IDs to number of ticks for which they'll stay in the blood
germ_level = 0
var/datum/dna/dna
- var/datum/species/species
+ var/datum/species/species = "Human"
// Stuff for tracking if this is on a tile with an open freezer or not
var/last_freezer_update_time = 0
@@ -53,6 +53,9 @@ var/list/organ_cache = list()
if(!blood_DNA)
blood_DNA = list()
blood_DNA[dna.unique_enzymes] = dna.b_type
+ else
+ if(istext(species))
+ species = all_species[species]
/obj/item/organ/proc/set_dna(var/datum/dna/new_dna)
if(new_dna)
@@ -84,7 +87,7 @@ var/list/organ_cache = list()
return
//Process infections
- if ((status & ORGAN_ROBOT) || sterile ||(owner && owner.species && (owner.species.flags & IS_PLANT)))
+ if((status & ORGAN_ROBOT) || sterile ||(owner && owner.species && (owner.species.flags & IS_PLANT)))
germ_level = 0
return
@@ -149,10 +152,10 @@ var/list/organ_cache = list()
//** Handle the effects of infections
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
- if (germ_level > 0 && germ_level < INFECTION_LEVEL_ONE/2 && prob(30))
+ if(germ_level > 0 && germ_level < INFECTION_LEVEL_ONE/2 && prob(30))
germ_level--
- if (germ_level >= INFECTION_LEVEL_ONE/2)
+ if(germ_level >= INFECTION_LEVEL_ONE/2)
//aiming for germ level to go from ambient to INFECTION_LEVEL_TWO in an average of 15 minutes
if(antibiotics < 5 && prob(round(germ_level/6)))
germ_level++
@@ -161,13 +164,13 @@ var/list/organ_cache = list()
var/fever_temperature = (owner.species.heat_level_1 - owner.species.body_temperature - 5)* min(germ_level/INFECTION_LEVEL_TWO, 1) + owner.species.body_temperature
owner.bodytemperature += between(0, (fever_temperature - T20C)/BODYTEMP_COLD_DIVISOR + 1, fever_temperature - owner.bodytemperature)
- if (germ_level >= INFECTION_LEVEL_TWO)
+ if(germ_level >= INFECTION_LEVEL_TWO)
var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
//spread germs
- if (antibiotics < 5 && parent.germ_level < germ_level && ( parent.germ_level < INFECTION_LEVEL_ONE*2 || prob(30) ))
+ if(antibiotics < 5 && parent.germ_level < germ_level && ( parent.germ_level < INFECTION_LEVEL_ONE*2 || prob(30) ))
parent.germ_level++
- if (prob(3)) //about once every 30 seconds
+ if(prob(3)) //about once every 30 seconds
take_damage(1,silent=prob(30))
/obj/item/organ/proc/receive_chem(chemical as obj)
@@ -178,7 +181,7 @@ var/list/organ_cache = list()
germ_level = 0
if(status & ORGAN_ROBOT) //Robotic organs stay robotic.
status = ORGAN_ROBOT
- else if (status & ORGAN_ASSISTED) //Assisted organs stay assisted.
+ else if(status & ORGAN_ASSISTED) //Assisted organs stay assisted.
status = ORGAN_ASSISTED
else
status = 0
@@ -198,12 +201,12 @@ var/list/organ_cache = list()
/obj/item/organ/proc/handle_antibiotics()
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
- if (!germ_level || antibiotics <= 0.4)
+ if(!germ_level || antibiotics <= 0.4)
return
- if (germ_level < INFECTION_LEVEL_ONE)
+ if(germ_level < INFECTION_LEVEL_ONE)
germ_level = 0 //cure instantly
- else if (germ_level < INFECTION_LEVEL_TWO)
+ else if(germ_level < INFECTION_LEVEL_TWO)
germ_level -= 24 //at germ_level == 500, this should cure the infection in 15 seconds
else
germ_level -= 8 // at germ_level == 1000, this will cure the infection in 1 minute, 15 seconds
@@ -257,11 +260,11 @@ var/list/organ_cache = list()
/obj/item/organ/emp_act(severity)
if(!(status & ORGAN_ROBOT))
return
- switch (severity)
- if (1.0)
+ switch(severity)
+ if(1.0)
take_damage(0,20)
return
- if (2.0)
+ if(2.0)
take_damage(0,7)
return
if(3.0)
@@ -271,10 +274,10 @@ var/list/organ_cache = list()
if(!robotic)
return
if(robotic == 2)
- switch (severity)
- if (1.0)
+ switch(severity)
+ if(1.0)
take_damage(20,1)
- if (2.0)
+ if(2.0)
take_damage(7,1)
if(3.0)
take_damage(3,1)
@@ -319,7 +322,7 @@ var/list/organ_cache = list()
owner = target
processing_objects -= src
affected.internal_organs |= src
- if (!target.get_int_organ(src))
+ if(!target.get_int_organ(src))
target.internal_organs += src
src.loc = target
if(robotic)
@@ -335,8 +338,8 @@ Returns 0 if it isn't
I use this so that this can be made better once the organ overhaul rolls out -- Crazylemon
*/
/obj/item/organ/proc/is_primary_organ(var/mob/living/carbon/human/O = null)
- if (isnull(O))
+ if(isnull(O))
O = owner
- if (!istype(owner)) // You're not the primary organ of ANYTHING, bucko
+ if(!istype(owner)) // You're not the primary organ of ANYTHING, bucko
return 0
return src == O.get_int_organ(organ_tag)
diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm
index c5d19ac2509..10d7fe724ea 100644
--- a/code/modules/surgery/organs/organ_external.dm
+++ b/code/modules/surgery/organs/organ_external.dm
@@ -210,7 +210,7 @@
//How much damage can we actually cause?
var/can_inflict = max_damage * config.organ_health_multiplier - (brute_dam + burn_dam)
if(can_inflict)
- if (brute > 0)
+ if(brute > 0)
//Inflict all burte damage we can
if(can_cut)
createwound( CUT, min(brute,can_inflict) )
@@ -222,14 +222,14 @@
//How much brute damage is left to inflict
brute = max(0, brute - temp)
- if (burn > 0 && can_inflict)
+ if(burn > 0 && can_inflict)
//Inflict all burn damage we can
createwound(BURN, min(burn,can_inflict))
//How much burn damage is left to inflict
burn = max(0, burn - can_inflict)
//If there are still hurties to dispense
- if (burn || brute)
- if (fail_at_full_damage == 1 && body_part != UPPER_TORSO && body_part != LOWER_TORSO)
+ if(burn || brute)
+ if(fail_at_full_damage == 1 && body_part != UPPER_TORSO && body_part != LOWER_TORSO)
droplimb(1) //Clean loss, just drop the limb and be done
else
//List organs we can pass it to
@@ -310,7 +310,7 @@ This function completely restores a damaged organ to perfect condition.
damage_state = "00"
if(status & ORGAN_ROBOT) //Robotic organs stay robotic.
status = ORGAN_ROBOT
- else if (status & ORGAN_ASSISTED) //Assisted organs stay assisted.
+ else if(status & ORGAN_ASSISTED) //Assisted organs stay assisted.
status = ORGAN_ASSISTED
else
status = 0
@@ -358,8 +358,8 @@ This function completely restores a damaged organ to perfect condition.
if((type == CUT || type == BRUISE) && damage >= 5)
//we need to make sure that the wound we are going to worsen is compatible with the type of damage...
var/list/compatible_wounds = list()
- for (var/datum/wound/W in wounds)
- if (W.can_worsen(type, damage))
+ for(var/datum/wound/W in wounds)
+ if(W.can_worsen(type, damage))
compatible_wounds += W
if(compatible_wounds.len)
@@ -412,7 +412,7 @@ This function completely restores a damaged organ to perfect condition.
if(!wound_cleanup_timer)
wound_cleanup_timer = addtimer(src, "cleanup_wounds", SecondsToTicks(600), 1, wounds)
- if (update_icon())
+ if(update_icon())
owner.UpdateDamageIcon(1)
return 0
@@ -482,13 +482,13 @@ Note that amputating the affected organ does in fact remove the infection from t
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
for(var/datum/wound/W in wounds)
//Open wounds can become infected
- if (owner.germ_level > W.germ_level && W.infection_check())
+ if(owner.germ_level > W.germ_level && W.infection_check())
W.germ_level++
- if (antibiotics < 5)
+ if(antibiotics < 5)
for(var/datum/wound/W in wounds)
//Infected wounds raise the organ's germ level
- if (W.germ_level > germ_level)
+ if(W.germ_level > germ_level)
germ_level++
break //limit increase to a maximum of one per second
@@ -502,37 +502,37 @@ Note that amputating the affected organ does in fact remove the infection from t
if(germ_level >= INFECTION_LEVEL_TWO)
//spread the infection to internal organs
var/obj/item/organ/internal/target_organ = null //make internal organs become infected one at a time instead of all at once
- for (var/obj/item/organ/internal/I in internal_organs)
- if (I.germ_level > 0 && I.germ_level < min(germ_level, INFECTION_LEVEL_TWO)) //once the organ reaches whatever we can give it, or level two, switch to a different one
- if (!target_organ || I.germ_level > target_organ.germ_level) //choose the organ with the highest germ_level
+ for(var/obj/item/organ/internal/I in internal_organs)
+ if(I.germ_level > 0 && I.germ_level < min(germ_level, INFECTION_LEVEL_TWO)) //once the organ reaches whatever we can give it, or level two, switch to a different one
+ if(!target_organ || I.germ_level > target_organ.germ_level) //choose the organ with the highest germ_level
target_organ = I
- if (!target_organ)
+ if(!target_organ)
//figure out which organs we can spread germs to and pick one at random
var/list/candidate_organs = list()
- for (var/obj/item/organ/internal/I in internal_organs)
- if (I.germ_level < germ_level)
+ for(var/obj/item/organ/internal/I in internal_organs)
+ if(I.germ_level < germ_level)
candidate_organs |= I
- if (candidate_organs.len)
+ if(candidate_organs.len)
target_organ = pick(candidate_organs)
- if (target_organ)
+ if(target_organ)
target_organ.germ_level++
//spread the infection to child and parent organs
- if (children)
- for (var/obj/item/organ/external/child in children)
- if (child.germ_level < germ_level && !(child.status & ORGAN_ROBOT))
- if (child.germ_level < INFECTION_LEVEL_ONE*2 || prob(30))
+ if(children)
+ for(var/obj/item/organ/external/child in children)
+ if(child.germ_level < germ_level && !(child.status & ORGAN_ROBOT))
+ if(child.germ_level < INFECTION_LEVEL_ONE*2 || prob(30))
child.germ_level++
- if (parent)
- if (parent.germ_level < germ_level && !(parent.status & ORGAN_ROBOT))
- if (parent.germ_level < INFECTION_LEVEL_ONE*2 || prob(30))
+ if(parent)
+ if(parent.germ_level < germ_level && !(parent.status & ORGAN_ROBOT))
+ if(parent.germ_level < INFECTION_LEVEL_ONE*2 || prob(30))
parent.germ_level++
if(germ_level >= INFECTION_LEVEL_THREE && antibiotics < 30) //overdosing is necessary to stop severe infections
- if (!(status & ORGAN_DEAD))
+ if(!(status & ORGAN_DEAD))
status |= ORGAN_DEAD
to_chat(owner, "You can't feel your [name] anymore... ")
owner.update_body(1)
@@ -567,7 +567,7 @@ Note that amputating the affected organ does in fact remove the infection from t
var/heal_amt = 0
// if damage >= 50 AFTER treatment then it's probably too severe to heal within the timeframe of a round.
- if (W.can_autoheal() && W.wound_damage() < 50)
+ if(W.can_autoheal() && W.wound_damage() < 50)
heal_amt += 0.5
//we only update wounds once in [wound_update_accuracy] ticks so have to emulate realtime
@@ -587,7 +587,7 @@ Note that amputating the affected organ does in fact remove the infection from t
// sync the organ's damage with its wounds
src.update_damages()
- if (update_icon())
+ if(update_icon())
owner.UpdateDamageIcon(1)
//Updates brute_damn and burn_damn from wound damages. Updates BLEEDING status.
@@ -620,7 +620,7 @@ Note that amputating the affected organ does in fact remove the infection from t
number_wounds += W.amount
- if (open && !clamped && (H && !(H.species.flags & NO_BLOOD)))
+ if(open && !clamped && (H && !(H.species.flags & NO_BLOOD)))
status |= ORGAN_BLEEDING
//Bone fractures
@@ -638,18 +638,18 @@ Note that amputating the affected organ does in fact remove the infection from t
if(burn_dam ==0)
tburn =0
- else if (burn_dam < (max_damage * 0.25 / 2))
+ else if(burn_dam < (max_damage * 0.25 / 2))
tburn = 1
- else if (burn_dam < (max_damage * 0.75 / 2))
+ else if(burn_dam < (max_damage * 0.75 / 2))
tburn = 2
else
tburn = 3
- if (brute_dam == 0)
+ if(brute_dam == 0)
tbrute = 0
- else if (brute_dam < (max_damage * 0.25 / 2))
+ else if(brute_dam < (max_damage * 0.25 / 2))
tbrute = 1
- else if (brute_dam < (max_damage * 0.75 / 2))
+ else if(brute_dam < (max_damage * 0.75 / 2))
tbrute = 2
else
tbrute = 3
@@ -744,12 +744,12 @@ Note that amputating the affected organ does in fact remove the infection from t
holder = owner
if(!holder)
return
- if (holder.handcuffed && body_part in list(ARM_LEFT, ARM_RIGHT, HAND_LEFT, HAND_RIGHT))
+ if(holder.handcuffed && body_part in list(ARM_LEFT, ARM_RIGHT, HAND_LEFT, HAND_RIGHT))
holder.visible_message(\
"\The [holder.handcuffed.name] falls off of [holder.name].",\
"\The [holder.handcuffed.name] falls off you.")
holder.unEquip(holder.handcuffed)
- if (holder.legcuffed && body_part in list(FOOT_LEFT, FOOT_RIGHT, LEG_LEFT, LEG_RIGHT))
+ if(holder.legcuffed && body_part in list(FOOT_LEFT, FOOT_RIGHT, LEG_LEFT, LEG_RIGHT))
holder.visible_message(\
"\The [holder.legcuffed.name] falls off of [holder.name].",\
"\The [holder.legcuffed.name] falls off you.")
@@ -809,7 +809,7 @@ Note that amputating the affected organ does in fact remove the infection from t
perma_injury = brute_dam
// Fractures have a chance of getting you out of restraints
- if (prob(25))
+ if(prob(25))
release_restraints()
/obj/item/organ/external/proc/mend_fracture()
@@ -845,7 +845,7 @@ Note that amputating the affected organ does in fact remove the infection from t
cannot_break = 1
get_icon()
- for (var/obj/item/organ/external/T in children)
+ for(var/obj/item/organ/external/T in children)
if(T)
T.robotize()
@@ -939,7 +939,7 @@ Note that amputating the affected organ does in fact remove the infection from t
qdel(src)
/obj/item/organ/external/proc/disfigure(var/type = "brute")
- if (disfigured)
+ if(disfigured)
return
if(owner)
if(type == "brute")
@@ -953,9 +953,9 @@ Note that amputating the affected organ does in fact remove the infection from t
disfigured = 1
/obj/item/organ/external/is_primary_organ(var/mob/living/carbon/human/O = null)
- if (isnull(O))
+ if(isnull(O))
O = owner
- if (!istype(O)) // You're not the primary organ of ANYTHING, bucko
+ if(!istype(O)) // You're not the primary organ of ANYTHING, bucko
return 0
return src == O.organs_by_name[limb_name]
diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm
index bd57c059d41..49777aa4a5c 100644
--- a/code/modules/surgery/organs/organ_icon.dm
+++ b/code/modules/surgery/organs/organ_icon.dm
@@ -112,18 +112,18 @@ var/global/list/limb_icon_cache = list()
return mob_icon
/obj/item/organ/external/proc/get_icon(var/skeletal)
-
var/gender
+ if(istext(species))
+ species = all_species[species]
if(force_icon)
mob_icon = new /icon(force_icon, "[icon_name]")
- if(species && species.name == "Machine") //snowflake for IPC's, sorry.
+ if(species && species.name == "Machine") //snowflake for IPC's, sorry.
if(s_col && s_col.len >= 3)
mob_icon.Blend(rgb(s_col[1], s_col[2], s_col[3]), ICON_ADD)
else
if(!dna)
mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_f" : ""]")
else
-
if(gendered_icon)
if(dna.GetUIState(DNA_UI_GENDER))
gender = "f"
@@ -135,7 +135,7 @@ var/global/list/limb_icon_cache = list()
else if(status & ORGAN_ROBOT)
mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]")
else
- if (status & ORGAN_MUTATED)
+ if(status & ORGAN_MUTATED)
mob_icon = new /icon(species.deform, "[icon_name][gender ? "_[gender]" : ""]")
else
mob_icon = new /icon(species.icobase, "[icon_name][gender ? "_[gender]" : ""]")
@@ -161,7 +161,7 @@ var/global/list/limb_icon_cache = list()
// adjusted to set damage_state to brute/burn code only (without r_name0 as before)
/obj/item/organ/external/update_icon()
var/n_is = damage_state_text()
- if (n_is != damage_state)
+ if(n_is != damage_state)
damage_state = n_is
return 1
return 0
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index f4a47c595cb..9c28a60b055 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -8,9 +8,7 @@
var/zone = "chest"
var/slot
vital = 0
- var/organ_action_name = null
var/non_primary = 0
- action_button_custom_type = /datum/action/item_action/organ_action
/obj/item/organ/internal/New(var/mob/living/carbon/holder)
if(istype(holder))
@@ -41,8 +39,9 @@
parent.internal_organs |= src
//M.internal_organs_by_name[src] |= src(H,1)
loc = null
- if(organ_action_name)
- action_button_name = organ_action_name
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.Grant(M)
/obj/item/organ/internal/remove(mob/living/carbon/M, special = 0)
@@ -61,14 +60,18 @@
else
parent.internal_organs -= src
- if(organ_action_name)
- action_button_name = null
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.Remove(M)
/obj/item/organ/internal/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected)
insert(target)
..()
+/obj/item/organ/internal/item_action_slot_check(slot, mob/user)
+ return
+
/obj/item/organ/internal/proc/on_find(mob/living/finder)
return
@@ -191,6 +194,78 @@
S.icon_state = "heart-off"
return S
+/obj/item/organ/internal/heart/cursed
+ name = "cursed heart"
+ desc = "it needs to be pumped..."
+ icon_state = "cursedheart-off"
+ icon_base = "cursedheart"
+ origin_tech = "biotech=5"
+ actions_types = list(/datum/action/item_action/organ_action/cursed_heart)
+ var/last_pump = 0
+ var/pump_delay = 30 //you can pump 1 second early, for lag, but no more (otherwise you could spam heal)
+ var/blood_loss = 100 //600 blood is human default, so 5 failures (below 122 blood is where humans die because reasons?)
+
+ //How much to heal per pump, negative numbers would HURT the player
+ var/heal_brute = 0
+ var/heal_burn = 0
+ var/heal_oxy = 0
+
+
+/obj/item/organ/internal/heart/cursed/attack(mob/living/carbon/human/H, mob/living/carbon/human/user, obj/target)
+ if(H == user && istype(H))
+ if(H.species.flags & NO_BLOOD || H.species.exotic_blood)
+ to_chat(H, "\The [src] is not compatible with your form! ")
+ return
+ playsound(user,'sound/effects/singlebeat.ogg', 40, 1)
+ user.drop_item()
+ insert(user)
+ else
+ return ..()
+
+/obj/item/organ/internal/heart/cursed/on_life()
+ if(world.time > (last_pump + pump_delay))
+ if(ishuman(owner) && owner.client) //While this entire item exists to make people suffer, they can't control disconnects.
+ var/mob/living/carbon/human/H = owner
+ H.vessel.remove_reagent("blood", blood_loss)
+ to_chat(H, "You have to keep pumping your blood! ")
+ if(H.client)
+ H.client.color = "red" //bloody screen so real
+ else
+ last_pump = world.time //lets be extra fair *sigh*
+
+/obj/item/organ/internal/heart/cursed/insert(mob/living/carbon/M, special = 0)
+ ..()
+ if(owner)
+ to_chat(owner, "Your heart has been replaced with a cursed one, you have to pump this one manually otherwise you'll die! ")
+
+
+/datum/action/item_action/organ_action/cursed_heart
+ name = "pump your blood"
+
+//You are now brea- pumping blood manually
+/datum/action/item_action/organ_action/cursed_heart/Trigger()
+ . = ..()
+ if(. && istype(target,/obj/item/organ/internal/heart/cursed))
+ var/obj/item/organ/internal/heart/cursed/cursed_heart = target
+
+ if(world.time < (cursed_heart.last_pump + (cursed_heart.pump_delay-10))) //no spam
+ to_chat(owner, "Too soon! ")
+ return
+
+ cursed_heart.last_pump = world.time
+ playsound(owner,'sound/effects/singlebeat.ogg',40,1)
+ to_chat(owner, "Your heart beats. ")
+
+ var/mob/living/carbon/human/H = owner
+ if(istype(H))
+ H.vessel.add_reagent("blood", (cursed_heart.blood_loss*0.5))//gain half the blood back from a failure
+ if(owner.client)
+ owner.client.color = ""
+
+ H.adjustBruteLoss(-cursed_heart.heal_brute)
+ H.adjustFireLoss(-cursed_heart.heal_burn)
+ H.adjustOxyLoss(-cursed_heart.heal_oxy)
+
/obj/item/organ/internal/lungs
name = "lungs"
icon_state = "lungs"
@@ -212,7 +287,7 @@
if(!owner)
return
- if (germ_level > INFECTION_LEVEL_ONE)
+ if(germ_level > INFECTION_LEVEL_ONE)
if(prob(5))
owner.emote("cough") //respitory tract infection
@@ -282,7 +357,7 @@
if(!owner)
return
owner.disabilities &= ~NEARSIGHTED
- owner.sdisabilities &= ~BLIND
+ owner.disabilities &= ~BLIND
owner.eye_blurry = 0
owner.eye_blind = 0
@@ -302,10 +377,10 @@
if(!owner)
return
- if (germ_level > INFECTION_LEVEL_ONE)
+ if(germ_level > INFECTION_LEVEL_ONE)
if(prob(1))
to_chat(owner, " Your skin itches. ")
- if (germ_level > INFECTION_LEVEL_TWO)
+ if(germ_level > INFECTION_LEVEL_TWO)
if(prob(1))
spawn owner.vomit()
@@ -314,7 +389,7 @@
//High toxins levels are dangerous
if(owner.getToxLoss() >= 60 && !owner.reagents.has_reagent("charcoal"))
//Healthy liver suffers on its own
- if (src.damage < min_broken_damage)
+ if(src.damage < min_broken_damage)
src.damage += 0.2 * PROCESS_ACCURACY
//Damaged one shares the fun
else
@@ -323,7 +398,7 @@
O.damage += 0.2 * PROCESS_ACCURACY
//Detox can heal small amounts of damage
- if (src.damage && src.damage < src.min_bruised_damage && owner.reagents.has_reagent("charcoal"))
+ if(src.damage && src.damage < src.min_bruised_damage && owner.reagents.has_reagent("charcoal"))
src.damage -= 0.2 * PROCESS_ACCURACY
if(src.damage < 0)
@@ -463,7 +538,7 @@
to_chat(owner, "HONK ")
owner.sleeping = 0
owner.stuttering = 20
- owner.ear_deaf = 30
+ owner.adjustEarDamage(0, 30)
owner.Weaken(3)
owner << 'sound/items/AirHorn.ogg'
if(prob(30))
@@ -476,13 +551,22 @@
var/mob/living/carbon/human/H = owner
if(isobj(H.shoes))
var/thingy = H.shoes
- H.unEquip(H.shoes)
- walk_away(thingy,H,15,2)
- spawn(20)
- if(thingy)
- walk(thingy,0)
+ if(H.unEquip(H.shoes))
+ walk_away(thingy,H,15,2)
+ spawn(20)
+ if(thingy)
+ walk(thingy,0)
..()
+/obj/item/organ/internal/honktumor/cursed
+
+/obj/item/organ/internal/honktumor/cursed/remove(mob/living/carbon/M, special = 0, clean_remove = 0)
+ ..()
+ if(!clean_remove)
+ visible_message("[src] vanishes into dust, and a [M] emits a loud honk! ", "You hear a loud honk. ")
+ insert(M) //You're not getting away that easily!
+ else
+ qdel(src)
/obj/item/organ/internal/beard
name = "beard organ"
@@ -493,7 +577,6 @@
parent_organ = "head"
slot = "hair_organ"
-
/obj/item/organ/internal/beard/on_life()
if(!owner)
@@ -516,4 +599,4 @@
head_organ.r_facial = 216
head_organ.g_facial = 192
head_organ.b_facial = 120
- H.update_fhair()
\ No newline at end of file
+ H.update_fhair()
diff --git a/code/modules/surgery/organs/pain.dm b/code/modules/surgery/organs/pain.dm
index b2f6945b6f1..0bd2d138948 100644
--- a/code/modules/surgery/organs/pain.dm
+++ b/code/modules/surgery/organs/pain.dm
@@ -12,8 +12,6 @@ mob/living/carbon/proc/pain(var/partname, var/amount, var/force, var/burning = 0
return
if(reagents.has_reagent("hydrocodone"))
return
- if(analgesic)
- return
if(world.time < next_pain_time && !force)
return
if(amount > 10 && istype(src,/mob/living/carbon/human))
@@ -55,8 +53,6 @@ mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength)
return
if(reagents.has_reagent("hydrocodone"))
return
- if(analgesic)
- return
var/msg = "\red [message] "
if(flash_strength >= 1)
msg = "\red [message] "
@@ -94,8 +90,6 @@ mob/living/carbon/human/proc/handle_pain()
return
if(reagents.has_reagent("hydrocodone"))
return
- if(analgesic)
- return
var/maxdam = 0
var/obj/item/organ/external/damaged_organ = null
for(var/obj/item/organ/external/E in organs)
diff --git a/code/modules/surgery/organs/subtypes/diona.dm b/code/modules/surgery/organs/subtypes/diona.dm
index 9cf0a1020cc..0f75fe9f80f 100644
--- a/code/modules/surgery/organs/subtypes/diona.dm
+++ b/code/modules/surgery/organs/subtypes/diona.dm
@@ -25,6 +25,7 @@
amputation_point = "trunk"
encased = null
gendered_icon = 0
+ species = "Diona"
/obj/item/organ/external/groin/diona
name = "fork"
@@ -32,6 +33,7 @@
cannot_break = 1
amputation_point = "lower trunk"
gendered_icon = 0
+ species = "Diona"
/obj/item/organ/external/arm/diona
name = "left upper tendril"
@@ -39,6 +41,7 @@
min_broken_damage = 20
cannot_break = 1
amputation_point = "upper left trunk"
+ species = "Diona"
/obj/item/organ/external/arm/right/diona
name = "right upper tendril"
@@ -46,6 +49,7 @@
min_broken_damage = 20
cannot_break = 1
amputation_point = "upper right trunk"
+ species = "Diona"
/obj/item/organ/external/leg/diona
name = "left lower tendril"
@@ -53,6 +57,7 @@
min_broken_damage = 20
cannot_break = 1
amputation_point = "lower left fork"
+ species = "Diona"
/obj/item/organ/external/leg/right/diona
name = "right lower tendril"
@@ -60,6 +65,7 @@
min_broken_damage = 20
cannot_break = 1
amputation_point = "lower right fork"
+ species = "Diona"
/obj/item/organ/external/foot/diona
name = "left foot"
@@ -67,6 +73,7 @@
min_broken_damage = 10
cannot_break = 1
amputation_point = "branch"
+ species = "Diona"
/obj/item/organ/external/foot/right/diona
name = "right foot"
@@ -74,16 +81,19 @@
min_broken_damage = 10
cannot_break = 1
amputation_point = "branch"
+ species = "Diona"
/obj/item/organ/external/hand/diona
name = "left grasper"
cannot_break = 1
amputation_point = "branch"
+ species = "Diona"
/obj/item/organ/external/hand/right/diona
name = "right grasper"
cannot_break = 1
amputation_point = "branch"
+ species = "Diona"
/obj/item/organ/external/head/diona
max_damage = 50
@@ -92,6 +102,7 @@
encased = null
amputation_point = "upper trunk"
gendered_icon = 0
+ species = "Diona"
//DIONA ORGANS.
/* /obj/item/organ/external/diona/removed()
@@ -113,6 +124,7 @@
origin_tech = "biotech=3"
parent_organ = "chest"
slot = "heart"
+ species = "Diona"
/obj/item/organ/internal/brain/diona
name = "gas bladder"
@@ -122,6 +134,7 @@
organ_tag = "brain" // Turns into a nymph instantly, no transplanting possible.
origin_tech = "biotech=3"
slot = "brain"
+ species = "Diona"
/obj/item/organ/internal/kidneys/diona
name = "polyp segment"
@@ -131,6 +144,7 @@
origin_tech = "biotech=3"
parent_organ = "groin"
slot = "kidneys"
+ species = "Diona"
/obj/item/organ/internal/appendix/diona
name = "anchoring ligament"
@@ -140,6 +154,7 @@
origin_tech = "biotech=3"
parent_organ = "groin"
slot = "appendix"
+ species = "Diona"
/obj/item/organ/internal/diona_receptor
name = "receptor node"
@@ -149,13 +164,13 @@
origin_tech = "biotech=3"
parent_organ = "head"
slot = "eyes"
-
+ species = "Diona"
/obj/item/organ/internal/diona_receptor/surgeryize()
if(!owner)
return
owner.disabilities &= ~NEARSIGHTED
- owner.sdisabilities &= ~BLIND
+ owner.disabilities &= ~BLIND
owner.eye_blurry = 0
owner.eye_blind = 0
@@ -170,6 +185,7 @@
icon_state = "claw"
slot = "liver"
alcohol_intensity = 0.5
+ species = "Diona"
//TODO:Make absorb light on insert.
diff --git a/code/modules/surgery/organs/subtypes/drask.dm b/code/modules/surgery/organs/subtypes/drask.dm
index e76f557088e..b3b260a28a0 100644
--- a/code/modules/surgery/organs/subtypes/drask.dm
+++ b/code/modules/surgery/organs/subtypes/drask.dm
@@ -4,6 +4,7 @@
icon = 'icons/obj/surgery_drask.dmi'
icon_state = "innards"
desc = "A greenish, slightly translucent organ. It is extremely cold."
+ species = "Drask"
/obj/item/organ/internal/heart/drask
name = "drask heart"
@@ -13,6 +14,7 @@
organ_tag = "heart"
parent_organ = "head"
slot = "heart"
+ species = "Drask"
/obj/item/organ/internal/lungs/drask
name = "lungs"
@@ -22,6 +24,7 @@
organ_tag = "lungs"
parent_organ = "chest"
slot = "lungs"
+ species = "Drask"
/obj/item/organ/internal/liver/drask
name = "metabolic strainer"
@@ -32,6 +35,7 @@
parent_organ = "groin"
slot = "kidneys"
alcohol_intensity = 0.8
+ species = "Drask"
/obj/item/organ/internal/brain/drask
name = "brain"
@@ -41,6 +45,7 @@
slot = "brain"
mmi_icon = 'icons/obj/surgery_drask.dmi'
mmi_icon_state = "mmi_full"
+ species = "Drask"
/obj/item/organ/internal/eyes/drask
name = "eyes"
@@ -51,3 +56,4 @@
parent_organ = "head"
slot = "eyes"
desc = "Drask eyes. They look even stranger disembodied"
+ species = "Drask"
diff --git a/code/modules/surgery/organs/subtypes/grey.dm b/code/modules/surgery/organs/subtypes/grey.dm
index 45798486d4f..7c84bdc2019 100644
--- a/code/modules/surgery/organs/subtypes/grey.dm
+++ b/code/modules/surgery/organs/subtypes/grey.dm
@@ -1,2 +1,16 @@
/obj/item/organ/internal/liver/grey
alcohol_intensity = 1.6
+ species = "Grey"
+
+/obj/item/organ/internal/brain/grey
+ icon_state = "brain-x"
+ mmi_icon_state = "mmi_alien"
+ species = "Grey"
+
+/obj/item/organ/internal/brain/grey/insert(var/mob/living/carbon/M, var/special = 0)
+ ..()
+ M.add_language("Psionic Communication")
+
+/obj/item/organ/internal/brain/grey/remove(var/mob/living/carbon/M, var/special = 0)
+ ..()
+ M.remove_language("Psionic Communication")
diff --git a/code/modules/surgery/organs/subtypes/kidan.dm b/code/modules/surgery/organs/subtypes/kidan.dm
index 2866e3904fb..848c0bca737 100644
--- a/code/modules/surgery/organs/subtypes/kidan.dm
+++ b/code/modules/surgery/organs/subtypes/kidan.dm
@@ -1,2 +1,3 @@
/obj/item/organ/internal/liver/kidan
alcohol_intensity = 0.5
+ species = "Kidan"
diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm
index 5d9bd517d3f..d64fbf70e3d 100644
--- a/code/modules/surgery/organs/subtypes/machine.dm
+++ b/code/modules/surgery/organs/subtypes/machine.dm
@@ -6,6 +6,7 @@
min_broken_damage = 30
encased = null
status = ORGAN_ROBOT
+ species = "Machine"
/obj/item/organ/external/head/ipc/New()
robotize("Morpheus Cyberkinetics")
@@ -14,6 +15,7 @@
/obj/item/organ/external/chest/ipc
encased = null
status = ORGAN_ROBOT
+ species = "Machine"
/obj/item/organ/external/chest/ipc/New()
robotize("Morpheus Cyberkinetics")
@@ -22,6 +24,7 @@
/obj/item/organ/external/groin/ipc
encased = null
status = ORGAN_ROBOT
+ species = "Machine"
/obj/item/organ/external/groin/ipc/New()
robotize("Morpheus Cyberkinetics")
@@ -30,6 +33,7 @@
/obj/item/organ/external/arm/ipc
encased = null
status = ORGAN_ROBOT
+ species = "Machine"
/obj/item/organ/external/arm/ipc/New()
robotize("Morpheus Cyberkinetics")
@@ -38,6 +42,7 @@
/obj/item/organ/external/arm/right/ipc
encased = null
status = ORGAN_ROBOT
+ species = "Machine"
/obj/item/organ/external/arm/right/ipc/New()
robotize("Morpheus Cyberkinetics")
@@ -45,6 +50,7 @@
/obj/item/organ/external/leg/ipc
encased = null
status = ORGAN_ROBOT
+ species = "Machine"
/obj/item/organ/external/leg/ipc/New()
robotize("Morpheus Cyberkinetics")
@@ -53,7 +59,7 @@
/obj/item/organ/external/leg/right/ipc
encased = null
status = ORGAN_ROBOT
-
+ species = "Machine"
/obj/item/organ/external/leg/right/ipc/New()
robotize("Morpheus Cyberkinetics")
@@ -62,7 +68,7 @@
/obj/item/organ/external/foot/ipc
encased = null
status = ORGAN_ROBOT
-
+ species = "Machine"
/obj/item/organ/external/foot/ipc/New()
robotize("Morpheus Cyberkinetics")
@@ -71,7 +77,7 @@
/obj/item/organ/external/foot/right/ipc
encased = null
status = ORGAN_ROBOT
-
+ species = "Machine"
/obj/item/organ/external/foot/right/ipc/New()
robotize("Morpheus Cyberkinetics")
@@ -80,6 +86,7 @@
/obj/item/organ/external/hand/ipc
encased = null
status = ORGAN_ROBOT
+ species = "Machine"
/obj/item/organ/external/hand/ipc/New()
robotize("Morpheus Cyberkinetics")
@@ -88,6 +95,7 @@
/obj/item/organ/external/hand/right/ipc
encased = null
status = ORGAN_ROBOT
+ species = "Machine"
/obj/item/organ/external/hand/right/ipc/New()
robotize("Morpheus Cyberkinetics")
@@ -103,6 +111,7 @@
slot = "heart"
vital = 1
status = ORGAN_ROBOT
+ species = "Machine"
/obj/item/organ/internal/cell/New()
robotize()
@@ -123,6 +132,7 @@
icon_state = "camera"
slot = "eyes"
status = ORGAN_ROBOT
+ species = "Machine"
// dead_icon = "camera_broken"
/obj/item/organ/internal/optical_sensor/New()
@@ -140,7 +150,7 @@
if(!owner)
return
owner.disabilities &= ~NEARSIGHTED
- owner.sdisabilities &= ~BLIND
+ owner.disabilities &= ~BLIND
owner.eye_blurry = 0
owner.eye_blind = 0
@@ -154,6 +164,7 @@
max_damage = 200
slot = "brain"
status = ORGAN_ROBOT
+ species = "Machine"
var/obj/item/device/mmi/stored_mmi
/obj/item/organ/internal/brain/mmi_holder/proc/update_from_mmi()
diff --git a/code/modules/surgery/organs/subtypes/nucleation.dm b/code/modules/surgery/organs/subtypes/nucleation.dm
index f174cf9d75d..d234b666ae3 100644
--- a/code/modules/surgery/organs/subtypes/nucleation.dm
+++ b/code/modules/surgery/organs/subtypes/nucleation.dm
@@ -3,6 +3,7 @@
name = "nucleation organ"
icon = 'icons/obj/surgery.dmi'
desc = "A crystalized human organ. /red It has a strangely iridescent glow."
+ species = "Nucleation"
/obj/item/organ/internal/nucleation/resonant_crystal
name = "resonant crystal"
@@ -10,6 +11,7 @@
organ_tag = "resonant crystal"
parent_organ = "head"
slot = "res_crystal"
+ species = "Nucleation"
/obj/item/organ/internal/nucleation/strange_crystal
name = "strange crystal"
@@ -17,7 +19,7 @@
organ_tag = "strange crystal"
parent_organ = "chest"
slot = "heart"
-
+ species = "Nucleation"
/obj/item/organ/internal/eyes/luminescent_crystal
name = "luminescent eyes"
@@ -26,12 +28,15 @@
light_color = "#1C1C00"
parent_organ = "head"
slot = "eyes"
+ species = "Nucleation"
/obj/item/organ/internal/eyes/luminescent_crystal/New()
set_light(2)
+ ..()
/obj/item/organ/internal/brain/crystal
name = "crystalized brain"
icon_state = "crystal-brain"
organ_tag = "crystalized brain"
slot = "brain"
+ species = "Nucleation"
diff --git a/code/modules/surgery/organs/subtypes/skrell.dm b/code/modules/surgery/organs/subtypes/skrell.dm
index 78c43c3a370..c069b852886 100644
--- a/code/modules/surgery/organs/subtypes/skrell.dm
+++ b/code/modules/surgery/organs/subtypes/skrell.dm
@@ -1,2 +1,3 @@
/obj/item/organ/internal/liver/skrell
alcohol_intensity = 4
+ species = "Skrell"
diff --git a/code/modules/surgery/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm
index d481ba1b7ae..1c6240318fe 100644
--- a/code/modules/surgery/organs/subtypes/standard.dm
+++ b/code/modules/surgery/organs/subtypes/standard.dm
@@ -187,9 +187,9 @@
/obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list())
..(brute, burn, sharp, edge, used_weapon, forbidden_limbs)
- if (!disfigured)
- if (brute_dam > 40)
- if (prob(50))
+ if(!disfigured)
+ if(brute_dam > 40)
+ if(prob(50))
disfigure("brute")
- if (burn_dam > 40)
+ if(burn_dam > 40)
disfigure("burn")
diff --git a/code/modules/surgery/organs/subtypes/tajaran.dm b/code/modules/surgery/organs/subtypes/tajaran.dm
index 462c94be822..e37686a05ca 100644
--- a/code/modules/surgery/organs/subtypes/tajaran.dm
+++ b/code/modules/surgery/organs/subtypes/tajaran.dm
@@ -1,2 +1,3 @@
/obj/item/organ/internal/liver/tajaran
alcohol_intensity = 1.4
+ species = "Tajaran"
diff --git a/code/modules/surgery/organs/subtypes/unathi.dm b/code/modules/surgery/organs/subtypes/unathi.dm
index 5f204ab1750..a769bce7a02 100644
--- a/code/modules/surgery/organs/subtypes/unathi.dm
+++ b/code/modules/surgery/organs/subtypes/unathi.dm
@@ -1,2 +1,3 @@
/obj/item/organ/internal/liver/unathi
alcohol_intensity = 0.8
+ species = "Unathi"
diff --git a/code/modules/surgery/organs/subtypes/vox.dm b/code/modules/surgery/organs/subtypes/vox.dm
index c5e86640364..f0b94e2963e 100644
--- a/code/modules/surgery/organs/subtypes/vox.dm
+++ b/code/modules/surgery/organs/subtypes/vox.dm
@@ -1,2 +1,3 @@
/obj/item/organ/internal/liver/vox
alcohol_intensity = 1.6
+ species = "Vox"
diff --git a/code/modules/surgery/organs/subtypes/vulpkanin.dm b/code/modules/surgery/organs/subtypes/vulpkanin.dm
index 30b8d51f667..ca47ac83ddd 100644
--- a/code/modules/surgery/organs/subtypes/vulpkanin.dm
+++ b/code/modules/surgery/organs/subtypes/vulpkanin.dm
@@ -1,2 +1,3 @@
/obj/item/organ/internal/liver/vulpkanin
alcohol_intensity = 1.4
+ species = "Vulpkanin"
diff --git a/code/modules/surgery/organs/subtypes/wryn.dm b/code/modules/surgery/organs/subtypes/wryn.dm
index 14a5d46dd8f..f51adb6054e 100644
--- a/code/modules/surgery/organs/subtypes/wryn.dm
+++ b/code/modules/surgery/organs/subtypes/wryn.dm
@@ -5,4 +5,5 @@
icon = 'icons/mob/human_races/r_wryn.dmi'
icon_state = "antennae"
parent_organ = "head"
- slot = "hivenode"
\ No newline at end of file
+ slot = "hivenode"
+ species = "Wryn"
diff --git a/code/modules/surgery/organs/wound.dm b/code/modules/surgery/organs/wound.dm
index 55a2f3f5cee..ca5b25dee12 100644
--- a/code/modules/surgery/organs/wound.dm
+++ b/code/modules/surgery/organs/wound.dm
@@ -97,15 +97,15 @@
// Checks whether other other can be merged into src.
proc/can_merge(var/datum/wound/other)
- if (other.type != src.type) return 0
- if (other.current_stage != src.current_stage) return 0
- if (other.damage_type != src.damage_type) return 0
- if (!(other.can_autoheal()) != !(src.can_autoheal())) return 0
- if (!(other.bandaged) != !(src.bandaged)) return 0
- if (!(other.clamped) != !(src.clamped)) return 0
- if (!(other.salved) != !(src.salved)) return 0
- if (!(other.disinfected) != !(src.disinfected)) return 0
- //if (other.germ_level != src.germ_level) return 0
+ if(other.type != src.type) return 0
+ if(other.current_stage != src.current_stage) return 0
+ if(other.damage_type != src.damage_type) return 0
+ if(!(other.can_autoheal()) != !(src.can_autoheal())) return 0
+ if(!(other.bandaged) != !(src.bandaged)) return 0
+ if(!(other.clamped) != !(src.clamped)) return 0
+ if(!(other.salved) != !(src.salved)) return 0
+ if(!(other.disinfected) != !(src.disinfected)) return 0
+ //if(other.germ_level != src.germ_level) return 0
return 1
proc/merge_wound(var/datum/wound/other)
@@ -118,24 +118,24 @@
// checks if wound is considered open for external infections
// untreated cuts (and bleeding bruises) and burns are possibly infectable, chance higher if wound is bigger
proc/infection_check()
- if (damage < 10) //small cuts, tiny bruises, and moderate burns shouldn't be infectable.
+ if(damage < 10) //small cuts, tiny bruises, and moderate burns shouldn't be infectable.
return 0
- if (is_treated() && damage < 25) //anything less than a flesh wound (or equivalent) isn't infectable if treated properly
+ if(is_treated() && damage < 25) //anything less than a flesh wound (or equivalent) isn't infectable if treated properly
return 0
- if (disinfected)
+ if(disinfected)
germ_level = 0 //reset this, just in case
return 0
- if (damage_type == BRUISE && !bleeding()) //bruises only infectable if bleeding
+ if(damage_type == BRUISE && !bleeding()) //bruises only infectable if bleeding
return 0
var/dam_coef = round(damage/10)
- switch (damage_type)
- if (BRUISE)
+ switch(damage_type)
+ if(BRUISE)
return prob(dam_coef*5)
- if (BURN)
+ if(BURN)
return prob(dam_coef*10)
- if (CUT)
+ if(CUT)
return prob(dam_coef*20)
return 0
@@ -174,32 +174,32 @@
// returns whether this wound can absorb the given amount of damage.
// this will prevent large amounts of damage being trapped in less severe wound types
proc/can_worsen(damage_type, damage)
- if (src.damage_type != damage_type)
+ if(src.damage_type != damage_type)
return 0 //incompatible damage types
- if (src.amount > 1)
+ if(src.amount > 1)
return 0
//with 1.5*, a shallow cut will be able to carry at most 30 damage,
//37.5 for a deep cut
//52.5 for a flesh wound, etc.
var/max_wound_damage = 1.5*src.damage_list[1]
- if (src.damage + damage > max_wound_damage)
+ if(src.damage + damage > max_wound_damage)
return 0
return 1
proc/bleeding()
- if (src.internal)
+ if(src.internal)
return 0 // internal wounds don't bleed in the sense of this function
- if (current_stage > max_bleeding_stage)
+ if(current_stage > max_bleeding_stage)
return 0
- if (bandaged||clamped)
+ if(bandaged||clamped)
return 0
- if (wound_damage() <= 30 && bleed_timer <= 0)
+ if(wound_damage() <= 30 && bleed_timer <= 0)
return 0 //Bleed timer has run out. Wounds with more than 30 damage don't stop bleeding on their own.
return (damage_type == BRUISE && wound_damage() >= 20 || damage_type == CUT && wound_damage() >= 5)
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index 8f7ed0e6d67..e16a07c454c 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -60,7 +60,7 @@
/datum/surgery_step/internal/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -156,11 +156,11 @@
else if(implement_type in implements_mend)
current_type = "mend"
var/tool_name = "\the [tool]"
- if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack))
+ if(istype(tool, /obj/item/stack/medical/advanced/bruise_pack))
tool_name = "regenerative membrane"
- else if (istype(tool, /obj/item/stack/medical/bruise_pack))
+ else if(istype(tool, /obj/item/stack/medical/bruise_pack))
tool_name = "the bandaid"
- else if (istype(tool, /obj/item/stack/nanopaste))
+ else if(istype(tool, /obj/item/stack/nanopaste))
tool_name = "\the [tool]" //what else do you call nanopaste medically?
if(!hasorgans(target))
@@ -188,14 +188,14 @@
/datum/surgery_step/internal/manipulate_organs/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
if(current_type == "mend")
var/tool_name = "\the [tool]"
- if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack))
+ if(istype(tool, /obj/item/stack/medical/advanced/bruise_pack))
tool_name = "regenerative membrane"
- if (istype(tool, /obj/item/stack/medical/bruise_pack))
+ if(istype(tool, /obj/item/stack/medical/bruise_pack))
tool_name = "the bandaid"
- if (istype(tool, /obj/item/stack/nanopaste))
+ if(istype(tool, /obj/item/stack/nanopaste))
tool_name = "\the [tool]" //what else do you call nanopaste medically?
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
for(var/obj/item/organ/internal/I in affected.internal_organs)
if(I)
@@ -259,17 +259,17 @@
/datum/surgery_step/internal/manipulate_organs/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
if(current_type == "mend")
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
user.visible_message(" [user]'s hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]! ", \
" Your hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]! ")
var/dam_amt = 2
- if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack))
+ if(istype(tool, /obj/item/stack/medical/advanced/bruise_pack))
target.adjustToxLoss(5)
- else if (istype(tool, /obj/item/stack/medical/bruise_pack) || istype(tool, /obj/item/stack/nanopaste))
+ else if(istype(tool, /obj/item/stack/medical/bruise_pack) || istype(tool, /obj/item/stack/nanopaste))
dam_amt = 5
target.adjustToxLoss(10)
affected.createwound(CUT, 5)
@@ -400,10 +400,10 @@
/datum/surgery_step/retract_carapace/begin_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery)
var/msg = "[user] starts to pry open the incision on [target]'s [target_zone] with \the [tool]."
var/self_msg = "You start to pry open the incision on [target]'s [target_zone] with \the [tool]."
- if (target_zone == "chest")
+ if(target_zone == "chest")
msg = "[user] starts to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
self_msg = "You start to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
- if (target_zone == "groin")
+ if(target_zone == "groin")
msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
user.visible_message(msg, self_msg)
@@ -412,10 +412,10 @@
/datum/surgery_step/retract_carapace/end_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery)
var/msg = " [user] keeps the incision open on [target]'s [target_zone] with \the [tool] ."
var/self_msg = " You keep the incision open on [target]'s [target_zone] with \the [tool]. "
- if (target_zone == "chest")
+ if(target_zone == "chest")
msg = " [user] keeps the ribcage open on [target]'s torso with \the [tool]. "
self_msg = " You keep the ribcage open on [target]'s torso with \the [tool]. "
- if (target_zone == "groin")
+ if(target_zone == "groin")
msg = " [user] keeps the incision open on [target]'s lower abdomen with \the [tool]. "
self_msg = " You keep the incision open on [target]'s lower abdomen with \the [tool]. "
user.visible_message(msg, self_msg)
@@ -424,10 +424,10 @@
/datum/surgery_step/generic/retract_carapace/fail_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery)
var/msg = " [user]'s hand slips, tearing the edges of incision on [target]'s [target_zone] with \the [tool]! "
var/self_msg = " Your hand slips, tearing the edges of incision on [target]'s [target_zone] with \the [tool]! "
- if (target_zone == "chest")
+ if(target_zone == "chest")
msg = " [user]'s hand slips, damaging several organs [target]'s torso with \the [tool]! "
self_msg = " Your hand slips, damaging several organs [target]'s torso with \the [tool]! "
- if (target_zone == "groin")
+ if(target_zone == "groin")
msg = " [user]'s hand slips, damaging several organs [target]'s lower abdomen with \the [tool] "
self_msg = " Your hand slips, damaging several organs [target]'s lower abdomen with \the [tool]! "
user.visible_message(msg, self_msg)
diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm
index 8e3ff02b091..44c0e30d9f2 100644
--- a/code/modules/surgery/other.dm
+++ b/code/modules/surgery/other.dm
@@ -66,7 +66,7 @@
for(var/datum/wound/W in affected.wounds) if(W.internal)
affected.wounds -= W
affected.update_damages()
- if (ishuman(user) && prob(40))
+ if(ishuman(user) && prob(40))
var/mob/living/carbon/human/U = user
U.bloody_hands(target, 0)
@@ -97,7 +97,7 @@
if(!hasorgans(target))
return 0
- if (target_zone == "mouth" || target_zone == "eyes")
+ if(target_zone == "mouth" || target_zone == "eyes")
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -143,7 +143,7 @@
time = 24
/datum/surgery_step/fix_dead_tissue/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!istype(tool, /obj/item/weapon/reagent_containers))
+ if(!istype(tool, /obj/item/weapon/reagent_containers))
return 0
var/obj/item/weapon/reagent_containers/container = tool
@@ -153,7 +153,7 @@
if(!hasorgans(target))
return 0
- if (target_zone == "mouth" || target_zone == "eyes")
+ if(target_zone == "mouth" || target_zone == "eyes")
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -169,13 +169,13 @@
/datum/surgery_step/fix_dead_tissue/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (!istype(tool, /obj/item/weapon/reagent_containers))
+ if(!istype(tool, /obj/item/weapon/reagent_containers))
return
var/obj/item/weapon/reagent_containers/container = tool
var/trans = container.reagents.trans_to(target, container.amount_per_transfer_from_this)
- if (trans > 0)
+ if(trans > 0)
container.reagents.reaction(target, INGEST) //technically it's contact, but the reagents are being applied to internal tissue
if(container.reagents.has_reagent("mitocholide"))
@@ -189,7 +189,7 @@
/datum/surgery_step/fix_dead_tissue/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (!istype(tool, /obj/item/weapon/reagent_containers))
+ if(!istype(tool, /obj/item/weapon/reagent_containers))
return
var/obj/item/weapon/reagent_containers/container = tool
@@ -232,7 +232,7 @@
time = 30
/datum/surgery_step/internal/dethrall/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
return ..() && affected && is_thrall(target) && affected.open_enough_for_surgery() && target_zone == target.named_organ_parent("brain")
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index fee1d87323a..4567c465678 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -48,26 +48,26 @@
can_infect = 0
/datum/surgery_step/robotics/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (isslime(target))
+ if(isslime(target))
return 0
- if (target_zone == "eyes") //there are specific steps for eye surgery
+ if(target_zone == "eyes") //there are specific steps for eye surgery
return 0
- if (!hasorgans(target))
+ if(!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (affected == null)
+ if(affected == null)
return 0
- if (affected.status & ORGAN_DESTROYED)
+ if(affected.status & ORGAN_DESTROYED)
return 0
return 1
/datum/surgery_step/robotics/external
/datum/surgery_step/robotics/external/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if (!..())
+ if(!..())
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (!(affected.status & ORGAN_ROBOT))
+ if(!(affected.status & ORGAN_ROBOT))
return 0
return 1
@@ -373,7 +373,7 @@
else if(implement_type in implements_mend)
current_type = "mend"
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -396,7 +396,7 @@
/datum/surgery_step/robotics/manipulate_robotic_organs/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
if(current_type == "mend")
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
for(var/obj/item/organ/internal/I in affected.internal_organs)
if(I && I.damage > 0)
@@ -418,13 +418,13 @@
if(I && istype(I))
I.status &= ~ORGAN_CUT_AWAY
- else if (current_type == "install")
+ else if(current_type == "install")
user.visible_message(" [user] has installed \the [tool] into [target]'s [affected.name]. ", \
" You have installed \the [tool] into [target]'s [affected.name]. ")
var/obj/item/device/mmi/M = tool
var/obj/item/organ/internal/brain/mmi_holder/holder = new()
- if (istype(M, /obj/item/device/mmi/posibrain))
+ if(istype(M, /obj/item/device/mmi/posibrain))
holder.robotize()
holder.insert(target)
@@ -461,7 +461,7 @@
/datum/surgery_step/robotics/manipulate_robotic_organs/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
if(current_type == "mend")
- if (!hasorgans(target))
+ if(!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -483,7 +483,7 @@
user.visible_message(" [user]'s hand slips, disconnecting \the [tool]. ", \
" Your hand slips, disconnecting \the [tool]. ")
- else if (current_type == "install")
+ else if(current_type == "install")
user.visible_message(" [user]'s hand slips! .", \
" Your hand slips! ")
else if(current_type == "finish")
@@ -549,7 +549,7 @@
var/obj/item/device/mmi/M = tool
var/obj/item/organ/internal/brain/mmi_holder/holder = new()
- if (istype(M, /obj/item/device/mmi/posibrain))
+ if(istype(M, /obj/item/device/mmi/posibrain))
holder.robotize()
holder.insert(target)
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index 672ae3ac804..8a60718ccbf 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -130,8 +130,8 @@
//returns how well tool is suited for this step
/datum/surgery_step/proc/tool_quality(obj/item/tool)
- for (var/T in allowed_tools)
- if (istype(tool,T))
+ for(var/T in allowed_tools)
+ if(istype(tool,T))
return allowed_tools[T]
return 0
@@ -160,13 +160,13 @@
/datum/surgery_step/proc/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
if(ishuman(target))
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (can_infect && affected)
+ if(can_infect && affected)
spread_germs_to_organ(affected, user)
- if (ishuman(user) && !(istype(target,/mob/living/carbon/alien)) && prob(60))
+ if(ishuman(user) && !(istype(target,/mob/living/carbon/alien)) && prob(60))
var/mob/living/carbon/human/H = user
- if (blood_level)
+ if(blood_level)
H.bloody_hands(target,0)
- if (blood_level > 1)
+ if(blood_level > 1)
H.bloody_body(target,0)
return
@@ -192,7 +192,7 @@
/proc/sort_surgeries()
var/gap = surgery_steps.len
var/swapped = 1
- while (gap > 1 || swapped)
+ while(gap > 1 || swapped)
swapped = 0
if(gap > 1)
gap = round(gap / 1.247330950103979)
diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm
index b878034ff4a..2e47438eb44 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -5,7 +5,7 @@
icon_state = "retractor"
materials = list(MAT_METAL=6000, MAT_GLASS=3000)
flags = CONDUCT
- w_class = 2.0
+ w_class = 2
origin_tech = "materials=1;biotech=1"
@@ -16,7 +16,7 @@
icon_state = "hemostat"
materials = list(MAT_METAL=5000, MAT_GLASS=2500)
flags = CONDUCT
- w_class = 1.0
+ w_class = 1
origin_tech = "materials=1;biotech=1"
attack_verb = list("attacked", "pinched")
@@ -28,7 +28,7 @@
icon_state = "cautery"
materials = list(MAT_METAL=2500, MAT_GLASS=750)
flags = CONDUCT
- w_class = 1.0
+ w_class = 1
origin_tech = "materials=1;biotech=1"
attack_verb = list("burnt")
@@ -44,7 +44,7 @@
force = 15.0
sharp = 1
edge = 1
- w_class = 3.0
+ w_class = 3
origin_tech = "materials=1;biotech=1"
attack_verb = list("drilled")
@@ -63,7 +63,7 @@
force = 10.0
sharp = 1
edge = 1
- w_class = 1.0
+ w_class = 1
throwforce = 5.0
throw_speed = 3
throw_range = 5
@@ -124,7 +124,7 @@
force = 15.0
sharp = 1
edge = 1
- w_class = 3.0
+ w_class = 3
throwforce = 9.0
throw_speed = 3
throw_range = 5
@@ -138,7 +138,7 @@
icon = 'icons/obj/surgery.dmi'
icon_state = "bone-gel"
force = 0
- w_class = 2.0
+ w_class = 2
throwforce = 1.0
origin_tech = "materials=1;biotech=1"
@@ -149,7 +149,7 @@
force = 0
throwforce = 1.0
origin_tech = "materials=1;biotech=1"
- w_class = 2.0
+ w_class = 2
/obj/item/weapon/bonesetter
name = "bone setter"
@@ -159,7 +159,7 @@
throwforce = 9.0
throw_speed = 3
throw_range = 5
- w_class = 2.0
+ w_class = 2
attack_verb = list("attacked", "hit", "bludgeoned")
origin_tech = "materials=1;biotech=1"
@@ -168,6 +168,6 @@
desc = "Nanotrasen brand surgical drapes provide optimal safety and infection control."
icon = 'icons/obj/surgery.dmi'
icon_state = "surgical_drapes"
- w_class = 1.0
+ w_class = 1
origin_tech = "biotech=1"
attack_verb = list("slapped")
diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm
index 2c6185d0d3c..f226edc08eb 100644
--- a/code/modules/telesci/bscrystal.dm
+++ b/code/modules/telesci/bscrystal.dm
@@ -8,6 +8,7 @@
origin_tech = "bluespace=4;materials=3"
points = 50
var/blink_range = 8 // The teleport range when crushed/thrown at someone.
+ refined_type = /obj/item/stack/sheet/bluespace_crystal
/obj/item/weapon/ore/bluespace_crystal/New()
..()
@@ -38,4 +39,24 @@
name = "artificial bluespace crystal"
desc = "An artificially made bluespace crystal, it looks delicate."
origin_tech = "bluespace=2"
- blink_range = 4 // Not as good as the organic stuff!
\ No newline at end of file
+ blink_range = 4 // Not as good as the organic stuff!
+ points = 0 // nice try
+ refined_type = null
+
+// Polycrystals, aka stacks
+
+var/global/list/datum/stack_recipe/bluespace_crystal_recipes = list(new/datum/stack_recipe("Breadkdown into bluespace crystal", /obj/item/weapon/ore/bluespace_crystal, 1, one_per_turf = 0, on_floor = 1))
+
+/obj/item/stack/sheet/bluespace_crystal
+ name = "bluespace polycrystal"
+ icon = 'icons/obj/telescience.dmi'
+ icon_state = "polycrystal"
+ desc = "A stable polycrystal, made of fused-together bluespace crystals. You could probably break one off."
+ origin_tech = "bluespace=4;materials=3"
+ attack_verb = list("bluespace polybashed", "bluespace polybattered", "bluespace polybludgeoned", "bluespace polythrashed", "bluespace polysmashed")
+
+/obj/item/stack/sheet/bluespace_crystal/New()
+ ..()
+ recipes = bluespace_crystal_recipes
+ pixel_x = rand(0,4)-4
+ pixel_y = rand(0,4)-4
\ No newline at end of file
diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm
index 97962435e7d..34db61ba18b 100644
--- a/code/modules/telesci/gps.dm
+++ b/code/modules/telesci/gps.dm
@@ -4,7 +4,7 @@ var/list/GPS_list = list()
desc = "Helping lost spacemen find their way through the planets since 2016."
icon = 'icons/obj/telescience.dmi'
icon_state = "gps-c"
- w_class = 2.0
+ w_class = 2
slot_flags = SLOT_BELT
origin_tech = "programming=2;engineering=2"
var/gpstag = "COM0"
@@ -79,3 +79,9 @@ var/list/GPS_list = list()
icon_state = "gps-m"
gpstag = "MINE0"
desc = "A positioning system helpful for rescuing trapped or injured miners, keeping one on you at all times while mining might just save your life."
+
+/obj/item/device/gps/cyborg
+ icon_state = "gps-b"
+ gpstag = "BORG0"
+ desc = "A mining cyborg internal positioning system. Used as a recovery beacon for damaged cyborg assets, or a collaboration tool for mining teams."
+ flags = NODROP
\ No newline at end of file
diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm
index b542f968516..a9585abfb80 100644
--- a/code/modules/telesci/telesci_computer.dm
+++ b/code/modules/telesci/telesci_computer.dm
@@ -79,7 +79,7 @@
..()
/obj/machinery/computer/telescience/emag_act(user as mob)
- if (!emagged)
+ if(!emagged)
to_chat(user, "\blue You scramble the Telescience authentication key to an unknown signal. You should be able to teleport to more places now!")
emagged = 1
else
@@ -252,7 +252,7 @@
log_msg += "[key_name(T)], "
else
log_msg += "[ROI.name]"
- if (istype(ROI, /obj/structure/closet))
+ if(istype(ROI, /obj/structure/closet))
var/obj/structure/closet/C = ROI
log_msg += " ("
for(var/atom/movable/Q as mob|obj in C)
@@ -260,7 +260,7 @@
log_msg += "[key_name(Q)], "
else
log_msg += "[Q.name], "
- if (dd_hassuffix(log_msg, "("))
+ if(dd_hassuffix(log_msg, "("))
log_msg += "empty)"
else
log_msg = dd_limittext(log_msg, length(log_msg) - 2)
@@ -268,7 +268,7 @@
log_msg += ", "
do_teleport(ROI, dest)
- if (dd_hassuffix(log_msg, ", "))
+ if(dd_hassuffix(log_msg, ", "))
log_msg = dd_limittext(log_msg, length(log_msg) - 2)
else
log_msg += "nothing"
@@ -289,7 +289,7 @@
temp_msg = "ERROR! Elevation is less than 1 or greater than 90."
return
if(z_co == 2 || z_co < 1 || z_co > 6)
- if (z_co == 7 & emagged == 1)
+ if(z_co == 7 & emagged == 1)
// This should be empty, allows for it to continue if the z-level is 7 and the machine is emagged.
else
telefail()
diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm
index cbe016c5bad..8aebf1a2f1f 100644
--- a/code/modules/tooltip/tooltip.dm
+++ b/code/modules/tooltip/tooltip.dm
@@ -41,7 +41,7 @@ Notes:
/datum/tooltip/New(client/C)
- if (C)
+ if(C)
owner = C
owner << browse(file2text(file), "window=[control]")
@@ -49,21 +49,21 @@ Notes:
/datum/tooltip/proc/show(atom/movable/thing, params = null, title = null, content = null, theme = "default", special = "none")
- if (!thing || !params || (!title && !content) || !owner || !isnum(world.icon_size))
+ if(!thing || !params || (!title && !content) || !owner || !isnum(world.icon_size))
return 0
- if (!init)
+ if(!init)
//Initialize some vars
init = 1
owner << output(list2params(list(world.icon_size, control)), "[control]:tooltip.init")
showing = 1
- if (title && content)
+ if(title && content)
title = "[title] "
content = "[content]
"
- else if (title && !content)
+ else if(title && !content)
title = "[title]
"
- else if (!title && content)
+ else if(!title && content)
content = "[content]
"
//Make our dumb param object
@@ -74,7 +74,7 @@ Notes:
//If a hide() was hit while we were showing, run hide() again to avoid stuck tooltips
showing = 0
- if (queueHide)
+ if(queueHide)
hide()
return 1
diff --git a/code/modules/tooltip/tooltip.html b/code/modules/tooltip/tooltip.html
index 9fa0702a2b3..0be70b4229d 100644
--- a/code/modules/tooltip/tooltip.html
+++ b/code/modules/tooltip/tooltip.html
@@ -102,7 +102,7 @@
window.location = 'byond://winset?id='+tooltip.control+';is-visible=false';
},
updateCallback: function(map) {
- if (typeof map === 'undefined' || !map) {return false;}
+ if(typeof map === 'undefined' || !map) {return false;}
//alert(tooltip.params+' | '+tooltip.clientView+' | '+tooltip.text+' | '+tooltip.theme); //DEBUG
@@ -123,7 +123,7 @@
//Parse out the tile and cursor locations from params (e.g. "icon-x=32;icon-y=29;screen-loc=3:10,15:29")
var paramsA = tooltip.params.cursor.split(';');
- if (paramsA.length < 3) {return false;} //Sometimes screen-loc is never sent ahaha fuck you byond
+ if(paramsA.length < 3) {return false;} //Sometimes screen-loc is never sent ahaha fuck you byond
//icon-x
var iconX = paramsA[0];
iconX = iconX.split('=');
@@ -136,10 +136,10 @@
var screenLoc = paramsA[2];
screenLoc = screenLoc.split('=');
screenLoc = screenLoc[1].split(',');
- if (screenLoc.length < 2) {return false;}
+ if(screenLoc.length < 2) {return false;}
var left = screenLoc[0];
var top = screenLoc[1];
- if (!left || !top) {return false;}
+ if(!left || !top) {return false;}
screenLoc = left.split(':');
left = parseInt(screenLoc[0]);
var enteredX = parseInt(screenLoc[1]);
@@ -152,26 +152,26 @@
var oScreenLoc = tooltip.params.screenLoc.split(','); //o for original ok
var west = oScreenLoc[0].split(':');
- if (west.length > 1) { //Only if west has a pixel offset
+ if(west.length > 1) { //Only if west has a pixel offset
var westOffset = parseInt(west[1]);
- if (westOffset !== 0) {
- if ((iconX + westOffset) !== enteredX) { //Cursor entered on the offset tile
+ if(westOffset !== 0) {
+ if((iconX + westOffset) !== enteredX) { //Cursor entered on the offset tile
left = left + (westOffset < 0 ? 1 : -1);
}
leftOffset = leftOffset + (westOffset * resizeRatio);
}
}
- if (oScreenLoc.length > 1) { //If north is given
+ if(oScreenLoc.length > 1) { //If north is given
var north = oScreenLoc[1].split(':');
- if (north.length > 1) { //Only if north has a pixel offset
+ if(north.length > 1) { //Only if north has a pixel offset
var northOffset = parseInt(north[1]);
- if (northOffset !== 0) {
- if ((iconY + northOffset) === enteredY) { //Cursor entered on the original tile
+ if(northOffset !== 0) {
+ if((iconY + northOffset) === enteredY) { //Cursor entered on the original tile
top--;
topOffset = topOffset - ((tooltip.tileSize + northOffset) * resizeRatio);
} else { //Cursor entered on the offset tile
- if (northOffset < 0) { //Offset southwards
+ if(northOffset < 0) { //Offset southwards
topOffset = topOffset - ((tooltip.tileSize + northOffset) * resizeRatio);
} else { //Offset northwards
top--;
@@ -183,7 +183,7 @@
}
//Handle special cases (for fuck sake)
- if (tooltip.special !== 'none') {
+ if(tooltip.special !== 'none') {
//Put yo special cases here
}
@@ -210,7 +210,7 @@
var docWidth = $wrap.outerWidth(),
docHeight = $wrap.outerHeight();
- if (posY + docHeight > map.size.y) { //Is the bottom edge below the window? Snap it up if so
+ if(posY + docHeight > map.size.y) { //Is the bottom edge below the window? Snap it up if so
posY = (posY - docHeight) - realIconSize - tooltip.padding;
}
diff --git a/code/modules/vehicle/vehicle.dm b/code/modules/vehicle/vehicle.dm
index bb112440944..edfa68f2dbd 100644
--- a/code/modules/vehicle/vehicle.dm
+++ b/code/modules/vehicle/vehicle.dm
@@ -13,7 +13,6 @@
var/vehicle_move_delay = 2 //tick delay between movements, lower = faster, higher = slower
var/auto_door_open = TRUE
var/needs_gravity = 0//To allow non-space vehicles to move in no gravity or not, mostly for adminbus
-
//Pixels
var/generic_pixel_x = 0 //All dirs show this pixel_x for the driver
var/generic_pixel_y = 0 //All dirs shwo this pixel_y for the driver
@@ -144,7 +143,7 @@
if(has_gravity(src))
return 1
- if(pulledby)
+ if(pulledby && pulledby != buckled_mob) // no pulling the vehicle you're driving through space!
return 1
if(needs_gravity)
diff --git a/code/world.dm b/code/world.dm
index b28a0c2d0de..6fa54acfbe7 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -35,17 +35,12 @@ var/global/datum/global_init/init = new ()
if(config && config.log_runtimes)
log = file("data/logs/runtime/[time2text(world.realtime,"YYYY-MM-DD-(hh-mm-ss)")]-runtime.log")
- SetupHooks() // /vg/
-
if(config && config.server_name != null && config.server_suffix && world.port > 0)
// dumb and hardcoded but I don't care~
config.server_name += " #[(world.port % 1000) / 100]"
timezoneOffset = text2num(time2text(0,"hh")) * 36000
- if(config && config.log_runtime)
- log = file("data/logs/runtime/[time2text(world.realtime,"YYYY-MM-DD-(hh-mm-ss)")]-runtime.log")
-
callHook("startup")
src.update_status()
@@ -100,9 +95,9 @@ var/world_topic_spam_protect_time = world.timeofday
var/list/input = params2list(T)
var/key_valid = (config.comms_password && input["key"] == config.comms_password) //no password means no comms, not any password
- if ("ping" in input)
+ if("ping" in input)
var/x = 1
- for (var/client/C)
+ for(var/client/C)
x++
return x
@@ -113,7 +108,7 @@ var/world_topic_spam_protect_time = world.timeofday
n++
return n
- else if ("status" in input)
+ else if("status" in input)
var/list/s = list()
var/list/admins = list()
s["version"] = game_version
@@ -226,7 +221,7 @@ var/world_topic_spam_protect_time = world.timeofday
return "Bad Key"
/world/Reboot(var/reason, var/feedback_c, var/feedback_r, var/time)
- if (reason == 1) //special reboot, do none of the normal stuff
+ if(reason == 1) //special reboot, do none of the normal stuff
if(usr)
message_admins("[key_name_admin(usr)] has requested an immediate world restart via client side debugging tools")
log_admin("[key_name(usr)] has requested an immediate world restart via client side debugging tools")
@@ -253,7 +248,7 @@ var/world_topic_spam_protect_time = world.timeofday
//kick_clients_in_lobby("The round came to an end with you in the lobby. ", 1)
spawn(0)
- to_chat(world, sound(pick('sound/AI/newroundsexy.ogg','sound/misc/apcdestroyed.ogg','sound/misc/bangindonk.ogg')))// random end sounds!! - LastyBatsy
+ world << sound(pick('sound/AI/newroundsexy.ogg','sound/misc/apcdestroyed.ogg','sound/misc/bangindonk.ogg'))// random end sounds!! - LastyBatsy
processScheduler.stop()
@@ -282,36 +277,11 @@ var/world_topic_spam_protect_time = world.timeofday
log_access("AFK: [key_name(C)]")
to_chat(C, "\red You have been inactive for more than 10 minutes and have been disconnected.")
del(C)
- if ( ((world.timeofday - sleep_check) > work_length) || ((world.timeofday - sleep_check) < 0) )
+ if( ((world.timeofday - sleep_check) > work_length) || ((world.timeofday - sleep_check) < 0) )
sleep(sleep_length)
sleep_check = world.timeofday
waiting++
//#undef INACTIVITY_KICK
-/*
-#define DISCONNECTED_DELETE 6000 //10 minutes in ticks (approx)
-/world/proc/KickDisconnectedClients()
- spawn(-1)
- //set background = 1
- while(1)
- sleep(DISCONNECTED_DELETE)
- for(var/mob/living/carbon/human/C in living_mob_list)
- if (dd_hasprefix(C.key,@)) return
- if(!C.client && C.brain_op_stage!=4.0 && C.lastKnownIP)
- sleep(600)
- if(!C.client && C.stat != DEAD && C.brain_op_stage!=4.0)
- job_master.FreeRole(C.job)
- message_admins("[key_name_admin(C)], the [C.job] has been freed due to (Client disconnect for 10 minutes )\n")
- for(var/obj/item/W in C)
- C.unEquip(W)
- del(C)
- else if(!C.key && C.stat != DEAD && C.brain_op_stage!=4.0)
- job_master.FreeRole(C.job)
- message_admins("[key_name_admin(C)], the [C.job] has been freed due to (Client quit BYOND )\n")
- for(var/obj/item/W in C)
- C.unEquip(W)
- del(C)
-#undef INACTIVITY_KICK
-*/
/hook/startup/proc/loadMode()
world.load_mode()
@@ -327,7 +297,7 @@ var/world_topic_spam_protect_time = world.timeofday
/world/proc/save_mode(var/the_mode)
var/F = file("data/mode.txt")
fdel(F)
- to_chat(F, the_mode)
+ F << the_mode
/hook/startup/proc/loadMusic()
for(var/obj/machinery/media/jukebox/J in machines)
@@ -353,7 +323,7 @@ var/world_topic_spam_protect_time = world.timeofday
/world/proc/update_status()
var/s = ""
- if (config && config.server_name)
+ if(config && config.server_name)
s += "[config.server_name] — "
s += "[station_name()] ";
@@ -375,41 +345,41 @@ var/world_topic_spam_protect_time = world.timeofday
else
features += "STARTING "
- if (!enter_allowed)
+ if(!enter_allowed)
features += "closed"
features += abandon_allowed ? "respawn" : "no respawn"
- if (config && config.allow_vote_mode)
+ if(config && config.allow_vote_mode)
features += "vote"
- if (config && config.allow_ai)
+ if(config && config.allow_ai)
features += "AI allowed"
var/n = 0
- for (var/mob/M in player_list)
- if (M.client)
+ for(var/mob/M in player_list)
+ if(M.client)
n++
- if (n > 1)
+ if(n > 1)
features += "~[n] players"
- else if (n > 0)
+ else if(n > 0)
features += "~[n] player"
/*
is there a reason for this? the byond site shows 'hosted by X' when there is a proper host already.
- if (host)
+ if(host)
features += "hosted by [host] "
*/
-// if (!host && config && config.hostedby)
+// if(!host && config && config.hostedby)
// features += "hosted by [config.hostedby] "
- if (features)
+ if(features)
s += ": [jointext(features, ", ")]"
/* does this help? I do not know */
- if (src.status != s)
+ if(src.status != s)
src.status = s
#define FAILED_DB_CONNECTION_CUTOFF 5
@@ -439,7 +409,7 @@ proc/setup_database_connection()
dbcon.Connect("dbi:mysql:[db]:[address]:[port]","[user]","[pass]")
. = dbcon.IsConnected()
- if ( . )
+ if( . )
failed_db_connections = 0 //If this connection succeeded, reset the failed connections counter.
else
failed_db_connections++ //If it failed, increase the failed connections counter.
diff --git a/config/example/config.txt b/config/example/config.txt
index 1ed02a543d1..2f723c704f4 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -24,7 +24,7 @@ JOBS_HAVE_MINIMAL_ACCESS
## log OOC channel
LOG_OOC
-## log client Say
+## log client Say
LOG_SAY
## log admin actions
@@ -67,7 +67,7 @@ LOG_RUNTIME
KICK_INACTIVE
## probablities for game modes chosen in "secret" and "random" modes
-##
+##
## default probablity is 1, increase to make that mode more likely to be picked
## set to 0 to disable that mode
PROBABILITY EXTENDED 2
@@ -195,7 +195,7 @@ LOAD_JOBS_FROM_TXT
## Remove the # mark infront of this to forbid admins from posssessing the singularity.
#FORBID_SINGULO_POSSESSION
-## Remove the # to show a popup 'reply to' window to every non-admin that recieves an adminPM.
+## Remove the # to show a popup 'reply to' window to every non-admin that recieves an adminPM.
## The intention is to make adminPMs more visible. (although I fnd popups annoying so this defaults to off)
#POPUP_ADMIN_PM
@@ -260,7 +260,7 @@ GHOST_INTERACTION
## Default is "python" on Windows, "/usr/bin/env python2" on UNIX.
#PYTHON_PATH pythonw
-## Defines which Z-levels the station exists on.
+## Defines which Z-levels the station exists on.
STATION_LEVELS 1
## Defines which Z-levels are used for admin functionality, such as Central Command and the Syndicate Shuttle
@@ -304,6 +304,9 @@ PLAYER_REROUTE_CAP 0
## Disable the loading of away missions
#DISABLE_AWAY_MISSIONS
+## Disable the loading of space ruins
+DISABLE_SPACE_RUINS
+
## Uncomment to disable the OOC/LOOC channel by default.
#DISABLE_OOC
@@ -317,4 +320,7 @@ PLAYER_REROUTE_CAP 0
#DISABLE_LOBBY_MUSIC
## Uncomment this if you want to disable the popup alert for people on the same CID
-#DISABLE_CID_WARN_POPUP
\ No newline at end of file
+#DISABLE_CID_WARN_POPUP
+
+## How many loadout points players may spend in character setup
+#MAX_LOADOUT_POINTS 5
diff --git a/config/example/spaceRuinBlacklist.txt b/config/example/spaceRuinBlacklist.txt
new file mode 100644
index 00000000000..148cdeef583
--- /dev/null
+++ b/config/example/spaceRuinBlacklist.txt
@@ -0,0 +1,24 @@
+#Listing maps here will blacklist them from generating in space.
+#Maps must be the full path to them
+#A list of maps valid to blacklist can be found at _maps\map_files\RandomRuins\SpaceRuins\_maplisting.txt
+#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
+
+#_maps/map_files/RandomRuins/SpaceRuins/way_home.dmm
+#_maps/map_files/RandomRuins/SpaceRuins/asteroid1.dmm
+#_maps/map_files/RandomRuins/SpaceRuins/asteroid2.dmm
+#_maps/map_files/RandomRuins/SpaceRuins/asteroid3.dmm
+#_maps/map_files/RandomRuins/SpaceRuins/asteroid4.dmm
+#_maps/map_files/RandomRuins/SpaceRuins/asteroid5.dmm
+#_maps/map_files/RandomRuins/SpaceRuins/derelict1.dmm
+#_maps/map_files/RandomRuins/SpaceRuins/derelict2.dmm
+#_maps/map_files/RandomRuins/SpaceRuins/derelict3.dmm
+#_maps/map_files/RandomRuins/SpaceRuins/derelict4.dmm
+#_maps/map_files/RandomRuins/SpaceRuins/derelict5.dmm
+#_maps/map_files/RandomRuins/SpaceRuins/spacebar.dmm
+#_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm
+#_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm
+#_maps/map_files/RandomRuins/SpaceRuins/emptyshell.dmm
+#_maps/map_files/RandomRuins/SpaceRuins/gasthelizards.dmm
+#_maps/map_files/RandomRuins/SpaceRuins/intactemptyship.dmm
+#_maps/map_files/RandomRuins/SpaceRuins/mechtransport.dmm
+#_maps/map_files/RandomRuins/SpaceRuins/turretedoutpost.dmm
diff --git a/dm.sh b/dm.sh
index d77cabc637a..9585e2f1ce3 100644
--- a/dm.sh
+++ b/dm.sh
@@ -70,7 +70,7 @@ then
"$dm" $dmepath.mdme 2>&1 | tee result.log
retval=$?
- if ! grep '0 errors, 0 warnings' result.log
+ if ! grep '\- 0 errors, 0 warnings' result.log
then
retval=1 #hard fail, due to warnings or errors
fi
diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css
new file mode 100644
index 00000000000..3829cbd3f48
--- /dev/null
+++ b/goon/browserassets/css/browserOutput.css
@@ -0,0 +1,364 @@
+/*****************************************
+*
+* GLOBAL STYLES
+*
+******************************************/
+html, body {
+ padding: 0;
+ margin: 0;
+ height: 100%;
+ color: #000000;
+}
+body {
+ background: #fff;
+ font-family: Verdana, "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 9pt;
+ line-height: 1.2;
+ overflow-x: hidden;
+ overflow-y: scroll;
+ word-wrap: break-word;
+}
+h1, h2, h3, h4, h5, h6 {color: #00f; font-family: Georgia, Verdana, sans-serif;}
+img {
+ margin: 0;
+ padding: 0;
+ line-height: 1;
+}
+img.icon {
+ width: 16px;
+ height: 16px;
+}
+a {color: #0000ff;}
+a:visited {color: #ff00ff;}
+a.popt {text-decoration: none;}
+
+
+/*****************************************
+*
+* OUTPUT NOT RELATED TO ACTUAL MESSAGES
+*
+******************************************/
+#loading {
+ position: fixed;
+ width: 300px;
+ height: 150px;
+ text-align: center;
+ left: 50%;
+ top: 50%;
+ margin: -75px 0 0 -150px;
+}
+#loading i {display: block; padding-bottom: 3px;}
+
+#messages {
+ font-size: 14px;
+ padding: 3px;
+ margin: 0;
+ word-wrap: break-word;
+}
+#newMessages {
+ position: fixed;
+ display: block;
+ bottom: 0;
+ right: 0;
+ padding: 8px;
+ background: #ddd;
+ text-decoration: none;
+ font-variant: small-caps;
+ font-size: 1.1em;
+ font-weight: bold;
+ color: #333;
+}
+#newMessages:hover {background: #ccc;}
+#newMessages i {vertical-align: middle; padding-left: 3px;}
+#ping {
+ position: fixed;
+ top: 0;
+ right: 40px;
+ width: 45px;
+ background: #ddd;
+ height: 30px;
+ padding: 8px 0 2px 0;
+}
+#ping i {display: block; text-align: center;}
+#ping .ms {
+ display: block;
+ text-align: center;
+ font-size: 8pt;
+ padding-top: 2px;
+}
+#options {
+ position: fixed;
+ top: 0;
+ right: 0;
+}
+#options a {
+ background: #ddd;
+ height: 30px;
+ padding: 5px 0;
+ display: block;
+ color: #333;
+ text-decoration: none;
+ line-height: 28px;
+ border-top: 1px solid #b4b4b4;
+}
+#options a:hover {background: #ccc;}
+#options .toggle {
+ width: 40px;
+ background: #ccc;
+ border-top: 0;
+ float: right;
+ text-align: center;
+}
+#options .sub {clear: both; display: none; width: 160px;}
+#options .sub.scroll {overflow-y: scroll;}
+#options .sub a {padding: 5px 0 5px 8px; line-height: 30px; font-size: 0.9em; clear: both;}
+#options .sub span {
+ display: block;
+ line-height: 30px;
+ float: left;
+}
+#options .sub i {
+ display: block;
+ padding: 0 5px;
+ font-size: 1.1em;
+ width: 22px;
+ text-align: center;
+ line-height: 30px;
+ float: right;
+}
+#options .decreaseFont {border-top: 0;}
+
+/* POPUPS */
+.popup {
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ background: #ddd;
+}
+.popup .close {
+ position: absolute;
+ background: #aaa;
+ top: 0;
+ right: 0;
+ color: #333;
+ text-decoration: none;
+ z-index: 2;
+ padding: 0 10px;
+ height: 30px;
+ line-height: 30px;
+}
+.popup .close:hover {background: #999;}
+.popup .head {
+ background: #999;
+ color: #ddd;
+ padding: 0 10px;
+ height: 30px;
+ line-height: 30px;
+ text-transform: uppercase;
+ font-size: 0.9em;
+ font-weight: bold;
+ border-bottom: 2px solid green;
+}
+.popup input {border: 1px solid #999; background: #fff; margin: 0; padding: 5px; outline: none; color: #333;}
+.popup input[type=text]:hover, .popup input[type=text]:active, .popup input[type=text]:focus {border-color: green;}
+.popup input[type=submit] {padding: 5px 10px; background: #999; color: #ddd; text-transform: uppercase; font-size: 0.9em; font-weight: bold;}
+.popup input[type=submit]:hover, .popup input[type=submit]:focus, .popup input[type=submit]:active {background: #aaa; cursor: pointer;}
+
+.changeFont {padding: 10px;}
+.changeFont a {display: block; text-decoration: none; padding: 3px; color: #333;}
+.changeFont a:hover {background: #ccc;}
+
+.highlightPopup {padding: 10px; text-align: center;}
+.highlightPopup input[type=text] {display: block; width: 215px; text-align: left; margin-top: 5px;}
+.highlightPopup input.highlightColor {background-color: #FFFF00;}
+.highlightPopup input.highlightTermSubmit {margin-top: 5px;}
+
+/* ADMIN CONTEXT MENU */
+.contextMenu {
+ background-color: #ddd;
+ position: fixed;
+ margin: 2px;
+ width: 150px;
+}
+.contextMenu a {
+ display: block;
+ padding: 2px 5px;
+ text-decoration: none;
+ color: #333;
+}
+
+.contextMenu a:hover {
+ background-color: #ccc;
+}
+
+/* ADMIN FILTER MESSAGES MENU */
+.filterMessages {padding: 5px;}
+.filterMessages div {padding: 2px 0;}
+.filterMessages input {}
+.filterMessages label {}
+
+.icon-stack {height: 1em; line-height: 1em; width: 1em; vertical-align: middle; margin-top: -2px;}
+
+
+/*****************************************
+*
+* OUTPUT ACTUALLY RELATED TO MESSAGES
+*
+******************************************/
+
+/* MOTD */
+.motd {color: #638500;}
+.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #638500; text-decoration: underline;}
+.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #638500;}
+
+/* ADD HERE FOR BOLD */
+.bold, .name, .prefix, .ooc, .looc, .adminooc, .adminlooc, .admin, .gfartooc, .gfartlooc, .gfartadmin, .mentorooc, .mentorlooc, .medal {font-weight: bold;}
+
+/* ADD HERE FOR ITALIC */
+.italic, .ghostdronesay.broadcast {font-style: italic;}
+
+/* OUTPUT COLORS */
+.highlight {background: yellow;}
+h1, h2, h3, h4, h5, h6 {color: #0000ff;font-family: Georgia, Verdana, sans-serif;}
+em {font-style: normal; font-weight: bold;}
+.motd {color: #638500; font-family: Verdana, sans-serif;}
+.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6
+ {color: #638500; text-decoration: underline;}
+.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover
+ {color: #638500;}
+.prefix { font-weight: bold;}
+.ooc { font-weight: bold;}
+.looc {color: #6699CC;}
+.adminobserverooc {color: #0099cc; font-weight: bold;}
+.adminooc {color: #b82e00; font-weight: bold;}
+.adminobserver {color: #996600; font-weight: bold;}
+.admin {color: #386aff; font-weight: bold;}
+.adminsay {color: #9611D4; font-weight: bold;}
+.mentorhelp {color: #0077bb; font-weight: bold;}
+.adminhelp {color: #aa0000; font-weight: bold;}
+.playerreply {color: #8800bb; font-weight: bold;}
+.name { font-weight: bold;}
+.say {}
+.siliconsay {font-family: 'Courier New', Courier, monospace;}
+.deadsay {color: #5c00e6;}
+.radio {color: #008000;}
+.deptradio {color: #993399;}
+.comradio {color: #193A7A;}
+.syndradio {color: #6d3f40;}
+.dsquadradio {color: #686868;}
+.resteamradio {color: #18BC46;}
+.airadio {color: #FF00FF;}
+.centradio {color: #5C5C8A;}
+.secradio {color: #A30000;}
+.engradio {color: #A66300;}
+.medradio {color: #008160;}
+.sciradio {color: #993399;}
+.supradio {color: #5F4519;}
+.srvradio {color: #6eaa2c;}
+.admin_channel {color: #9A04D1; font-weight: bold;}
+.mod_channel {color: #402A14; font-weight: bold;}
+.mod_channel_admin {color: #402A14; font-weight: bold;}
+.djradio {color: #663300;}
+.binaryradio {color: #0B0050; font-family: 'Courier New', Courier, monospace;}
+.mommiradio {color: navy;}
+.alert {color: #ff0000;}
+h1.alert, h2.alert {color: #000000;}
+.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;}
+.emote { font-style: italic;}
+.selecteddna {color: #FFFFFF; background-color: #001B1B}
+
+.attack {color: #ff0000;}
+.moderate {color: #CC0000;}
+.disarm {color: #990000;}
+.passive {color: #660000;}
+
+.warning {color: #ff0000; font-style: italic;}
+.boldwarning {color: #ff0000; font-style: italic; font-weight: bold}
+.danger {color: #ff0000; font-weight: bold;}
+.userdanger {color: #ff0000; font-weight: bold; font-size: 120%;}
+.biggerdanger {color: #ff0000; font-weight: bold; font-size: 150%;}
+
+.info {color: #0000CC;}
+.notice {color: #000099;}
+.bnotice {color: #000099; font-weight: bold;}
+.boldnotice {color: #000099; font-weight: bold;}
+.suicide {color: #ff5050; font-style: italic;}
+
+.announce {color: #228b22; font-weight: bold;}
+.boldannounce {color: #ff0000; font-weight: bold;}
+.greenannounce {color: #00ff00; font-weight: bold;}
+
+.alien {color: #543354;}
+.noticealien {color: #00c000;}
+.alertalien {color: #00c000; font-weight: bold;}
+
+.sinister {color: #800080; font-weight: bold; font-style: italic;} /* /vg/ */
+.blob {color: #006221; font-weight: bold; font-style: italic;}
+.confirm {color: #00af3b;}
+.rose {color: #ff5050;}
+.sans {font-family: 'Comic Sans MS', cursive, sans-serif;}
+.ancient {color: #008B8B; font-stye: italic;}
+.newscaster {color: #800000;}
+.mod {color: #735638; font-weight: bold;}
+.modooc {color: #184880; font-weight: bold;}
+.adminmod {color: #402A14; font-weight: bold;}
+.tajaran {color: #803B56;}
+.skrell {color: #00CED1;}
+.solcom {color: #22228B;}
+.soghun {color: #228B22;}
+.changeling {color: #800080;}
+.vox {color: #AA00AA;}
+.trinary {color: #727272;}
+.kidan {color: #664205;}
+.slime {color: #0077AA;}
+.drask {color: #a3d4eb; font-family: "Arial Black";}
+.clown {color: #ff0000;}
+.shadowling {color: #3b2769;}
+.vulpkanin {color: #B97A57;}
+.abductor {color: #800080;}
+.rough {font-family: 'Trebuchet MS', cursive, sans-serif;}
+.say_quote {font-family: Georgia, Verdana, sans-serif;}
+.cult {color: #800080; font-weight: bold; font-style: italic;}
+.cultspeech {color: #7F0000; font-style: italic;}
+.interface {color: #330033;}
+.big {font-size: 150%;}
+.reallybig {font-size: 175%;}
+.greentext {color: #00FF00; font-size: 150%;}
+.redtext {color: #FF0000; font-size: 150%;}
+.bold {font-weight: bold;}
+.center {text-align: center;}
+.red {color: #FF0000;}
+.skeleton {color: #585858; font-weight: bold; font-style: italic;}
+.gutter {color: #7092BE; font-family: "Trebuchet MS", cursive, sans-serif;}
+.orange {color: #ffa500;}
+.orangei {color: #ffa500; font-style: italic;}
+.orangeb {color: #ffa500; font-weight: bold;}
+
+.revennotice {color: #1d2953;}
+.revenboldnotice {color: #1d2953; font-weight: bold;}
+.revenbignotice {color: #1d2953; font-weight: bold; font-size: 3;}
+.revenminor {color: #823abb}
+.revenwarning {color: #760fbb; font-style: italic;}
+.revendanger {color: #760fbb; font-weight: bold; font-size: 3;}
+
+/* /vg/ */
+.good {color: green;}
+.average {color: #FF8000;}
+.bad {color: #FF0000;}
+/* /vg/ Saycode Rewrite */
+.italics, .talkinto {font-style:italic;}
+.whisper {font-style:italic;color:#333333;}
+/* Recruiting stuff */
+.recruit {color: #5c00e6; font-weight: bold; font-style: italic;}
+"}
+
+.memo {color: #638500; text-align: center;}
+.memoedit {text-align: center; font-size: 2;}
+
+.connectionClosed, .fatalError {background: red; color: white; padding: 5px;}
+.connectionClosed.restored {background: green;}
+.internal.boldnshit {color: blue; font-weight: bold;}
+
+/* HELPER CLASSES */
+.text-normal {font-weight: normal; font-style: normal;}
+.hidden {display: none; visibility: hidden;}
diff --git a/goon/browserassets/css/font-awesome.css b/goon/browserassets/css/font-awesome.css
new file mode 100644
index 00000000000..956b4cbafd8
--- /dev/null
+++ b/goon/browserassets/css/font-awesome.css
@@ -0,0 +1,788 @@
+@font-face{font-family:'FontAwesome';src:url('fontawesome-webfont.eot');src:url('fontawesome-webfont.eot') format('embedded-opentype'),url('fontawesome-webfont.woff') format('woff'),url('fontawesome-webfont.ttf') format('truetype'),url('fontawesome-webfont.svg') format('svg');font-weight:normal;font-style:normal;}[class^="icon-"],[class*=" icon-"]{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;}
+[class^="icon-"]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;speak:none;}
+.icon-large:before{vertical-align:-10%;font-size:1.3333333333333333em;}
+a [class^="icon-"],a [class*=" icon-"]{display:inline;}
+[class^="icon-"].icon-fixed-width,[class*=" icon-"].icon-fixed-width{display:inline-block;width:1.1428571428571428em;text-align:right;padding-right:0.2857142857142857em;}[class^="icon-"].icon-fixed-width.icon-large,[class*=" icon-"].icon-fixed-width.icon-large{width:1.4285714285714286em;}
+.icons-ul{margin-left:2.142857142857143em;list-style-type:none;}.icons-ul>li{position:relative;}
+.icons-ul .icon-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;text-align:center;line-height:inherit;}
+[class^="icon-"].hide,[class*=" icon-"].hide{display:none;}
+.icon-muted{color:#eeeeee;}
+.icon-light{color:#ffffff;}
+.icon-dark{color:#333333;}
+.icon-border{border:solid 1px #eeeeee;padding:.2em .25em .15em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+.icon-2x{font-size:2em;}.icon-2x.icon-border{border-width:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.icon-3x{font-size:3em;}.icon-3x.icon-border{border-width:3px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
+.icon-4x{font-size:4em;}.icon-4x.icon-border{border-width:4px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
+.icon-5x{font-size:5em;}.icon-5x.icon-border{border-width:5px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;}
+.pull-right{float:right;}
+.pull-left{float:left;}
+[class^="icon-"].pull-left,[class*=" icon-"].pull-left{margin-right:.3em;}
+[class^="icon-"].pull-right,[class*=" icon-"].pull-right{margin-left:.3em;}
+[class^="icon-"],[class*=" icon-"]{display:inline;width:auto;height:auto;line-height:normal;vertical-align:baseline;background-image:none;background-position:0% 0%;background-repeat:repeat;margin-top:0;}
+.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:none;}
+.btn [class^="icon-"].icon-large,.nav [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large,.nav [class*=" icon-"].icon-large{line-height:.9em;}
+.btn [class^="icon-"].icon-spin,.nav [class^="icon-"].icon-spin,.btn [class*=" icon-"].icon-spin,.nav [class*=" icon-"].icon-spin{display:inline-block;}
+.nav-tabs [class^="icon-"],.nav-pills [class^="icon-"],.nav-tabs [class*=" icon-"],.nav-pills [class*=" icon-"],.nav-tabs [class^="icon-"].icon-large,.nav-pills [class^="icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large{line-height:.9em;}
+.btn [class^="icon-"].pull-left.icon-2x,.btn [class*=" icon-"].pull-left.icon-2x,.btn [class^="icon-"].pull-right.icon-2x,.btn [class*=" icon-"].pull-right.icon-2x{margin-top:.18em;}
+.btn [class^="icon-"].icon-spin.icon-large,.btn [class*=" icon-"].icon-spin.icon-large{line-height:.8em;}
+.btn.btn-small [class^="icon-"].pull-left.icon-2x,.btn.btn-small [class*=" icon-"].pull-left.icon-2x,.btn.btn-small [class^="icon-"].pull-right.icon-2x,.btn.btn-small [class*=" icon-"].pull-right.icon-2x{margin-top:.25em;}
+.btn.btn-large [class^="icon-"],.btn.btn-large [class*=" icon-"]{margin-top:0;}.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x,.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-top:.05em;}
+.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x{margin-right:.2em;}
+.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-left:.2em;}
+.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{line-height:inherit;}
+.icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:-35%;}.icon-stack [class^="icon-"],.icon-stack [class*=" icon-"]{display:block;text-align:center;position:absolute;width:100%;height:100%;font-size:1em;line-height:inherit;*line-height:2em;}
+.icon-stack .icon-stack-base{font-size:2em;*line-height:1em;}
+.icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear;}
+a .icon-stack,a .icon-spin{display:inline-block;text-decoration:none;}
+@-moz-keyframes spin{0%{-moz-transform:rotate(0deg);} 100%{-moz-transform:rotate(359deg);}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);} 100%{-webkit-transform:rotate(359deg);}}@-o-keyframes spin{0%{-o-transform:rotate(0deg);} 100%{-o-transform:rotate(359deg);}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg);} 100%{-ms-transform:rotate(359deg);}}@keyframes spin{0%{transform:rotate(0deg);} 100%{transform:rotate(359deg);}}.icon-rotate-90:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);}
+.icon-rotate-180:before{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);}
+.icon-rotate-270:before{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);}
+.icon-flip-horizontal:before{-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1);}
+.icon-flip-vertical:before{-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1);}
+a .icon-rotate-90:before,a .icon-rotate-180:before,a .icon-rotate-270:before,a .icon-flip-horizontal:before,a .icon-flip-vertical:before{display:inline-block;}
+.icon-glass:before{content:"\f000";}
+.icon-music:before{content:"\f001";}
+.icon-search:before{content:"\f002";}
+.icon-envelope-alt:before{content:"\f003";}
+.icon-heart:before{content:"\f004";}
+.icon-star:before{content:"\f005";}
+.icon-star-empty:before{content:"\f006";}
+.icon-user:before{content:"\f007";}
+.icon-film:before{content:"\f008";}
+.icon-th-large:before{content:"\f009";}
+.icon-th:before{content:"\f00a";}
+.icon-th-list:before{content:"\f00b";}
+.icon-ok:before{content:"\f00c";}
+.icon-remove:before{content:"\f00d";}
+.icon-zoom-in:before{content:"\f00e";}
+.icon-zoom-out:before{content:"\f010";}
+.icon-power-off:before,.icon-off:before{content:"\f011";}
+.icon-signal:before{content:"\f012";}
+.icon-gear:before,.icon-cog:before{content:"\f013";}
+.icon-trash:before{content:"\f014";}
+.icon-home:before{content:"\f015";}
+.icon-file-alt:before{content:"\f016";}
+.icon-time:before{content:"\f017";}
+.icon-road:before{content:"\f018";}
+.icon-download-alt:before{content:"\f019";}
+.icon-download:before{content:"\f01a";}
+.icon-upload:before{content:"\f01b";}
+.icon-inbox:before{content:"\f01c";}
+.icon-play-circle:before{content:"\f01d";}
+.icon-rotate-right:before,.icon-repeat:before{content:"\f01e";}
+.icon-refresh:before{content:"\f021";}
+.icon-list-alt:before{content:"\f022";}
+.icon-lock:before{content:"\f023";}
+.icon-flag:before{content:"\f024";}
+.icon-headphones:before{content:"\f025";}
+.icon-volume-off:before{content:"\f026";}
+.icon-volume-down:before{content:"\f027";}
+.icon-volume-up:before{content:"\f028";}
+.icon-qrcode:before{content:"\f029";}
+.icon-barcode:before{content:"\f02a";}
+.icon-tag:before{content:"\f02b";}
+.icon-tags:before{content:"\f02c";}
+.icon-book:before{content:"\f02d";}
+.icon-bookmark:before{content:"\f02e";}
+.icon-print:before{content:"\f02f";}
+.icon-camera:before{content:"\f030";}
+.icon-font:before{content:"\f031";}
+.icon-bold:before{content:"\f032";}
+.icon-italic:before{content:"\f033";}
+.icon-text-height:before{content:"\f034";}
+.icon-text-width:before{content:"\f035";}
+.icon-align-left:before{content:"\f036";}
+.icon-align-center:before{content:"\f037";}
+.icon-align-right:before{content:"\f038";}
+.icon-align-justify:before{content:"\f039";}
+.icon-list:before{content:"\f03a";}
+.icon-indent-left:before{content:"\f03b";}
+.icon-indent-right:before{content:"\f03c";}
+.icon-facetime-video:before{content:"\f03d";}
+.icon-picture:before{content:"\f03e";}
+.icon-pencil:before{content:"\f040";}
+.icon-map-marker:before{content:"\f041";}
+.icon-adjust:before{content:"\f042";}
+.icon-tint:before{content:"\f043";}
+.icon-edit:before{content:"\f044";}
+.icon-share:before{content:"\f045";}
+.icon-check:before{content:"\f046";}
+.icon-move:before{content:"\f047";}
+.icon-step-backward:before{content:"\f048";}
+.icon-fast-backward:before{content:"\f049";}
+.icon-backward:before{content:"\f04a";}
+.icon-play:before{content:"\f04b";}
+.icon-pause:before{content:"\f04c";}
+.icon-stop:before{content:"\f04d";}
+.icon-forward:before{content:"\f04e";}
+.icon-fast-forward:before{content:"\f050";}
+.icon-step-forward:before{content:"\f051";}
+.icon-eject:before{content:"\f052";}
+.icon-chevron-left:before{content:"\f053";}
+.icon-chevron-right:before{content:"\f054";}
+.icon-plus-sign:before{content:"\f055";}
+.icon-minus-sign:before{content:"\f056";}
+.icon-remove-sign:before{content:"\f057";}
+.icon-ok-sign:before{content:"\f058";}
+.icon-question-sign:before{content:"\f059";}
+.icon-info-sign:before{content:"\f05a";}
+.icon-screenshot:before{content:"\f05b";}
+.icon-remove-circle:before{content:"\f05c";}
+.icon-ok-circle:before{content:"\f05d";}
+.icon-ban-circle:before{content:"\f05e";}
+.icon-arrow-left:before{content:"\f060";}
+.icon-arrow-right:before{content:"\f061";}
+.icon-arrow-up:before{content:"\f062";}
+.icon-arrow-down:before{content:"\f063";}
+.icon-mail-forward:before,.icon-share-alt:before{content:"\f064";}
+.icon-resize-full:before{content:"\f065";}
+.icon-resize-small:before{content:"\f066";}
+.icon-plus:before{content:"\f067";}
+.icon-minus:before{content:"\f068";}
+.icon-asterisk:before{content:"\f069";}
+.icon-exclamation-sign:before{content:"\f06a";}
+.icon-gift:before{content:"\f06b";}
+.icon-leaf:before{content:"\f06c";}
+.icon-fire:before{content:"\f06d";}
+.icon-eye-open:before{content:"\f06e";}
+.icon-eye-close:before{content:"\f070";}
+.icon-warning-sign:before{content:"\f071";}
+.icon-plane:before{content:"\f072";}
+.icon-calendar:before{content:"\f073";}
+.icon-random:before{content:"\f074";}
+.icon-comment:before{content:"\f075";}
+.icon-magnet:before{content:"\f076";}
+.icon-chevron-up:before{content:"\f077";}
+.icon-chevron-down:before{content:"\f078";}
+.icon-retweet:before{content:"\f079";}
+.icon-shopping-cart:before{content:"\f07a";}
+.icon-folder-close:before{content:"\f07b";}
+.icon-folder-open:before{content:"\f07c";}
+.icon-resize-vertical:before{content:"\f07d";}
+.icon-resize-horizontal:before{content:"\f07e";}
+.icon-bar-chart:before{content:"\f080";}
+.icon-twitter-sign:before{content:"\f081";}
+.icon-facebook-sign:before{content:"\f082";}
+.icon-camera-retro:before{content:"\f083";}
+.icon-key:before{content:"\f084";}
+.icon-gears:before,.icon-cogs:before{content:"\f085";}
+.icon-comments:before{content:"\f086";}
+.icon-thumbs-up-alt:before{content:"\f087";}
+.icon-thumbs-down-alt:before{content:"\f088";}
+.icon-star-half:before{content:"\f089";}
+.icon-heart-empty:before{content:"\f08a";}
+.icon-signout:before{content:"\f08b";}
+.icon-linkedin-sign:before{content:"\f08c";}
+.icon-pushpin:before{content:"\f08d";}
+.icon-external-link:before{content:"\f08e";}
+.icon-signin:before{content:"\f090";}
+.icon-trophy:before{content:"\f091";}
+.icon-github-sign:before{content:"\f092";}
+.icon-upload-alt:before{content:"\f093";}
+.icon-lemon:before{content:"\f094";}
+.icon-phone:before{content:"\f095";}
+.icon-unchecked:before,.icon-check-empty:before{content:"\f096";}
+.icon-bookmark-empty:before{content:"\f097";}
+.icon-phone-sign:before{content:"\f098";}
+.icon-twitter:before{content:"\f099";}
+.icon-facebook:before{content:"\f09a";}
+.icon-github:before{content:"\f09b";}
+.icon-unlock:before{content:"\f09c";}
+.icon-credit-card:before{content:"\f09d";}
+.icon-rss:before{content:"\f09e";}
+.icon-hdd:before{content:"\f0a0";}
+.icon-bullhorn:before{content:"\f0a1";}
+.icon-bell:before{content:"\f0a2";}
+.icon-certificate:before{content:"\f0a3";}
+.icon-hand-right:before{content:"\f0a4";}
+.icon-hand-left:before{content:"\f0a5";}
+.icon-hand-up:before{content:"\f0a6";}
+.icon-hand-down:before{content:"\f0a7";}
+.icon-circle-arrow-left:before{content:"\f0a8";}
+.icon-circle-arrow-right:before{content:"\f0a9";}
+.icon-circle-arrow-up:before{content:"\f0aa";}
+.icon-circle-arrow-down:before{content:"\f0ab";}
+.icon-globe:before{content:"\f0ac";}
+.icon-wrench:before{content:"\f0ad";}
+.icon-tasks:before{content:"\f0ae";}
+.icon-filter:before{content:"\f0b0";}
+.icon-briefcase:before{content:"\f0b1";}
+.icon-fullscreen:before{content:"\f0b2";}
+.icon-group:before{content:"\f0c0";}
+.icon-link:before{content:"\f0c1";}
+.icon-cloud:before{content:"\f0c2";}
+.icon-beaker:before{content:"\f0c3";}
+.icon-cut:before{content:"\f0c4";}
+.icon-copy:before{content:"\f0c5";}
+.icon-paperclip:before,.icon-paper-clip:before{content:"\f0c6";}
+.icon-save:before{content:"\f0c7";}
+.icon-sign-blank:before{content:"\f0c8";}
+.icon-reorder:before{content:"\f0c9";}
+.icon-list-ul:before{content:"\f0ca";}
+.icon-list-ol:before{content:"\f0cb";}
+.icon-strikethrough:before{content:"\f0cc";}
+.icon-underline:before{content:"\f0cd";}
+.icon-table:before{content:"\f0ce";}
+.icon-magic:before{content:"\f0d0";}
+.icon-truck:before{content:"\f0d1";}
+.icon-pinterest:before{content:"\f0d2";}
+.icon-pinterest-sign:before{content:"\f0d3";}
+.icon-google-plus-sign:before{content:"\f0d4";}
+.icon-google-plus:before{content:"\f0d5";}
+.icon-money:before{content:"\f0d6";}
+.icon-caret-down:before{content:"\f0d7";}
+.icon-caret-up:before{content:"\f0d8";}
+.icon-caret-left:before{content:"\f0d9";}
+.icon-caret-right:before{content:"\f0da";}
+.icon-columns:before{content:"\f0db";}
+.icon-sort:before{content:"\f0dc";}
+.icon-sort-down:before{content:"\f0dd";}
+.icon-sort-up:before{content:"\f0de";}
+.icon-envelope:before{content:"\f0e0";}
+.icon-linkedin:before{content:"\f0e1";}
+.icon-rotate-left:before,.icon-undo:before{content:"\f0e2";}
+.icon-legal:before{content:"\f0e3";}
+.icon-dashboard:before{content:"\f0e4";}
+.icon-comment-alt:before{content:"\f0e5";}
+.icon-comments-alt:before{content:"\f0e6";}
+.icon-bolt:before{content:"\f0e7";}
+.icon-sitemap:before{content:"\f0e8";}
+.icon-umbrella:before{content:"\f0e9";}
+.icon-paste:before{content:"\f0ea";}
+.icon-lightbulb:before{content:"\f0eb";}
+.icon-exchange:before{content:"\f0ec";}
+.icon-cloud-download:before{content:"\f0ed";}
+.icon-cloud-upload:before{content:"\f0ee";}
+.icon-user-md:before{content:"\f0f0";}
+.icon-stethoscope:before{content:"\f0f1";}
+.icon-suitcase:before{content:"\f0f2";}
+.icon-bell-alt:before{content:"\f0f3";}
+.icon-coffee:before{content:"\f0f4";}
+.icon-food:before{content:"\f0f5";}
+.icon-file-text-alt:before{content:"\f0f6";}
+.icon-building:before{content:"\f0f7";}
+.icon-hospital:before{content:"\f0f8";}
+.icon-ambulance:before{content:"\f0f9";}
+.icon-medkit:before{content:"\f0fa";}
+.icon-fighter-jet:before{content:"\f0fb";}
+.icon-beer:before{content:"\f0fc";}
+.icon-h-sign:before{content:"\f0fd";}
+.icon-plus-sign-alt:before{content:"\f0fe";}
+.icon-double-angle-left:before{content:"\f100";}
+.icon-double-angle-right:before{content:"\f101";}
+.icon-double-angle-up:before{content:"\f102";}
+.icon-double-angle-down:before{content:"\f103";}
+.icon-angle-left:before{content:"\f104";}
+.icon-angle-right:before{content:"\f105";}
+.icon-angle-up:before{content:"\f106";}
+.icon-angle-down:before{content:"\f107";}
+.icon-desktop:before{content:"\f108";}
+.icon-laptop:before{content:"\f109";}
+.icon-tablet:before{content:"\f10a";}
+.icon-mobile-phone:before{content:"\f10b";}
+.icon-circle-blank:before{content:"\f10c";}
+.icon-quote-left:before{content:"\f10d";}
+.icon-quote-right:before{content:"\f10e";}
+.icon-spinner:before{content:"\f110";}
+.icon-circle:before{content:"\f111";}
+.icon-mail-reply:before,.icon-reply:before{content:"\f112";}
+.icon-github-alt:before{content:"\f113";}
+.icon-folder-close-alt:before{content:"\f114";}
+.icon-folder-open-alt:before{content:"\f115";}
+.icon-expand-alt:before{content:"\f116";}
+.icon-collapse-alt:before{content:"\f117";}
+.icon-smile:before{content:"\f118";}
+.icon-frown:before{content:"\f119";}
+.icon-meh:before{content:"\f11a";}
+.icon-gamepad:before{content:"\f11b";}
+.icon-keyboard:before{content:"\f11c";}
+.icon-flag-alt:before{content:"\f11d";}
+.icon-flag-checkered:before{content:"\f11e";}
+.icon-terminal:before{content:"\f120";}
+.icon-code:before{content:"\f121";}
+.icon-reply-all:before{content:"\f122";}
+.icon-mail-reply-all:before{content:"\f122";}
+.icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123";}
+.icon-location-arrow:before{content:"\f124";}
+.icon-crop:before{content:"\f125";}
+.icon-code-fork:before{content:"\f126";}
+.icon-unlink:before{content:"\f127";}
+.icon-question:before{content:"\f128";}
+.icon-info:before{content:"\f129";}
+.icon-exclamation:before{content:"\f12a";}
+.icon-superscript:before{content:"\f12b";}
+.icon-subscript:before{content:"\f12c";}
+.icon-eraser:before{content:"\f12d";}
+.icon-puzzle-piece:before{content:"\f12e";}
+.icon-microphone:before{content:"\f130";}
+.icon-microphone-off:before{content:"\f131";}
+.icon-shield:before{content:"\f132";}
+.icon-calendar-empty:before{content:"\f133";}
+.icon-fire-extinguisher:before{content:"\f134";}
+.icon-rocket:before{content:"\f135";}
+.icon-maxcdn:before{content:"\f136";}
+.icon-chevron-sign-left:before{content:"\f137";}
+.icon-chevron-sign-right:before{content:"\f138";}
+.icon-chevron-sign-up:before{content:"\f139";}
+.icon-chevron-sign-down:before{content:"\f13a";}
+.icon-html5:before{content:"\f13b";}
+.icon-css3:before{content:"\f13c";}
+.icon-anchor:before{content:"\f13d";}
+.icon-unlock-alt:before{content:"\f13e";}
+.icon-bullseye:before{content:"\f140";}
+.icon-ellipsis-horizontal:before{content:"\f141";}
+.icon-ellipsis-vertical:before{content:"\f142";}
+.icon-rss-sign:before{content:"\f143";}
+.icon-play-sign:before{content:"\f144";}
+.icon-ticket:before{content:"\f145";}
+.icon-minus-sign-alt:before{content:"\f146";}
+.icon-check-minus:before{content:"\f147";}
+.icon-level-up:before{content:"\f148";}
+.icon-level-down:before{content:"\f149";}
+.icon-check-sign:before{content:"\f14a";}
+.icon-edit-sign:before{content:"\f14b";}
+.icon-external-link-sign:before{content:"\f14c";}
+.icon-share-sign:before{content:"\f14d";}
+.icon-compass:before{content:"\f14e";}
+.icon-collapse:before{content:"\f150";}
+.icon-collapse-top:before{content:"\f151";}
+.icon-expand:before{content:"\f152";}
+.icon-euro:before,.icon-eur:before{content:"\f153";}
+.icon-gbp:before{content:"\f154";}
+.icon-dollar:before,.icon-usd:before{content:"\f155";}
+.icon-rupee:before,.icon-inr:before{content:"\f156";}
+.icon-yen:before,.icon-jpy:before{content:"\f157";}
+.icon-renminbi:before,.icon-cny:before{content:"\f158";}
+.icon-won:before,.icon-krw:before{content:"\f159";}
+.icon-bitcoin:before,.icon-btc:before{content:"\f15a";}
+.icon-file:before{content:"\f15b";}
+.icon-file-text:before{content:"\f15c";}
+.icon-sort-by-alphabet:before{content:"\f15d";}
+.icon-sort-by-alphabet-alt:before{content:"\f15e";}
+.icon-sort-by-attributes:before{content:"\f160";}
+.icon-sort-by-attributes-alt:before{content:"\f161";}
+.icon-sort-by-order:before{content:"\f162";}
+.icon-sort-by-order-alt:before{content:"\f163";}
+.icon-thumbs-up:before{content:"\f164";}
+.icon-thumbs-down:before{content:"\f165";}
+.icon-youtube-sign:before{content:"\f166";}
+.icon-youtube:before{content:"\f167";}
+.icon-xing:before{content:"\f168";}
+.icon-xing-sign:before{content:"\f169";}
+.icon-youtube-play:before{content:"\f16a";}
+.icon-dropbox:before{content:"\f16b";}
+.icon-stackexchange:before{content:"\f16c";}
+.icon-instagram:before{content:"\f16d";}
+.icon-flickr:before{content:"\f16e";}
+.icon-adn:before{content:"\f170";}
+.icon-bitbucket:before{content:"\f171";}
+.icon-bitbucket-sign:before{content:"\f172";}
+.icon-tumblr:before{content:"\f173";}
+.icon-tumblr-sign:before{content:"\f174";}
+.icon-long-arrow-down:before{content:"\f175";}
+.icon-long-arrow-up:before{content:"\f176";}
+.icon-long-arrow-left:before{content:"\f177";}
+.icon-long-arrow-right:before{content:"\f178";}
+.icon-apple:before{content:"\f179";}
+.icon-windows:before{content:"\f17a";}
+.icon-android:before{content:"\f17b";}
+.icon-linux:before{content:"\f17c";}
+.icon-dribbble:before{content:"\f17d";}
+.icon-skype:before{content:"\f17e";}
+.icon-foursquare:before{content:"\f180";}
+.icon-trello:before{content:"\f181";}
+.icon-female:before{content:"\f182";}
+.icon-male:before{content:"\f183";}
+.icon-gittip:before{content:"\f184";}
+.icon-sun:before{content:"\f185";}
+.icon-moon:before{content:"\f186";}
+.icon-archive:before{content:"\f187";}
+.icon-bug:before{content:"\f188";}
+.icon-vk:before{content:"\f189";}
+.icon-weibo:before{content:"\f18a";}
+.icon-renren:before{content:"\f18b";}
+
+.icon-large{font-size:1.3333333333333333em;margin-top:-4px;padding-top:3px;margin-bottom:-4px;padding-bottom:3px;vertical-align:middle;}
+.nav [class^="icon-"],.nav [class*=" icon-"]{vertical-align:inherit;margin-top:-4px;padding-top:3px;margin-bottom:-4px;padding-bottom:3px;}.nav [class^="icon-"].icon-large,.nav [class*=" icon-"].icon-large{vertical-align:-25%;}
+.nav-pills [class^="icon-"].icon-large,.nav-tabs [class^="icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large{line-height:.75em;margin-top:-7px;padding-top:5px;margin-bottom:-5px;padding-bottom:4px;}
+.btn [class^="icon-"].pull-left,.btn [class*=" icon-"].pull-left,.btn [class^="icon-"].pull-right,.btn [class*=" icon-"].pull-right{vertical-align:inherit;}
+.btn [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large{margin-top:-0.5em;}
+a [class^="icon-"],a [class*=" icon-"]{cursor:pointer;}
+.icon-glass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-music{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-search{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-envelope-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-heart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-star{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-star-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-user{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-film{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-th-large{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-th{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-th-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-ok{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-remove{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-zoom-in{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-zoom-out{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-power-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-signal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-cog{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-gear{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-trash{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-home{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-file-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-time{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-road{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-download-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-inbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-play-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-repeat{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-rotate-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-refresh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-list-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-lock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-flag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-headphones{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-volume-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-volume-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-volume-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-qrcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-barcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-tag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-tags{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-book{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bookmark{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-print{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-camera{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-font{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bold{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-italic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-text-height{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-text-width{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-align-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-align-center{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-align-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-align-justify{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-indent-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-indent-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-facetime-video{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-picture{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-pencil{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-map-marker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-adjust{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-tint{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-edit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-share{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-check{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-move{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-step-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-fast-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-pause{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-stop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-fast-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-step-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-eject{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-chevron-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-chevron-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-minus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-remove-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-ok-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-question-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-info-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-screenshot{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-remove-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-ok-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-ban-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-share-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-mail-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-resize-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-resize-small{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-asterisk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-exclamation-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-gift{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-leaf{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-fire{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-eye-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-eye-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-warning-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-plane{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-calendar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-random{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-comment{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-magnet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-chevron-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-chevron-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-retweet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-shopping-cart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-folder-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-folder-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-resize-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-resize-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bar-chart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-twitter-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-facebook-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-camera-retro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-key{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-cogs{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-gears{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-comments{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-thumbs-up-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-thumbs-down-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-star-half{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-heart-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-signout{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-linkedin-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-pushpin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-external-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-signin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-trophy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-github-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-upload-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-lemon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-check-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-unchecked{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bookmark-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-phone-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-twitter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-facebook{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-github{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-unlock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-credit-card{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-rss{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-hdd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bullhorn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bell{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-certificate{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-hand-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-hand-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-hand-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-hand-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-circle-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-circle-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-circle-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-circle-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-globe{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-wrench{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-tasks{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-filter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-briefcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-fullscreen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-group{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-cloud{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-beaker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-cut{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-copy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-paper-clip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-paperclip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-save{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sign-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-reorder{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-list-ul{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-list-ol{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-strikethrough{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-underline{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-table{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-magic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-truck{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-pinterest{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-pinterest-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-google-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-google-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-money{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-caret-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-caret-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-caret-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-caret-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-columns{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sort{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sort-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sort-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-envelope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-linkedin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-undo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-rotate-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-legal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-dashboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-comment-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-comments-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bolt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sitemap{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-umbrella{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-paste{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-lightbulb{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-exchange{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-cloud-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-cloud-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-user-md{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-stethoscope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-suitcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bell-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-coffee{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-food{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-file-text-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-building{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-hospital{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-ambulance{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-medkit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-fighter-jet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-beer{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-h-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-plus-sign-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-double-angle-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-double-angle-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-double-angle-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-double-angle-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-angle-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-angle-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-angle-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-angle-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-desktop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-laptop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-tablet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-mobile-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-circle-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-quote-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-quote-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-spinner{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-reply{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-mail-reply{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-github-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-folder-close-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-folder-open-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-expand-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-collapse-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-smile{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-frown{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-meh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-gamepad{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-keyboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-flag-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-flag-checkered{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-terminal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-code{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-reply-all{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-mail-reply-all{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-star-half-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-star-half-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-location-arrow{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-crop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-code-fork{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-unlink{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-question{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-info{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-exclamation{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-superscript{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-subscript{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-eraser{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-puzzle-piece{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-microphone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-microphone-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-shield{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-calendar-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-fire-extinguisher{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-rocket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-maxcdn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-chevron-sign-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-chevron-sign-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-chevron-sign-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-chevron-sign-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-html5{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-css3{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-anchor{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-unlock-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bullseye{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-ellipsis-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-ellipsis-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-rss-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-play-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-ticket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-minus-sign-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-check-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-level-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-level-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-check-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-edit-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-external-link-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-share-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-compass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-collapse{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-collapse-top{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-expand{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-eur{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-euro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-gbp{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-usd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-dollar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-inr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-rupee{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-jpy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-yen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-cny{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-renminbi{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-krw{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-won{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-btc{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bitcoin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-file{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-file-text{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sort-by-alphabet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sort-by-alphabet-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sort-by-attributes{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sort-by-attributes-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sort-by-order{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sort-by-order-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-thumbs-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-thumbs-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-youtube-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-youtube{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-xing{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-xing-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-youtube-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-dropbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-stackexchange{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-instagram{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-flickr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-adn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bitbucket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bitbucket-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-tumblr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-tumblr-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-long-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-long-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-long-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-long-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-apple{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-windows{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-android{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-linux{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-dribbble{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-skype{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-foursquare{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-trello{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-female{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-male{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-gittip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-sun{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-moon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-archive{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-bug{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-vk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-weibo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
+.icon-renren{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');}
diff --git a/goon/browserassets/css/fonts/fontawesome-webfont.eot b/goon/browserassets/css/fonts/fontawesome-webfont.eot
new file mode 100644
index 00000000000..0662cb96bfb
Binary files /dev/null and b/goon/browserassets/css/fonts/fontawesome-webfont.eot differ
diff --git a/goon/browserassets/css/fonts/fontawesome-webfont.svg b/goon/browserassets/css/fonts/fontawesome-webfont.svg
new file mode 100644
index 00000000000..2edb4ec34cb
--- /dev/null
+++ b/goon/browserassets/css/fonts/fontawesome-webfont.svg
@@ -0,0 +1,399 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/goon/browserassets/css/fonts/fontawesome-webfont.ttf b/goon/browserassets/css/fonts/fontawesome-webfont.ttf
new file mode 100644
index 00000000000..d3659246915
Binary files /dev/null and b/goon/browserassets/css/fonts/fontawesome-webfont.ttf differ
diff --git a/goon/browserassets/css/fonts/fontawesome-webfont.woff b/goon/browserassets/css/fonts/fontawesome-webfont.woff
new file mode 100644
index 00000000000..b9bd17e158d
Binary files /dev/null and b/goon/browserassets/css/fonts/fontawesome-webfont.woff differ
diff --git a/goon/browserassets/html/browserOutput.html b/goon/browserassets/html/browserOutput.html
new file mode 100644
index 00000000000..74212fd8156
--- /dev/null
+++ b/goon/browserassets/html/browserOutput.html
@@ -0,0 +1,44 @@
+
+
+
+ Chat
+
+
+
+
+
+
+
+
+
+
+
+ Loading...
+ If this takes longer than 30 seconds, it will automatically reload a maximum of 5 times.
+ If it still doesn't work, use the bug report button at the top right of the window.
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js
new file mode 100644
index 00000000000..7f59c2d56f3
--- /dev/null
+++ b/goon/browserassets/js/browserOutput.js
@@ -0,0 +1,920 @@
+/*****************************************
+*
+* FUNCTION AND VAR DECLARATIONS
+*
+******************************************/
+
+//DEBUG STUFF
+var escaper = encodeURIComponent || escape;
+var decoder = decodeURIComponent || unescape;
+window.onerror = function(msg, url, line, col, error) {
+ if (document.location.href.indexOf("proc=debug") <= 0) {
+ var extra = !col ? '' : ' | column: ' + col;
+ extra += !error ? '' : ' | error: ' + error;
+ extra += !navigator.userAgent ? '' : ' | user agent: ' + navigator.userAgent;
+ var debugLine = 'Error: ' + msg + ' | url: ' + url + ' | line: ' + line + extra;
+ window.location = '?_src_=chat&proc=debug¶m[error]='+escaper(debugLine);
+ }
+ return true;
+};
+
+//Globals
+window.status = 'Output';
+var $messages, $subOptions, $contextMenu, $filterMessages;
+var opts = {
+ //General
+ 'messageCount': 0, //A count...of messages...
+ 'messageLimit': 2053, //A limit...for the messages...
+ 'scrollSnapTolerance': 5, //If within x pixels of bottom
+ 'clickTolerance': 10, //Keep focus if outside x pixels of mousedown position on mouseup
+ 'popups': 0, //Amount of popups opened ever
+ 'wasd': false, //Is the user in wasd mode?
+ 'chatMode': 'default', //The mode the chat is in
+ 'priorChatHeight': 0, //Thing for height-resizing detection
+ 'restarting': false, //Is the round restarting?
+
+ //Options menu
+ 'subOptionsLoop': null, //Contains the interval loop for closing the options menu
+ 'suppressOptionsClose': false, //Whether or not we should be hiding the suboptions menu
+ 'highlightTerms': [],
+ 'highlightLimit': 5,
+ 'highlightColor': '#FFFF00', //The color of the highlighted message
+ 'pingDisabled': false, //Has the user disabled the ping counter
+
+ //Ping display
+ 'lastPang': 0, //Timestamp of the last response from the server.
+ 'pangLimit': 35000,
+ 'pingTime': 0, //Timestamp of when ping sent
+ 'pongTime': 0, //Timestamp of when ping received
+ 'noResponse': false, //Tracks the state of the previous ping request
+ 'noResponseCount': 0, //How many failed pings?
+
+ //Clicks
+ 'mouseDownX': null,
+ 'mouseDownY': null,
+ 'preventFocus': false, //Prevents switching focus to the game window
+
+ //Admin stuff
+ 'adminLoaded': false, //Has the admin loaded his shit?
+
+ //Client Connection Data
+ 'clientDataLimit': 5,
+ 'clientData': [],
+
+ // List of macros in the 'hotkeymode' macro set.
+ 'macros': {}
+};
+
+function outerHTML(el) {
+ var wrap = document.createElement('div');
+ wrap.appendChild(el.cloneNode(true));
+ return wrap.innerHTML;
+}
+
+//Polyfill for fucking date now because of course IE8 and below don't support it
+if (!Date.now) {
+ Date.now = function now() {
+ return new Date().getTime();
+ };
+}
+//Polyfill for trim() (IE8 and below)
+if (typeof String.prototype.trim !== 'function') {
+ String.prototype.trim = function () {
+ return this.replace(/^\s+|\s+$/g, '');
+ };
+}
+
+//Shit fucking piece of crap that doesn't work god fuckin damn it
+function linkify(text) {
+ var rex = /((?:'+$0+' ';
+ }
+ else {
+ return $1 ? $0: ''+$0+' ';
+ }
+ });
+}
+
+//Actually turns the highlight term match into appropriate html
+function addHighlightMarkup(match) {
+ var extra = '';
+ if (opts.highlightColor) {
+ extra += ' style="background-color: '+opts.highlightColor+'"';
+ }
+ return ''+match+' ';
+}
+
+//Highlights words based on user settings
+function highlightTerms(el) {
+ if (el.children.length > 0) {
+ for(var h = 0; h < el.children.length; h++){
+ highlightTerms(el.children[h]);
+ }
+ }
+ if (el.childNodes.length > 0 && typeof el.childNodes[0].data !== 'undefined' && el.childNodes[0].data.length > 0) { //If element actually has text
+ var newText = '';
+ for (var c = 0; c < el.childNodes.length; c++) { //Each child element
+ if (el.childNodes[c].nodeType === 3) { //Is it text only?
+ var words = el.childNodes[c].data.split(' ');
+ for (var w = 0; w < words.length; w++) { //Each word in the text
+ var newWord = null;
+ for (var i = 0; i < opts.highlightTerms.length; i++) { //Each highlight term
+ if (opts.highlightTerms[i] && words[w].toLowerCase().indexOf(opts.highlightTerms[i].toLowerCase()) > -1) { //If a match is found
+ newWord = words[w].replace(new RegExp(opts.highlightTerms[i], 'gi'), addHighlightMarkup);
+ break;
+ }
+ }
+ newText += newWord ? newWord : words[w];
+ newText += w >= words.length ? '' : ' ';
+ }
+ } else { //Every other type of element
+ newText += outerHTML(el.childNodes[c]);
+ }
+ }
+ el.innerHTML = newText;
+ }
+}
+
+//Send a message to the client
+function output(message, flag) {
+ if (typeof message === 'undefined') {
+ return;
+ }
+ if (typeof flag === 'undefined') {
+ flag = '';
+ }
+
+ if (flag !== 'internal')
+ opts.lastPang = Date.now();
+
+ //The behemoth of filter-code (for Admin message filters)
+ //Note: This is proooobably hella inefficient
+ var filteredOut = false;
+ if (opts.hasOwnProperty('showMessagesFilters') && !opts.showMessagesFilters['All'].show) {
+ //Get this filter type (defined by class on message)
+ var messageHtml = $.parseHTML(message),
+ messageClasses;
+ if (opts.hasOwnProperty('filterHideAll') && opts.filterHideAll) {
+ var internal = false;
+ messageClasses = (!!$(messageHtml).attr('class') ? $(messageHtml).attr('class').split(/\s+/) : false);
+ if (messageClasses) {
+ for (var i = 0; i < messageClasses.length; i++) { //Every class
+ if (messageClasses[i] == 'internal') {
+ internal = true;
+ break;
+ }
+ }
+ }
+ if (!internal) {
+ filteredOut = 'All';
+ }
+ } else {
+ //If the element or it's child have any classes
+ if (!!$(messageHtml).attr('class') || !!$(messageHtml).children().attr('class')) {
+ messageClasses = $(messageHtml).attr('class').split(/\s+/);
+ if (!!$(messageHtml).children().attr('class')) {
+ messageClasses = messageClasses.concat($(messageHtml).children().attr('class').split(/\s+/));
+ }
+ var tempCount = 0;
+ for (var i = 0; i < messageClasses.length; i++) { //Every class
+ var thisClass = messageClasses[i];
+ $.each(opts.showMessagesFilters, function(key, val) { //Every filter
+ if (key !== 'All' && val.show === false && typeof val.match != 'undefined') {
+ for (var i = 0; i < val.match.length; i++) {
+ var matchClass = val.match[i];
+ if (matchClass == thisClass) {
+ filteredOut = key;
+ break;
+ }
+ }
+ }
+ if (filteredOut) return false;
+ });
+ if (filteredOut) break;
+ tempCount++;
+ }
+ } else {
+ if (!opts.showMessagesFilters['Misc'].show) {
+ filteredOut = 'Misc';
+ }
+ }
+ }
+ }
+
+ //Stuff we do along with appending a message
+ var atBottom = false;
+ if (!filteredOut) {
+ var bodyHeight = $('body').height();
+ var messagesHeight = $messages.outerHeight();
+ var scrollPos = $('body,html').scrollTop();
+
+ //Should we snap the output to the bottom?
+ if (bodyHeight + scrollPos >= messagesHeight - opts.scrollSnapTolerance) {
+ atBottom = true;
+ if ($('#newMessages').length) {
+ $('#newMessages').remove();
+ }
+ //If not, put the new messages box in
+ } else {
+ if ($('#newMessages').length) {
+ var messages = $('#newMessages .number').text();
+ messages = parseInt(messages);
+ messages++;
+ $('#newMessages .number').text(messages);
+ if (messages == 2) {
+ $('#newMessages .messageWord').append('s');
+ }
+ } else {
+ $messages.after('1 new message ');
+ }
+ }
+ }
+
+ //Url stuff
+ if (message.length && flag != 'preventLink') {
+ message = linkify(message);
+ }
+
+ opts.messageCount++;
+
+ //Pop the top message off if history limit reached
+ if (opts.messageCount >= opts.messageLimit) {
+ $messages.children('div.entry:first-child').remove();
+ opts.messageCount--; //I guess the count should only ever equal the limit
+ }
+
+ //Actually append the message
+ var entry = document.createElement('div');
+ entry.className = 'entry';
+
+ if (filteredOut) {
+ entry.className += ' hidden';
+ entry.setAttribute('data-filter', filteredOut);
+ }
+
+ entry.innerHTML = message;
+ $messages[0].appendChild(entry);
+
+ //Actually do the snap
+ if (!filteredOut && atBottom) {
+ $('body,html').scrollTop($messages.outerHeight());
+ }
+
+ //Stuff we can do after the message shows can go here, in the interests of responsiveness
+ if (opts.highlightTerms && opts.highlightTerms.length > 0) {
+ highlightTerms(entry);
+ }
+}
+
+//Runs a route within byond, client or server side. Consider this "ehjax" for byond.
+function runByond(uri) {
+ window.location = uri;
+}
+
+function setCookie(cname, cvalue, exdays) {
+ cvalue = escaper(cvalue);
+ var d = new Date();
+ d.setTime(d.getTime() + (exdays*24*60*60*1000));
+ var expires = 'expires='+d.toUTCString();
+ document.cookie = "paradise-" + cname + '=' + cvalue + '; ' + expires;
+}
+
+function getCookie(cname) {
+ var name = "paradise-" + cname + '=';
+ var ca = document.cookie.split(';');
+ for(var i=0; i < ca.length; i++) {
+ var c = ca[i];
+ while (c.charAt(0)==' ') c = c.substring(1);
+ if (c.indexOf(name) === 0) {
+ return decoder(c.substring(name.length,c.length));
+ }
+ }
+ return '';
+}
+
+function rgbToHex(R,G,B) {return toHex(R)+toHex(G)+toHex(B);}
+function toHex(n) {
+ n = parseInt(n,10);
+ if (isNaN(n)) return "00";
+ n = Math.max(0,Math.min(n,255));
+ return "0123456789ABCDEF".charAt((n-n%16)/16) + "0123456789ABCDEF".charAt(n%16);
+}
+
+function changeMode(mode) {
+ switch (mode) {
+ case 'geocities':
+ //switch in stylesheet
+ opts.chatMode = mode;
+ break;
+ case 'console':
+
+ opts.chatMode = mode;
+ break;
+ case 'default':
+ default:
+ //remove loaded stylesheet/s
+ opts.chatMode = 'default';
+ }
+}
+
+function handleClientData(ckey, ip, compid) {
+ //byond sends player info to here
+ var currentData = {'ckey': ckey, 'ip': ip, 'compid': compid};
+ if (opts.clientData && !$.isEmptyObject(opts.clientData)) {
+ runByond('?_src_=chat&proc=analyzeClientData¶m[cookie]='+JSON.stringify({'connData': opts.clientData}));
+
+ for (var i = 0; i < opts.clientData.length; i++) {
+ var saved = opts.clientData[i];
+ if (currentData.ckey == saved.ckey && currentData.ip == saved.ip && currentData.compid == saved.compid) {
+ return; //Record already exists
+ }
+ }
+
+ if (opts.clientData.length >= opts.clientDataLimit) {
+ opts.clientData.shift();
+ }
+ } else {
+ runByond('?_src_=chat&proc=analyzeClientData¶m[cookie]=none');
+ }
+
+ //Update the cookie with current details
+ opts.clientData.push(currentData);
+ setCookie('connData', JSON.stringify(opts.clientData), 365);
+}
+
+//Server calls this on ehjax response
+//Or, y'know, whenever really
+function ehjaxCallback(data) {
+ opts.lastPang = Date.now();
+ if (data == 'softPang') {
+ return;
+ } else if (data == "pang") {
+ opts.pingCounter = 0;
+ opts.pingTime = Date.now();
+ runByond('?_src_=chat&proc=ping');
+ } else if (data == 'pong') {
+ if (opts.pingDisabled) {return;}
+ opts.pongTime = Date.now();
+ var pingDuration = Math.ceil((opts.pongTime - opts.pingTime) / 2);
+ $('#pingMs').text(pingDuration+'ms');
+ pingDuration = Math.min(pingDuration, 255);
+ var red = pingDuration;
+ var green = 255 - pingDuration;
+ var blue = 0;
+ var hex = rgbToHex(red, green, blue);
+ $('#pingDot').css('color', '#'+hex);
+ } else if (data == 'roundrestart') {
+ opts.restarting = true;
+ output('The connection has been closed because the server is restarting. Please wait while you automatically reconnect.
', 'internal');
+ } else if (data == 'stopaudio') {
+ $('.dectalk').remove();
+ } else {
+ //Oh we're actually being sent data instead of an instruction
+ var dataJ;
+ try {
+ dataJ = $.parseJSON(data);
+ } catch (e) {
+ //But...incorrect :sadtrombone:
+ window.onerror('JSON: '+e+'. '+data, 'browserOutput.html', 327);
+ return;
+ }
+ data = dataJ;
+
+ if (data.clientData) {
+ if (opts.restarting) {
+ opts.restarting = false;
+ $('.connectionClosed.restarting:not(.restored)').addClass('restored').text('The round restarted and you successfully reconnected!');
+ }
+ if (!data.clientData.ckey && !data.clientData.ip && !data.clientData.compid) {
+ //TODO: Call shutdown perhaps
+ return;
+ } else {
+ handleClientData(data.clientData.ckey, data.clientData.ip, data.clientData.compid);
+ }
+ } else if (data.loadAdminCode) {
+ if (opts.adminLoaded) {return;}
+ var adminCode = data.loadAdminCode;
+ $('body').append(adminCode);
+ opts.adminLoaded = true;
+ } else if (data.modeChange) {
+ changeMode(data.modeChange);
+ } else if (data.firebug) {
+ if (data.trigger) {
+ output('Loading firebug console, triggered by '+data.trigger+'... ', 'internal');
+ } else {
+ output('Loading firebug console... ', 'internal');
+ }
+ var firebugEl = document.createElement('script');
+ firebugEl.src = 'https://getfirebug.com/firebug-lite-debug.js';
+ document.body.appendChild(firebugEl);
+ } else if (data.dectalk) {
+ var message = ' ';
+ if (data.decTalkTrigger) {
+ message = ' '+
+ 'You hear a strange robotic voice... ' + message;
+ }
+ output(message, 'preventLink');
+ }
+ }
+}
+
+function createPopup(contents, width) {
+ opts.popups++;
+ $('body').append('');
+
+ //Attach close popup event
+ var $popup = $('#popup'+opts.popups);
+ var height = $popup.outerHeight();
+ $popup.css({'height': height+'px', 'margin': '-'+(height/2)+'px 0 0 -'+(width/2)+'px'});
+
+ $popup.on('click', '.close', function(e) {
+ e.preventDefault();
+ $popup.remove();
+ });
+}
+
+function toggleWasd(state) {
+ opts.wasd = (state == 'on' ? true : false);
+}
+
+/*****************************************
+*
+* MAKE MACRO DICTIONARY
+*
+******************************************/
+
+// Callback for winget.
+function wingetMacros(macros) {
+ var idRegex = /.*?\.(?!(?:CRTL|ALT|SHIFT)\+)(.*?)(?:\+REP)?\.command/; // Do NOT match macros which need crtl, alt or shift to be held down (saves a ton of headache because I don't give enough of a fuck).
+ for (key in macros) {
+ match = idRegex.exec(key)
+ if (match === null)
+ continue
+ macroID = match[1].toUpperCase();
+
+ opts.macros[macroID] = macros[key];
+ }
+}
+
+/*****************************************
+*
+* DOM READY
+*
+******************************************/
+
+if (typeof $ === 'undefined') {
+ var div = document.getElementById('loading').childNodes[1];
+ div += ' ERROR: Jquery did not load.';
+}
+
+$(function() {
+ $messages = $('#messages');
+ $subOptions = $('#subOptions');
+
+ //Hey look it's a controller loop!
+ setInterval(function() {
+ if (opts.lastPang + opts.pangLimit < Date.now() && !opts.restarting) { //Every pingLimit
+ if (!opts.noResponse) { //Only actually append a message if the previous ping didn't also fail (to prevent spam)
+ opts.noResponse = true;
+ opts.noResponseCount++;
+ output('You are either AFK, experiencing lag or the connection has closed.
', 'internal');
+ }
+ } else if (opts.noResponse) { //Previous ping attempt failed ohno
+ $('.connectionClosed[data-count="'+opts.noResponseCount+'"]:not(.restored)').addClass('restored').text('Your connection has been restored (probably)!');
+ opts.noResponse = false;
+ }
+ }, 2000); //2 seconds
+
+
+
+ /*****************************************
+ *
+ * LOAD SAVED CONFIG
+ *
+ ******************************************/
+ var savedConfig = {
+ 'sfontSize': getCookie('fontsize'),
+ 'sfontType': getCookie('fonttype'),
+ 'spingDisabled': getCookie('pingdisabled'),
+ 'shighlightTerms': getCookie('highlightterms'),
+ 'shighlightColor': getCookie('highlightcolor'),
+ };
+
+ if (savedConfig.sfontSize) {
+ $messages.css('font-size', savedConfig.sfontSize);
+ output('Loaded font size setting of: '+savedConfig.sfontSize+' ', 'internal');
+ }
+ if (savedConfig.sfontType) {
+ $messages.css('font-family', savedConfig.sfontType);
+ output('Loaded font type setting of: '+savedConfig.sfontType+' ', 'internal');
+ }
+ if (savedConfig.spingDisabled) {
+ if (savedConfig.spingDisabled == 'true') {
+ opts.pingDisabled = true;
+ $('#ping').hide();
+ }
+ output('Loaded ping display of: '+(opts.pingDisabled ? 'hidden' : 'visible')+' ', 'internal');
+ }
+ if (savedConfig.shighlightTerms) {
+ var savedTerms = $.parseJSON(savedConfig.shighlightTerms);
+ var actualTerms = '';
+ for (var i = 0; i < savedTerms.length; i++) {
+ if (savedTerms[i]) {
+ actualTerms += savedTerms[i] + ', ';
+ }
+ }
+ if (actualTerms) {
+ actualTerms = actualTerms.substring(0, actualTerms.length - 2);
+ output('Loaded highlight strings of: ' + actualTerms+' ', 'internal');
+ opts.highlightTerms = savedTerms;
+ }
+ }
+ if (savedConfig.shighlightColor) {
+ opts.highlightColor = savedConfig.shighlightColor;
+ output('Loaded highlight color of: '+savedConfig.shighlightColor+' ', 'internal');
+ }
+
+ (function() {
+ var dataCookie = getCookie('connData');
+ if (dataCookie) {
+ var dataJ;
+ try {
+ dataJ = $.parseJSON(dataCookie);
+ } catch (e) {
+ window.onerror('JSON '+e+'. '+dataCookie, 'browserOutput.html', 434);
+ return;
+ }
+ opts.clientData = dataJ;
+ }
+ })();
+
+
+ /*****************************************
+ *
+ * BASE CHAT OUTPUT EVENTS
+ *
+ ******************************************/
+
+ $('body').on('click', 'a', function(e) {
+ e.preventDefault();
+ });
+
+ $('body').on('mousedown', function(e) {
+ var $target = $(e.target);
+
+ if ($contextMenu && opts.hasOwnProperty('contextMenuTarget') && opts.contextMenuTarget) {
+ hideContextMenu();
+ return false;
+ }
+
+ if ($target.is('a') || $target.parent('a').length || $target.is('input') || $target.is('textarea')) {
+ opts.preventFocus = true;
+ } else {
+ opts.preventFocus = false;
+ opts.mouseDownX = e.pageX;
+ opts.mouseDownY = e.pageY;
+ }
+ });
+
+ $messages.on('mousedown', function(e) {
+ if ($subOptions && $subOptions.is(':visible')) {
+ $subOptions.slideUp('fast', function() {
+ $(this).removeClass('scroll');
+ $(this).css('height', '');
+ });
+ clearInterval(opts.subOptionsLoop);
+ }
+ });
+
+ $('body').on('mouseup', function(e) {
+ if (!opts.preventFocus &&
+ (e.pageX >= opts.mouseDownX - opts.clickTolerance && e.pageX <= opts.mouseDownX + opts.clickTolerance) &&
+ (e.pageY >= opts.mouseDownY - opts.clickTolerance && e.pageY <= opts.mouseDownY + opts.clickTolerance)
+ ) {
+ opts.mouseDownX = null;
+ opts.mouseDownY = null;
+ runByond('byond://winset?mapwindow.map.focus=true');
+ }
+ });
+
+ $messages.on('click', 'a', function(e) {
+ var href = $(this).attr('href');
+ if (href[0] == '?' || (href.length >= 8 && href.substring(0,8) == 'byond://')) {
+ runByond(href);
+ } else {
+ href = escaper(href);
+ runByond('?action=openLink&link='+href);
+ }
+ });
+
+ //Fuck everything about this event. Will look into alternatives.
+ $('body').on('keydown', function(e) {
+ if (e.target.nodeName == 'INPUT' || e.target.nodeName == 'TEXTAREA') {
+ return;
+ }
+
+ if (e.ctrlKey || e.altKey || e.shiftKey) { //Band-aid "fix" for allowing ctrl+c copy paste etc. Needs a proper fix.
+ return;
+ }
+
+ e.preventDefault()
+
+ var k = e.which;
+ var command; // Command to execute through winset.
+
+ // Hardcoded because else there would be no feedback message.
+ if (k == 113) { // F2
+ runByond('byond://winset?screenshot=auto');
+ output('Screenshot taken', 'internal');
+ }
+
+ var c = "";
+ switch (k) {
+ case 8:
+ c = 'BACK';
+ case 9:
+ c = 'TAB';
+ case 13:
+ c = 'ENTER';
+ case 19:
+ c = 'PAUSE';
+ case 27:
+ c = 'ESCAPE';
+ case 33: // Page up
+ c = 'NORTHEAST';
+ case 34: // Page down
+ c = 'SOUTHEAST';
+ case 35: // End
+ c = 'SOUTHWEST';
+ case 36: // Home
+ c = 'NORTHWEST';
+ case 37:
+ c = 'WEST';
+ case 38:
+ c = 'NORTH';
+ case 39:
+ c = 'EAST';
+ case 40:
+ c = 'SOUTH';
+ case 45:
+ c = 'INSERT';
+ case 46:
+ c = 'DELETE';
+ case 93: // That weird thing to the right of alt gr.
+ c = 'APPS';
+
+ default:
+ c = String.fromCharCode(k);
+ }
+
+ if(opts.macros.hasOwnProperty(c.toUpperCase()))
+ command = opts.macros[c];
+
+ if (command) {
+ runByond('byond://winset?mapwindow.map.focus=true;command='+command);
+ return false;
+ }
+ else if (c.length == 0) {
+ if (!e.shiftKey) {
+ c = c.toLowerCase();
+ }
+ runByond('byond://winset?mapwindow.map.focus=true;mainwindow.input.text='+c);
+ return false;
+ } else {
+ runByond('byond://winset?mapwindow.map.focus=true');
+ return false;
+ }
+ });
+
+ //Mildly hacky fix for scroll issues on mob change (interface gets resized sometimes, messing up snap-scroll)
+ $(window).on('resize', function(e) {
+ if ($(this).height() !== opts.priorChatHeight) {
+ $('body,html').scrollTop($messages.outerHeight());
+ opts.priorChatHeight = $(this).height();
+ }
+ });
+
+ //Audio sound prevention
+ $messages.on('click', '.stopAudio', function() {
+ var $audio = $(this).parent().children('audio');
+ if ($audio) {
+ $audio.remove();
+ }
+ });
+
+
+ /*****************************************
+ *
+ * OPTIONS INTERFACE EVENTS
+ *
+ ******************************************/
+
+ $('body').on('click', '#newMessages', function(e) {
+ var messagesHeight = $messages.outerHeight();
+ $('body,html').scrollTop(messagesHeight);
+ $('#newMessages').remove();
+ runByond("byond://winset?mapwindow.map.focus=true");
+ });
+
+ $('#toggleOptions').click(function(e) {
+ if ($subOptions.is(':visible')) {
+ $subOptions.slideUp('fast', function() {
+ $(this).removeClass('scroll');
+ $(this).css('height', '');
+ });
+ clearInterval(opts.subOptionsLoop);
+ } else {
+ $subOptions.slideDown('fast', function() {
+ var windowHeight = $(window).height();
+ var toggleHeight = $('#toggleOptions').outerHeight();
+ var priorSubHeight = $subOptions.outerHeight();
+ var newSubHeight = windowHeight - toggleHeight;
+ $(this).height(newSubHeight);
+ if (priorSubHeight > (windowHeight - toggleHeight)) {
+ $(this).addClass('scroll');
+ }
+ });
+ opts.subOptionsLoop = setInterval(function() {
+ if (!opts.suppressOptionsClose && $('#subOptions').is(':visible')) {
+ $subOptions.slideUp('fast', function() {
+ $(this).removeClass('scroll');
+ $(this).css('height', '');
+ });
+ clearInterval(opts.subOptionsLoop);
+ }
+ }, 5000); //Every 5 seconds
+ }
+ });
+
+ $('#subOptions, #toggleOptions').mouseenter(function() {
+ opts.suppressOptionsClose = true;
+ });
+
+ $('#subOptions, #toggleOptions').mouseleave(function() {
+ opts.suppressOptionsClose = false;
+ });
+
+ $('#decreaseFont').click(function(e) {
+ var fontSize = parseInt($messages.css('font-size'));
+ fontSize = fontSize - 1 + 'px';
+ $messages.css({'font-size': fontSize});
+ setCookie('fontsize', fontSize, 365);
+ output('Font size set to '+fontSize+' ', 'internal');
+ });
+
+ $('#increaseFont').click(function(e) {
+ var fontSize = parseInt($messages.css('font-size'));
+ fontSize = fontSize + 1 + 'px';
+ $messages.css({'font-size': fontSize});
+ setCookie('fontsize', fontSize, 365);
+ output('Font size set to '+fontSize+' ', 'internal');
+ });
+
+ $('#chooseFont').click(function(e) {
+ if ($('.popup .changeFont').is(':visible')) {return;}
+ var popupContent = 'Change Font
' +
+ '';
+ createPopup(popupContent, 200);
+ });
+
+ $('body').on('click', '#changeFont a', function(e) {
+ var font = $(this).attr('data-font');
+ $messages.css('font-family', font);
+ setCookie('fonttype', font, 365);
+ });
+
+ $('#togglePing').click(function(e) {
+ if (opts.pingDisabled) {
+ $('#ping').slideDown('fast');
+ opts.pingDisabled = false;
+ } else {
+ $('#ping').slideUp('fast');
+ opts.pingDisabled = true;
+ }
+ setCookie('pingdisabled', (opts.pingDisabled ? 'true' : 'false'), 365);
+ });
+
+ $('#saveLog').click(function(e) {
+ var saved = '';
+
+ if (window.XMLHtpRequest) {
+ xmlHttp = new XMLHttpRequest();
+ } else {
+ xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
+ }
+ xmlHttp.open('GET', 'browserOutput.css', false);
+ xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
+ xmlHttp.send();
+ saved += '';
+
+ saved += $messages.html();
+ saved = saved.replace(/&/g, '&');
+ saved = saved.replace(/ ';
+ }
+ var popupContent = 'String Highlighting
' +
+ '';
+ createPopup(popupContent, 250);
+ });
+
+ $('body').on('keyup', '#highlightColor', function() {
+ var color = $('#highlightColor').val();
+ color = color.trim();
+ if (!color || color.charAt(0) != '#') return;
+ $('#highlightColor').css('background-color', color);
+ });
+
+ $('body').on('submit', '#highlightTermForm', function(e) {
+ e.preventDefault();
+
+ var count = 0;
+ while (count < opts.highlightLimit) {
+ var term = $('#highlightTermInput'+count).val();
+ if (term) {
+ term = term.trim();
+ if (term === '') {
+ opts.highlightTerms[count] = null;
+ } else {
+ opts.highlightTerms[count] = term.toLowerCase();
+ }
+ } else {
+ opts.highlightTerms[count] = null;
+ }
+ count++;
+ }
+
+ var color = $('#highlightColor').val();
+ color = color.trim();
+ if (color == '' || color.charAt(0) != '#') {
+ opts.highlightColor = '#FFFF00';
+ } else {
+ opts.highlightColor = color;
+ }
+ var $popup = $('#highlightPopup').closest('.popup');
+ $popup.remove();
+
+ setCookie('highlightterms', JSON.stringify(opts.highlightTerms), 365);
+ setCookie('highlightcolor', opts.highlightColor, 365);
+ });
+
+ $('#clearMessages').click(function() {
+ $messages.empty();
+ opts.messageCount = 0;
+ });
+
+ // Tell BYOND to give us a macro list.
+ // I don't know why but for some retarded reason,
+ // You need to activate hotkeymode before you can winget the macros in it.
+ runByond('byond://winset?id=mainwindow¯o=hotkeymode')
+ runByond('byond://winset?id=mainwindow¯o=macro')
+
+ runByond('byond://winget?callback=wingetMacros&id=hotkeymode.*&property=command');
+
+ /*****************************************
+ *
+ * KICK EVERYTHING OFF
+ *
+ ******************************************/
+
+ runByond('?_src_=chat&proc=doneLoading');
+ if ($('#loading').is(':visible')) {
+ $('#loading').remove();
+ }
+ $('#userBar').show();
+ opts.priorChatHeight = $(window).height();
+});
diff --git a/goon/browserassets/js/jquery.min.js b/goon/browserassets/js/jquery.min.js
new file mode 100644
index 00000000000..c5c648255c1
--- /dev/null
+++ b/goon/browserassets/js/jquery.min.js
@@ -0,0 +1,9789 @@
+/*!
+ * jQuery JavaScript Library v1.10.2
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-07-03T13:48Z
+ */
+(function( window, undefined ) {
+
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//"use strict";
+var
+ // The deferred used on DOM ready
+ readyList,
+
+ // A central reference to the root jQuery(document)
+ rootjQuery,
+
+ // Support: IE<10
+ // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`
+ core_strundefined = typeof undefined,
+
+ // Use the correct document accordingly with window argument (sandbox)
+ location = window.location,
+ document = window.document,
+ docElem = document.documentElement,
+
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$,
+
+ // [[Class]] -> type pairs
+ class2type = {},
+
+ // List of deleted data cache ids, so we can reuse them
+ core_deletedIds = [],
+
+ core_version = "1.10.2",
+
+ // Save a reference to some core methods
+ core_concat = core_deletedIds.concat,
+ core_push = core_deletedIds.push,
+ core_slice = core_deletedIds.slice,
+ core_indexOf = core_deletedIds.indexOf,
+ core_toString = class2type.toString,
+ core_hasOwn = class2type.hasOwnProperty,
+ core_trim = core_version.trim,
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ return new jQuery.fn.init( selector, context, rootjQuery );
+ },
+
+ // Used for matching numbers
+ core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
+
+ // Used for splitting on whitespace
+ core_rnotwhite = /\S+/g,
+
+ // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ // Match a standalone tag
+ rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+ // JSON RegExp
+ rvalidchars = /^[\],:{}\s]*$/,
+ rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+ rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+ rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ },
+
+ // The ready event handler
+ completed = function( event ) {
+
+ // readyState === "complete" is good enough for us to call the dom ready in oldIE
+ if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
+ detach();
+ jQuery.ready();
+ }
+ },
+ // Clean-up method for dom ready events
+ detach = function() {
+ if ( document.addEventListener ) {
+ document.removeEventListener( "DOMContentLoaded", completed, false );
+ window.removeEventListener( "load", completed, false );
+
+ } else {
+ document.detachEvent( "onreadystatechange", completed );
+ window.detachEvent( "onload", completed );
+ }
+ };
+
+jQuery.fn = jQuery.prototype = {
+ // The current version of jQuery being used
+ jquery: core_version,
+
+ constructor: jQuery,
+ init: function( selector, context, rootjQuery ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ context = context instanceof jQuery ? context[0] : context;
+
+ // scripts is true for back-compat
+ jQuery.merge( this, jQuery.parseHTML(
+ match[1],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[2] );
+
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE and Opera return items
+ // by name instead of ID
+ if ( elem.id !== match[2] ) {
+ return rootjQuery.find( selector );
+ }
+
+ // Otherwise, we inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || rootjQuery ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return rootjQuery.ready( selector );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ },
+
+ // Start with an empty selector
+ selector: "",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return core_slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num == null ?
+
+ // Return a 'clean' array
+ this.toArray() :
+
+ // Return just the object
+ ( num < 0 ? this[ this.length + num ] : this[ num ] );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
+ },
+
+ ready: function( fn ) {
+ // Add the callback
+ jQuery.ready.promise().done( fn );
+
+ return this;
+ },
+
+ slice: function() {
+ return this.pushStack( core_slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: core_push,
+ sort: [].sort,
+ splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var src, copyIsArray, copy, name, options, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+ target = arguments[1] || {};
+ // skip the boolean and the target
+ i = 2;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+ target = {};
+ }
+
+ // extend jQuery itself if only one argument is passed
+ if ( length === i ) {
+ target = this;
+ --i;
+ }
+
+ for ( ; i < length; i++ ) {
+ // Only deal with non-null/undefined values
+ if ( (options = arguments[ i ]) != null ) {
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend({
+ // Unique for each copy of jQuery on the page
+ // Non-digits removed to match rinlinejQuery
+ expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
+
+ noConflict: function( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
+
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+ },
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+ if ( !document.body ) {
+ return setTimeout( jQuery.ready );
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.trigger ) {
+ jQuery( document ).trigger("ready").off("ready");
+ }
+ },
+
+ // See test/unit/core.js for details concerning isFunction.
+ // Since version 1.3, DOM methods and functions like alert
+ // aren't supported. They return false on IE (#2968).
+ isFunction: function( obj ) {
+ return jQuery.type(obj) === "function";
+ },
+
+ isArray: Array.isArray || function( obj ) {
+ return jQuery.type(obj) === "array";
+ },
+
+ isWindow: function( obj ) {
+ /* jshint eqeqeq: false */
+ return obj != null && obj == obj.window;
+ },
+
+ isNumeric: function( obj ) {
+ return !isNaN( parseFloat(obj) ) && isFinite( obj );
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return String( obj );
+ }
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ core_toString.call(obj) ] || "object" :
+ typeof obj;
+ },
+
+ isPlainObject: function( obj ) {
+ var key;
+
+ // Must be an Object.
+ // Because of IE, we also have to check the presence of the constructor property.
+ // Make sure that DOM nodes and window objects don't pass through, as well
+ if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ try {
+ // Not own constructor property must be Object
+ if ( obj.constructor &&
+ !core_hasOwn.call(obj, "constructor") &&
+ !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+ return false;
+ }
+ } catch ( e ) {
+ // IE8,9 Will throw exceptions on certain host objects #9897
+ return false;
+ }
+
+ // Support: IE<9
+ // Handle iteration over inherited properties before own properties.
+ if ( jQuery.support.ownLast ) {
+ for ( key in obj ) {
+ return core_hasOwn.call( obj, key );
+ }
+ }
+
+ // Own properties are enumerated firstly, so to speed up,
+ // if last one is own, then all properties are own.
+ for ( key in obj ) {}
+
+ return key === undefined || core_hasOwn.call( obj, key );
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ // data: string of html
+ // context (optional): If specified, the fragment will be created in this context, defaults to document
+ // keepScripts (optional): If true, will include scripts passed in the html string
+ parseHTML: function( data, context, keepScripts ) {
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+ if ( typeof context === "boolean" ) {
+ keepScripts = context;
+ context = false;
+ }
+ context = context || document;
+
+ var parsed = rsingleTag.exec( data ),
+ scripts = !keepScripts && [];
+
+ // Single tag
+ if ( parsed ) {
+ return [ context.createElement( parsed[1] ) ];
+ }
+
+ parsed = jQuery.buildFragment( [ data ], context, scripts );
+ if ( scripts ) {
+ jQuery( scripts ).remove();
+ }
+ return jQuery.merge( [], parsed.childNodes );
+ },
+
+ parseJSON: function( data ) {
+ // Attempt to parse using the native JSON parser first
+ if ( window.JSON && window.JSON.parse ) {
+ return window.JSON.parse( data );
+ }
+
+ if ( data === null ) {
+ return data;
+ }
+
+ if ( typeof data === "string" ) {
+
+ // Make sure leading/trailing whitespace is removed (IE can't handle it)
+ data = jQuery.trim( data );
+
+ if ( data ) {
+ // Make sure the incoming data is actual JSON
+ // Logic borrowed from http://json.org/json2.js
+ if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+ .replace( rvalidtokens, "]" )
+ .replace( rvalidbraces, "")) ) {
+
+ return ( new Function( "return " + data ) )();
+ }
+ }
+ }
+
+ jQuery.error( "Invalid JSON: " + data );
+ },
+
+ // Cross-browser xml parsing
+ parseXML: function( data ) {
+ var xml, tmp;
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+ try {
+ if ( window.DOMParser ) { // Standard
+ tmp = new DOMParser();
+ xml = tmp.parseFromString( data , "text/xml" );
+ } else { // IE
+ xml = new ActiveXObject( "Microsoft.XMLDOM" );
+ xml.async = "false";
+ xml.loadXML( data );
+ }
+ } catch( e ) {
+ xml = undefined;
+ }
+ if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+ jQuery.error( "Invalid XML: " + data );
+ }
+ return xml;
+ },
+
+ noop: function() {},
+
+ // Evaluates a script in a global context
+ // Workarounds based on findings by Jim Driscoll
+ // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+ globalEval: function( data ) {
+ if ( data && jQuery.trim( data ) ) {
+ // We use execScript on Internet Explorer
+ // We use an anonymous function so that context is window
+ // rather than jQuery in Firefox
+ ( window.execScript || function( data ) {
+ window[ "eval" ].call( window, data );
+ } )( data );
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ // args is for internal usage only
+ each: function( obj, callback, args ) {
+ var value,
+ i = 0,
+ length = obj.length,
+ isArray = isArraylike( obj );
+
+ if ( args ) {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Use native String.trim function wherever possible
+ trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+ function( text ) {
+ return text == null ?
+ "" :
+ core_trim.call( text );
+ } :
+
+ // Otherwise use our own trimming functionality
+ function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArraylike( Object(arr) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ core_push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ var len;
+
+ if ( arr ) {
+ if ( core_indexOf ) {
+ return core_indexOf.call( arr, elem, i );
+ }
+
+ len = arr.length;
+ i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+ for ( ; i < len; i++ ) {
+ // Skip accessing in sparse arrays
+ if ( i in arr && arr[ i ] === elem ) {
+ return i;
+ }
+ }
+ }
+
+ return -1;
+ },
+
+ merge: function( first, second ) {
+ var l = second.length,
+ i = first.length,
+ j = 0;
+
+ if ( typeof l === "number" ) {
+ for ( ; j < l; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+ } else {
+ while ( second[j] !== undefined ) {
+ first[ i++ ] = second[ j++ ];
+ }
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, inv ) {
+ var retVal,
+ ret = [],
+ i = 0,
+ length = elems.length;
+ inv = !!inv;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ retVal = !!callback( elems[ i ], i );
+ if ( inv !== retVal ) {
+ ret.push( elems[ i ] );
+ }
+ }
+
+ return ret;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var value,
+ i = 0,
+ length = elems.length,
+ isArray = isArraylike( elems ),
+ ret = [];
+
+ // Go through the array, translating each of the items to their
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret[ ret.length ] = value;
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret[ ret.length ] = value;
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return core_concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var args, proxy, tmp;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = core_slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ // Multifunctional method to get and set values of a collection
+ // The value/s can optionally be executed if it's a function
+ access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ length = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < length; i++ ) {
+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ length ? fn( elems[0], key ) : emptyGet;
+ },
+
+ now: function() {
+ return ( new Date() ).getTime();
+ },
+
+ // A method for quickly swapping in/out CSS properties to get correct calculations.
+ // Note: this method belongs to the css module but it's needed here for the support module.
+ // If support gets modularized, this method should be moved back to the css module.
+ swap: function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+ }
+});
+
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
+
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called after the browser event has already occurred.
+ // we once tried to use readyState "interactive" here, but it caused issues like the one
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ setTimeout( jQuery.ready );
+
+ // Standards-based browsers support DOMContentLoaded
+ } else if ( document.addEventListener ) {
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed, false );
+
+ // If IE event model is used
+ } else {
+ // Ensure firing before onload, maybe late but safe also for iframes
+ document.attachEvent( "onreadystatechange", completed );
+
+ // A fallback to window.onload, that will always work
+ window.attachEvent( "onload", completed );
+
+ // If IE and not a frame
+ // continually check to see if the document is ready
+ var top = false;
+
+ try {
+ top = window.frameElement == null && document.documentElement;
+ } catch(e) {}
+
+ if ( top && top.doScroll ) {
+ (function doScrollCheck() {
+ if ( !jQuery.isReady ) {
+
+ try {
+ // Use the trick by Diego Perini
+ // http://javascript.nwbox.com/IEContentLoaded/
+ top.doScroll("left");
+ } catch(e) {
+ return setTimeout( doScrollCheck, 50 );
+ }
+
+ // detach all dom ready events
+ detach();
+
+ // and execute any waiting functions
+ jQuery.ready();
+ }
+ })();
+ }
+ }
+ }
+ return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+ var length = obj.length,
+ type = jQuery.type( obj );
+
+ if ( jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.nodeType === 1 && length ) {
+ return true;
+ }
+
+ return type === "array" || type !== "function" &&
+ ( length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj );
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+/*!
+ * Sizzle CSS Selector Engine v1.10.2
+ * http://sizzlejs.com/
+ *
+ * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-07-03
+ */
+(function( window, undefined ) {
+
+var i,
+ support,
+ cachedruns,
+ Expr,
+ getText,
+ isXML,
+ compile,
+ outermostContext,
+ sortInput,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + -(new Date()),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ hasDuplicate = false,
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+ return 0;
+ },
+
+ // General-purpose constants
+ strundefined = typeof undefined,
+ MAX_NEGATIVE = 1 << 31,
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf if we can't use a native one
+ indexOf = arr.indexOf || function( elem ) {
+ var i = 0,
+ len = this.length;
+ for ( ; i < len; i++ ) {
+ if ( this[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+ // http://www.w3.org/TR/css3-syntax/#characters
+ characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+ // Loosely modeled on CSS identifier characters
+ // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+ // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = characterEncoding.replace( "w", "w#" ),
+
+ // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
+ "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
+
+ // Prefer arguments quoted,
+ // then not containing pseudos/brackets,
+ // then attribute selectors/non-parenthetical expressions,
+ // then anything else
+ // These preferences are here to reduce the number of selectors
+ // needing tokenize in the PSEUDO preFilter
+ pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+ rsibling = new RegExp( whitespace + "*[+~]" ),
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+ "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+ "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rescape = /'|\\/g,
+
+ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ // BMP codepoint
+ high < 0 ?
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ };
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var match, elem, m, nodeType,
+ // QSA vars
+ i, groups, old, nid, newContext, newSelector;
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+
+ context = context || document;
+ results = results || [];
+
+ if ( !selector || typeof selector !== "string" ) {
+ return results;
+ }
+
+ if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+ return [];
+ }
+
+ if ( documentIsHTML && !seed ) {
+
+ // Shortcuts
+ if ( (match = rquickExpr.exec( selector )) ) {
+ // Speed-up: Sizzle("#ID")
+ if ( (m = match[1]) ) {
+ if ( nodeType === 9 ) {
+ elem = context.getElementById( m );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE, Opera, and Webkit return items
+ // by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+ } else {
+ // Context is not a document
+ if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+ contains( context, elem ) && elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Speed-up: Sizzle("TAG")
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Speed-up: Sizzle(".CLASS")
+ } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // QSA path
+ if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+ nid = old = expando;
+ newContext = context;
+ newSelector = nodeType === 9 && selector;
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+ groups = tokenize( selector );
+
+ if ( (old = context.getAttribute("id")) ) {
+ nid = old.replace( rescape, "\\$&" );
+ } else {
+ context.setAttribute( "id", nid );
+ }
+ nid = "[id='" + nid + "'] ";
+
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = nid + toSelector( groups[i] );
+ }
+ newContext = rsibling.test( selector ) && context.parentNode || context;
+ newSelector = groups.join(",");
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch(qsaError) {
+ } finally {
+ if ( !old ) {
+ context.removeAttribute("id");
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key += " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+ var div = document.createElement("div");
+
+ try {
+ return !!fn( div );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( div.parentNode ) {
+ div.parentNode.removeChild( div );
+ }
+ // release memory in IE
+ div = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = attrs.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ ( ~b.sourceIndex || MAX_NEGATIVE ) -
+ ( ~a.sourceIndex || MAX_NEGATIVE );
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Detect xml
+ * @param {Element|Object} elem An element or a document
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var doc = node ? node.ownerDocument || node : preferredDoc,
+ parent = doc.defaultView;
+
+ // If no document and documentElement is available, return
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Set our document
+ document = doc;
+ docElem = doc.documentElement;
+
+ // Support tests
+ documentIsHTML = !isXML( doc );
+
+ // Support: IE>8
+ // If iframe document is assigned to "document" variable and if iframe has been reloaded,
+ // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+ // IE6-8 do not support the defaultView property so parent will be undefined
+ if ( parent && parent.attachEvent && parent !== parent.top ) {
+ parent.attachEvent( "onbeforeunload", function() {
+ setDocument();
+ });
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+ support.attributes = assert(function( div ) {
+ div.className = "i";
+ return !div.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( div ) {
+ div.appendChild( doc.createComment("") );
+ return !div.getElementsByTagName("*").length;
+ });
+
+ // Check if getElementsByClassName can be trusted
+ support.getElementsByClassName = assert(function( div ) {
+ div.innerHTML = "
";
+
+ // Support: Safari<4
+ // Catch class over-caching
+ div.firstChild.className = "i";
+ // Support: Opera<10
+ // Catch gEBCN failure to find non-leading classes
+ return div.getElementsByClassName("i").length === 2;
+ });
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( div ) {
+ docElem.appendChild( div ).id = expando;
+ return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+ });
+
+ // ID find and filter
+ if ( support.getById ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+ var m = context.getElementById( id );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [m] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ } else {
+ // Support: IE6/7
+ // getElementById is not reliable as a find shortcut
+ delete Expr.find["ID"];
+
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== strundefined ) {
+ return context.getElementsByTagName( tag );
+ }
+ } :
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See http://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( div ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // http://bugs.jquery.com/ticket/12359
+ div.innerHTML = " ";
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !div.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+ });
+
+ assert(function( div ) {
+
+ // Support: Opera 10-12/IE8
+ // ^= $= *= and empty values
+ // Should not select anything
+ // Support: Windows 8 Native Apps
+ // The type attribute is restricted during .innerHTML assignment
+ var input = doc.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ div.appendChild( input ).setAttribute( "t", "" );
+
+ if ( div.querySelectorAll("[t^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":enabled").length ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( div ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( div, "div" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( div, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+
+ // Element contains another
+ // Purposefully does not implement inclusive descendent
+ // As in, an element does not contain itself
+ contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = docElem.compareDocumentPosition ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );
+
+ if ( compare ) {
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === doc || contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === doc || contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ }
+
+ // Not directly comparable, sort on existence of method
+ return a.compareDocumentPosition ? -1 : 1;
+ } :
+ function( a, b ) {
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+
+ // Parentless nodes are either documents or disconnected
+ } else if ( !aup || !bup ) {
+ return a === doc ? -1 :
+ b === doc ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return doc;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch(e) {}
+ }
+
+ return Sizzle( expr, document, null, [elem] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val === undefined ?
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null :
+ val;
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ for ( ; (node = elem[i]); i++ ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (see #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[5] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] && match[4] !== undefined ) {
+ match[2] = match[4];
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, outerCache, node, diff, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+ // Seek `elem` from a previously-cached index
+ outerCache = parent[ expando ] || (parent[ expando ] = {});
+ cache = outerCache[ type ] || [];
+ nodeIndex = cache[0] === dirruns && cache[1];
+ diff = cache[0] === dirruns && cache[2];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ // Use previously-cached element index if available
+ } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+ diff = cache[1];
+
+ // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ } else {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf.call( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": function( elem ) {
+ return elem.disabled === false;
+ },
+
+ "disabled": function( elem ) {
+ return elem.disabled === true;
+ },
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
+ // not comment, processing instructions, or others
+ // Thanks to Diego Perini for the nodeName shortcut
+ // Greater than "@" means alpha characters (specifically not starting with "#" or "?")
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+ // use getAttribute instead to test this case
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+function tokenize( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( tokens = [] );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+}
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ checkNonElements = base && dir === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var data, cache, outerCache,
+ dirkey = dirruns + " " + doneName;
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+ if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
+ if ( (data = cache[1]) === true || data === cachedruns ) {
+ return data === true;
+ }
+ } else {
+ cache = outerCache[ dir ] = [ dirkey ];
+ cache[1] = matcher( elem, context, xml ) || cachedruns;
+ if ( cache[1] === true ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf.call( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ // A counter to specify which element is currently being matched
+ var matcherCachedRuns = 0,
+ bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, expandContext ) {
+ var elem, j, matcher,
+ setMatched = [],
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ outermost = expandContext != null,
+ contextBackup = outermostContext,
+ // We must always have either seed elements or context
+ elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
+
+ if ( outermost ) {
+ outermostContext = context !== document && context;
+ cachedruns = matcherCachedRuns;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+ for ( ; (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context, xml ) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ cachedruns = ++matcherCachedRuns;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // Apply set filters to unmatched elements
+ matchedCount += i;
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !group ) {
+ group = tokenize( selector );
+ }
+ i = group.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( group[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+ }
+ return cached;
+};
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function select( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ match = tokenize( selector );
+
+ if ( !seed ) {
+ // Try to minimize operations if there is only one group
+ if ( match.length === 1 ) {
+
+ // Take a shortcut and set the context if the root selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+ }
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && context.parentNode || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function
+ // Provide `match` to avoid retokenization if we modified the selector above
+ compile( selector, match )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ rsibling.test( selector )
+ );
+ return results;
+}
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome<14
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+ // Should return 1, but returns 4 (following)
+ return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+ div.innerHTML = " ";
+ return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+ div.innerHTML = " ";
+ div.firstChild.setAttribute( "value", "" );
+ return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+ return div.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ elem[ name ] === true ? name.toLowerCase() : null;
+ }
+ });
+}
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})( window );
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+ var object = optionsCache[ options ] = {};
+ jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ });
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ ( optionsCache[ options ] || createOptions( options ) ) :
+ jQuery.extend( {}, options );
+
+ var // Flag to know if list is currently firing
+ firing,
+ // Last fire value (for non-forgettable lists)
+ memory,
+ // Flag to know if list was already fired
+ fired,
+ // End of the loop when firing
+ firingLength,
+ // Index of currently firing callback (modified by remove if needed)
+ firingIndex,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
+ // Actual callback list
+ list = [],
+ // Stack of fire calls for repeatable lists
+ stack = !options.once && [],
+ // Fire callbacks
+ fire = function( data ) {
+ memory = options.memory && data;
+ fired = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ firing = true;
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+ if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+ memory = false; // To prevent further calls using add
+ break;
+ }
+ }
+ firing = false;
+ if ( list ) {
+ if ( stack ) {
+ if ( stack.length ) {
+ fire( stack.shift() );
+ }
+ } else if ( memory ) {
+ list = [];
+ } else {
+ self.disable();
+ }
+ }
+ },
+ // Actual Callbacks object
+ self = {
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+ // First, we save the current length
+ var start = list.length;
+ (function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ var type = jQuery.type( arg );
+ if ( type === "function" ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && type !== "string" ) {
+ // Inspect recursively
+ add( arg );
+ }
+ });
+ })( arguments );
+ // Do we need to add the callbacks to the
+ // current firing batch?
+ if ( firing ) {
+ firingLength = list.length;
+ // With memory, if we're not firing then
+ // we should call right away
+ } else if ( memory ) {
+ firingStart = start;
+ fire( memory );
+ }
+ }
+ return this;
+ },
+ // Remove a callback from the list
+ remove: function() {
+ if ( list ) {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+ // Handle firing indexes
+ if ( firing ) {
+ if ( index <= firingLength ) {
+ firingLength--;
+ }
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ }
+ });
+ }
+ return this;
+ },
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+ },
+ // Remove all callbacks from the list
+ empty: function() {
+ list = [];
+ firingLength = 0;
+ return this;
+ },
+ // Have the list do nothing anymore
+ disable: function() {
+ list = stack = memory = undefined;
+ return this;
+ },
+ // Is it disabled?
+ disabled: function() {
+ return !list;
+ },
+ // Lock the list in its current state
+ lock: function() {
+ stack = undefined;
+ if ( !memory ) {
+ self.disable();
+ }
+ return this;
+ },
+ // Is it locked?
+ locked: function() {
+ return !stack;
+ },
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( list && ( !fired || stack ) ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ if ( firing ) {
+ stack.push( args );
+ } else {
+ fire( args );
+ }
+ }
+ return this;
+ },
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+jQuery.extend({
+
+ Deferred: function( func ) {
+ var tuples = [
+ // action, add listener, listener list, final state
+ [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks("memory") ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var action = tuple[ 0 ],
+ fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[ tuple[1] ](function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .done( newDefer.resolve )
+ .fail( newDefer.reject )
+ .progress( newDefer.notify );
+ } else {
+ newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+ }
+ });
+ });
+ fns = null;
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 3 ];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[1] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(function() {
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[0] ] = function() {
+ deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+ return this;
+ };
+ deferred[ tuple[0] + "With" ] = list.fireWith;
+ });
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
+ resolveValues = core_slice.call( arguments ),
+ length = resolveValues.length,
+
+ // the count of uncompleted subordinates
+ remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+ // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+ // Update function for both resolve and progress values
+ updateFunc = function( i, contexts, values ) {
+ return function( value ) {
+ contexts[ i ] = this;
+ values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+ if( values === progressValues ) {
+ deferred.notifyWith( contexts, values );
+ } else if ( !( --remaining ) ) {
+ deferred.resolveWith( contexts, values );
+ }
+ };
+ },
+
+ progressValues, progressContexts, resolveContexts;
+
+ // add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+ resolveValues[ i ].promise()
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject )
+ .progress( updateFunc( i, progressContexts, progressValues ) );
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // if we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
+ }
+
+ return deferred.promise();
+ }
+});
+jQuery.support = (function( support ) {
+
+ var all, a, input, select, fragment, opt, eventName, isSupported, i,
+ div = document.createElement("div");
+
+ // Setup
+ div.setAttribute( "className", "t" );
+ div.innerHTML = " a ";
+
+ // Finish early in limited (non-browser) environments
+ all = div.getElementsByTagName("*") || [];
+ a = div.getElementsByTagName("a")[ 0 ];
+ if ( !a || !a.style || !all.length ) {
+ return support;
+ }
+
+ // First batch of tests
+ select = document.createElement("select");
+ opt = select.appendChild( document.createElement("option") );
+ input = div.getElementsByTagName("input")[ 0 ];
+
+ a.style.cssText = "top:1px;float:left;opacity:.5";
+
+ // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+ support.getSetAttribute = div.className !== "t";
+
+ // IE strips leading whitespace when .innerHTML is used
+ support.leadingWhitespace = div.firstChild.nodeType === 3;
+
+ // Make sure that tbody elements aren't automatically inserted
+ // IE will insert them into empty tables
+ support.tbody = !div.getElementsByTagName("tbody").length;
+
+ // Make sure that link elements get serialized correctly by innerHTML
+ // This requires a wrapper element in IE
+ support.htmlSerialize = !!div.getElementsByTagName("link").length;
+
+ // Get the style information from getAttribute
+ // (IE uses .cssText instead)
+ support.style = /top/.test( a.getAttribute("style") );
+
+ // Make sure that URLs aren't manipulated
+ // (IE normalizes it by default)
+ support.hrefNormalized = a.getAttribute("href") === "/a";
+
+ // Make sure that element opacity exists
+ // (IE uses filter instead)
+ // Use a regex to work around a WebKit issue. See #5145
+ support.opacity = /^0.5/.test( a.style.opacity );
+
+ // Verify style float existence
+ // (IE uses styleFloat instead of cssFloat)
+ support.cssFloat = !!a.style.cssFloat;
+
+ // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
+ support.checkOn = !!input.value;
+
+ // Make sure that a selected-by-default option has a working selected property.
+ // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+ support.optSelected = opt.selected;
+
+ // Tests for enctype support on a form (#6743)
+ support.enctype = !!document.createElement("form").enctype;
+
+ // Makes sure cloning an html5 element does not cause problems
+ // Where outerHTML is undefined, this still works
+ support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>";
+
+ // Will be defined later
+ support.inlineBlockNeedsLayout = false;
+ support.shrinkWrapBlocks = false;
+ support.pixelPosition = false;
+ support.deleteExpando = true;
+ support.noCloneEvent = true;
+ support.reliableMarginRight = true;
+ support.boxSizingReliable = true;
+
+ // Make sure checked status is properly cloned
+ input.checked = true;
+ support.noCloneChecked = input.cloneNode( true ).checked;
+
+ // Make sure that the options inside disabled selects aren't marked as disabled
+ // (WebKit marks them as disabled)
+ select.disabled = true;
+ support.optDisabled = !opt.disabled;
+
+ // Support: IE<9
+ try {
+ delete div.test;
+ } catch( e ) {
+ support.deleteExpando = false;
+ }
+
+ // Check if we can trust getAttribute("value")
+ input = document.createElement("input");
+ input.setAttribute( "value", "" );
+ support.input = input.getAttribute( "value" ) === "";
+
+ // Check if an input maintains its value after becoming a radio
+ input.value = "t";
+ input.setAttribute( "type", "radio" );
+ support.radioValue = input.value === "t";
+
+ // #11217 - WebKit loses check when the name is after the checked attribute
+ input.setAttribute( "checked", "t" );
+ input.setAttribute( "name", "t" );
+
+ fragment = document.createDocumentFragment();
+ fragment.appendChild( input );
+
+ // Check if a disconnected checkbox will retain its checked
+ // value of true after appended to the DOM (IE6/7)
+ support.appendChecked = input.checked;
+
+ // WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE<9
+ // Opera does not clone events (and typeof div.attachEvent === undefined).
+ // IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
+ if ( div.attachEvent ) {
+ div.attachEvent( "onclick", function() {
+ support.noCloneEvent = false;
+ });
+
+ div.cloneNode( true ).click();
+ }
+
+ // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
+ // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
+ for ( i in { submit: true, change: true, focusin: true }) {
+ div.setAttribute( eventName = "on" + i, "t" );
+
+ support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
+ }
+
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ // Support: IE<9
+ // Iteration over object's inherited properties before its own.
+ for ( i in jQuery( support ) ) {
+ break;
+ }
+ support.ownLast = i !== "0";
+
+ // Run tests that need a body at doc ready
+ jQuery(function() {
+ var container, marginDiv, tds,
+ divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
+ body = document.getElementsByTagName("body")[0];
+
+ if ( !body ) {
+ // Return for frameset docs that don't have a body
+ return;
+ }
+
+ container = document.createElement("div");
+ container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
+
+ body.appendChild( container ).appendChild( div );
+
+ // Support: IE8
+ // Check if table cells still have offsetWidth/Height when they are set
+ // to display:none and there are still other visible table cells in a
+ // table row; if so, offsetWidth/Height are not reliable for use when
+ // determining if an element has been hidden directly using
+ // display:none (it is still safe to use offsets if a parent element is
+ // hidden; don safety goggles and see bug #4512 for more information).
+ div.innerHTML = "";
+ tds = div.getElementsByTagName("td");
+ tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+ isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+ tds[ 0 ].style.display = "";
+ tds[ 1 ].style.display = "none";
+
+ // Support: IE8
+ // Check if empty table cells still have offsetWidth/Height
+ support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+ // Check box-sizing and margin behavior.
+ div.innerHTML = "";
+ div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
+
+ // Workaround failing boxSizing test due to offsetWidth returning wrong value
+ // with some non-1 values of body zoom, ticket #13543
+ jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {
+ support.boxSizing = div.offsetWidth === 4;
+ });
+
+ // Use window.getComputedStyle because jsdom on node.js will break without it.
+ if ( window.getComputedStyle ) {
+ support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+ support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+ // Check if div with explicit width and no margin-right incorrectly
+ // gets computed margin-right based on width of container. (#3333)
+ // Fails in WebKit before Feb 2011 nightlies
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ marginDiv = div.appendChild( document.createElement("div") );
+ marginDiv.style.cssText = div.style.cssText = divReset;
+ marginDiv.style.marginRight = marginDiv.style.width = "0";
+ div.style.width = "1px";
+
+ support.reliableMarginRight =
+ !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+ }
+
+ if ( typeof div.style.zoom !== core_strundefined ) {
+ // Support: IE<8
+ // Check if natively block-level elements act like inline-block
+ // elements when setting their display to 'inline' and giving
+ // them layout
+ div.innerHTML = "";
+ div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+ support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+ // Support: IE6
+ // Check if elements with layout shrink-wrap their children
+ div.style.display = "block";
+ div.innerHTML = "
";
+ div.firstChild.style.width = "5px";
+ support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+ if ( support.inlineBlockNeedsLayout ) {
+ // Prevent IE 6 from affecting layout for positioned elements #11048
+ // Prevent IE from shrinking the body in IE 7 mode #12869
+ // Support: IE<8
+ body.style.zoom = 1;
+ }
+ }
+
+ body.removeChild( container );
+
+ // Null elements to avoid leaks in IE
+ container = div = tds = marginDiv = null;
+ });
+
+ // Null elements to avoid leaks in IE
+ all = select = fragment = opt = a = input = null;
+
+ return support;
+})({});
+
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+ rmultiDash = /([A-Z])/g;
+
+function internalData( elem, name, data, pvt /* Internal Use Only */ ){
+ if ( !jQuery.acceptData( elem ) ) {
+ return;
+ }
+
+ var ret, thisCache,
+ internalKey = jQuery.expando,
+
+ // We have to handle DOM nodes and JS objects differently because IE6-7
+ // can't GC object references properly across the DOM-JS boundary
+ isNode = elem.nodeType,
+
+ // Only DOM nodes need the global jQuery cache; JS object data is
+ // attached directly to the object so GC can occur automatically
+ cache = isNode ? jQuery.cache : elem,
+
+ // Only defining an ID for JS objects if its cache already exists allows
+ // the code to shortcut on the same path as a DOM node with no cache
+ id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+ // Avoid doing any more work than we need to when trying to get data on an
+ // object that has no data at all
+ if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) {
+ return;
+ }
+
+ if ( !id ) {
+ // Only DOM nodes need a new unique ID for each element since their data
+ // ends up in the global cache
+ if ( isNode ) {
+ id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++;
+ } else {
+ id = internalKey;
+ }
+ }
+
+ if ( !cache[ id ] ) {
+ // Avoid exposing jQuery metadata on plain JS objects when the object
+ // is serialized using JSON.stringify
+ cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
+ }
+
+ // An object can be passed to jQuery.data instead of a key/value pair; this gets
+ // shallow copied over onto the existing cache
+ if ( typeof name === "object" || typeof name === "function" ) {
+ if ( pvt ) {
+ cache[ id ] = jQuery.extend( cache[ id ], name );
+ } else {
+ cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+ }
+ }
+
+ thisCache = cache[ id ];
+
+ // jQuery data() is stored in a separate object inside the object's internal data
+ // cache in order to avoid key collisions between internal data and user-defined
+ // data.
+ if ( !pvt ) {
+ if ( !thisCache.data ) {
+ thisCache.data = {};
+ }
+
+ thisCache = thisCache.data;
+ }
+
+ if ( data !== undefined ) {
+ thisCache[ jQuery.camelCase( name ) ] = data;
+ }
+
+ // Check for both converted-to-camel and non-converted data property names
+ // If a data property was specified
+ if ( typeof name === "string" ) {
+
+ // First Try to find as-is property data
+ ret = thisCache[ name ];
+
+ // Test for null|undefined property data
+ if ( ret == null ) {
+
+ // Try to find the camelCased property
+ ret = thisCache[ jQuery.camelCase( name ) ];
+ }
+ } else {
+ ret = thisCache;
+ }
+
+ return ret;
+}
+
+function internalRemoveData( elem, name, pvt ) {
+ if ( !jQuery.acceptData( elem ) ) {
+ return;
+ }
+
+ var thisCache, i,
+ isNode = elem.nodeType,
+
+ // See jQuery.data for more information
+ cache = isNode ? jQuery.cache : elem,
+ id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+ // If there is already no cache entry for this object, there is no
+ // purpose in continuing
+ if ( !cache[ id ] ) {
+ return;
+ }
+
+ if ( name ) {
+
+ thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+ if ( thisCache ) {
+
+ // Support array or space separated string names for data keys
+ if ( !jQuery.isArray( name ) ) {
+
+ // try the string as a key before any manipulation
+ if ( name in thisCache ) {
+ name = [ name ];
+ } else {
+
+ // split the camel cased version by spaces unless a key with the spaces exists
+ name = jQuery.camelCase( name );
+ if ( name in thisCache ) {
+ name = [ name ];
+ } else {
+ name = name.split(" ");
+ }
+ }
+ } else {
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = name.concat( jQuery.map( name, jQuery.camelCase ) );
+ }
+
+ i = name.length;
+ while ( i-- ) {
+ delete thisCache[ name[i] ];
+ }
+
+ // If there is no data left in the cache, we want to continue
+ // and let the cache object itself get destroyed
+ if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {
+ return;
+ }
+ }
+ }
+
+ // See jQuery.data for more information
+ if ( !pvt ) {
+ delete cache[ id ].data;
+
+ // Don't destroy the parent cache unless the internal data object
+ // had been the only thing left in it
+ if ( !isEmptyDataObject( cache[ id ] ) ) {
+ return;
+ }
+ }
+
+ // Destroy the cache
+ if ( isNode ) {
+ jQuery.cleanData( [ elem ], true );
+
+ // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+ /* jshint eqeqeq: false */
+ } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+ /* jshint eqeqeq: true */
+ delete cache[ id ];
+
+ // When all else fails, null
+ } else {
+ cache[ id ] = null;
+ }
+}
+
+jQuery.extend({
+ cache: {},
+
+ // The following elements throw uncatchable exceptions if you
+ // attempt to add expando properties to them.
+ noData: {
+ "applet": true,
+ "embed": true,
+ // Ban all objects except for Flash (which handle expandos)
+ "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+ },
+
+ hasData: function( elem ) {
+ elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+ return !!elem && !isEmptyDataObject( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return internalData( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ return internalRemoveData( elem, name );
+ },
+
+ // For internal use only.
+ _data: function( elem, name, data ) {
+ return internalData( elem, name, data, true );
+ },
+
+ _removeData: function( elem, name ) {
+ return internalRemoveData( elem, name, true );
+ },
+
+ // A method for determining if a DOM node can handle the data expando
+ acceptData: function( elem ) {
+ // Do not set data on non-element because it will not be cleared (#8335).
+ if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
+ return false;
+ }
+
+ var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+ // nodes accept data unless otherwise specified; rejection can be conditional
+ return !noData || noData !== true && elem.getAttribute("classid") === noData;
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ var attrs, name,
+ data = null,
+ i = 0,
+ elem = this[0];
+
+ // Special expections of .data basically thwart jQuery.access,
+ // so implement the relevant behavior ourselves
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = jQuery.data( elem );
+
+ if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+ attrs = elem.attributes;
+ for ( ; i < attrs.length; i++ ) {
+ name = attrs[i].name;
+
+ if ( name.indexOf("data-") === 0 ) {
+ name = jQuery.camelCase( name.slice(5) );
+
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ jQuery._data( elem, "parsedAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each(function() {
+ jQuery.data( this, key );
+ });
+ }
+
+ return arguments.length > 1 ?
+
+ // Sets one value
+ this.each(function() {
+ jQuery.data( this, key, value );
+ }) :
+
+ // Gets one value
+ // Try to fetch any internally stored data first
+ elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
+ },
+
+ removeData: function( key ) {
+ return this.each(function() {
+ jQuery.removeData( this, key );
+ });
+ }
+});
+
+function dataAttr( elem, key, data ) {
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+
+ var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ jQuery.data( elem, key, data );
+
+ } else {
+ data = undefined;
+ }
+ }
+
+ return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+ var name;
+ for ( name in obj ) {
+
+ // if the public data object is empty, the private is still empty
+ if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+ continue;
+ }
+ if ( name !== "toJSON" ) {
+ return false;
+ }
+ }
+
+ return true;
+}
+jQuery.extend({
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = jQuery._data( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray(data) ) {
+ queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // not intended for public consumption - generates a queueHooks object, or returns the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+ empty: jQuery.Callbacks("once memory").add(function() {
+ jQuery._removeData( elem, type + "queue" );
+ jQuery._removeData( elem, key );
+ })
+ });
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[0], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each(function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ dequeue: function( type ) {
+ return this.each(function() {
+ jQuery.dequeue( this, type );
+ });
+ },
+ // Based off of the plugin by Clint Helfers, with permission.
+ // http://blindsignals.com/index.php/2009/07/jquery-delay/
+ delay: function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = setTimeout( next, time );
+ hooks.stop = function() {
+ clearTimeout( timeout );
+ };
+ });
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while( i-- ) {
+ tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+});
+var nodeHook, boolHook,
+ rclass = /[\t\r\n\f]/g,
+ rreturn = /\r/g,
+ rfocusable = /^(?:input|select|textarea|button|object)$/i,
+ rclickable = /^(?:a|area)$/i,
+ ruseDefault = /^(?:checked|selected)$/i,
+ getSetAttribute = jQuery.support.getSetAttribute,
+ getSetInput = jQuery.support.input;
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr: function( name ) {
+ return this.each(function() {
+ jQuery.removeAttr( this, name );
+ });
+ },
+
+ prop: function( name, value ) {
+ return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+ },
+
+ removeProp: function( name ) {
+ name = jQuery.propFix[ name ] || name;
+ return this.each(function() {
+ // try/catch handles cases where IE balks (such as removing a property on window)
+ try {
+ this[ name ] = undefined;
+ delete this[ name ];
+ } catch( e ) {}
+ });
+ },
+
+ addClass: function( value ) {
+ var classes, elem, cur, clazz, j,
+ i = 0,
+ len = this.length,
+ proceed = typeof value === "string" && value;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).addClass( value.call( this, j, this.className ) );
+ });
+ }
+
+ if ( proceed ) {
+ // The disjunction here is for better compressibility (see removeClass)
+ classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ " "
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
+ }
+ }
+ elem.className = jQuery.trim( cur );
+
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classes, elem, cur, clazz, j,
+ i = 0,
+ len = this.length,
+ proceed = arguments.length === 0 || typeof value === "string" && value;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).removeClass( value.call( this, j, this.className ) );
+ });
+ }
+ if ( proceed ) {
+ classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ ""
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
+ }
+ }
+ elem.className = value ? jQuery.trim( cur ) : "";
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value;
+
+ if ( typeof stateVal === "boolean" && type === "string" ) {
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
+ }
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery( this ),
+ classNames = value.match( core_rnotwhite ) || [];
+
+ while ( (className = classNames[ i++ ]) ) {
+ // check each className given, space separated list
+ if ( self.hasClass( className ) ) {
+ self.removeClass( className );
+ } else {
+ self.addClass( className );
+ }
+ }
+
+ // Toggle whole class name
+ } else if ( type === core_strundefined || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ jQuery._data( this, "__className__", this.className );
+ }
+
+ // If the element has a class name or if we're passed "false",
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+ }
+ });
+ },
+
+ hasClass: function( selector ) {
+ var className = " " + selector + " ",
+ i = 0,
+ l = this.length;
+ for ( ; i < l; i++ ) {
+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ val: function( value ) {
+ var ret, hooks, isFunction,
+ elem = this[0];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ return typeof ret === "string" ?
+ // handle most common string cases
+ ret.replace(rreturn, "") :
+ // handle cases where value is null/undef or number
+ ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ isFunction = jQuery.isFunction( value );
+
+ return this.each(function( i ) {
+ var val;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call( this, i, jQuery( this ).val() );
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+ } else if ( typeof val === "number" ) {
+ val += "";
+ } else if ( jQuery.isArray( val ) ) {
+ val = jQuery.map(val, function ( value ) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+ this.value = val;
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ valHooks: {
+ option: {
+ get: function( elem ) {
+ // Use proper attribute retrieval(#6932, #12072)
+ var val = jQuery.find.attr( elem, "value" );
+ return val != null ?
+ val :
+ elem.text;
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, option,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one" || index < 0,
+ values = one ? null : [],
+ max = one ? index + 1 : options.length,
+ i = index < 0 ?
+ max :
+ one ? index : 0;
+
+ // Loop through all the selected options
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // oldIE doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+ // Don't return options that are disabled or in a disabled optgroup
+ ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
+ ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var optionSet, option,
+ options = elem.options,
+ values = jQuery.makeArray( value ),
+ i = options.length;
+
+ while ( i-- ) {
+ option = options[ i ];
+ if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {
+ optionSet = true;
+ }
+ }
+
+ // force browsers to behave consistently when non-matching value is set
+ if ( !optionSet ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ },
+
+ attr: function( elem, name, value ) {
+ var hooks, ret,
+ nType = elem.nodeType;
+
+ // don't get/set attributes on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( typeof elem.getAttribute === core_strundefined ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ // All attributes are lowercase
+ // Grab necessary hook if one is defined
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+ name = name.toLowerCase();
+ hooks = jQuery.attrHooks[ name ] ||
+ ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+ }
+
+ if ( value !== undefined ) {
+
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+
+ } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ elem.setAttribute( name, value + "" );
+ return value;
+ }
+
+ } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+ ret = jQuery.find.attr( elem, name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ?
+ undefined :
+ ret;
+ }
+ },
+
+ removeAttr: function( elem, value ) {
+ var name, propName,
+ i = 0,
+ attrNames = value && value.match( core_rnotwhite );
+
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( (name = attrNames[i++]) ) {
+ propName = jQuery.propFix[ name ] || name;
+
+ // Boolean attributes get special treatment (#10870)
+ if ( jQuery.expr.match.bool.test( name ) ) {
+ // Set corresponding property to false
+ if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+ elem[ propName ] = false;
+ // Support: IE<9
+ // Also clear defaultChecked/defaultSelected (if appropriate)
+ } else {
+ elem[ jQuery.camelCase( "default-" + name ) ] =
+ elem[ propName ] = false;
+ }
+
+ // See #9699 for explanation of this approach (setting first, then removal)
+ } else {
+ jQuery.attr( elem, name, "" );
+ }
+
+ elem.removeAttribute( getSetAttribute ? name : propName );
+ }
+ }
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+ // Setting the type on a radio button after the value resets the value in IE6-9
+ // Reset value to default in case type is set after value during creation
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
+ },
+
+ propFix: {
+ "for": "htmlFor",
+ "class": "className"
+ },
+
+ prop: function( elem, name, value ) {
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
+ // don't get/set properties on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ if ( notxml ) {
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+ ret :
+ ( elem[ name ] = value );
+
+ } else {
+ return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+ ret :
+ elem[ name ];
+ }
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+ // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+ // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+ // Use proper attribute retrieval(#12072)
+ var tabindex = jQuery.find.attr( elem, "tabindex" );
+
+ return tabindex ?
+ parseInt( tabindex, 10 ) :
+ rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+ 0 :
+ -1;
+ }
+ }
+ }
+});
+
+// Hooks for boolean attributes
+boolHook = {
+ set: function( elem, value, name ) {
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+ // IE<8 needs the *property* name
+ elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
+
+ // Use defaultChecked and defaultSelected for oldIE
+ } else {
+ elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
+ }
+
+ return name;
+ }
+};
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+ var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;
+
+ jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
+ function( elem, name, isXML ) {
+ var fn = jQuery.expr.attrHandle[ name ],
+ ret = isXML ?
+ undefined :
+ /* jshint eqeqeq: false */
+ (jQuery.expr.attrHandle[ name ] = undefined) !=
+ getter( elem, name, isXML ) ?
+
+ name.toLowerCase() :
+ null;
+ jQuery.expr.attrHandle[ name ] = fn;
+ return ret;
+ } :
+ function( elem, name, isXML ) {
+ return isXML ?
+ undefined :
+ elem[ jQuery.camelCase( "default-" + name ) ] ?
+ name.toLowerCase() :
+ null;
+ };
+});
+
+// fix oldIE attroperties
+if ( !getSetInput || !getSetAttribute ) {
+ jQuery.attrHooks.value = {
+ set: function( elem, value, name ) {
+ if ( jQuery.nodeName( elem, "input" ) ) {
+ // Does not return so that setAttribute is also used
+ elem.defaultValue = value;
+ } else {
+ // Use nodeHook if defined (#1954); otherwise setAttribute is fine
+ return nodeHook && nodeHook.set( elem, value, name );
+ }
+ }
+ };
+}
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+ // Use this for any attribute in IE6/7
+ // This fixes almost every IE6/7 issue
+ nodeHook = {
+ set: function( elem, value, name ) {
+ // Set the existing or create a new attribute node
+ var ret = elem.getAttributeNode( name );
+ if ( !ret ) {
+ elem.setAttributeNode(
+ (ret = elem.ownerDocument.createAttribute( name ))
+ );
+ }
+
+ ret.value = value += "";
+
+ // Break association with cloned elements by also using setAttribute (#9646)
+ return name === "value" || value === elem.getAttribute( name ) ?
+ value :
+ undefined;
+ }
+ };
+ jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =
+ // Some attributes are constructed with empty-string values when not defined
+ function( elem, name, isXML ) {
+ var ret;
+ return isXML ?
+ undefined :
+ (ret = elem.getAttributeNode( name )) && ret.value !== "" ?
+ ret.value :
+ null;
+ };
+ jQuery.valHooks.button = {
+ get: function( elem, name ) {
+ var ret = elem.getAttributeNode( name );
+ return ret && ret.specified ?
+ ret.value :
+ undefined;
+ },
+ set: nodeHook.set
+ };
+
+ // Set contenteditable to false on removals(#10429)
+ // Setting to empty string throws an error as an invalid value
+ jQuery.attrHooks.contenteditable = {
+ set: function( elem, value, name ) {
+ nodeHook.set( elem, value === "" ? false : value, name );
+ }
+ };
+
+ // Set width and height to auto instead of 0 on empty string( Bug #8150 )
+ // This is for removals
+ jQuery.each([ "width", "height" ], function( i, name ) {
+ jQuery.attrHooks[ name ] = {
+ set: function( elem, value ) {
+ if ( value === "" ) {
+ elem.setAttribute( name, "auto" );
+ return value;
+ }
+ }
+ };
+ });
+}
+
+
+// Some attributes require a special call on IE
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !jQuery.support.hrefNormalized ) {
+ // href/src property should get the full normalized URL (#10299/#12915)
+ jQuery.each([ "href", "src" ], function( i, name ) {
+ jQuery.propHooks[ name ] = {
+ get: function( elem ) {
+ return elem.getAttribute( name, 4 );
+ }
+ };
+ });
+}
+
+if ( !jQuery.support.style ) {
+ jQuery.attrHooks.style = {
+ get: function( elem ) {
+ // Return undefined in the case of empty string
+ // Note: IE uppercases css property names, but if we were to .toLowerCase()
+ // .cssText, that would destroy case senstitivity in URL's, like in "background"
+ return elem.style.cssText || undefined;
+ },
+ set: function( elem, value ) {
+ return ( elem.style.cssText = value + "" );
+ }
+ };
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+ jQuery.propHooks.selected = {
+ get: function( elem ) {
+ var parent = elem.parentNode;
+
+ if ( parent ) {
+ parent.selectedIndex;
+
+ // Make sure that it also works with optgroups, see #5701
+ if ( parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ }
+ return null;
+ }
+ };
+}
+
+jQuery.each([
+ "tabIndex",
+ "readOnly",
+ "maxLength",
+ "cellSpacing",
+ "cellPadding",
+ "rowSpan",
+ "colSpan",
+ "useMap",
+ "frameBorder",
+ "contentEditable"
+], function() {
+ jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+ jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ set: function( elem, value ) {
+ if ( jQuery.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+ }
+ }
+ };
+ if ( !jQuery.support.checkOn ) {
+ jQuery.valHooks[ this ].get = function( elem ) {
+ // Support: Webkit
+ // "" is returned instead of "on" if a value isn't specified
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ };
+ }
+});
+var rformElems = /^(?:input|select|textarea)$/i,
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|contextmenu)|click/,
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+ var tmp, events, t, handleObjIn,
+ special, eventHandle, handleObj,
+ handlers, type, namespaces, origType,
+ elemData = jQuery._data( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !(events = elemData.events) ) {
+ events = elemData.events = {};
+ }
+ if ( !(eventHandle = elemData.handle) ) {
+ eventHandle = elemData.handle = function( e ) {
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
+ jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+ undefined;
+ };
+ // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+ eventHandle.elem = elem;
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( core_rnotwhite ) || [""];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend({
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join(".")
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !(handlers = events[ type ]) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener/attachEvent if the special events handler returns false
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+ // Bind the global event handler to the element
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+
+ } else if ( elem.attachEvent ) {
+ elem.attachEvent( "on" + type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ // Nullify elem to prevent memory leaks in IE
+ elem = null;
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+ var j, handleObj, tmp,
+ origCount, t, events,
+ special, handlers, type,
+ namespaces, origType,
+ elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+ if ( !elemData || !(events = elemData.events) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( core_rnotwhite ) || [""];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ delete elemData.handle;
+
+ // removeData also checks for emptiness and clears the expando if empty
+ // so use it instead of delete
+ jQuery._removeData( elem, "events" );
+ }
+ },
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+ var handle, ontype, cur,
+ bubbleType, special, tmp, i,
+ eventPath = [ elem || document ],
+ type = core_hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+ cur = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf(".") >= 0 ) {
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf(":") < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join(".");
+ event.namespace_re = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === (elem.ownerDocument || document) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
+ event.preventDefault();
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+ if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
+ jQuery.acceptData( elem ) ) {
+
+ // Call a native DOM method on the target with the same name name as the event.
+ // Can't use an .isFunction() check here because IE6/7 fails that test.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ ontype ];
+
+ if ( tmp ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+ try {
+ elem[ type ]();
+ } catch ( e ) {
+ // IE<9 dies on focus/blur to hidden element (#1486,#12518)
+ // only reproducible on winXP IE8 native, not IE9 in IE8 mode
+ }
+ jQuery.event.triggered = undefined;
+
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event );
+
+ var i, ret, handleObj, matched, j,
+ handlerQueue = [],
+ args = core_slice.call( arguments ),
+ handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[0] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or
+ // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+ .apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( (event.result = ret) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var sel, handleObj, matches, i,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ // Black-hole SVG instance trees (#13180)
+ // Avoid non-left-click bubbling in Firefox (#3861)
+ if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+ /* jshint eqeqeq: false */
+ for ( ; cur != this; cur = cur.parentNode || this ) {
+ /* jshint eqeqeq: true */
+
+ // Don't check non-elements (#13208)
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
+ matches = [];
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matches[ sel ] === undefined ) {
+ matches[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) >= 0 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matches[ sel ] ) {
+ matches.push( handleObj );
+ }
+ }
+ if ( matches.length ) {
+ handlerQueue.push({ elem: cur, handlers: matches });
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+ }
+
+ return handlerQueue;
+ },
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop, copy,
+ type = event.type,
+ originalEvent = event,
+ fixHook = this.fixHooks[ type ];
+
+ if ( !fixHook ) {
+ this.fixHooks[ type ] = fixHook =
+ rmouseEvent.test( type ) ? this.mouseHooks :
+ rkeyEvent.test( type ) ? this.keyHooks :
+ {};
+ }
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+ event = new jQuery.Event( originalEvent );
+
+ i = copy.length;
+ while ( i-- ) {
+ prop = copy[ i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Support: IE<9
+ // Fix target property (#1925)
+ if ( !event.target ) {
+ event.target = originalEvent.srcElement || document;
+ }
+
+ // Support: Chrome 23+, Safari?
+ // Target should not be a text node (#504, #13143)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ // Support: IE<9
+ // For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
+ event.metaKey = !!event.metaKey;
+
+ return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+ },
+
+ // Includes some event props shared by KeyEvent and MouseEvent
+ props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+ fixHooks: {},
+
+ keyHooks: {
+ props: "char charCode key keyCode".split(" "),
+ filter: function( event, original ) {
+
+ // Add which for key events
+ if ( event.which == null ) {
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
+ }
+
+ return event;
+ }
+ },
+
+ mouseHooks: {
+ props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+ filter: function( event, original ) {
+ var body, eventDoc, doc,
+ button = original.button,
+ fromElement = original.fromElement;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && original.clientX != null ) {
+ eventDoc = event.target.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+ event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
+ }
+
+ // Add relatedTarget, if necessary
+ if ( !event.relatedTarget && fromElement ) {
+ event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && button !== undefined ) {
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+ }
+
+ return event;
+ }
+ },
+
+ special: {
+ load: {
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ focus: {
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== safeActiveElement() && this.focus ) {
+ try {
+ this.focus();
+ return false;
+ } catch ( e ) {
+ // Support: IE<9
+ // If we error on focus to hidden element (#1486, #12518),
+ // let .trigger() run the handlers
+ }
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function() {
+ if ( this === safeActiveElement() && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+ click: {
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
+ this.click();
+ return false;
+ }
+ },
+
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function( event ) {
+ return jQuery.nodeName( event.target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Even when returnValue equals to undefined Firefox will still show alert
+ if ( event.result !== undefined ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ },
+
+ simulate: function( type, elem, event, bubble ) {
+ // Piggyback on a donor event to simulate a different one.
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
+ // simulated event prevents default then we do the same on the donor.
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ {
+ type: type,
+ isSimulated: true,
+ originalEvent: {}
+ }
+ );
+ if ( bubble ) {
+ jQuery.event.trigger( e, null, elem );
+ } else {
+ jQuery.event.dispatch.call( elem, e );
+ }
+ if ( e.isDefaultPrevented() ) {
+ event.preventDefault();
+ }
+ }
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+ function( elem, type, handle ) {
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle, false );
+ }
+ } :
+ function( elem, type, handle ) {
+ var name = "on" + type;
+
+ if ( elem.detachEvent ) {
+
+ // #8545, #7054, preventing memory leaks for custom events in IE6-8
+ // detachEvent needed property on element, by name of that event, to properly expose it to GC
+ if ( typeof elem[ name ] === core_strundefined ) {
+ elem[ name ] = null;
+ }
+
+ elem.detachEvent( name, handle );
+ }
+ };
+
+jQuery.Event = function( src, props ) {
+ // Allow instantiation without the 'new' keyword
+ if ( !(this instanceof jQuery.Event) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+ src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+ if ( !e ) {
+ return;
+ }
+
+ // If preventDefault exists, run it on the original event
+ if ( e.preventDefault ) {
+ e.preventDefault();
+
+ // Support: IE
+ // Otherwise set the returnValue property of the original event to false
+ } else {
+ e.returnValue = false;
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+ if ( !e ) {
+ return;
+ }
+ // If stopPropagation exists, run it on the original event
+ if ( e.stopPropagation ) {
+ e.stopPropagation();
+ }
+
+ // Support: IE
+ // Set the cancelBubble property of the original event to true
+ e.cancelBubble = true;
+ },
+ stopImmediatePropagation: function() {
+ this.isImmediatePropagationStopped = returnTrue;
+ this.stopPropagation();
+ }
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mousenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+ jQuery.event.special.submit = {
+ setup: function() {
+ // Only need this for delegated form submit events
+ if ( jQuery.nodeName( this, "form" ) ) {
+ return false;
+ }
+
+ // Lazy-add a submit handler when a descendant form may potentially be submitted
+ jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+ // Node name check avoids a VML-related crash in IE (#9807)
+ var elem = e.target,
+ form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+ if ( form && !jQuery._data( form, "submitBubbles" ) ) {
+ jQuery.event.add( form, "submit._submit", function( event ) {
+ event._submit_bubble = true;
+ });
+ jQuery._data( form, "submitBubbles", true );
+ }
+ });
+ // return undefined since we don't need an event listener
+ },
+
+ postDispatch: function( event ) {
+ // If form was submitted by the user, bubble the event up the tree
+ if ( event._submit_bubble ) {
+ delete event._submit_bubble;
+ if ( this.parentNode && !event.isTrigger ) {
+ jQuery.event.simulate( "submit", this.parentNode, event, true );
+ }
+ }
+ },
+
+ teardown: function() {
+ // Only need this for delegated form submit events
+ if ( jQuery.nodeName( this, "form" ) ) {
+ return false;
+ }
+
+ // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+ jQuery.event.remove( this, "._submit" );
+ }
+ };
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+ jQuery.event.special.change = {
+
+ setup: function() {
+
+ if ( rformElems.test( this.nodeName ) ) {
+ // IE doesn't fire change on a check/radio until blur; trigger it on click
+ // after a propertychange. Eat the blur-change in special.change.handle.
+ // This still fires onchange a second time for check/radio after blur.
+ if ( this.type === "checkbox" || this.type === "radio" ) {
+ jQuery.event.add( this, "propertychange._change", function( event ) {
+ if ( event.originalEvent.propertyName === "checked" ) {
+ this._just_changed = true;
+ }
+ });
+ jQuery.event.add( this, "click._change", function( event ) {
+ if ( this._just_changed && !event.isTrigger ) {
+ this._just_changed = false;
+ }
+ // Allow triggered, simulated change events (#11500)
+ jQuery.event.simulate( "change", this, event, true );
+ });
+ }
+ return false;
+ }
+ // Delegated event; lazy-add a change handler on descendant inputs
+ jQuery.event.add( this, "beforeactivate._change", function( e ) {
+ var elem = e.target;
+
+ if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
+ jQuery.event.add( elem, "change._change", function( event ) {
+ if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+ jQuery.event.simulate( "change", this.parentNode, event, true );
+ }
+ });
+ jQuery._data( elem, "changeBubbles", true );
+ }
+ });
+ },
+
+ handle: function( event ) {
+ var elem = event.target;
+
+ // Swallow native change events from checkbox/radio, we already triggered them above
+ if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+ return event.handleObj.handler.apply( this, arguments );
+ }
+ },
+
+ teardown: function() {
+ jQuery.event.remove( this, "._change" );
+
+ return !rformElems.test( this.nodeName );
+ }
+ };
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+ // Attach a single capturing handler while someone wants focusin/focusout
+ var attaches = 0,
+ handler = function( event ) {
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+ };
+
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ if ( attaches++ === 0 ) {
+ document.addEventListener( orig, handler, true );
+ }
+ },
+ teardown: function() {
+ if ( --attaches === 0 ) {
+ document.removeEventListener( orig, handler, true );
+ }
+ }
+ };
+ });
+}
+
+jQuery.fn.extend({
+
+ on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+ var type, origFn;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ this.on( type, selector, data, types[ type ], one );
+ }
+ return this;
+ }
+
+ if ( data == null && fn == null ) {
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return this;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return this.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ });
+ },
+ one: function( types, selector, data, fn ) {
+ return this.on( types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each(function() {
+ jQuery.event.remove( this, types, fn, selector );
+ });
+ },
+
+ trigger: function( type, data ) {
+ return this.each(function() {
+ jQuery.event.trigger( type, data, this );
+ });
+ },
+ triggerHandler: function( type, data ) {
+ var elem = this[0];
+ if ( elem ) {
+ return jQuery.event.trigger( type, data, elem, true );
+ }
+ }
+});
+var isSimple = /^.[^:#\[\.,]*$/,
+ rparentsprev = /^(?:parents|prev(?:Until|All))/,
+ rneedsContext = jQuery.expr.match.needsContext,
+ // methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.fn.extend({
+ find: function( selector ) {
+ var i,
+ ret = [],
+ self = this,
+ len = self.length;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter(function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ }) );
+ }
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+ ret.selector = this.selector ? this.selector + " " + selector : selector;
+ return ret;
+ },
+
+ has: function( target ) {
+ var i,
+ targets = jQuery( target, this ),
+ len = targets.length;
+
+ return this.filter(function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( this, targets[i] ) ) {
+ return true;
+ }
+ }
+ });
+ },
+
+ not: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], true) );
+ },
+
+ filter: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], false) );
+ },
+
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ ret = [],
+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( ; i < l; i++ ) {
+ for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && (pos ?
+ pos.index(cur) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector(cur, selectors)) ) {
+
+ cur = ret.push( cur );
+ break;
+ }
+ }
+ }
+
+ return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
+ },
+
+ // Determine the position of an element within
+ // the matched set of elements
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // index in selector
+ if ( typeof elem === "string" ) {
+ return jQuery.inArray( this[0], jQuery( elem ) );
+ }
+
+ // Locate the position of the desired element
+ return jQuery.inArray(
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[0] : elem, this );
+ },
+
+ add: function( selector, context ) {
+ var set = typeof selector === "string" ?
+ jQuery( selector, context ) :
+ jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+ all = jQuery.merge( this.get(), set );
+
+ return this.pushStack( jQuery.unique(all) );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter(selector)
+ );
+ }
+});
+
+function sibling( cur, dir ) {
+ do {
+ cur = cur[ dir ];
+ } while ( cur && cur.nodeType !== 1 );
+
+ return cur;
+}
+
+jQuery.each({
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return jQuery.dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return jQuery.dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return jQuery.dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return jQuery.sibling( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return jQuery.nodeName( elem, "iframe" ) ?
+ elem.contentDocument || elem.contentWindow.document :
+ jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var ret = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ ret = jQuery.filter( selector, ret );
+ }
+
+ if ( this.length > 1 ) {
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ ret = jQuery.unique( ret );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ ret = ret.reverse();
+ }
+ }
+
+ return this.pushStack( ret );
+ };
+});
+
+jQuery.extend({
+ filter: function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 && elem.nodeType === 1 ?
+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ }));
+ },
+
+ dir: function( elem, dir, until ) {
+ var matched = [],
+ cur = elem[ dir ];
+
+ while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+ if ( cur.nodeType === 1 ) {
+ matched.push( cur );
+ }
+ cur = cur[dir];
+ }
+ return matched;
+ },
+
+ sibling: function( n, elem ) {
+ var r = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ r.push( n );
+ }
+ }
+
+ return r;
+ }
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ /* jshint -W018 */
+ return !!qualifier.call( elem, i, elem ) !== not;
+ });
+
+ }
+
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ });
+
+ }
+
+ if ( typeof qualifier === "string" ) {
+ if ( isSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ qualifier = jQuery.filter( qualifier, elements );
+ }
+
+ return jQuery.grep( elements, function( elem ) {
+ return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
+ });
+}
+function createSafeFragment( document ) {
+ var list = nodeNames.split( "|" ),
+ safeFrag = document.createDocumentFragment();
+
+ if ( safeFrag.createElement ) {
+ while ( list.length ) {
+ safeFrag.createElement(
+ list.pop()
+ );
+ }
+ }
+ return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+ "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+ rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+ rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+ rleadingWhitespace = /^\s+/,
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+ rtagName = /<([\w:]+)/,
+ rtbody = /\s*$/g,
+
+ // We have to close these tags to support XHTML (#13200)
+ wrapMap = {
+ option: [ 1, "", " " ],
+ legend: [ 1, "", " " ],
+ area: [ 1, "", " " ],
+ param: [ 1, "", " " ],
+ thead: [ 1, "" ],
+ tr: [ 2, "" ],
+ col: [ 2, "" ],
+ td: [ 3, "" ],
+
+ // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+ // unless wrapped in a div with non-breaking characters in front of it.
+ _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X", "
" ]
+ },
+ safeFragment = createSafeFragment( document ),
+ fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+jQuery.fn.extend({
+ text: function( value ) {
+ return jQuery.access( this, function( value ) {
+ return value === undefined ?
+ jQuery.text( this ) :
+ this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+ }, null, value, arguments.length );
+ },
+
+ append: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.appendChild( elem );
+ }
+ });
+ },
+
+ prepend: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.insertBefore( elem, target.firstChild );
+ }
+ });
+ },
+
+ before: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this );
+ }
+ });
+ },
+
+ after: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ }
+ });
+ },
+
+ // keepData is for internal use only--do not document
+ remove: function( selector, keepData ) {
+ var elem,
+ elems = selector ? jQuery.filter( selector, this ) : this,
+ i = 0;
+
+ for ( ; (elem = elems[i]) != null; i++ ) {
+
+ if ( !keepData && elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem ) );
+ }
+
+ if ( elem.parentNode ) {
+ if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+ setGlobalEval( getAll( elem, "script" ) );
+ }
+ elem.parentNode.removeChild( elem );
+ }
+ }
+
+ return this;
+ },
+
+ empty: function() {
+ var elem,
+ i = 0;
+
+ for ( ; (elem = this[i]) != null; i++ ) {
+ // Remove element nodes and prevent memory leaks
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem, false ) );
+ }
+
+ // Remove any remaining nodes
+ while ( elem.firstChild ) {
+ elem.removeChild( elem.firstChild );
+ }
+
+ // If this is a select, ensure that it displays empty (#12336)
+ // Support: IE<9
+ if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
+ elem.options.length = 0;
+ }
+ }
+
+ return this;
+ },
+
+ clone: function( dataAndEvents, deepDataAndEvents ) {
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map( function () {
+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+ });
+ },
+
+ html: function( value ) {
+ return jQuery.access( this, function( value ) {
+ var elem = this[0] || {},
+ i = 0,
+ l = this.length;
+
+ if ( value === undefined ) {
+ return elem.nodeType === 1 ?
+ elem.innerHTML.replace( rinlinejQuery, "" ) :
+ undefined;
+ }
+
+ // See if we can take a shortcut and just use innerHTML
+ if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+ ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) &&
+ ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+ !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+ value = value.replace( rxhtmlTag, "<$1>$2>" );
+
+ try {
+ for (; i < l; i++ ) {
+ // Remove element nodes and prevent memory leaks
+ elem = this[i] || {};
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem, false ) );
+ elem.innerHTML = value;
+ }
+ }
+
+ elem = 0;
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch(e) {}
+ }
+
+ if ( elem ) {
+ this.empty().append( value );
+ }
+ }, null, value, arguments.length );
+ },
+
+ replaceWith: function() {
+ var
+ // Snapshot the DOM in case .domManip sweeps something relevant into its fragment
+ args = jQuery.map( this, function( elem ) {
+ return [ elem.nextSibling, elem.parentNode ];
+ }),
+ i = 0;
+
+ // Make the changes, replacing each context element with the new content
+ this.domManip( arguments, function( elem ) {
+ var next = args[ i++ ],
+ parent = args[ i++ ];
+
+ if ( parent ) {
+ // Don't use the snapshot next if it has moved (#13810)
+ if ( next && next.parentNode !== parent ) {
+ next = this.nextSibling;
+ }
+ jQuery( this ).remove();
+ parent.insertBefore( elem, next );
+ }
+ // Allow new content to include elements from the context set
+ }, true );
+
+ // Force removal if there was no new content (e.g., from empty arguments)
+ return i ? this : this.remove();
+ },
+
+ detach: function( selector ) {
+ return this.remove( selector, true );
+ },
+
+ domManip: function( args, callback, allowIntersection ) {
+
+ // Flatten any nested arrays
+ args = core_concat.apply( [], args );
+
+ var first, node, hasScripts,
+ scripts, doc, fragment,
+ i = 0,
+ l = this.length,
+ set = this,
+ iNoClone = l - 1,
+ value = args[0],
+ isFunction = jQuery.isFunction( value );
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
+ return this.each(function( index ) {
+ var self = set.eq( index );
+ if ( isFunction ) {
+ args[0] = value.call( this, index, self.html() );
+ }
+ self.domManip( args, callback, allowIntersection );
+ });
+ }
+
+ if ( l ) {
+ fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );
+ first = fragment.firstChild;
+
+ if ( fragment.childNodes.length === 1 ) {
+ fragment = first;
+ }
+
+ if ( first ) {
+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+ hasScripts = scripts.length;
+
+ // Use the original fragment for the last item instead of the first because it can end up
+ // being emptied incorrectly in certain situations (#8070).
+ for ( ; i < l; i++ ) {
+ node = fragment;
+
+ if ( i !== iNoClone ) {
+ node = jQuery.clone( node, true, true );
+
+ // Keep references to cloned scripts for later restoration
+ if ( hasScripts ) {
+ jQuery.merge( scripts, getAll( node, "script" ) );
+ }
+ }
+
+ callback.call( this[i], node, i );
+ }
+
+ if ( hasScripts ) {
+ doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+ // Reenable scripts
+ jQuery.map( scripts, restoreScript );
+
+ // Evaluate executable scripts on first document insertion
+ for ( i = 0; i < hasScripts; i++ ) {
+ node = scripts[ i ];
+ if ( rscriptType.test( node.type || "" ) &&
+ !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+ if ( node.src ) {
+ // Hope ajax is available...
+ jQuery._evalUrl( node.src );
+ } else {
+ jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
+ }
+ }
+ }
+ }
+
+ // Fix #11809: Avoid leaking memory
+ fragment = first = null;
+ }
+ }
+
+ return this;
+ }
+});
+
+// Support: IE<8
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+ return jQuery.nodeName( elem, "table" ) &&
+ jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ?
+
+ elem.getElementsByTagName("tbody")[0] ||
+ elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+ elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+ elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type;
+ return elem;
+}
+function restoreScript( elem ) {
+ var match = rscriptTypeMasked.exec( elem.type );
+ if ( match ) {
+ elem.type = match[1];
+ } else {
+ elem.removeAttribute("type");
+ }
+ return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var elem,
+ i = 0;
+ for ( ; (elem = elems[i]) != null; i++ ) {
+ jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
+ }
+}
+
+function cloneCopyEvent( src, dest ) {
+
+ if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+ return;
+ }
+
+ var type, i, l,
+ oldData = jQuery._data( src ),
+ curData = jQuery._data( dest, oldData ),
+ events = oldData.events;
+
+ if ( events ) {
+ delete curData.handle;
+ curData.events = {};
+
+ for ( type in events ) {
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type, events[ type ][ i ] );
+ }
+ }
+ }
+
+ // make the cloned public data object a copy from the original
+ if ( curData.data ) {
+ curData.data = jQuery.extend( {}, curData.data );
+ }
+}
+
+function fixCloneNodeIssues( src, dest ) {
+ var nodeName, e, data;
+
+ // We do not need to do anything for non-Elements
+ if ( dest.nodeType !== 1 ) {
+ return;
+ }
+
+ nodeName = dest.nodeName.toLowerCase();
+
+ // IE6-8 copies events bound via attachEvent when using cloneNode.
+ if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
+ data = jQuery._data( dest );
+
+ for ( e in data.events ) {
+ jQuery.removeEvent( dest, e, data.handle );
+ }
+
+ // Event data gets referenced instead of copied if the expando gets copied too
+ dest.removeAttribute( jQuery.expando );
+ }
+
+ // IE blanks contents when cloning scripts, and tries to evaluate newly-set text
+ if ( nodeName === "script" && dest.text !== src.text ) {
+ disableScript( dest ).text = src.text;
+ restoreScript( dest );
+
+ // IE6-10 improperly clones children of object elements using classid.
+ // IE10 throws NoModificationAllowedError if parent is null, #12132.
+ } else if ( nodeName === "object" ) {
+ if ( dest.parentNode ) {
+ dest.outerHTML = src.outerHTML;
+ }
+
+ // This path appears unavoidable for IE9. When cloning an object
+ // element in IE9, the outerHTML strategy above is not sufficient.
+ // If the src has innerHTML and the destination does not,
+ // copy the src.innerHTML into the dest.innerHTML. #10324
+ if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
+ dest.innerHTML = src.innerHTML;
+ }
+
+ } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
+ // IE6-8 fails to persist the checked state of a cloned checkbox
+ // or radio button. Worse, IE6-7 fail to give the cloned element
+ // a checked appearance if the defaultChecked value isn't also set
+
+ dest.defaultChecked = dest.checked = src.checked;
+
+ // IE6-7 get confused and end up setting the value of a cloned
+ // checkbox/radio button to an empty string instead of "on"
+ if ( dest.value !== src.value ) {
+ dest.value = src.value;
+ }
+
+ // IE6-8 fails to return the selected option to the default selected
+ // state when cloning options
+ } else if ( nodeName === "option" ) {
+ dest.defaultSelected = dest.selected = src.defaultSelected;
+
+ // IE6-8 fails to set the defaultValue to the correct value when
+ // cloning other types of input fields
+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
+ dest.defaultValue = src.defaultValue;
+ }
+}
+
+jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function( name, original ) {
+ jQuery.fn[ name ] = function( selector ) {
+ var elems,
+ i = 0,
+ ret = [],
+ insert = jQuery( selector ),
+ last = insert.length - 1;
+
+ for ( ; i <= last; i++ ) {
+ elems = i === last ? this : this.clone(true);
+ jQuery( insert[i] )[ original ]( elems );
+
+ // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
+ core_push.apply( ret, elems.get() );
+ }
+
+ return this.pushStack( ret );
+ };
+});
+
+function getAll( context, tag ) {
+ var elems, elem,
+ i = 0,
+ found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
+ typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
+ undefined;
+
+ if ( !found ) {
+ for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
+ if ( !tag || jQuery.nodeName( elem, tag ) ) {
+ found.push( elem );
+ } else {
+ jQuery.merge( found, getAll( elem, tag ) );
+ }
+ }
+ }
+
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], found ) :
+ found;
+}
+
+// Used in buildFragment, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+ if ( manipulation_rcheckableType.test( elem.type ) ) {
+ elem.defaultChecked = elem.checked;
+ }
+}
+
+jQuery.extend({
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var destElements, node, clone, i, srcElements,
+ inPage = jQuery.contains( elem.ownerDocument, elem );
+
+ if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+ clone = elem.cloneNode( true );
+
+ // IE<=8 does not properly clone detached, unknown element nodes
+ } else {
+ fragmentDiv.innerHTML = elem.outerHTML;
+ fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+ }
+
+ if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+ (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+
+ // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+ destElements = getAll( clone );
+ srcElements = getAll( elem );
+
+ // Fix all IE cloning issues
+ for ( i = 0; (node = srcElements[i]) != null; ++i ) {
+ // Ensure that the destination node is not null; Fixes #9587
+ if ( destElements[i] ) {
+ fixCloneNodeIssues( node, destElements[i] );
+ }
+ }
+ }
+
+ // Copy the events from the original to the clone
+ if ( dataAndEvents ) {
+ if ( deepDataAndEvents ) {
+ srcElements = srcElements || getAll( elem );
+ destElements = destElements || getAll( clone );
+
+ for ( i = 0; (node = srcElements[i]) != null; i++ ) {
+ cloneCopyEvent( node, destElements[i] );
+ }
+ } else {
+ cloneCopyEvent( elem, clone );
+ }
+ }
+
+ // Preserve script evaluation history
+ destElements = getAll( clone, "script" );
+ if ( destElements.length > 0 ) {
+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+ }
+
+ destElements = srcElements = node = null;
+
+ // Return the cloned set
+ return clone;
+ },
+
+ buildFragment: function( elems, context, scripts, selection ) {
+ var j, elem, contains,
+ tmp, tag, tbody, wrap,
+ l = elems.length,
+
+ // Ensure a safe fragment
+ safe = createSafeFragment( context ),
+
+ nodes = [],
+ i = 0;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || safe.appendChild( context.createElement("div") );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+
+ tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>$2>" ) + wrap[2];
+
+ // Descend through wrappers to the right content
+ j = wrap[0];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Manually add leading whitespace removed by IE
+ if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+ nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
+ }
+
+ // Remove IE's autoinserted from table fragments
+ if ( !jQuery.support.tbody ) {
+
+ // String was a , *may* have spurious
+ elem = tag === "table" && !rtbody.test( elem ) ?
+ tmp.firstChild :
+
+ // String was a bare or
+ wrap[1] === "" && !rtbody.test( elem ) ?
+ tmp :
+ 0;
+
+ j = elem && elem.childNodes.length;
+ while ( j-- ) {
+ if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
+ elem.removeChild( tbody );
+ }
+ }
+ }
+
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Fix #12392 for WebKit and IE > 9
+ tmp.textContent = "";
+
+ // Fix #12392 for oldIE
+ while ( tmp.firstChild ) {
+ tmp.removeChild( tmp.firstChild );
+ }
+
+ // Remember the top-level container for proper cleanup
+ tmp = safe.lastChild;
+ }
+ }
+ }
+
+ // Fix #11356: Clear elements from fragment
+ if ( tmp ) {
+ safe.removeChild( tmp );
+ }
+
+ // Reset defaultChecked for any radios and checkboxes
+ // about to be appended to the DOM in IE 6/7 (#8060)
+ if ( !jQuery.support.appendChecked ) {
+ jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
+ }
+
+ i = 0;
+ while ( (elem = nodes[ i++ ]) ) {
+
+ // #4087 - If origin and destination elements are the same, and this is
+ // that element, do not do anything
+ if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( safe.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( (elem = tmp[ j++ ]) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ tmp = null;
+
+ return safe;
+ },
+
+ cleanData: function( elems, /* internal */ acceptData ) {
+ var elem, type, id, data,
+ i = 0,
+ internalKey = jQuery.expando,
+ cache = jQuery.cache,
+ deleteExpando = jQuery.support.deleteExpando,
+ special = jQuery.event.special;
+
+ for ( ; (elem = elems[i]) != null; i++ ) {
+
+ if ( acceptData || jQuery.acceptData( elem ) ) {
+
+ id = elem[ internalKey ];
+ data = id && cache[ id ];
+
+ if ( data ) {
+ if ( data.events ) {
+ for ( type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent( elem, type, data.handle );
+ }
+ }
+ }
+
+ // Remove cache only if it was not already removed by jQuery.event.remove
+ if ( cache[ id ] ) {
+
+ delete cache[ id ];
+
+ // IE does not allow us to delete expando properties from nodes,
+ // nor does it have a removeAttribute function on Document nodes;
+ // we must handle all of these cases
+ if ( deleteExpando ) {
+ delete elem[ internalKey ];
+
+ } else if ( typeof elem.removeAttribute !== core_strundefined ) {
+ elem.removeAttribute( internalKey );
+
+ } else {
+ elem[ internalKey ] = null;
+ }
+
+ core_deletedIds.push( id );
+ }
+ }
+ }
+ }
+ },
+
+ _evalUrl: function( url ) {
+ return jQuery.ajax({
+ url: url,
+ type: "GET",
+ dataType: "script",
+ async: false,
+ global: false,
+ "throws": true
+ });
+ }
+});
+jQuery.fn.extend({
+ wrapAll: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function(i) {
+ jQuery(this).wrapAll( html.call(this, i) );
+ });
+ }
+
+ if ( this[0] ) {
+ // The elements to wrap the target around
+ var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+ if ( this[0].parentNode ) {
+ wrap.insertBefore( this[0] );
+ }
+
+ wrap.map(function() {
+ var elem = this;
+
+ while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+ elem = elem.firstChild;
+ }
+
+ return elem;
+ }).append( this );
+ }
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function(i) {
+ jQuery(this).wrapInner( html.call(this, i) );
+ });
+ }
+
+ return this.each(function() {
+ var self = jQuery( this ),
+ contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
+ }
+ });
+ },
+
+ wrap: function( html ) {
+ var isFunction = jQuery.isFunction( html );
+
+ return this.each(function(i) {
+ jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+ });
+ },
+
+ unwrap: function() {
+ return this.parent().each(function() {
+ if ( !jQuery.nodeName( this, "body" ) ) {
+ jQuery( this ).replaceWith( this.childNodes );
+ }
+ }).end();
+ }
+});
+var iframe, getStyles, curCSS,
+ ralpha = /alpha\([^)]*\)/i,
+ ropacity = /opacity\s*=\s*([^)]*)/,
+ rposition = /^(top|right|bottom|left)$/,
+ // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+ // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+ rmargin = /^margin/,
+ rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+ rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+ rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
+ elemdisplay = { BODY: "block" },
+
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+ cssNormalTransform = {
+ letterSpacing: 0,
+ fontWeight: 400
+ },
+
+ cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+ cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+ // shortcut for names that are not vendor prefixed
+ if ( name in style ) {
+ return name;
+ }
+
+ // check for vendor prefixed names
+ var capName = name.charAt(0).toUpperCase() + name.slice(1),
+ origName = name,
+ i = cssPrefixes.length;
+
+ while ( i-- ) {
+ name = cssPrefixes[ i ] + capName;
+ if ( name in style ) {
+ return name;
+ }
+ }
+
+ return origName;
+}
+
+function isHidden( elem, el ) {
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+ return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+}
+
+function showHide( elements, show ) {
+ var display, elem, hidden,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+
+ values[ index ] = jQuery._data( elem, "olddisplay" );
+ display = elem.style.display;
+ if ( show ) {
+ // Reset the inline display of this element to learn if it is
+ // being hidden by cascaded rules or not
+ if ( !values[ index ] && display === "none" ) {
+ elem.style.display = "";
+ }
+
+ // Set elements which have been overridden with display: none
+ // in a stylesheet to whatever the default browser style is
+ // for such an element
+ if ( elem.style.display === "" && isHidden( elem ) ) {
+ values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+ }
+ } else {
+
+ if ( !values[ index ] ) {
+ hidden = isHidden( elem );
+
+ if ( display && display !== "none" || !hidden ) {
+ jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+ }
+ }
+ }
+ }
+
+ // Set the display of most of the elements in a second loop
+ // to avoid the constant reflow
+ for ( index = 0; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+ if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+ elem.style.display = show ? values[ index ] || "" : "none";
+ }
+ }
+
+ return elements;
+}
+
+jQuery.fn.extend({
+ css: function( name, value ) {
+ return jQuery.access( this, function( elem, name, value ) {
+ var len, styles,
+ map = {},
+ i = 0;
+
+ if ( jQuery.isArray( name ) ) {
+ styles = getStyles( elem );
+ len = name.length;
+
+ for ( ; i < len; i++ ) {
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+ }
+
+ return map;
+ }
+
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ }, name, value, arguments.length > 1 );
+ },
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each(function() {
+ if ( isHidden( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function( elem, computed ) {
+ if ( computed ) {
+ // We should always get a number back from opacity
+ var ret = curCSS( elem, "opacity" );
+ return ret === "" ? "1" : ret;
+ }
+ }
+ }
+ },
+
+ // Don't automatically add "px" to these possibly-unitless properties
+ cssNumber: {
+ "columnCount": true,
+ "fillOpacity": true,
+ "fontWeight": true,
+ "lineHeight": true,
+ "opacity": true,
+ "order": true,
+ "orphans": true,
+ "widows": true,
+ "zIndex": true,
+ "zoom": true
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {
+ // normalize float css property
+ "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+ },
+
+ // Get and set the style property on a DOM Node
+ style: function( elem, name, value, extra ) {
+ // Don't set styles on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret, type, hooks,
+ origName = jQuery.camelCase( name ),
+ style = elem.style;
+
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+ // gets hook for the prefixed version
+ // followed by the unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // Check if we're setting a value
+ if ( value !== undefined ) {
+ type = typeof value;
+
+ // convert relative number strings (+= or -=) to relative numbers. #7345
+ if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+ value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+ // Fixes bug #9237
+ type = "number";
+ }
+
+ // Make sure that NaN and null values aren't set. See: #7116
+ if ( value == null || type === "number" && isNaN( value ) ) {
+ return;
+ }
+
+ // If a number was passed in, add 'px' to the (except for certain CSS properties)
+ if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+ value += "px";
+ }
+
+ // Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
+ // but it would mean to define eight (for every problematic property) identical functions
+ if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
+ style[ name ] = "inherit";
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+
+ // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+ // Fixes bug #5509
+ try {
+ style[ name ] = value;
+ } catch(e) {}
+ }
+
+ } else {
+ // If a hook was provided get the non-computed value from there
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[ name ];
+ }
+ },
+
+ css: function( elem, name, extra, styles ) {
+ var num, val, hooks,
+ origName = jQuery.camelCase( name );
+
+ // Make sure that we're working with the right name
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+ // gets hook for the prefixed version
+ // followed by the unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // If a hook was provided get the computed value from there
+ if ( hooks && "get" in hooks ) {
+ val = hooks.get( elem, true, extra );
+ }
+
+ // Otherwise, if a way to get the computed value exists, use that
+ if ( val === undefined ) {
+ val = curCSS( elem, name, styles );
+ }
+
+ //convert "normal" to computed value
+ if ( val === "normal" && name in cssNormalTransform ) {
+ val = cssNormalTransform[ name ];
+ }
+
+ // Return, converting to number if forced or a qualifier was provided and val looks numeric
+ if ( extra === "" || extra ) {
+ num = parseFloat( val );
+ return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+ }
+ return val;
+ }
+});
+
+// NOTE: we've included the "window" in window.getComputedStyle
+// because jsdom on node.js will break without it.
+if ( window.getComputedStyle ) {
+ getStyles = function( elem ) {
+ return window.getComputedStyle( elem, null );
+ };
+
+ curCSS = function( elem, name, _computed ) {
+ var width, minWidth, maxWidth,
+ computed = _computed || getStyles( elem ),
+
+ // getPropertyValue is only needed for .css('filter') in IE9, see #12537
+ ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
+ style = elem.style;
+
+ if ( computed ) {
+
+ if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+ ret = jQuery.style( elem, name );
+ }
+
+ // A tribute to the "awesome hack by Dean Edwards"
+ // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+ // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+ // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+ if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+ // Remember the original values
+ width = style.width;
+ minWidth = style.minWidth;
+ maxWidth = style.maxWidth;
+
+ // Put in the new values to get a computed value out
+ style.minWidth = style.maxWidth = style.width = ret;
+ ret = computed.width;
+
+ // Revert the changed values
+ style.width = width;
+ style.minWidth = minWidth;
+ style.maxWidth = maxWidth;
+ }
+ }
+
+ return ret;
+ };
+} else if ( document.documentElement.currentStyle ) {
+ getStyles = function( elem ) {
+ return elem.currentStyle;
+ };
+
+ curCSS = function( elem, name, _computed ) {
+ var left, rs, rsLeft,
+ computed = _computed || getStyles( elem ),
+ ret = computed ? computed[ name ] : undefined,
+ style = elem.style;
+
+ // Avoid setting ret to empty string here
+ // so we don't default to auto
+ if ( ret == null && style && style[ name ] ) {
+ ret = style[ name ];
+ }
+
+ // From the awesome hack by Dean Edwards
+ // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+ // If we're not dealing with a regular pixel number
+ // but a number that has a weird ending, we need to convert it to pixels
+ // but not position css attributes, as those are proportional to the parent element instead
+ // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+ if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+
+ // Remember the original values
+ left = style.left;
+ rs = elem.runtimeStyle;
+ rsLeft = rs && rs.left;
+
+ // Put in the new values to get a computed value out
+ if ( rsLeft ) {
+ rs.left = elem.currentStyle.left;
+ }
+ style.left = name === "fontSize" ? "1em" : ret;
+ ret = style.pixelLeft + "px";
+
+ // Revert the changed values
+ style.left = left;
+ if ( rsLeft ) {
+ rs.left = rsLeft;
+ }
+ }
+
+ return ret === "" ? "auto" : ret;
+ };
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+ var matches = rnumsplit.exec( value );
+ return matches ?
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+ value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+ var i = extra === ( isBorderBox ? "border" : "content" ) ?
+ // If we already have the right measurement, avoid augmentation
+ 4 :
+ // Otherwise initialize for horizontal or vertical properties
+ name === "width" ? 1 : 0,
+
+ val = 0;
+
+ for ( ; i < 4; i += 2 ) {
+ // both box models exclude margin, so add it if we want it
+ if ( extra === "margin" ) {
+ val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+ }
+
+ if ( isBorderBox ) {
+ // border-box includes padding, so remove it if we want content
+ if ( extra === "content" ) {
+ val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+ }
+
+ // at this point, extra isn't border nor margin, so remove border
+ if ( extra !== "margin" ) {
+ val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ } else {
+ // at this point, extra isn't content, so add padding
+ val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+ // at this point, extra isn't content nor padding, so add border
+ if ( extra !== "padding" ) {
+ val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ }
+ }
+
+ return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+ // Start with offset property, which is equivalent to the border-box value
+ var valueIsBorderBox = true,
+ val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+ styles = getStyles( elem ),
+ isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+ // some non-html elements return undefined for offsetWidth, so check for null/undefined
+ // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+ // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+ if ( val <= 0 || val == null ) {
+ // Fall back to computed then uncomputed css if necessary
+ val = curCSS( elem, name, styles );
+ if ( val < 0 || val == null ) {
+ val = elem.style[ name ];
+ }
+
+ // Computed unit is not pixels. Stop here and return.
+ if ( rnumnonpx.test(val) ) {
+ return val;
+ }
+
+ // we need the check for style in case a browser which returns unreliable values
+ // for getComputedStyle silently falls back to the reliable elem.style
+ valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
+
+ // Normalize "", auto, and prepare for extra
+ val = parseFloat( val ) || 0;
+ }
+
+ // use the active box-sizing model to add/subtract irrelevant styles
+ return ( val +
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra || ( isBorderBox ? "border" : "content" ),
+ valueIsBorderBox,
+ styles
+ )
+ ) + "px";
+}
+
+// Try to determine the default display value of an element
+function css_defaultDisplay( nodeName ) {
+ var doc = document,
+ display = elemdisplay[ nodeName ];
+
+ if ( !display ) {
+ display = actualDisplay( nodeName, doc );
+
+ // If the simple way fails, read from inside an iframe
+ if ( display === "none" || !display ) {
+ // Use the already-created iframe if possible
+ iframe = ( iframe ||
+ jQuery("")
+ .css( "cssText", "display:block !important" )
+ ).appendTo( doc.documentElement );
+
+ // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+ doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
+ doc.write("");
+ doc.close();
+
+ display = actualDisplay( nodeName, doc );
+ iframe.detach();
+ }
+
+ // Store the correct default display
+ elemdisplay[ nodeName ] = display;
+ }
+
+ return display;
+}
+
+// Called ONLY from within css_defaultDisplay
+function actualDisplay( name, doc ) {
+ var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+ display = jQuery.css( elem[0], "display" );
+ elem.remove();
+ return display;
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+ jQuery.cssHooks[ name ] = {
+ get: function( elem, computed, extra ) {
+ if ( computed ) {
+ // certain elements can have dimension info if we invisibly show them
+ // however, it must have a current display style that would benefit from this
+ return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
+ jQuery.swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, name, extra );
+ }) :
+ getWidthOrHeight( elem, name, extra );
+ }
+ },
+
+ set: function( elem, value, extra ) {
+ var styles = extra && getStyles( elem );
+ return setPositiveNumber( elem, value, extra ?
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra,
+ jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ styles
+ ) : 0
+ );
+ }
+ };
+});
+
+if ( !jQuery.support.opacity ) {
+ jQuery.cssHooks.opacity = {
+ get: function( elem, computed ) {
+ // IE uses filters for opacity
+ return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+ ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+ computed ? "1" : "";
+ },
+
+ set: function( elem, value ) {
+ var style = elem.style,
+ currentStyle = elem.currentStyle,
+ opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+ filter = currentStyle && currentStyle.filter || style.filter || "";
+
+ // IE has trouble with opacity if it does not have layout
+ // Force it by setting the zoom level
+ style.zoom = 1;
+
+ // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+ // if value === "", then remove inline opacity #12685
+ if ( ( value >= 1 || value === "" ) &&
+ jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+ style.removeAttribute ) {
+
+ // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+ // if "filter:" is present at all, clearType is disabled, we want to avoid this
+ // style.removeAttribute is IE Only, but so apparently is this code path...
+ style.removeAttribute( "filter" );
+
+ // if there is no filter style applied in a css rule or unset inline opacity, we are done
+ if ( value === "" || currentStyle && !currentStyle.filter ) {
+ return;
+ }
+ }
+
+ // otherwise, set new filter values
+ style.filter = ralpha.test( filter ) ?
+ filter.replace( ralpha, opacity ) :
+ filter + " " + opacity;
+ }
+ };
+}
+
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+ if ( !jQuery.support.reliableMarginRight ) {
+ jQuery.cssHooks.marginRight = {
+ get: function( elem, computed ) {
+ if ( computed ) {
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // Work around by temporarily setting element display to inline-block
+ return jQuery.swap( elem, { "display": "inline-block" },
+ curCSS, [ elem, "marginRight" ] );
+ }
+ }
+ };
+ }
+
+ // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+ // getComputedStyle returns percent when specified for top/left/bottom/right
+ // rather than make the css module depend on the offset module, we just check for it here
+ if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+ jQuery.each( [ "top", "left" ], function( i, prop ) {
+ jQuery.cssHooks[ prop ] = {
+ get: function( elem, computed ) {
+ if ( computed ) {
+ computed = curCSS( elem, prop );
+ // if curCSS returns percentage, fallback to offset
+ return rnumnonpx.test( computed ) ?
+ jQuery( elem ).position()[ prop ] + "px" :
+ computed;
+ }
+ }
+ };
+ });
+ }
+
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+ jQuery.expr.filters.hidden = function( elem ) {
+ // Support: Opera <= 12.12
+ // Opera reports offsetWidths and offsetHeights less than zero on some elements
+ return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
+ (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+ };
+
+ jQuery.expr.filters.visible = function( elem ) {
+ return !jQuery.expr.filters.hidden( elem );
+ };
+}
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+ margin: "",
+ padding: "",
+ border: "Width"
+}, function( prefix, suffix ) {
+ jQuery.cssHooks[ prefix + suffix ] = {
+ expand: function( value ) {
+ var i = 0,
+ expanded = {},
+
+ // assumes a single number if not a string
+ parts = typeof value === "string" ? value.split(" ") : [ value ];
+
+ for ( ; i < 4; i++ ) {
+ expanded[ prefix + cssExpand[ i ] + suffix ] =
+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+ }
+
+ return expanded;
+ }
+ };
+
+ if ( !rmargin.test( prefix ) ) {
+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+ }
+});
+var r20 = /%20/g,
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+jQuery.fn.extend({
+ serialize: function() {
+ return jQuery.param( this.serializeArray() );
+ },
+ serializeArray: function() {
+ return this.map(function(){
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop( this, "elements" );
+ return elements ? jQuery.makeArray( elements ) : this;
+ })
+ .filter(function(){
+ var type = this.type;
+ // Use .is(":disabled") so that fieldset[disabled] works
+ return this.name && !jQuery( this ).is( ":disabled" ) &&
+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+ ( this.checked || !manipulation_rcheckableType.test( type ) );
+ })
+ .map(function( i, elem ){
+ var val = jQuery( this ).val();
+
+ return val == null ?
+ null :
+ jQuery.isArray( val ) ?
+ jQuery.map( val, function( val ){
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }) :
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }).get();
+ }
+});
+
+//Serialize an array of form elements or a set of
+//key/values into a query string
+jQuery.param = function( a, traditional ) {
+ var prefix,
+ s = [],
+ add = function( key, value ) {
+ // If value is a function, invoke it and return its value
+ value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+ s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+ };
+
+ // Set traditional to true for jQuery <= 1.3.2 behavior.
+ if ( traditional === undefined ) {
+ traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ });
+
+ } else {
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( prefix in a ) {
+ buildParams( prefix, a[ prefix ], traditional, add );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join( "&" ).replace( r20, "+" );
+};
+
+function buildParams( prefix, obj, traditional, add ) {
+ var name;
+
+ if ( jQuery.isArray( obj ) ) {
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || rbracket.test( prefix ) ) {
+ // Treat each array item as a scalar.
+ add( prefix, v );
+
+ } else {
+ // Item is non-scalar (array or object), encode its numeric index.
+ buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+ }
+ });
+
+ } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+ // Serialize object item.
+ for ( name in obj ) {
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+ }
+
+ } else {
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+}
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+});
+
+jQuery.fn.extend({
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ },
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+ }
+});
+var
+ // Document location
+ ajaxLocParts,
+ ajaxLocation,
+ ajax_nonce = jQuery.now(),
+
+ ajax_rquery = /\?/,
+ rhash = /#.*$/,
+ rts = /([?&])_=[^&]*/,
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+ // #7653, #8125, #8152: local protocol detection
+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rprotocol = /^\/\//,
+ rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
+
+ // Keep a copy of the old load method
+ _load = jQuery.fn.load,
+
+ /* Prefilters
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+ * 2) These are called:
+ * - BEFORE asking for a transport
+ * - AFTER param serialization (s.data is a string if s.processData is true)
+ * 3) key is the dataType
+ * 4) the catchall symbol "*" can be used
+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+ */
+ prefilters = {},
+
+ /* Transports bindings
+ * 1) key is the dataType
+ * 2) the catchall symbol "*" can be used
+ * 3) selection will start with transport dataType and THEN go to "*" if needed
+ */
+ transports = {},
+
+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+ allTypes = "*/".concat("*");
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+ ajaxLocation = location.href;
+} catch( e ) {
+ // Use the href attribute of an A element
+ // since IE will modify it given document.location
+ ajaxLocation = document.createElement( "a" );
+ ajaxLocation.href = "";
+ ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+ // dataTypeExpression is optional and defaults to "*"
+ return function( dataTypeExpression, func ) {
+
+ if ( typeof dataTypeExpression !== "string" ) {
+ func = dataTypeExpression;
+ dataTypeExpression = "*";
+ }
+
+ var dataType,
+ i = 0,
+ dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
+
+ if ( jQuery.isFunction( func ) ) {
+ // For each dataType in the dataTypeExpression
+ while ( (dataType = dataTypes[i++]) ) {
+ // Prepend if requested
+ if ( dataType[0] === "+" ) {
+ dataType = dataType.slice( 1 ) || "*";
+ (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+ // Otherwise append
+ } else {
+ (structure[ dataType ] = structure[ dataType ] || []).push( func );
+ }
+ }
+ }
+ };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+ var inspected = {},
+ seekingTransport = ( structure === transports );
+
+ function inspect( dataType ) {
+ var selected;
+ inspected[ dataType ] = true;
+ jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+ var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+ if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+ options.dataTypes.unshift( dataTypeOrTransport );
+ inspect( dataTypeOrTransport );
+ return false;
+ } else if ( seekingTransport ) {
+ return !( selected = dataTypeOrTransport );
+ }
+ });
+ return selected;
+ }
+
+ return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+ var deep, key,
+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+ for ( key in src ) {
+ if ( src[ key ] !== undefined ) {
+ ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
+ }
+ }
+ if ( deep ) {
+ jQuery.extend( true, target, deep );
+ }
+
+ return target;
+}
+
+jQuery.fn.load = function( url, params, callback ) {
+ if ( typeof url !== "string" && _load ) {
+ return _load.apply( this, arguments );
+ }
+
+ var selector, response, type,
+ self = this,
+ off = url.indexOf(" ");
+
+ if ( off >= 0 ) {
+ selector = url.slice( off, url.length );
+ url = url.slice( 0, off );
+ }
+
+ // If it's a function
+ if ( jQuery.isFunction( params ) ) {
+
+ // We assume that it's the callback
+ callback = params;
+ params = undefined;
+
+ // Otherwise, build a param string
+ } else if ( params && typeof params === "object" ) {
+ type = "POST";
+ }
+
+ // If we have elements to modify, make the request
+ if ( self.length > 0 ) {
+ jQuery.ajax({
+ url: url,
+
+ // if "type" variable is undefined, then "GET" method will be used
+ type: type,
+ dataType: "html",
+ data: params
+ }).done(function( responseText ) {
+
+ // Save response for use in complete callback
+ response = arguments;
+
+ self.html( selector ?
+
+ // If a selector was specified, locate the right elements in a dummy div
+ // Exclude scripts to avoid IE 'Permission Denied' errors
+ jQuery("").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+ // Otherwise use the full result
+ responseText );
+
+ }).complete( callback && function( jqXHR, status ) {
+ self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+ });
+ }
+
+ return this;
+};
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
+ jQuery.fn[ type ] = function( fn ){
+ return this.on( type, fn );
+ };
+});
+
+jQuery.extend({
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {},
+
+ ajaxSettings: {
+ url: ajaxLocation,
+ type: "GET",
+ isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+ global: true,
+ processData: true,
+ async: true,
+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+ /*
+ timeout: 0,
+ data: null,
+ dataType: null,
+ username: null,
+ password: null,
+ cache: null,
+ throws: false,
+ traditional: false,
+ headers: {},
+ */
+
+ accepts: {
+ "*": allTypes,
+ text: "text/plain",
+ html: "text/html",
+ xml: "application/xml, text/xml",
+ json: "application/json, text/javascript"
+ },
+
+ contents: {
+ xml: /xml/,
+ html: /html/,
+ json: /json/
+ },
+
+ responseFields: {
+ xml: "responseXML",
+ text: "responseText",
+ json: "responseJSON"
+ },
+
+ // Data converters
+ // Keys separate source (or catchall "*") and destination types with a single space
+ converters: {
+
+ // Convert anything to text
+ "* text": String,
+
+ // Text to html (true = no transformation)
+ "text html": true,
+
+ // Evaluate text as a json expression
+ "text json": jQuery.parseJSON,
+
+ // Parse text as xml
+ "text xml": jQuery.parseXML
+ },
+
+ // For options that shouldn't be deep extended:
+ // you can add your own custom options here if
+ // and when you create one that shouldn't be
+ // deep extended (see ajaxExtend)
+ flatOptions: {
+ url: true,
+ context: true
+ }
+ },
+
+ // Creates a full fledged settings object into target
+ // with both ajaxSettings and settings fields.
+ // If target is omitted, writes into ajaxSettings.
+ ajaxSetup: function( target, settings ) {
+ return settings ?
+
+ // Building a settings object
+ ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+ // Extending ajaxSettings
+ ajaxExtend( jQuery.ajaxSettings, target );
+ },
+
+ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+ ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+ // Main method
+ ajax: function( url, options ) {
+
+ // If url is an object, simulate pre-1.5 signature
+ if ( typeof url === "object" ) {
+ options = url;
+ url = undefined;
+ }
+
+ // Force options to be an object
+ options = options || {};
+
+ var // Cross-domain detection vars
+ parts,
+ // Loop variable
+ i,
+ // URL without anti-cache param
+ cacheURL,
+ // Response headers as string
+ responseHeadersString,
+ // timeout handle
+ timeoutTimer,
+
+ // To know if global events are to be dispatched
+ fireGlobals,
+
+ transport,
+ // Response headers
+ responseHeaders,
+ // Create the final options object
+ s = jQuery.ajaxSetup( {}, options ),
+ // Callbacks context
+ callbackContext = s.context || s,
+ // Context for global events is callbackContext if it is a DOM node or jQuery collection
+ globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+ jQuery( callbackContext ) :
+ jQuery.event,
+ // Deferreds
+ deferred = jQuery.Deferred(),
+ completeDeferred = jQuery.Callbacks("once memory"),
+ // Status-dependent callbacks
+ statusCode = s.statusCode || {},
+ // Headers (they are sent all at once)
+ requestHeaders = {},
+ requestHeadersNames = {},
+ // The jqXHR state
+ state = 0,
+ // Default abort message
+ strAbort = "canceled",
+ // Fake xhr
+ jqXHR = {
+ readyState: 0,
+
+ // Builds headers hashtable if needed
+ getResponseHeader: function( key ) {
+ var match;
+ if ( state === 2 ) {
+ if ( !responseHeaders ) {
+ responseHeaders = {};
+ while ( (match = rheaders.exec( responseHeadersString )) ) {
+ responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+ }
+ }
+ match = responseHeaders[ key.toLowerCase() ];
+ }
+ return match == null ? null : match;
+ },
+
+ // Raw string
+ getAllResponseHeaders: function() {
+ return state === 2 ? responseHeadersString : null;
+ },
+
+ // Caches the header
+ setRequestHeader: function( name, value ) {
+ var lname = name.toLowerCase();
+ if ( !state ) {
+ name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+ requestHeaders[ name ] = value;
+ }
+ return this;
+ },
+
+ // Overrides response content-type header
+ overrideMimeType: function( type ) {
+ if ( !state ) {
+ s.mimeType = type;
+ }
+ return this;
+ },
+
+ // Status-dependent callbacks
+ statusCode: function( map ) {
+ var code;
+ if ( map ) {
+ if ( state < 2 ) {
+ for ( code in map ) {
+ // Lazy-add the new callback in a way that preserves old ones
+ statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+ }
+ } else {
+ // Execute the appropriate callbacks
+ jqXHR.always( map[ jqXHR.status ] );
+ }
+ }
+ return this;
+ },
+
+ // Cancel the request
+ abort: function( statusText ) {
+ var finalText = statusText || strAbort;
+ if ( transport ) {
+ transport.abort( finalText );
+ }
+ done( 0, finalText );
+ return this;
+ }
+ };
+
+ // Attach deferreds
+ deferred.promise( jqXHR ).complete = completeDeferred.add;
+ jqXHR.success = jqXHR.done;
+ jqXHR.error = jqXHR.fail;
+
+ // Remove hash character (#7531: and string promotion)
+ // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+ // Handle falsy url in the settings object (#10093: consistency with old signature)
+ // We also use the url parameter if available
+ s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+ // Alias method option to type as per ticket #12004
+ s.type = options.method || options.type || s.method || s.type;
+
+ // Extract dataTypes list
+ s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
+
+ // A cross-domain request is in order when we have a protocol:host:port mismatch
+ if ( s.crossDomain == null ) {
+ parts = rurl.exec( s.url.toLowerCase() );
+ s.crossDomain = !!( parts &&
+ ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+ ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+ ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+ );
+ }
+
+ // Convert data if not already a string
+ if ( s.data && s.processData && typeof s.data !== "string" ) {
+ s.data = jQuery.param( s.data, s.traditional );
+ }
+
+ // Apply prefilters
+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+ // If request was aborted inside a prefilter, stop there
+ if ( state === 2 ) {
+ return jqXHR;
+ }
+
+ // We can fire global events as of now if asked to
+ fireGlobals = s.global;
+
+ // Watch for a new set of requests
+ if ( fireGlobals && jQuery.active++ === 0 ) {
+ jQuery.event.trigger("ajaxStart");
+ }
+
+ // Uppercase the type
+ s.type = s.type.toUpperCase();
+
+ // Determine if request has content
+ s.hasContent = !rnoContent.test( s.type );
+
+ // Save the URL in case we're toying with the If-Modified-Since
+ // and/or If-None-Match header later on
+ cacheURL = s.url;
+
+ // More options handling for requests with no content
+ if ( !s.hasContent ) {
+
+ // If data is available, append data to url
+ if ( s.data ) {
+ cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+ // #9682: remove data so that it's not used in an eventual retry
+ delete s.data;
+ }
+
+ // Add anti-cache in url if needed
+ if ( s.cache === false ) {
+ s.url = rts.test( cacheURL ) ?
+
+ // If there is already a '_' parameter, set its value
+ cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
+
+ // Otherwise add one to the end
+ cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
+ }
+ }
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ if ( jQuery.lastModified[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+ }
+ if ( jQuery.etag[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+ }
+ }
+
+ // Set the correct header, if data is being sent
+ if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+ jqXHR.setRequestHeader( "Content-Type", s.contentType );
+ }
+
+ // Set the Accepts header for the server, depending on the dataType
+ jqXHR.setRequestHeader(
+ "Accept",
+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+ s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+ s.accepts[ "*" ]
+ );
+
+ // Check for headers option
+ for ( i in s.headers ) {
+ jqXHR.setRequestHeader( i, s.headers[ i ] );
+ }
+
+ // Allow custom headers/mimetypes and early abort
+ if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+ // Abort if not done already and return
+ return jqXHR.abort();
+ }
+
+ // aborting is no longer a cancellation
+ strAbort = "abort";
+
+ // Install callbacks on deferreds
+ for ( i in { success: 1, error: 1, complete: 1 } ) {
+ jqXHR[ i ]( s[ i ] );
+ }
+
+ // Get transport
+ transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+ // If no transport, we auto-abort
+ if ( !transport ) {
+ done( -1, "No Transport" );
+ } else {
+ jqXHR.readyState = 1;
+
+ // Send global event
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+ }
+ // Timeout
+ if ( s.async && s.timeout > 0 ) {
+ timeoutTimer = setTimeout(function() {
+ jqXHR.abort("timeout");
+ }, s.timeout );
+ }
+
+ try {
+ state = 1;
+ transport.send( requestHeaders, done );
+ } catch ( e ) {
+ // Propagate exception as error if not done
+ if ( state < 2 ) {
+ done( -1, e );
+ // Simply rethrow otherwise
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ // Callback for when everything is done
+ function done( status, nativeStatusText, responses, headers ) {
+ var isSuccess, success, error, response, modified,
+ statusText = nativeStatusText;
+
+ // Called once
+ if ( state === 2 ) {
+ return;
+ }
+
+ // State is "done" now
+ state = 2;
+
+ // Clear timeout if it exists
+ if ( timeoutTimer ) {
+ clearTimeout( timeoutTimer );
+ }
+
+ // Dereference transport for early garbage collection
+ // (no matter how long the jqXHR object will be used)
+ transport = undefined;
+
+ // Cache response headers
+ responseHeadersString = headers || "";
+
+ // Set readyState
+ jqXHR.readyState = status > 0 ? 4 : 0;
+
+ // Determine if successful
+ isSuccess = status >= 200 && status < 300 || status === 304;
+
+ // Get response data
+ if ( responses ) {
+ response = ajaxHandleResponses( s, jqXHR, responses );
+ }
+
+ // Convert no matter what (that way responseXXX fields are always set)
+ response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+ // If successful, handle type chaining
+ if ( isSuccess ) {
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ modified = jqXHR.getResponseHeader("Last-Modified");
+ if ( modified ) {
+ jQuery.lastModified[ cacheURL ] = modified;
+ }
+ modified = jqXHR.getResponseHeader("etag");
+ if ( modified ) {
+ jQuery.etag[ cacheURL ] = modified;
+ }
+ }
+
+ // if no content
+ if ( status === 204 || s.type === "HEAD" ) {
+ statusText = "nocontent";
+
+ // if not modified
+ } else if ( status === 304 ) {
+ statusText = "notmodified";
+
+ // If we have data, let's convert it
+ } else {
+ statusText = response.state;
+ success = response.data;
+ error = response.error;
+ isSuccess = !error;
+ }
+ } else {
+ // We extract error from statusText
+ // then normalize statusText and status for non-aborts
+ error = statusText;
+ if ( status || !statusText ) {
+ statusText = "error";
+ if ( status < 0 ) {
+ status = 0;
+ }
+ }
+ }
+
+ // Set data for the fake xhr object
+ jqXHR.status = status;
+ jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+ // Success/Error
+ if ( isSuccess ) {
+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+ } else {
+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+ }
+
+ // Status-dependent callbacks
+ jqXHR.statusCode( statusCode );
+ statusCode = undefined;
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+ [ jqXHR, s, isSuccess ? success : error ] );
+ }
+
+ // Complete
+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+ // Handle the global AJAX counter
+ if ( !( --jQuery.active ) ) {
+ jQuery.event.trigger("ajaxStop");
+ }
+ }
+ }
+
+ return jqXHR;
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get( url, data, callback, "json" );
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get( url, undefined, callback, "script" );
+ }
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+ jQuery[ method ] = function( url, data, callback, type ) {
+ // shift arguments if data argument was omitted
+ if ( jQuery.isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = undefined;
+ }
+
+ return jQuery.ajax({
+ url: url,
+ type: method,
+ dataType: type,
+ data: data,
+ success: callback
+ });
+ };
+});
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+ var firstDataType, ct, finalDataType, type,
+ contents = s.contents,
+ dataTypes = s.dataTypes;
+
+ // Remove auto dataType and get content-type in the process
+ while( dataTypes[ 0 ] === "*" ) {
+ dataTypes.shift();
+ if ( ct === undefined ) {
+ ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+ }
+ }
+
+ // Check if we're dealing with a known content-type
+ if ( ct ) {
+ for ( type in contents ) {
+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
+ dataTypes.unshift( type );
+ break;
+ }
+ }
+ }
+
+ // Check to see if we have a response for the expected dataType
+ if ( dataTypes[ 0 ] in responses ) {
+ finalDataType = dataTypes[ 0 ];
+ } else {
+ // Try convertible dataTypes
+ for ( type in responses ) {
+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+ finalDataType = type;
+ break;
+ }
+ if ( !firstDataType ) {
+ firstDataType = type;
+ }
+ }
+ // Or just use first one
+ finalDataType = finalDataType || firstDataType;
+ }
+
+ // If we found a dataType
+ // We add the dataType to the list if needed
+ // and return the corresponding response
+ if ( finalDataType ) {
+ if ( finalDataType !== dataTypes[ 0 ] ) {
+ dataTypes.unshift( finalDataType );
+ }
+ return responses[ finalDataType ];
+ }
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+ var conv2, current, conv, tmp, prev,
+ converters = {},
+ // Work with a copy of dataTypes in case we need to modify it for conversion
+ dataTypes = s.dataTypes.slice();
+
+ // Create converters map with lowercased keys
+ if ( dataTypes[ 1 ] ) {
+ for ( conv in s.converters ) {
+ converters[ conv.toLowerCase() ] = s.converters[ conv ];
+ }
+ }
+
+ current = dataTypes.shift();
+
+ // Convert to each sequential dataType
+ while ( current ) {
+
+ if ( s.responseFields[ current ] ) {
+ jqXHR[ s.responseFields[ current ] ] = response;
+ }
+
+ // Apply the dataFilter if provided
+ if ( !prev && isSuccess && s.dataFilter ) {
+ response = s.dataFilter( response, s.dataType );
+ }
+
+ prev = current;
+ current = dataTypes.shift();
+
+ if ( current ) {
+
+ // There's only work to do if current dataType is non-auto
+ if ( current === "*" ) {
+
+ current = prev;
+
+ // Convert response if prev dataType is non-auto and differs from current
+ } else if ( prev !== "*" && prev !== current ) {
+
+ // Seek a direct converter
+ conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+ // If none found, seek a pair
+ if ( !conv ) {
+ for ( conv2 in converters ) {
+
+ // If conv2 outputs current
+ tmp = conv2.split( " " );
+ if ( tmp[ 1 ] === current ) {
+
+ // If prev can be converted to accepted input
+ conv = converters[ prev + " " + tmp[ 0 ] ] ||
+ converters[ "* " + tmp[ 0 ] ];
+ if ( conv ) {
+ // Condense equivalence converters
+ if ( conv === true ) {
+ conv = converters[ conv2 ];
+
+ // Otherwise, insert the intermediate dataType
+ } else if ( converters[ conv2 ] !== true ) {
+ current = tmp[ 0 ];
+ dataTypes.unshift( tmp[ 1 ] );
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ // Apply converter (if not an equivalence)
+ if ( conv !== true ) {
+
+ // Unless errors are allowed to bubble, catch and return them
+ if ( conv && s[ "throws" ] ) {
+ response = conv( response );
+ } else {
+ try {
+ response = conv( response );
+ } catch ( e ) {
+ return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return { state: "success", data: response };
+}
+// Install script dataType
+jQuery.ajaxSetup({
+ accepts: {
+ script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+ },
+ contents: {
+ script: /(?:java|ecma)script/
+ },
+ converters: {
+ "text script": function( text ) {
+ jQuery.globalEval( text );
+ return text;
+ }
+ }
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+ if ( s.cache === undefined ) {
+ s.cache = false;
+ }
+ if ( s.crossDomain ) {
+ s.type = "GET";
+ s.global = false;
+ }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+ // This transport only deals with cross domain requests
+ if ( s.crossDomain ) {
+
+ var script,
+ head = document.head || jQuery("head")[0] || document.documentElement;
+
+ return {
+
+ send: function( _, callback ) {
+
+ script = document.createElement("script");
+
+ script.async = true;
+
+ if ( s.scriptCharset ) {
+ script.charset = s.scriptCharset;
+ }
+
+ script.src = s.url;
+
+ // Attach handlers for all browsers
+ script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+ if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+ // Handle memory leak in IE
+ script.onload = script.onreadystatechange = null;
+
+ // Remove the script
+ if ( script.parentNode ) {
+ script.parentNode.removeChild( script );
+ }
+
+ // Dereference the script
+ script = null;
+
+ // Callback if not abort
+ if ( !isAbort ) {
+ callback( 200, "success" );
+ }
+ }
+ };
+
+ // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
+ // Use native DOM manipulation to avoid our domManip AJAX trickery
+ head.insertBefore( script, head.firstChild );
+ },
+
+ abort: function() {
+ if ( script ) {
+ script.onload( undefined, true );
+ }
+ }
+ };
+ }
+});
+var oldCallbacks = [],
+ rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+ jsonp: "callback",
+ jsonpCallback: function() {
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
+ this[ callback ] = true;
+ return callback;
+ }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+ var callbackName, overwritten, responseContainer,
+ jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+ "url" :
+ typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+ );
+
+ // Handle iff the expected data type is "jsonp" or we have a parameter to set
+ if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+ // Get callback name, remembering preexisting value associated with it
+ callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+ s.jsonpCallback() :
+ s.jsonpCallback;
+
+ // Insert callback into url or form data
+ if ( jsonProp ) {
+ s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+ } else if ( s.jsonp !== false ) {
+ s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+ }
+
+ // Use data converter to retrieve json after script execution
+ s.converters["script json"] = function() {
+ if ( !responseContainer ) {
+ jQuery.error( callbackName + " was not called" );
+ }
+ return responseContainer[ 0 ];
+ };
+
+ // force json dataType
+ s.dataTypes[ 0 ] = "json";
+
+ // Install callback
+ overwritten = window[ callbackName ];
+ window[ callbackName ] = function() {
+ responseContainer = arguments;
+ };
+
+ // Clean-up function (fires after converters)
+ jqXHR.always(function() {
+ // Restore preexisting value
+ window[ callbackName ] = overwritten;
+
+ // Save back as free
+ if ( s[ callbackName ] ) {
+ // make sure that re-using the options doesn't screw things around
+ s.jsonpCallback = originalSettings.jsonpCallback;
+
+ // save the callback name for future use
+ oldCallbacks.push( callbackName );
+ }
+
+ // Call if it was a function and we have a response
+ if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+ overwritten( responseContainer[ 0 ] );
+ }
+
+ responseContainer = overwritten = undefined;
+ });
+
+ // Delegate to script
+ return "script";
+ }
+});
+var xhrCallbacks, xhrSupported,
+ xhrId = 0,
+ // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+ xhrOnUnloadAbort = window.ActiveXObject && function() {
+ // Abort all pending requests
+ var key;
+ for ( key in xhrCallbacks ) {
+ xhrCallbacks[ key ]( undefined, true );
+ }
+ };
+
+// Functions to create xhrs
+function createStandardXHR() {
+ try {
+ return new window.XMLHttpRequest();
+ } catch( e ) {}
+}
+
+function createActiveXHR() {
+ try {
+ return new window.ActiveXObject("Microsoft.XMLHTTP");
+ } catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+ /* Microsoft failed to properly
+ * implement the XMLHttpRequest in IE7 (can't request local files),
+ * so we use the ActiveXObject when it is available
+ * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+ * we need a fallback.
+ */
+ function() {
+ return !this.isLocal && createStandardXHR() || createActiveXHR();
+ } :
+ // For all other browsers, use the standard XMLHttpRequest object
+ createStandardXHR;
+
+// Determine support properties
+xhrSupported = jQuery.ajaxSettings.xhr();
+jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+xhrSupported = jQuery.support.ajax = !!xhrSupported;
+
+// Create transport if the browser can provide an xhr
+if ( xhrSupported ) {
+
+ jQuery.ajaxTransport(function( s ) {
+ // Cross domain only allowed if supported through XMLHttpRequest
+ if ( !s.crossDomain || jQuery.support.cors ) {
+
+ var callback;
+
+ return {
+ send: function( headers, complete ) {
+
+ // Get a new xhr
+ var handle, i,
+ xhr = s.xhr();
+
+ // Open the socket
+ // Passing null username, generates a login popup on Opera (#2865)
+ if ( s.username ) {
+ xhr.open( s.type, s.url, s.async, s.username, s.password );
+ } else {
+ xhr.open( s.type, s.url, s.async );
+ }
+
+ // Apply custom fields if provided
+ if ( s.xhrFields ) {
+ for ( i in s.xhrFields ) {
+ xhr[ i ] = s.xhrFields[ i ];
+ }
+ }
+
+ // Override mime type if needed
+ if ( s.mimeType && xhr.overrideMimeType ) {
+ xhr.overrideMimeType( s.mimeType );
+ }
+
+ // X-Requested-With header
+ // For cross-domain requests, seeing as conditions for a preflight are
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
+ // (it can always be set on a per-request basis or even using ajaxSetup)
+ // For same-domain requests, won't change header if already provided.
+ if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+ headers["X-Requested-With"] = "XMLHttpRequest";
+ }
+
+ // Need an extra try/catch for cross domain requests in Firefox 3
+ try {
+ for ( i in headers ) {
+ xhr.setRequestHeader( i, headers[ i ] );
+ }
+ } catch( err ) {}
+
+ // Do send the request
+ // This may raise an exception which is actually
+ // handled in jQuery.ajax (so no try/catch here)
+ xhr.send( ( s.hasContent && s.data ) || null );
+
+ // Listener
+ callback = function( _, isAbort ) {
+ var status, responseHeaders, statusText, responses;
+
+ // Firefox throws exceptions when accessing properties
+ // of an xhr when a network error occurred
+ // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+ try {
+
+ // Was never called and is aborted or complete
+ if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+ // Only called once
+ callback = undefined;
+
+ // Do not keep as active anymore
+ if ( handle ) {
+ xhr.onreadystatechange = jQuery.noop;
+ if ( xhrOnUnloadAbort ) {
+ delete xhrCallbacks[ handle ];
+ }
+ }
+
+ // If it's an abort
+ if ( isAbort ) {
+ // Abort it manually if needed
+ if ( xhr.readyState !== 4 ) {
+ xhr.abort();
+ }
+ } else {
+ responses = {};
+ status = xhr.status;
+ responseHeaders = xhr.getAllResponseHeaders();
+
+ // When requesting binary data, IE6-9 will throw an exception
+ // on any attempt to access responseText (#11426)
+ if ( typeof xhr.responseText === "string" ) {
+ responses.text = xhr.responseText;
+ }
+
+ // Firefox throws an exception when accessing
+ // statusText for faulty cross-domain requests
+ try {
+ statusText = xhr.statusText;
+ } catch( e ) {
+ // We normalize with Webkit giving an empty statusText
+ statusText = "";
+ }
+
+ // Filter status for non standard behaviors
+
+ // If the request is local and we have data: assume a success
+ // (success with no data won't get notified, that's the best we
+ // can do given current implementations)
+ if ( !status && s.isLocal && !s.crossDomain ) {
+ status = responses.text ? 200 : 404;
+ // IE - #1450: sometimes returns 1223 when it should be 204
+ } else if ( status === 1223 ) {
+ status = 204;
+ }
+ }
+ }
+ } catch( firefoxAccessException ) {
+ if ( !isAbort ) {
+ complete( -1, firefoxAccessException );
+ }
+ }
+
+ // Call complete if needed
+ if ( responses ) {
+ complete( status, statusText, responses, responseHeaders );
+ }
+ };
+
+ if ( !s.async ) {
+ // if we're in sync mode we fire the callback
+ callback();
+ } else if ( xhr.readyState === 4 ) {
+ // (IE6 & IE7) if it's in cache and has been
+ // retrieved directly we need to fire the callback
+ setTimeout( callback );
+ } else {
+ handle = ++xhrId;
+ if ( xhrOnUnloadAbort ) {
+ // Create the active xhrs callbacks list if needed
+ // and attach the unload handler
+ if ( !xhrCallbacks ) {
+ xhrCallbacks = {};
+ jQuery( window ).unload( xhrOnUnloadAbort );
+ }
+ // Add to list of active xhrs callbacks
+ xhrCallbacks[ handle ] = callback;
+ }
+ xhr.onreadystatechange = callback;
+ }
+ },
+
+ abort: function() {
+ if ( callback ) {
+ callback( undefined, true );
+ }
+ }
+ };
+ }
+ });
+}
+var fxNow, timerId,
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+ rrun = /queueHooks$/,
+ animationPrefilters = [ defaultPrefilter ],
+ tweeners = {
+ "*": [function( prop, value ) {
+ var tween = this.createTween( prop, value ),
+ target = tween.cur(),
+ parts = rfxnum.exec( value ),
+ unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+ rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+ scale = 1,
+ maxIterations = 20;
+
+ if ( start && start[ 3 ] !== unit ) {
+ // Trust units reported by jQuery.css
+ unit = unit || start[ 3 ];
+
+ // Make sure we update the tween properties later on
+ parts = parts || [];
+
+ // Iteratively approximate from a nonzero starting point
+ start = +target || 1;
+
+ do {
+ // If previous iteration zeroed out, double until we get *something*
+ // Use a string for doubling factor so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ start = start / scale;
+ jQuery.style( tween.elem, prop, start + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur()
+ // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+ } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+ }
+
+ // Update tween properties
+ if ( parts ) {
+ start = tween.start = +start || +target || 0;
+ tween.unit = unit;
+ // If a +=/-= token was provided, we're doing a relative animation
+ tween.end = parts[ 1 ] ?
+ start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+ +parts[ 2 ];
+ }
+
+ return tween;
+ }]
+ };
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+ setTimeout(function() {
+ fxNow = undefined;
+ });
+ return ( fxNow = jQuery.now() );
+}
+
+function createTween( value, prop, animation ) {
+ var tween,
+ collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+ index = 0,
+ length = collection.length;
+ for ( ; index < length; index++ ) {
+ if ( (tween = collection[ index ].call( animation, prop, value )) ) {
+
+ // we're done with this property
+ return tween;
+ }
+ }
+}
+
+function Animation( elem, properties, options ) {
+ var result,
+ stopped,
+ index = 0,
+ length = animationPrefilters.length,
+ deferred = jQuery.Deferred().always( function() {
+ // don't match elem in the :animated selector
+ delete tick.elem;
+ }),
+ tick = function() {
+ if ( stopped ) {
+ return false;
+ }
+ var currentTime = fxNow || createFxNow(),
+ remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+ // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+ temp = remaining / animation.duration || 0,
+ percent = 1 - temp,
+ index = 0,
+ length = animation.tweens.length;
+
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( percent );
+ }
+
+ deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+ if ( percent < 1 && length ) {
+ return remaining;
+ } else {
+ deferred.resolveWith( elem, [ animation ] );
+ return false;
+ }
+ },
+ animation = deferred.promise({
+ elem: elem,
+ props: jQuery.extend( {}, properties ),
+ opts: jQuery.extend( true, { specialEasing: {} }, options ),
+ originalProperties: properties,
+ originalOptions: options,
+ startTime: fxNow || createFxNow(),
+ duration: options.duration,
+ tweens: [],
+ createTween: function( prop, end ) {
+ var tween = jQuery.Tween( elem, animation.opts, prop, end,
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.tweens.push( tween );
+ return tween;
+ },
+ stop: function( gotoEnd ) {
+ var index = 0,
+ // if we are going to the end, we want to run all the tweens
+ // otherwise we skip this part
+ length = gotoEnd ? animation.tweens.length : 0;
+ if ( stopped ) {
+ return this;
+ }
+ stopped = true;
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( 1 );
+ }
+
+ // resolve when we played the last frame
+ // otherwise, reject
+ if ( gotoEnd ) {
+ deferred.resolveWith( elem, [ animation, gotoEnd ] );
+ } else {
+ deferred.rejectWith( elem, [ animation, gotoEnd ] );
+ }
+ return this;
+ }
+ }),
+ props = animation.props;
+
+ propFilter( props, animation.opts.specialEasing );
+
+ for ( ; index < length ; index++ ) {
+ result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+ if ( result ) {
+ return result;
+ }
+ }
+
+ jQuery.map( props, createTween, animation );
+
+ if ( jQuery.isFunction( animation.opts.start ) ) {
+ animation.opts.start.call( elem, animation );
+ }
+
+ jQuery.fx.timer(
+ jQuery.extend( tick, {
+ elem: elem,
+ anim: animation,
+ queue: animation.opts.queue
+ })
+ );
+
+ // attach callbacks from options
+ return animation.progress( animation.opts.progress )
+ .done( animation.opts.done, animation.opts.complete )
+ .fail( animation.opts.fail )
+ .always( animation.opts.always );
+}
+
+function propFilter( props, specialEasing ) {
+ var index, name, easing, value, hooks;
+
+ // camelCase, specialEasing and expand cssHook pass
+ for ( index in props ) {
+ name = jQuery.camelCase( index );
+ easing = specialEasing[ name ];
+ value = props[ index ];
+ if ( jQuery.isArray( value ) ) {
+ easing = value[ 1 ];
+ value = props[ index ] = value[ 0 ];
+ }
+
+ if ( index !== name ) {
+ props[ name ] = value;
+ delete props[ index ];
+ }
+
+ hooks = jQuery.cssHooks[ name ];
+ if ( hooks && "expand" in hooks ) {
+ value = hooks.expand( value );
+ delete props[ name ];
+
+ // not quite $.extend, this wont overwrite keys already present.
+ // also - reusing 'index' from above because we have the correct "name"
+ for ( index in value ) {
+ if ( !( index in props ) ) {
+ props[ index ] = value[ index ];
+ specialEasing[ index ] = easing;
+ }
+ }
+ } else {
+ specialEasing[ name ] = easing;
+ }
+ }
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+ tweener: function( props, callback ) {
+ if ( jQuery.isFunction( props ) ) {
+ callback = props;
+ props = [ "*" ];
+ } else {
+ props = props.split(" ");
+ }
+
+ var prop,
+ index = 0,
+ length = props.length;
+
+ for ( ; index < length ; index++ ) {
+ prop = props[ index ];
+ tweeners[ prop ] = tweeners[ prop ] || [];
+ tweeners[ prop ].unshift( callback );
+ }
+ },
+
+ prefilter: function( callback, prepend ) {
+ if ( prepend ) {
+ animationPrefilters.unshift( callback );
+ } else {
+ animationPrefilters.push( callback );
+ }
+ }
+});
+
+function defaultPrefilter( elem, props, opts ) {
+ /* jshint validthis: true */
+ var prop, value, toggle, tween, hooks, oldfire,
+ anim = this,
+ orig = {},
+ style = elem.style,
+ hidden = elem.nodeType && isHidden( elem ),
+ dataShow = jQuery._data( elem, "fxshow" );
+
+ // handle queue: false promises
+ if ( !opts.queue ) {
+ hooks = jQuery._queueHooks( elem, "fx" );
+ if ( hooks.unqueued == null ) {
+ hooks.unqueued = 0;
+ oldfire = hooks.empty.fire;
+ hooks.empty.fire = function() {
+ if ( !hooks.unqueued ) {
+ oldfire();
+ }
+ };
+ }
+ hooks.unqueued++;
+
+ anim.always(function() {
+ // doing this makes sure that the complete handler will be called
+ // before this completes
+ anim.always(function() {
+ hooks.unqueued--;
+ if ( !jQuery.queue( elem, "fx" ).length ) {
+ hooks.empty.fire();
+ }
+ });
+ });
+ }
+
+ // height/width overflow pass
+ if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+ // Make sure that nothing sneaks out
+ // Record all 3 overflow attributes because IE does not
+ // change the overflow attribute when overflowX and
+ // overflowY are set to the same value
+ opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+ // Set display property to inline-block for height/width
+ // animations on inline elements that are having width/height animated
+ if ( jQuery.css( elem, "display" ) === "inline" &&
+ jQuery.css( elem, "float" ) === "none" ) {
+
+ // inline-level elements accept inline-block;
+ // block-level elements need to be inline with layout
+ if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
+ style.display = "inline-block";
+
+ } else {
+ style.zoom = 1;
+ }
+ }
+ }
+
+ if ( opts.overflow ) {
+ style.overflow = "hidden";
+ if ( !jQuery.support.shrinkWrapBlocks ) {
+ anim.always(function() {
+ style.overflow = opts.overflow[ 0 ];
+ style.overflowX = opts.overflow[ 1 ];
+ style.overflowY = opts.overflow[ 2 ];
+ });
+ }
+ }
+
+
+ // show/hide pass
+ for ( prop in props ) {
+ value = props[ prop ];
+ if ( rfxtypes.exec( value ) ) {
+ delete props[ prop ];
+ toggle = toggle || value === "toggle";
+ if ( value === ( hidden ? "hide" : "show" ) ) {
+ continue;
+ }
+ orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+ }
+ }
+
+ if ( !jQuery.isEmptyObject( orig ) ) {
+ if ( dataShow ) {
+ if ( "hidden" in dataShow ) {
+ hidden = dataShow.hidden;
+ }
+ } else {
+ dataShow = jQuery._data( elem, "fxshow", {} );
+ }
+
+ // store state if its toggle - enables .stop().toggle() to "reverse"
+ if ( toggle ) {
+ dataShow.hidden = !hidden;
+ }
+ if ( hidden ) {
+ jQuery( elem ).show();
+ } else {
+ anim.done(function() {
+ jQuery( elem ).hide();
+ });
+ }
+ anim.done(function() {
+ var prop;
+ jQuery._removeData( elem, "fxshow" );
+ for ( prop in orig ) {
+ jQuery.style( elem, prop, orig[ prop ] );
+ }
+ });
+ for ( prop in orig ) {
+ tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+ if ( !( prop in dataShow ) ) {
+ dataShow[ prop ] = tween.start;
+ if ( hidden ) {
+ tween.end = tween.start;
+ tween.start = prop === "width" || prop === "height" ? 1 : 0;
+ }
+ }
+ }
+ }
+}
+
+function Tween( elem, options, prop, end, easing ) {
+ return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+ constructor: Tween,
+ init: function( elem, options, prop, end, easing, unit ) {
+ this.elem = elem;
+ this.prop = prop;
+ this.easing = easing || "swing";
+ this.options = options;
+ this.start = this.now = this.cur();
+ this.end = end;
+ this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+ },
+ cur: function() {
+ var hooks = Tween.propHooks[ this.prop ];
+
+ return hooks && hooks.get ?
+ hooks.get( this ) :
+ Tween.propHooks._default.get( this );
+ },
+ run: function( percent ) {
+ var eased,
+ hooks = Tween.propHooks[ this.prop ];
+
+ if ( this.options.duration ) {
+ this.pos = eased = jQuery.easing[ this.easing ](
+ percent, this.options.duration * percent, 0, 1, this.options.duration
+ );
+ } else {
+ this.pos = eased = percent;
+ }
+ this.now = ( this.end - this.start ) * eased + this.start;
+
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
+
+ if ( hooks && hooks.set ) {
+ hooks.set( this );
+ } else {
+ Tween.propHooks._default.set( this );
+ }
+ return this;
+ }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+ _default: {
+ get: function( tween ) {
+ var result;
+
+ if ( tween.elem[ tween.prop ] != null &&
+ (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+ return tween.elem[ tween.prop ];
+ }
+
+ // passing an empty string as a 3rd parameter to .css will automatically
+ // attempt a parseFloat and fallback to a string if the parse fails
+ // so, simple values such as "10px" are parsed to Float.
+ // complex values such as "rotate(1rad)" are returned as is.
+ result = jQuery.css( tween.elem, tween.prop, "" );
+ // Empty strings, null, undefined and "auto" are converted to 0.
+ return !result || result === "auto" ? 0 : result;
+ },
+ set: function( tween ) {
+ // use step hook for back compat - use cssHook if its there - use .style if its
+ // available and use plain properties where available
+ if ( jQuery.fx.step[ tween.prop ] ) {
+ jQuery.fx.step[ tween.prop ]( tween );
+ } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+ } else {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+ }
+};
+
+// Support: IE <=9
+// Panic based approach to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+ set: function( tween ) {
+ if ( tween.elem.nodeType && tween.elem.parentNode ) {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+};
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+ var cssFn = jQuery.fn[ name ];
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return speed == null || typeof speed === "boolean" ?
+ cssFn.apply( this, arguments ) :
+ this.animate( genFx( name, true ), speed, easing, callback );
+ };
+});
+
+jQuery.fn.extend({
+ fadeTo: function( speed, to, easing, callback ) {
+
+ // show any hidden elements after setting opacity to 0
+ return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+ // animate to the value specified
+ .end().animate({ opacity: to }, speed, easing, callback );
+ },
+ animate: function( prop, speed, easing, callback ) {
+ var empty = jQuery.isEmptyObject( prop ),
+ optall = jQuery.speed( speed, easing, callback ),
+ doAnimation = function() {
+ // Operate on a copy of prop so per-property easing won't be lost
+ var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+ // Empty animations, or finishing resolves immediately
+ if ( empty || jQuery._data( this, "finish" ) ) {
+ anim.stop( true );
+ }
+ };
+ doAnimation.finish = doAnimation;
+
+ return empty || optall.queue === false ?
+ this.each( doAnimation ) :
+ this.queue( optall.queue, doAnimation );
+ },
+ stop: function( type, clearQueue, gotoEnd ) {
+ var stopQueue = function( hooks ) {
+ var stop = hooks.stop;
+ delete hooks.stop;
+ stop( gotoEnd );
+ };
+
+ if ( typeof type !== "string" ) {
+ gotoEnd = clearQueue;
+ clearQueue = type;
+ type = undefined;
+ }
+ if ( clearQueue && type !== false ) {
+ this.queue( type || "fx", [] );
+ }
+
+ return this.each(function() {
+ var dequeue = true,
+ index = type != null && type + "queueHooks",
+ timers = jQuery.timers,
+ data = jQuery._data( this );
+
+ if ( index ) {
+ if ( data[ index ] && data[ index ].stop ) {
+ stopQueue( data[ index ] );
+ }
+ } else {
+ for ( index in data ) {
+ if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+ stopQueue( data[ index ] );
+ }
+ }
+ }
+
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+ timers[ index ].anim.stop( gotoEnd );
+ dequeue = false;
+ timers.splice( index, 1 );
+ }
+ }
+
+ // start the next in the queue if the last step wasn't forced
+ // timers currently will call their complete callbacks, which will dequeue
+ // but only if they were gotoEnd
+ if ( dequeue || !gotoEnd ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ finish: function( type ) {
+ if ( type !== false ) {
+ type = type || "fx";
+ }
+ return this.each(function() {
+ var index,
+ data = jQuery._data( this ),
+ queue = data[ type + "queue" ],
+ hooks = data[ type + "queueHooks" ],
+ timers = jQuery.timers,
+ length = queue ? queue.length : 0;
+
+ // enable finishing flag on private data
+ data.finish = true;
+
+ // empty the queue first
+ jQuery.queue( this, type, [] );
+
+ if ( hooks && hooks.stop ) {
+ hooks.stop.call( this, true );
+ }
+
+ // look for any active animations, and finish them
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+ timers[ index ].anim.stop( true );
+ timers.splice( index, 1 );
+ }
+ }
+
+ // look for any animations in the old queue and finish them
+ for ( index = 0; index < length; index++ ) {
+ if ( queue[ index ] && queue[ index ].finish ) {
+ queue[ index ].finish.call( this );
+ }
+ }
+
+ // turn off finishing flag
+ delete data.finish;
+ });
+ }
+});
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+ var which,
+ attrs = { height: type },
+ i = 0;
+
+ // if we include width, step value is 1 to do all cssExpand values,
+ // if we don't include width, step value is 2 to skip over Left and Right
+ includeWidth = includeWidth? 1 : 0;
+ for( ; i < 4 ; i += 2 - includeWidth ) {
+ which = cssExpand[ i ];
+ attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+ }
+
+ if ( includeWidth ) {
+ attrs.opacity = attrs.width = type;
+ }
+
+ return attrs;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+ slideDown: genFx("show"),
+ slideUp: genFx("hide"),
+ slideToggle: genFx("toggle"),
+ fadeIn: { opacity: "show" },
+ fadeOut: { opacity: "hide" },
+ fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return this.animate( props, speed, easing, callback );
+ };
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+ };
+
+ opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+ // normalize opt.queue - true/undefined/null -> "fx"
+ if ( opt.queue == null || opt.queue === true ) {
+ opt.queue = "fx";
+ }
+
+ // Queueing
+ opt.old = opt.complete;
+
+ opt.complete = function() {
+ if ( jQuery.isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+
+ if ( opt.queue ) {
+ jQuery.dequeue( this, opt.queue );
+ }
+ };
+
+ return opt;
+};
+
+jQuery.easing = {
+ linear: function( p ) {
+ return p;
+ },
+ swing: function( p ) {
+ return 0.5 - Math.cos( p*Math.PI ) / 2;
+ }
+};
+
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+jQuery.fx.tick = function() {
+ var timer,
+ timers = jQuery.timers,
+ i = 0;
+
+ fxNow = jQuery.now();
+
+ for ( ; i < timers.length; i++ ) {
+ timer = timers[ i ];
+ // Checks the timer has not already been removed
+ if ( !timer() && timers[ i ] === timer ) {
+ timers.splice( i--, 1 );
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+ if ( timer() && jQuery.timers.push( timer ) ) {
+ jQuery.fx.start();
+ }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+ if ( !timerId ) {
+ timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+ }
+};
+
+jQuery.fx.stop = function() {
+ clearInterval( timerId );
+ timerId = null;
+};
+
+jQuery.fx.speeds = {
+ slow: 600,
+ fast: 200,
+ // Default speed
+ _default: 400
+};
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+ jQuery.expr.filters.animated = function( elem ) {
+ return jQuery.grep(jQuery.timers, function( fn ) {
+ return elem === fn.elem;
+ }).length;
+ };
+}
+jQuery.fn.offset = function( options ) {
+ if ( arguments.length ) {
+ return options === undefined ?
+ this :
+ this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ var docElem, win,
+ box = { top: 0, left: 0 },
+ elem = this[ 0 ],
+ doc = elem && elem.ownerDocument;
+
+ if ( !doc ) {
+ return;
+ }
+
+ docElem = doc.documentElement;
+
+ // Make sure it's not a disconnected DOM node
+ if ( !jQuery.contains( docElem, elem ) ) {
+ return box;
+ }
+
+ // If we don't have gBCR, just use 0,0 rather than error
+ // BlackBerry 5, iOS 3 (original iPhone)
+ if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
+ box = elem.getBoundingClientRect();
+ }
+ win = getWindow( doc );
+ return {
+ top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ),
+ left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
+ };
+};
+
+jQuery.offset = {
+
+ setOffset: function( elem, options, i ) {
+ var position = jQuery.css( elem, "position" );
+
+ // set position first, in-case top/left are set even on static elem
+ if ( position === "static" ) {
+ elem.style.position = "relative";
+ }
+
+ var curElem = jQuery( elem ),
+ curOffset = curElem.offset(),
+ curCSSTop = jQuery.css( elem, "top" ),
+ curCSSLeft = jQuery.css( elem, "left" ),
+ calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+ props = {}, curPosition = {}, curTop, curLeft;
+
+ // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+ if ( calculatePosition ) {
+ curPosition = curElem.position();
+ curTop = curPosition.top;
+ curLeft = curPosition.left;
+ } else {
+ curTop = parseFloat( curCSSTop ) || 0;
+ curLeft = parseFloat( curCSSLeft ) || 0;
+ }
+
+ if ( jQuery.isFunction( options ) ) {
+ options = options.call( elem, i, curOffset );
+ }
+
+ if ( options.top != null ) {
+ props.top = ( options.top - curOffset.top ) + curTop;
+ }
+ if ( options.left != null ) {
+ props.left = ( options.left - curOffset.left ) + curLeft;
+ }
+
+ if ( "using" in options ) {
+ options.using.call( elem, props );
+ } else {
+ curElem.css( props );
+ }
+ }
+};
+
+
+jQuery.fn.extend({
+
+ position: function() {
+ if ( !this[ 0 ] ) {
+ return;
+ }
+
+ var offsetParent, offset,
+ parentOffset = { top: 0, left: 0 },
+ elem = this[ 0 ];
+
+ // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
+ if ( jQuery.css( elem, "position" ) === "fixed" ) {
+ // we assume that getBoundingClientRect is available when computed position is fixed
+ offset = elem.getBoundingClientRect();
+ } else {
+ // Get *real* offsetParent
+ offsetParent = this.offsetParent();
+
+ // Get correct offsets
+ offset = this.offset();
+ if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+ parentOffset = offsetParent.offset();
+ }
+
+ // Add offsetParent borders
+ parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+ parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+ }
+
+ // Subtract parent offsets and element margins
+ // note: when an element has margin: auto the offsetLeft and marginLeft
+ // are the same in Safari causing offset.left to incorrectly be 0
+ return {
+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
+ };
+ },
+
+ offsetParent: function() {
+ return this.map(function() {
+ var offsetParent = this.offsetParent || docElem;
+ while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
+ offsetParent = offsetParent.offsetParent;
+ }
+ return offsetParent || docElem;
+ });
+ }
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+ var top = /Y/.test( prop );
+
+ jQuery.fn[ method ] = function( val ) {
+ return jQuery.access( this, function( elem, method, val ) {
+ var win = getWindow( elem );
+
+ if ( val === undefined ) {
+ return win ? (prop in win) ? win[ prop ] :
+ win.document.documentElement[ method ] :
+ elem[ method ];
+ }
+
+ if ( win ) {
+ win.scrollTo(
+ !top ? val : jQuery( win ).scrollLeft(),
+ top ? val : jQuery( win ).scrollTop()
+ );
+
+ } else {
+ elem[ method ] = val;
+ }
+ }, method, val, arguments.length, null );
+ };
+});
+
+function getWindow( elem ) {
+ return jQuery.isWindow( elem ) ?
+ elem :
+ elem.nodeType === 9 ?
+ elem.defaultView || elem.parentWindow :
+ false;
+}
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+ jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+ // margin is only for outerHeight, outerWidth
+ jQuery.fn[ funcName ] = function( margin, value ) {
+ var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+ extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+ return jQuery.access( this, function( elem, type, value ) {
+ var doc;
+
+ if ( jQuery.isWindow( elem ) ) {
+ // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+ // isn't a whole lot we can do. See pull request at this URL for discussion:
+ // https://github.com/jquery/jquery/pull/764
+ return elem.document.documentElement[ "client" + name ];
+ }
+
+ // Get document width or height
+ if ( elem.nodeType === 9 ) {
+ doc = elem.documentElement;
+
+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
+ // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+ return Math.max(
+ elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+ elem.body[ "offset" + name ], doc[ "offset" + name ],
+ doc[ "client" + name ]
+ );
+ }
+
+ return value === undefined ?
+ // Get width or height on the element, requesting but not forcing parseFloat
+ jQuery.css( elem, type, extra ) :
+
+ // Set width or height on the element
+ jQuery.style( elem, type, value, extra );
+ }, type, chainable ? margin : undefined, chainable, null );
+ };
+ });
+});
+// Limit scope pollution from any deprecated API
+// (function() {
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+ return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+// })();
+if ( typeof module === "object" && module && typeof module.exports === "object" ) {
+ // Expose jQuery as module.exports in loaders that implement the Node
+ // module pattern (including browserify). Do not create the global, since
+ // the user will be storing it themselves locally, and globals are frowned
+ // upon in the Node module world.
+ module.exports = jQuery;
+} else {
+ // Otherwise expose jQuery to the global object as usual
+ window.jQuery = window.$ = jQuery;
+
+ // Register as a named AMD module, since jQuery can be concatenated with other
+ // files that may use define, but not via a proper concatenation script that
+ // understands anonymous AMD modules. A named AMD is safest and most robust
+ // way to register. Lowercase jquery is used because AMD module names are
+ // derived from file names, and jQuery is normally delivered in a lowercase
+ // file name. Do this after creating the global so that if an AMD module wants
+ // to call noConflict to hide this version of jQuery, it will work.
+ if ( typeof define === "function" && define.amd ) {
+ define( "jquery", [], function () { return jQuery; } );
+ }
+}
+
+})( window );
diff --git a/goon/browserassets/js/json2.min.js b/goon/browserassets/js/json2.min.js
new file mode 100644
index 00000000000..d867407f265
--- /dev/null
+++ b/goon/browserassets/js/json2.min.js
@@ -0,0 +1 @@
+"object"!=typeof JSON&&(JSON={}),function(){"use strict";function f(t){return 10>t?"0"+t:t}function this_value(){return this.valueOf()}function quote(t){return rx_escapable.lastIndex=0,rx_escapable.test(t)?'"'+t.replace(rx_escapable,function(t){var e=meta[t];return"string"==typeof e?e:"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+t+'"'}function str(t,e){var r,n,o,u,f,a=gap,i=e[t];switch(i&&"object"==typeof i&&"function"==typeof i.toJSON&&(i=i.toJSON(t)),"function"==typeof rep&&(i=rep.call(e,t,i)),typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";if(gap+=indent,f=[],"[object Array]"===Object.prototype.toString.apply(i)){for(u=i.length,r=0;u>r;r+=1)f[r]=str(r,i)||"null";return o=0===f.length?"[]":gap?"[\n"+gap+f.join(",\n"+gap)+"\n"+a+"]":"["+f.join(",")+"]",gap=a,o}if(rep&&"object"==typeof rep)for(u=rep.length,r=0;u>r;r+=1)"string"==typeof rep[r]&&(n=rep[r],o=str(n,i),o&&f.push(quote(n)+(gap?": ":":")+o));else for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(o=str(n,i),o&&f.push(quote(n)+(gap?": ":":")+o));return o=0===f.length?"{}":gap?"{\n"+gap+f.join(",\n"+gap)+"\n"+a+"}":"{"+f.join(",")+"}",gap=a,o}}var rx_one=/^[\],:{}\s]*$/,rx_two=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,rx_three=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,rx_four=/(?:^|:|,)(?:\s*\[)+/g,rx_escapable=/[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,rx_dangerous=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},Boolean.prototype.toJSON=this_value,Number.prototype.toJSON=this_value,String.prototype.toJSON=this_value);var gap,indent,meta,rep;"function"!=typeof JSON.stringify&&(meta={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},JSON.stringify=function(t,e,r){var n;if(gap="",indent="","number"==typeof r)for(n=0;r>n;n+=1)indent+=" ";else"string"==typeof r&&(indent=r);if(rep=e,e&&"function"!=typeof e&&("object"!=typeof e||"number"!=typeof e.length))throw new Error("JSON.stringify");return str("",{"":t})}),"function"!=typeof JSON.parse&&(JSON.parse=function(text,reviver){function walk(t,e){var r,n,o=t[e];if(o&&"object"==typeof o)for(r in o)Object.prototype.hasOwnProperty.call(o,r)&&(n=walk(o,r),void 0!==n?o[r]=n:delete o[r]);return reviver.call(t,e,o)}var j;if(text=String(text),rx_dangerous.lastIndex=0,rx_dangerous.test(text)&&(text=text.replace(rx_dangerous,function(t){return"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})),rx_one.test(text.replace(rx_two,"@").replace(rx_three,"]").replace(rx_four,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}();
\ No newline at end of file
diff --git a/goon/code/datums/browserOutput.dm b/goon/code/datums/browserOutput.dm
new file mode 100644
index 00000000000..b0aad73286d
--- /dev/null
+++ b/goon/code/datums/browserOutput.dm
@@ -0,0 +1,241 @@
+var/list/chatResources = list(
+ "goon/browserassets/js/jquery.min.js",
+ "goon/browserassets/js/json2.min.js",
+ "goon/browserassets/js/browserOutput.js",
+ "goon/browserassets/css/fonts/fontawesome-webfont.eot",
+ "goon/browserassets/css/fonts/fontawesome-webfont.svg",
+ "goon/browserassets/css/fonts/fontawesome-webfont.ttf",
+ "goon/browserassets/css/fonts/fontawesome-webfont.woff",
+ "goon/browserassets/css/font-awesome.css",
+ "goon/browserassets/css/browserOutput.css"
+)
+
+/var/savefile/iconCache = new /savefile("data/iconCache.sav")
+/var/chatDebug = file("data/chatDebug.log")
+
+/datum/chatOutput
+ var/client/owner = null
+ var/loaded = 0
+ var/list/messageQueue = list()
+ var/cookieSent = 0
+ var/list/connectionHistory = list()
+ var/broken = FALSE
+
+/datum/chatOutput/New(client/C)
+ . = ..()
+
+ owner = C
+
+/datum/chatOutput/proc/start()
+ if(!owner)
+ return 0
+
+ if(!winexists(owner, "browseroutput"))
+ spawn()
+ alert(owner.mob, "Updated chat window does not exist. If you are using a custom skin file please allow the game to update.")
+ broken = TRUE
+ return 0
+
+ if(winget(owner, "browseroutput", "is-disabled") == "false")
+ doneLoading()
+
+ else
+ load()
+
+ return 1
+
+/datum/chatOutput/proc/load()
+ set waitfor = FALSE
+ if(!owner)
+ return
+
+ for(var/attempts = 1 to 5)
+ for(var/asset in global.chatResources)
+ owner << browse_rsc(file(asset))
+
+ owner << browse(file("goon/browserassets/html/browserOutput.html"), "window=browseroutput")
+ sleep(20 SECONDS)
+ if(!owner || loaded)
+ break
+
+/datum/chatOutput/Topic(var/href, var/list/href_list)
+ if(usr.client != owner)
+ return 1
+
+ var/list/params = list()
+ for(var/key in href_list)
+ if(length(key) > 7 && findtext(key, "param"))
+ var/param_name = copytext(key, 7, -1)
+ var/item = href_list[key]
+ params[param_name] = item
+
+ var/data
+ switch(href_list["proc"])
+ if("doneLoading")
+ data = doneLoading(arglist(params))
+
+ if("debug")
+ data = debug(arglist(params))
+
+ if("ping")
+ data = ping(arglist(params))
+
+ if("analyzeClientData")
+ data = analyzeClientData(arglist(params))
+
+ if(data)
+ ehjax_send(data = data)
+
+/datum/chatOutput/proc/doneLoading()
+ if(loaded)
+ return
+
+ loaded = TRUE
+ winset(owner, "browseroutput", "is-disabled=false")
+ for(var/message in messageQueue)
+ to_chat(owner, message)
+
+ messageQueue = null
+ src.sendClientData()
+
+ pingLoop()
+
+/datum/chatOutput/proc/pingLoop()
+ set waitfor = FALSE
+
+ while (owner)
+ ehjax_send(data = owner.is_afk(29 SECONDS) ? "softPang" : "pang") // SoftPang isn't handled anywhere but it'll always reset the opts.lastPang.
+ sleep(30 SECONDS)
+
+/datum/chatOutput/proc/ehjax_send(var/client/C = owner, var/window = "browseroutput", var/data)
+ if(islist(data))
+ data = json_encode(data)
+ C << output("[data]", "[window]:ehjaxCallback")
+
+
+/datum/chatOutput/proc/sendClientData()
+ var/list/deets = list("clientData" = list())
+ deets["clientData"]["ckey"] = owner.ckey
+ deets["clientData"]["ip"] = owner.address
+ deets["clientData"]["compid"] = owner.computer_id
+ var/data = json_encode(deets)
+ ehjax_send(data = data)
+
+/datum/chatOutput/proc/analyzeClientData(cookie = "")
+ if(!cookie)
+ return
+
+ if(cookie != "none")
+ var/list/connData = json_decode(cookie)
+ if(connData && islist(connData) && connData.len > 0 && connData["connData"])
+ connectionHistory = connData["connData"]
+ var/list/found = new()
+ for(var/i = connectionHistory.len; i >= 1; i--)
+ var/list/row = connectionHistory[i]
+ if(!row || row.len < 3 || !(row["ckey"] && row["compid"] && row["ip"]))
+ return
+ if(world.IsBanned(row["ckey"], row["compid"], row["ip"]))
+ found = row
+ break
+
+ //Uh oh this fucker has a history of playing on a banned account!!
+ 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("[key_name(src.owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])")
+
+ cookieSent = 1
+
+/datum/chatOutput/proc/ping()
+ return "pong"
+
+/datum/chatOutput/proc/debug(error)
+ error = "\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client : [owner.key ? owner.key : owner] triggered JS error: [error]"
+ chatDebug << error
+
+/client/verb/debug_chat()
+ set hidden = 1
+ chatOutput.ehjax_send(data = list("firebug" = 1))
+
+
+/var/list/bicon_cache = list()
+
+//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(var/icon/icon, var/iconKey = "misc")
+ if (!isicon(icon)) return 0
+
+ iconCache[iconKey] << icon
+ var/iconData = iconCache.ExportText(iconKey)
+ var/list/partial = splittext(iconData, "{")
+ return replacetext(copytext(partial[2], 3, -5), "\n", "")
+
+/proc/bicon(var/obj)
+ if (!obj)
+ return
+
+ if (isicon(obj))
+ if (!bicon_cache["\ref[obj]"]) // Doesn't exist yet, make it.
+ bicon_cache["\ref[obj]"] = icon2base64(obj)
+
+ return "
"
+
+ // Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with.
+ var/atom/A = obj
+ 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(obj)) // Shitty workaround for a BYOND issue.
+ var/icon/temp = I
+ I = icon()
+ I.Insert(temp, dir = SOUTH)
+ bicon_cache[key] = icon2base64(I, key)
+
+ return "
"
+
+//Aliases for bicon
+/proc/bi(obj)
+ bicon(obj)
+
+var/to_chat_filename
+var/to_chat_line
+var/to_chat_src
+// Call using macro: to_chat(target, message)
+/proc/__to_chat(target, message)
+ if(istype(message, /image) || istype(message, /sound) || istype(target, /savefile) || !(ismob(target) || islist(target) || isclient(target) || target == world))
+ target << message
+ if(!istext(message))
+ message = "(non-text type)"
+ world.Error(new/exception("DEBUG: to_chat called with invalid message: [message]", to_chat_filename, to_chat_line), e_src = to_chat_src)
+ return
+
+ else if(istext(message))
+ if(istext(target))
+ return
+
+ message = replacetext(message, "\n", "
")
+
+ message = macro2html(message)
+ if(findtext(message, "\improper"))
+ message = replacetext(message, "\improper", "")
+ if(findtext(message, "\proper"))
+ message = replacetext(message, "\proper", "")
+
+ var/client/C
+ if(istype(target, /client))
+ C = target
+ if(ismob(target))
+ C = target:client
+
+ if(C && C.chatOutput)
+ if(C.chatOutput.broken)
+ C << message
+ return
+
+ if(!C.chatOutput.loaded && C.chatOutput.messageQueue && islist(C.chatOutput.messageQueue))
+ C.chatOutput.messageQueue.Add(message)
+ return
+
+
+ target << output(url_encode(message), "browseroutput:output")
\ No newline at end of file
diff --git a/html/browser/delay_interactivity.js b/html/browser/delay_interactivity.js
new file mode 100644
index 00000000000..f621906337b
--- /dev/null
+++ b/html/browser/delay_interactivity.js
@@ -0,0 +1,26 @@
+// Disables all links for one second after the browser window opens.
+
+(function(){
+ // If there's already an onload, let's not clobber it
+ var oldonload = window.onload;
+ window.onload = function(){
+ if(typeof oldonload == 'function'){
+ oldonload();
+ }
+ var onclicks = Array();
+ var links = document.getElementsByTagName("a");
+ var returnfalse = function(){return false;};
+ for(var i = 0; i < links.length; i++){
+ onclicks.push(links[i].onclick);
+ links[i].onclick = returnfalse;
+ }
+ setTimeout(function(){
+ for(var i = 0; i < links.length; i++){
+ // Reset onclick, but only if something else hasn't already changed it
+ if(links[i].onclick == returnfalse){
+ links[i].onclick = onclicks[i];
+ }
+ }
+ }, 1000);
+ };
+})();
diff --git a/html/changelog.html b/html/changelog.html
index b29fcaa7de1..27fe9b5f57f 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,624 @@
-->
+
21 July 2016
+
Alffd updated:
+
+ Added a 6th Vulpkanin tail option.
+ Fixes animations, side view, and pixel fill for Vulpkanin tail 6
+
+
FalseIncarnate updated:
+
+ Engineers can properly show up for work with their hats and coats to keep warm.
+
+
Fox McCloud updated:
+
+ Tajarans and Unathi can now wear all shoe and glove types
+ Glove clipping removed except for black gloves, which makes them fingerless gloves
+ Adds sandals as a loadout option
+ Adds in simple animal mob spawners
+ Adds shielded hardsuit to the nuke ops uplink for 30 TC
+ Implements the powerfist and adds it to the uplink for 8 TC
+ Removed drinking glass shattering (regular bottle shattering is still a thing)
+ Captain's flask is now gold instead of silver
+ Bottles have a throwforce of 15
+ can crack eggs into drinking glasses
+ Detective's flask starts out with 30 units of whiskey
+ removes redundant object verbs that have an action button
+ Fixes up mindswap spell so it behaves more properly
+ Fixes genetic abilities action buttons not properly clearing
+ Fixes simple animals, silicons, and brains becoming perma deaf from flashbangs and other sources
+ ACTUALLY FIXES MINING APC
+ Fixes brig cell timers not having the option to flash people
+
+
FreeStylaLT updated:
+
+ Added new syndicate item Chameleon SecHUD to uplink store, available for all antags. It can morph into various eyewear while being a flashproof sechud.
+
+
Kyep updated:
+
+ Added new syndicate costumes to "select equipment" admin verb.
+
+
TullyBBurnalot updated:
+
+ More beds outside the Operating Theaters, Pajama Wardrobes outside and inside the Operating Theaters, an extra NanoMed Vendor, one Disposal Chute per OR, table with cards
+ Sinks moved closer to Surgical Tables, moved light fixtures in the Operating Theaters, tables with surgical tools now made of glass for maximum style points and Xenomorph Larva Whack-A-Mole
+
+
monster860 updated:
+
+ Brig timer UI reopening after being closed fixed.
+
+
+
20 July 2016
+
Allfd updated:
+
+ Added hologram fluff sprites
+
+
Ar3nn updated:
+
+ Gets rid of some weird lattices floating in mid-space
+
+
Chakirski updated:
+
+ Adds M.E. Reaper sprite.
+ AI can now choose a 32x64 reaper hologram.
+ Cigarette packs no longer show near-duplicate messages when examined.
+
+
CrAzYPiLoT updated:
+
+ Ports randomized space ruins from /tg/ station. There is a number of maps which can be spawned at any location on the empty z-level at roundstart, and up to three random ones will be chosen each round. Credits to KorPhaeron.
+ Lays the groundwork for a future lavaland implementation, if we choose to have it.
+ Adds a feature to the map loader where areas with the right var set can be distinctly initialized on map load - meaning separate APCs, and the like.
+ Using a z-level specific initialization freeze system, large elaborate maps like the cyberiad can be loaded without a single runtime, with minimal impact on the round elsewhere.
+ Adds a delete mode to the "Fill" buildmode - just alt-click for the second corner, and everything within will be removed.
+ Adds a "Jump To" function in VV, which is useful for getting an idea of what exactly you're looking at.
+ Added view count to newscaster feeds and messages.
+
+
Crazylemon64 updated:
+
+ Abductors consoles link correctly again
+
+
DaveTheHeadcrab updated:
+
+ Plastic explosives are now a subtype of grenades. Shouldn't be any noticable difference for players.
+ Plastic explosives no longer use the wire datum. You may directly attach an assembly holder (Such as a remote signaller + igniter assembly)
+ Adds X-4 shaped charges, designed for breaching explosively without harming the user. Pick some up at your local nukies r us.
+ Replaces tablecrafting with personal crafting, click the hammer icon by your intent selector to use it.
+ Removes the PDA slot, your PDA can now go in your ID slot (Again).
+ You can now alt click to remove an ID from a PDA, for quick interaction while it's in your ID slot.
+ Adds an overlay for an ID while it's inserted into your PDA.
+
+
FalseIncarnate updated:
+
+ Adds new Bottler machine for making unique beverages! Order one from cargo today!
+ Adds 6 new drinks obtainable via the Bottler. Get brewing!
+ Grapes now can be properly juiced again, as they now have the right kitchen tag.
+ Adds effects to the Paradise Pop reagents. Drink them all to unlock their powers!
+
+
Fox McCloud updated:
+
+ Adds in fans which can block atmospherics passing over them
+ All mass driver blast doors have a fan underneath them, allowing you to use them repeatedly instead of once
+ Fixes medical, security, and employment records not being displayed
+ Adds in a weather system
+ Removes most of the miner's uniform equipment from their lockers and puts it in a miner's wardrobe
+ Miners start off with a lot of their clothing equipment equipped to them
+ Miners now have unique headset sprites
+ Miners no longer have lanterns, but a seclite; they can attach this to their kinetic accelerators now
+ Miners have workboots instead of black shoes
+ Miners no longer have a default mining scanner but an advanced one that works at reduced range (5 instead of 7) and has a longer cooldown between pulses (5 instead of 3.5)
+ removed extra mining hardsuit from the outpost
+ removed medikit spam from outpost; now just a toxin kit and a regular medical kit
+ Bluespace crystals now earn you points and can be refined into bluespace polycrystal sheets
+ Spare vouchers from QM and HoP removed
+ removed armor from the fake tactical turtleneck
+ Can scan vending machines with your PDA to pay for items (if there's an ID in your PDA)
+ Sleepers no longer require a console to build, only the sleeper itself
+ Clicking on the sleeper brings up the menu that was previously brought up for the console
+ Adds in syndicate sleepers--these sleepers are not only syndie themed but also allow the user to inject chems into themselves while inside the sleepers
+ Sleepers can now inject silver sulfadiazine
+ removes cryofeeds from cryodorms and adds in 2 more cryopods
+ Fixes pre-spawned loaded belts not having proper overlays
+ nanites will no longer purge chems, but will now heal internal organ damage, attempt to mend fractures, and will no longer cure beneficial viruses
+ cold and hot drinks should now properly heat you up or cool you down (this also goes for medical reagents)
+ beer no longer reduces jitteriness
+ toxins special and antifreeze heat you up
+ banana juice and banana honk now heals monkeys
+ Fixes atrazine not killing nymphs
+ mining autoinjectors no longer poison you
+ combat hypospray now has omni+epinephrine+teporone
+ stimpack is now meth+coffee instead of meth+epinephrine
+ Cheese and synth meat amount creation scales with volume of the reaction
+ sprinkles now heals all members of sec (brig phys, sec pod pilot, magistrate, and IAA are no longer left out)
+ Fixes syndi+shielded+hos hardsuit sprite issues
+ Fixes wizard's who have a regular satchel set in their prefs winding up with none
+ Spellbooks are automatically bound to wizards at round start (no more ragin' exploitative mages)
+ Fixes mining outpost lacking an APC
+ Fixes being able to exploit and turn artificial bluespace crystals into regular bluespace crystals
+
+
FreeStylaLT updated:
+
+ Added courtroom, left of brig.
+ Remapped brig
+ Moved prisoner processing and evidence storage to the right of brig, next to Detective's office.
+ Changed current processing to Interrogation and a hallway.
+ Re-mapped Conference and Locker rooms.
+ Lots of other minor tweaks to brig.
+ Seriously, way too many small changes to list here, go and have a look at the brig yourself.
+ Removed temp. detainment and observation from brig.
+
+
KasparoVy updated:
+
+ Wearing a suit will no longer cause runtimes due to the way suit-collars are handled.
+ The north direction sprite of the Vulpkanin 'Patch' facial hair style won't hang a pixel off the head anymore.
+
+
Krausus updated:
+
+ All admins can now see "admin log" messages.
+ Admins can now toggle "admin log" messages on or off.
+ Admins will no longer be notified about ghosted admins jumping around.
+ Beating on simple animals will no longer be twice as noisy as intended.
+ Emergency Response Teams are now usable again.
+
+
Kyep updated:
+
+ adds botany, basketball court, individual cells, library computer and more to perma. Makes it far less boring.
+ Tracking implants are now useful, showing the implanted person's general location, and health status, on prisoner consoles.
+ The NODROP flag now works correctly on jumpsuits.
+ Improved admin 'select equipment' verb. ERT option now works, costumes get IDs and proper headsets, two new costumes added, and some outfits minorly tweaked (e.g: tunnel clowns get toolbelts).
+ Prevented NPCs being made into objective targets.
+
+
LittleBigKid2000 and TullyBBurnalot updated:
+
+ Stethoscopes can now be used to tell if a person's heart or lungs are damaged, or if they have any at all. Now they're actually useful instead of telling you the obvious in a vague way.
+ Stethoscopes can no longer be used to hear the heartbeat and breathing of a person that doesn't have a heart or lungs.
+
+
Tauka Usanake updated:
+
+ Adds a Hydroponics HUD and a night vision version of it that can both be created in R&D. It provides additional details on plants in hydro trays and soil plots. Shows the health, nutrient, water, toxin, pest, and weed level of the plant as well as whenever it is ready to be harvested or is dead.
+
+
TullyBBurnalot updated:
+
+ Handless cuffing no longer possible. Can still cuff people with one hand
+
+
TullyBurnalot updated:
+
+ Mobs with PSY_RESISTANCE are no longer valid targets for REMOTE_VIEW
+ When emagged, Photocopiers now have a cooldown if used to copy butts
+
+
Twinmold updated:
+
+ Fixes removing ID cards from laptops with the Eject ID verb.
+
+
monster860 updated:
+
+ A bunch of interfaces now use /datum/browser.
+ The ChemMaster now uses the asset cache, eliminating the enormous lag spike when you first use it. Yey!
+ Fixes the window not closing when selecting an icon for the chem-master
+ Fixes the chem master window not updating when selecting an icon
+ The chem-master icon selection window now has a 4x5 grid of icons.
+
+
tigercat2000 updated:
+
+ Gas tanks now have an action button for accessing their interface.
+ You can now shift-click on movable HUD elements (such as action buttons) to reset them to their initial position.
+ Implants with limited uses, such as freedom implants, now delete themselves when they run out of uses.
+
+
+
13 July 2016
+
Ar3nn updated:
+
+ Adds a silence button to newscasters, which will silence the regular update sounds
+
+
Chakirski updated:
+
+ Adds new bacon sprites.
+ Bacon can now be cooked from the grill. Just grill raw bacon.
+ Raw cutlets are now sliceable into raw bacon strips.
+ Plasma and N20 look more gassy.
+
+
DaveTheHeadcrab updated:
+
+ Greys no longer speak in wingdings.
+ Greys now have a species-specific language.
+
+
Fox McCloud updated:
+
+ Overall borg power useage has been lowered
+ Borgs who have completely run out of power can now still move around/see/talk, but they will be unable to interact with machinery/doors around them; they can still bump open doors, however. Borgs with no cell are still completely paralyzed and can't do anything.
+ IPCs are now properly impacted by space's burn damage
+ NT Rep's cane stuns for less and invokes a cooldown between use, similar to telebatons
+ Oxygen damage number changed a bit; damage is based upon volume lost more now
+ Species that have blood but are oxygen immune will now take tox damage
+ Health analyzers will now work with species with exotic blood and inform the user what type of exotic blood they have
+ Other machinery that display blood levels (op table, sleepers, advanced scanners, etc) will now work with exotic blood
+ Changeling regen will now properly restore blood if you have exotic blood fix Fixes being blurry for 20+ minutes when you were low on blood for a mere 3 minutes
+ Heart damage impacting blood volume removed
+ Nutrition draining when low on blood removed
+ Station cinematics shouldn't have inventory overlays over top of the animation
+ Station cinematics should properly clear off the screen and delete now
+ pAIs are no longer valid targets for gun turrets (like on the syndicate ship)
+ Adds in Rathen's secret, a new spell for the wizard that AoE stuns
+ Removed borg jetpacks
+ Adds in borg ion pulse system; borgs with ion pulse enabled consume extra power for each turf they move but can travel on space. Can upgrade any borg, at R&D with an ion pulse upgrade
+ Adds in cyborg self repair upgrade: very slowly repairs cyborgs at the cost of extra power. Available at R&D
+ Mining cyborg module tweaked slightly: GPS, shovel, mini welding tool and mini extinguisher added, wrench and screwdriver removed
+ reset borg module removes speed boost
+ Fixes borg's stun arm bypassing shields
+
+
KasparoVy updated:
+
+ Adds Vox compatible versions of all jumpskirts.
+ Adds Vox compatible version of the CMO jumpsuit.
+
+
Krausus updated:
+
+ Players will ALMOST DEFINITELY never get stuck as plants anymore. I mean it this time!
+ Fixed morgue trays not updating themselves when you ghost into/out of your body.
+
+
Kyep updated:
+
+ Changed access requirement on lethal injection locker to sec access (same access required for the chair its right next to.
+ Changed access requirement on exile implant locker to armory access.
+ Ghosts no longer miss out on ERTs due to not knowing it was called, or not being able to find the verb. They are now prompted about joining an ERT when one is called.
+ Fixed a condition where 'we are assembling an ERT' message is broadcast, but no ERT is generated.
+ Typo fixes in ERT messages.
+ Entering a cryo pod, then deliberately selecting OOC->Ghost, and clicking yes on the prompt, will now instantly send you to long-term storage, removing you from the round, despawning your body, freeing your job slot, and giving a new objective to any antag that had you as a target.
+ Announcements about someone entering long-term storage via a cryopod now include that person's rank.
+ When an antag target cryos, the message the antag gets about their objectives changing is now clearer.
+
+
TheDZD updated:
+
+ Adds "salts" as a say verb for deadchat ghosts.
+
+
TullyBurnalot updated:
+
+ Universal Recorder added to NT Rep Locker
+ Box of recorder tapes added to NT Rep and IAA Locker
+ Fax Guide added to Captain, HoS, HoP, NT Rep and IAA Lockers
+ Butt copy alert added to photocopiers
+ Butt copy alert comes with *ping noise
+ Photocopiers start with 60 toner
+
+
Twinmold updated:
+
+ Vampires with sleeping carp (traitor+vampire rounds) can now suck people's blood like normal.
+
+
monster860 updated:
+
+ The ChemMaster now uses NanoUI! Yey!
+ Alerts are no broken ghostly outlines
+
+
+
09 July 2016
+
Chakirski updated:
+
+ Adds disabled_component() to cyborgs.
+ EMPs now disable binary communication for as long as the stun time.
+ Syndicate thermal imaging glasses (mesons) can now be prescription upgraded like normal mesons.
+ Green glasses from the AutoDrobe can now be prescription upgraded.
+
+
FalseIncarnate updated:
+
+ Deepfryers are no longer arcane mysteries, and can be (de)constructed and upgraded.
+
+
Fox McCloud updated:
+
+ Grenade have a chance to explode when the person holding them is shot
+ Flamethrowers can release their tank's contents if the person holding them is shot
+ Can no longer self-trigger blocked shield events (ie: no self-harm to trigger a reactive teleport armor)
+ Hugging someone/shaking them up bypasses shield checks (oh no, hugs of death)
+ Riot shields have a +30% chance to block thrown projectiles
+ Hunter pounces are now a thrown attack as far as shield go, and yes, can be blocked by riot shields now
+ Energy shields no longer block anything other than beam and energy projectiles
+ Being able to be pushed is based on the block chance of the item you're holding instead of it just being based on riot shields
+ Adds in cursed wizard heart, purchase it from the wizard's spell book for 1 point, but be wary of not keeping the heart beating...
+
+
FreeStylaLT updated:
+
+ Added a bunch of new items to maint, some rare uplink gear included. (see PR for full list)
+ made gas masks, nothing and extinguishers less common in maint
+
+
Krausus updated:
+
+ Players probably won't get stuck as plants forever anymore. Probably.
+ Refactored job ban checking, which should massively reduce round start-up time.
+ Job bans/unbans will now take effect instantly, rather than at the next server restart.
+
+
TheDZD updated:
+
+ DNA injectors no longer always activate powers that are supposed to have a chance to activate.
+ Dionae can no longer activate the radiation disability, nor the run superpower except via adminbus.
+ Adds genetic instability, which causes a variety of negative effects, including toxin damage, burn damage, cloneloss, and even gibbing. Effects get worse as stability gets lower, burn damage starts below 85 stability, tox and clone below 70, and gibbing once you're below 40.
+ Adds Curse of the Cluwne touch attack spell, which wizards can pick, heavily based off of the same spell from Goonstation. Said spell adds an unremovable honk tumor to the target, gives them NODROP neon green clown gear, makes them stutter, makes them almost eternally fat, confuses them, makes them clumsy and speak in Comic Sans, and severely brain damages them. Use it on a cluwne however...
+ Fixes a bug where honk tumors would cause NODROP items to still be moved, despite being unable to be unequipped.
+
+
TullyBurnalot updated:
+
+ Botanist access to the morgue revoked
+ Added custom messages for evil faxes
+ Added unique text body for each non-evil fax template
+ Added a "Keep up the good work" fax template
+ Added a "ERT Instructions" fax template
+ Photocopiers can be emagged
+ Emagged photocopiers deal 30 burn damage to all mobs copying their butts
+ Deconstructing Comfy Chairs yields 2 metal sheets
+ Boxes no longer allowed inside evidence bags to prevent them going into themselves
+ Monocles are now prescription upgradable
+ Monocles added to Loadout selection
+ Spinning a revolver's chamber makes a noise again
+ Revenants can actually be killed now.
+ AntagHUD activation disqualifies player from rebooted drones
+ Sergeant Ian hat now visible
+
+
Twinmold updated:
+
+ Fixes the inconsistency of getting 2 metal rods when you wirecutter a destroyed grille down to 1.
+
+
+
07 July 2016
+
Ar3nn updated:
+
+ Adds tech levels to RnD console main menu
+
+
FalseIncarnate updated:
+
+ Chicks no longer lose their souls (literally) when becoming adults.
+ Intercoms, fire alarms, and air alarms no longer contain internal portals to a realm of infinite cables and circuit boards.
+
+
Fox McCloud updated:
+
+ Space lube damage removed and duration reduced from 7 to 5
+ Azide and CLF3+Firefighting foam now play a bang sound when mixed
+ Can now pet pAI's with help intent
+ Fixes sechuds and nightvision sechuds having flash protection
+
+
FreeStylaLT updated:
+
+ Added windows and a missing firelock to Genetics/Cloning
+ Tweaked layout of Genetics slightly
+ Added photocopier to R&D.
+ Tweaked RD's office layout slightly
+ Changed access on Tcomms' external airlocks' buttons to be same as general Tcomms access
+ fixed the airless tiles in Assembly Line's windows
+
+
KasparoVy updated:
+
+ Adds improved Vox mask/goggle sprites.
+ Adds Vox-compatible versions of most suits.
+ Adds species-fitting and icon override handling to clothing accessories and suit collars.
+ You can now open/close Clown Officer and Soldier coats.
+ Adds by-species tail hiding.
+ Tidies up and refactors the way the Captain's space helmet shows Vox hair but hides every other species'.
+ Reactive armour's sprite will now update as soon as you turn it on/off or EMP it.
+
+
Krausus updated:
+
+ Fixed borers dying in hosts who happened to be somewhere cold, such as space. Even if their host was in a space suit.
+ Fixed borers forgetting to detach from a host when it died.
+ Fixed borers being able to assume control of a dead host.
+ Fixed dead borers in a host being able to speak with the host and ghosts.
+ Fixed employees starting every shift at least 3 minutes late. You aren't getting paid to stand around, people!
+ Fixed animal beatdowns being twice as noisy as they should be.
+ Pod lock busters should now properly bust pod locks.
+ The late-stage effects of the "sensory destruction" disease symptom should now properly destroy your senses.
+ Autotraitor should now continue picking new in-game traitors, instead of picking one and dying.
+ Lacking a head no longer makes you immune to becoming a husk or skeleton.
+ Security and medical records should probably stop crashing people.
+ Altering details on an Agent ID Card will now actually update what's seen when examining the card.
+
+
Kyep updated:
+
+ Fixes NT Special Ops Officer's headset so he can correctly hear, and talk on, the Special Ops (deathsquad) channel.
+ Fixed oversight in keycard authentication devices that incorrectly treated trialmins like fullmins, resulting in situations where calling an ERT became impossible.
+ If an ERT request gets no answer for 5 minutes, admins now get a one time reminder that it was sent.
+
+
TheDZD updated:
+
+ Burst fire selection is now a proc, as it was meant to be, rather than a verb.
+
+
TullyBurnalot updated:
+
+ AI can no longer interact with IV Drips
+ Robots can no longer remove beakers/blood bags from IV Drips
+ Fixed clown door deconstruction
+ Fixed mime door deconstruction
+
+
+
02 July 2016
+
Fethas updated:
+
+ adds comfirmation dialogs to transforms from player panel
+
+
Fox McCloud updated:
+
+ Adds in laughter demons
+ Can summon laughter demons as a wizard
+ Chem master can produce instantaneous medical patches if all chems are safe
+ Can now purchase sniper rifle and associated ammo on uplink during nuke ops
+ Most melee and laser armor values halved or reduced; some bullet armor reduced slightly
+ Slowdown on most armor and spacesuits reduced by 1 (chaplain armor is still slow though)
+ Mining armor caps out at 60 melee resist as opposed to 80
+ Ling melee armor reduced; bullet and laser values buffed a bit and slowdown removed
+ Chameleon jumpsuit has a little bit of armor
+ Detective's forensic jacket now has identical armor to the native detective jacket
+ Armor penetration added to energy swords, chainsaws, scythes, and spears
+ Fixes stun batons, telebatons, and abductor batons piercing/bypassing shields
+
+
FreeStylaLT updated:
+
+ Adds appropriate battle yells to sleeping carp
+
+
KasparoVy updated:
+
+ Engineer boots that've had their toes cut open now have a sprite.
+ Vox now have engineer workboot sprites.
+ Removes unused SWAT boot sprites that were really just copypasted jackboot sprites.
+
+
Krausus updated:
+
+ The late-join job listing is now big enough to show all the jobs at once, and organizes them into labeled categories.
+ Fixed Hotkey Help and hotkey mode toggle messages not appearing.
+ The late-join job listing will now ignore (mis)clicks for the first second after popping up.
+
+
Kyep updated:
+
+ "Loyalty" implants are now known as "Mindshield" implants
+ Admins playing CC jobs can no longer get antag status from autotraitor.
+
+
Tastyfish updated:
+
+ There's essentially a completely new space hotel map! Explorers rejoice!
+
+
TheDZD updated:
+
+ Chance for vampires to burn in the chapel has been greatly reduced (from a 35% chance down to 8% per tick).
+ Vampires do not scream from chapel/space burning until they actually start catching fire.
+ Threshold for vampires to catch fire from space/chapel burning changed from 60 health to 50 health.
+ Fire stacks from vampire burning no longer apply twice 35% of the time while below the health threshold.
+
+
VampyrBytes updated:
+
+ No more *me emoting from your corpse!
+
+
monster860 updated:
+
+ Fixes ghosts having a generic icon when darkness is toggled off
+
+
tigercat2000 updated:
+
+ There's a new tab in the character setup screen, "loadouts". This allows you to spawn with a limited number of preset items.
+ Character setup now uses #defines for the different tabs.
+
+
+
28 June 2016
+
CrAzYPiLoT updated:
+
+ Replaced the current recycler sound with a new one.
+
+
DaveTheHeadcrab updated:
+
+ Adds workboots to be worn by engineers.
+ Fixes the scanner's search functionality.
+
+
FalseIncarnate updated:
+
+ To save on adhesive costs, Nanotrasen has stopped gluing stools to the floor. The resulting bodily injuries probably won't cost more than the glue.
+
+
Fethas updated:
+
+ you can now pick up potted plants and stealth
+
+
FlattestGuitar updated:
+
+ changes some alcohol values, the weaker ones are no longer as weak
+ refactored alcohol, you can now take short breaks between sips and still pass out in a gentlemanly manner
+ different species have different levels of alcohol resistance, check in with your bartender for more information
+ The medical HUD will now be a bit smoother. Neat.
+
+
Fox McCloud updated:
+
+ Warden starts off with a pair of Krav Maga Gloves
+ New Steal objective: steal the warden's krav maga gloves
+ Clonepods will automatically suck in nearby meat
+ Slime processors will automatically suck in nearby dead slimes
+ Actually fixes vamp chaplains
+ Fixes clumsy check on guns not working properly, resulting in people with glasses shooting themselves in the foot
+ pAI candidates can now see who requested them
+
+
KasparoVy updated:
+
+ Adds Yi to Vox-pidgin syllables. (Port from VG.)
+ Adds framework for icon-based skin tones. (Port from VG.)
+ Adds Vox-compatibility for all remaining eyewear.
+ Raiders now get a random skin tone and eye colour on spawn.
+ Species default hair, facial hair and head-accessory colours can now be defined.
+ Newly created Vox mobs will spawn with the same hair colour as they used to have pre-greyscaling.
+ Noir vision will no longer grey out the HUD. (Port from VG.)
+ Tails will not be coloured if the person's species doesn't have skin colour.
+ Vox hair (head and facial) have been greyscaled and can now be customized by the full colour range.
+ IPC parts from the mech fabricator won't turn IPCs invisible upon attachment anymore.
+
+
Krausus updated:
+
+ Added a custom runtime error handler.
+ Added an in-game runtime viewer.
+
+
Kyep updated:
+
+ Admins now hear boink sound when faxed, command sends ERT request, etc
+ Admins can reply to faxes via radio
+ Admins can reply to faxes with pre-written fax templates
+ Admins can reply to faxes with 'evil faxes', special faxes that have negative effects on their intended recipient (and nobody else)
+ Admins can now join as "Nanotrasen Navy Officer", and "Special Operations Officer". They spawn on adminstation and ERT office, respectively. They are not announced and do not appear on crew manifest.
+ "Select equipment" verb outfits tweaked for consistency with the above job outfits
+ Teleporter on admin station now works.
+ Added antag-only warning to bee briefcase, to reduce chances of traitors killing themselves with it.
+
+
LittleBigKid2000 updated:
+
+ Space explorer corgis can now safely explore space
+
+
Norgad updated:
+
+ Maintenance around the incinerator has been expanded.
+ Engineering maintenance finally has an APC.
+ The incinerator has been moved eastward, there is now a construction area in it's previous location.
+
+
Tastyfish updated:
+
+ Cryo tubes, sleepers, and body scanners now eject random items the occupant dropped, upon the occupant being ejected.
+
+
TheDZD updated:
+
+ Adds an adminbuse gun that fires gun mimics, you can varedit the gun's `mimic_type` var to any gun path, and it'll fire that gun as mimics. By default it fires stetchkin pistol mimics.
+ Fixes minor issues caused by some guns having text paths for power cells.
+ Fixes some runtimes and inconsistencies with the telegun and temperature gun.
+ The Tesla engine has acquired a grudge for lockers, and will now smite any in its path.
+ Unstable bluespace teleportation devices have been removed from energy guns, meaning they should no longer teleport from one hand to another when switching firing modes.
+
+
Twinmold updated:
+
+ You can once again resist borer control with the Resist verb.
+
+
VampyrBytes updated:
+
+ Emotes can now be accessed through verbs as well as say *
+ Emotes accessed through say * no longer take parameters after a -
+ Emotes now take parameters through input boxes
+ Emotes now have support for blind and deaf characters
+ Emotes now personalise messages
+ Flip can now be targeted with or without a grab
+ All emotes that are affected by being muzzled now make the user make some kind of noise
+ monkeys now have access to all the emotes that the npc tries to perform
+ Leap genetics ability lets you jump over things
+
+
monster860 updated:
+
+ UI now gets it's own plane
+ RnD console now uses NanoUI! Sweet!
+ Fixes tranquillite being outside the box in the materials list. Mimes are supposed to be trapped inside a box, not outside one.
+ Replaces the weird unicode "x" character in some design names with the actual letter "x" so that it doesn't fuck up NanoUI
+ RCD gets a UI
+ RCD-built airlocks can now receive different types and accesses.
+ You can now shift-click to examine as silicon, instead of ctrl-shift-clicking, which is something absolutely no one would guess.
+ Pulsing multiple doors' "open door" wires at the same time using a remote signaller now actually opens them at the same time.
+ Fixes wormhole projector not having an icon.
+ Wormhole projector has 0 failchance now.
+ Portals made by wormhole projectors can be removed via a multitool
+ Fixes ghost being able to request docking at trader ship consoles
+
+
tigercat2000 updated:
+
+ Ported goon HTML chat from /vg/ / Goon
+ All uses of \black have been removed
+ All uses of \icon have been replaced with bicon()
+
+
tkdrg updated:
+
+ Admins now have a verb to wipe all scripts from telecomms.
+
+
19 June 2016
DaveTheHeadcrab updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 3cc2cf1b582..1309d5211dd 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -1824,3 +1824,612 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
by the staff of animation will shoot things.
- rscadd: Mimics created by the staff of animation now have googly eyes.
- bugfix: Fixes the disturbing lack of death caused by wand of death projectiles.
+2016-06-28:
+ CrAzYPiLoT:
+ - tweak: Replaced the current recycler sound with a new one.
+ DaveTheHeadcrab:
+ - rscadd: Adds workboots to be worn by engineers.
+ - bugfix: Fixes the scanner's search functionality.
+ FalseIncarnate:
+ - bugfix: To save on adhesive costs, Nanotrasen has stopped gluing stools to the
+ floor. The resulting bodily injuries probably won't cost more than the glue.
+ Fethas:
+ - rscadd: you can now pick up potted plants and stealth
+ FlattestGuitar:
+ - tweak: changes some alcohol values, the weaker ones are no longer as weak
+ - tweak: refactored alcohol, you can now take short breaks between sips and still
+ pass out in a gentlemanly manner
+ - tweak: different species have different levels of alcohol resistance, check in
+ with your bartender for more information
+ - tweak: The medical HUD will now be a bit smoother. Neat.
+ Fox McCloud:
+ - rscadd: Warden starts off with a pair of Krav Maga Gloves
+ - rscadd: 'New Steal objective: steal the warden''s krav maga gloves'
+ - rscadd: Clonepods will automatically suck in nearby meat
+ - rscadd: Slime processors will automatically suck in nearby dead slimes
+ - bugfix: Actually fixes vamp chaplains
+ - bugfix: Fixes clumsy check on guns not working properly, resulting in people with
+ glasses shooting themselves in the foot
+ - rscadd: pAI candidates can now see who requested them
+ KasparoVy:
+ - rscadd: Adds Yi to Vox-pidgin syllables. (Port from VG.)
+ - rscadd: Adds framework for icon-based skin tones. (Port from VG.)
+ - rscadd: Adds Vox-compatibility for all remaining eyewear.
+ - rscadd: Raiders now get a random skin tone and eye colour on spawn.
+ - rscadd: Species default hair, facial hair and head-accessory colours can now be
+ defined.
+ - rscadd: Newly created Vox mobs will spawn with the same hair colour as they used
+ to have pre-greyscaling.
+ - bugfix: Noir vision will no longer grey out the HUD. (Port from VG.)
+ - bugfix: Tails will not be coloured if the person's species doesn't have skin colour.
+ - bugfix: Vox hair (head and facial) have been greyscaled and can now be customized
+ by the full colour range.
+ - bugfix: IPC parts from the mech fabricator won't turn IPCs invisible upon attachment
+ anymore.
+ Krausus:
+ - rscadd: Added a custom runtime error handler.
+ - rscadd: Added an in-game runtime viewer.
+ Kyep:
+ - rscadd: Admins now hear boink sound when faxed, command sends ERT request, etc
+ - rscadd: Admins can reply to faxes via radio
+ - rscadd: Admins can reply to faxes with pre-written fax templates
+ - rscadd: Admins can reply to faxes with 'evil faxes', special faxes that have negative
+ effects on their intended recipient (and nobody else)
+ - rscadd: Admins can now join as "Nanotrasen Navy Officer", and "Special Operations
+ Officer". They spawn on adminstation and ERT office, respectively. They are
+ not announced and do not appear on crew manifest.
+ - tweak: '"Select equipment" verb outfits tweaked for consistency with the above
+ job outfits'
+ - bugfix: Teleporter on admin station now works.
+ - bugfix: Added antag-only warning to bee briefcase, to reduce chances of traitors
+ killing themselves with it.
+ LittleBigKid2000:
+ - rscadd: Space explorer corgis can now safely explore space
+ Norgad:
+ - rscadd: Maintenance around the incinerator has been expanded.
+ - rscadd: Engineering maintenance finally has an APC.
+ - rscadd: The incinerator has been moved eastward, there is now a construction area
+ in it's previous location.
+ Tastyfish:
+ - bugfix: Cryo tubes, sleepers, and body scanners now eject random items the occupant
+ dropped, upon the occupant being ejected.
+ TheDZD:
+ - rscadd: Adds an adminbuse gun that fires gun mimics, you can varedit the gun's
+ `mimic_type` var to any gun path, and it'll fire that gun as mimics. By default
+ it fires stetchkin pistol mimics.
+ - bugfix: Fixes minor issues caused by some guns having text paths for power cells.
+ - bugfix: Fixes some runtimes and inconsistencies with the telegun and temperature
+ gun.
+ - tweak: The Tesla engine has acquired a grudge for lockers, and will now smite
+ any in its path.
+ - bugfix: Unstable bluespace teleportation devices have been removed from energy
+ guns, meaning they should no longer teleport from one hand to another when switching
+ firing modes.
+ Twinmold:
+ - bugfix: You can once again resist borer control with the Resist verb.
+ VampyrBytes:
+ - rscadd: Emotes can now be accessed through verbs as well as say *
+ - rscdel: Emotes accessed through say * no longer take parameters after a -
+ - rscadd: Emotes now take parameters through input boxes
+ - rscadd: Emotes now have support for blind and deaf characters
+ - rscadd: Emotes now personalise messages
+ - tweak: Flip can now be targeted with or without a grab
+ - tweak: All emotes that are affected by being muzzled now make the user make some
+ kind of noise
+ - bugfix: monkeys now have access to all the emotes that the npc tries to perform
+ - rscadd: Leap genetics ability lets you jump over things
+ monster860:
+ - tweak: UI now gets it's own plane
+ - tweak: RnD console now uses NanoUI! Sweet!
+ - bugfix: Fixes tranquillite being outside the box in the materials list. Mimes
+ are supposed to be trapped inside a box, not outside one.
+ - tweak: Replaces the weird unicode "x" character in some design names with the
+ actual letter "x" so that it doesn't fuck up NanoUI
+ - rscadd: RCD gets a UI
+ - rscadd: RCD-built airlocks can now receive different types and accesses.
+ - rscadd: You can now shift-click to examine as silicon, instead of ctrl-shift-clicking,
+ which is something absolutely no one would guess.
+ - bugfix: Pulsing multiple doors' "open door" wires at the same time using a remote
+ signaller now actually opens them at the same time.
+ - bugfix: Fixes wormhole projector not having an icon.
+ - tweak: Wormhole projector has 0 failchance now.
+ - rscadd: Portals made by wormhole projectors can be removed via a multitool
+ - bugfix: Fixes ghost being able to request docking at trader ship consoles
+ tigercat2000:
+ - rscadd: Ported goon HTML chat from /vg/ / Goon
+ - tweak: All uses of \black have been removed
+ - tweak: All uses of \icon have been replaced with bicon()
+ tkdrg:
+ - rscadd: Admins now have a verb to wipe all scripts from telecomms.
+2016-07-02:
+ Fethas:
+ - bugfix: adds comfirmation dialogs to transforms from player panel
+ Fox McCloud:
+ - rscadd: Adds in laughter demons
+ - rscadd: Can summon laughter demons as a wizard
+ - rscadd: Chem master can produce instantaneous medical patches if all chems are
+ safe
+ - rscadd: Can now purchase sniper rifle and associated ammo on uplink during nuke
+ ops
+ - tweak: Most melee and laser armor values halved or reduced; some bullet armor
+ reduced slightly
+ - tweak: Slowdown on most armor and spacesuits reduced by 1 (chaplain armor is still
+ slow though)
+ - tweak: Mining armor caps out at 60 melee resist as opposed to 80
+ - tweak: Ling melee armor reduced; bullet and laser values buffed a bit and slowdown
+ removed
+ - tweak: Chameleon jumpsuit has a little bit of armor
+ - tweak: Detective's forensic jacket now has identical armor to the native detective
+ jacket
+ - tweak: Armor penetration added to energy swords, chainsaws, scythes, and spears
+ - bugfix: Fixes stun batons, telebatons, and abductor batons piercing/bypassing
+ shields
+ FreeStylaLT:
+ - rscadd: Adds appropriate battle yells to sleeping carp
+ KasparoVy:
+ - imageadd: Engineer boots that've had their toes cut open now have a sprite.
+ - imageadd: Vox now have engineer workboot sprites.
+ - imagedel: Removes unused SWAT boot sprites that were really just copypasted jackboot
+ sprites.
+ Krausus:
+ - tweak: The late-join job listing is now big enough to show all the jobs at once,
+ and organizes them into labeled categories.
+ - bugfix: Fixed Hotkey Help and hotkey mode toggle messages not appearing.
+ - tweak: The late-join job listing will now ignore (mis)clicks for the first second
+ after popping up.
+ Kyep:
+ - tweak: '"Loyalty" implants are now known as "Mindshield" implants'
+ - tweak: Admins playing CC jobs can no longer get antag status from autotraitor.
+ Tastyfish:
+ - rscadd: There's essentially a completely new space hotel map! Explorers rejoice!
+ TheDZD:
+ - tweak: Chance for vampires to burn in the chapel has been greatly reduced (from
+ a 35% chance down to 8% per tick).
+ - tweak: Vampires do not scream from chapel/space burning until they actually start
+ catching fire.
+ - tweak: Threshold for vampires to catch fire from space/chapel burning changed
+ from 60 health to 50 health.
+ - tweak: Fire stacks from vampire burning no longer apply twice 35% of the time
+ while below the health threshold.
+ VampyrBytes:
+ - bugfix: No more *me emoting from your corpse!
+ monster860:
+ - bugfix: Fixes ghosts having a generic icon when darkness is toggled off
+ tigercat2000:
+ - rscadd: There's a new tab in the character setup screen, "loadouts". This allows
+ you to spawn with a limited number of preset items.
+ - tweak: 'Character setup now uses #defines for the different tabs.'
+2016-07-07:
+ Ar3nn:
+ - tweak: Adds tech levels to RnD console main menu
+ FalseIncarnate:
+ - bugfix: Chicks no longer lose their souls (literally) when becoming adults.
+ - bugfix: Intercoms, fire alarms, and air alarms no longer contain internal portals
+ to a realm of infinite cables and circuit boards.
+ Fox McCloud:
+ - tweak: Space lube damage removed and duration reduced from 7 to 5
+ - tweak: Azide and CLF3+Firefighting foam now play a bang sound when mixed
+ - rscadd: Can now pet pAI's with help intent
+ - bugfix: Fixes sechuds and nightvision sechuds having flash protection
+ FreeStylaLT:
+ - rscadd: Added windows and a missing firelock to Genetics/Cloning
+ - tweak: Tweaked layout of Genetics slightly
+ - rscadd: Added photocopier to R&D.
+ - tweak: Tweaked RD's office layout slightly
+ - tweak: Changed access on Tcomms' external airlocks' buttons to be same as general
+ Tcomms access
+ - bugfix: fixed the airless tiles in Assembly Line's windows
+ KasparoVy:
+ - imageadd: Adds improved Vox mask/goggle sprites.
+ - imageadd: Adds Vox-compatible versions of most suits.
+ - rscadd: Adds species-fitting and icon override handling to clothing accessories
+ and suit collars.
+ - rscadd: You can now open/close Clown Officer and Soldier coats.
+ - rscadd: Adds by-species tail hiding.
+ - tweak: Tidies up and refactors the way the Captain's space helmet shows Vox hair
+ but hides every other species'.
+ - bugfix: Reactive armour's sprite will now update as soon as you turn it on/off
+ or EMP it.
+ Krausus:
+ - bugfix: Fixed borers dying in hosts who happened to be somewhere cold, such as
+ space. Even if their host was in a space suit.
+ - bugfix: Fixed borers forgetting to detach from a host when it died.
+ - bugfix: Fixed borers being able to assume control of a dead host.
+ - bugfix: Fixed dead borers in a host being able to speak with the host and ghosts.
+ - bugfix: Fixed employees starting every shift at least 3 minutes late. You aren't
+ getting paid to stand around, people!
+ - bugfix: Fixed animal beatdowns being twice as noisy as they should be.
+ - bugfix: Pod lock busters should now properly bust pod locks.
+ - bugfix: The late-stage effects of the "sensory destruction" disease symptom should
+ now properly destroy your senses.
+ - bugfix: Autotraitor should now continue picking new in-game traitors, instead
+ of picking one and dying.
+ - bugfix: Lacking a head no longer makes you immune to becoming a husk or skeleton.
+ - bugfix: Security and medical records should probably stop crashing people.
+ - bugfix: Altering details on an Agent ID Card will now actually update what's seen
+ when examining the card.
+ Kyep:
+ - tweak: Fixes NT Special Ops Officer's headset so he can correctly hear, and talk
+ on, the Special Ops (deathsquad) channel.
+ - bugfix: Fixed oversight in keycard authentication devices that incorrectly treated
+ trialmins like fullmins, resulting in situations where calling an ERT became
+ impossible.
+ - tweak: If an ERT request gets no answer for 5 minutes, admins now get a one time
+ reminder that it was sent.
+ TheDZD:
+ - bugfix: Burst fire selection is now a proc, as it was meant to be, rather than
+ a verb.
+ TullyBurnalot:
+ - tweak: AI can no longer interact with IV Drips
+ - tweak: Robots can no longer remove beakers/blood bags from IV Drips
+ - bugfix: Fixed clown door deconstruction
+ - bugfix: Fixed mime door deconstruction
+2016-07-09:
+ Chakirski:
+ - rscadd: Adds disabled_component() to cyborgs.
+ - bugfix: EMPs now disable binary communication for as long as the stun time.
+ - tweak: Syndicate thermal imaging glasses (mesons) can now be prescription upgraded
+ like normal mesons.
+ - tweak: Green glasses from the AutoDrobe can now be prescription upgraded.
+ FalseIncarnate:
+ - rscadd: Deepfryers are no longer arcane mysteries, and can be (de)constructed
+ and upgraded.
+ Fox McCloud:
+ - rscadd: Grenade have a chance to explode when the person holding them is shot
+ - rscadd: Flamethrowers can release their tank's contents if the person holding
+ them is shot
+ - tweak: 'Can no longer self-trigger blocked shield events (ie: no self-harm to
+ trigger a reactive teleport armor)'
+ - tweak: Hugging someone/shaking them up bypasses shield checks (oh no, hugs of
+ death)
+ - tweak: Riot shields have a +30% chance to block thrown projectiles
+ - tweak: Hunter pounces are now a thrown attack as far as shield go, and yes, can
+ be blocked by riot shields now
+ - tweak: Energy shields no longer block anything other than beam and energy projectiles
+ - tweak: Being able to be pushed is based on the block chance of the item you're
+ holding instead of it just being based on riot shields
+ - rscadd: Adds in cursed wizard heart, purchase it from the wizard's spell book
+ for 1 point, but be wary of not keeping the heart beating...
+ FreeStylaLT:
+ - rscadd: Added a bunch of new items to maint, some rare uplink gear included. (see
+ PR for full list)
+ - tweak: made gas masks, nothing and extinguishers less common in maint
+ Krausus:
+ - bugfix: Players probably won't get stuck as plants forever anymore. Probably.
+ - tweak: Refactored job ban checking, which should massively reduce round start-up
+ time.
+ - bugfix: Job bans/unbans will now take effect instantly, rather than at the next
+ server restart.
+ TheDZD:
+ - bugfix: DNA injectors no longer always activate powers that are supposed to have
+ a chance to activate.
+ - tweak: Dionae can no longer activate the radiation disability, nor the run superpower
+ except via adminbus.
+ - rscadd: Adds genetic instability, which causes a variety of negative effects,
+ including toxin damage, burn damage, cloneloss, and even gibbing. Effects get
+ worse as stability gets lower, burn damage starts below 85 stability, tox and
+ clone below 70, and gibbing once you're below 40.
+ - rscadd: Adds Curse of the Cluwne touch attack spell, which wizards can pick, heavily
+ based off of the same spell from Goonstation. Said spell adds an unremovable
+ honk tumor to the target, gives them NODROP neon green clown gear, makes them
+ stutter, makes them almost eternally fat, confuses them, makes them clumsy and
+ speak in Comic Sans, and severely brain damages them. Use it on a cluwne however...
+ - bugfix: Fixes a bug where honk tumors would cause NODROP items to still be moved,
+ despite being unable to be unequipped.
+ TullyBurnalot:
+ - rscdel: Botanist access to the morgue revoked
+ - tweak: Added custom messages for evil faxes
+ - tweak: Added unique text body for each non-evil fax template
+ - rscadd: Added a "Keep up the good work" fax template
+ - rscadd: Added a "ERT Instructions" fax template
+ - rscadd: Photocopiers can be emagged
+ - rscadd: Emagged photocopiers deal 30 burn damage to all mobs copying their butts
+ - tweak: Deconstructing Comfy Chairs yields 2 metal sheets
+ - tweak: Boxes no longer allowed inside evidence bags to prevent them going into
+ themselves
+ - tweak: Monocles are now prescription upgradable
+ - rscadd: Monocles added to Loadout selection
+ - tweak: Spinning a revolver's chamber makes a noise again
+ - tweak: Revenants can actually be killed now.
+ - tweak: AntagHUD activation disqualifies player from rebooted drones
+ - tweak: Sergeant Ian hat now visible
+ Twinmold:
+ - bugfix: Fixes the inconsistency of getting 2 metal rods when you wirecutter a
+ destroyed grille down to 1.
+2016-07-13:
+ Ar3nn:
+ - rscadd: Adds a silence button to newscasters, which will silence the regular update
+ sounds
+ Chakirski:
+ - imageadd: Adds new bacon sprites.
+ - rscadd: Bacon can now be cooked from the grill. Just grill raw bacon.
+ - tweak: Raw cutlets are now sliceable into raw bacon strips.
+ - tweak: Plasma and N20 look more gassy.
+ DaveTheHeadcrab:
+ - tweak: Greys no longer speak in wingdings.
+ - rscadd: Greys now have a species-specific language.
+ Fox McCloud:
+ - tweak: Overall borg power useage has been lowered
+ - tweak: Borgs who have completely run out of power can now still move around/see/talk,
+ but they will be unable to interact with machinery/doors around them; they can
+ still bump open doors, however. Borgs with no cell are still completely paralyzed
+ and can't do anything.
+ - tweak: IPCs are now properly impacted by space's burn damage
+ - tweak: NT Rep's cane stuns for less and invokes a cooldown between use, similar
+ to telebatons
+ - tweak: Oxygen damage number changed a bit; damage is based upon volume lost more
+ now
+ - tweak: Species that have blood but are oxygen immune will now take tox damage
+ - rscadd: Health analyzers will now work with species with exotic blood and inform
+ the user what type of exotic blood they have
+ - rscadd: Other machinery that display blood levels (op table, sleepers, advanced
+ scanners, etc) will now work with exotic blood
+ - bugfix: Changeling regen will now properly restore blood if you have exotic blood
+ fix Fixes being blurry for 20+ minutes when you were low on blood for a mere
+ 3 minutes
+ - tweak: Heart damage impacting blood volume removed
+ - tweak: Nutrition draining when low on blood removed
+ - bugfix: Station cinematics shouldn't have inventory overlays over top of the animation
+ - bugfix: Station cinematics should properly clear off the screen and delete now
+ - bugfix: pAIs are no longer valid targets for gun turrets (like on the syndicate
+ ship)
+ - rscadd: Adds in Rathen's secret, a new spell for the wizard that AoE stuns
+ - rscdel: Removed borg jetpacks
+ - rscadd: Adds in borg ion pulse system; borgs with ion pulse enabled consume extra
+ power for each turf they move but can travel on space. Can upgrade any borg,
+ at R&D with an ion pulse upgrade
+ - rscadd: 'Adds in cyborg self repair upgrade: very slowly repairs cyborgs at the
+ cost of extra power. Available at R&D'
+ - tweak: 'Mining cyborg module tweaked slightly: GPS, shovel, mini welding tool
+ and mini extinguisher added, wrench and screwdriver removed'
+ - tweak: reset borg module removes speed boost
+ - bugfix: Fixes borg's stun arm bypassing shields
+ KasparoVy:
+ - imageadd: Adds Vox compatible versions of all jumpskirts.
+ - imageadd: Adds Vox compatible version of the CMO jumpsuit.
+ Krausus:
+ - bugfix: Players will ALMOST DEFINITELY never get stuck as plants anymore. I mean
+ it this time!
+ - bugfix: Fixed morgue trays not updating themselves when you ghost into/out of
+ your body.
+ Kyep:
+ - tweak: Changed access requirement on lethal injection locker to sec access (same
+ access required for the chair its right next to.
+ - tweak: Changed access requirement on exile implant locker to armory access.
+ - tweak: Ghosts no longer miss out on ERTs due to not knowing it was called, or
+ not being able to find the verb. They are now prompted about joining an ERT
+ when one is called.
+ - bugfix: Fixed a condition where 'we are assembling an ERT' message is broadcast,
+ but no ERT is generated.
+ - bugfix: Typo fixes in ERT messages.
+ - tweak: Entering a cryo pod, then deliberately selecting OOC->Ghost, and clicking
+ yes on the prompt, will now instantly send you to long-term storage, removing
+ you from the round, despawning your body, freeing your job slot, and giving
+ a new objective to any antag that had you as a target.
+ - tweak: Announcements about someone entering long-term storage via a cryopod now
+ include that person's rank.
+ - tweak: When an antag target cryos, the message the antag gets about their objectives
+ changing is now clearer.
+ TheDZD:
+ - rscadd: Adds "salts" as a say verb for deadchat ghosts.
+ TullyBurnalot:
+ - rscadd: Universal Recorder added to NT Rep Locker
+ - rscadd: Box of recorder tapes added to NT Rep and IAA Locker
+ - rscadd: Fax Guide added to Captain, HoS, HoP, NT Rep and IAA Lockers
+ - rscadd: Butt copy alert added to photocopiers
+ - rscadd: Butt copy alert comes with *ping noise
+ - tweak: Photocopiers start with 60 toner
+ Twinmold:
+ - bugfix: Vampires with sleeping carp (traitor+vampire rounds) can now suck people's
+ blood like normal.
+ monster860:
+ - rscadd: The ChemMaster now uses NanoUI! Yey!
+ - bugfix: Alerts are no broken ghostly outlines
+2016-07-20:
+ Allfd:
+ - rscadd: Added hologram fluff sprites
+ Ar3nn:
+ - rscdel: Gets rid of some weird lattices floating in mid-space
+ Chakirski:
+ - imageadd: Adds M.E. Reaper sprite.
+ - rscadd: AI can now choose a 32x64 reaper hologram.
+ - tweak: Cigarette packs no longer show near-duplicate messages when examined.
+ CrAzYPiLoT:
+ - rscadd: Ports randomized space ruins from /tg/ station. There is a number of maps
+ which can be spawned at any location on the empty z-level at roundstart, and
+ up to three random ones will be chosen each round. Credits to KorPhaeron.
+ - rscadd: Lays the groundwork for a future lavaland implementation, if we choose
+ to have it.
+ - rscadd: Adds a feature to the map loader where areas with the right var set can
+ be distinctly initialized on map load - meaning separate APCs, and the like.
+ - rscadd: Using a z-level specific initialization freeze system, large elaborate
+ maps like the cyberiad can be loaded without a single runtime, with minimal
+ impact on the round elsewhere.
+ - rscadd: Adds a delete mode to the "Fill" buildmode - just alt-click for the second
+ corner, and everything within will be removed.
+ - rscadd: Adds a "Jump To" function in VV, which is useful for getting an idea of
+ what exactly you're looking at.
+ - rscadd: Added view count to newscaster feeds and messages.
+ Crazylemon64:
+ - bugfix: Abductors consoles link correctly again
+ DaveTheHeadcrab:
+ - tweak: Plastic explosives are now a subtype of grenades. Shouldn't be any noticable
+ difference for players.
+ - tweak: Plastic explosives no longer use the wire datum. You may directly attach
+ an assembly holder (Such as a remote signaller + igniter assembly)
+ - rscadd: Adds X-4 shaped charges, designed for breaching explosively without harming
+ the user. Pick some up at your local nukies r us.
+ - rscadd: Replaces tablecrafting with personal crafting, click the hammer icon by
+ your intent selector to use it.
+ - rscdel: Removes the PDA slot, your PDA can now go in your ID slot (Again).
+ - rscadd: You can now alt click to remove an ID from a PDA, for quick interaction
+ while it's in your ID slot.
+ - rscadd: Adds an overlay for an ID while it's inserted into your PDA.
+ FalseIncarnate:
+ - rscadd: Adds new Bottler machine for making unique beverages! Order one from cargo
+ today!
+ - rscadd: Adds 6 new drinks obtainable via the Bottler. Get brewing!
+ - bugfix: Grapes now can be properly juiced again, as they now have the right kitchen
+ tag.
+ - rscadd: Adds effects to the Paradise Pop reagents. Drink them all to unlock their
+ powers!
+ Fox McCloud:
+ - rscadd: Adds in fans which can block atmospherics passing over them
+ - bugfix: All mass driver blast doors have a fan underneath them, allowing you to
+ use them repeatedly instead of once
+ - bugfix: Fixes medical, security, and employment records not being displayed
+ - rscadd: Adds in a weather system
+ - tweak: Removes most of the miner's uniform equipment from their lockers and puts
+ it in a miner's wardrobe
+ - tweak: Miners start off with a lot of their clothing equipment equipped to them
+ - rscadd: Miners now have unique headset sprites
+ - tweak: Miners no longer have lanterns, but a seclite; they can attach this to
+ their kinetic accelerators now
+ - tweak: Miners have workboots instead of black shoes
+ - tweak: Miners no longer have a default mining scanner but an advanced one that
+ works at reduced range (5 instead of 7) and has a longer cooldown between pulses
+ (5 instead of 3.5)
+ - tweak: removed extra mining hardsuit from the outpost
+ - tweak: removed medikit spam from outpost; now just a toxin kit and a regular medical
+ kit
+ - rscadd: Bluespace crystals now earn you points and can be refined into bluespace
+ polycrystal sheets
+ - tweak: Spare vouchers from QM and HoP removed
+ - tweak: removed armor from the fake tactical turtleneck
+ - rscadd: Can scan vending machines with your PDA to pay for items (if there's an
+ ID in your PDA)
+ - tweak: Sleepers no longer require a console to build, only the sleeper itself
+ - tweak: Clicking on the sleeper brings up the menu that was previously brought
+ up for the console
+ - rscadd: Adds in syndicate sleepers--these sleepers are not only syndie themed
+ but also allow the user to inject chems into themselves while inside the sleepers
+ - tweak: Sleepers can now inject silver sulfadiazine
+ - tweak: removes cryofeeds from cryodorms and adds in 2 more cryopods
+ - bugfix: Fixes pre-spawned loaded belts not having proper overlays
+ - tweak: nanites will no longer purge chems, but will now heal internal organ damage,
+ attempt to mend fractures, and will no longer cure beneficial viruses
+ - bugfix: cold and hot drinks should now properly heat you up or cool you down (this
+ also goes for medical reagents)
+ - tweak: beer no longer reduces jitteriness
+ - tweak: toxins special and antifreeze heat you up
+ - tweak: banana juice and banana honk now heals monkeys
+ - bugfix: Fixes atrazine not killing nymphs
+ - tweak: mining autoinjectors no longer poison you
+ - tweak: combat hypospray now has omni+epinephrine+teporone
+ - tweak: stimpack is now meth+coffee instead of meth+epinephrine
+ - tweak: Cheese and synth meat amount creation scales with volume of the reaction
+ - tweak: sprinkles now heals all members of sec (brig phys, sec pod pilot, magistrate,
+ and IAA are no longer left out)
+ - bugfix: Fixes syndi+shielded+hos hardsuit sprite issues
+ - bugfix: Fixes wizard's who have a regular satchel set in their prefs winding up
+ with none
+ - bugfix: Spellbooks are automatically bound to wizards at round start (no more
+ ragin' exploitative mages)
+ - bugfix: Fixes mining outpost lacking an APC
+ - bugfix: Fixes being able to exploit and turn artificial bluespace crystals into
+ regular bluespace crystals
+ FreeStylaLT:
+ - rscadd: Added courtroom, left of brig.
+ - tweak: Remapped brig
+ - tweak: Moved prisoner processing and evidence storage to the right of brig, next
+ to Detective's office.
+ - tweak: Changed current processing to Interrogation and a hallway.
+ - tweak: Re-mapped Conference and Locker rooms.
+ - tweak: Lots of other minor tweaks to brig.
+ - tweak: Seriously, way too many small changes to list here, go and have a look
+ at the brig yourself.
+ - rscdel: Removed temp. detainment and observation from brig.
+ KasparoVy:
+ - bugfix: Wearing a suit will no longer cause runtimes due to the way suit-collars
+ are handled.
+ - bugfix: The north direction sprite of the Vulpkanin 'Patch' facial hair style
+ won't hang a pixel off the head anymore.
+ Krausus:
+ - tweak: All admins can now see "admin log" messages.
+ - rscadd: Admins can now toggle "admin log" messages on or off.
+ - tweak: Admins will no longer be notified about ghosted admins jumping around.
+ - bugfix: Beating on simple animals will no longer be twice as noisy as intended.
+ - bugfix: Emergency Response Teams are now usable again.
+ Kyep:
+ - tweak: adds botany, basketball court, individual cells, library computer and more
+ to perma. Makes it far less boring.
+ - tweak: Tracking implants are now useful, showing the implanted person's general
+ location, and health status, on prisoner consoles.
+ - bugfix: The NODROP flag now works correctly on jumpsuits.
+ - tweak: 'Improved admin ''select equipment'' verb. ERT option now works, costumes
+ get IDs and proper headsets, two new costumes added, and some outfits minorly
+ tweaked (e.g: tunnel clowns get toolbelts).'
+ - bugfix: Prevented NPCs being made into objective targets.
+ LittleBigKid2000 and TullyBBurnalot:
+ - rscadd: Stethoscopes can now be used to tell if a person's heart or lungs are
+ damaged, or if they have any at all. Now they're actually useful instead of
+ telling you the obvious in a vague way.
+ - bugfix: Stethoscopes can no longer be used to hear the heartbeat and breathing
+ of a person that doesn't have a heart or lungs.
+ Tauka Usanake:
+ - rscadd: Adds a Hydroponics HUD and a night vision version of it that can both
+ be created in R&D. It provides additional details on plants in hydro trays and
+ soil plots. Shows the health, nutrient, water, toxin, pest, and weed level of
+ the plant as well as whenever it is ready to be harvested or is dead.
+ TullyBBurnalot:
+ - tweak: Handless cuffing no longer possible. Can still cuff people with one hand
+ TullyBurnalot:
+ - tweak: Mobs with PSY_RESISTANCE are no longer valid targets for REMOTE_VIEW
+ - rscadd: When emagged, Photocopiers now have a cooldown if used to copy butts
+ Twinmold:
+ - bugfix: Fixes removing ID cards from laptops with the Eject ID verb.
+ monster860:
+ - rscadd: A bunch of interfaces now use /datum/browser.
+ - rscadd: The ChemMaster now uses the asset cache, eliminating the enormous lag
+ spike when you first use it. Yey!
+ - bugfix: Fixes the window not closing when selecting an icon for the chem-master
+ - bugfix: Fixes the chem master window not updating when selecting an icon
+ - tweak: The chem-master icon selection window now has a 4x5 grid of icons.
+ tigercat2000:
+ - rscadd: Gas tanks now have an action button for accessing their interface.
+ - rscadd: You can now shift-click on movable HUD elements (such as action buttons)
+ to reset them to their initial position.
+ - tweak: Implants with limited uses, such as freedom implants, now delete themselves
+ when they run out of uses.
+2016-07-21:
+ Alffd:
+ - rscadd: Added a 6th Vulpkanin tail option.
+ - tweak: Fixes animations, side view, and pixel fill for Vulpkanin tail 6
+ FalseIncarnate:
+ - bugfix: Engineers can properly show up for work with their hats and coats to keep
+ warm.
+ Fox McCloud:
+ - tweak: Tajarans and Unathi can now wear all shoe and glove types
+ - tweak: Glove clipping removed except for black gloves, which makes them fingerless
+ gloves
+ - rscadd: Adds sandals as a loadout option
+ - rscadd: Adds in simple animal mob spawners
+ - rscadd: Adds shielded hardsuit to the nuke ops uplink for 30 TC
+ - rscadd: Implements the powerfist and adds it to the uplink for 8 TC
+ - rscdel: Removed drinking glass shattering (regular bottle shattering is still
+ a thing)
+ - rscadd: Captain's flask is now gold instead of silver
+ - tweak: Bottles have a throwforce of 15
+ - rscadd: can crack eggs into drinking glasses
+ - tweak: Detective's flask starts out with 30 units of whiskey
+ - rscdel: removes redundant object verbs that have an action button
+ - bugfix: Fixes up mindswap spell so it behaves more properly
+ - bugfix: Fixes genetic abilities action buttons not properly clearing
+ - bugfix: Fixes simple animals, silicons, and brains becoming perma deaf from flashbangs
+ and other sources
+ - bugfix: ACTUALLY FIXES MINING APC
+ - bugfix: Fixes brig cell timers not having the option to flash people
+ FreeStylaLT:
+ - rscadd: Added new syndicate item Chameleon SecHUD to uplink store, available for
+ all antags. It can morph into various eyewear while being a flashproof sechud.
+ Kyep:
+ - rscadd: Added new syndicate costumes to "select equipment" admin verb.
+ TullyBBurnalot:
+ - rscadd: More beds outside the Operating Theaters, Pajama Wardrobes outside and
+ inside the Operating Theaters, an extra NanoMed Vendor, one Disposal Chute per
+ OR, table with cards
+ - tweak: Sinks moved closer to Surgical Tables, moved light fixtures in the Operating
+ Theaters, tables with surgical tools now made of glass for maximum style points
+ and Xenomorph Larva Whack-A-Mole
+ monster860:
+ - bugfix: Brig timer UI reopening after being closed fixed.
diff --git a/html/changelogs/AutoChangeLog-pr-4349.yml b/html/changelogs/AutoChangeLog-pr-4349.yml
deleted file mode 100644
index 239734732a7..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4349.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-author: VampyrBytes
-delete-after: True
-changes:
- - rscadd: "Emotes can now be accessed through verbs as well as say *"
- - rscdel: "Emotes accessed through say * no longer take parameters after a -"
- - rscadd: "Emotes now take parameters through input boxes"
- - rscadd: "Emotes now have support for blind and deaf characters"
- - rscadd: "Emotes now personalise messages"
- - tweak: "Flip can now be targeted with or without a grab"
- - tweak: "All emotes that are affected by being muzzled now make the user make some kind of noise"
- - bugfix: "monkeys now have access to all the emotes that the npc tries to perform"
diff --git a/html/changelogs/AutoChangeLog-pr-4540.yml b/html/changelogs/AutoChangeLog-pr-4540.yml
deleted file mode 100644
index 846c1cd5dad..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4540.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: CrAzYPiLoT
-delete-after: True
-changes:
- - tweak: "Replaced the current recycler sound with a new one."
diff --git a/html/changelogs/AutoChangeLog-pr-4610.yml b/html/changelogs/AutoChangeLog-pr-4610.yml
deleted file mode 100644
index 7fcbe80c073..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4610.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: monster860
-delete-after: True
-changes:
- - tweak: "UI now gets it's own plane"
diff --git a/html/changelogs/AutoChangeLog-pr-4614.yml b/html/changelogs/AutoChangeLog-pr-4614.yml
deleted file mode 100644
index 9a35d948fde..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4614.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-author: KasparoVy
-delete-after: True
-changes:
- - rscadd: "Adds Yi to Vox-pidgin syllables. (Port from VG.)"
- - rscadd: "Adds framework for icon-based skin tones. (Port from VG.)"
- - rscadd: "Adds Vox-compatibility for all remaining eyewear."
- - rscadd: "Raiders now get a random skin tone and eye colour on spawn."
- - rscadd: "Species default hair, facial hair and head-accessory colours can now be defined."
- - rscadd: "Newly created Vox mobs will spawn with the same hair colour as they used to have pre-greyscaling."
- - bugfix: "Noir vision will no longer grey out the HUD. (Port from VG.)"
- - bugfix: "Tails will not be coloured if the person's species doesn't have skin colour."
- - bugfix: "Vox hair (head and facial) have been greyscaled and can now be customized by the full colour range."
diff --git a/html/changelogs/AutoChangeLog-pr-4624.yml b/html/changelogs/AutoChangeLog-pr-4624.yml
deleted file mode 100644
index bf50776cc49..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4624.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: monster860
-delete-after: True
-changes:
- - tweak: "RnD console now uses NanoUI! Sweet!"
- - bugfix: "Fixes tranquillite being outside the box in the materials list. Mimes are supposed to be trapped inside a box, not outside one."
- - tweak: "Replaces the weird unicode \"x\" character in some design names with the actual letter \"x\" so that it doesn't fuck up NanoUI"
diff --git a/html/changelogs/AutoChangeLog-pr-4647.yml b/html/changelogs/AutoChangeLog-pr-4647.yml
deleted file mode 100644
index 07fb3d6d360..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4647.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: FlattestGuitar
-delete-after: True
-changes:
- - tweak: "changes some alcohol values, the weaker ones are no longer as weak"
- - tweak: "refactored alcohol, you can now take short breaks between sips and still pass out in a gentlemanly manner"
- - tweak: "different species have different levels of alcohol resistance, check in with your bartender for more information"
diff --git a/html/changelogs/AutoChangeLog-pr-4679.yml b/html/changelogs/AutoChangeLog-pr-4679.yml
deleted file mode 100644
index bd4120a7a63..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4679.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Krausus
-delete-after: True
-changes:
- - rscadd: "Added a custom runtime error handler."
- - rscadd: "Added an in-game runtime viewer."
diff --git a/html/changelogs/AutoChangeLog-pr-4687.yml b/html/changelogs/AutoChangeLog-pr-4687.yml
deleted file mode 100644
index 08b65ca541c..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4687.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - rscadd: "Warden starts off with a pair of Krav Maga Gloves"
- - rscadd: "New Steal objective: steal the warden's krav maga gloves"
diff --git a/html/changelogs/AutoChangeLog-pr-4694.yml b/html/changelogs/AutoChangeLog-pr-4694.yml
deleted file mode 100644
index 2e233d399e4..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4694.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: Kyep
-delete-after: True
-changes:
- - rscadd: "Admins now hear boink sound when faxed, command sends ERT request, etc"
- - rscadd: "Admins can reply to faxes via radio"
- - rscadd: "Admins can reply to faxes with pre-written fax templates"
- - rscadd: "Admins can reply to faxes with 'evil faxes', special faxes that have negative effects on their intended recipient (and nobody else)"
diff --git a/html/changelogs/AutoChangeLog-pr-4699.yml b/html/changelogs/AutoChangeLog-pr-4699.yml
deleted file mode 100644
index 2bb156747d6..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4699.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: TheDZD
-delete-after: True
-changes:
- - rscadd: "Adds an adminbuse gun that fires gun mimics, you can varedit the gun's `mimic_type` var to any gun path, and it'll fire that gun as mimics. By default it fires stetchkin pistol mimics."
- - bugfix: "Fixes minor issues caused by some guns having text paths for power cells."
- - bugfix: "Fixes some runtimes and inconsistencies with the telegun and temperature gun."
diff --git a/html/changelogs/AutoChangeLog-pr-4703.yml b/html/changelogs/AutoChangeLog-pr-4703.yml
deleted file mode 100644
index a1100322a8a..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4703.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - rscadd: "Clonepods will automatically suck in nearby meat"
- - rscadd: "Slime processors will automatically suck in nearby dead slimes"
diff --git a/html/changelogs/AutoChangeLog-pr-4704.yml b/html/changelogs/AutoChangeLog-pr-4704.yml
deleted file mode 100644
index bbe89cfebb2..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4704.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: TheDZD
-delete-after: True
-changes:
- - tweak: "The Tesla engine has acquired a grudge for lockers, and will now smite any in its path."
diff --git a/html/changelogs/AutoChangeLog-pr-4718.yml b/html/changelogs/AutoChangeLog-pr-4718.yml
deleted file mode 100644
index 3ceac3d474a..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4718.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Fox McCloud
-delete-after: True
-changes:
- - bugfix: "Actually fixes vamp chaplains"
diff --git a/html/changelogs/AutoChangeLog-pr-4729.yml b/html/changelogs/AutoChangeLog-pr-4729.yml
deleted file mode 100644
index 566d5a8d623..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4729.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Twinmold
-delete-after: True
-changes:
- - bugfix: "You can once again resist borer control with the Resist verb."
diff --git a/html/changelogs/AutoChangeLog-pr-4734.yml b/html/changelogs/AutoChangeLog-pr-4734.yml
deleted file mode 100644
index 2650702dfb9..00000000000
--- a/html/changelogs/AutoChangeLog-pr-4734.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: TheDZD
-delete-after: True
-changes:
- - bugfix: "Unstable bluespace teleportation devices have been removed from energy guns, meaning they should no longer teleport from one hand to another when switching firing modes."
diff --git a/icons/effects/station_explosion.dmi b/icons/effects/station_explosion.dmi
index 908f6f27c90..7dcab377107 100644
Binary files a/icons/effects/station_explosion.dmi and b/icons/effects/station_explosion.dmi differ
diff --git a/icons/effects/tile_effects.dmi b/icons/effects/tile_effects.dmi
index b14ede9dcec..0475e83515c 100644
Binary files a/icons/effects/tile_effects.dmi and b/icons/effects/tile_effects.dmi differ
diff --git a/icons/effects/weather_effects.dmi b/icons/effects/weather_effects.dmi
new file mode 100644
index 00000000000..215cf53556f
Binary files /dev/null and b/icons/effects/weather_effects.dmi differ
diff --git a/icons/goonstation/mob/clothing/feet.dmi b/icons/goonstation/mob/clothing/feet.dmi
new file mode 100644
index 00000000000..73549581095
Binary files /dev/null and b/icons/goonstation/mob/clothing/feet.dmi differ
diff --git a/icons/goonstation/mob/clothing/mask.dmi b/icons/goonstation/mob/clothing/mask.dmi
new file mode 100644
index 00000000000..c4392fb8de7
Binary files /dev/null and b/icons/goonstation/mob/clothing/mask.dmi differ
diff --git a/icons/goonstation/mob/clothing/uniform.dmi b/icons/goonstation/mob/clothing/uniform.dmi
new file mode 100644
index 00000000000..522e83854ec
Binary files /dev/null and b/icons/goonstation/mob/clothing/uniform.dmi differ
diff --git a/icons/goonstation/mob/inhands/clothing_lefthand.dmi b/icons/goonstation/mob/inhands/clothing_lefthand.dmi
new file mode 100644
index 00000000000..363c616d3f8
Binary files /dev/null and b/icons/goonstation/mob/inhands/clothing_lefthand.dmi differ
diff --git a/icons/goonstation/mob/inhands/clothing_righthand.dmi b/icons/goonstation/mob/inhands/clothing_righthand.dmi
new file mode 100644
index 00000000000..0903e0d2055
Binary files /dev/null and b/icons/goonstation/mob/inhands/clothing_righthand.dmi differ
diff --git a/icons/goonstation/objects/clothing/feet.dmi b/icons/goonstation/objects/clothing/feet.dmi
new file mode 100644
index 00000000000..e6d37e10132
Binary files /dev/null and b/icons/goonstation/objects/clothing/feet.dmi differ
diff --git a/icons/goonstation/objects/clothing/mask.dmi b/icons/goonstation/objects/clothing/mask.dmi
new file mode 100644
index 00000000000..f5c4f97c255
Binary files /dev/null and b/icons/goonstation/objects/clothing/mask.dmi differ
diff --git a/icons/goonstation/objects/clothing/uniform.dmi b/icons/goonstation/objects/clothing/uniform.dmi
new file mode 100644
index 00000000000..a602f0cdce5
Binary files /dev/null and b/icons/goonstation/objects/clothing/uniform.dmi differ
diff --git a/icons/goonstation/objects/pda_overlay.dmi b/icons/goonstation/objects/pda_overlay.dmi
new file mode 100644
index 00000000000..4c7cb24a7f4
Binary files /dev/null and b/icons/goonstation/objects/pda_overlay.dmi differ
diff --git a/icons/mob/ancient_machine.dmi b/icons/mob/ancient_machine.dmi
new file mode 100644
index 00000000000..190e48e7803
Binary files /dev/null and b/icons/mob/ancient_machine.dmi differ
diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi
index c315fbbdc2f..c45bd957a1a 100644
Binary files a/icons/mob/body_accessory.dmi and b/icons/mob/body_accessory.dmi differ
diff --git a/icons/mob/corgi_head.dmi b/icons/mob/corgi_head.dmi
index 8c48077682e..a92b79d564e 100644
Binary files a/icons/mob/corgi_head.dmi and b/icons/mob/corgi_head.dmi differ
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index 28399ab1ce1..402bf49bd5c 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index 3390f7ec700..85f9b1e25a6 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 6703c61b1b7..7553227171c 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index c5115b3cbc5..92d1ac397ef 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 0012ecc2d06..79df46605a2 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 61c176bd08a..2a5ac2889c2 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 652996f8d8c..f950b2bdf74 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 685e6b2977b..491349985d4 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/mob/nest.dmi b/icons/mob/nest.dmi
new file mode 100644
index 00000000000..7dab335929e
Binary files /dev/null and b/icons/mob/nest.dmi differ
diff --git a/icons/mob/screen_midnight.dmi b/icons/mob/screen_midnight.dmi
index 25b3d7355d9..2dab86ef7f9 100644
Binary files a/icons/mob/screen_midnight.dmi and b/icons/mob/screen_midnight.dmi differ
diff --git a/icons/mob/screen_operative.dmi b/icons/mob/screen_operative.dmi
index d14e354d7f4..8d90aa7c3b3 100644
Binary files a/icons/mob/screen_operative.dmi and b/icons/mob/screen_operative.dmi differ
diff --git a/icons/mob/screen_plasmafire.dmi b/icons/mob/screen_plasmafire.dmi
index 9e22298fc27..cca826d272c 100644
Binary files a/icons/mob/screen_plasmafire.dmi and b/icons/mob/screen_plasmafire.dmi differ
diff --git a/icons/mob/screen_retro.dmi b/icons/mob/screen_retro.dmi
index ec36561ea0c..77aefd6a16b 100644
Binary files a/icons/mob/screen_retro.dmi and b/icons/mob/screen_retro.dmi differ
diff --git a/icons/mob/screen_robot.dmi b/icons/mob/screen_robot.dmi
index 0128584d284..000317e3f12 100644
Binary files a/icons/mob/screen_robot.dmi and b/icons/mob/screen_robot.dmi differ
diff --git a/icons/mob/screen_slimecore.dmi b/icons/mob/screen_slimecore.dmi
index 0e412d41c9c..3af866db6bd 100644
Binary files a/icons/mob/screen_slimecore.dmi and b/icons/mob/screen_slimecore.dmi differ
diff --git a/icons/mob/screen_white.dmi b/icons/mob/screen_white.dmi
index a30d30bd3ef..8288217dcd0 100644
Binary files a/icons/mob/screen_white.dmi and b/icons/mob/screen_white.dmi differ
diff --git a/icons/mob/species/drask/helmet.dmi b/icons/mob/species/drask/helmet.dmi
index df3929ddd08..9e8953e4c4f 100644
Binary files a/icons/mob/species/drask/helmet.dmi and b/icons/mob/species/drask/helmet.dmi differ
diff --git a/icons/mob/species/drask/suit.dmi b/icons/mob/species/drask/suit.dmi
index 37c03b3da9e..b7631041271 100644
Binary files a/icons/mob/species/drask/suit.dmi and b/icons/mob/species/drask/suit.dmi differ
diff --git a/icons/mob/species/skrell/helmet.dmi b/icons/mob/species/skrell/helmet.dmi
index 91456b5d203..d8a5beaf448 100644
Binary files a/icons/mob/species/skrell/helmet.dmi and b/icons/mob/species/skrell/helmet.dmi differ
diff --git a/icons/mob/species/skrell/suit.dmi b/icons/mob/species/skrell/suit.dmi
index 8057e0643bc..d0a12f2d0da 100644
Binary files a/icons/mob/species/skrell/suit.dmi and b/icons/mob/species/skrell/suit.dmi differ
diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi
index 1b0e1213dab..37d312d3133 100644
Binary files a/icons/mob/species/tajaran/helmet.dmi and b/icons/mob/species/tajaran/helmet.dmi differ
diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi
index 61e69d48a1e..eedf3501cb1 100644
Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ
diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi
index 267e6653449..4ad3b228849 100644
Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ
diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi
index e0d32323ebf..062c1b86db3 100644
Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ
diff --git a/icons/mob/species/vox/collar.dmi b/icons/mob/species/vox/collar.dmi
new file mode 100644
index 00000000000..c0b8c6ba936
Binary files /dev/null and b/icons/mob/species/vox/collar.dmi differ
diff --git a/icons/mob/species/vox/eyes.dmi b/icons/mob/species/vox/eyes.dmi
index f761fb361a7..7fb0e339cb7 100644
Binary files a/icons/mob/species/vox/eyes.dmi and b/icons/mob/species/vox/eyes.dmi differ
diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi
index b8203a5623d..930e24dfa86 100644
Binary files a/icons/mob/species/vox/head.dmi and b/icons/mob/species/vox/head.dmi differ
diff --git a/icons/mob/species/vox/helmet.dmi b/icons/mob/species/vox/helmet.dmi
index f80312633f0..05c31e1e1d6 100644
Binary files a/icons/mob/species/vox/helmet.dmi and b/icons/mob/species/vox/helmet.dmi differ
diff --git a/icons/mob/species/vox/mask.dmi b/icons/mob/species/vox/mask.dmi
index cd9c224051b..dcf01b87eb5 100644
Binary files a/icons/mob/species/vox/mask.dmi and b/icons/mob/species/vox/mask.dmi differ
diff --git a/icons/mob/species/vox/shoes.dmi b/icons/mob/species/vox/shoes.dmi
index 2e6b182ceb2..f3cc54d72e0 100644
Binary files a/icons/mob/species/vox/shoes.dmi and b/icons/mob/species/vox/shoes.dmi differ
diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi
index 895de207c1e..bea5f5904ae 100644
Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ
diff --git a/icons/mob/species/vox/uniform.dmi b/icons/mob/species/vox/uniform.dmi
index 5df540c49bf..684168c6608 100644
Binary files a/icons/mob/species/vox/uniform.dmi and b/icons/mob/species/vox/uniform.dmi differ
diff --git a/icons/mob/species/vulpkanin/helmet.dmi b/icons/mob/species/vulpkanin/helmet.dmi
index 599f248db03..9be69155ee3 100644
Binary files a/icons/mob/species/vulpkanin/helmet.dmi and b/icons/mob/species/vulpkanin/helmet.dmi differ
diff --git a/icons/mob/species/vulpkanin/suit.dmi b/icons/mob/species/vulpkanin/suit.dmi
index 31b6d96f4cd..ad946a3805b 100644
Binary files a/icons/mob/species/vulpkanin/suit.dmi and b/icons/mob/species/vulpkanin/suit.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index 6fed8c42c66..28096d4e1a4 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/obj/Cryogenic2.dmi b/icons/obj/Cryogenic2.dmi
index 0401a41401f..88533a5d928 100644
Binary files a/icons/obj/Cryogenic2.dmi and b/icons/obj/Cryogenic2.dmi differ
diff --git a/icons/obj/assemblies.dmi b/icons/obj/assemblies.dmi
index a8d8e668828..2fd457f5638 100644
Binary files a/icons/obj/assemblies.dmi and b/icons/obj/assemblies.dmi differ
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index ccf3bad52b5..40f5b5ddc17 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ
diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi
index 6ad7d94bda7..0fc42d7bd4d 100644
Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 3c2ea5a0990..21205081639 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index 148bf8b21a1..1fefc0259e5 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 05ccd754f9d..8aacc4a4178 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/cooking_machines.dmi b/icons/obj/cooking_machines.dmi
index 10fee80e60d..9b3031ed5f8 100644
Binary files a/icons/obj/cooking_machines.dmi and b/icons/obj/cooking_machines.dmi differ
diff --git a/icons/obj/custom_items.dmi b/icons/obj/custom_items.dmi
index a2c5117d204..53724fd9706 100644
Binary files a/icons/obj/custom_items.dmi and b/icons/obj/custom_items.dmi differ
diff --git a/icons/obj/doors/Doorsand.dmi b/icons/obj/doors/Doorsand.dmi
index 0cd24efc42d..9c905d25442 100644
Binary files a/icons/obj/doors/Doorsand.dmi and b/icons/obj/doors/Doorsand.dmi differ
diff --git a/icons/obj/doors/door_assembly.dmi b/icons/obj/doors/door_assembly.dmi
index db174eb329f..2c927cb8047 100644
Binary files a/icons/obj/doors/door_assembly.dmi and b/icons/obj/doors/door_assembly.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index 36ba65a32e3..b1c332e6d75 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi
new file mode 100644
index 00000000000..6825f6c652d
Binary files /dev/null and b/icons/obj/food/containers.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index b2ff355592b..4e6e07de79a 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi
index e0b3b047628..ad8268ad59d 100644
Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ
diff --git a/icons/obj/hypo.dmi b/icons/obj/hypo.dmi
index fe42acbe4d2..6baa7869c75 100644
Binary files a/icons/obj/hypo.dmi and b/icons/obj/hypo.dmi differ
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index bf752f1ca21..301a990639e 100644
Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ
diff --git a/icons/obj/lavaland/survival_pod.dmi b/icons/obj/lavaland/survival_pod.dmi
new file mode 100644
index 00000000000..62aad7854d2
Binary files /dev/null and b/icons/obj/lavaland/survival_pod.dmi differ
diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi
index ffa5d773b97..6d5a5b70d41 100644
Binary files a/icons/obj/module.dmi and b/icons/obj/module.dmi differ
diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi
index 049172bf356..b4956c33a9e 100644
Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ
diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi
index 42ba9cf7f29..25138117609 100644
Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 424cf671e88..88161a20b5c 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi
index 6b691557229..b692f566df1 100644
Binary files a/icons/obj/telescience.dmi and b/icons/obj/telescience.dmi differ
diff --git a/icons/obj/trash.dmi b/icons/obj/trash.dmi
index faea5fe4180..6edd905c554 100644
Binary files a/icons/obj/trash.dmi and b/icons/obj/trash.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index 01609b50824..2c9a230d1df 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ
diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi
index cb1c5e0ded3..4baa2b25ae6 100755
Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ
diff --git a/interface/interface.dm b/interface/interface.dm
index 81fe75b269b..f144b225160 100644
--- a/interface/interface.dm
+++ b/interface/interface.dm
@@ -10,7 +10,7 @@
else
src << link(config.wikiurl)
else
- src << "The wiki URL is not set in the server configuration. "
+ to_chat(src, "The wiki URL is not set in the server configuration. ")
return
/client/verb/changes()
@@ -51,7 +51,7 @@
return
src << link(config.forumurl)
else
- src << "The forum URL is not set in the server configuration. "
+ to_chat(src, "The forum URL is not set in the server configuration. ")
return
/client/verb/rules()
@@ -63,7 +63,7 @@
return
src << link(config.rulesurl)
else
- src << "The rules URL is not set in the server configuration. "
+ to_chat(src, "The rules URL is not set in the server configuration. ")
return
/client/verb/donate()
@@ -75,7 +75,7 @@
return
src << link(config.donationsurl)
else
- src << "The rules URL is not set in the server configuration. "
+ to_chat(src, "The rules URL is not set in the server configuration. ")
return
/client/verb/hotkeys_help()
@@ -94,7 +94,7 @@ Admin:
mob.hotkey_help()
if(check_rights(R_MOD|R_ADMIN,0))
- src << adminhotkeys
+ to_chat(src, adminhotkeys)
/mob/proc/hotkey_help()
var/hotkey_mode = {"
@@ -151,8 +151,8 @@ Any-Mode: (hotkey doesn't need to be on)
\tF4 = Me
"}
- src << hotkey_mode
- src << other
+ to_chat(src, hotkey_mode)
+ to_chat(src, other)
/mob/living/silicon/robot/hotkey_help()
var/hotkey_mode = {"
@@ -203,15 +203,15 @@ Any-Mode: (hotkey doesn't need to be on)
\tF4 = Me
"}
- src << hotkey_mode
- src << other
+ to_chat(src, hotkey_mode)
+ to_chat(src, other)
//adv. hotkey mode verbs, vars located in /code/modules/client/client defines.dm
/client/verb/hotkey_toggle()//toggles hotkey mode between on and off, respects selected type
set name = ".Toggle Hotkey Mode"
hotkeyon = !hotkeyon//toggle the var
- usr << (hotkeyon ? "Hotkey mode enabled." : "Hotkey mode disabled.")//feedback to the user
+ to_chat(usr, (hotkeyon ? "Hotkey mode enabled." : "Hotkey mode disabled."))//feedback to the user
if(hotkeyon)//using an if statement because I don't want to clutter winset() with ? operators
winset(usr, "mainwindow.hotkey_toggle", "is-checked=true")//checks the button
@@ -233,4 +233,4 @@ Any-Mode: (hotkey doesn't need to be on)
var/hotkeyname = hotkeys[hotkeyon ? "on" : "off"]//get the name of the hotkey, to not clutter winset() to much
winset(usr, "mainwindow", "macro=[hotkeyname]")//change the hotkey
- usr << "Hotkey mode changed to [hotkeytype]."
+ to_chat(usr, "Hotkey mode changed to [hotkeytype].")
diff --git a/interface/skin.dmf b/interface/skin.dmf
index d3ba4e0efc5..4d41549359c 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -1,351 +1,351 @@
macro "AZERTYoff"
- elem
+ elem "AZRFF-TAB"
name = "TAB"
command = ".Toggle-hotkey-mode"
is-disabled = false
- elem
+ elem "AZRFF-CENTER+REP"
name = "CENTER+REP"
command = ".center"
is-disabled = false
- elem
+ elem "AZRFF-NORTHEAST"
name = "NORTHEAST"
command = ".northeast"
is-disabled = false
- elem
+ elem "AZRFF-SOUTHEAST"
name = "SOUTHEAST"
command = ".southeast"
is-disabled = false
- elem
+ elem "AZRFF-SOUTHWEST"
name = "SOUTHWEST"
command = ".southwest"
is-disabled = false
- elem
+ elem "AZRFF-NORTHWEST"
name = "NORTHWEST"
command = ".northwest"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+WEST"
name = "CTRL+WEST"
command = "westface"
is-disabled = false
- elem
+ elem "AZRFF-WEST+REP"
name = "WEST+REP"
command = ".west"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+NORTH"
name = "CTRL+NORTH"
command = "northface"
is-disabled = false
- elem
+ elem "AZRFF-NORTH+REP"
name = "NORTH+REP"
command = ".north"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+EAST"
name = "CTRL+EAST"
command = "eastface"
is-disabled = false
- elem
+ elem "AZRFF-EAST+REP"
name = "EAST+REP"
command = ".east"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+SOUTH"
name = "CTRL+SOUTH"
command = "southface"
is-disabled = false
- elem
+ elem "AZRFF-SOUTH+REP"
name = "SOUTH+REP"
command = ".south"
is-disabled = false
- elem
+ elem "AZRFF-INSERT"
name = "INSERT"
command = "a-intent right"
is-disabled = false
- elem
+ elem "AZRFF-DELETE"
name = "DELETE"
command = "delete-key-pressed"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+1"
name = "CTRL+1"
command = "a-intent help"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+2"
name = "CTRL+2"
command = "a-intent disarm"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+3"
name = "CTRL+3"
command = "a-intent grab"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+4"
name = "CTRL+4"
command = "a-intent harm"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+A"
name = "CTRL+A"
command = ".northwest"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+D+REP"
name = "CTRL+D+REP"
command = ".east"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+B"
name = "CTRL+B"
command = "resist"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+E"
name = "CTRL+E"
command = "quick-equip"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+F"
name = "CTRL+F"
command = "a-intent left"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+G"
name = "CTRL+G"
command = "a-intent right"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+Q+REP"
name = "CTRL+Q+REP"
command = ".west"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+R"
name = "CTRL+R"
command = ".southwest"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+S+REP"
name = "CTRL+S+REP"
command = ".south"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+W"
name = "CTRL+W"
command = "Activate-Held-Object"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+X"
name = "CTRL+X"
command = ".northeast"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+Y"
name = "CTRL+Y"
command = "Activate-Held-Object"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+Z+REP"
name = "CTRL+Z+REP"
command = ".north"
is-disabled = false
- elem
+ elem "AZRFF-F1"
name = "F1"
command = "adminhelp"
is-disabled = false
- elem
+ elem "AZRFF-CTRL+SHIFT+F1+REP"
name = "CTRL+SHIFT+F1+REP"
command = ".options"
is-disabled = false
- elem
+ elem "AZRFF-F2"
name = "F2"
command = "ooc"
is-disabled = false
- elem
+ elem "AZRFF-F2+REP"
name = "F2+REP"
command = ".screenshot auto"
is-disabled = false
- elem
+ elem "AZRFF-SHIFT+F2+REP"
name = "SHIFT+F2+REP"
command = ".screenshot"
is-disabled = false
- elem
+ elem "AZRFF-F3"
name = "F3"
command = ".say"
is-disabled = false
- elem
+ elem "AZRFF-F4"
name = "F4"
command = ".me"
is-disabled = false
- elem
+ elem "AZRFF-F5"
name = "F5"
command = "asay"
is-disabled = false
- elem
+ elem "AZRFF-F6"
name = "F6"
command = "Aghost"
is-disabled = false
- elem
+ elem "AZRFF-F7"
name = "F7"
command = "player-panel-new"
is-disabled = false
- elem
+ elem "AZRFF-F8"
name = "F8"
command = "admin-pm-key"
is-disabled = false
- elem
+ elem "AZRFF-F9"
name = "F9"
command = "Invisimin"
is-disabled = false
- elem
+ elem "AZRFF-F12"
name = "F12"
command = "F12"
is-disabled = false
macro "AZERTYon"
- elem
+ elem "AZRON-TAB"
name = "TAB"
command = ".Toggle-hotkey-mode"
is-disabled = false
- elem
+ elem "AZRON-CENTER+REP"
name = "CENTER+REP"
command = ".center"
is-disabled = false
- elem
+ elem "AZRON-NORTHEAST"
name = "NORTHEAST"
command = ".northeast"
is-disabled = false
- elem
+ elem "AZRON-SOUTHEAST"
name = "SOUTHEAST"
command = ".southeast"
is-disabled = false
- elem
+ elem "AZRON-SOUTHWEST"
name = "SOUTHWEST"
command = ".southwest"
is-disabled = false
- elem
+ elem "AZRON-NORTHWEST"
name = "NORTHWEST"
command = ".northwest"
is-disabled = false
- elem
+ elem "AZRON-CTRL+WEST"
name = "CTRL+WEST"
command = "westface"
is-disabled = false
- elem
+ elem "AZRON-WEST+REP"
name = "WEST+REP"
command = ".west"
is-disabled = false
- elem
+ elem "AZRON-CTRL+NORTH"
name = "CTRL+NORTH"
command = "northface"
is-disabled = false
- elem
+ elem "AZRON-NORTH+REP"
name = "NORTH+REP"
command = ".north"
is-disabled = false
- elem
+ elem "AZRON-CTRL+EAST"
name = "CTRL+EAST"
command = "eastface"
is-disabled = false
- elem
+ elem "AZRON-EAST+REP"
name = "EAST+REP"
command = ".east"
is-disabled = false
- elem
+ elem "AZRON-CTRL+SOUTH"
name = "CTRL+SOUTH"
command = "southface"
is-disabled = false
- elem
+ elem "AZRON-SOUTH+REP"
name = "SOUTH+REP"
command = ".south"
is-disabled = false
- elem
+ elem "AZRON-INSERT"
name = "INSERT"
command = "a-intent right"
is-disabled = false
- elem
+ elem "AZRON-DELETE"
name = "DELETE"
command = "delete-key-pressed"
is-disabled = false
- elem
+ elem "AZRON-1"
name = "1"
command = "a-intent help"
is-disabled = false
- elem
+ elem "AZRON-CTRL+1"
name = "CTRL+1"
command = "a-intent help"
is-disabled = false
- elem
+ elem "AZRON-2"
name = "2"
command = "a-intent disarm"
is-disabled = false
- elem
+ elem "AZRON-CTRL+2"
name = "CTRL+2"
command = "a-intent disarm"
is-disabled = false
- elem
+ elem "AZRON-3"
name = "3"
command = "a-intent grab"
is-disabled = false
- elem
+ elem "AZRON-CTRL+3"
name = "CTRL+3"
command = "a-intent grab"
is-disabled = false
- elem
+ elem "AZRON-4"
name = "4"
command = "a-intent harm"
is-disabled = false
- elem
+ elem "AZRON-CTRL+4"
name = "CTRL+4"
command = "a-intent harm"
is-disabled = false
- elem
+ elem "AZRON-A"
name = "A"
command = ".northwest"
is-disabled = false
- elem
+ elem "AZRON-CTRL+A"
name = "CTRL+A"
command = ".northwest"
is-disabled = false
- elem
+ elem "AZRON-D+REP"
name = "D+REP"
command = ".east"
is-disabled = false
- elem
+ elem "AZRON-CTRL+D+REP"
name = "CTRL+D+REP"
command = ".east"
is-disabled = false
- elem
+ elem "AZRON-CTRL+B"
name = "CTRL+B"
command = "resist"
is-disabled = false
- elem
+ elem "AZRON-E"
name = "E"
command = "quick-equip"
is-disabled = false
- elem
+ elem "AZRON-CTRL+E"
name = "CTRL+E"
command = "quick-equip"
is-disabled = false
- elem
+ elem "AZRON-F"
name = "F"
command = "a-intent left"
is-disabled = false
- elem
+ elem "AZRON-CTRL+F"
name = "CTRL+F"
command = "a-intent left"
is-disabled = false
- elem
+ elem "AZRON-G"
name = "G"
command = "a-intent right"
is-disabled = false
- elem
+ elem "AZRON-CTRL+G"
name = "CTRL+G"
command = "a-intent right"
is-disabled = false
- elem
+ elem "AZRON-H"
name = "H"
command = "holster"
is-disabled = false
- elem
+ elem "AZRON-CTRL+H"
name = "CTRL+H"
command = "holster"
is-disabled = false
- elem
+ elem "AZRON-Q+REP"
name = "Q+REP"
command = ".west"
is-disabled = false
- elem
+ elem "AZRON-CTRL+Q+REP"
name = "CTRL+Q+REP"
command = ".west"
is-disabled = false
- elem
+ elem "AZRON-R"
name = "R"
command = ".southwest"
is-disabled = false
- elem
+ elem "AZRON-CTRL+R"
name = "CTRL+R"
command = ".southwest"
is-disabled = false
@@ -353,43 +353,43 @@ macro "AZERTYon"
name = "S+REP"
command = ".south"
is-disabled = false
- elem
+ elem "AZRON-CTRL+S+REP"
name = "CTRL+S+REP"
command = ".south"
is-disabled = false
- elem
+ elem "AZRON-T"
name = "T"
command = ".say"
is-disabled = false
- elem
+ elem "AZRON-O"
name = "O"
command = "ooc"
is-disabled = false
- elem
+ elem "AZRON-M"
name = "M"
command = ".me"
is-disabled = false
- elem
+ elem "AZRON-W"
name = "W"
command = "Activate-Held-Object"
is-disabled = false
- elem
+ elem "AZRON-CTRL+W"
name = "CTRL+W"
command = "Activate-Held-Object"
is-disabled = false
- elem
+ elem "AZRON-X"
name = "X"
command = ".northeast"
is-disabled = false
- elem
+ elem "AZRON-CTRL+X"
name = "CTRL+X"
command = ".northeast"
is-disabled = false
- elem
+ elem "AZRON-Y"
name = "Y"
command = "Activate-Held-Object"
is-disabled = false
- elem
+ elem "AZRON-CTRL+Y"
name = "CTRL+Y"
command = "Activate-Held-Object"
is-disabled = false
@@ -397,217 +397,217 @@ macro "AZERTYon"
name = "Z+REP"
command = ".north"
is-disabled = false
- elem
+ elem "AZRON-CTRL+Z+REP"
name = "CTRL+Z+REP"
command = ".north"
is-disabled = false
- elem
+ elem "AZRON-F1"
name = "F1"
command = "adminhelp"
is-disabled = false
- elem
+ elem "AZRON-CTRL+SHIFT+F1+REP"
name = "CTRL+SHIFT+F1+REP"
command = ".options"
is-disabled = false
- elem
+ elem "AZRON-F2"
name = "F2"
command = "ooc"
is-disabled = false
- elem
+ elem "AZRON-F2+REP"
name = "F2+REP"
command = ".screenshot auto"
is-disabled = false
- elem
+ elem "AZRON-SHIFT+F2+REP"
name = "SHIFT+F2+REP"
command = ".screenshot"
is-disabled = false
- elem
+ elem "AZRON-F3"
name = "F3"
command = ".say"
is-disabled = false
- elem
+ elem "AZRON-F4"
name = "F4"
command = ".me"
is-disabled = false
- elem
+ elem "AZRON-F5"
name = "F5"
command = "asay"
is-disabled = false
- elem
+ elem "AZRON-F6"
name = "F6"
command = "Aghost"
is-disabled = false
- elem
+ elem "AZRON-F7"
name = "F7"
command = "player-panel-new"
is-disabled = false
- elem
+ elem "AZRON-F8"
name = "F8"
command = "admin-pm-key"
is-disabled = false
- elem
+ elem "AZRON-F9"
name = "F9"
command = "Invisimin"
is-disabled = false
- elem
+ elem "AZRON-F12"
name = "F12"
command = "F12"
is-disabled = false
macro "borghotkeymode"
- elem
+ elem "BRGHK-TAB"
name = "TAB"
command = ".winset \"mainwindow.macro=borgmacro hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5\""
is-disabled = false
- elem
+ elem "BRGHK-CENTER+REP"
name = "CENTER+REP"
command = ".center"
is-disabled = false
- elem
+ elem "BRGHK-NORTHEAST"
name = "NORTHEAST"
command = ".northeast"
is-disabled = false
- elem
+ elem "BRGHK-SOUTHEAST"
name = "SOUTHEAST"
command = ".southeast"
is-disabled = false
- elem
+ elem "BRGHK-NORTHWEST"
name = "NORTHWEST"
command = "unequip-module"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+WEST"
name = "CTRL+WEST"
command = "westface"
is-disabled = false
- elem
+ elem "BRGHK-WEST+REP"
name = "WEST+REP"
command = ".west"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+NORTH"
name = "CTRL+NORTH"
command = "northface"
is-disabled = false
- elem
+ elem "BRGHK-NORTH+REP"
name = "NORTH+REP"
command = ".north"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+EAST"
name = "CTRL+EAST"
command = "eastface"
is-disabled = false
- elem
+ elem "BRGHK-EAST+REP"
name = "EAST+REP"
command = ".east"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+SOUTH"
name = "CTRL+SOUTH"
command = "southface"
is-disabled = false
- elem
+ elem "BRGHK-SOUTH+REP"
name = "SOUTH+REP"
command = ".south"
is-disabled = false
- elem
+ elem "BRGHK-INSERT"
name = "INSERT"
command = "a-intent right"
is-disabled = false
- elem
+ elem "BRGHK-DELETE"
name = "DELETE"
command = "delete-key-pressed"
is-disabled = false
- elem
+ elem "BRGHK-1"
name = "1"
command = "toggle-module 1"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+1"
name = "CTRL+1"
command = "toggle-module 1"
is-disabled = false
- elem
+ elem "BRGHK-2"
name = "2"
command = "toggle-module 2"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+2"
name = "CTRL+2"
command = "toggle-module 2"
is-disabled = false
- elem
+ elem "BRGHK-3"
name = "3"
command = "toggle-module 3"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+3"
name = "CTRL+3"
command = "toggle-module 3"
is-disabled = false
- elem
+ elem "BRGHK-4"
name = "4"
command = "a-intent left"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+4"
name = "CTRL+4"
command = "a-intent left"
is-disabled = false
- elem
+ elem "BRGHK-A+REP"
name = "A+REP"
command = ".west"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+A+REP"
name = "CTRL+A+REP"
command = ".west"
is-disabled = false
- elem
+ elem "BRGHK-B"
name = "B"
command = "resist"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+B"
name = "CTRL+B"
command = "resist"
is-disabled = false
- elem
+ elem "BRGHK-T"
name = "T"
command = ".say"
is-disabled = false
- elem
+ elem "BRGHK-O"
name = "O"
command = "ooc"
is-disabled = false
- elem
+ elem "BRGHK-M"
name = "M"
command = ".me"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+O"
name = "CTRL+O"
command = "ooc"
is-disabled = false
- elem
+ elem "BRGHK-D+REP"
name = "D+REP"
command = ".east"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+D+REP"
name = "CTRL+D+REP"
command = ".east"
is-disabled = false
- elem
+ elem "BRGHK-F"
name = "F"
command = "a-intent left"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+F"
name = "CTRL+F"
command = "a-intent left"
is-disabled = false
- elem
+ elem "BRGHK-G"
name = "G"
command = "a-intent right"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+G"
name = "CTRL+G"
command = "a-intent right"
is-disabled = false
- elem
+ elem "BRGHK-Q"
name = "Q"
command = "unequip-module"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+Q"
name = "CTRL+Q"
command = "unequip-module"
is-disabled = false
@@ -615,7 +615,7 @@ macro "borghotkeymode"
name = "S+REP"
command = ".south"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+S+REP"
name = "CTRL+S+REP"
command = ".south"
is-disabled = false
@@ -623,451 +623,451 @@ macro "borghotkeymode"
name = "W+REP"
command = ".north"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+W+REP"
name = "CTRL+W+REP"
command = ".north"
is-disabled = false
- elem
+ elem "BRGHK-X"
name = "X"
command = ".northeast"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+X"
name = "CTRL+X"
command = ".northeast"
is-disabled = false
- elem
+ elem "BRGHK-Y"
name = "Y"
command = "Activate-Held-Object"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+Y"
name = "CTRL+Y"
command = "Activate-Held-Object"
is-disabled = false
- elem
+ elem "BRGHK-Z"
name = "Z"
command = "Activate-Held-Object"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+Z"
name = "CTRL+Z"
command = "Activate-Held-Object"
is-disabled = false
- elem
+ elem "BRGHK-F1"
name = "F1"
command = "adminhelp"
is-disabled = false
- elem
+ elem "BRGHK-CTRL+SHIFT+F1+REP"
name = "CTRL+SHIFT+F1+REP"
command = ".options"
is-disabled = false
- elem
+ elem "BRGHK-F2"
name = "F2"
command = "ooc"
is-disabled = false
- elem
+ elem "BRGHK-F2+REP"
name = "F2+REP"
command = ".screenshot auto"
is-disabled = false
- elem
+ elem "BRGHK-SHIFT+F2+REP"
name = "SHIFT+F2+REP"
command = ".screenshot"
is-disabled = false
- elem
+ elem "BRGHK-F3"
name = "F3"
command = ".say"
is-disabled = false
- elem
+ elem "BRGHK-F4"
name = "F4"
command = ".me"
is-disabled = false
- elem
+ elem "BRGHK-F5"
name = "F5"
command = "asay"
is-disabled = false
- elem
+ elem "BRGHK-F6"
name = "F6"
command = "Aghost"
is-disabled = false
- elem
+ elem "BRGHK-F7"
name = "F7"
command = "player-panel-new"
is-disabled = false
- elem
+ elem "BRGHK-F8"
name = "F8"
command = "admin-pm-key"
is-disabled = false
- elem
+ elem "BRGHK-F9"
name = "F9"
command = "Invisimin"
is-disabled = false
- elem
+ elem "BRGHK-F12"
name = "F12"
command = "F12"
is-disabled = false
macro "macro"
- elem
+ elem "MACRO-TAB"
name = "TAB"
command = ".Toggle-hotkey-mode"
is-disabled = false
- elem
+ elem "MACRO-CENTER+REP"
name = "CENTER+REP"
command = ".center"
is-disabled = false
- elem
+ elem "MACRO-NORTHEAST"
name = "NORTHEAST"
command = ".northeast"
is-disabled = false
- elem
+ elem "MACRO-SOUTHEAST"
name = "SOUTHEAST"
command = ".southeast"
is-disabled = false
- elem
+ elem "MACRO-SOUTHWEST"
name = "SOUTHWEST"
command = ".southwest"
is-disabled = false
- elem
+ elem "MACRO-NORTHWEST"
name = "NORTHWEST"
command = ".northwest"
is-disabled = false
- elem
+ elem "MACRO-CTRL+WEST"
name = "CTRL+WEST"
command = "westface"
is-disabled = false
- elem
+ elem "MACRO-WEST+REP"
name = "WEST+REP"
command = ".west"
is-disabled = false
- elem
+ elem "MACRO-CTRL+NORTH"
name = "CTRL+NORTH"
command = "northface"
is-disabled = false
- elem
+ elem "MACRO-NORTH+REP"
name = "NORTH+REP"
command = ".north"
is-disabled = false
- elem
+ elem "MACRO-CTRL+EAST"
name = "CTRL+EAST"
command = "eastface"
is-disabled = false
- elem
+ elem "MACRO-EAST+REP"
name = "EAST+REP"
command = ".east"
is-disabled = false
- elem
+ elem "MACRO-CTRL+SOUTH"
name = "CTRL+SOUTH"
command = "southface"
is-disabled = false
- elem
+ elem "MACRO-SOUTH+REP"
name = "SOUTH+REP"
command = ".south"
is-disabled = false
- elem
+ elem "MACRO-INSERT"
name = "INSERT"
command = "a-intent right"
is-disabled = false
- elem
+ elem "MACRO-DELETE"
name = "DELETE"
command = "delete-key-pressed"
is-disabled = false
- elem
+ elem "MACRO-CTRL+1"
name = "CTRL+1"
command = "a-intent help"
is-disabled = false
- elem
+ elem "MACRO-CTRL+2"
name = "CTRL+2"
command = "a-intent disarm"
is-disabled = false
- elem
+ elem "MACRO-CTRL+3"
name = "CTRL+3"
command = "a-intent grab"
is-disabled = false
- elem
+ elem "MACRO-CTRL+4"
name = "CTRL+4"
command = "a-intent harm"
is-disabled = false
- elem
+ elem "MACRO-CTRL+A+REP"
name = "CTRL+A+REP"
command = ".west"
is-disabled = false
- elem
+ elem "MACRO-CTRL+D+REP"
name = "CTRL+D+REP"
command = ".east"
is-disabled = false
- elem
+ elem "MACRO-CTRL+B"
name = "CTRL+B"
command = "resist"
is-disabled = false
- elem
+ elem "MACRO-CTRL+E"
name = "CTRL+E"
command = "quick-equip"
is-disabled = false
- elem
+ elem "MACRO-CTRL+F"
name = "CTRL+F"
command = "a-intent left"
is-disabled = false
- elem
+ elem "MACRO-CTRL+G"
name = "CTRL+G"
command = "a-intent right"
is-disabled = false
- elem
+ elem "MACRO-CTRL+Q"
name = "CTRL+Q"
command = ".northwest"
is-disabled = false
- elem
+ elem "MACRO-CTRL+R"
name = "CTRL+R"
command = ".southwest"
is-disabled = false
- elem
+ elem "MACRO-CTRL+S+REP"
name = "CTRL+S+REP"
command = ".south"
is-disabled = false
- elem
+ elem "MACRO-CTRL+W+REP"
name = "CTRL+W+REP"
command = ".north"
is-disabled = false
- elem
+ elem "MACRO-CTRL+X"
name = "CTRL+X"
command = ".northeast"
is-disabled = false
- elem
+ elem "MACRO-CTRL+Y"
name = "CTRL+Y"
command = "Activate-Held-Object"
is-disabled = false
- elem
+ elem "MACRO-CTRL+Z"
name = "CTRL+Z"
command = "Activate-Held-Object"
is-disabled = false
- elem
+ elem "MACRO-F1"
name = "F1"
command = "adminhelp"
is-disabled = false
- elem
+ elem "MACRO-CTRL+SHIFT+F1+REP"
name = "CTRL+SHIFT+F1+REP"
command = ".options"
is-disabled = false
- elem
+ elem "MACRO-F2"
name = "F2"
command = "ooc"
is-disabled = false
- elem
+ elem "MACRO-F2+REP"
name = "F2+REP"
command = ".screenshot auto"
is-disabled = false
- elem
+ elem "MACRO-SHIFT+F2+REP"
name = "SHIFT+F2+REP"
command = ".screenshot"
is-disabled = false
- elem
+ elem "MACRO-F3"
name = "F3"
command = ".say"
is-disabled = false
- elem
+ elem "MACRO-F4"
name = "F4"
command = ".me"
is-disabled = false
- elem
+ elem "MACRO-F5"
name = "F5"
command = "asay"
is-disabled = false
- elem
+ elem "MACRO-F6"
name = "F6"
command = "Aghost"
is-disabled = false
- elem
+ elem "MACRO-F7"
name = "F7"
command = "player-panel-new"
is-disabled = false
- elem
+ elem "MACRO-F8"
name = "F8"
command = "admin-pm-key"
is-disabled = false
- elem
+ elem "MACRO-F9"
name = "F9"
command = "Invisimin"
is-disabled = false
- elem
+ elem "MACRO-F12"
name = "F12"
command = "F12"
is-disabled = false
macro "hotkeymode"
- elem
+ elem "HKMODE-TAB"
name = "TAB"
command = ".Toggle-hotkey-mode"
is-disabled = false
- elem
+ elem "HKMODE-CENTER+REP"
name = "CENTER+REP"
command = ".center"
is-disabled = false
- elem
+ elem "HKMODE-NORTHEAST"
name = "NORTHEAST"
command = ".northeast"
is-disabled = false
- elem
+ elem "HKMODE-SOUTHEAST"
name = "SOUTHEAST"
command = ".southeast"
is-disabled = false
- elem
+ elem "HKMODE-SOUTHWEST"
name = "SOUTHWEST"
command = ".southwest"
is-disabled = false
- elem
+ elem "HKMODE-NORTHWEST"
name = "NORTHWEST"
command = ".northwest"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+WEST"
name = "CTRL+WEST"
command = "westface"
is-disabled = false
- elem
+ elem "HKMODE-WEST+REP"
name = "WEST+REP"
command = ".west"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+NORTH"
name = "CTRL+NORTH"
command = "northface"
is-disabled = false
- elem
+ elem "HKMODE-NORTH+REP"
name = "NORTH+REP"
command = ".north"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+EAST"
name = "CTRL+EAST"
command = "eastface"
is-disabled = false
- elem
+ elem "HKMODE-EAST+REP"
name = "EAST+REP"
command = ".east"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+SOUTH"
name = "CTRL+SOUTH"
command = "southface"
is-disabled = false
- elem
+ elem "HKMODE-SOUTH+REP"
name = "SOUTH+REP"
command = ".south"
is-disabled = false
- elem
+ elem "HKMODE-INSERT"
name = "INSERT"
command = "a-intent right"
is-disabled = false
- elem
+ elem "HKMODE-DELETE"
name = "DELETE"
command = "delete-key-pressed"
is-disabled = false
- elem
+ elem "HKMODE-1"
name = "1"
command = "a-intent help"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+1"
name = "CTRL+1"
command = "a-intent help"
is-disabled = false
- elem
+ elem "HKMODE-2"
name = "2"
command = "a-intent disarm"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+2"
name = "CTRL+2"
command = "a-intent disarm"
is-disabled = false
- elem
+ elem "HKMODE-3"
name = "3"
command = "a-intent grab"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+3"
name = "CTRL+3"
command = "a-intent grab"
is-disabled = false
- elem
+ elem "HKMODE-4"
name = "4"
command = "a-intent harm"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+4"
name = "CTRL+4"
command = "a-intent harm"
is-disabled = false
- elem
+ elem "HKMODE-T"
name = "T"
command = ".say"
is-disabled = false
- elem
+ elem "HKMODE-O"
name = "O"
command = "ooc"
is-disabled = false
- elem
+ elem "HKMODE-M"
name = "M"
command = ".me"
is-disabled = false
- elem
+ elem "HKMODE-A+REP"
name = "A+REP"
command = ".west"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+A+REP"
name = "CTRL+A+REP"
command = ".west"
is-disabled = false
- elem
+ elem "HKMODE-D+REP"
name = "D+REP"
command = ".east"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+D+REP"
name = "CTRL+D+REP"
command = ".east"
is-disabled = false
- elem
+ elem "HKMODE-B"
name = "B"
command = "resist"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+B"
name = "CTRL+B"
command = "resist"
is-disabled = false
- elem
+ elem "HKMODE-E"
name = "E"
command = "quick-equip"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+E"
name = "CTRL+E"
command = "quick-equip"
is-disabled = false
- elem
+ elem "HKMODE-F"
name = "F"
command = "a-intent left"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+F"
name = "CTRL+F"
command = "a-intent left"
is-disabled = false
- elem
+ elem "HKMODE-G"
name = "G"
command = "a-intent right"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+G"
name = "CTRL+G"
command = "a-intent right"
is-disabled = false
- elem
+ elem "HKMODE-H"
name = "H"
command = "holster"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+H"
name = "CTRL+H"
command = "holster"
is-disabled = false
- elem
+ elem "HKMODE-Q"
name = "Q"
command = ".northwest"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+Q"
name = "CTRL+Q"
command = ".northwest"
is-disabled = false
- elem
+ elem "HKMODE-R"
name = "R"
command = ".southwest"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+R"
name = "CTRL+R"
command = ".southwest"
is-disabled = false
@@ -1075,11 +1075,11 @@ macro "hotkeymode"
name = "S+REP"
command = ".south"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+S+REP"
name = "CTRL+S+REP"
command = ".south"
is-disabled = false
- elem
+ elem "HKMODE-T"
name = "T"
command = ".say"
is-disabled = false
@@ -1087,261 +1087,261 @@ macro "hotkeymode"
name = "W+REP"
command = ".north"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+W+REP"
name = "CTRL+W+REP"
command = ".north"
is-disabled = false
- elem
+ elem "HKMODE-X"
name = "X"
command = ".northeast"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+X"
name = "CTRL+X"
command = ".northeast"
is-disabled = false
- elem
+ elem "HKMODE-Y"
name = "Y"
command = "Activate-Held-Object"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+Y"
name = "CTRL+Y"
command = "Activate-Held-Object"
is-disabled = false
- elem
+ elem "HKMODE-Z"
name = "Z"
command = "Activate-Held-Object"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+Z"
name = "CTRL+Z"
command = "Activate-Held-Object"
is-disabled = false
- elem
+ elem "HKMODE-F1"
name = "F1"
command = "adminhelp"
is-disabled = false
- elem
+ elem "HKMODE-CTRL+SHIFT+F1+REP"
name = "CTRL+SHIFT+F1+REP"
command = ".options"
is-disabled = false
- elem
+ elem "HKMODE-F2"
name = "F2"
command = "ooc"
is-disabled = false
- elem
+ elem "HKMODE-F2+REP"
name = "F2+REP"
command = ".screenshot auto"
is-disabled = false
- elem
+ elem "HKMODE-SHIFT+F2+REP"
name = "SHIFT+F2+REP"
command = ".screenshot"
is-disabled = false
- elem
+ elem "HKMODE-F3"
name = "F3"
command = ".say"
is-disabled = false
- elem
+ elem "HKMODE-F4"
name = "F4"
command = ".me"
is-disabled = false
- elem
+ elem "HKMODE-F5"
name = "F5"
command = "asay"
is-disabled = false
- elem
+ elem "HKMODE-F6"
name = "F6"
command = "Aghost"
is-disabled = false
- elem
+ elem "HKMODE-F7"
name = "F7"
command = "player-panel-new"
is-disabled = false
- elem
+ elem "HKMODE-F8"
name = "F8"
command = "admin-pm-key"
is-disabled = false
- elem
+ elem "HKMODE-F9"
name = "F9"
command = "Invisimin"
is-disabled = false
- elem
+ elem "HKMODE-F12"
name = "F12"
command = "F12"
is-disabled = false
macro "borgmacro"
- elem
+ elem "BRGMACRO-TAB"
name = "TAB"
command = ".winset \"mainwindow.macro=borghotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0\""
is-disabled = false
- elem
+ elem "BRGMACRO-CENTER+REP"
name = "CENTER+REP"
command = ".center"
is-disabled = false
- elem
+ elem "BRGMACRO-NORTHEAST"
name = "NORTHEAST"
command = ".northeast"
is-disabled = false
- elem
+ elem "BRGMACRO-SOUTHEAST"
name = "SOUTHEAST"
command = ".southeast"
is-disabled = false
- elem
+ elem "BRGMACRO-NORTHWEST"
name = "NORTHWEST"
command = "unequip-module"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+WEST"
name = "CTRL+WEST"
command = "westface"
is-disabled = false
- elem
+ elem "BRGMACRO-WEST+REP"
name = "WEST+REP"
command = ".west"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+NORTH"
name = "CTRL+NORTH"
command = "northface"
is-disabled = false
- elem
+ elem "BRGMACRO-NORTH+REP"
name = "NORTH+REP"
command = ".north"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+EAST"
name = "CTRL+EAST"
command = "eastface"
is-disabled = false
- elem
+ elem "BRGMACRO-EAST+REP"
name = "EAST+REP"
command = ".east"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+SOUTH"
name = "CTRL+SOUTH"
command = "southface"
is-disabled = false
- elem
+ elem "BRGMACRO-SOUTH+REP"
name = "SOUTH+REP"
command = ".south"
is-disabled = false
- elem
+ elem "BRGMACRO-INSERT"
name = "INSERT"
command = "a-intent right"
is-disabled = false
- elem
+ elem "BRGMACRO-DELETE"
name = "DELETE"
command = "delete-key-pressed"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+1"
name = "CTRL+1"
command = "toggle-module 1"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+2"
name = "CTRL+2"
command = "toggle-module 2"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+3"
name = "CTRL+3"
command = "toggle-module 3"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+4"
name = "CTRL+4"
command = "a-intent left"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+A+REP"
name = "CTRL+A+REP"
command = ".west"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+B"
name = "CTRL+B"
command = "resist"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+O"
name = "CTRL+O"
command = "ooc"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+D+REP"
name = "CTRL+D+REP"
command = ".east"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+F"
name = "CTRL+F"
command = "a-intent left"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+G"
name = "CTRL+G"
command = "a-intent right"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+Q"
name = "CTRL+Q"
command = "unequip-module"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+S+REP"
name = "CTRL+S+REP"
command = ".south"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+W+REP"
name = "CTRL+W+REP"
command = ".north"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+X"
name = "CTRL+X"
command = ".northeast"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+Y"
name = "CTRL+Y"
command = "Activate-Held-Object"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+Z"
name = "CTRL+Z"
command = "Activate-Held-Object"
is-disabled = false
- elem
+ elem "BRGMACRO-F1"
name = "F1"
command = "adminhelp"
is-disabled = false
- elem
+ elem "BRGMACRO-CTRL+SHIFT+F1+REP"
name = "CTRL+SHIFT+F1+REP"
command = ".options"
is-disabled = false
- elem
+ elem "BRGMACRO-F2"
name = "F2"
command = "ooc"
is-disabled = false
- elem
+ elem "BRGMACRO-F2+REP"
name = "F2+REP"
command = ".screenshot auto"
is-disabled = false
- elem
+ elem "BRGMACRO-SHIFT+F2+REP"
name = "SHIFT+F2+REP"
command = ".screenshot"
is-disabled = false
- elem
+ elem "BRGMACRO-F3"
name = "F3"
command = ".say"
is-disabled = false
- elem
+ elem "BRGMACRO-F4"
name = "F4"
command = ".me"
is-disabled = false
- elem
+ elem "BRGMACRO-F5"
name = "F5"
command = "asay"
is-disabled = false
- elem
+ elem "BRGMACRO-F6"
name = "F6"
command = "Aghost"
is-disabled = false
- elem
+ elem "BRGMACRO-F7"
name = "F7"
command = "player-panel-new"
is-disabled = false
- elem
+ elem "BRGMACRO-F8"
name = "F8"
command = "admin-pm-key"
is-disabled = false
- elem
+ elem "BRGMACRO-F9"
name = "F9"
command = "Invisimin"
is-disabled = false
- elem
+ elem "BRGMACRO-F12"
name = "F12"
command = "F12"
is-disabled = false
@@ -2391,8 +2391,8 @@ window "outputwindow"
macro = ""
menu = ""
on-close = ""
- elem "output"
- type = OUTPUT
+ elem "browseroutput"
+ type = BROWSER
pos = 0,0
size = 640x480
anchor1 = 0,0
@@ -2403,20 +2403,20 @@ window "outputwindow"
text-color = #000000
background-color = #ffffff
is-visible = true
- is-disabled = false
+ is-disabled = true
is-transparent = false
- is-default = true
+ is-default = false
border = none
drop-zone = false
right-click = false
- saved-params = "max-lines"
+ saved-params = ""
on-size = ""
- link-color = #0000ff
- visited-color = #ff00ff
- style = ".system {color:#ff0000;}"
- enable-http-images = false
- max-lines = 1000
- image = ""
+ show-history = false
+ show-url = false
+ auto-format = false
+ use-title = false
+ on-show = ""
+ on-hide = ""
window "rpane"
elem "rpane"
diff --git a/nano/templates/chem_master.tmpl b/nano/templates/chem_master.tmpl
new file mode 100644
index 00000000000..0fcea280c42
--- /dev/null
+++ b/nano/templates/chem_master.tmpl
@@ -0,0 +1,83 @@
+{{if data.beaker}}
+ {{:helper.link('Eject Beaker and Clear Buffer', 'eject', {'eject': 1})}}
+
+
Add to buffer:
+ {{for data.beaker_reagents}}
+
+
{{:value.name}}, {{:value.volume}} units
+ {{:helper.link('Analyze', 'search', {'analyze': 1, 'desc': value.description, 'name': value.name})}}
+ {{:helper.link('1', 'plus', {'add': value.id, 'amount': 1})}}
+ {{:helper.link('5', 'plus', {'add': value.id, 'amount': 5})}}
+ {{:helper.link('10', 'plus', {'add': value.id, 'amount': 10})}}
+ {{:helper.link('All', 'plus', {'add': value.id, 'amount': value.volume})}}
+ {{:helper.link('Custom', 'plus', {'addcustom': value.id})}}
+
+ {{/for}}
+
+
+
+
+ Transfer to {{:helper.link(data.mode ? 'beaker' : 'disposal', 'arrows-h', {'toggle': 1})}}
+
+
+ {{for data.buffer_reagents}}
+
+
{{:value.name}}, {{:value.volume}} units
+ {{:helper.link('Analyze', 'search', {'analyze': 1, 'desc': value.description, 'name': value.name})}}
+ {{:helper.link('1', 'plus', {'remove': value.id, 'amount': 1})}}
+ {{:helper.link('5', 'plus', {'remove': value.id, 'amount': 5})}}
+ {{:helper.link('10', 'plus', {'remove': value.id, 'amount': 10})}}
+ {{:helper.link('All', 'plus', {'remove': value.id, 'amount': value.volume})}}
+ {{:helper.link('Custom', 'plus', {'removecustom': value.id})}}
+
+ {{/for}}
+
+
+
Containers:
+
+ {{if data.condi}}
+ {{:helper.link('Create pill (10u max)', 'arrow-right', {'createpill': 1})}}
+ {{:helper.link('Create bottle (50u max)', 'arrow-right', {'createpill': 1})}}
+ {{else}}
+
+
+
+ {{:helper.link('Create pill (50u max)', 'arrow-right', {'createpill': 1})}}
+
+
+ {{:helper.link('Multiple', 'arrow-right', {'createpill_multiple': 1})}}
+
+
+ {{:helper.link('Style', 'pencil', {'change_pill': 1})}}
+
+
+
+
+
+
+
+ {{:helper.link('Create patch (40u max)', 'arrow-right', {'createpatch': 1})}}
+
+
+ {{:helper.link('Multiple', 'arrow-right', {'createpatch_multiple': 1})}}
+
+
+
+
+ {{:helper.link('Create bottle (30u max)', 'arrow-right', {'createbottle': 1})}}
+
+
+
+ {{/if}}
+
+
+{{else}}
+ No beaker loaded
+{{/if}}
+
+ {{if data.loaded_pill_bottle}}
+ {{:helper.link('Pill Bottle (' + data.loaded_pill_bottle_contents_len + '/' + data.loaded_pill_bottle_storage_slots + ')', 'eject', {'ejectp': 1})}}
+ {{else}}
+ {{:helper.link('No Pill Bottle', 'eject', {}, 'disabled')}}
+ {{/if}}
+
\ No newline at end of file
diff --git a/nano/templates/r_n_d.tmpl b/nano/templates/r_n_d.tmpl
index 5d29c399550..cabd0c46992 100644
--- a/nano/templates/r_n_d.tmpl
+++ b/nano/templates/r_n_d.tmpl
@@ -22,12 +22,17 @@
{{:data.wait_message}}
{{else data.menu == 0}}
Main Menu:
- {{:helper.link('Current Research Levels', 'folder-open', {'menu': 1, 'submenu': 0})}}
{{:helper.link('Disk Operations', 'save', {'menu': 2, 'submenu': 0}, data.disk_type ? null : 'disabled')}}
{{:helper.link('Destructive Analyzer Menu', 'chain-broken', {'menu': 3, 'submenu': 0}, data.linked_destroy ? null : 'disabled')}}
{{:helper.link('Protolathe Menu', 'print', {'menu': 4, 'submenu': 0}, data.linked_lathe ? null : 'disabled')}}
{{:helper.link('Circuit Imprinter Menu', 'print', {'menu': 5, 'submenu': 0}, data.linked_imprinter ? null : 'disabled')}}
{{:helper.link('Settings', 'gear', {'menu': 6, 'submenu': 0})}}
+
+
+ Current Research Levels:
+ {{for data.tech_levels}}
+ {{:value.name}}:
{{:value.level}}
+ {{/for}}
{{else data.menu == 1}}
Current Research Levels:
{{for data.tech_levels}}
diff --git a/nano/templates/rcd.tmpl b/nano/templates/rcd.tmpl
new file mode 100644
index 00000000000..073171a4ba7
--- /dev/null
+++ b/nano/templates/rcd.tmpl
@@ -0,0 +1,33 @@
+{{if data.menu == 1}}
+ RCD Modes:
+ {{:helper.link('Floor and Walls', 'arrow-right', {'mode': 1}, data.mode == 1 ? 'linkOn' : null)}}
+
+ {{:helper.link('Airlock', 'arrow-right', {'mode': 2}, data.mode == 2 ? 'linkOn' : null)}}
+ {{:helper.link('', 'gear', {'menu': 2})}}
+
+ {{:helper.link('Deconstruct', 'arrow-right', {'mode': 3}, data.mode == 3 ? 'linkOn' : null)}}
+ {{:helper.link('Windows', 'arrow-right', {'mode': 4}, data.mode == 4 ? 'linkOn' : null)}}
+
+
RCD ammo: {{:data.matter}} / {{:data.max_matter}}
+
+{{else data.menu == 2}}
+ {{:helper.link('Back', 'reply', {'menu': 1})}}
+
+
Type
+ {{for data.allowed_door_types}}
+
{{:helper.link(value.name, 'arrow-right', {'door_type': value.type}, data.door_type == value.type ? 'linkOn' : null)}}
+ {{/for}}
+
+
+
Accesses
+ {{if data.locked}}
+ {{:helper.link('Swipe ID', 'unlock-alt', {'login': 1})}}
+ {{else}}
+ {{:helper.link('Lock', 'lock', {'logout': 1})}}
+
{{:helper.link(data.one_access ? 'ONE' : 'ALL', 'arrow-right', {'toggle_one_access': 1})}}
+ {{for data.door_accesses}}
+
{{:helper.link(value.name, 'arrow-right', {'toggle_access': value.id}, null, value.enabled ? 'selected' : null)}}
+ {{/for}}
+ {{/if}}
+
+{{/if}}
\ No newline at end of file
diff --git a/paradise.dme b/paradise.dme
index fcb3d4b7387..167bb99bac4 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -20,6 +20,7 @@
#include "code\__DEFINES\bots.dm"
#include "code\__DEFINES\clothing.dm"
#include "code\__DEFINES\combat.dm"
+#include "code\__DEFINES\crafting.dm"
#include "code\__DEFINES\error_handler.dm"
#include "code\__DEFINES\flags.dm"
#include "code\__DEFINES\game.dm"
@@ -83,9 +84,6 @@
#include "code\_globalvars\lists\names.dm"
#include "code\_globalvars\lists\objects.dm"
#include "code\_globalvars\lists\reagents.dm"
-#include "code\_hooks\area.dm"
-#include "code\_hooks\hooks.dm"
-#include "code\_hooks\mob.dm"
#include "code\_onclick\_defines.dm"
#include "code\_onclick\adjacent.dm"
#include "code\_onclick\ai.dm"
@@ -100,7 +98,7 @@
#include "code\_onclick\rig.dm"
#include "code\_onclick\telekinesis.dm"
#include "code\_onclick\hud\_defines.dm"
-#include "code\_onclick\hud\action.dm"
+#include "code\_onclick\hud\action_button.dm"
#include "code\_onclick\hud\ai.dm"
#include "code\_onclick\hud\alert.dm"
#include "code\_onclick\hud\alien.dm"
@@ -184,8 +182,10 @@
#include "code\controllers\Processes\ticker.dm"
#include "code\controllers\Processes\timer.dm"
#include "code\controllers\Processes\vote.dm"
+#include "code\controllers\Processes\weather.dm"
#include "code\controllers\ProcessScheduler\core\process.dm"
#include "code\controllers\ProcessScheduler\core\processScheduler.dm"
+#include "code\datums\action.dm"
#include "code\datums\ai_law_sets.dm"
#include "code\datums\ai_laws.dm"
#include "code\datums\beam.dm"
@@ -203,6 +203,7 @@
#include "code\datums\periodic_news.dm"
#include "code\datums\progressbar.dm"
#include "code\datums\recipe.dm"
+#include "code\datums\ruins.dm"
#include "code\datums\spell.dm"
#include "code\datums\supplypacks.dm"
#include "code\datums\uplink_item.dm"
@@ -265,9 +266,6 @@
#include "code\datums\diseases\advance\symptoms\weakness.dm"
#include "code\datums\diseases\advance\symptoms\weight.dm"
#include "code\datums\diseases\advance\symptoms\youth.dm"
-#include "code\datums\Emote_system\emote.dm"
-#include "code\datums\Emote_system\emote_handler.dm"
-#include "code\datums\Emote_system\emotes.dm"
#include "code\datums\helper_datums\construction_datum.dm"
#include "code\datums\helper_datums\events.dm"
#include "code\datums\helper_datums\global_iterator.dm"
@@ -275,9 +273,11 @@
#include "code\datums\helper_datums\map_template.dm"
#include "code\datums\helper_datums\teleport.dm"
#include "code\datums\helper_datums\topic_input.dm"
+#include "code\datums\ruins\space.dm"
#include "code\datums\spells\area_teleport.dm"
#include "code\datums\spells\bloodcrawl.dm"
#include "code\datums\spells\charge.dm"
+#include "code\datums\spells\cluwne.dm"
#include "code\datums\spells\conjure.dm"
#include "code\datums\spells\construct_spells.dm"
#include "code\datums\spells\dumbfire.dm"
@@ -296,11 +296,14 @@
#include "code\datums\spells\mime.dm"
#include "code\datums\spells\mind_transfer.dm"
#include "code\datums\spells\projectile.dm"
+#include "code\datums\spells\rathens.dm"
#include "code\datums\spells\summonitem.dm"
#include "code\datums\spells\touch_attacks.dm"
#include "code\datums\spells\trigger.dm"
#include "code\datums\spells\turf_teleport.dm"
#include "code\datums\spells\wizard.dm"
+#include "code\datums\weather\weather.dm"
+#include "code\datums\weather\weather_types.dm"
#include "code\datums\wires\airlock.dm"
#include "code\datums\wires\alarm.dm"
#include "code\datums\wires\apc.dm"
@@ -482,6 +485,7 @@
#include "code\game\jobs\job_objective.dm"
#include "code\game\jobs\jobs.dm"
#include "code\game\jobs\whitelist.dm"
+#include "code\game\jobs\job\central.dm"
#include "code\game\jobs\job\civilian.dm"
#include "code\game\jobs\job\engineering.dm"
#include "code\game\jobs\job\job.dm"
@@ -817,6 +821,7 @@
#include "code\game\objects\items\weapons\paiwire.dm"
#include "code\game\objects\items\weapons\pneumaticCannon.dm"
#include "code\game\objects\items\weapons\power_cells.dm"
+#include "code\game\objects\items\weapons\powerfist.dm"
#include "code\game\objects\items\weapons\RCD.dm"
#include "code\game\objects\items\weapons\RSF.dm"
#include "code\game\objects\items\weapons\scissors.dm"
@@ -858,7 +863,7 @@
#include "code\game\objects\items\weapons\implants\implant_explosive.dm"
#include "code\game\objects\items\weapons\implants\implant_freedom.dm"
#include "code\game\objects\items\weapons\implants\implant_krav_maga.dm"
-#include "code\game\objects\items\weapons\implants\implant_loyality.dm"
+#include "code\game\objects\items\weapons\implants\implant_mindshield.dm"
#include "code\game\objects\items\weapons\implants\implant_misc.dm"
#include "code\game\objects\items\weapons\implants\implant_storage.dm"
#include "code\game\objects\items\weapons\implants\implant_track.dm"
@@ -1013,7 +1018,6 @@
#include "code\modules\admin\IsBanned.dm"
#include "code\modules\admin\machine_upgrade.dm"
#include "code\modules\admin\NewBan.dm"
-#include "code\modules\admin\newbanjob.dm"
#include "code\modules\admin\player_panel.dm"
#include "code\modules\admin\secrets.dm"
#include "code\modules\admin\sql_notes.dm"
@@ -1097,9 +1101,12 @@
#include "code\modules\awaymissions\exile.dm"
#include "code\modules\awaymissions\gateway.dm"
#include "code\modules\awaymissions\loot.dm"
+#include "code\modules\awaymissions\map_rng.dm"
#include "code\modules\awaymissions\pamphlet.dm"
+#include "code\modules\awaymissions\snpc.dm"
#include "code\modules\awaymissions\trigger.dm"
#include "code\modules\awaymissions\zlevel.dm"
+#include "code\modules\awaymissions\zvis.dm"
#include "code\modules\awaymissions\maploader\dmm_suite.dm"
#include "code\modules\awaymissions\maploader\reader.dm"
#include "code\modules\awaymissions\maploader\swapmaps.dm"
@@ -1112,16 +1119,27 @@
#include "code\modules\awaymissions\mission_code\clownplanet.dm"
#include "code\modules\awaymissions\mission_code\evil_santa.dm"
#include "code\modules\awaymissions\mission_code\spacebattle.dm"
+#include "code\modules\awaymissions\mission_code\spacehotel.dm"
+#include "code\modules\awaymissions\mission_code\spacehotel_npcs.dm"
#include "code\modules\awaymissions\mission_code\stationCollision.dm"
#include "code\modules\awaymissions\mission_code\wildwest.dm"
#include "code\modules\client\asset_cache.dm"
#include "code\modules\client\client defines.dm"
#include "code\modules\client\client procs.dm"
#include "code\modules\client\message.dm"
-#include "code\modules\client\preferences.dm"
-#include "code\modules\client\preferences_mysql.dm"
-#include "code\modules\client\preferences_spawnpoints.dm"
-#include "code\modules\client\preferences_toggles.dm"
+#include "code\modules\client\preference\preferences.dm"
+#include "code\modules\client\preference\preferences_mysql.dm"
+#include "code\modules\client\preference\preferences_spawnpoints.dm"
+#include "code\modules\client\preference\preferences_toggles.dm"
+#include "code\modules\client\preference\loadout\gear_tweaks.dm"
+#include "code\modules\client\preference\loadout\loadout.dm"
+#include "code\modules\client\preference\loadout\loadout_accessories.dm"
+#include "code\modules\client\preference\loadout\loadout_cosmetics.dm"
+#include "code\modules\client\preference\loadout\loadout_general.dm"
+#include "code\modules\client\preference\loadout\loadout_hat.dm"
+#include "code\modules\client\preference\loadout\loadout_shoes.dm"
+#include "code\modules\client\preference\loadout\loadout_suit.dm"
+#include "code\modules\client\preference\loadout\loadout_uniform.dm"
#include "code\modules\clothing\clothing.dm"
#include "code\modules\clothing\glasses\glasses.dm"
#include "code\modules\clothing\glasses\hud.dm"
@@ -1173,6 +1191,7 @@
#include "code\modules\clothing\suits\alien.dm"
#include "code\modules\clothing\suits\armor.dm"
#include "code\modules\clothing\suits\bio.dm"
+#include "code\modules\clothing\suits\hood.dm"
#include "code\modules\clothing\suits\jobs.dm"
#include "code\modules\clothing\suits\labcoat.dm"
#include "code\modules\clothing\suits\miscellaneous.dm"
@@ -1223,9 +1242,9 @@
#include "code\modules\computer3\computers\robot.dm"
#include "code\modules\computer3\computers\security.dm"
#include "code\modules\computer3\computers\welcome.dm"
+#include "code\modules\crafting\craft.dm"
#include "code\modules\crafting\guncrafting.dm"
#include "code\modules\crafting\recipes.dm"
-#include "code\modules\crafting\table.dm"
#include "code\modules\customitems\item_defines.dm"
#include "code\modules\customitems\item_spawning.dm"
#include "code\modules\detective_work\detective_work.dm"
@@ -1321,6 +1340,8 @@
#include "code\modules\food\recipes_microwave.dm"
#include "code\modules\food\recipes_oven.dm"
#include "code\modules\food\recipes_table.dm"
+#include "code\modules\food\beverages\bottler.dm"
+#include "code\modules\food\beverages\bottler_recipes.dm"
#include "code\modules\garbage_collection\garbage_collector.dm"
#include "code\modules\garbage_collection\gc_testing.dm"
#include "code\modules\holiday\christmas.dm"
@@ -1402,6 +1423,7 @@
#include "code\modules\mining\laborcamp\laborstacker.dm"
#include "code\modules\mob\abilities.dm"
#include "code\modules\mob\death.dm"
+#include "code\modules\mob\emote.dm"
#include "code\modules\mob\hear_say.dm"
#include "code\modules\mob\holder.dm"
#include "code\modules\mob\inventory.dm"
@@ -1453,6 +1475,7 @@
#include "code\modules\mob\living\carbon\alien\login.dm"
#include "code\modules\mob\living\carbon\alien\logout.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm"
+#include "code\modules\mob\living\carbon\alien\humanoid\emote.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\empress.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\humanoid.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\inventory.dm"
@@ -1464,6 +1487,7 @@
#include "code\modules\mob\living\carbon\alien\humanoid\caste\hunter.dm"
#include "code\modules\mob\living\carbon\alien\humanoid\caste\sentinel.dm"
#include "code\modules\mob\living\carbon\alien\larva\death.dm"
+#include "code\modules\mob\living\carbon\alien\larva\emote.dm"
#include "code\modules\mob\living\carbon\alien\larva\inventory.dm"
#include "code\modules\mob\living\carbon\alien\larva\larva.dm"
#include "code\modules\mob\living\carbon\alien\larva\life.dm"
@@ -1474,6 +1498,7 @@
#include "code\modules\mob\living\carbon\brain\brain.dm"
#include "code\modules\mob\living\carbon\brain\brain_item.dm"
#include "code\modules\mob\living\carbon\brain\death.dm"
+#include "code\modules\mob\living\carbon\brain\emote.dm"
#include "code\modules\mob\living\carbon\brain\life.dm"
#include "code\modules\mob\living\carbon\brain\login.dm"
#include "code\modules\mob\living\carbon\brain\MMI.dm"
@@ -1482,6 +1507,7 @@
#include "code\modules\mob\living\carbon\human\appearance.dm"
#include "code\modules\mob\living\carbon\human\body_accessories.dm"
#include "code\modules\mob\living\carbon\human\death.dm"
+#include "code\modules\mob\living\carbon\human\emote.dm"
#include "code\modules\mob\living\carbon\human\examine.dm"
#include "code\modules\mob\living\carbon\human\human.dm"
#include "code\modules\mob\living\carbon\human\human_attackalien.dm"
@@ -1512,6 +1538,7 @@
#include "code\modules\mob\living\carbon\human\species\species.dm"
#include "code\modules\mob\living\carbon\human\species\station.dm"
#include "code\modules\mob\living\carbon\slime\death.dm"
+#include "code\modules\mob\living\carbon\slime\emote.dm"
#include "code\modules\mob\living\carbon\slime\examine.dm"
#include "code\modules\mob\living\carbon\slime\life.dm"
#include "code\modules\mob\living\carbon\slime\powers.dm"
@@ -1520,6 +1547,7 @@
#include "code\modules\mob\living\carbon\slime\subtypes.dm"
#include "code\modules\mob\living\carbon\slime\update_icons.dm"
#include "code\modules\mob\living\silicon\death.dm"
+#include "code\modules\mob\living\silicon\emote.dm"
#include "code\modules\mob\living\silicon\laws.dm"
#include "code\modules\mob\living\silicon\login.dm"
#include "code\modules\mob\living\silicon\say.dm"
@@ -1542,7 +1570,7 @@
#include "code\modules\mob\living\silicon\decoy\decoy.dm"
#include "code\modules\mob\living\silicon\decoy\life.dm"
#include "code\modules\mob\living\silicon\pai\death.dm"
-#include "code\modules\mob\living\silicon\pai\examine.dm"
+#include "code\modules\mob\living\silicon\pai\emote.dm"
#include "code\modules\mob\living\silicon\pai\life.dm"
#include "code\modules\mob\living\silicon\pai\pai.dm"
#include "code\modules\mob\living\silicon\pai\personality.dm"
@@ -1552,6 +1580,7 @@
#include "code\modules\mob\living\silicon\pai\software_modules.dm"
#include "code\modules\mob\living\silicon\robot\component.dm"
#include "code\modules\mob\living\silicon\robot\death.dm"
+#include "code\modules\mob\living\silicon\robot\emote.dm"
#include "code\modules\mob\living\silicon\robot\examine.dm"
#include "code\modules\mob\living\silicon\robot\inventory.dm"
#include "code\modules\mob\living\silicon\robot\laws.dm"
@@ -1578,12 +1607,13 @@
#include "code\modules\mob\living\simple_animal\powers.dm"
#include "code\modules\mob\living\simple_animal\shade.dm"
#include "code\modules\mob\living\simple_animal\simple_animal.dm"
+#include "code\modules\mob\living\simple_animal\spawner.dm"
#include "code\modules\mob\living\simple_animal\tribbles.dm"
-#include "code\modules\mob\living\simple_animal\vox.dm"
#include "code\modules\mob\living\simple_animal\bot\bot.dm"
#include "code\modules\mob\living\simple_animal\bot\cleanbot.dm"
#include "code\modules\mob\living\simple_animal\bot\construction.dm"
#include "code\modules\mob\living\simple_animal\bot\ed209bot.dm"
+#include "code\modules\mob\living\simple_animal\bot\emote.dm"
#include "code\modules\mob\living\simple_animal\bot\floorbot.dm"
#include "code\modules\mob\living\simple_animal\bot\medbot.dm"
#include "code\modules\mob\living\simple_animal\bot\mulebot.dm"
@@ -1615,6 +1645,7 @@
#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm"
#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm"
#include "code\modules\mob\living\simple_animal\hostile\hostile.dm"
+#include "code\modules\mob\living\simple_animal\hostile\illusion.dm"
#include "code\modules\mob\living\simple_animal\hostile\jungle_animals.dm"
#include "code\modules\mob\living\simple_animal\hostile\killertomato.dm"
#include "code\modules\mob\living\simple_animal\hostile\mimic.dm"
@@ -1803,6 +1834,7 @@
#include "code\modules\reagents\newchem\medicine.dm"
#include "code\modules\reagents\newchem\newchem_procs.dm"
#include "code\modules\reagents\newchem\other.dm"
+#include "code\modules\reagents\newchem\paradise_pop.dm"
#include "code\modules\reagents\newchem\patch.dm"
#include "code\modules\reagents\newchem\pyro.dm"
#include "code\modules\reagents\newchem\toxins.dm"
@@ -1829,8 +1861,8 @@
#include "code\modules\reagents\oldchem\reagents\drink\reagents_drink_cold.dm"
#include "code\modules\reagents\reagent_containers\blood_pack.dm"
#include "code\modules\reagents\reagent_containers\borghydro.dm"
+#include "code\modules\reagents\reagent_containers\bottle.dm"
#include "code\modules\reagents\reagent_containers\dropper.dm"
-#include "code\modules\reagents\reagent_containers\drugs.dm"
#include "code\modules\reagents\reagent_containers\food.dm"
#include "code\modules\reagents\reagent_containers\glass_containers.dm"
#include "code\modules\reagents\reagent_containers\hypospray.dm"
@@ -1840,18 +1872,13 @@
#include "code\modules\reagents\reagent_containers\food\cans.dm"
#include "code\modules\reagents\reagent_containers\food\condiment.dm"
#include "code\modules\reagents\reagent_containers\food\drinks.dm"
-#include "code\modules\reagents\reagent_containers\food\sandwich.dm"
#include "code\modules\reagents\reagent_containers\food\snacks.dm"
#include "code\modules\reagents\reagent_containers\food\drinks\bottle.dm"
#include "code\modules\reagents\reagent_containers\food\drinks\drinkingglass.dm"
-#include "code\modules\reagents\reagent_containers\food\drinks\jar.dm"
#include "code\modules\reagents\reagent_containers\food\drinks\shotglass.dm"
-#include "code\modules\reagents\reagent_containers\food\drinks\bottle\robot.dm"
#include "code\modules\reagents\reagent_containers\food\snacks\candy.dm"
#include "code\modules\reagents\reagent_containers\food\snacks\meat.dm"
#include "code\modules\reagents\reagent_containers\food\snacks\seafood.dm"
-#include "code\modules\reagents\reagent_containers\glass\bottle.dm"
-#include "code\modules\reagents\reagent_containers\glass\bottle\robot.dm"
#include "code\modules\recycling\conveyor2.dm"
#include "code\modules\recycling\disposal-construction.dm"
#include "code\modules\recycling\disposal.dm"
@@ -1940,6 +1967,7 @@
#include "code\modules\research\xenoarchaeology\tools\tools_pickaxe.dm"
#include "code\modules\research\xenobiology\xenobio_camera.dm"
#include "code\modules\research\xenobiology\xenobiology.dm"
+#include "code\modules\ruins\ruin_areas.dm"
#include "code\modules\scripting\Errors.dm"
#include "code\modules\scripting\Options.dm"
#include "code\modules\scripting\AST\AST Nodes.dm"
@@ -1972,6 +2000,8 @@
#include "code\modules\spacepods\parts.dm"
#include "code\modules\spacepods\pod_fabricator.dm"
#include "code\modules\spacepods\spacepod.dm"
+#include "code\modules\spacial_allocator\zlevel.dm"
+#include "code\modules\spacial_allocator\zlevel_manager.dm"
#include "code\modules\store\items.dm"
#include "code\modules\store\store.dm"
#include "code\modules\surgery\bones.dm"
@@ -2039,7 +2069,7 @@
#include "code\modules\vehicle\speedbike.dm"
#include "code\modules\vehicle\sportscar.dm"
#include "code\modules\vehicle\vehicle.dm"
+#include "goon\code\datums\browserOutput.dm"
#include "interface\interface.dm"
-#include "interface\stylesheet.dm"
#include "interface\skin.dmf"
// END_INCLUDE
diff --git a/sound/lavaland/ash_storm_end.ogg b/sound/lavaland/ash_storm_end.ogg
new file mode 100644
index 00000000000..f9b01453dda
Binary files /dev/null and b/sound/lavaland/ash_storm_end.ogg differ
diff --git a/sound/lavaland/ash_storm_start.ogg b/sound/lavaland/ash_storm_start.ogg
new file mode 100644
index 00000000000..4b9bebffd08
Binary files /dev/null and b/sound/lavaland/ash_storm_start.ogg differ
diff --git a/sound/lavaland/ash_storm_windup.ogg b/sound/lavaland/ash_storm_windup.ogg
new file mode 100644
index 00000000000..a9f0fa3270e
Binary files /dev/null and b/sound/lavaland/ash_storm_windup.ogg differ
diff --git a/sound/magic/Charge.ogg b/sound/magic/Charge.ogg
new file mode 100644
index 00000000000..bf27fb9ae99
Binary files /dev/null and b/sound/magic/Charge.ogg differ
diff --git a/sound/spookoween/scary_horn2.ogg b/sound/spookoween/scary_horn2.ogg
new file mode 100644
index 00000000000..fb2805bd2cd
Binary files /dev/null and b/sound/spookoween/scary_horn2.ogg differ