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/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 1fede14efc1..d8f8edfe7d7 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -80,6 +80,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 a4e9193c38f..a75af823a5b 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -80,6 +80,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..c16be0cf8bd 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -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) @@ -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"}) @@ -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"}) @@ -6468,7 +6468,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 +6904,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 +7380,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 +7703,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 +7900,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"}) @@ -8330,7 +8330,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 +8384,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 +8409,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"}) @@ -8551,11 +8552,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaktaoSaktaoTaoUaoVaoWaktaoXaoYaoZapaapbapcapdapeakyabqapfapfakzapfapfapgapgamxapSaqGaqFaqHapjapkaplapmapnapoappapqappaprapsapsaptapuapvapwapxapxapyapzapAapBapCapDapEapFapGapHapIdeYdeXapLapMapNaheapOapPalWarMarOajgaipaowakhajpapTapUapVapWapXapYamgapZaqaairairairairairaqbafbaqcaoGaqdaqeaefaefabqamkaqfaqgaqhaqiaqjamkabqanoaoLaqkaoLasTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehaqmaqnaeGaqoaqpaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaktaqqaqraqraqraqsaqtaktaquaqvaqwakyaqxaqyaqzaqAakyapfapfaqBaqCanEapfaqDaqEamxamxamxarParSarQaqIaqJaqKaqLakHaqMaqNaqOagBaqPaqQaqRaqSaqTaqUaqVaqWakHaqXaqYaqZapCaraarbarcardarearfargalSalSarhaheaheajgariajgarjajgajgafbarkarlajpajparmarnaroarparparqapZaqaairairairairairaqbarrarsaoGaqeaoGaoGaoHaoGamkartaruankarvarwamkabqaoLaoLaoMaoLasTaoGaoGaoGafdacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaflaeFarxaryarzaeFafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarBaaaaaaarAaaaarAaaaaaaabqabqabqaaaaaaaaaaaaaaaabqaaaabqaaaabqaaaaktarCarDarEarFarGarHaktanHaqvapdapfarIapdapdapdarJapfarKarUarTarNapfatAarWauHarRaumazcaCTarVaCVarXarYarZagBamIasaamIagBagBasbascasbagBasdaseasfasgashaqYasiasjapCaslasmasnasoarfaspasqasrassastasuastasvaswasxasyaszaszasAasBasCasCasDasEasFasGasGasGasHaqaairairairairairaqbasIasJaoGarsasKasLasMasNamkasOasPasQasRasSamkabqasTasUasVasWaxhauodgCblyavNavNblzaaaaaaaaaaaaaaaaaaaaaaaaaaaaflaeFaeFaeFafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAabqabqarAarAarAabqaaaarAarAataarAarAaaaabqapfapfakzapfabqaaaabqabqabqabqabqapfakzaktaktatbatcatdaktaktaktapdateaoZatfapbatgathapdatiapfaoXaElaEjapfapfatlatmatnatoamxamxamxakDakDatpatqatratsattatuatvatwatxatyaqUatzagBaqUanYaFCakHatBdfnatCatDatEatFatGatHatIarfatJatKatKamOamOamOamOatLafbafcatMafcafbatNatOatPatQatRatSatTatUatVatWatXatYatZatZatZatZatZauaaubayuaoGasJasJasJasJaudamkaueaufaugauhdfoamkabqasTaujaukaulaxhdgCdgCbnGblAblCblBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaupabqarAabqaupabqarAarAabqarAarAarAarAarAaaaaaaaaaapfauqaurapfausautautautautautauuapfarKauvapfauwauxaoXauyauzapfauAauBauCapfarIatjauDauEauFapfauGaNEaFEapfauIatmakeauJauKajgauLamxauMauNaqJatqapnauOauPauQauRauSauTauUauVauWauXaqUauYauZakHdfsdfravcavdaveavfavgavhavgaviavjavkavlavlavmavnamOatLafbavoavpavqavravravravravravsavtavuavvavvavvavvavvavwaoGavxavyavzaoGaoGasJaoGavAavBavCasJavDavEavFavGavHavIavJamkaoHasTavKavLavMaxhdgCdgCbnFavNavNbnHaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAabqarAabqarAarAarAataabqabqabqarAarAabqaaaabqabqakzavQavRavSavTavUavUavUavUavUavVavWavXavYavZawaawbavUawcavUawdaweawfajgajgajgajgajgajgajgajgajgajgawgajgawhajgajgajgajgajgajgamxawiawjaqJatqatratsawkawlawmawnawoawpawqawraqTawsawtawuasgawvdfvdfwawyawzawAawBawCawDawEawFatKawGawHawGawIamOawJawKawLawMavqavrawNawOawPawQawRawSawTavvawUawVawWavvaoGaoGasJaubavBasIaoGayvaoGavzasJawXasJaoGawYawZamkamkaxaaxbamkayxasTasTaxdaxeaxhaxhbnIaxhbnJbplaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAarAarAarAabqarAarAabqauparAarAabqabqabqabqapfapfaxiapfapfaxjaxkaxkaxkaxkaxkaxlapfapfapfapfaxmaxnaxoaxoaxoaxoaxpaxqajgaxraxsaxtaxuaxvaxwaxxaxyaxzaxAaxBaxCajgaxDaxEaxEaxEaxFamzaxGaxHaqJaxIaxJaxKaqTaxLagBagBaxMaxNaxOasgagBaxPaxMakHakHamOaxQaxRaxSaxQamOaxTaxUamOaxVatKatKaxWaxWaxWamOamOaxXafbdeeaxZdefavrayaaybayaawQaycaydayeayfaygayhayiavvayjaoGaykaylaymaynaoGasMaoGaoGaoGayoaoGaoGaypayqayramkamkamkamkazrasIazGazFbTiaxhdfCdgCdfEaxhaxhaxhabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqarAarAarAarAarAarAarAarAarAarAarAayyarAabqaupapfapfapfayzayAapfabqabqabqabqabqabqabqabqabqabqabqapfaqBayBapdaoXayCaoXayDayEayFayGayHayIajgajgajgayJayKayKayKayLajgajgayMayNayOayPayMamzamzakDayQayRapnaySaySayTayUaySayVaySayUaySayWaySayVayXayYayZayUazaazbaySaySaySayUaySaOPamxazdazeazeazeazeakDatLafbaxYavoavqavrazfazgazhavraziazjazkazlazmavvavvavvaznaoGasIazoawXasJaoGayvaoGazpaoGazqdfFazsbpmbppbpobqVbpqbqXbqWbqWbqWbqWdeSdgCdeVdgCdgCdgCaxgazHaxgaefaefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAabqabqarAarAarAabqaaaarAarAataarAarAaaaabqapfapfakzapfabqaaaabqabqabqabqabqapfakzaktaktatbatcatdaktaktaktapdateaoZatfapbatgathapdatiapfaoXaElaEjapfapfatlatmatnatoamxamxamxakDakDatpatqatratsattatuatvatwatxatyaqUatzagBaqUanYaFCakHatBdfnatCatDatEatFatGatHatIarfatJatKatKamOamOamOamOatLafbafcatMafcafbatNatOatPatQatRatSatTatUatVatWatXatYatZatZatZatZatZauaaubayuaoGasJasJasJasJaudamkaueaufaugauhavFamkabqasTaujaukaulaxhdgCdgCbnGblAblCblBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaupabqarAabqaupabqarAarAabqarAarAarAarAarAaaaaaaaaaapfauqaurapfausautautautautautauuapfarKauvapfauwauxaoXauyauzapfauAauBauCapfarIatjauDauEauFapfauGaNEaFEapfauIatmakeauJauKajgauLamxauMauNaqJatqapnauOauPauQauRauSauTauUauVauWauXaqUauYauZakHdfsdfravcavdaveavfavgavhavgaviavjavkavlavlavmavnamOatLafbavoavpavqavravravravravravsavtavuavvavvavvavvavvavwaoGavxavyavzaoGaoGasJaoGavAavBavCasJavDavEavHavGawZavIavJamkaoHasTavKavLavMaxhdgCdgCbnFavNavNbnHaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAabqarAabqarAarAarAataabqabqabqarAarAabqaaaabqabqakzavQavRavSavTavUavUavUavUavUavVavWavXavYavZawaawbavUawcavUawdaweawfajgajgajgajgajgajgajgajgajgajgawgajgawhajgajgajgajgajgajgamxawiawjaqJatqatratsawkawlawmawnawoawpawqawraqTawsawtawuasgawvdfvdfwawyawzawAawBawCawDawEawFatKawGawHawGawIamOawJawKawLawMavqavrawNawOawPawQawRawSawTavvawUawVawWavvaoGaoGasJaubavBasIaoGayvaoGavzasJawXasJaoGawYayqamkamkaxaaxbamkayxasTasTaxdaxeaxhaxhbnIaxhbnJbplaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAarAarAarAabqarAarAabqauparAarAabqabqabqabqapfapfaxiapfapfaxjaxkaxkaxkaxkaxkaxlapfapfapfapfaxmaxnaxoaxoaxoaxoaxpaxqajgaxraxsaxtaxuaxvaxwaxxaxyaxzaxAaxBaxCajgaxDaxEaxEaxEaxFamzaxGaxHaqJaxIaxJaxKaqTaxLagBagBaxMaxNaxOasgagBaxPaxMakHakHamOaxQaxRaxSaxQamOaxTaxUamOaxVatKatKaxWaxWaxWamOamOaxXafbdeeaxZdefavrayaaybayaawQaycaydayeayfaygayhayiavvayjaoGaykaylaymaynaoGasMaoGaoGaoGayoaoGaoGaypbppayramkamkamkamkazrasIazGazFbTiaxhdfCdgCdfEaxhaxhaxhabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBabqarAarAarAarAarAarAarAarAarAarAarAayyarAabqaupapfapfapfayzayAapfabqabqabqabqabqabqabqabqabqabqabqapfaqBayBapdaoXayCaoXayDayEayFayGayHayIajgajgajgayJayKayKayKayLajgajgayMayNayOayPayMamzamzakDayQayRapnaySaySayTayUaySayVaySayUaySayWaySayVayXayYayZayUazaazbaySaySaySayUaySaOPamxazdazeazeazeazeakDatLafbaxYavoavqavrazfazgazhavraziazjazkazlazmavvavvavvaznaoGasIazoawXasJaoGayvaoGazpaoGazqdfFazsbpmdfobpobqVbpqbqXbqWbqWbqWbqWdeSdgCdeVdgCdgCdgCaxgazHaxgaefaefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaupabqarAataarAarAarAarAazIabqarAarAarAarAarAarAazJazKazJazLazMapfapfabqaaaaaaaaaaaaaaaaaaaaaaaaabqapfapfapfathaoXapdaoXazNazOazPazQazRazSajgaaaabqaaaaaaaaaaaaaaaabqaaaazTazUazVazWazXazYazeazZaAaaAbaAcaAdaAdaAeaAcaAdaAfaAgaAcaAhaAiaAdaAjaAkaAlaAdaAmaAnaAoaApaApaAqaAraAsaAtaAuaAvaAwaAxaAyaAzakDatLafbaxYaAAavqavraABaACaADaAEaAFaAGaAHavvaAIaAJaAKavvaALaoGaoGaoGayoaoGaoGasJaoGaucaoGaAMaxhaxhawYaANamkaxhaxhaxhaxhaxhaxhaxhaxhaxhayxaxhaxhaxhaxhaxhaAOaxhabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAarAarAarAarAarAarAarAarAarAabqarAarAarAabqapfapfapfaAPazSapdapfaaaaAQaARaASaARaATabqabqabqabqapfaAUapfaAVavUavUavUaAWaAXapfaAYaAZaBaajgaaaaBbaBbaBbaBbaBbaBbaBbaaaayMaBcaBdaBeayMamzamzakDaBfaBgaBhaBiaBjaBkaBhaBlaBjaBgaBmaBnaBoaBpaBqaBraBsaBtaBuaBvaBwaBxaByaBwaBzaBAaBBaBCaBDaBEaBFaBGaBHakDatLaBIaBIaBIaBIavraBJaPWaBLaBMaBNaBOayeaBPaBQaBRaBSavvaBTaBUaBVaBWaBXaBWaBYaBWaBZaBWdgEaCaaCbaCcaCdaCeaCfaCgaChaCgaCiaCjaCkaCjaClaxhaxhaxhaCiaCjaClaCmaCmaCgabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqarAarAarAarAarAarAarAaCnarAabqabqabqabqapfaoXazSarIakzaaaaCoaCpaCqaCpaCoaCraCraCraCsaCsaCsaCsaCtaCsaCsaCuaCuaCuaCuaCvaCuaCwajgabqaBbaCxaCyaCzaCAaCBaBbaaaayMaCCaCCaCDayMaaaaaaaCEaCFaCGaCHakDaCFaCIaCHakDaCFaCJaCHakDaCKamzaCLakDamzaCMaCNamzamzaCOaCOaCPaCQaCRaCOaCOaCSakDakDakDakDakDatLaBIaQdaCUaQvavravravravravraCWaCXaCYazlazmavvavvavvaoGaCZasIarrasJasIaDadgIaxhaxhaxhaxhaxhaDbaDcaDdaDeaDfdfMaDfaDhaDiaDjaDiaDkaCjaDlaCjaDmaDiaDjaDiaCmaDnaDoabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8586,11 +8587,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablOblPblQblRbkbblSblTblSblTblSblTblSbkbblUblVbccbgVblWbgXblXblYblZbmabmbbmcbgXbmdbmebmfbmgbmhbmibmjbmkbmlbmmbmnbmobmpbmqbmrbmsbmtbmubmvbmwbmxbmybmzbmAbiVbfIbmSbhqbmQbmCbmDbmEbhqbmFbmGbjeabqabqbmHboBbopbpVboHbqfbqdbqhbqgbqkbqjbqlbmTabqabqbhwbmUbmVbmWbmXbmYbmZbnabhwbhybnbbncbndbnebnfbnebngbnhbnibnebnebnebnjbnebnkbnlbnmbnnbnebnebnobnkbngbnjbnpbnqbnobnrbnsbntbnubnvbnwbnxbnybnzbnAbnBbnCbnDdfpdfmdftdfqdfxdfudfydeZaoNdflabqaaaaaaaaaaefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqaefblDblEbnKblEbnLaXOaaaaaaaaaaXLbnMbnNbdJbnObnPbnQbnRbnSbnTbdIbrQaXLaXLaXLaXLbnUaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiqbkbbkbbipbkbblSblTblSbnVblSblTblSbkbblUblVbccbnWbnXbnYbnZboabobbocbobbiubiubodboebhcbfwbofbogbohboibojbokbolbfwbombonbojbkCboobfwbrXboqborbosbotbiUbkIbfIbkJbhqboubovbowboxbhqboybozbjebkWboAbkWbsbboCboDboEboDboFboDboEboDboGbscbkWboAbkWbhwboIboIboIboJboKboLboMbhwboNboOboPboQboRboSboRboTboRboUboRboRboRboVboRboWboXboYboZboRboRbpabpbbpcboVbpdboVbpebpfbpgbntbphbpibpibpjbpkbpibpidfzdfBdfAdfGdfDdfIdfHdfKdfJdgddfLdgKazDabqaaaaaaaaaabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqbpraaaaaaaaaabqbjRbjRbjObpsaXIaXOaaaaaaaaaaXLaXLblHbdIbdIbdIbptbdIbdIbdIbdIbsebsdbsfaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaablObpwbpxblRbkbblSblTblSblTblSblTblSbkbblUblVbccbpybpzbpAbpBbpCbpDbpDbpEbpFbpBbpGbpHbpIbfwbpJbpKbpLbpMbpNbpObpPbfwbpQbpRbpSbpTbpUbfwbsibpWbpXbpYbpZbfGbqabjnbqbbqcbqcbqcbqcbqcbhtbtPbqebhtbkWbtSbtRbtTboEboEboEboEbqiboEboEboEboEbtZbtYbubbkWbqmbqnbqobqpbqqbqrbqrbqsbhwbqtbqubqvbqwbqxbqybqxbqzbqxbqAbqxbqxbqBbqxbqxbqCbqDbqxbqEbqBbqFbqGbqCbqHbqxbqIbqJbqKbqLbqMbqNbqObqPbqQbqRbpnbqSbqSbqTdgMdgLdgOdgNdgPanqanqanqanqanqanqanqanqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaabqYbqZbrabrbbrcbrdbrebrfaXIaXLaXLaXLaXLaXLbrgbrhbrgbrgbribrjbribrkbrkbrlbrmbrnbudaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobiobjZbrpbkbbrqbkbbrrbrsbkbbrtbkbbkibrubccbgVbrvbrwbrxbrybrzbrAbrBbrCbrxbrDbrEbrFbfwbrGbhabrHbrIbfwbfwbfwbfwbfwbhabrJbrKbfwbfwbiUbrLbrMbiUbiUbzObehbfIbrObqcbrPbumbrRbqcbrSbrTbrUbrVbrWburbrYbrZbsabsabvWbwfbwebvWbvWbsabsabsgbshbwgbkWbhwboIboIboIbsjboIboIboIbhwbskbfIbslbZibsnbsobsnbsmbspbspbspbspbspbspaoGaoGbsqaoGaoGaoGbsrbThaoGaoGaoGbstaoGbsubsvbswbsxbsybszbsAbsBbqSbsCbsCbsDbqUbsEbjNbntbsFbsGbsHbsIbsJbsJbsKbsLabqaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaabqYbsMbsNaaaabqbsObsPbsQbsRbsSbsTbrgbsUbsVbsWbsXbsYbsZbrgbtabtbbtcbtdbtebtfbtfbtgaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobiobjZbrpbkbbrqbkbbrrbrsbkbbrtbkbbkibrubccbgVbrvbrwbrxbrybrzbrAbrBbrCbrxbrDbrEbrFbfwbrGbhabrHbrIbfwbfwbfwbfwbfwbhabrJbrKbfwbfwbiUbrLbrMbiUbiUbzObehbfIbrObqcbrPbumbrRbqcbrSbrTbrUbrVbrWburbrYbrZbsabsabvWbwfbwebvWbvWbsabsabsgbshbwgbkWbhwboIboIboIbsjboIboIboIbhwbskbfIbslbZibsnbsobsnbsmbspbspbspbspbspbspaoGaoGbsqaoGaoGaoGbsrbCiaoGaoGaoGbstaoGbsubsvbswbsxbsybszbsAbsBbqSbsCbsCbsDbqUbsEbjNbntbsFbsGbsHbsIbsJbsJbsKbsLabqaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaabqYbsMbsNaaaabqbsObsPbsQbsRbsSbsTbrgbsUbsVbsWbsXbsYbsZbrgbtabtbbtcbtdbtebtfbtfbtgaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrobiobthbiobiqbiobiobiqbiobipbtibtjaWDbtkbtlbtmbfGbtnbtobtpbtobtqbfGbtrbtsbttbtubtvbtwbtxbtybtzbtwbtAbtBbtwbtvbtvbtCbtvbtDbtEbtFbtGbtHbtvbtIbtJbtKbkJbtLbtMbtNbtObqcbjebjebjebjebkWbwmbtQboEboEboEbtUboEbtVbtWbtXboEboEbwnbuabAkbucbhwbwobuebufbugbuhboIbuibhwbujbfIbukbuldedbunbuobsmbupbuqbwpbusbutbuubuvbuwbuxaoGbuybuzbuAbuBbuCaoGaxcbuDaoGbuEbuFbuGbnEbuHbuHbuHbuIbuJbqSbqSbuKbuLbuMbuNbuObuPbuQbuRbuSbuTbuTbuUbuVbuWbuWbuWbuXdgQbuWbuWbuWbuWbuWbuXbuWbuWbuWbuWbuWbuWbuXbuWbuYbuZbuTbuTbuTbvabvbbvcbvdbvdbvebvfbvgbvhbvibvjbvkbvlbvmbvnbvobvpbvqbvrbvsbvtbvubvvbbXbbXbvwaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqaaabccbdRbccbccbccbccbccbccbdRbccaaaaWDbvxbvybvzbfGbvAbvBbvCbvBbvDbfGbvEbvFbvGbvHbvHbvIbvJbvHbvHbvKbvLbvMbvNbvHbvHbvObvHbvHbvHbvPbvQbvRbvRbvSbvTbvUbvVbqcbyobvXbvYbqcbvZbwabwbbwcbwdboEbtQboEbypbywbwhbwibwjbwibwkbyJbyxbAbbyQbAkbwqbhwbwrbwsbwtbwubwvbhwbhwbhwbhybwwbwxbsmbwybwzbwAbsmbwBbwCbwDbwEbwFbwGbwHbwIbwJbwKbwLbwMbwNbwObwPbwQbwRbwSaoGbsubwTbwUbntbwVbwWbwXbwYbwZbxabxbbxcbxdbqUbxebxfbxgbxhbxiaWCaaaaaabxjbsNabqaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaaaaaaaaaaaaaaaaaabqaaabxkbxlbsLaaaabqaZhbxmbxnbxobxpbxqbxrbxsbxtbxubxvbxwbxxbxybxzbxAbxBbxCbxDbtfbxEbxFaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqbccabqaaaabqaaabccbxGbccbxHbxIbfebxJbccbxGbccbccaWDbgVbxKbxLbfGbxMbvBbxNbvBbxObfGbxPbxQbxRbxSbxTbxUbxVbxWbxXbxYbxZbyabxTbxTbxTbybbxTbycbydbxVbyebxTbxTbyfbygbyhbvVbqcbyibyjbykbylbymbynbymbymbwdbAjbAebyqbyqbyqbyrbysbytbyubyvbyqbyqbyqbBWbCcbkWbhwbyybyzbyAbyBbyCbhwbyDbyEbyFbyGbwxbsnbyHbyIbCdbsmbyKbyLbyMbyNbspbspaoGaoGbyOaoGaoGaoGbyPbCeaoGaoGbyRbySaoGbyTbwTbyUbntbjNbjNbjNbjNbyVbjNbjNbyWbyXbyYbntbntbyZbzabzbbzcaaabqYbzdaaaabqaaaaaaabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqabqaaabxkbxlbsLabqbzebzfbzgbzhbzibzjbrgbzkbzlbzmbznbzobzpbrgbzqbzrbzsbrkbztbzubtfbtgaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabccbccbdQbccaWDbccbdRbccbzvbaBbzwbzxbccbdRbccbzybzzbzAbtlbtmbfGbzBbzCbtpbzCbzBbfGbzDbzEbzFbfGbzGbzHbzIbfGapfbzJapfbzKbzKbzLbzMbzNbzLbzKbzKbzKbzKbzKbzKdeDbzPbzQbzRbzSbzTbzUbzVbzWbzVbzXbzYbzZbAabCfbAcbAdbCibAdbAdbAfbAgbAhbyqbyqbAibyqbCkbAkbhwbAlbAmbAnbAobApbAqbhwbArbhtbAsbbrbAtbsmbsmbsmbsmbsmbAubAvbspbspbspbAwbAxbspbAybAzbAAaoGazpbABaoGbACbADbAEbAFbAGbAHbAIbAJbAKbALbAMbAKbANbAObjNbAPbAQbARbASbATbAUbAVbAWbAXbsJbAYbAZabqabqabqabqabqaaaabqaaaabqaaaabqaaaabqaaaaaaaaaaaaaaaaaaabqbpraaabxkbBabrbbBbbBcbrebpsaXIaXLbBdbBebBfbBgbBhbBibrgbrgbBjbBkbBlbrkbrkbBmbBnbBoaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabccbccbdQbccaWDbccbdRbccbzvbaBbzwbzxbccbdRbccbzybzzbzAbtlbtmbfGbzBbzCbtpbzCbzBbfGbzDbzEbzFbfGbzGbzHbzIbfGapfbzJapfbzKbzKbzLbzMbzNbzLbzKbzKbzKbzKbzKbzKdeDbzPbzQbzRbzSbzTbzUbzVbzWbzVbzXbzYbzZbAabCfbAcbAdbThbAdbAdbAfbAgbAhbyqbyqbAibyqbCkbAkbhwbAlbAmbAnbAobApbAqbhwbArbhtbAsbbrbAtbsmbsmbsmbsmbsmbAubAvbspbspbspbAwbAxbspbAybAzbAAaoGazpbABaoGbACbADbAEbAFbAGbAHbAIbAJbAKbALbAMbAKbANbAObjNbAPbAQbARbASbATbAUbAVbAWbAXbsJbAYbAZabqabqabqabqabqaaaabqaaaabqaaaabqaaaabqaaaaaaaaaaaaaaaaaaabqbpraaabxkbBabrbbBbbBcbrebpsaXIaXLbBdbBebBfbBgbBhbBibrgbrgbBjbBkbBlbrkbrkbBmbBnbBoaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabccbBpbaBbaCbBqbBrbaBbaBbBsbBtbchbBubBvbBvbBvbBwbBxbBybBzbBAbBBbBCbBDbBEbBFbBGbBBbBHbBIbBJbBKbBKbBLbBKbBKarKbBMbBNbzKbBObBPbBQbBRbBSbzKbBTbBUbzKbBTbBUbzKbzPbfIbkJbqcbBVbClbBXbqcbBYbBZbCabCbbwdbAkbDrbyqboEbDVbCgboEboEbAkbChbDWbCjbyqbEfbEgbhwbCmbCnbCobCpbCqbCrbCsbCtbhtbhybbrbhzbspbCubCvbCwbCxbCybCzbCAbspbCBbCCbCDbCEbCFbCGbCHaoGaoGaoGaoGaoGaoGbCIaoGbCJbCKbCLbCMbCNbCNbCNbCNbCNbCMbCMbCNbCObCPbCQbCRbCSbCTbCUbCVbCMbCMbCMabqaaaaaaaaaabqaaaabqaaaabqaaaabeaaaabeaaaaaaaaaaaaaaaaaaaaaabqabqabqabqabqabqabqarBbicaXIaXObCWaXLbCXbCYbCZbDabDbbDcbDdbDebDfbDgbDhbDibbXbbXbDjaXLaXLbnUaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabccbcdbcebcebDkbcebDlbDmbDnbDnbDobDnbDpbDqbEJbDsbDtbDubDvbDwbpBbDxbDybDzbDAbDBbDCbDDbDEbDFbDGbDHbDIbDJbBKbDKbDLanHbzKbDMbDNbBQbBRbBSbzKbDObDPbzKbDObDPbzKbDQbfIbkJbqcbqcbDRbqcbqcbqcbDSbDTbDUbqcbFJbtQbDXboEbwibwibDYbDZbEabEbbEcbEdbEebshbFUbEhbEibEjbEkbElbEmbEnbhwbEobhtbEpbbrbhzbspbEqbErbCybEsbCybEtbCybEubEvbCHbEwbExbEybEzbEAbEBbECbEDbEEbEFbEGbEHaoGbEIbwTbHCbCMbEKbELbEMbENbEObCMbEPbEQbERbESbETbEUbEVbEWbEXbEYbEZbFabCMabqabqabqabqabqabqabqaaaabeaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhbFdaXOaaaaXLbFebFfbFgbDabFhbFibFjbFkbFlbFmbFnbDaaXLaaaaaaaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqbccbccaWDbccbdQbccaWDbccbccbccaWDbccaWDaWDaWDbnWbnXapfbFoapfapfbFpbFqbFpbFrbFpbFpbFpbFpbBKbBKbFsbFtbBKbBKbBKbFuaoXbzKbFvbFwbBQbFxbzKbzKbFybzKbzKbFzbzKbzKbFAbfIbkJbFBbFCbFDbFEbFFbFGbFDbFDbFHbFIbAkbHDbAdbFKbFLbFMbFNbFObFPbFQbFRbFSbyqbFTbAkbhwbFVbFWbFXbFYbFZbGabhwbGbbhtbhybbrbhzbspbGcbGdbGebGdbGfbGgbGhbGibEvbCHbGjbGkbCHbEvbGlbGmbGnbGobGpbGqbEGbySaoGbGrbGsbGtbGubGvbGwbGxbGybGzbCMbGAbGBbGCbGDbETbGEbGFbGGbGHbGIbGJbGKbCMabqbGLbGLbGLbGLbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhbFdaXOaaaaXLbGMbGNbGObDabGPbGQbGRbGSbGTbGUbGVbDaaXLaaaaaaaUUbjPaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -8602,7 +8603,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqbccbccaWDbccbdQbccaWDbccbccbccaWDbccaWDaWDaWDdfRbPMbPNbPObPPbPQbFpbPRbPSbOibPTbPUbPVbFpbBKbBKbBKbBKbBKbBKbBKbFuanHbzKbPWbPXbJabBRbFwbFwbPYbFwbPZbQabzKbQbbzPbfIbQcbMSbQdbQebQfbQgbQhbOBbQibQjbQkbQlbQmbQnbQobQobQobQpbQqbQrbQsbQtbQsbQubQvbQwbQxbQybQzbQAbQBbQCbQDbNhbQEbhtbQFbQGbQHbQIbQIbQIbQJbQKbQLbQMbQNbQIbQObQIbQPbQQbQRbQSbQTbEGbEGbQUbEGbEGbEGbNFbQVbQWbQXbQVbCMbCMbCMbCMbCMbQYbNObVpbRabRbbGGbRcbRdbRebRfbInbRgbRhbRibETabqbETbRjbRkbRlbGLabqaaabFcaaabFbaaabRmarBarBarBarBabearBarBarBaaaaaaaaaabqabearBarBarBarBarBaZhaXIaXOaaaaXMbRnbRobRpbOabRqbOabRrbRsbRtaXMaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabccbRubzzbaCbRvbaCbaBbaBbRwbaBbzzbaBbRxbzzbaBdfSbRyapfbRzaoXatkbFpbRAbRBbHfbHfbHfbRCbFpbRDbREbRFbRGbRHbRIapfbFuauCbzKbRJbRKbJabRLbRMbRMbRNbFwbFwbRObzKbRPbzPbfIbOvbMSbRQbRRbRSbRTbRUbOBbRVbRWbRXbRYbMWbRZbSabSbbSabScbNdbSdbSebSfbSebSgbNhbShbSibSjbSkbSlbSmbSnbSobNhbSpbhtbSqbbrbOWbQIbVrbVsbStbSubSvbSwbSwbSxbSybQIbQIbQIbQIbQIbQIbQIbEGbSzbSAbSBbEGbSCbQVbSDbSEbSFbQVbSGbSHasMbSIbCMbSJbSKbSLbSMbSNbSObSPbSQbSRbSSbRgbSTbSUbMibMjbMkbSVbPEbSWbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfcbicbSXbbXbbXbSYbpvbSZbTabOabTbbOabTcbTdbKjbSYbbXbbXbTeaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabccbcdbcebcebcebcedfUdfTdfWdfVdfYdfXdgadfZdgcdgbbTmapfbgYauyatkbFpbHhbTnbHfbHfbTnbTobFpbTparJarLbTqbPQbRHapfbFubTrbzKbTsbTtbTubTvbFwbTwbTxbTybTzbTAbzKbTBbzPbfIbTCbMSbTDbTEbTFbTGbOBbOBbTHbTIbTJbTKbMWbRZbSabSabSabTLbNdbSdbSebTMbTNbTObNhbTPbSibTQbTRbNhbTSbTTbTUbNhbTVbhtbTWbbrbTXbTYbUabUabUbbUcbUdbStbStbUebUfbQIbUgbUhbUibUhbUjbQIbUkbUlbUmbUnbEGbNFbQVbUobUpbUqbQVavBasJasJbUrbCMbSJbUsbUtbCNbCNbCNbUubGGbUvbGGbRgbUwbRibETabqbGLbGLbGLbGLbGLabqaaaabeaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhaXIaXOaaaaaaaXMbUxbOabOabOabUybUzbUAaXMaaaaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqbccbccbUBbUBbccbccdgeaWDdggdgRdggaWDaWDapfbUCapfapfapfbgYauCatkbFpbTobUDbUEbHfbUEbUFbFpbUGathapdatjbUHbXJapfbFuaoXbzKbzKbzLbUIbUJbzLbzKbzKbzKbzKbUKbzKbzKbULbjnbUMbMSbUNbUObUPbUQbURbOBbUSbUTbUUbUVbMWbUWbUXbUYbUZbVabNdbVbbSebVcbVdbVebNhbVfbSibVgbVhbVibVjbVkbVlbNhbVmbhtbVnbbrbOWbVobVtbVqbXcbYtbYsbVubVqbUebVvbQIbVwbVxbVybVzbUjbQIbVAbVBbVCbVDbVEbVFbQVbVGbVHbVIbQVbVJbVKbVLbVMbCMbVNbVObRabVPbCNbVQbSRbGGbSPbVRbVSbVTbPCbItbIubIvbVUbVVbVWbGLabqaaabFcaaabFbaaabFcaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhaXIaXOaaaaaaaXMbVXbVYbVZbOabWabWbbVXaXMaaaaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqbccbccbUBbUBbccbccdgeaWDdggdgRdggdfNaWDapfbUCapfapfapfbgYauCatkbFpbTobUDbUEbHfbUEbUFbFpbUGathapdatjbUHbXJapfbFuaoXbzKbzKbzLbUIbUJbzLbzKbzKbzKbzKbUKbzKbzKbULbjnbUMbMSbUNbUObUPbUQbURbOBbUSbUTbUUbUVbMWbUWbUXbUYbUZbVabNdbVbbSebVcbVdbVebNhbVfbSibVgbVhbVibVjbVkbVlbNhbVmbhtbVnbbrbOWbVobVtbVqbXcbYtbYsbVubVqbUebVvbQIbVwbVxbVybVzbUjbQIbVAbVBbVCbVDbVEbVFbQVbVGbVHbVIbQVbVJbVKbVLbVMbCMbVNbVObRabVPbCNbVQbSRbGGbSPbVRbVSbVTbPCbItbIubIvbVUbVVbVWbGLabqaaabFcaaabFbaaabFcaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhaXIaXOaaaaaaaXMbVXbVYbVZbOabWabWbbVXaXMaaaaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaaabccbWcbfdbccdghdgjdgibBtdgkbBtdgldgmapfbWdbWebWfbWgbWhbWgbWibFpbFpbFpbFpbWjbFpbFpbFpbWkdeJdeHapdbWlbWmapfbWnbWobzKbWpbWqbWrbWsbWtbWubWvbzKbWwbWxbWybzKbzPbfIbWzbMSbQdbTEbWAbWBbQdbOBbWCbWDbWEbWFbMWbWGbWHbWIbWJbWKbWLbWMbWNbWObWPbWQbNhbWRbWSbWTbWUbWVbWWbWXbWYbWZbXabhtbXbbbrbOWbVobYubXdbXdbXebXfbXgbXhbXibXjbQIbXkbVxbXlbXmbXnbQIbXobXpbXqbXrbEGbNFbQVbQVbQVbQVbQVbXsasJasJbXtbCMbVNbVObRabXubXvbVQbXwbInbSPbXxbRgbXybRibETabqbETbXzbXAbXBbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhaXIaXOaaaaaaaXMbXCbKlbXDbXEbXFbKlbXGaXMaaaaaaaZhaXIaWCarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqabqbccbUBbUBbccdgndgjbBtbBtdgobBtdgpdgqapfbXHavUavUavUbDLathatkaoXaqBayBanHbXIauyauCapfapfapfapfapfbXKapfapfbFuatjbzKbXLbXMbXNbXNbWsbXObXPbzKbXQbXRbXSbzKbDQbfIbXTbMSbQdbXUbXVbXWbXXbOBbXYbXZbYabMWbMWbYbbYcbYdbYebYfbNdbYgbSdbYhbYibYjbNhbYkbYlbYmbYnbSlbYobYobYpbNhbYqbhtbYrbbrbOWbQIbYvbYEbYwbStcbacbbbUcbYxbYybYzbYAbYBbYCbYDccrbQIbEGbEGbEGbEGbEGbYFaoGbYGbUraucasJchGchFbYIasJbCMbCMbYJbNRbVPbCNbYKbYLbGGbYMbVRbRgbYNbSUbMibMjbMkbYObVVbYPbGLabqaaabFcaaabFbaaabFcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBbicbYQaXLaXLaXLbpubbXbbXbbXbcabbXbbXbbXbDjaXLaXLaXLbnUaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabredgrdgtdgsdgvdgudgxdgwdgyapfapfapfapfbWmbYRavUbYSbYTbYUbYVbYVdfibYWbYXbYVbYTbYVbYYbYVbYZbYVaPTbZaapdbzKbZbbZcbZdbZebHrbZfbZgbzKbzKbzKbzKbzKbZhbfIbOvdeEbMSbZjbZjbZjbMSbMSbMWbMWbZkbMWbMWbZlbZlbZlbZmbZlbZnbZnbZobZpbZnbZnbNhbNhbNhbNhbNhbNhbZqbZqbZqbNhbZrdeFbZsbbrbZtbZubZvbZvbZvbZwbZvbZvbZxbZybZvbZvbZvbZvbQIbZzbZAbZBbZCbZDbZEasJbZFbZGaoGbVLbZHbZIasJbYHckgasJarrbCMbZJbJWbZKbCNbCNbCNbZLbGGbZMbZNbRgbUwbRibETabqbGLbGLbGLbGLbGLabqabqbRmabqbPGabqabeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarBaZhaXIaXOaaaaaaaaaaaaaaaaaabZOaaaaaaaaaaaaaaaaaaaZhaXIaXOarBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm index 288ac0f9044..90fdad55ab1 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) diff --git a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm index e68167fea13..5003686f08a 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) @@ -116,7 +116,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 +128,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 +277,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 +317,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 +334,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 +449,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 +503,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 +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPbQbFbnarbRbRbSbRbRbTbUaaaaaaaEbVbtbuaHbWbXaHaHaHbYbZbWbYbZaPbccacbcccccdccccccccbyceaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfcgchcicjckclclclclclcmclclclcmcnaxaxaxaxaAcpcpcpaCaxaxaxaxbVcqcrcsctcrcrcucvcwcxcyczaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCcDcCcEcFcGcHcIcJcKcIcLcGcMcNcOcPcQcRcMcMcMcMcScTcUcScVcWaxaxaxaxaxaxaxaxayaAcXaCcncoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcYcZcYdacCcEcMdbcHdcdcdcdccLcMcMdddedededfcMcMcMcMdgdgcMdgcMdhdididjdkdldmdldnaPdodpdqdrazaxaycoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCdsdtdsdudvcEcMcMcHdcdwdcdccLcMcMdxdydzdAdBcMcMcMcMcMcMcMcMcMaPdjdCdjbJdDdEdFdGaPdHdpdododIdJcWazaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCdKdLdMdNdOcEcMcMdPdQdQdRdQdScMcMdTcMdUdVdVdVdVdVdVdVdVdVdWcMdhdjdXdjdraxaxaxaxbVdHdYdZeaebecbbedeeefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciegegegeheiejekelddemeneoeoeoeoeoeodWcMddcMepcMeqerererererererepcMaPdjesdjdjdjdjdjetaPeuevbdewbdexeyezeeefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeAeBeCegcYcZcYcZeDeEeoeFererererereGeHcMeIcMepeJeKeLeKeKeKeKeMeNeOePbbdjeseQeReReSdjdjaPeTeUbdeVeWeXbJezeeefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeYeZfaegfbdtdsdtfcdTcMcMerfdfefdfffgepfhepcMepcMfierererererererepfjfkflfmfnfofpfqdjdjaPfreUbdewbdfscWayaxftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeYeZfaegcYfufvfwfxddcMcMerfdfdfgfffgfyeofzeofAcMcMcMcMcMfBcMcMcMepcMfCdjesfDfofofEdjdjaPfFevfoewbdfGcWazaxaEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeYeZfaegcYfufvfwfxddcMcMerfdfdfgfffgfyeofzeofAcMcMcMcMcMfBcMcMcMepcMfCdjesfDfofofEdjdjaPfFevfoewbdfGcWazaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafHfIfJegdsfKdsdtcCfLcMcMerfMfdfgfNfgepcMfOcMepcMcMfPcMcMcMcMcMcMfQdVfRfSfTfDfUfofEdjdjaPfFevfofVeWfWbbfXeeefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUegegegegfYegfZgadTemcMerfdfggbffgcepcMdTcMepcMeqerererererererepgdgeflfmfngffoggdjetaPeuevfobdbddJeyezeeefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaghahagaggigjagagaggkcMcMerfgfgfgglfgepgmddcMepgngogpgqgqgqgqeMeNeOgrbJdjesgsgtgtgudjdjaPdHeUbdgvbdgwbJgxeeefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -584,3 +584,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} + diff --git a/_maps/map_files/RandomZLevels/centcomAway.dmm b/_maps/map_files/RandomZLevels/centcomAway.dmm index fe4583e5be0..11cab2ce739 100644 --- a/_maps/map_files/RandomZLevels/centcomAway.dmm +++ b/_maps/map_files/RandomZLevels/centcomAway.dmm @@ -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) diff --git a/_maps/map_files/RandomZLevels/moonoutpost19.dmm b/_maps/map_files/RandomZLevels/moonoutpost19.dmm index 71c30499550..57218ff1ad2 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"}) @@ -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..0baeb1bcaf4 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) @@ -615,13 +615,13 @@ abababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbUbVcdbZbZbZdedededfdfdgdgdhdhdhdididicbhOhPhQcbhRcbhRcbhRcbhRcbhRcbbZbZcbgFgFgFgFgFgFgFhScbbZbZcObSbSbSbSbSeGbSbSbSbScabSbSbSbSeGbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSeHcacacphTabababababababababababababababababababababababababdqdtbZbZbZbZbZbZbZbZbZbZbZbZcGcWcWababababababababababababababababababababababababababababhphehfhfhfhfhfhfhfgXgMabababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcdbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcbhPhPhPcbhUhVhUhVhUhVhUhVhUcbbZbZcbgFhvgFgFgFgFhWhXcbbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcYbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcbabababababababababababababababababababababababababababcbbZbZbZbZbZbZbZbZbZbZcYbZcVcWdbababababababababababababababababababababababababababababhphehfhfhfhfhfhfhfhghhabababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcdbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcbhYhPhZcbhPhPhPhPhPhPiahPhPcabZchcbgFgFgFgFgFibgRgFcbbZcYbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcbabababababababababababababababababababababababababababcbbZbZbZbZbZbZbZbZbZbZbZbZdacWcWababababababababababababababababababababababababababababhphehfhfhfhfhfhfhfhghqabababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcsbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcbhPhPhPgDichPhPhPhPhPidhPhPcabZbZcbieifgFieifgFieifcbbZbZcrbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbShTabababababababababababababababababababababababababababdqbSbSbSbSbSbSbSbSbSbSbSbSbSbSfiababababababababababababababababababababababababababababiggXgXgXgXgXgXgXgXgXhzabababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcsbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcbhPhPhPgDichPhPhPhPhPidhPhPcabZbZcbieifgFieifgFieifcbbZbZcrbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbSbShTabababababababababababababababababababababababababababdqbSbSbSbSbSbSbSbSbSbSbSbSbSbShTababababababababababababababababababababababababababababiggXgXgXgXgXgXgXgXgXhzabababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcsbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcbhYhPhQhVhPhPhPhPhPhPiahPihcbbZbZcbgFgFgFgFgFgFgFgFcbbZbZcGcHcHcHcHcHcHcGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababgLhzababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcsbZbZbZbZbZbZbZcobZbZbZbZbZbZbZbZcbhPhPhPhUhPhPhPhPhPhPhPhPihcbbZbZcbiiijikiiijikiiijcbbZbZcGcHcHcHcHcHcHcGababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcdbZbZbZbZbZbZbZbZbZilbZimcKcJbZcmcpbQbQbQbQbQbQbQbQbQbQbQbQbQeHbZbZcObSbSbSbSbSbSbSbSeHbZbZcpbQbQbQbQbQbQfiababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcdbZbZbZbZbZbZbZbZbZilbZimcKcJbZcmcpbQbQbQbQbQbQbQbQbQbQbQbQbQeHbZbZcObSbSbSbSbSbSbSbSeHbZbZcpbQbQbQbQbQbQhTababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababccbVcdbZbZbZbZbZbZbZbZbZbZbZbZbZcKincKcabZbZbZbZimbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZcbabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababiobVbWipbZbZbZbZbZbZimbZbZbZcIcIcKcmcKcabZbZbZbZbZbZbZbZbZbZbZbZbZbZbZbZchbZbZbZbZbZbZbZbZbZbZbZcbabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab -ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdqbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQeGbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbSbSbSbSbSbSbSbSbSbSbSfiabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab +ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababdqbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQeGbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbQbSbSbSbSbSbSbSbSbSbSbShTabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab ababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab @@ -730,3 +730,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..bf7e67bcd2d 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) @@ -680,12 +679,13 @@ aafZgbgbgbgbgbfZhEiDilgzgzgzgzgzgzjogzgzgzjpjpiYiYjqiYiYiYiYjriYiYiYjsjtjujujuju aafZgcgcgbgcgcfZhVhuhqjyjzjAiljBhujChuhuhuhuhuiYjDjEjFiYjGjHjHjIjJiYjKjEjujLjMjNjOjPjujQjQjRjRjSjQjTaaaaaaaaaaaaaaaaaaaaaaaaaaaa aafZgbgbgbgbgbfZjUjViDhqhWhujWjyhujXhuhuhuhuhuiYjYjZkaiYkbkckdkekfiYjKkgjujLkhkikjjPjujQjQjQjQjQkkjTaaaaaaaaaaaaaaaaaaaaaaaaaaaa aafZklklklklklfZgzkmknkokmkngzgzgzgzgzjpgzgzgziYiYiYiYiYiYiYkpiYjriYjKjEjukqkrksktkujukvjQkwjQjQjQjTaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aagakxkykykykzgaaafLkAgRkBkCaagzkDkEkFhukGjzhuiYkfjHkfiYkHjHjHkIkfiYjKjEjukJkKkLkKkMjujQkkjQkNjQjQjTaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aagakxkykykykzgaaafLkAgRkBfQaagzkDkEkFhukGjzhuiYkfjHkfiYkHjHjHkIkfiYjKjEjukJkKkLkKkMjujQkkjQkNjQjQjTaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaafZkOkPkQfZaagzhuhujzhuhujzhuiYkRjKkSiYkRjKjKjKkTiYjKjEjukUkVkWkVkXjujQjQjSjQjQkkjTaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaafZkOgbkQfZaagzhujzhujzhuhuhuiYkfkdkfkpkRjKkYkZlaiYjKjEjulbkVkWkVlcjukkjQjQldkwjQjTaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaafZkOgckQfZaagzlehulfhulghuhuiYiYiYiYiYlhjKlijKljiYjKjEjulkkVkWkVlljujujujujulmlnloaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaalplqlrlqlsaagzlthuluhulvjzhuiYlwlxlyiYkRjKlijKlziYjKlAjujujulBjujujulClDlEjuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaahvlqlrlqhRaagzlthuluhulvjzhuiYlwlxlyiYkRjKlijKlziYjKlAjujujulBjujujulClDlEjuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaagzltlFlGlHhuhuhuiYlIkfkfkpkRjKlJjKlKiYlLlMlNlOlOlPlOlQlRlSlTlUjuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaagzgzgzgzgzgzgzgziYlVlWlXiYkfkdlYlZmaiYjKjKjKmbmbmbmbmcjulCmdmejuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYjujujujujuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} + diff --git a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm index 9bae9a8215c..04d8818ad02 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"}) @@ -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..3dd893ed2af 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -140,7 +140,7 @@ "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"}) @@ -384,7 +384,7 @@ "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) "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) @@ -882,9 +882,9 @@ "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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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,6 @@ "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) "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 +6766,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 +6782,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 +6827,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 +6854,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 +6961,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 +6986,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 +7104,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 +7208,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 +7451,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 +8190,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 +8215,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) @@ -8337,8 +8336,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 +8357,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 +8407,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) @@ -8742,7 +8741,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 +8766,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 +8795,79 @@ "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) (1,1,1) = {" bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -8829,15 +8901,15 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfvdfydfaardardarddfzardarddfhdfAdfBdftdfhardarddfCardardardardargcUKaaecUKareardardarddfDardardardargasRbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfvdfFdfEardardarddfrardarddfhardardarddfhardarddfGardardardardarddfHdfIdfHardardardardardardardardarddfJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfvdfidfiardardarddfzardarddfhdfKdfwarddfhardarddfCardardardarddfscUKaaecUKdeWardardardardardarddfLdfsasRbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfvardardardardarddfhardardargaaeaaedfrareardarddfhdfxardarddfscUKdfMbikdfNasOaaeaaeaaeaaeaaeaaeaaeasOdfMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfOardardardarddfPdeYdeWardardardardardardardarddfharddfsarbasOdfMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfhdfRdfQdfSarddfscUKasOaaeaaearbdeWardardardarddeYaaecUKdfMdfobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfvardardardardarddfhardardargaaeaaedfrareardarddfhdfxardarddfscUKaNhbikaNnasOaaeaaeaaeaaeaaeaaeaaeasOaNhbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfOardardardarddfPdeYdeWardardardardardardardarddfharddfsarbasOaNhbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfhdfRdfQdfSarddfscUKasOaaeaaearbdeWardardardarddeYaaecUKaNhdfobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdeYdeWdfadfTdfscUKaredfVdfUdfWargasRardarddfkdfXdfldeZdfYaaeasPbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfNasOaaedfZasOareardardardardarddfhardarddfsarbasRdffdgadeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgbardardardardardardarddgcdfKdfscUKdfMdfNdgedgddeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgfarddggardardardardarddeYarbcUKdfMbikbikdfNdgedeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaagaafaajaaiaaiaaiaakaafaaJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfNaaearbdeWarddghdgidfscUKasOdfMbikbikbikbikdfNarbdfnbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlbmOcaVbZycaXcaWccwccwbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdfNasOaaeaaeaaeasOdfMbikbikbikbikbikbikbikdfNdfMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNnasOaaedfZasOareardardardardarddfhardarddfsarbasRdffdgadeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgbardardardardardardarddgcdfKdfscUKaNhaNndgedgddeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgfarddggardardardardarddeYarbcUKaNhbikbikaNndgedeVdeUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaagaafaajaaiaaiaaiaakaafaaJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNnaaearbdeWarddghdgidfscUKasOaNhbikbikbikbikaNnarbdfnbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlbmOcaVbZycaXcaWccwccwbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNnasOaaeaaeaaeasOaNhbikbikbikbikbikbikbikaNnaNhbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlccxcaVcaVccycaVcaVcczbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFlcyacSKcaVcaVcTOcaVcTWbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVGaafaafaafddwaafaafaafdelbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -8858,8 +8930,8 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiSdiUdiTbFlbikbFldiVdiVdiVbFlbikbFldiWdiYdiXbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaalabXabYabZacaacbaccacdaceacfacfaalbikbikbikbikbikabKabLabLabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwbikbikdgOdgGdgydgPdgQdgydgydgGdgRbikbikdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbFldiVdiVdiVbFlbikcVGdiZdjbdjadelbikbFldiVdiVdiVbFlbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacgacgacgacgacgachaciacjackaclaalacmbikbikbikbikbikabKabLabLabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgwdgNdgwdgwdgwdgwdgwdgwdgwdgSdgwdgwdgwdgwdgwdgwdgwdgNdgwbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikcVGdiZdjbdjadelbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacnacoacpacqacracsacdaalaalaalaalbikbikbikbikbikbikbikabKabLabLabKactactactacuacvactactactabKabKabKabKabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgHdgNdgTdgTdgTdgTdgTdgTdgmdgUdgmdgTdgTdgTdgTdgTdgTdgNdgJbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacwacxacyaczacAacBacCaalacDacEacEacEacEacEbikbikbikbikbikabKacFacGactacHacIacJacKacLacMactabLabLabLabLabLabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgVdgXdgWdgZanqdhadgmdgSdgwdgSdgwdgSdgmdhcdhbdhedhddgXdhfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikacgacNacOacPacQacRacSacCaalacEacEacUacTacVacEacEacEbikbikbikbikabKacGactacWacXacYacXacXacZactadaadaadaadaadaadaabLadbbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgOdgXdgydgydgydhgdgmdgydgydgydgydgydgmdgydgydhhdgydgXdgRbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacwacxacyaczacAacBacCaalacDacEacEacEacEacEbikbikbikbikbikabKacFacGactacHacIacJacKacLacMactabLabLabLabLabLabKbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgVdgXdgWdgZanqdhadgmdgSdgwdgSdgwdgSdgmdhcdhbdhedhddgXdhfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikacgacNacOacPacQacRacSacCaalacEacEacUacTacVacEacEacEbikbikbikbikabKacGactacWacXacYacXacXacZactadaadaadaadaadaadaabLadbbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgOdgXdgydgydgydhgdgmdgydgydgydgydgydgmdgydgydhhdgydgXdgRbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacgacgacgacgacgacgadcaddacEacEadeadgadfadiadhacEacEbikbikbikbikbikabKactadjadkadladmadnadoactadpadqadradsadtaduadvbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhjdhidhldhkdhmdgmdhndgydgydgydhodgmdhqdhpdhsdhrdhjdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikadwadxadyadzadAadwadBadCacEadEadDadGadFadIadHadJacEbikbikbikbikbikbikactadKadLadMadNacXadOactadPadtadtadtadtaduadvbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgmdhtdhtdgwdgwdgwdgmdhudgydgydgydhvdgmdgwdgwdgwdhtdhtdgmbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikadQadQadQadQadQadRadSadTadUadwachacdacEadWadVadYadFaeaadZaebacEbikbikbikbikbikaesactaecaedaeeaefaegaehactaeiadtaejadtadtaduadvbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdgLdhwdhwdgFbikbikdgmdhxdgydgydgydhydgmbikbikdgLdhwdhwdgFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -8872,11 +8944,11 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafAafyaeAafyafAafyaeAbikagSahCahDahEahFahGahHahIahJahKahLahMahNagvahOahRahQairahSahTahUahVahWahXahYahZahUaiaaibaicaidahYahZahUahUahAadaadaadaadaadaaieaieaieahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQaabaabaabahBaabaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGafxacGacGbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafyafyafAaeAafyafyafAaeAbikagSaifaigaihagSaiiaijaikailaimainaioaipagvaiqaisahhamuaitaiuahUaivaiwaixaiyaizaiAaiBaiCaiDaiEaiFaiGbOIaiHahAaieaieaieaieaieaieaieaieahAbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikagQbikbikbikaiIbikbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikaabbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaeAafAafyaiJaeAafAafyaiKaeAbikagSaiLaiMaiNagSaiOaiOaiOaiOaiPaiQaiRaiSagvaiTaiUaiVaiWaiXaiYahUaiZajaajbajcajdajeajfajgaiDaiEajhaiGajhajiahAaieaieaieaieaieaieaieaieahAagQagQajjaabagQagQagQagQagQagQagQagQagQagQagQagQagQagQaabaabajkajlajmaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmidmddmkdmjdmldmddmddmmdmddmddmnbikbikbikbikbikbikbikbikbikafxaabajnaabafxbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaeAajoajpajqajrajoajpajqajsajtajuajuajuajuajuajuajuajuajvajwajxajyajzajAajBajCajDajEajFajGahUajHajIajJajKajdajeajKajgajLaiEaiCaiCajMajNajOaieaieaieaieaieaieaieaieahAaabaabaabaabaabaabbikaabbikaabaabaabaabaabaabaabaabbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVydmddmkdmjdmldmddmddmmdmddmddmnbikbikbikbikbikbikbikbikbikafxaabajnaabafxbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaeAajoajpajqajrajoajpajqajsajtajuajuajuajuajuajuajuajuajvajwajxajyajzajAajBajCajDajEajFajGahUajHajIajJajKajdajeajKajgajLaiEaiCaiCajMajNajOaieaieaieaieaieaieaieaieahAaabaabaabaabaabaabbikaabbikaabaabaabaabaabaabaabaabbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmpdmodmrdmqdmtdmsdmsdmsdmvdmudmwbikbikbikacGacGacGafxafxaabaabbikajQbikaabaabafxafxacGacGacGbikbikbikbikbikbikbikbikbikbikbikbikaeAajRajSajTafyajUajVajWakcajtajYajZakaakbaknakdakdajuakeakfakgakhakiajBakjakkaklakmalJajFakoakpamwakqajKakraksaktakuakvakwakxakxakzaiCakAaieaieaieaieaieaieaieaieahAaabakBakCakCakCakDakCakCakCakCakDakCakCakCakCakEaabbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmxdmodmzdmydmsdmAdmAdmAdmAdmAdmBbikbikbikacGbikbikaabbikaabbikbikajQbikbikaabbikaabbikbikacGbikbikbikbikbikbikbikbikbikbikbikbikaeAakFafyakGakHakIakJakKakLajtakMakNakOakOakPakQakRajuakSakTakUakVakiakWakXakYakZalaalbalcaldaleaAEalfalgalhalialjalkallalmaiCaiCaiCalnajOaieaieaieaieaieaieaieaieahAaabaloaabaabaabaloaabbikbikaabaloaabaabbikbikaloaabbikaabaabajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmCdmodmEdmDdmAdmAdmAdmAdmGdmFdmwbikbikbikacGaabalpalpalpalpalpbikalqbikalpalpalpalpalpaabacGbikbikbikbikbikbikbikbikbikbikbikbikaeAalralsakGafyaltakJalualvajtalwalxalyalzakQakQakRajualAalBalCalDalEajBalFalGaklalHalIajFajXalKalLalLalMajdalNalOalPalQaiCaiFaiGaiCalRahAahAahAahAahAahAahAahAahAahAaabaloaabbikajkajlajmbikbikajkajlajmbikbikajkajlajmaabaabbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdmHdmddmddmddmldmddmddmmdmddmddmIbikbikbikacGbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikamaalZaowanxambbikbikbikamcaeAaeAaeAamdamdameamfamgamdajuamhamiamjamkamlammamnajuamoampamqakVamrajGamsamtaXNamvaYjajGamxamyamzamAamBamCamDamEamFamGaiCajhamHamIamJahAamKamKamKamKamKbikbikbikbikaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaXhdmddmddmddmldmddmddmmdmddmddmIbikbikbikacGbikalSalTalTalTalTalUalValWalXalXalXalXalYbikacGbikbikbikamaalZaowanxambbikbikbikamcaeAaeAaeAamdamdameamfamgamdajuamhamiamjamkamlammamnajuamoampamqakVamrajGamsamtaXNamvaYjajGamxamyamzamAamBamCamDamEamFamGaiCajhamHamIamJahAamKamKamKamKamKbikbikbikbikaabaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGaabamLamLamLamLamLbikamMbikamLamLamLamLamLaabacGbikbikbikamOamNamQamPamOamRamSamSamTamUamVamWamXamYamZanaanbancajuajuandaneajuajuajuajuajuanfanganhanianfajGajBajCanjajEajFajGankanlanmannahUahUahUahUannanoanpanmahUahAayjahAanrantansansanubikbikbikbikbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGbikbikbikaabbikbikbikanvbikbikbikaabbikbikbikaabbikbikbikaEEanwanzanyanBanAanDanCanAanGanGanHanIanJanKanLanManNanOanPanQanRanSanTanSanSanUanVanWanXanYanSanZaoaaobaocaodaoeaofaogaohanSaoiaojaokaolaomaonaooaopaoqaoraosaplaotaovaEHaouaoyaoxbikbikbikbikbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikbikbikajkajPajmbikbikagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGaabalpalpalpalpalpbikamMbikalpalpalpalpalpaabacGbikbikbikamOanEaoAanFamOamRamSamSamSaoBaoHaoIaoJaoKaoLaoMaoNaoOaoPaoQaoRaoSaoTaoUaoVaoWaoXaoYaoWaoZapaaoTapbapcapdaoTaoTapdaoXapcapeaoTaoTapbapcaoVapfapgaphapiapjapkaplapmapnaovaozansansapobikaacapqaacbikaloaabbikajkajPajmbikbikajkajPajmbikbikajkajPajmbikaabaabajkajPajmaabaabagQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -8905,13 +8977,13 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaDEaKzaKAaKzaKBaJraJraKCaKzaKAaKzaKDaKEaKFaKGaxVazHaGpaGpaxVaxVaxVaKHaKHaKHazNaKHaKHaKHaKHaKHaGvaDMaDMaDMaDMaDMaDMaDMaJFaKIaJGbikaabbikaabbikaabbikaabbikaJGaJLaJMaKJaKKaKLaKMaKNaJMaGvaIKaKOaKOaKPaKQaKRaKSaKTaKSaKUaKVaKWaKOaKOaIKaJZaxqaKXazIaKbaGKaGLaCZaDaaDbaEgaKYaKZaLaaLbaLcaLcaLdaLeaLcaLeaLfaLgaLhaLiaLjaLkaLlaCfaKraChaChaChaChaChaKrayGaCtayHaLmaLnayJayGayJaCtayHayGaCtaDxayGaLoayHayGaLpayHayJaLqaLrayGaLsayHayJaAkaAkaDxaAkaLtaDCaLuaIhaLvaLwaLvaIhaLxaDCaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaLyaCuaLzaGdaKzaLAaLBaLCaLDaKzaGdaLEaInaCuaLFaLGaxVazHazHazHazHazHazHaKHaLHaLIaLJaLKaLLaLMaLHaKHaLNaLOaIDaIDaIDaIDaIDaIDaLPaLQaJGaabaLRaLRaLRaLRaLRaLRaLRaabaJGaJLaJMaLSaLTaLUaLVaLSaJMaGvaIKaIKaIKaIKaLWaLXaJOaLYaJOaLXaLZaIKaIKaIKaIKaJZaxqaMaazIaKbaGKaFAaCZaDaaDbaFBaMbaMcaMcaMcaMcaMcaMcaMcaMdaMcaMeaMeaMeaMeaMeaMfayGaCfaKraChaChaChaChaChaKrayGayGayHaMgaLnayJaMhayGayHayHayGayHaDxayJayHayHayGayHayHayJaDxayIayGayHayHayJaMiayHaDxayHaMjaMkaMkaDCaDCaDCaDCaDCaDCaDCaDDaDDaDDaDDaDDaabbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaKAaKzaKzaKzaKzaKzaKzaKAaInaMlaCuaMmaMnaMoaMoaMoaMoaMoaMoaMpaKHaLHaMqaLJaMraMqaMqaLHaKHaMsaMtaMuaMuaMuaMuaMuaMuaMuaMuaMvbikaLRaMwaMxaMyaMzaMAaLRbikaJGaJLaJMaMBaMCaMDaMEaLSaJMaGvaIKaMFaMFaKPaMGaMHaKSaKTaKSaMHaMIaMJaKOaKOaIKaJZaxqaKaazIaMKaBRaMLaCZaDaaDbaEgaMbaMcaMMaMNaMOaMOaMcaMPaMQaMRaMeaMSaMTaMUaMeaMVayGbikaMWaMXaMXaMXaMXaMXaMYbikayGayHaMZaNaayJayJayGayGayJayJaNbaNcayJayGazxayGayGayJayJaNdaNeayGayGayGaHYaMiayHaDxayHaMjazwayKaFSayGaNfaNgaNfayGayGayGaabaabaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNhaNiaNjaNiaNiaNkaNlaNiaNiaNjaNmaNnaCuaKBaNoaMoaNpaNqaNraNsaNtaNuaKHaLHaMqaLJaNvaMqaMqaLHaKHaNwaNxaNyaNzaNAaNBaNCaNDaNEaNFaMvaabaLRaNGaNHaNIaNJaNKaLRaabaJGaJLaJMaNLaNMaNNaNOaNPaJMaGvaIKaJNaJOaNQaNRaLXaJOaNSaJOaLXaNTaNUaJOaJYaIKaJZaxqaNVazIaKbaEeaEfaCZaDaaDbaNWaNXaMcaNYaMQaMQaMQaNZaOaaObaOcaMeaOdaOeaOfaOgaOhazxbikbikbikbikbikbikbikbikbikayGaOiaOjaOkaOlaOmayGaEtayHaHVaDxayHayGbikayGayHayHayHayHaDxaOnaOoaOpaOpaOpaOpaOqaOraOsaOtaOuaOvaOuaOwaOxaOxaOyaOzaOAaOBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaNhaNmaNiaODaOEaOFaOGaOHaOIaOJaOKaOLaOMaONaOOaKzaKBaOPaMoaOQaORaOSaOTaOSaOUaKHaOVaMqaOWaOXaOYaOXaOZaPaaPbaPcaPdaPdaPdaPdaPdaPdaPeaPfaMvbikaLRaPgaNHaPhaNJaPiaLRbikaJGaJLaJMaPjaPkaPlaPmaPnaJMaGvaIKaPoaPoaKPaPpaMHaKSaPqaKSaMHaPraKWaPsaPsaIKaPtazUaPuazIaKbaEeaPvaPvaPvaPvaPwaPxaPyaPzaPAaPBaPBaPBaPCaPBaPDaPEaPFaPGaPHaPEaPIaPJazxayGayGayGayGayGayGayGayGayGayGayGayGaBMayGayGayGayGayHaDxaOiazvaabazvayHaPLaPMaPNaPOaPPaPQaPRaPRaPRaPRaPSaPTaPUaPVaPWaPXaPWaPYaPWaPWaPZaQabpqaQbaQcaQdaQeaQeaQeaQeaQeaQeaQeaQeaQeabLadbbikbikbikbikbikbikbikaaabdBaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdetaNiaNjaNiaNiaNkaNlaNiaNiaNjaNmdeuaCuaKBaNoaMoaNpaNqaNraNsaNtaNuaKHaLHaMqaLJaNvaMqaMqaLHaKHaNwaNxaNyaNzaNAaNBaNCaNDaNEaNFaMvaabaLRaNGaNHaNIaNJaNKaLRaabaJGaJLaJMaNLaNMaNNaNOaNPaJMaGvaIKaJNaJOaNQaNRaLXaJOaNSaJOaLXaNTaNUaJOaJYaIKaJZaxqaNVazIaKbaEeaEfaCZaDaaDbaNWaNXaMcaNYaMQaMQaMQaNZaOaaObaOcaMeaOdaOeaOfaOgaOhazxbikbikbikbikbikbikbikbikbikayGaOiaOjaOkaOlaOmayGaEtayHaHVaDxayHayGbikayGayHayHayHayHaDxaOnaOoaOpaOpaOpaOpaOqaOraOsaOtaOuaOvaOuaOwaOxaOxaOyaOzaOAaOBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdetaNmaNiaODaOEaOFaOGaOHaOIaOJaOKaOLaOMaONaOOaKzaKBaOPaMoaOQaORaOSaOTaOSaOUaKHaOVaMqaOWaOXaOYaOXaOZaPaaPbaPcaPdaPdaPdaPdaPdaPdaPeaPfaMvbikaLRaPgaNHaPhaNJaPiaLRbikaJGaJLaJMaPjaPkaPlaPmaPnaJMaGvaIKaPoaPoaKPaPpaMHaKSaPqaKSaMHaPraKWaPsaPsaIKaPtazUaPuazIaKbaEeaPvaPvaPvaPvaPwaPxaPyaPzaPAaPBaPBaPBaPCaPBaPDaPEaPFaPGaPHaPEaPIaPJazxayGayGayGayGayGayGayGayGayGayGayGayGaBMayGayGayGayGayHaDxaOiazvaabazvayHaPLaPMaPNaPOaPPaPQaPRaPRaPRaPRaPSaPTaPUaPVaPWaPXaPWaPYaPWaPWaPZaQabpqaQbaQcaQdaQeaQeaQeaQeaQeaQeaQeaQeaQeabLadbbikbikbikbikbikbikbikaaabdBaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaQgaQhaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaQmaMoaQnaQoaQpaQqaQraQsaKHaQtaMqaQuaQvaQwaQxaQyaKHaQzaPdaPdaPdaPdaPdaPdaPdaPeaQAaMvaabaLRaQBaQCaQDaQEaQFaLRaabaJGaJLaJMaQGaQHaQIaQJaQKaJMaGvaIKaIKaIKaIKaQLaLXaJOaLYaJOaLXaQMaIKaIKaIKaIKaQNaQOaQPazIaMKaQQaQRaQRaQRaQSaQTaQUaQVaQWaQXaQVaQYaQZaRaaQVaRbaRcaRdaReaRfaMeaRgaRhaRiaRjaRjaRhaRkaRlaRlaRlaRlaRlaRmaRnaRlaRoaRpaRqaRraRsaRvaRuaTkaRwaRxaRwaRyaRzayHayGaRAaRBaRCaRDaREaRFaRGaRHaRIaRJaRIaRKaRLaRMaRNaROaRPaOCbbVaTCaRTaRUaQdaRVaRWaRXaRYaRZaSaaSbaScaSdaprbikbikbikbikbikbikbikaaabfmbifbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSfaOFaOFaNjaOMaQjaOFaQjaSgaQjaOFaQjaOMaQkaQlaKzaKBaShaMoaMoaSiaSjaSkaSjaMoaKHaKHaKHaKHaSlaSmaSnaSoaKHaSpaSqaSraPdaPdaZVaPdaStaSuaSvaMvbikaLRaLRaSwaSxaSwaLRaLRbikaJGaJLaJMaSyaSzaSAaQJaSBaJMaGvaIKaJNaJOaSCaNRaLXaJOaLYaJOaLXaNTaSDaIKaIKaIKaSEaSFaSGaSHaSIaSJamKamKaSKaSLaSMaSNaMcaSOaMQaMcaSPaMcaSQaMcaSRaSSaSTaSUaSVaTeaSXaSYaSZaTaaTbaTcaTdaTbaTbaUjaTbaSYaTfaSYaOvaTgaSYaThaTiaTjaTmaTlaToaTnaTqaTpaWIaTraOuaTsaTtaTuaTvaTwaTxaTyaTzaRHaTAaTBaRIcLhaTDaTEaTFaROaTGaRQaRRaRSaTHaTIaQdaTJaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikaaabfmbigbijbihbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaONaTMaTNaQiaOMaQjaOFaQjaOFaQjaOFaQjaOMaQkaQlaKzaKBaTOaTPaTQaTRaTSaTSaJraTTaTUaTVaTWaTXaTYaTZaMqcoCaKHaUbaUcaUdaUeaUfaUgaUhaUiaUZaUkaMvbikaabbikaUlaUmaUlbikaabbikaJGaJLaJMaUnaUoaUpaUqaUraJMaGvaIKaUsaUtaKPaUuaUvaKSaUwaKSaUxaUyaUzaIKaUAaUBaUCaUDaUEaUFaUGaUHbikbikaSKaUIaUJaUKaMcaULaUMaMQaMQaUNaMQaMQaMQaUOaMeaUPaMeaUQaURaMeaUSaMeaUTaUUaUVaUWaUXaUYaUTbwNaVaaVbaVcaVbaVbaVbaVbaVdaWLaVbaVeaVfaWFaWBaVbaVhayHaRDaViaTvaVjaVkaVlaVmaVnaVoaVpaVqaRIaVraVsaVtaVuaVvaTGaRQaRRaRSaRTaVwaQdaVxaTKaTKaTLaScaScaScaScaSdaprbikbikbikbikbikbikbdBblqbjMbmKbjMbqQbdBbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVyaVzaNiaODaOMaOFaVAaVBaOFaOFaVCaVAaOMaONaVDaKzaKBaVEaVFaVGaVHaVGaVGaVGaVGaVGaVIaJraKHaVJaVKaVJaKHaKHaVLaVMaVLaMuaMuaMuaMuaVLaVNaVOaMvaVPaVQaVQaVRaVSaVRaVQaVQaVTaJGaVVaJMaVWaJMaVXaVYaVZaJMaWaaIKaIKaIKaIKaWbaWcaWdaWeaWdaWcaWbaIKaIKaWfaUDaUDaUDaUDaWgaWhaWiaWjaWkaSKbKgaUJaWmaMcaMcaMcaMcaMcaMcaMcaMeaMeaUOaWnaWoaWpaWqaWraWsaWuaWtaUTaWvaWwaWxaWyaWzaUTaWAaWGaWCaWDaWCaWEaWHaYDaWNaYFaWJaWKaYGaWMaYEaVbaWOaRtaWPaWQaWRaVjbtTcvIaVmaWTaRIaWUaWVaWWaWXaWYaTFaTFaRIaRIaRQaRRaRSaTHaWZaQdaXaaXbaXcaXdaXeaXfaScaScaXgaprbikbikbikbikbikaaabfmbqRbmKbmKbmKbqSbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaVyaNiaNjaNiaNiaNkaNlaNiaNiaNjaVzaXhaCuaXiaVEaInaXjaXjaXkaXjaXlaDEaXmaXnaJraXoaXpaXqaXqaXraXsaXqaXtaXqaXqaXqaXuaXqaXqaXvaXwaXxaXyaXzaXAaXyaXBaXyaXyaXyaXyaXCaXDaXEaXqaXqaXFaXGaXHaXIaXJaXKaXLaXMaXRaXPaXPaXPaXPaXPaXPaXPaXQaXWaXXaXSaXTaXUaXVaXYaZHaXZaUDaUDaYaaYbaYcaYbaYcaYdaYeaYfaYgaYhaYiaMeaYkbBvaYmaYlaYnaYnaYoaYpaYqaYraUTaYsaYtaYuaYuaYvaUTaYwaYxaYyaYzaYAaYAaYBaYCaYHbbFbalbbHbbGbbJaVgaVbaVhaKsaRDaYIaYJaYJaYKaYLaYJaYMaRIaYNaYOaRIaYPaYQaTFaYRaRIaYSaYTaYUaRSaQbaQbaQdaYVaQeaYWaYXaQeaQeaQeaQeaQeabLadbbikbikbikbikbqUbqTbqVbmKbmKbrUbthbmKbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdeOaVzaNiaODaOMaOFaVAaVBaOFaOFaVCaVAaOMaONaVDaKzaKBaVEaVFaVGaVHaVGaVGaVGaVGaVGaVIaJraKHaVJaVKaVJaKHaKHaVLaVMaVLaMuaMuaMuaMuaVLaVNaVOaMvaVPaVQaVQaVRaVSaVRaVQaVQaVTaJGaVVaJMaVWaJMaVXaVYaVZaJMaWaaIKaIKaIKaIKaWbaWcaWdaWeaWdaWcaWbaIKaIKaWfaUDaUDaUDaUDaWgaWhaWiaWjaWkaSKbKgaUJaWmaMcaMcaMcaMcaMcaMcaMcaMeaMeaUOaWnaWoaWpaWqaWraWsaWuaWtaUTaWvaWwaWxaWyaWzaUTaWAaWGaWCaWDaWCaWEaWHaYDaWNaYFaWJaWKaYGaWMaYEaVbaWOaRtaWPaWQaWRaVjbtTcvIaVmaWTaRIaWUaWVaWWaWXaWYaTFaTFaRIaRIaRQaRRaRSaTHaWZaQdaXaaXbaXcaXdaXeaXfaScaScaXgaprbikbikbikbikbikaaabfmbqRbmKbmKbmKbqSbieaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdeOaNiaNjaNiaNiaNkaNlaNiaNiaNjaVzdeQaCuaXiaVEaInaXjaXjaXkaXjaXlaDEaXmaXnaJraXoaXpaXqaXqaXraXsaXqaXtaXqaXqaXqaXuaXqaXqaXvaXwaXxaXyaXzaXAaXyaXBaXyaXyaXyaXyaXCaXDaXEaXqaXqaXFaXGaXHaXIaXJaXKaXLaXMaXRaXPaXPaXPaXPaXPaXPaXPaXQaXWaXXaXSaXTaXUaXVaXYaZHaXZaUDaUDaYaaYbaYcaYbaYcaYdaYeaYfaYgaYhaYiaMeaYkbBvaYmaYlaYnaYnaYoaYpaYqaYraUTaYsaYtaYuaYuaYvaUTaYwaYxaYyaYzaYAaYAaYBaYCaYHbbFbalbbHbbGbbJaVgaVbaVhaKsaRDaYIaYJaYJaYKaYLaYJaYMaRIaYNaYOaRIaYPaYQaTFaYRaRIaYSaYTaYUaRSaQbaQbaQdaYVaQeaYWaYXaQeaQeaQeaQeaQeabLadbbikbikbikbikbqUbqTbqVbmKbmKbrUbthbmKbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaInaYYaKzaKzaKzaKzaKzaKzaYYaInaMlaCuaYZaZaaInaZbaZcaZdaZdaZeaDEaZfaXnaZgaZhaXpaZiaZjaZkaZlaZlaZmaZnaZnaZnaZoaZpaZpaZqaZraZsaZlaZlaZtaZpaZvaZwaZxaZxaZyaZzaZAaZuaZuaZuaZBaXGaXHaXIaXJaXJaXJaXJaZCaXJaXJaXJaXJaXJaXJaZDaZEaZNaZFaZGaZJaZIaZLaZKaZMaZNaZNaZNaZOaZPaZPaZPaZQaYiaYiaYiaZRaZSaYiaMebbsaZUaYnaYnbcMaYnaZWaZXaYqaZYaUTaZZbaababbacbadaUTbaebafbagbahbaibajaVbaVbbbKbbLaVbaVbbakbbMbakaVbaVhayHaRDbamaTvaTvaTvbanaTvbaoaRIaRIaRIaRIaRIaRIaRIbapaRIaRSaRSaRRaRSbaqbaraQbbasbatbaubavbawbaxbaybazbaAbikbikbikbikaaabtibtjbtibtibtibtkbtibtlbtibtjbtiaQfbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaLyaCuaInaGdaKzbaBbaCbaDbaEaKzaGdaInaInaCubaFaVEaInbaGbaHaZdaZdaZeaDEbaIaXnaJraZhaXpaXqbaJbaKbaLbaLbaMbaNbaObaLbaPbaLbaQbaLbaRbaSbaLbaLbaWbaLbaLbaUbaVbaLbaWbaXbaYbaZaXqaXqbbabbbbbcbbdbbebbfbbebbgbbhbbgbbgbbgbbgbbgbbgbbibbjbbkbbkbbkbbkbblbbkbbmbbnbbkbbkbbobbpbbqbbqbbqbbqbbqbbqbbqbbraYiaYiaMebcTbbtbbubbvbbvbbwbbxaZXaYqbbyaUTaUTaUTaUTaUTbbzaUTbbAbbBbbCbbDaWCbbEaVbbdfbdcbdgbbIbkZbjrcSNcIgaVbaVhaHYaRDbbNbbOaTvbbPbbQaTvbbRbbRaRDbbSbbTbbUaQbdilbbWbbXaRSaRSbbYbbZaQbbcaaQbbcbbatbccbcdbcebatbatbcfbaAbikbikbikbikbqUbtmbwlbutbwmbtmbmKbutbwmbtmbwlbutbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaDEaInaYYaKzaKBaJraJraKCaKzaYYaKzbcgbchbcibcjaInbckbckaXkbckaXlaDEbclaXnaJraDEbcmbcmbcnbcobcobcobcobcobcobcpbcqbcobcobcobcobcobcobcrbcsbctbctbcubctbcvbcwbcxbcvbcvbcybczbcAbcmbcBbcBbcCbcCbcCbcDbcDbcDbcDbcDbcDbcDbcDbcEbcFbcFbcGbcFbcHbcHbcHbcHbcIbcJbcHbcEbcKbcKbcKbcKbcKbcKbcKbcKbcLbcLbcLaMebcObcNbcPbcPbcPbcPbgRbcQbcRbmwbcUaZTbcVbcWbcXbcYaUTaUTbcZbdabdbbdabdaaVbcYtbdddcnbdebdebdecZrcZqaVbbdhbdiaRDbdjaTvbbPbbPbbQbbPaTvbdkaRDbdlbdmbdnaQbaRSbdobdpbdqbdqbdrbdsbdtbdubdvbdwbdxbdybdzbavbatbatbdAbaAbikbikbikbikbqUbwnbmKbutbBQbtmbmKbutbBQbtmbmKbFmbqUbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik @@ -8931,56 +9003,56 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjrbtqbtqbtqbtqbtqbtqbtqbtqdjqbikbikaInbwqbdFbwrbrXbwsbrXbwtbuxbwubwvbrZbwwbwxbwybwzbuDblCblCblCblCblCblCbwAbwBbwCbwDbwEbngbngbngbngbngbngbngbwFbngbngbngbwGbngbwHbwIbwJbpIbpIbpIbwKbtLbwLbpNbwMbnqbIDbvcbnrbnrbnrbnqbwObnqbwPbwQbwRbwSbwTbwUbwVbwWbwXbwYbwZbnAbxabqbbxbbxcbtXbxdbqbbnAbzbbxgbANbucbxhbxibxjbxkbxlbxmbxnbvHbvHbvHbvHbvHbvHbvHbvHbxobxpbxqbxrbxsbxtbuhbxubxvbxwbxxbxybxzbxvbxAbukbDdbvXbxCbxDbxEbxFbxFbxGbxHbxIbxJbxKbxLbxMbxNbupbxObxPbxQbusbxRbxSbxTbLSbxUbxVbusbxWbxXbxYbwobikbikbikbikbikbikbikbikbikbikbDybtldemdemdemdenbikdeodepdepdepbtlbDzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaLyaCuaKzaKzaInaInaInaInaInaInaInaKBaJrbyabrXbybbycbydbyebyebyfbygbyhbyibyibyjbykbtzbtzbtzbtzbtzbtzbylbymbymbynbyobngbypbyqbyrbysbytbyubyvbywbngbyxbyybyzbuVbtLbwJbpIbpIbyAbnmbnmbyBbyCbyDbyEbyFbyGbyHbyIbyJbyKbyLbyMbyNbyObwXbyPbyQbyPbyQbyRbwXbwYbySbyTbyUbyVbyWbyXbyYbyZbzabyTbAObvwbvwbucbzebzdcSCbzfbzgbucbxnbvHbvHbvHbvHbvHbvHbvHbzhbzibzjbzkbzlbxqbzmbuhbznbzobzpbxxbxAbxzbzqbzrbukbIbbztbzubzvbzvbzwbzxbzybzzbzAbzAbzAbzBbzAbzCbzDbzEbzFbzGbzHbzIbzJbzKbzKbzKbzLbusbzMbxXbzNbwobikbikbikbikbikbikbikbikbikbikbikbDyderderderbDzbikbDyderderderbDzbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjtdjsdjuaIoaIoaIobdFaJraJrbrXbzVbrXbzWbzXbzYbzZbrXbcsbAabAabAbbAcbAbbAbbAbbAcbAbbcsbcsbngbngbngbAdbngbAebAebAebAebAebAebyvbAfbAgbAhbAibAjbAkbAlbAmbAnbAobApbAqbArbAsbAtbAubAvbAwbAwbAxbAybAzbAAbABbACbADbAEbvjbAFbwVbAGbwTbAHbvjbikbAIbAJbAKbALbAJbAJbAJbAJbAMbnAbCBbvwbCCbAPbAQbARbASbATbAUbucbAVbAWbAXbAYbAZbBabBbbBcbvHbBdbuhbBebzlbBfbBgbuhbBhbBibxwbxxbxAbxzbxvbxAbukbDdbvXbBjbBkbBlbBmbBnbBobBpbBqbBrbBsbBtbBubKpbupbBwbBxbBybusbBzbBAbBBbxUbBCbKwbusbzMbxXbBEbwobikbikbikbikaabaabaabaabaabaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjwdjvdjuaJqaJqbBIbBJaJqbBKbrXbBLbycbBMbBNbBObBPbrXbikaabaabdetdesdesdesdesdesdeubikbikbBRbBSbBTbBUbBVbAebAebAebAebAebAebBWbBXbBYbBZbCabCbbCcbCdbnmbnmbCebCfbnmbnmbCgbChbCibCjbCkbClbClbCmbClbCnbCobCpbCqbAEbvjbCrbvlbvlbvlbCsbvjbikbAIbAJbCtbCubCvbCwbCxbCybCzbCAbEsbvwbEtbucbvxbCDbCEbCFbCGbCHbCIbCJbCKbCLbCMbCNbCObCPbCQbCRbCSbCTbzlbCUbCVbuhbCWbCXbCYbCZbDabDbbDcbvVbukbIcbDebDfbDgbDgbDhbDibDjbDkbDlbDmbDnbDobDpbDqbupbDrbBxbDsbusbDtbDubDvbxUbxUbDwbusbxWbxXbDxbwobikbikbikbikaabbDAbFfbDBbFfbDBbFfbFgaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjwdjvdjuaJqaJqbBIbBJaJqbBKbrXbBLbycbBMbBNbBObBPbrXbikaabaabdfMdesdesdesdesdesdfNbikbikbBRbBSbBTbBUbBVbAebAebAebAebAebAebBWbBXbBYbBZbCabCbbCcbCdbnmbnmbCebCfbnmbnmbCgbChbCibCjbCkbClbClbCmbClbCnbCobCpbCqbAEbvjbCrbvlbvlbvlbCsbvjbikbAIbAJbCtbCubCvbCwbCxbCybCzbCAbEsbvwbEtbucbvxbCDbCEbCFbCGbCHbCIbCJbCKbCLbCMbCNbCObCPbCQbCRbCSbCTbzlbCUbCVbuhbCWbCXbCYbCZbDabDbbDcbvVbukbIcbDebDfbDgbDgbDhbDibDjbDkbDlbDmbDnbDobDpbDqbupbDrbBxbDsbusbDtbDubDvbxUbxUbDwbusbxWbxXbDxbwobikbikbikbikaabbDAbFfbDBbFfbDBbFfbFgaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaIndjudjubDEaInaInaLyaCubDFbDGbrXbDHbycbycbycbrXbrXbrXbikbikbikdewdevdevdexdevdevdewbikbikbBRbDIbAebDJbDKbDKbDKbDKbDKbDLbDMbDKbDNbDObDPbDQbDRbDSbDTbnmbDUbpIbDVbDWbtLbDXbDYbDZbCjbCjbCpbEabEbbEcbEdbEebCpbvibAEbvjbEfbEgbEhbqtbEjbvjbikbEkbAJbElbEmbEnbEobEpbEobEqbErbFWbvwbHBbucbEubEubEvbEwbExbEybEzbEAbEBbECbEDbEDbEEbEFbEGbEHbuhbCTbEIaJSbuhbuhbuibEKbELbEMbuibukbukbukbENbIdbvXbEPbBkbBlbEQbDgbDjbERbESbESbETbxJbEUbEVbEWbEXbxPbEYbusbEZbFabxUbFbbFcbFdbusbzMbFebwobwobikbikbikbikaabbFhbFjbFibGSbFkbGTbFhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjydjydjydjAdjzdjydjydjydjydjBbikbikbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdewbFnbBRbBRbFobFpbFqbFrbFrbFrbFpbAebyvbAfbAebAebAgbFsbFtbFubFvbFwbFxbFybpIbpIbFzbtLbDXbDYbFAbFBbFCbFDbFEbFFbFGbFHbFIbCpbFJbFKbwRbFLbFMbFNbFObFPbwXbwYbFQbAJbFRbFSbFTbEobFUbEobFVbErbJebvwbKObucbFYbFZbGabGbbGcbGdbGebGfbGgbGgbGhbGibGgbGgbGjbGkbGlbGmbGnbGobGpbGqbGrbGsbGtbGubGvbGwbKhbIebKjbKibvXbGBbGCbGDbGEbGFbxGbGGbESbESbGHbGIbEUbGJbupbGKbGKbGLbusbGMbGNbGObGPbxUbGQbusbzMbGRbwobikbikbikbikbikaabbGUbIybFibFkbFibKkbDBaabbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjCdjEdjDdjGdjFdjIdjHdjFdjJdjLdjKdjydjydjBbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbGWbmrbNkbmrbGXbGYbGZbGYbGYbGYbGYbHabyvbAfbHbbngbngbHcbpIbAibFvbHdbtLbHebHfbHfbHgbHhbHibHjbHkbHlbHmbHnbHobHpbHqbHrbHsbCpbCqbAEbvjbEibHubHvbHwbHxbvjbikbEkbHybHzbHybHybHybHybHybHAbHybKPbvwbKObucbHCbHDbHDbHEbHFbEybHGbHHbHIbHJbHKbHLbHMbHIbHNbHObHPbHQbHRbHSbHTbHTbHUbHVbHWbHXbHYbLibLCbLBbNdbNcbNebIfbIfbIgbIhbIibxGbIjbxJbxJbIkbIlbEUbImbInbIobIpbIqbIrbIsbItbIubIvbIubusbusbIwbEXbGxbLDbLDbLDbLDbLDbGxbFhbFkbFibFkbFkbGTbFhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjHdjHdjHdjMdjFdjNdjNdjFdjOdjHdjHdjQdjPdjydjBbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbLFbKmbIAbKmbIBbAebFqbFrbFrbFrbAebAebyvbAfbICbKobngbIEbpIbAibFvbIFbtLbIGbpIbrsbpIbIHbDXbvvbIIbHlbHmbIJbIKbILbIMbINbIObIPbIQbIRbISbISbITbIUbIVbvjbvjbikbEkbHybIWbIXbIYbIZbJabJbbJcbJdbMhbvwbKObCHbJfbJgbJhbJibJjbEybJkbJlbJmbJnbJobJpbJqbJrbJsbJtbJubJvbJwbJxbJybJzbJAbJBbJCbJDbJEbGwchEbIecnfcjubvYbJIbJJbJKbJLbJLbxGbJMbJNbJObxGbJPbEUbJQbxGbJRbJSbJTbJUbJVbJWbJXbJYbJZbKabKbbKcbKdbKebKfbKfbIxbJFbJHbGzbKlbFfbDBbNhbDBbFfbLEaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydjSdjRdjUdjTdjVdjFdjWdjHdjXdjHdjHdjHdjHdjHdjMdjFbikbikbikbikbikbikbikbikbikbikdewdeCdevdevdevcOfdewbFnbBRbBRdezbAebFqbAebAebAebAebAebyvbAfbICbLwbngbLQbpIbKqbKrbpIbKsbpHbpIbpIbKtbtLbDXbvvbIIbHlbHmbCpbKubKvbqzbKxbKybKzbKAbKBbKCbKDbwXbKEbKFbwXbwYbwYbKGbHybKHbKIbKJbKKbKLbKLbKMbKNbMibvwbMjbucbEybKQbEubKRbKSbEybJkbKTbKUbKVbKWbKXbKYbKUbJkbKZbLabLbcchbLbbLcbLbbLdbLdbLebLfbLgbLhbLhcpLbLgbLgbLhbLhbLjbLkbLjbLjbxGbxGbxGbxGbxGbLlbLmbBobxGbLnbLobLpbLqbLqbLrbLsbLtbLubLvbLIbLxbLybLzbLAbLAbEObGAbHZbGxbGzbGzbGzbIabGxbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjZdjYdjHdjHdkadkadkadjFdjHdjHdjFdkbdkddkcdkfdkedkgdjFbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbWobKmbIAbKmbFobLGbLHbAebAebAebLGbAebyvbAfbICbNrbngbLJbpIbAibFvbpIbnmbLKbpIbpIbLLbtLbDXbvvbLMbHlbLNbCpbLObLPdiNbLRcobbKzbLTbLUbLVbLWbLXbLYbLZbMabikbikbikbHybMbbMcbMdbMdbMebMfbMgbHybNSbNRbKObNTbMkbMlbMmbMnbMobMpbMqbJlbMrbMsbMtbMubMvbMrbJkbKZbMwbMxbMybMzbMAbMBbLdbMCbMDbMEbLgbMFbMGbMHbMIbMJbMKbMLbKabMMbLqbLqbMNbMObLqbMPbMQbMRbMSbMTbLqbMUbiTbMWbMXbMYbMZbNabNbbNabNabNabIwbEXbGxbLDbLDbGxcnccndcnebOQbOSbUHbYdbGzbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjZdjYdjHdjHdkadkadkadjFdjHdjHdjFdkbdkddkcdkfdkedkgdjFbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevbWobKmbIAbKmbFobLGbLHbAebAebAebLGbAebyvbAfbICbNrbngbLJbpIbAibFvbpIbnmbLKbpIbpIbLLbtLbDXbvvbLMbHlbLNbCpbLObLPdiNbLRcobbKzbLTbLUbLVbLWbLXbLYbLZbMabikbikbikbHybMbbMcbMdbMdbMebMfbMgbHybNSbNRbKObNTbMkbMlbMmbMnbMobMpbMqbJlbMrbMsbMtbMubMvbMrbJkbKZbMwbMxbMybMzbMAbMBbLdbMCbMDbMEbPEbMFbMGbMHbMIbMJbMKbMLbKabMMbLqbLqbMNbMObLqbMPbMQbMRbMSbMTbLqbMUbiTbMWbMXbMYbMZbNabNbbNabNabNabIwbEXbGxbLDbLDbGxcnccndcnebOQbOSbUHbYdbGzbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkhdjYdjHdjHdjHdjHdjHdkidjHdjHdjFdjydjydjydjydjydjydkjbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdeEdeDdeGdeDbNlbNmbNnbNnbNnbNnbNnbNobNpbNqbICbWSbngbNsbNtbNubNvbNwbNxbNybNybNybNzbNzbNAbvvbNBbNCbHmbCpbNDbNEbNFbKvbNGbKzbNHbNIbNJbNKbNLbFNbNMbMabikbikbikbHybNNbNObNPbNQbMebMfbMgbHybPibNUbQObPjbNVbNWbNXbNYbNZbOabObbOcbKUbKUbOdbOebKUbKUbJkbKZbOfbOgbOhbOibOjbOkbLdbOlbOmbOnbOobOpbOqbOrbOrbOsbOtbOubOvbOwbJVbJVbOxbJVbOybJVbOzbJVbOAbOBbOBbOCbODbOEbOFbOGbOHcsjbOJbOKbOLbNabOMcxHbikbikbikbGxbORbJFbOPbOQbGzbOObNibGxbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydkmdkldkodkndjHdjFdjHdjHdjFdjHdkqdkpdkrbikbikbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdewbFnbBRbBRbngbngbBRbBRbBRbBRbBRbngbngbBRbBRbBRbngbOVbOVbOVbOWbOVbNzbOXbOYbOZbPabNzbDXbvvbPbbPcbPcbCpbCpbCpbCpbCpbPdbKzbISbIRbPebNKbPgbPhbMabMabvjbvjbvjbHybHzbHybHybHybHybHybHybHybQPbvwbQQbPkbPlbPmbPnbPlbPlbPobPpbPqbPrbPsbPtbPubPvbPwbMqbPxbPybPzbPAbPBbPCbPDbPEbPFbPGbPHbPIbPJbPKbPLbMHbPMbLhbLhbPNbPObPNbPPbPQbPPbPPbPPbPRbPSbPTbPTbPUbPVbPWbPXbOFbPYbPZbQabQbbQcbQdbNabOMcxHbikbikbikbGxbNfbNgbGxbGzbGxbGxbGzbGxbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjydjydjydjydjydjydjFdjOdjHdksdjHdkudktdkvbikbikbikbikbikbikbikbikbikbikbikbikbikdeJdeIdevdeKdevdeLdeMbikbikbikbikbikbikbikbikbikbikbQgaabbikbikbikbikbOVbQhbQibQjbQkbNzbQlbQmbQnbQobNzbDXbvvbQpbQqbQrbQsbQtbQubQvbQwbQxbQybQzbQAbQBbQCbQDbQEbQFbQGbQHbQIbQJbQKbQLbQMbQRbuabQSbvwbShbSgbSibvwbSjbPlbQTbQUbQVbQWbQXbJkbQYbQZbRabRbbRcbRdbRebRfbRgbRhbRibLbbRjbOibRkbRlbRmbRnbRobRpbLgbRqbMHbMHbMHbRrbLhbPNbRsbRtbRubRvbRwbRxbRybPPbRzbRAbRBbPTbPTbRCbPWbRDbREbWHbRGbRHbRIbRJbRKbNabRLbwobikbikbikbGxbGxbGxbGxbikbikaabbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydkxdkwdkydkxdkzdjFdjHdjHdjFdjHdkBdkAdkCbikbikbikbikbikbikbikbikbikbikbikbikbikdeOdeNdePdePdePdeNdeQbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbOVbRMbRNbRObRPbNybRQbRRbRSbRTbNzbDXbRUbRVbvvbvvbFXbRWbubbQNbQMbRXbRYbRXbRZbSabSabSbbScbSdbSabSabSebSabSfbSabQMbQRbuabSlbSkbTJbTIbTLbTKbvwbPlbSmbQUbSnbSobSpbJkbSqbSrbSsbStbSubSvbSwbSxbJkbSybSzbLbbSAbSBbSBbSCbSDbSEbSFbSGbLgbSHbSIbMHbSJbSKbLhbPNbSLbSMbSNbSObSPbSQbSRbPPbSSbRAbSTbSTbPTbSUdnjbSWbSXbSYbSZbTabTbbTcbTdbNabOMbwobTebikbikbikbikbikbikbikbikaabbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjZdjYdkDdkDdkDdkDdkDdkEdjHdjHdjFdjydjydjydjydjydjydjBbikbikbikbikbikbikbikbikbikbikbikdeRdeSdeSdeSdeTbikbikbikbikbikbikbikbikbOUbOTbQebOTbQfbikbikbikbOVbOVbTjbTkbRObTlbNybTmbQnbTnbTobNzbDXbTpbTqbTrbTsbTtbTubTvbTwbTxbTybTzbTAbTBbTCbTCbTDbTEbTEbTEbTEbTEbTEbTFbTGbTHbTNbTMbTPbTOdlidjmdlkdljdllbPlbTQbQUbQVbTRbSpbJkbSqbSrbTSbTTbTUbTVbTWbTXbJsbTYbTZbLbbLbbUabUabLbbSDbLdbUbbUcbLgbUdbUebUfbUgbUhbLhbPNbUibUjbUkbUlbUmbUnbUobPPbUpbRAbSTbSTbPTbUqbUrbUsbUtbUubUvbUwbUxbUybUzbNabOMbUAbUBbUAbUCbUDbUCbUCbUCbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkhdjYdkDdkDdkDdkFdkGdjFdjHdjHdjFdjHdjHdjHdkHdjHdkIdjFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbTgbTfbTibThbTgbUIbUIbUIbOVbUJbUKbULbUMbUNbUObUPbUQbUQbURbNzbUSbUTbUUbUVbUVbUWbUXbUYbUVbUZbUZbVabVbbONbUZbUZbVdbQMbQMbVebVfbVfbVfbVgbVhbVfbVfbVibVjbVkbVkbVlbVkbVmbVnbVkbVobVpbVqbPlbVrbVsbSqbVtbVubVvbVwbVxbVybVubJkbSybVzbVAbVBbVCbVDbVEbVFbVGbVHbVIbVJbVKbVLbVMbVNbVObLhbPNbPNbVPbVQbVRbVSbVRbVTbPPbVUbVVbVWbVWbPTbVXbVYbVZbNabNabNabNabNabNabNabNabOMbUAbWabWbbWcbWdbWdbWebUCbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikaabbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik -bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydkKdkJdkDdkLdkMdjFdjHdjHdkNdjHdjHdjHdkOdjHdkPdjFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbQebUEbUFbUEbQebUIbWmbWlbOVbWnbWpbWqbWrbWsbNzbWtbWubWvbWwbNzbUTbUTbWxbUVbWybWzbWAbWBbWCbUZdmbbWEbWFbWGcAzbUZbWIbWJbWKbVfbWLbWMbWObWNbWPbWQbWRceLbWTbWUbWVbWWbWXbWYbWZbXabXbbXcbXdbXebXfbXgbXhbSrbXibXjbXkbXlbXmbXnbJsbXobXpbXqbXrbVDbXsbXsbXtbXubLgbXvbXwbXxbXybXzbXAbXBbLhbXCbXDbXEbXFbXEbXEbXGbXHbXIbXJbXKbXLbXMbPTbXNbXObPXbEXbxXbXPbXQbXRbXRbXQbXRbXSbUAbXTbXUbWcbWdbXWbXVbUCbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfbXXbXYbXXbWgbWhbWhbXZbYabXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydkmdkldkodkndjHdjFdjHdjHdjFdjHdkqdkpdkrbikbikbikbikbikbikbikbikbikbikbikbikbikdewdevdevdevdevdevdewbFnbBRbBRbngbngbBRbBRbBRbBRbBRbngbngbBRbBRbBRbngbOVbOVbOVbOWbOVbNzbOXbOYbOZbPabNzbDXbvvbPbbPcbPcbCpbCpbCpbCpbCpbPdbKzbISbIRbPebNKbPgbPhbMabMabvjbvjbvjbHybHzbHybHybHybHybHybHybHybQPbvwbQQbPkbPlbPmbPnbPlbPlbPobPpbPqbPrbPsbPtbPubPvbPwbMqbPxbPybPzbPAbPBbPCbPDbRpbPFbPGbPHbPIbPJbPKbPLbTdbXBbLhbLhbPNbPObPNbPPbPQbPPbPPbPPbPRbPSbPTbPTbPUbPVbPWbPXbOFbPYbPZbQabQbbQcbQdbNabOMcxHbikbikbikbGxbNfbNgbGxbGzbGxbGxbGzbGxbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjydjydjydjydjydjydjFdjOdjHdksdjHdkudktdkvbikbikbikbikbikbikbikbikbikbikbikbikbikdeJdeIdevdeKdevdeLdeMbikbikbikbikbikbikbikbikbikbikbQgaabbikbikbikbikbOVbQhbQibQjbQkbNzbQlbQmbQnbQobNzbDXbvvbQpbQqbQrbQsbQtbQubQvbQwbQxbQybQzbQAbQBbQCbQDbQEbQFbQGbQHbQIbQJbQKbQLbQMbQRbuabQSbvwbShbSgbSibvwbSjbPlbQTbQUbQVbQWbQXbJkbQYbQZbRabRbbRcbRdbRebRfbRgbRhbRibLbbRjbOibRkbRlbRmbRnbRobRqbPEbSFbMHbMHbMHbUzbLhbPNbRsbRtbRubRvbRwbRxbRybPPbRzbRAbRBbPTbPTbRCbPWbRDbREbWHbRGbRHbRIbRJbRrbNabRLbwobikbikbikbGxbGxbGxbGxbikbikaabbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjxdjydkxdkwdkydkxdkzdjFdjHdjHdjFdjHdkBdkAdkCbikbikbikbikbikbikbikbikbikbikbikbikbikdmideNdePdePdePdeNdmHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbOVbRMbRNbRObRPbNybRQbRRbRSbRTbNzbDXbRUbRVbvvbvvbFXbRWbubbQNbQMbRXbRYbRXbRZbSabSabSbbScbSdbSabSabSebSabSfbSabQMbQRbuabSlbSkbTJbTIbTLbTKbvwbPlbSmbQUbSnbSobSpbJkbSqbSrbSsbStbSubSvbSwbSxbJkbSybSzbLbbSAbSBbSBbSCbSDbSEbSHbSGbPEcgQbSIbMHbSJbSKbLhbPNbSLbSMbSNbSObSPbSQbSRbPPbSSbRAbSTbSTbPTbSUdnjbSWbSXbSYbSZbTabTbbTcbRKbNabOMbwobTebikbikbikbikbikbikbikbikaabbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdjZdjYdkDdkDdkDdkDdkDdkEdjHdjHdjFdjydjydjydjydjydjydjBbikbikbikbikbikbikbikbikbikbikbikdeRdeSdeSdeSdeTbikbikbikbikbikbikbikbikbOUbOTbQebOTbQfbikbikbikbOVbOVbTjbTkbRObTlbNybTmbQnbTnbTobNzbDXbTpbTqbTrbTsbTtbTubTvbTwbTxbTybTzbTAbTBbTCbTCbTDbTEbTEbTEbTEbTEbTEbTFbTGbTHbTNbTMbTPbTOdlidjmdlkdljdllbPlbTQbQUbQVbTRbSpbJkbSqbSrbTSbTTbTUbTVbTWbTXbJsbTYbTZbLbbLbbUabUabLbbSDbLdbUbbUcbLgbUdbUebUfbUgbUhbLhbPNbUibUjbUkbUlbUmbUnbUobPPbUpbRAbSTbSTbPTbUqbUrbUsbUtbUubUvbUwbUxbUybVObNabOMbUAbUBbUAbUCbUDbUCbUCbUCbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkhdjYdkDdkDdkDdkFdkGdjFdjHdjHdjFdjHdjHdjHdkHdjHdkIdjFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbTgbTfbTibThbTgbUIbUIbUIbOVbUJbUKbULbUMbUNbUObUPbUQbUQbURbNzbUSbUTbUUbUVbUVbUWbUXbUYbUVbUZbUZbVabVbbONbUZbUZbVdbQMbQMbVebVfbVfbVfbVgbVhbVfbVfbVibVjbVkbVkbVlbVkbVmbVnbVkbVobVpbVqbPlbVrbVsbSqbVtbVubVvbVwbVxbVybVubJkbSybVzbVAbVBbVCbVDbVEbVFbVGbVHbVIbVJbVKbVLbVMbVNbPMbLhbPNbPNbVPbVQbVRbVSbVRbVTbPPbVUbVVbVWbVWbPTbVXbVYbVZbNabNabNabNabNabNabNabNabOMbUAbWabWbbWcbWdbWdbWebUCbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikaabbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydkKdkJdkDdkLdkMdjFdjHdjHdkNdjHdjHdjHdkOdjHdkPdjFbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbQebUEbUFbUEbQebUIbWmbWlbOVbWnbWpbWqbWrbWsbNzbWtbWubWvbWwbNzbUTbUTbWxbUVbWybWzbWAbWBbWCbUZdmbbWEbWFbWGcAzbUZbWIbWJbWKbVfbWLbWMbWObWNbWPbWQbWRceLbWTbWUbWVbWWbWXbWYbWZbXabXbbXcbXdbXebXfbXgbXhbSrbXibXjbXkbXlbXmbXnbJsbXobXpbXqbXrbVDbXsbXsbXtbXubLgbXvbXwbXxbXybXzbXAdoEbLhbXCbXDbXEbXFbXEbXEbXGbXHbXIbXJbXKbXLbXMbPTbXNbXObPXbEXbxXbXPbXQbXRbXRbXQbXRbXSbUAbXTbXUbWcbWdbXWbXVbUCbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfbXXbXYbXXbWgbWhbWhbXZbYabXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik 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 +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdkkdjydjydjydjydjydjydjydjydjydjydkjbikbikbikbikbikbikbikbikbikbikbikbikbikaabaabaabaacbUTcjMcjMbUTcjMcjMbUTbikbikbikbTgbWjbYbbWkbTgbUIbUIbUIbOVcaYcaZcaZcaZbOVbOVbUTcbbcbaccAcbcbUTcbdcbebUVbZHbYnbYnbYncbfbUZbYpbYqbYqcbgcbhcbicbjcbkcblbVfbVfbVfbVfbVfcbmbVfbVfcbncbobVkbVkcbpbVkbVnbVkbVkbPlcbqcbqbPlccicbrcbscbtcbucbvcbwcbxcbycbzcbAcbBcaocapcbCcbDcbEcbFcbGcbHbVAcbIcbJcbKcbLcbMcbNcbOcbPcbQcbPcbRcbRcbRcbPcbScbPcbPcbTcbUbZmbZmbPTcbVbZnbPXcbWcbXcbYcbZccaccbccccccccdcceccfccgcckccjcdqcclcfeccmccnccoccpccqccrccscctaabaabaabaabaabaabaabaabbikbikbikbikbikbWgbWhccuccvccvbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbUTccBcqsbUTccBcqsbUTbikbikbikbYcbOTbYgbOTbZxbikaabbikbOVbOVbOVbOVbOVbOVclabUTcuRcsuccCccDbZFccEccFbUVccGccHdmcbYnccJccKccLccMccNccOccPbUZccQccRccSccTccUccUccUccUccVccWccXccYccYccZccZcdacdbcdcbVibPlcddcdecdfcdgcdhbYKcdicbtcdjcdkcdlcdmbSwcdncdocdpcffcdrcdrcdscdrcdrcdrcdtbVAcducdvcdwcdxcdycdzcdAcbPcdBcdCcdDcdEcdFcdCcdGcdHcdCcdIcdJbRBbPTbPTcdKcdLcdMcdNcdOcdPcdQcdRcdScdTcdUcdVcdWcdXcdYcdZceacebceaceccebcebcebcedceecefcegcehaabbikbikbikbikaabbikbikbikbikbikbikbikbWhbWhceibXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaacbikaacbUTcfQcqsbUTcfQcqsbUTbikbikaabaabaabaabaabaabaabaabaabbUTcqscAjcwNbUTcEvcEwbUTcGJbUTbUTcekbUTbUTcelbUVcemcenceocepceqcercescetceucevcewccKcexceycezceAceBceBceBceBceCceDceEceFceGceFceHceIceJceKchvceMceNceOcePceQceRceSceTceUceVceWceXceYceZcfacfbcfccfgbMmbMmcfichOcgHceYchVcfjcfjcfkcfjcflcfmcfncfocbPcfpcfqcfrcfscfrcftcfucfvcdCbPTcfwbPTbPTcfxcfybZnbBxbEXbUAcfzbUAbUAcfAcfBcfCcfDcfEcebcfFcfGcfHcdUcfHcdUcfIcdUcdUbUAcfJcfKcfLcfMaabaabaabaabaabaabaabaabbikbikbikbikbikbWhbXZbXZbXZbXZbXZbXZcfNbXZcfObXZbXZbXZbXZbXZbWhbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabdnkaacaabaDDaDDaacbUTbUTcekbUTbUTcekbUTbUTbUTcjMcjMcjMbUTbUTbUTbUTbUTbUTbUTcqschodnmbUTdnnbUTbUTdnobUTcfPbVccqsbUTcfSbUVcfTcfUcfVbZHcfWcfXcfYbYpcfZcgacgbcfXcgccgdcgecgfcgfcggcghcgicgjcgkcglcgmbGycgnbVicgobGybGycgpcgqcgrcgscgtceQcgucgvcgwcgxcgycgzbMVcgBcgCcgzcgzcgDcgEcgEcgEcgEcgEcgGcgFciOcgJcgJcgKcgLcgMcgNcgOcgPcbPdomcgRcgScgTcgScgUcgVcfrcgWcgXcgYbBxcgZbBxcfybZnbBxbEXchachbchcbUAbUAbUAbUAbUAchdcdUchechfcfIcdUchgcdUbZpcdUchhbUAchichjchkbUAaabbikbikbikbikaabbikbikbikbikbikbikbikbWhchlchlchlchlchlchlchmbXZchnchlcfObXZbXZbXZbXZbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaaccjMcqscqscqscqsdoadnxcqscqscuRdnpdnpdowdnpdnpdnpdnpdnpdnpdnpdnpdnpdnpdnpdnpcsubUTchocfQchpbUTcfSchrchrchrchrchrchrbUZbUZbUZbUZbUZbUZbUZchschtchucWpchwchxchychychzchAcglbGybGychBchCchDbGybGybGycqOchFchGceOchHchIchJcgEchKchLchMbSqchLchNcfdcfdcfdcjncjlcjlcjlcjlckacgIbSqclPchPchQchRchSchTchUclQcbPchWchXcfrchYcfrchZciacibciccidciecifbBxcigcfybZncihbEXbFeciicijcikbwobxXbxXbUAcilcimcinciocipciqcirciscitciucivbUAciwciycixcizbikbikbikbikaahbikbikbikbikbikbikbikbikciAbXXbXXbXXbXXbXXbXXbXXciBciCbXZbXZbXZbXZciDbYabWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabaacaabaabaaccjMdnrdnqdnscqscqsdoxcqscqsdnobUTbUTbUTbUTbUTbUTcekbUTbUTbUTbUTdntdntdntdntdntdntdntdntdntbUTcfScejbikbikbikbikciEbaTciGciHciIciJciKciLciMciNcmPciPciQciRciSciSciTciUciVciWciWciWciWciXciWbGybGybPlciYciZcjacjbcjccjdchScjecjfcjgcjhcjicjjcjkcjlcfdcnicjpcjpcjpcjpckNclSckUcnjcjqcjrcjscjtcbAcwncjvcbPcjwcjxcjycjzcjAcfrcjBcbPcbPbEXcjCbEXbEXbEXcjDcjEcjFbEXbxXciicjGcjHbwobwobwobUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbikbikbikbikbikaabbikbikbikbikbikbikbikbWhccvccvccvccvccvccvcjIbXZccuccvcjJbXZbXZbXZbXZbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbUTcjKcjKcjKcjKcjKcjKcjLcjKdnodnubUTcqsdoydnwdnycqsdnydnvdnzdnwdntdnAdnAdntdnBdntdnDdnCdntcqscelcjMbikcjNcjOcjPcjQcjRcjScjTcjUcjVcjWcjXcjYcjZcosckbckcckdckeckfckgckhciVckickjckjckjckkciWbGybGycklcklcklcklckmcklckncknckocklcklckpcklckqckrckscktcksclZaPKcmacmmcmlcmocmnckzckAckBckCckDckEckFcdccbPcbPckGcbPckHcbPckIckJckKcgnckLckMckvckOckPckQckRckSckPbxXciickTbxXbxXckVckWckXchabxXbxXbxXbxXbxXbxXbxXckYckZcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhbXZbXZbXZbXZbXZbXZcfNbXZcjJbXZbXZbXZbXZbXZbWhbWhaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdnEclbclbclbclbclbclbclccldcleclfclgclhclicjLdnocnRbUTcqsdozdnwcqscqscqsdnvcwNdnwdntdnAdnFdnCdnCdnGdnCdnHdntcljcelcjMbikclkcllclmclnclocjSclpclqclrclsciLcltcgdcoaciPcluchyclvchyclwclxclyclzclAclAclAclBciWbGybGycklclCclDclEclFclGclHclHclIclJclKclLclMclNclOcotcfhcpwcmpcmrcmqctbcsZcuoctcckDclVclWclXckzclYcmtcmscmbcmbcmccmdcmecmfcmgcmhcmfcmfcmfcmicmfcmfcmjcmucnpcnlcqRcoXcrGcqScrHcrHcrIcrHcrHcrHcrHcrJcrKcrHcrHcrHcrMcmvbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhbWhceibXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcmwcmxcmxcmxcmxcmycmzcmAcmBcmCcmCcmDcjKdnocqscekcqscqscqscqscqscqscqscqscqsdntdntdnCdnIdnCdntdnCdnIdntcmEcfScjMbikclkcmFcmGcmHcmIcmJcmKcmLcmIcmIcmMcmNcmOcpxcmQcmQcmRbHtchycmTcmUclyclAclAclAclAcmVciWbGybGycklcmWcmXcmYcmZcnacnbcnbbzsbvWbulbxBclHcnhcklcqQcfdcrLcjpcwscvxcwEcwCcxNcxIckDcnmcnncnockDbJGcumctecnqcnqcnqcnqcnqcnrcnscntcnucnvcnvcnwcnwcnvcnxcnycnzcnAcnBcnCcnDcnEcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcuncnFcnGcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcaUbWhbWhchlchlbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcnIcnJcnKcnJcnLcnMcnNcnOcnPcnQcjKdnobUTbUTdnJcjMcjMcjMcjMcjMcjMcjMdnKdntdnCdnCdnCdnCdnLdnCdnCdntcnRcelcjMbikclkcnScnTcnUcnVcjScnWcnXcnYcnZciLcltcgdcbkchqcgfcoccodciPciPciPcoecofclAclAcogcohciWbGycoicklcojcokcolcomcomcomconcoocomcomcopclHcoqcorcrNcfdcupcjpcxVcxUcxVcxVcxNcEickDcowcoxcoyckDcozcuscoicoAcoAcoAcoAcoAcoDcoDcoDcoAcoAbikbikbikbikckPcoEcoFcoGcnCcoHcoIcoJcoKcoLcoMcoNcoOcoPcoQcoRcoScoTcoUcnCcuncoWcvtcoYcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcpacpbbWhbZubWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcpccpdcpecpfcmBcpgcphcpicmBcpjcpkdnMchobUTcqscjMbikbikbikbikbikcjMcqsdnldnAdnOdnCdnCdnCdnCdnPdnNcplcpmcjMbikcpncjOcpocjQcppcjScjScpqcprcpscptcpucpvcwqchqcgfcpycpzcpAcpBcpCciVcpDclAclAclAcpEciWbGybGycpFcpFcpGcpHcpIcpIcpIcyFcpJcpJcpJcpKcpFcpGcpMcqQcfdcrLcEjbjVcEYdbndbmcxNclRckDcoucpNcovckDbGycuscoAcoAaabaabbikbikbikbikbikbikbikbikbikbikbikcpRcpScpTcpUcpVcpWcpXcpXcpYcpXcpXcpXcpXcpXcpZcqacqbcqccqdbwocvvbXSbwobwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhcqhcqicqjbWhbWhbXZbXZcqkbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcqlcnJcqmcnJcqncqocqpcqqcnNcqrcjKdoAcwNbUTcfQcejbikbikbikbikbikcejdnRdntdnSdnSdnAdnUdnTdnCdnVdntcqscelcejbikbikbikbikciEcqtcqucqvcqvciLcqwciLcqxcgdcbkcqycqzcqAcqBcqCcqCcqCcqDcqEclAcqFclAcqGciWbGybGycpFcqHcqIcqJcqKcqLcqMcpFcqLcqMcqKcqNdehcqPcpMczecyWczgcEjdbpdbodbrdbqdbsctcckDcpOcpPcpQckDbGycuscoAcvyaabaabaabbikbikbikbikbikbikbikbikbikbikcpRcqUcqVcqWcqXcqYcqZcracrbcpXcpXcrccpXcpXcpZcqbcqbcqbcrdbwocvzbxXbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfcrhcribZvbWgbWhbWhbXZbYabXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcjKcjKcjKcjKcjKcjKdnWcrjcrjcrjcrjcrjdnQcrjcrjcrjcrjcrjcrjcrjcrjcrkcrkcrkcrkcrkdnYdnYdnYdnYdnYdnYdnYcekcrlcrmcrmcrmcrmcrmciEciLciLciLciLciLciLciLcrncgdcbkcrocrpcrqcrrcrscrtcrucrvcrwcrxcrycrzcrAciWbGybGycpFcrBcrCcqJcqKcqKcrDcpFcrEcqKcqKcqNcqKcrFcpMbGwbGwbGwcEjdbudbtdbvdbmdbxctcdbydbydbycoAcoAbGycuscoDcwpbikaabaabaabbikbikbikbikbikbikbikbikbikcpRczNczPcoBcrOcrPcrQcrRcrScpXcpXcpXcpXcrTcrUcrVcrWcrXcrYbwocvzbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaSecsdctvdnZctvdoBcsdcsecsfcsgcsgcshcsicspcskcslcsmcsncsocsrcsqcsqcsscsqcstctzctzctAcsvcswcsxcsycsxcsxcsxcswcsxcsxcszcsAcsBcsCcgdcbkcsDcsEcsFcsGcgfcsHcmQcsIcsJcsKcsLcsMcsNcsObGybGycpFcsPcsQcsRcsScsTcsUcpFcsVcsTcsWcsXdlFcsYcwrbikbikbikcEjdbAdbzdbAdbAdbCdbBdbEdbDdbycwFbVibGycuscoDcwpbikbikaabaabaabbikbikbikbikbikbikbikbikctdckPcxGckSctdctfctgcthctictjctkctlcpXcpXctmctnctoctpctqbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSecsdctvctvctvdoBcsdctuctvctwctvctxctyctDctCdmedcYdmedmfcxnctEctFctEctEctGcblcblctEctHctEctEctEctEctEctEctEctEctEctEctIctJctKctLctMctNctOctPctQctRctSctTctUctVctWctXciFctZcuacnqcubcuccudcuecufcugcuhcuicpFcujcqKcugcukcqKculcwrbikbikbikdbFcmkdbGdbJdbIdbCdbKdbMdbLdbOdbNceFceJdbPcoDcwpbikbikbikaabaabaabbikbikbikbikbikbikbikckPcurczQcutckPcnCcnCcnCcnCcnCcnCcuuctlcuvcuwcuxcuycnCcnCbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSedobctvdocctvdoBcuBdodcuCcuDcuEcuFcuGcuHcuIcuJcuKcuLcuMcuNcuOcuPcuQdoeceAcuSceAcuNcuTcuNcuNcuNcuNcuNcuNcuNcuNcuNcuNcuUctEcuVcuWcuXcuYcuZcvacvbcvccvdcvecvfcvgcvhcvicvjcvkcsLceJcvlcvmcvncqKcqJcqKcqKcvocpFcvpcqKcqKcqNcqKcyGcwrbikbikbikdbFdbRdbQdbTdbSdbVdbUdbXdbWdbybGychCcyHcuscoAbikbikbikbikbikaabckPckPckPckPckPckPckPckPckPcvucxScvwckPcxOcxOcyIckPaabcnCcnCcvAcnCcvBcvCcvDcnCcyKcyJcvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikdogdofcrjcrjcrjcrjdnQcrjcrjcrjcrjdnXcrjcvFcvGcvGcvHctBdlXcrjcrmcvJcvKcvKcvLcvKcvMcvKcvKcvNcvOcvKcvKcvOcvOcvOcvKcvKcvKcvKcvPcvQcvRcvScvTcvUcvVcvWcvXcvWcvWcvWcvWcvZcwacwbcwccwdcsObGycvrcwecwfcwgcwhcwicwjcwkcpFcwlcwjcwmcqNcqKcwocpMbikbikbikdbFdbZdbYdcadbIdccdcbdbUczRdbycyObVibVicuscoAbikbikbikbikbikbikckPcwtcwucwvcwwcwxcwycwzcwAcwBczScwDckPcxOcBZcyPckPaabaabcwGcwHcwIcwJcwKcwLcwGbxXbxXcvzczfbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik +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..41715794c29 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) @@ -689,7 +694,6 @@ "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 +712,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 +936,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) @@ -1354,7 +1356,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 +1427,12 @@ aNckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckck aNckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaiaNaNaNaNaNaNaNaiacabababababajagagakagakababafabnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNnlnmataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaNaNaNaNaNaNaNaNaNalabababacamnjnjoBoCnjnjanagagagnjaNaNaNaNaNaNaNaNaNaNaNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaNaNaNaNaNaNaNaNaNalabababaonjnjoHoIoIoJnjnjnjnjnjnjnjnjaNaNaNaNaNaNaNaNaNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaNaNaNaNaNaNaNaNaNalababadaonjaLoOoOoOoOoPoQoRnjfYjMfZnjaNaNaNaNaNaNaNaNaNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaNaNaNaNaNaNaNaNaNalababadaonjaLoOoOoOoOfZoQoRnjfYjMmgnjaNaNaNaNaNaNaNaNaNaNaNaNnlmEataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababaiaNaNaNaNaNaNaNaiababababaSnjpaoOmfmfpcoOpdpepWpXpXganjnjnjnjnjnjnjnjnjnjnjnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababaNaNaNaNaNaTagagababaUamnjplmfpmjNmfoOmkppnjpXggnjnjghgjgigxgxhggxgxhxhGnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababaNaNaNaNaNpupvpvpvpvpvoCnjoOmfpwpxmfoOmkppnjnjnjnjnjgjgiiuiwiviFiviHiGhxnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjabababababababaNaNaNaNaNpupvpvpvpvpvoCnjmhmfpwpxmfoOmkppnjnjnjnjnjgjgiiuiwiviFiviHiGhxnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaiaNaNaNaNaNaNaNaNaNpypzpApzpzpzpzpCoOJboOoOoOoOmkppnjnjnjnjnjgjiIiwiviJiSiKiviHiTnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaNaNaNaNaNaNaNaNaNaNpFaVoBpvpvpvoCnjpHmfmfmfoOoOmkppoBpvpvpvpvpvpviviJiSiUiSiKiviTnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaNaNaNaNaNaNaNaNaNaNpFaVoBpvpvpvoCnjmimfmfmfmhoOmkppoBpvpvpvpvpvpviviJiSiUiSiKiviTnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaNaNaNaNaNaNaNaNaNaNaNaWaNaiababaXnjpRpSpTpSjOoOpUpViWiViViXiViViWiFiSiYjjjiiSiFiTnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjaYabaNaNaNaNaNaNaNaNaNaNaNaNaNaNaZabaonjqfqgqhqiqjoOoOoOoBpvpvpvpvpvpviviJiSjkiSiSiviTnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNnjababaNaNaNaNaNaNaNaNaNaNaNaNaNaNalabaonjnjppqtqrqunjqwoOnjnjnjnjnjgjiIjsiviJiSiKivjtiTnjaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNataNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN @@ -1514,7 +1515,7 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXuWsXsXujuXuRuYuZvavbujvcvdvdvdvdvesXuosXsXsXsXsqtQtRtZsuvfuuvgvgvgvhvisutQtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvjvkvlsXujujvauRvmuRujujvnvdvovpvqvdsXsXsXvrtTtUsqtQtRtZsqsqvsvtvuvvvwsqsqtQtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXvkvkvkvxujujujvyvyujujujvzvdvAvBvCbesXvEtTuEtRtRvFtRtRtZsqsqsusususususqsqtQtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN -aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXvGvHsXvIvJujujujujvLujsXvdvMvNvOvPsXvQtRtRtRtZsutQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN +aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXvGvHsXvIvJujujujujvLujsXvdvMmjvOvPsXvQtRtRtRtZsutQtRtStTtTtTtTtTtTtTtTtTuEtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNsXsXsXsXsXsXsXsXbfbfsXsXsXvSvTvUvVvdsXvWtRtRtRvXsutQtRtRtRtRtRtRtRtRtRtRtRtRtRtZsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwbwcwdwbwesXiDwgwhwiwjsXwkudududwlsuwmudududududuetRucudududududwnsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN aNaNaNaNaNaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNwrwswtwrwesXsXsXsXsXsXsXsqsqsqsqsqsqsqsqsqsqsqsqsqwusqsqsqsqsqsqsqsqaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN @@ -1617,7 +1618,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..b980f8a7098 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) diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm index 8d593d21011..131fe41aea3 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) @@ -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,6 @@ "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) "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) @@ -1385,7 +1385,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) @@ -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 diff --git a/_maps/map_files/cyberiad/z6.dmm b/_maps/map_files/cyberiad/z6.dmm index da5594a4405..84dd4bfbd99 100644 --- a/_maps/map_files/cyberiad/z6.dmm +++ b/_maps/map_files/cyberiad/z6.dmm @@ -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) @@ -657,10 +657,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 +682,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) @@ -905,20 +902,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/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/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..4db227ab6f6 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -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..ae27f829621 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -155,9 +155,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..6157c87115c 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -182,9 +182,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..875f09f6bda 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -173,9 +173,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..612f51df80a 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -191,7 +191,7 @@ 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 @@ -207,7 +207,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 +218,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/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..0a856fb047a 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -63,7 +63,7 @@ icon = null initial_loc = get_area(loc) area_uid = initial_loc.uid - if (!id_tag) + if(!id_tag) assign_uid() id_tag = num2text(uid) ..() @@ -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..a7829d9fc1c 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -44,7 +44,7 @@ icon = null initial_loc = get_area(loc) area_uid = initial_loc.uid - if (!id_tag) + if(!id_tag) assign_uid() id_tag = num2text(uid) ..() @@ -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..4b37036f96a 100644 --- a/code/ATMOSPHERICS/pipes/manifold.dm +++ b/code/ATMOSPHERICS/pipes/manifold.dm @@ -124,8 +124,8 @@ 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) + for(var/obj/machinery/meter/meter in T) + if(meter.target == src) new /obj/item/pipe_meter(T) qdel(meter) qdel(src) diff --git a/code/ATMOSPHERICS/pipes/manifold4w.dm b/code/ATMOSPHERICS/pipes/manifold4w.dm index 5975ffce26b..b6cd15bc211 100644 --- a/code/ATMOSPHERICS/pipes/manifold4w.dm +++ b/code/ATMOSPHERICS/pipes/manifold4w.dm @@ -97,8 +97,8 @@ 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) + for(var/obj/machinery/meter/meter in T) + if(meter.target == src) new /obj/item/pipe_meter(T) qdel(meter) qdel(src) diff --git a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm index fbd5f85b6c5..5db391d4dd0 100644 --- a/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm +++ b/code/ATMOSPHERICS/pipes/simple/pipe_simple.dm @@ -144,8 +144,8 @@ 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) + for(var/obj/machinery/meter/meter in T) + if(meter.target == src) new /obj/item/pipe_meter(T) qdel(meter) qdel(src) 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..423356c4e8e 100644 --- a/code/LINDA/LINDA_system.dm +++ b/code/LINDA/LINDA_system.dm @@ -83,35 +83,35 @@ turf/CanPass(atom/movable/mover, turf/target, height=1.5,air_group=0) //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 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/clothing.dm b/code/__DEFINES/clothing.dm index 83a6ac5b20a..ec9ad2f2128 100644 --- a/code/__DEFINES/clothing.dm +++ b/code/__DEFINES/clothing.dm @@ -78,3 +78,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/flags.dm b/code/__DEFINES/flags.dm index 38ffe33cc73..3b69f39a553 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. diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm index 3be0682c727..8cc7145ccd5 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. @@ -27,7 +30,6 @@ // 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%) @@ -121,3 +123,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/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 14161a5775f..1937ac3be85 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -1 +1,3 @@ -#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) \ No newline at end of file diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index d36405db5d1..5a6d0d0d595 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 @@ -255,3 +258,6 @@ #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) 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..f1498862540 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) @@ -194,7 +194,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 +440,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/global_lists.dm b/code/__HELPERS/global_lists.dm index a8c548bdd7a..8a44c1b7cab 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -29,7 +29,7 @@ init_datum_subtypes(/datum/nations, all_nations, null, "default_name") init_datum_subtypes(/datum/language, all_languages, null, "name") - for (var/language_name in all_languages) + for(var/language_name in all_languages) var/datum/language/L = all_languages[language_name] if(!(L.flags & NONGLOBAL)) language_keys[":[lowertext(L.key)]"] = L @@ -46,21 +46,13 @@ if(S.flags & IS_WHITELISTED) whitelisted_species += S.name - paths = subtypesof(/datum/emote) - for(var/T in paths) - var/datum/emote/E = new T - if(istype(T, /datum/emote/custom)) - continue - emotes += E - - init_subtypes(/datum/table_recipe, table_recipes) return 1 /* // Uncomment to debug chemical reaction list. /client/verb/debug_chemical_list() - for (var/reaction in chemical_reactions_list) + for(var/reaction in chemical_reactions_list) . += "chemical_reactions_list\[\"[reaction]\"\] = \"[chemical_reactions_list[reaction]]\"\n" if(islist(chemical_reactions_list[reaction])) var/list/L = chemical_reactions_list[reaction] 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..e749dab5fa8 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 @@ -459,22 +459,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 +485,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 +515,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 +544,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..b2d81f9060d 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]" /** 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..0375b7aacea 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 @@ -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 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/lists/misc.dm b/code/_globalvars/lists/misc.dm index 0511286268e..45f3a56c9b5 100644 --- a/code/_globalvars/lists/misc.dm +++ b/code/_globalvars/lists/misc.dm @@ -20,7 +20,8 @@ var/list/restricted_camera_networks = list( //Those networks can only be accesse "Thunderdome", "UO45", "UO45R", - "Xeno" + "Xeno", + "Hotel" ) var/list/map_templates = 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/reagents.dm b/code/_globalvars/lists/reagents.dm index 8417275d780..23d310be857 100644 --- a/code/_globalvars/lists/reagents.dm +++ b/code/_globalvars/lists/reagents.dm @@ -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..022e308470d 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() 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 c6ad076b102..d04022cc3e8 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -43,6 +43,7 @@ #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 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/robot.dm b/code/_onclick/hud/robot.dm index 861209033af..a69335c6525 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -1,228 +1,241 @@ -/obj/screen/robot - icon = 'icons/mob/screen_robot.dmi' - -/obj/screen/robot/module - name = "cyborg module" - icon_state = "nomod" - -/obj/screen/robot/module/Click() - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - if(R.module) - R.hud_used.toggle_show_robot_modules() - return 1 - R.pick_module() - -/obj/screen/robot/module1 - name = "module1" - icon_state = "inv1" - -/obj/screen/robot/module1/Click() - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - R.toggle_module(1) - -/obj/screen/robot/module2 - name = "module2" - icon_state = "inv2" - -/obj/screen/robot/module2/Click() - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - R.toggle_module(2) - -/obj/screen/robot/module3 - name = "module3" - icon_state = "inv3" - -/obj/screen/robot/module3/Click() - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - R.toggle_module(3) - - -/obj/screen/robot/radio - name = "radio" - icon_state = "radio" - -/obj/screen/robot/radio/Click() - if(issilicon(usr)) - var/mob/living/silicon/robot/R = usr - R.radio_menu() - -/obj/screen/robot/store - name = "store" - icon_state = "store" - -/obj/screen/robot/store/Click() - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - R.uneq_active() - R.hud_used.update_robot_modules_display() - -/obj/screen/robot/lamp - name = "Toggle Headlamp" - icon_state = "lamp0" - screen_loc = ui_borg_lamp - -/obj/screen/robot/lamp/Click() - if(isrobot(usr)) - var/mob/living/silicon/robot/R = usr - R.control_headlamp() - -/obj/screen/robot/panel - name = "installed modules" - icon_state = "panel" - -/obj/screen/robot/panel/Click() - if(issilicon(usr)) - var/mob/living/silicon/robot/R = usr - R.installed_modules() - -/mob/living/silicon/robot/create_mob_hud() - if(client && !hud_used) - hud_used = new /datum/hud/robot(src) - -/datum/hud/robot/New(mob/user) - ..() - - var/obj/screen/using - var/mob/living/silicon/robot/mymobR = mymob - -//Radio - using = new /obj/screen/robot/radio() - using.screen_loc = ui_borg_radio - static_inventory += using - -//Module select - using = new /obj/screen/robot/module1() - using.screen_loc = ui_inv1 - static_inventory += using - mymobR.inv1 = using - - using = new /obj/screen/robot/module2() - using.screen_loc = ui_inv2 - static_inventory += using - mymobR.inv2 = using - - using = new /obj/screen/robot/module3() - using.screen_loc = ui_inv3 - static_inventory += using - mymobR.inv3 = using - -//End of module select - -//Sec/Med HUDs - using = new /obj/screen/ai/sensors() - using.screen_loc = ui_borg_sensor - static_inventory += using - +/obj/screen/robot + icon = 'icons/mob/screen_robot.dmi' + +/obj/screen/robot/module + name = "cyborg module" + icon_state = "nomod" + +/obj/screen/robot/module/Click() + if(isrobot(usr)) + var/mob/living/silicon/robot/R = usr + if(R.module) + R.hud_used.toggle_show_robot_modules() + return 1 + R.pick_module() + +/obj/screen/robot/module1 + name = "module1" + icon_state = "inv1" + +/obj/screen/robot/module1/Click() + if(isrobot(usr)) + var/mob/living/silicon/robot/R = usr + R.toggle_module(1) + +/obj/screen/robot/module2 + name = "module2" + icon_state = "inv2" + +/obj/screen/robot/module2/Click() + if(isrobot(usr)) + var/mob/living/silicon/robot/R = usr + R.toggle_module(2) + +/obj/screen/robot/module3 + name = "module3" + icon_state = "inv3" + +/obj/screen/robot/module3/Click() + if(isrobot(usr)) + var/mob/living/silicon/robot/R = usr + R.toggle_module(3) + + +/obj/screen/robot/radio + name = "radio" + icon_state = "radio" + +/obj/screen/robot/radio/Click() + if(issilicon(usr)) + var/mob/living/silicon/robot/R = usr + R.radio_menu() + +/obj/screen/robot/store + name = "store" + icon_state = "store" + +/obj/screen/robot/store/Click() + if(isrobot(usr)) + var/mob/living/silicon/robot/R = usr + R.uneq_active() + R.hud_used.update_robot_modules_display() + +/obj/screen/robot/lamp + name = "Toggle Headlamp" + icon_state = "lamp0" + screen_loc = ui_borg_lamp + +/obj/screen/robot/lamp/Click() + if(isrobot(usr)) + 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" + +/obj/screen/robot/panel/Click() + if(issilicon(usr)) + var/mob/living/silicon/robot/R = usr + R.installed_modules() + +/mob/living/silicon/robot/create_mob_hud() + if(client && !hud_used) + hud_used = new /datum/hud/robot(src) + +/datum/hud/robot/New(mob/user) + ..() + + var/obj/screen/using + var/mob/living/silicon/robot/mymobR = mymob + +//Radio + using = new /obj/screen/robot/radio() + using.screen_loc = ui_borg_radio + static_inventory += using + +//Module select + using = new /obj/screen/robot/module1() + using.screen_loc = ui_inv1 + static_inventory += using + mymobR.inv1 = using + + using = new /obj/screen/robot/module2() + using.screen_loc = ui_inv2 + static_inventory += using + mymobR.inv2 = using + + using = new /obj/screen/robot/module3() + using.screen_loc = ui_inv3 + static_inventory += using + mymobR.inv3 = using + +//End of module select + +//Sec/Med HUDs + using = new /obj/screen/ai/sensors() + 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 - action_intent = using - -//Health - mymob.healths = new /obj/screen/healths/robot() - infodisplay += mymob.healths - -//Installed Module - mymob.hands = new /obj/screen/robot/module() - mymob.hands.screen_loc = ui_borg_module - static_inventory += mymob.hands - - module_store_icon = new /obj/screen/robot/store() - module_store_icon.screen_loc = ui_borg_store - - mymob.pullin = new /obj/screen/pull() - mymob.pullin.icon = 'icons/mob/screen_robot.dmi' - mymob.pullin.update_icon(mymob) - mymob.pullin.screen_loc = ui_borg_pull - hotkeybuttons += mymob.pullin - + action_intent = using + +//Health + mymob.healths = new /obj/screen/healths/robot() + infodisplay += mymob.healths + +//Installed Module + mymob.hands = new /obj/screen/robot/module() + mymob.hands.screen_loc = ui_borg_module + static_inventory += mymob.hands + + module_store_icon = new /obj/screen/robot/store() + module_store_icon.screen_loc = ui_borg_store + + mymob.pullin = new /obj/screen/pull() + mymob.pullin.icon = 'icons/mob/screen_robot.dmi' + mymob.pullin.update_icon(mymob) + 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) - static_inventory += mymob.zone_sel - -//Headlamp - mymobR.lamp_button = new /obj/screen/robot/lamp() - mymobR.lamp_button.screen_loc = ui_borg_lamp - static_inventory += mymobR.lamp_button - - -/datum/hud/proc/toggle_show_robot_modules() - if(!isrobot(mymob)) - return - - var/mob/living/silicon/robot/R = mymob - - R.shown_robot_modules = !R.shown_robot_modules - update_robot_modules_display() - -/datum/hud/proc/update_robot_modules_display() - if(!isrobot(mymob)) - return - - var/mob/living/silicon/robot/R = mymob - - if(!R.client) - return - - if(!R.module) - return - - if(R.shown_robot_modules && hud_shown) - //Modules display is shown - R.client.screen += module_store_icon //"store" icon - - if(!R.module.modules) - to_chat(usr, "Selected module has no modules to select.") - return - - if(!R.robot_modules_background) - return - - var/display_rows = Ceiling(R.module.modules.len / 8) - R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7" - R.client.screen += R.robot_modules_background - - var/x = -4 //Start at CENTER-4,SOUTH+1 - var/y = 1 - - //Unfortunately adding the emag module to the list of modules has to be here. This is because a borg can - //be emagged before they actually select a module. - or some situation can cause them to get a new module - // - or some situation might cause them to get de-emagged or something. - if(R.emagged) - if(!(R.module.emag in R.module.modules)) - R.module.modules.Add(R.module.emag) - else - if(R.module.emag in R.module.modules) - R.module.modules.Remove(R.module.emag) - - for(var/atom/movable/A in R.module.modules) - if( (A != R.module_state_1) && (A != R.module_state_2) && (A != R.module_state_3) ) - //Module is not currently active - R.client.screen += A - if(x < 0) - A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7" - else - A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7" - A.layer = 20 - A.plane = HUD_PLANE - - x++ - if(x == 4) - x = -4 - y++ - - else - //Modules display is hidden - R.client.screen -= module_store_icon - - for(var/atom/A in R.module.modules) - if( (A != R.module_state_1) && (A != R.module_state_2) && (A != R.module_state_3) ) - //Module is not currently active - R.client.screen -= A - R.shown_robot_modules = 0 - R.client.screen -= R.robot_modules_background + static_inventory += mymob.zone_sel + +//Headlamp + mymobR.lamp_button = new /obj/screen/robot/lamp() + 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)) + return + + var/mob/living/silicon/robot/R = mymob + + R.shown_robot_modules = !R.shown_robot_modules + update_robot_modules_display() + +/datum/hud/proc/update_robot_modules_display() + if(!isrobot(mymob)) + return + + var/mob/living/silicon/robot/R = mymob + + if(!R.client) + return + + if(!R.module) + return + + if(R.shown_robot_modules && hud_shown) + //Modules display is shown + R.client.screen += module_store_icon //"store" icon + + if(!R.module.modules) + to_chat(usr, "Selected module has no modules to select.") + return + + if(!R.robot_modules_background) + return + + var/display_rows = Ceiling(R.module.modules.len / 8) + R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7" + R.client.screen += R.robot_modules_background + + var/x = -4 //Start at CENTER-4,SOUTH+1 + var/y = 1 + + //Unfortunately adding the emag module to the list of modules has to be here. This is because a borg can + //be emagged before they actually select a module. - or some situation can cause them to get a new module + // - or some situation might cause them to get de-emagged or something. + if(R.emagged) + if(!(R.module.emag in R.module.modules)) + R.module.modules.Add(R.module.emag) + else + if(R.module.emag in R.module.modules) + R.module.modules.Remove(R.module.emag) + + for(var/atom/movable/A in R.module.modules) + if( (A != R.module_state_1) && (A != R.module_state_2) && (A != R.module_state_3) ) + //Module is not currently active + R.client.screen += A + if(x < 0) + A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7" + else + A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7" + A.layer = 20 + A.plane = HUD_PLANE + + x++ + if(x == 4) + x = -4 + y++ + + else + //Modules display is hidden + R.client.screen -= module_store_icon + + for(var/atom/A in R.module.modules) + if( (A != R.module_state_1) && (A != R.module_state_2) && (A != R.module_state_3) ) + //Module is not currently active + R.client.screen -= A + R.shown_robot_modules = 0 + R.client.screen -= R.robot_modules_background diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 58fb139ce33..1b32a9201a3 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -143,7 +143,7 @@ for(var/i=1, i 0) + if(hitsound && force > 0) playsound(loc, hitsound, 50, 1, -1) ///////////////////////// user.lastattacked = M @@ -177,9 +177,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/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..e43f452559b 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 @@ -177,20 +176,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 +203,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]." @@ -552,6 +553,9 @@ 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 +610,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 +633,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 +675,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 +685,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/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/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/datacore.dm b/code/datums/datacore.dm index 9dda45c33cf..0f71fa429ea 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..1413b5c7dc9 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"; @@ -293,18 +293,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 += {" + + + + +

Contents

+
    +
  1. What's a Fax?
  2. +
  3. When to Fax?
  4. +
  5. How to Fax?
  6. +
+

+ +

What's a 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?).
  • + +

    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.
  • + +

    How to Fax?


    +
  • 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.


  • - +

    Execution: Lethal Injection


    1. Prisoner must be bucklecuffed to the electric chair or bed.
    2. @@ -2150,7 +2209,7 @@
    3. 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.


    - +

    Execution: Firing Squad


    1. Prisoner must be brought to the Firing Range.
    2. @@ -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 @@

      Code Green


      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.


      - +

      Code Blue


      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.


      - +

      Code Red


      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.


      - +

      Code Gamma


      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.


      - +

      Hiring Policies


      • 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.


      - +

      Firing Policies


      • If a crew is to be dismissed, their ID is to be terminated.
      • @@ -2329,7 +2388,7 @@
      • Demotion or Dismissal must have due cause.


      - +

      Causes for Demotion and Dismissal


      • 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.


      - +

      Situational SoP


      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.

      - +

      Evacuation


      • 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.


      - +

      Viral Outbreak Procedures


      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 @@
      1. Once the Viral Outbreak is over, all personnel are to return to regular duties.


      - +

      Evacuation


      • Immediate evacuation of all untrained personnel.
      • @@ -2384,7 +2443,7 @@
      • Atmospheric Technicians are to remove hazard.


      - +

      Meteor Storm


      • All crew to move to central parts of the station.
      • @@ -2392,7 +2451,7 @@
      • Personel that are doing EVA maintenance should seek shelter immediately.


      - +

      Singularity Containment Failure


      • 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..5687a9b90da 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 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..1130ab3808b 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) 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/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..0eba3b837d2 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 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..ee0427e0b94 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) @@ -314,6 +314,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() ..() @@ -442,13 +443,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 +519,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 +536,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 +547,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 3fa521a7451..57332ae24d6 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/revealrunes)(src) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index ce1e6aad9bb..f9ad24f6ddc 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -261,6 +261,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 +616,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..2a3a602258e 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) @@ -392,14 +392,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 +409,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 +488,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 +514,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 +532,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..3c972b9d041 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) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index db834beeb45..df131be786c 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -132,6 +132,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 +187,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" 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..ccde1d215e2 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -4,7 +4,7 @@ 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 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..98c6340d927 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -41,37 +41,37 @@ /obj/item/weapon/tank/examine(mob/user) var/obj/icon = src - if (istype(src.loc, /obj/item/assembly)) + 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(!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/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) )) + if(!( istype(location, /turf) )) qdel(src) if(src.air_contents) @@ -83,17 +83,17 @@ ..() src.add_fingerprint(user) - if (istype(src.loc, /obj/item/assembly)) + if(istype(src.loc, /obj/item/assembly)) icon = src.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(!(src.air_contents)) return ui_interact(user) @@ -130,7 +130,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) @@ -143,28 +143,28 @@ /obj/item/weapon/tank/Topic(href, href_list) ..() - if (usr.stat|| usr.restrained()) + if(usr.stat|| usr.restrained()) return 0 - if (src.loc != usr) + if(src.loc != usr) return 0 - if (href_list["dist_p"]) - if (href_list["dist_p"] == "reset") + 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") + else if(href_list["dist_p"] == "max") src.distribute_pressure = TANK_MAX_RELEASE_PRESSURE else var/cp = text2num(href_list["dist_p"]) src.distribute_pressure += cp src.distribute_pressure = min(max(round(src.distribute_pressure), 0), TANK_MAX_RELEASE_PRESSURE) - if (href_list["stat"]) + 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) + if(location.internals) location.internals.icon_state = "internal0" else @@ -179,7 +179,7 @@ if(can_open_valve) location.internal = src to_chat(usr, "\blue You open \the [src] valve.") - if (location.internals) + if(location.internals) location.internals.icon_state = "internal1" else to_chat(usr, "\blue You need something to connect to \the [src].") diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index 1d9cce844ff..468ac6bf3bf 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -5,7 +5,7 @@ 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" @@ -25,7 +25,7 @@ /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 +52,7 @@ 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 +62,7 @@ return /obj/item/weapon/watertank/Destroy() - if (on) + if(on) remove_noz() qdel(noz) noz = null @@ -108,7 +108,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 @@ -133,7 +133,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 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..586eaab9672 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" @@ -109,7 +109,7 @@ ///////////OFFHAND/////////////// /obj/item/weapon/twohanded/offhand - w_class = 5.0 + w_class = 5 icon_state = "offhand" name = "offhand" flags = ABSTRACT @@ -120,18 +120,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 +157,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 +192,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 +230,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 +279,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 +356,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 +570,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..48d90fe11e7 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -103,18 +103,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 +128,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..c4fa509b947 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,6 +31,7 @@ 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) 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/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..aa32068ddef 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) @@ -98,11 +100,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 +149,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 +264,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 +276,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 +323,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 +355,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..005caf3256d 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -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) @@ -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 dc697aa7df9..d5a370e9225 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -151,7 +151,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.") @@ -235,7 +235,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 @@ -244,8 +244,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.") @@ -273,7 +273,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]") @@ -298,9 +298,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 1cd49eb9b50..d84e879dbe0 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]!") @@ -206,13 +206,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) @@ -277,12 +277,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..4137696ea2a 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) @@ -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..4c58183b026 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -129,7 +129,7 @@ proc/Dismantle(devastated = 0) if(!devastated) - if (mineralType == "metal") + if(mineralType == "metal") var/ore = /obj/item/stack/sheet/metal for(var/i = 1, i <= oreAmount, i++) new ore(get_turf(src)) @@ -138,7 +138,7 @@ for(var/i = 1, i <= oreAmount, i++) new ore(get_turf(src)) else - if (mineralType == "metal") + if(mineralType == "metal") var/ore = /obj/item/stack/sheet/metal for(var/i = 3, i <= oreAmount, i++) new ore(get_turf(src)) 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 621f3a9d78e..c62df2f6cca 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -140,6 +140,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 bdf94263c8e..285b1da8aa5 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -54,14 +54,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 : ""]" @@ -75,11 +75,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 @@ -134,8 +134,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 @@ -150,13 +150,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 @@ -165,7 +165,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 @@ -177,8 +177,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 @@ -186,13 +186,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 @@ -217,11 +217,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)) @@ -263,11 +263,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) @@ -277,7 +277,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))) @@ -297,13 +297,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)) ) @@ -313,8 +313,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) @@ -333,14 +333,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 @@ -471,33 +471,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 @@ -560,18 +560,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 e078fa2295e..32379e0881a 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -127,7 +127,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]!", \ @@ -168,27 +168,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) @@ -229,16 +229,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) @@ -505,7 +505,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 diff --git a/code/game/response_team.dm b/code/game/response_team.dm index d9b8cfcc375..2aef3f958e5 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 @@ -348,16 +331,18 @@ var/send_emergency_team pda.name = "PDA-[M.real_name] ([pda.ownjob])" M.equip_to_slot_or_del(pda, slot_wear_pda) +/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) ..() @@ -429,7 +414,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) ..() @@ -513,7 +498,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) ..() 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..979f0ca2ace 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 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/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..ebcac04b6ed 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 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..4427e694ffd 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -103,7 +103,7 @@ var/global/nologevent = 0 Subtle message "} - if (M.client) + if(M.client) if(!istype(M, /mob/new_player)) body += "

        " body += "Transformation:" @@ -191,7 +191,7 @@ var/global/nologevent = 0 Shade "} - if (M.client) + if(M.client) body += {"

        Other actions:
        @@ -243,7 +243,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 +576,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 +592,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 +643,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 +661,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 +679,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 +709,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 +728,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 +829,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 +846,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 +856,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 +888,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 +905,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 +955,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 +986,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 9d5a0503298..1c24e8cf214 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -72,7 +72,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 +615,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 +643,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 +857,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,7 +878,7 @@ 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") @@ -902,7 +903,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 +933,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/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("") - - dat += "
        (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 = "
        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 3802c7c7432..09e17479927 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); @@ -332,7 +332,7 @@ //The old one /datum/admins/proc/player_panel_old() - if (!usr.client.holder) + if(!usr.client.holder) return var/dat = "Player Menu" dat += "

        " @@ -406,10 +406,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
        " @@ -547,12 +547,12 @@ return txt /datum/admins/proc/check_role_table_row(mob/M, show_objectives) - if (!istype(M)) + if(!istype(M)) return "" var/txt = check_antagonists_line(M, close = 0) - if (show_objectives) + if(show_objectives) txt += {"
        NameReal NameAssigned JobKeyOptionsPMTraitor?
        Not found!
        Show Objective diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index 99595d9a02c..30817dd94d5 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 += {"
        @@ -86,7 +86,7 @@
        "} - if (2) + if(2) if(check_rights((R_SERVER|R_EVENT),0)) dat += {"
        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 . += "
        1. \[-\][key]
        2. " . += "
        \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/topic.dm b/code/modules/admin/topic.dm index 865ea301800..67d6bf6f49e 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -877,7 +877,7 @@ else if(href_list["boot2"]) var/mob/M = locate(href_list["boot2"]) - if (ismob(M)) + if(ismob(M)) if(!check_if_greater_rights_than(M.client)) return to_chat(M, "\red You have been kicked from the server") @@ -1094,7 +1094,7 @@ else if(href_list["c_mode2"]) if(!check_rights(R_ADMIN|R_SERVER)) return - if (ticker && ticker.mode) + if(ticker && ticker.mode) return alert(usr, "The game has already started.", null, null, null, null) master_mode = href_list["c_mode2"] log_admin("[key_name(usr)] set the mode as [master_mode].") @@ -1124,6 +1124,8 @@ if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") return + if(alert(usr, "Confirm make monkey?",, "Yes", "No") != "Yes") + return log_admin("[key_name(usr)] attempting to monkeyize [key_name(H)]") message_admins("\blue [key_name_admin(usr)] attempting to monkeyize [key_name_admin(H)]", 1) @@ -1138,6 +1140,9 @@ to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") return + if(alert(usr, "Confirm make corgi?",, "Yes", "No") != "Yes") + return + log_admin("[key_name(usr)] attempting to corgize [key_name(H)]") message_admins("\blue [key_name_admin(usr)] attempting to corgize [key_name_admin(H)]", 1) H.corgize() @@ -1149,6 +1154,8 @@ if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") return + if(alert(usr, "Confirm make pai?",, "Yes", "No") != "Yes") + return var/painame = "Default" var/name = "" @@ -1407,6 +1414,9 @@ to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") return + if(alert(usr, "Confirm make ai?",, "Yes", "No") != "Yes") + return + message_admins("\red Admin [key_name_admin(usr)] AIized [key_name_admin(H)]!", 1) log_admin("[key_name(usr)] AIized [key_name(H)]") H.AIize() @@ -1414,6 +1424,10 @@ else if(href_list["makemask"]) if(!check_rights(R_SPAWN)) return + + if(alert(usr, "Confirm make mask?",, "Yes", "No") != "Yes") + return + var/mob/currentMob = locate(href_list["makemask"]) message_admins("\red Admin [key_name_admin(usr)] made [key_name_admin(currentMob)] into a Mask of Nar'Sie!", 1) log_admin("[key_name(usr)] made [key_name(currentMob)] into a Mask of Nar'Sie!") @@ -1427,6 +1441,8 @@ if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") return + if(alert(usr, "Confirm make alien?",, "Yes", "No") != "Yes") + return usr.client.cmd_admin_alienize(H) @@ -1437,6 +1453,8 @@ if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") return + if(alert(usr, "Confirm make slime?",, "Yes", "No") != "Yes") + return usr.client.cmd_admin_slimeize(H) @@ -1448,6 +1466,9 @@ to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") return + if(alert(usr, "Confirm make superhero?",, "Yes", "No") != "Yes") + return + usr.client.cmd_admin_super(H) else if(href_list["makerobot"]) @@ -1457,6 +1478,8 @@ if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") return + if(alert(usr, "Confirm make robot?",, "Yes", "No") != "Yes") + return usr.client.cmd_admin_robotize(H) @@ -1467,6 +1490,8 @@ if(istype(M, /mob/new_player)) to_chat(usr, "This cannot be used on instances of type /mob/new_player") return + if(alert(usr, "Confirm make animal?",, "Yes", "No") != "Yes") + return usr.client.cmd_admin_animalize(M) @@ -1567,10 +1592,10 @@ if(isliving(M)) var/mob/living/L = M var/status - switch (M.stat) - if (0) status = "Alive" - if (1) status = "Unconscious" - if (2) status = "Dead" + switch(M.stat) + if(0) status = "Alive" + if(1) status = "Unconscious" + if(2) status = "Dead" health_description = "Status = [status]" health_description += "
        Oxy: [L.getOxyLoss()] - Tox: [L.getToxLoss()] - Fire: [L.getFireLoss()] - Brute: [L.getBruteLoss()] - Clone: [L.getCloneLoss()] - Brain: [L.getBrainLoss()]" else @@ -1682,7 +1707,7 @@ if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") return - var/etypes = list("borging","corgifying","firedeath","braindeath","honktumor","demotion") + var/etypes = list("Borgification","Corgification","Death By Fire","Total Brain Death","Honk Tumor","Cluwne","Demotion Notice") var/eviltype = input(src.owner, "Which type of evil fax do you wish to send [H]?","Its good to be baaaad...", "") as null|anything in etypes if(!(eviltype in etypes)) return @@ -1693,7 +1718,7 @@ var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"]) P.name = "Central Command - [customname]" - P.info = "A reminder: per the terms of your contract, stupid faxes will get you demoted, or worse." + P.info = "You really should've known better." P.myeffect = eviltype P.mytarget = H if(alert("Do you want the Evil Fax to activate automatically if [H] tries to ignore it?",,"Yes", "No") == "Yes") @@ -1733,19 +1758,23 @@ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(null) var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"]) P.name = "Central Command - paper" - var/stypes = list("handle it yourself","illegible","not signed","sorry, not right now","stop wasting our time") + var/stypes = list("Handle it yourselves!","Illegible fax","Fax not signed","Not Right Now","You are wasting our time", "Keep up the good work", "ERT Instructions") var/stype = input(src.owner, "Which type of standard reply do you wish to send to [H]?","Choose your paperwork", "") as null|anything in stypes var/tmsg = "



        NanoTrasen Science Station Cyberiad


        NAS Trurl Communications Department Report


        " - if(stype == "handle it yourself") - tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

        Please proceed in accordance with Standard Operating Procedure and/or Space Law. You are fully trained to handle this situation without Central Command intervention." - else if(stype == "illegible") - tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

        Your fax was too poorly written for our system to interpret." - else if(stype == "not signed") - tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

        Your fax was not properly signed and/or stamped." - else if(stype == "sorry, not right now") - tmsg += "Greetings, esteemed crewmember. Unfortunately, we are unable to spare the resources to assist you at this time." - else if(stype == "stop wasting our time") - tmsg += "Stop wasting our time." + if(stype == "Handle it yourselves!") + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

        Please proceed in accordance with Standard Operating Procedure and/or Space Law. You are fully trained to handle this situation without Central Command intervention.

        This is an automatic message." + else if(stype == "Illegible fax") + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

        Your fax's grammar, syntax and/or typography are of a sub-par level and do not allow us to understand the contents of the message.

        Please consult your nearest dictionary and/or thesaurus and try again.

        This is an automatic message." + else if(stype == "Fax not signed") + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

        Your fax has not been correctly signed and, as such, we cannot verify your identity.

        Please sign your faxes before sending them so that we may verify your identity.

        This is an automatic message." + else if(stype == "Not Right Now") + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

        Due to pressing concerns of a matter above your current paygrade, we are unable to provide assistance in whatever matter your fax referenced.

        This can be either due to a power outage, bureaucratic audit, pest infestation, Ascendance Event, corgi outbreak, or any other situation that would affect the proper functioning of the NAS Trurl.

        Please try again later.

        This is an automatic message." + else if(stype == "You are wasting our time") + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

        In the interest of preventing further mismanagement of company resources, please avoid wasting our time with such petty drivel.

        Do kindly remember that we expect our workforce to maintain at least a semi-decent level of profesionalism. Do not test our patience.

        This is an automatic message." + else if(stype == "Keep up the good work") + tmsg += "Greetings, esteemed crewmember. Your fax has been received successfully by NAS Trurl Fax Registration.

        We at the NAS Trurl appreciate the good work that you have done here, and sincerely recommend that you continue such a display of dedication to the company.

        This is absolutely not an automated message." + else if(stype == "ERT Instructions") + tmsg += "Greetings, esteemed crewmember. Your fax has been DECLINED automatically by NAS Trurl Fax Registration.

        Please utilize the Card Swipers if you wish to call for an ERT.

        This is an automated message." else return tmsg += "
        " @@ -1829,7 +1858,7 @@ var/input = input(src.owner, "Please enter a reason for denying [key_name(H)]'s ERT request.","Outgoing message from CentComm", "") if(!input) return - + ert_request_answered = 1 to_chat(src.owner, "You sent [input] to [H] via a secure channel.") log_admin("[src.owner] denied [key_name(H)]'s ERT request with the message [input].") to_chat(H, "You hear something crackle in your headset for a moment before a voice speaks. \"Your ERT request has been denied for the following reasons: [input]. Message ends.\"") @@ -1842,19 +1871,19 @@ return var/obj/item/fax = locate(href_list["AdminFaxView"]) - if (istype(fax, /obj/item/weapon/paper)) + if(istype(fax, /obj/item/weapon/paper)) var/obj/item/weapon/paper/P = fax P.show_content(usr,1) - else if (istype(fax, /obj/item/weapon/photo)) + else if(istype(fax, /obj/item/weapon/photo)) var/obj/item/weapon/photo/H = fax H.show(usr) - else if (istype(fax, /obj/item/weapon/paper_bundle)) + else if(istype(fax, /obj/item/weapon/paper_bundle)) //having multiple people turning pages on a paper_bundle can cause issues //open a browse window listing the contents instead var/data = "" var/obj/item/weapon/paper_bundle/B = fax - for (var/page = 1, page <= B.amount + 1, page++) + for(var/page = 1, page <= B.amount + 1, page++) var/obj/pageobj = B.contents[page] data += "Page [page] - [pageobj.name]
        " @@ -1862,19 +1891,19 @@ else to_chat(usr, "\red The faxed item is not viewable. This is probably a bug, and should be reported on the tracker: [fax.type]") - else if (href_list["AdminFaxViewPage"]) + else if(href_list["AdminFaxViewPage"]) if(!check_rights(R_ADMIN)) return var/page = text2num(href_list["AdminFaxViewPage"]) var/obj/item/weapon/paper_bundle/bundle = locate(href_list["paper_bundle"]) - if (!bundle) return + if(!bundle) return - if (istype(bundle.contents[page], /obj/item/weapon/paper)) + if(istype(bundle.contents[page], /obj/item/weapon/paper)) var/obj/item/weapon/paper/P = bundle.contents[page] P.show_content(usr, 1) - else if (istype(bundle.contents[page], /obj/item/weapon/photo)) + else if(istype(bundle.contents[page], /obj/item/weapon/photo)) var/obj/item/weapon/photo/H = bundle.contents[page] H.show(usr) return @@ -2099,9 +2128,9 @@ var/atom/loc = usr.loc var/dirty_paths - if (istext(href_list["object_list"])) + if(istext(href_list["object_list"])) dirty_paths = list(href_list["object_list"]) - else if (istype(href_list["object_list"], /list)) + else if(istype(href_list["object_list"], /list)) dirty_paths = href_list["object_list"] var/paths = list() @@ -2135,22 +2164,22 @@ var/atom/target //Where the object will be spawned var/where = href_list["object_where"] - if (!( where in list("onfloor","inhand","inmarked") )) + if(!( where in list("onfloor","inhand","inmarked") )) where = "onfloor" switch(where) if("inhand") - if (!iscarbon(usr) && !isrobot(usr)) + if(!iscarbon(usr) && !isrobot(usr)) to_chat(usr, "Can only spawn in hand when you're a carbon mob or cyborg.") where = "onfloor" target = usr if("onfloor") switch(href_list["offset_type"]) - if ("absolute") + if("absolute") target = locate(0 + X,0 + Y,0 + Z) - if ("relative") + if("relative") target = locate(loc.x + X,loc.y + Y,loc.z + Z) if("inmarked") if(!marked_datum) @@ -2163,8 +2192,8 @@ target = marked_datum if(target) - for (var/path in paths) - for (var/i = 0; i < number; i++) + for(var/path in paths) + for(var/i = 0; i < number; i++) if(path in typesof(/turf)) var/turf/O = target var/turf/N = O.ChangeTurf(path) @@ -2192,7 +2221,7 @@ R.activate_module(I) R.module.fix_modules() - if (number == 1) + if(number == 1) log_admin("[key_name(usr)] created a [english_list(paths)]") for(var/path in paths) if(ispath(path, /mob)) @@ -2262,7 +2291,7 @@ /* for(var/obj/machinery/vehicle/pod/O in world) for(var/mob/M in src) M.loc = src.loc - if (M.client) + if(M.client) M.client.perspective = MOB_PERSPECTIVE M.client.eye = M qdel(O) @@ -2360,9 +2389,9 @@ continue //don't strip organs H.unEquip(W) - if (H.client) + if(H.client) H.client.screen -= W - if (W) + if(W) W.loc = H.loc W.dropped(H) W.layer = initial(W.layer) @@ -2414,9 +2443,9 @@ feedback_add_details("admin_secrets_fun_used","BC") var/newBombCap = input(usr,"What would you like the new bomb cap to be. (entered as the light damage range (the 3rd number in common (1,2,3) notation)) Must be between 4 and 128)", "New Bomb Cap", MAX_EX_LIGHT_RANGE) as num|null - if (newBombCap < 4) + if(newBombCap < 4) return - if (newBombCap > 128) + if(newBombCap > 128) newBombCap = 128 MAX_EX_DEVESTATION_RANGE = round(newBombCap/4) @@ -2598,7 +2627,7 @@ W.item_state = "w_suit" W.item_color = "schoolgirl" message_admins("[key_name_admin(usr)] activated Japanese Animes mode") - to_chat(world, sound('sound/AI/animes.ogg')) + world << sound('sound/AI/animes.ogg') if("eagles")//SCRAW feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","EgL") @@ -2703,7 +2732,7 @@ if(usr) log_admin("[key_name(usr)] used secret [href_list["secretsfun"]]") - if (ok) + if(ok) to_chat(world, text("A secret has been activated by []!", usr.key)) else if(href_list["secretsadmin"]) @@ -2743,7 +2772,7 @@ if("showgm") if(!ticker) alert("The game hasn't started yet!") - else if (ticker.mode) + else if(ticker.mode) alert("The game mode is [ticker.mode.name]") else alert("For some reason there's a ticker, but not a game mode") if("manifest") @@ -2778,9 +2807,9 @@ dat += "
        " usr << browse(dat, "window=fingerprints;size=440x410") else - if (usr) + if(usr) log_admin("[key_name(usr)] used secret [href_list["secretsadmin"]]") - if (ok) + if(ok) to_chat(world, text("A secret has been activated by []!", usr.key)) else if(href_list["secretscoder"]) @@ -2796,12 +2825,12 @@ usr << browse(dat, "window=admin_log") if("maint_access_brig") for(var/obj/machinery/door/airlock/maintenance/M in world) - if (access_maint_tunnels in M.req_access) + if(access_maint_tunnels in M.req_access) M.req_access = list(access_brig) message_admins("[key_name_admin(usr)] made all maint doors brig access-only.") if("maint_access_engiebrig") for(var/obj/machinery/door/airlock/maintenance/M in world) - if (access_maint_tunnels in M.req_access) + if(access_maint_tunnels in M.req_access) M.req_access = list() M.req_one_access = list(access_brig,access_engine) message_admins("[key_name_admin(usr)] made all maint doors engineering and brig access-only.") @@ -2818,7 +2847,7 @@ else if(href_list["ac_set_channel_name"]) src.admincaster_feed_channel.channel_name = strip_html_simple(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "")) - while (findtext(src.admincaster_feed_channel.channel_name," ") == 1) + while(findtext(src.admincaster_feed_channel.channel_name," ") == 1) src.admincaster_feed_channel.channel_name = copytext(src.admincaster_feed_channel.channel_name,2,lentext(src.admincaster_feed_channel.channel_name)+1) src.access_news_network() @@ -2857,7 +2886,7 @@ else if(href_list["ac_set_new_message"]) src.admincaster_feed_message.body = adminscrub(input(usr, "Write your Feed story", "Network Channel Handler", "")) - while (findtext(src.admincaster_feed_message.body," ") == 1) + while(findtext(src.admincaster_feed_message.body," ") == 1) src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.body,2,lentext(src.admincaster_feed_message.body)+1) src.access_news_network() @@ -2911,13 +2940,13 @@ else if(href_list["ac_set_wanted_name"]) src.admincaster_feed_message.author = adminscrub(input(usr, "Provide the name of the Wanted person", "Network Security Handler", "")) - while (findtext(src.admincaster_feed_message.author," ") == 1) + while(findtext(src.admincaster_feed_message.author," ") == 1) src.admincaster_feed_message.author = copytext(admincaster_feed_message.author,2,lentext(admincaster_feed_message.author)+1) src.access_news_network() else if(href_list["ac_set_wanted_desc"]) src.admincaster_feed_message.body = adminscrub(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", "")) - while (findtext(src.admincaster_feed_message.body," ") == 1) + while(findtext(src.admincaster_feed_message.body," ") == 1) src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.body,2,lentext(src.admincaster_feed_message.body)+1) src.access_news_network() @@ -3000,7 +3029,7 @@ else if(href_list["ac_setScreen"]) //Brings us to the main menu and resets all fields~ src.admincaster_screen = text2num(href_list["ac_setScreen"]) - if (src.admincaster_screen == 0) + if(src.admincaster_screen == 0) if(src.admincaster_feed_channel) src.admincaster_feed_channel = new /datum/feed_channel if(src.admincaster_feed_message) 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/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..fde2ec0579e 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 @@ -616,32 +616,32 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(isnull(dostrip)) 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! 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) - 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) @@ -652,7 +652,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that J.toggle() 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") + 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) @@ -680,8 +680,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/clothing/mask/breath(M), slot_wear_mask) 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) @@ -695,7 +695,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/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) @@ -707,7 +707,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/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) @@ -718,7 +718,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/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) @@ -741,14 +741,14 @@ 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) - 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) @@ -757,7 +757,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/melee/energy/sword/pirate(M), slot_r_hand) - 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) @@ -869,19 +869,20 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if("nanotrasen 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/ert(M), slot_l_ear) M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/officer(M), slot_head) - - 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/device/pda/centcom(M), slot_wear_pda) + M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses) M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt) + M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + + 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() var/obj/item/weapon/card/id/centcom/W = new(M) W.name = "[M.real_name]'s ID Card (Nanotrasen Navy Officer)" @@ -894,17 +895,16 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that 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/ert(M), slot_l_ear) M.equip_or_collect(new /obj/item/clothing/head/beret/centcom/captain(M), slot_head) - - 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])" - - 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/device/pda/centcom(M), slot_wear_pda) + M.equip_or_collect(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses) M.equip_or_collect(new /obj/item/weapon/gun/energy/pulse/pistol(M), slot_belt) + M.equip_or_collect(new /obj/item/weapon/storage/backpack/satchel(M), slot_back) + 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() var/obj/item/weapon/card/id/centcom/W = new(M) W.name = "[M.real_name]'s ID Card (Nanotrasen Navy Captain)" 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..0a52bdbdce0 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) 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 5fb8335732d..daedb7ae5e0 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)) @@ -277,13 +277,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 @@ -303,7 +303,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 @@ -356,10 +356,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) @@ -386,8 +386,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 @@ -469,7 +469,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 @@ -551,7 +551,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)) @@ -600,7 +600,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..f41a900aed7 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]") @@ -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..98ef8d7b3b8 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) @@ -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,7 +143,7 @@ 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) + if(!leader_selected) equip_to_slot_or_del(new /obj/item/weapon/c4(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/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm index 054b5469d9b..abb6de5ceb7 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) @@ -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) @@ -150,7 +150,7 @@ var/global/sent_syndicate_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/c4(src), slot_in_backpack) equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_in_backpack) - if (!syndicate_leader_selected) + if(!syndicate_leader_selected) equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_in_backpack) equip_to_slot_or_del(new /obj/item/weapon/card/emag(src), slot_in_backpack) else diff --git a/code/modules/admin/verbs/vox_raiders.dm b/code/modules/admin/verbs/vox_raiders.dm index 4d42358aee8..251ec478381 100644 --- a/code/modules/admin/verbs/vox_raiders.dm +++ b/code/modules/admin/verbs/vox_raiders.dm @@ -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..7be5eac988a 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 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..26c167abcee 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() diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index 880dc2d2218..4b21da11cd2 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() 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..99090ff2dac 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"]
        @@ -94,7 +94,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 +150,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..1c806de85ec 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() 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..5e79391cd40 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -159,7 +159,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 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..469dffaca54 --- /dev/null +++ b/code/modules/awaymissions/map_rng.dm @@ -0,0 +1,38 @@ +/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 + +/obj/effect/landmark/map_loader/New(loc, tname) + ..() + if(tname) + template_name = tname + if(template_name) + template = map_templates[template_name] + if(template) + load(template) + +/obj/effect/landmark/map_loader/proc/load(datum/map_template/t) + spawn(1) + if(!t) + return + t.load(get_turf(src), centered = centered) + t.loaded++ + qdel(src) + +/obj/effect/landmark/map_loader/random + var/template_list = "" + +/obj/effect/landmark/map_loader/random/New() + ..() + if(template_list) + template_name = safepick(splittext(template_list, ";")) + template = map_templates[template_name] + load(template) \ No newline at end of file diff --git a/code/modules/awaymissions/mission_code/spacehotel.dm b/code/modules/awaymissions/mission_code/spacehotel.dm new file mode 100644 index 00000000000..c4820db97ec --- /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/New() + ..() + + // 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)) + 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 + load(M) + if(dir == NORTH) + north_room_templates -= M + else + south_room_templates -= 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 \ No newline at end of file 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 682e2137d2a..7a6480943a7 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..33c42950345 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -30,27 +30,27 @@ Lines = file2list("config/example/away_mission_config.txt") if(!Lines.len) return - for (var/t in Lines) - if (!t) + for(var/t in Lines) + 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 potentialRandomZlevels.Add(t) @@ -68,7 +68,7 @@ log_to_dd(" Away mission loaded: [map]") for(var/obj/effect/landmark/L in landmarks_list) - if (L.name != "awaystart") + if(L.name != "awaystart") continue awaydestinations.Add(L) diff --git a/code/modules/awaymissions/zvis.dm b/code/modules/awaymissions/zvis.dm new file mode 100644 index 00000000000..069d733c7e4 --- /dev/null +++ b/code/modules/awaymissions/zvis.dm @@ -0,0 +1,364 @@ +/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 + 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) + 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 + + 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) \ No newline at end of file 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..241ebd1fdf6 --- /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", "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", "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", "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/beret/purple + display_name = "beret, purple" + path = /obj/item/clothing/head/beret/purple_normal + +/datum/gear/hat/beret/black + display_name = "beret, black" + path = /obj/item/clothing/head/beret/black + +/datum/gear/hat/beret/blue + display_name = "beret, blue" + path = /obj/item/clothing/head/beret/blue + +/datum/gear/hat/beret/red + display_name = "beret, red" + path = /obj/item/clothing/head/beret 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..2da1fddec94 --- /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 + sort_category = "External Wear" + +//WINTER COATS +/datum/gear/suit/coat + subtype_path = /datum/gear/suit/coat + cost = 2 + +/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 + 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", "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..02cc369fe63 --- /dev/null +++ b/code/modules/client/preference/loadout/loadout_uniform.dm @@ -0,0 +1,191 @@ +// Uniform slot +/datum/gear/uniform + subtype_path = /datum/gear/uniform + slot = slot_w_uniform + 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 + cost = 2 + 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 + cost = 2 + +/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/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/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 93% rename from code/modules/client/preferences.dm rename to code/modules/client/preference/preferences.dm index d530f502697..0d796197f6a 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preference/preferences.dm @@ -1,1992 +1,2114 @@ -//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_styles = "head=None;\ - body=None;\ - tail=None" //Marking styles. - var/m_colours = "head=#000000;\ - body=#000000;\ - tail=#000000" //Marking colours. - 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 += "Name: " - dat += "[real_name]" - dat += "(Randomize)" - dat += "(Always Randomize)
        " - dat += "
        " - dat += "
        " - dat += "Slot [slot_name] - " - dat += "Load slot - " - dat += "Save slot - " - dat += "Reload slot" - 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("Machine", "Tajaran", "Unathi")) //Species with head markings. - var/list/marking_styles = params2list(m_styles) - var/list/marking_colours = params2list(m_colours) - marking_colours["head"] = sanitize_hexcolor(marking_colours["head"]) - dat += "Head Markings: " - dat += "[marking_styles["head"]]" - dat += "Color [color_square(hex2num(copytext(marking_colours["head"], 2, 4)), hex2num(copytext(marking_colours["head"], 4, 6)), hex2num(copytext(marking_colours["head"], 6, 8)))]
        " - if(species in list("Unathi", "Vulpkanin", "Tajaran")) //Species with body markings. - var/list/marking_styles = params2list(m_styles) - var/list/marking_colours = params2list(m_colours) - marking_colours["body"] = sanitize_hexcolor(marking_colours["body"]) - dat += "Body Markings: " - dat += "[marking_styles["body"]]" - dat += "Color [color_square(hex2num(copytext(marking_colours["body"], 2, 4)), hex2num(copytext(marking_colours["body"], 4, 6)), hex2num(copytext(marking_colours["body"], 6, 8)))]
        " - if(species in list("Vox", "Vulpkanin")) //Species with tail markings. - var/list/marking_styles = params2list(m_styles) - var/list/marking_colours = params2list(m_colours) - marking_colours["tail"] = sanitize_hexcolor(marking_colours["tail"]) - dat += "Tail Markings: " - dat += "[marking_styles["tail"]]" - dat += "Color [color_square(hex2num(copytext(marking_colours["tail"], 2, 4)), hex2num(copytext(marking_colours["tail"], 4, 6)), hex2num(copytext(marking_colours["tail"], 6, 8)))]
        " - - 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 += "

        General Settings

        " - dat += "Fancy NanoUI: [(nanoui_fancy) ? "Yes" : "No"]
        " - dat += "Ghost-Item Attack Animation: [(show_ghostitem_attack) ? "Yes" : "No"]
        " - dat += "Custom UI settings:
        " - dat += " - UI Style: [UI_style]
        " - dat += " - Color: [UI_style_color]
        __

        " - dat += " - Alpha (transparency): [UI_style_alpha]
        " - dat += "
        " - dat += "Play admin midis: [(sound & SOUND_MIDI) ? "Yes" : "No"]
        " - dat += "Play lobby music: [(sound & SOUND_LOBBY) ? "Yes" : "No"]
        " - if(user.client.holder) - dat += "Adminhelp sound: " - dat += "[(sound & SOUND_ADMINHELP)?"On":"Off"]
        " - - if(check_rights(R_ADMIN,0)) - dat += "OOC:     Change
        " - if(config.allow_Metadata) - dat += "OOC notes: Edit
        " - if(unlock_content) - dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]
        " - - dat += "Randomized character slot: [randomslot ? "Yes" : "No"]
        " - dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"]
        " - dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"]
        " - dat += "Ghost radio: [(toggles & CHAT_GHOSTRADIO) ? "Nearest Speakers" : "All Chatter"]
        " - - dat += "
        " - dat += "

        Special Role Settings

        " - if(jobban_isbanned(user, "Syndicate")) - dat += "You are banned from special roles." - be_special = list() - else - for(var/i in special_roles) - if(jobban_isbanned(user, i)) - dat += "Be [capitalize(i)]: \[BANNED]
        " - else if(!player_old_enough_antag(user.client,i)) - var/available_in_days_antag = available_in_days_antag(user.client,i) - dat += "Be [capitalize(i)]: \[IN [(available_in_days_antag)] DAYS]
        " - else - dat += "Be [capitalize(i)]: [(i in src.be_special) ? "Yes" : "No"]
        " - 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 += "" - continue - if(jobban_isbanned(user, rank)) - HTML += "[rank]" - continue - if(!job.player_old_enough(user.client)) - var/available_in_days = job.available_in_days(user.client) - HTML += "[rank]" - 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 += "" - 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 += "
        " - var/rank = job.title - lastJob = job - if(!is_job_whitelisted(user, rank)) - HTML += "[rank] \[KARMA]
        \[BANNED]
        \[IN [(available_in_days)] DAYS]
        " - - 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 += "
        " - - 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_styles = "head=None;\ - body=None;\ - tail=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("m_style_head") - if(species in list("Machine", "Tajaran", "Unathi")) //Species with head markings. - var/list/valid_markings = list() - valid_markings["None"] = marking_styles_list["None"] - for(var/markingstyle in marking_styles_list) - var/datum/sprite_accessory/M = marking_styles_list[markingstyle] - if(!(species in M.species_allowed)) - continue - if(M.marking_location != "head") - 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/list/marking_styles = params2list(m_styles) - var/new_marking_style = input(user, "Choose the style of your character's head markings:", "Character Preference", marking_styles["head"]) as null|anything in valid_markings - if(new_marking_style) - marking_styles["head"] = new_marking_style - m_styles = list2params(marking_styles) - - if("m_head_colour") - if(species in list("Machine", "Tajaran", "Unathi")) //Species with head markings. - var/input = "Choose the colour of your your character's head markings:" - var/list/marking_colours = params2list(m_colours) - marking_colours["head"] = sanitize_hexcolor(marking_colours["head"]) - var/new_markings = input(user, input, "Character Preference", rgb(hex2num(copytext(marking_colours["head"], 2, 4)), hex2num(copytext(marking_colours["head"], 4, 6)), hex2num(copytext(marking_colours["head"], 6, 8)))) as color|null - if(new_markings) - marking_colours["head"] = new_markings - m_colours = list2params(marking_colours) - - if("m_style_body") - if(species in list("Unathi", "Vulpkanin", "Tajaran")) //Species with body markings. - var/list/valid_markings = list() - valid_markings["None"] = marking_styles_list["None"] - for(var/markingstyle in marking_styles_list) - var/datum/sprite_accessory/M = marking_styles_list[markingstyle] - if(!(species in M.species_allowed)) - continue - if(M.marking_location != "body") - continue - - valid_markings[markingstyle] = marking_styles_list[markingstyle] - - var/list/marking_styles = params2list(m_styles) - var/new_marking_style = input(user, "Choose the style of your character's body markings:", "Character Preference", marking_styles["body"]) as null|anything in valid_markings - if(new_marking_style) - marking_styles["body"] = new_marking_style - m_styles = list2params(marking_styles) - - if("m_body_colour") - if(species in list("Unathi", "Vulpkanin", "Tajaran")) //Species with body markings. - var/input = "Choose the colour of your your character's body markings:" - var/list/marking_colours = params2list(m_colours) - marking_colours["body"] = sanitize_hexcolor(marking_colours["body"]) - var/new_markings = input(user, input, "Character Preference", rgb(hex2num(copytext(marking_colours["body"], 2, 4)), hex2num(copytext(marking_colours["body"], 4, 6)), hex2num(copytext(marking_colours["body"], 6, 8)))) as color|null - if(new_markings) - marking_colours["body"] = new_markings - m_colours = list2params(marking_colours) - - if("m_style_tail") - if(species in list("Vox", "Vulpkanin")) //Species with tail markings. - var/list/valid_markings = list() - valid_markings["None"] = marking_styles_list["None"] - for(var/markingstyle in marking_styles_list) - var/datum/sprite_accessory/body_markings/tail/M = marking_styles_list[markingstyle] - if(M.marking_location != "tail") - continue - if(!(species in M.species_allowed)) - continue - if(!body_accessory) - if(M.tails_allowed) - continue - else - if(!M.tails_allowed || !(body_accessory in M.tails_allowed)) - continue - - valid_markings[markingstyle] = marking_styles_list[markingstyle] - - var/list/marking_styles = params2list(m_styles) - var/new_marking_style = input(user, "Choose the style of your character's tail markings:", "Character Preference", marking_styles["tail"]) as null|anything in valid_markings - if(new_marking_style) - marking_styles["tail"] = new_marking_style - m_styles = list2params(marking_styles) - - if("m_tail_colour") - if(species in list("Vox", "Vulpkanin")) //Species with tail markings. - var/input = "Choose the colour of your your character's tail markings:" - var/list/marking_colours = params2list(m_colours) - marking_colours["tail"] = sanitize_hexcolor(marking_colours["tail"]) - var/new_markings = input(user, input, "Character Preference", rgb(hex2num(copytext(marking_colours["tail"], 2, 4)), hex2num(copytext(marking_colours["tail"], 4, 6)), hex2num(copytext(marking_colours["tail"], 6, 8)))) as color|null - if(new_markings) - marking_colours["tail"] = new_markings - m_colours = list2params(marking_colours) - - 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) - var/list/marking_styles = params2list(m_styles) - marking_styles["tail"] = "None" - m_styles = list2params(marking_styles) - 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 - - var/list/marking_styles = params2list(m_styles) //Handle resetting of head markings if the head is changed. - switch(new_state) - if("Normal") - if(limb == "head") - marking_styles["head"] = "None" - h_style = hair_styles_list["Bald"] - 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"] - marking_styles["head"] = "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" - m_styles = list2params(marking_styles) //Pass the reset head markings back to the preference variable. - 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_HEAD_MARKINGS) || (character.species.bodyflags & HAS_BODY_MARKINGS) || (character.species.bodyflags & HAS_TAIL_MARKINGS)) - character.m_colours = m_colours - character.m_styles = m_styles - - 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_styles = "head=None;\ + body=None;\ + tail=None" //Marking styles. + var/m_colours = "head=#000000;\ + body=#000000;\ + tail=#000000" //Marking colours. + 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 += "Name: " + dat += "[real_name]" + dat += "(Randomize)" + dat += "(Always Randomize)
      " + dat += "
      " + dat += "
      " + dat += "Slot [slot_name] - " + dat += "Load slot - " + dat += "Save slot - " + dat += "Reload slot" + 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("Machine", "Tajaran", "Unathi")) //Species with head markings. + var/list/marking_styles = params2list(m_styles) + var/list/marking_colours = params2list(m_colours) + marking_colours["head"] = sanitize_hexcolor(marking_colours["head"]) + dat += "Head Markings: " + dat += "[marking_styles["head"]]" + dat += "Color [color_square(hex2num(copytext(marking_colours["head"], 2, 4)), hex2num(copytext(marking_colours["head"], 4, 6)), hex2num(copytext(marking_colours["head"], 6, 8)))]
      " + if(species in list("Unathi", "Vulpkanin", "Tajaran")) //Species with body markings. + var/list/marking_styles = params2list(m_styles) + var/list/marking_colours = params2list(m_colours) + marking_colours["body"] = sanitize_hexcolor(marking_colours["body"]) + dat += "Body Markings: " + dat += "[marking_styles["body"]]" + dat += "Color [color_square(hex2num(copytext(marking_colours["body"], 2, 4)), hex2num(copytext(marking_colours["body"], 4, 6)), hex2num(copytext(marking_colours["body"], 6, 8)))]
      " + if(species in list("Vox", "Vulpkanin")) //Species with tail markings. + var/list/marking_styles = params2list(m_styles) + var/list/marking_colours = params2list(m_colours) + marking_colours["tail"] = sanitize_hexcolor(marking_colours["tail"]) + dat += "Tail Markings: " + dat += "[marking_styles["tail"]]" + dat += "Color [color_square(hex2num(copytext(marking_colours["tail"], 2, 4)), hex2num(copytext(marking_colours["tail"], 4, 6)), hex2num(copytext(marking_colours["tail"], 6, 8)))]
      " + + 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 += "

      General Settings

      " + dat += "Fancy NanoUI: [(nanoui_fancy) ? "Yes" : "No"]
      " + dat += "Ghost-Item Attack Animation: [(show_ghostitem_attack) ? "Yes" : "No"]
      " + dat += "Custom UI settings:
      " + dat += " - UI Style: [UI_style]
      " + dat += " - Color: [UI_style_color]
      __

      " + dat += " - Alpha (transparency): [UI_style_alpha]
      " + dat += "
      " + dat += "Play admin midis: [(sound & SOUND_MIDI) ? "Yes" : "No"]
      " + dat += "Play lobby music: [(sound & SOUND_LOBBY) ? "Yes" : "No"]
      " + if(user.client.holder) + dat += "Adminhelp sound: " + dat += "[(sound & SOUND_ADMINHELP)?"On":"Off"]
      " + + if(check_rights(R_ADMIN,0)) + dat += "OOC:     Change
      " + if(config.allow_Metadata) + dat += "OOC notes: Edit
      " + if(unlock_content) + dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]
      " + + dat += "Randomized character slot: [randomslot ? "Yes" : "No"]
      " + dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"]
      " + dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"]
      " + dat += "Ghost radio: [(toggles & CHAT_GHOSTRADIO) ? "Nearest Speakers" : "All Chatter"]
      " + + dat += "
      " + dat += "

      Special Role Settings

      " + if(jobban_isbanned(user, "Syndicate")) + dat += "You are banned from special roles." + be_special = list() + else + for(var/i in special_roles) + if(jobban_isbanned(user, i)) + dat += "Be [capitalize(i)]: \[BANNED]
      " + else if(!player_old_enough_antag(user.client,i)) + var/available_in_days_antag = available_in_days_antag(user.client,i) + dat += "Be [capitalize(i)]: \[IN [(available_in_days_antag)] DAYS]
      " + else + dat += "Be [capitalize(i)]: [(i in src.be_special) ? "Yes" : "No"]
      " + 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 += "" + dat += "" + + var/datum/loadout_category/LC = loadout_categories[gear_tab] + dat += "" + dat += "" + dat += "" + for(var/gear_name in LC.gear) + var/datum/gear/G = LC.gear[gear_name] + var/ticked = (G.display_name in gear) + dat += "" + dat += "" + if(ticked) + . += "" + dat += "
      [total_cost]/[MAX_GEAR_COST] loadout points spent. \[Clear Loadout\]
      " + + 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 += "

      [LC.category]

      [G.display_name][G.cost]" + if(G.allowed_roles) + dat += "Restrictions: " + for(var/role in G.allowed_roles) + dat += role + " " + dat += "" + dat += "[G.description]
      " + for(var/datum/gear_tweak/tweak in G.gear_tweaks) + . += " [tweak.get_contents(get_tweak_metadata(G, tweak))]" + . += "
      " + + 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 += "" + continue + if(jobban_isbanned(user, rank)) + HTML += "[rank]" + continue + if(!job.player_old_enough(user.client)) + var/available_in_days = job.available_in_days(user.client) + HTML += "[rank]" + 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 += "" + 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 += "
      " + var/rank = job.title + lastJob = job + if(!is_job_whitelisted(user, rank)) + HTML += "[rank] \[KARMA]
      \[BANNED]
      \[IN [(available_in_days)] DAYS]
      " + + 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 += "
      " + + 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 "
    3. [species] cannot be fat.
    4. " + return "
    5. [label]: [disabilities & flag ? "Yes" : "No"]
    6. " + +/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_styles = "head=None;\ + body=None;\ + tail=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("m_style_head") + if(species in list("Machine", "Tajaran", "Unathi")) //Species with head markings. + var/list/valid_markings = list() + valid_markings["None"] = marking_styles_list["None"] + for(var/markingstyle in marking_styles_list) + var/datum/sprite_accessory/M = marking_styles_list[markingstyle] + if(!(species in M.species_allowed)) + continue + if(M.marking_location != "head") + 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/list/marking_styles = params2list(m_styles) + var/new_marking_style = input(user, "Choose the style of your character's head markings:", "Character Preference", marking_styles["head"]) as null|anything in valid_markings + if(new_marking_style) + marking_styles["head"] = new_marking_style + m_styles = list2params(marking_styles) + + if("m_head_colour") + if(species in list("Machine", "Tajaran", "Unathi")) //Species with head markings. + var/input = "Choose the colour of your your character's head markings:" + var/list/marking_colours = params2list(m_colours) + marking_colours["head"] = sanitize_hexcolor(marking_colours["head"]) + var/new_markings = input(user, input, "Character Preference", rgb(hex2num(copytext(marking_colours["head"], 2, 4)), hex2num(copytext(marking_colours["head"], 4, 6)), hex2num(copytext(marking_colours["head"], 6, 8)))) as color|null + if(new_markings) + marking_colours["head"] = new_markings + m_colours = list2params(marking_colours) + + if("m_style_body") + if(species in list("Unathi", "Vulpkanin", "Tajaran")) //Species with body markings. + var/list/valid_markings = list() + valid_markings["None"] = marking_styles_list["None"] + for(var/markingstyle in marking_styles_list) + var/datum/sprite_accessory/M = marking_styles_list[markingstyle] + if(!(species in M.species_allowed)) + continue + if(M.marking_location != "body") + continue + + valid_markings[markingstyle] = marking_styles_list[markingstyle] + + var/list/marking_styles = params2list(m_styles) + var/new_marking_style = input(user, "Choose the style of your character's body markings:", "Character Preference", marking_styles["body"]) as null|anything in valid_markings + if(new_marking_style) + marking_styles["body"] = new_marking_style + m_styles = list2params(marking_styles) + + if("m_body_colour") + if(species in list("Unathi", "Vulpkanin", "Tajaran")) //Species with body markings. + var/input = "Choose the colour of your your character's body markings:" + var/list/marking_colours = params2list(m_colours) + marking_colours["body"] = sanitize_hexcolor(marking_colours["body"]) + var/new_markings = input(user, input, "Character Preference", rgb(hex2num(copytext(marking_colours["body"], 2, 4)), hex2num(copytext(marking_colours["body"], 4, 6)), hex2num(copytext(marking_colours["body"], 6, 8)))) as color|null + if(new_markings) + marking_colours["body"] = new_markings + m_colours = list2params(marking_colours) + + if("m_style_tail") + if(species in list("Vox", "Vulpkanin")) //Species with tail markings. + var/list/valid_markings = list() + valid_markings["None"] = marking_styles_list["None"] + for(var/markingstyle in marking_styles_list) + var/datum/sprite_accessory/body_markings/tail/M = marking_styles_list[markingstyle] + if(M.marking_location != "tail") + continue + if(!(species in M.species_allowed)) + continue + if(!body_accessory) + if(M.tails_allowed) + continue + else + if(!M.tails_allowed || !(body_accessory in M.tails_allowed)) + continue + + valid_markings[markingstyle] = marking_styles_list[markingstyle] + + var/list/marking_styles = params2list(m_styles) + var/new_marking_style = input(user, "Choose the style of your character's tail markings:", "Character Preference", marking_styles["tail"]) as null|anything in valid_markings + + if(new_marking_style) + marking_styles["tail"] = new_marking_style + m_styles = list2params(marking_styles) + + if("m_tail_colour") + if(species in list("Vox", "Vulpkanin")) //Species with tail markings. + var/input = "Choose the colour of your your character's tail markings:" + var/list/marking_colours = params2list(m_colours) + marking_colours["tail"] = sanitize_hexcolor(marking_colours["tail"]) + var/new_markings = input(user, input, "Character Preference", rgb(hex2num(copytext(marking_colours["tail"], 2, 4)), hex2num(copytext(marking_colours["tail"], 4, 6)), hex2num(copytext(marking_colours["tail"], 6, 8)))) as color|null + if(new_markings) + marking_colours["tail"] = new_markings + m_colours = list2params(marking_colours) + + 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) + var/list/marking_styles = params2list(m_styles) + marking_styles["tail"] = "None" + m_styles = list2params(marking_styles) + 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 + + var/list/marking_styles = params2list(m_styles) //Handle resetting of head markings if the head is changed. + switch(new_state) + if("Normal") + if(limb == "head") + marking_styles["head"] = "None" + h_style = hair_styles_list["Bald"] + 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"] + marking_styles["head"] = "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" + m_styles = list2params(marking_styles) //Pass the reset head markings back to the preference variable. + 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.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_HEAD_MARKINGS) || (character.species.bodyflags & HAS_BODY_MARKINGS) || (character.species.bodyflags & HAS_TAIL_MARKINGS)) + character.m_colours = m_colours + character.m_styles = m_styles + + 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 fea1d3e7af2..0dcfade53af 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 @@ -156,7 +156,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() @@ -232,6 +233,7 @@ //socks socks = query.item[56] body_accessory = query.item[57] + gear = params2list(query.item[58]) //Sanitize metadata = sanitize_text(metadata, initial(metadata)) @@ -292,6 +294,7 @@ if(!rlimb_data) src.rlimb_data = list() if(!m_colours) m_colours = initial(m_colours) if(!m_styles) m_styles = initial(m_styles) + if(!gear) gear = list() return 1 @@ -299,12 +302,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() @@ -366,7 +372,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]'"} ) @@ -397,7 +404,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]', @@ -418,7 +425,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..281537c5f77 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 @@ -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 @@ -212,8 +212,8 @@ BLIND // can't see anything /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 +228,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 +243,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)) @@ -316,14 +316,13 @@ BLIND // can't see anything 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) + 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.") @@ -332,13 +331,10 @@ BLIND // can't see anything 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(ishuman(user) && H.internal && user.wear_mask == src && H.internals) /*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.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.*/ @@ -346,14 +342,13 @@ BLIND // can't see anything 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) + 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() @@ -452,6 +447,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) @@ -496,6 +492,15 @@ 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/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/verb/openjacket(var/mob/user) //The verb you can use to adjust jackets. set name = "Open/Close Jacket" set category = "Object" @@ -521,7 +526,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 +548,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 +566,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 +591,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 +624,18 @@ 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 )) 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..673685c4fc4 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) @@ -158,6 +158,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 +221,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." @@ -424,6 +426,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 +502,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..4c6fed0eec4 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -73,7 +73,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( @@ -84,11 +83,12 @@ /obj/item/clothing/glasses/hud/security/chameleon name = "Chamleon 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,6 +109,7 @@ desc = "Sunglasses with a HUD." icon_state = "sunhud" darkness_view = 1 + flash_protect = 1 tint = 1 prescription_upgradable = 1 diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 060dd1ca47c..d98ee1d0154 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -47,4 +47,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/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 5dc555a10d7..48e2ccb7f95 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -7,7 +7,7 @@ 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" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index a9e8bbdb7e2..17058cc23b5 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" @@ -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..6d300c724bd 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 @@ -363,4 +378,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..21c493bf66c 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -20,7 +20,7 @@ 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" species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") @@ -96,13 +96,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" @@ -149,7 +149,7 @@ 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 @@ -161,7 +161,7 @@ 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/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 6f6d0f03446..c1124386acc 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,7 +27,7 @@ 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" @@ -66,7 +66,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 +78,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" diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index d9817add99f..ca5a267c6a4 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -63,7 +63,7 @@ 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) + 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 species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") @@ -275,3 +275,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/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index babeb811a37..9a2f3fcade3 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -21,7 +21,7 @@ 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) + armor = list(melee = 25, bullet = 25, laser = 25, energy = 25, bomb = 50, bio = 10, rad = 0) species_restricted = null //Syndicate tech means even Tajarans can kick ass with these strip_delay = 70 @@ -29,7 +29,7 @@ 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 @@ -99,6 +99,12 @@ 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" desc = "A pair of boots worn by the followers of Nar-Sie." @@ -201,3 +207,14 @@ 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..e231922de92 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( @@ -211,7 +195,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 +217,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..96ae6519d5d 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -23,7 +23,6 @@ icon_state = "chronosuit" item_state = "chronosuit" action_button_name = "Toggle Chronosuit" - slowdown = 2 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..b5498726203 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" @@ -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..a656feeb08f 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -55,7 +55,6 @@ 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 +246,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 +277,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) @@ -297,7 +295,7 @@ icon_state = "hardsuit1-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" @@ -339,11 +337,10 @@ icon_state = "hardsuit1-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) + 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() @@ -379,7 +376,7 @@ 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" 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 @@ -398,7 +395,7 @@ desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in travel mode." icon_state = "hardsuit0-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 +417,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 +428,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 +454,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 +464,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 +502,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 +510,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 = "hardsuit0-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 = "hardsuit-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 = "hardsuit-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 = "hardsuit1-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 = "hardsuit1-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/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..e2b8e01fd54 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" @@ -85,6 +87,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 + action_button_name = "Open/Close Jacket" + adjust_flavour = "unzip" /obj/item/clothing/suit/armor/hos name = "armored coat" @@ -92,7 +110,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 @@ -115,6 +133,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 +157,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 +167,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 +205,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 +215,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 +230,129 @@ 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) + action_button_name = "Toggle Reactive Armor" + 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() /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 +369,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 +414,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..e6d6c91508f --- /dev/null +++ b/code/modules/clothing/suits/hood.dm @@ -0,0 +1,68 @@ +//Hoods for winter coats and chaplain hoodie etc + +/obj/item/clothing/suit/hooded + action_button_name = "Adjust hood" + 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() + verbs -= /obj/item/clothing/suit/verb/openjacket //you can't unbutton those, deal with it + ..() + +/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/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 + +/obj/item/clothing/suit/hooded/dropped() + ..() + RemoveHood() + +/obj/item/clothing/suit/hooded/verb/Hooderize(var/mob/user) + set name = "Adjust the hood" + set category = "Object" + set src in usr + if(!isliving(usr)) + return + if(usr.stat) + return + ToggleHood() + +/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() + else + RemoveHood() diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index f9ce0cd4593..b94be6647bb 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." @@ -233,6 +245,10 @@ suit_adjusted = 1 action_button_name = "Button/Unbutton Jacket" 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" @@ -244,6 +260,10 @@ ignore_suitadjust = 0 action_button_name = "Button/Unbutton Jacket" 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 @@ -258,6 +278,10 @@ suit_adjusted = 1 action_button_name = "Button/Unbutton Jacket" 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..71bdd524b8f 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -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..ee7be2644e9 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,194 @@ 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 = 15, bullet = 10, laser = 20, energy = 5, bomb = 15, bio = 0, rad = 0) //worse stats than normal armor, but this one protects arms and makes space hurt less, CHOICES! + 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 = "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 = "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 +478,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 +486,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 +535,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 + action_button_name = "Open/Close Jacket" + 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 @@ -403,7 +651,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 +694,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 +707,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 @@ -473,6 +721,10 @@ cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS action_button_name = "Zip/Unzip Jacket" 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 +739,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 @@ -504,12 +756,26 @@ desc = "A classy clown officer's overcoat, also designed by Hugo Boss." icon_state = "officersuit" item_state = "officersuit" + ignore_suitadjust = 0 + action_button_name = "Button/Unbutton Jacket" + 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 + action_button_name = "Button/Unbutton Jacket" + 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,7 +783,7 @@ 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" flags = NODROP @@ -564,7 +830,7 @@ 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 +871,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..a8e44f2c363 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -6,7 +6,7 @@ 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. @@ -24,7 +24,8 @@ loc = has_suit has_suit.overlays += inv_overlay - to_chat(user, "You attach [src] to [has_suit].") + 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) @@ -89,6 +90,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" @@ -231,7 +236,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 +394,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 +424,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..d792c5df7ac 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -7,7 +7,7 @@ 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 + 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..1848d8fdfb7 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -7,7 +7,7 @@ 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 + 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..011f6784362 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -5,7 +5,7 @@ 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" 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
      \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) - 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 += "
      Name: [active1.fields["name"]] \ ID: [active1.fields["id"]]
      \n \ Sex: [active1.fields["sex"]]
      \n \ @@ -99,10 +95,11 @@ Fingerprint: [active1.fields["fingerprint"]]
      \n \ Physical Status: [active1.fields["p_stat"]]
      \n \ Mental Status: [active1.fields["m_stat"]]
      \ - Photo:
      " + 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("
      \n
      Medical 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
      \n
      Comments/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("
      \n
      Medical 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
      \n
      Comments/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(" \ -
      \ Name: [active1.fields["name"]]
      \ ID: [active1.fields["id"]]
      \n \ @@ -140,11 +136,11 @@ Fingerprint: [active1.fields["fingerprint"]]
      \n \ Physical Status: [active1.fields["p_stat"]]
      \n \ Mental Status: [active1.fields["m_stat"]]
      Photo:
      \ -
      ") + 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("
      \n
      Security Data

      \nCriminal Status: []
      \n
      \nMinor Crimes: []
      \nDetails: []
      \n
      \nMajor Crimes: []
      \nDetails: []
      \n
      \nImportant Notes:
      \n\t[]
      \n
      \n
      Comments/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("
      \n
      Security Data

      \nCriminal Status: []
      \n
      \nMinor Crimes: []
      \nDetails: []
      \n
      \nMajor Crimes: []
      \nDetails: []
      \n
      \nImportant Notes:
      \n\t[]
      \n
      \n
      Comments/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/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/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/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 2d4cd33400a..fbd3559e6a8 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -17,7 +17,7 @@ icon_state = "tatgun" force = 0 throwforce = 0 - w_class = 1.0 + w_class = 1 var/used = 0 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 @@ -88,6 +88,8 @@ update_icon() + + /obj/item/weapon/claymore/fluff // MrBarrelrolll: Maximus Greenwood name = "Greenwood's Blade" desc = "A replica claymore with strange markings scratched into the blade." @@ -95,7 +97,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 @@ -174,6 +176,30 @@ 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 + ////////////////////////////////// //////////// Clothing //////////// ////////////////////////////////// @@ -215,6 +241,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" @@ -225,6 +253,8 @@ ignore_suitadjust = 1 action_button_name = null adjust_flavour = null + species_fit = null + sprite_sheets = null /obj/item/clothing/suit/fluff/kluys // Kluys: Cripty Pandaen name = "Nano Fibre Jacket" @@ -262,6 +292,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" @@ -336,6 +368,8 @@ ignore_suitadjust = 1 action_button_name = null adjust_flavour = null + species_fit = null + sprite_sheets = null /obj/item/clothing/under/fluff/fox name = "Aeronautics Jumpsuit" @@ -413,7 +447,7 @@ icon = 'icons/obj/custom_items.dmi' icon_state = "chronx_robe" item_state = "chronx_robe" - flags = ONESIZEFITSALL + flags_size = ONESIZEFITSALL action_button_name = "Transform Robes" adjust_flavour = "untransform" ignore_suitadjust = 0 @@ -443,6 +477,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" @@ -458,6 +494,8 @@ item_state = "elliot_windbreaker_open" adjust_flavour = "unzip" suit_adjusted = 1 + species_fit = null + sprite_sheets = null /obj/item/device/fluff/tattoo_gun/elliot_cybernetic_tat desc = "A cheap plastic tattoo application pen.
          This one seems heavily used." @@ -480,4 +518,4 @@ update_icon() else - to_chat(user, "The [src] is out of ink!") \ No newline at end of file + to_chat(user, "The [src] is out of ink!") 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 3a5e19169c0..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,7 +18,7 @@ /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) @@ -29,21 +29,21 @@ // 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(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 (M && ( 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 == "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(S && (name == S.fields["name"])) fingerprint = S.fields["fingerprint"] @@ -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 diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 7448d3da352..bc7ef8b118e 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) @@ -225,7 +225,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 +238,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 +275,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 +295,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 +323,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 +364,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 +391,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..42eda2be496 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 += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + if(containers["glass bottle"]) + dat += "" + else + dat += "" + if(containers["plastic bottle"]) + dat += "" + else + dat += "" + if(containers["metal can"]) + dat += "" + else + dat += "" + dat += "" + dat += "
          Containers:
          Glass Bottles: [containers["glass bottle"]]Plastic Bottles: [containers["plastic bottle"]]Metal Cans: [containers["metal can"]]
          DispenseOut of stockDispenseOut of stockDispenseOut of stock
          " + dat += "
          " + dat += "" + dat += "" + dat += "" + dat += "" + + dat += "" + for(var/i = 1, i <= slots.len, i++) + var/obj/O = slots[i] + if(O) + dat += "" + else + dat += "" + + if(slots[1] && slots[2] && slots[3]) + dat += "" + else + dat += "" + dat += "" + + dat += "" + for(var/i = 1, i <= slots.len, i++) + if(slots[i]) + dat += "" + else + dat += "" + dat += "" + dat += "" + dat += "
          Ingredient Tray Contents:
          [bicon(O)]
          [O.name]
          Tray EmptyProcess IngredientsInsufficient Ingredients
          EjectN/AEject All
          " + 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/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 = "" - for (var/t in L) + for(var/t in L) dat +="" dat += "
          [header]
          [L[t]][t]
          " 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/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 += "" dat += "" - if ("stats" in scanner) + if("stats" in scanner) dat += "" - if ("temperature" in scanner) + if("temperature" in scanner) dat += "" - if ("light" in scanner) + if("light" in scanner) dat += "" - if ("soil" in scanner) + if("soil" in scanner) dat += "" dat += "" - 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 += "" dat += "" - if ("stats" in scanner) + if("stats" in scanner) dat += "" if(seed.get_trait(TRAIT_HARVEST_REPEAT)) dat += "" else dat += "" - if ("temperature" in scanner) + if("temperature" in scanner) dat += "" - if ("light" in scanner) + if("light" in scanner) dat += "" - 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 += "" @@ -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..b45fd4070fe 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -112,7 +112,7 @@ /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 @@ -427,7 +427,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 +471,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 +537,7 @@ var/obj/item/weapon/reagent_containers/syringe/S = O - if (S.mode == 1) + if(S.mode == 1) if(seed) return ..() else @@ -551,7 +551,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,7 +579,7 @@ 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].") @@ -588,12 +588,12 @@ 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 +608,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..d272e49f0c8 100644 --- a/code/modules/hydroponics/trays/tray_process.dm +++ b/code/modules/hydroponics/trays/tray_process.dm @@ -24,7 +24,7 @@ // 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() @@ -81,7 +81,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 @@ -98,7 +98,7 @@ 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 // Some plants thrive and live off of weeds. @@ -106,7 +106,7 @@ 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 // Handle life and death. 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..2f0acea4433 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -69,7 +69,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 +288,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/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/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..c20259c6198 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -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 @@ -962,7 +962,7 @@ name = "mining scanner" icon_state = "mining1" item_state = "analyzer" - w_class = 2.0 + w_class = 2 flags = CONDUCT slot_flags = SLOT_BELT var/cooldown = 0 @@ -993,7 +993,7 @@ name = "advanced mining scanner" icon_state = "mining0" item_state = "analyzer" - w_class = 2.0 + w_class = 2 flags = CONDUCT slot_flags = SLOT_BELT var/cooldown = 0 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..f82975572a2 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -65,7 +65,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 +122,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 +166,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 +178,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 +199,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 +249,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..20c154d3d4c 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,48 +34,48 @@ 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") @@ -88,7 +88,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 +122,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 7061b653f81..c6636d034e0 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -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) @@ -259,7 +268,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] @@ -368,6 +377,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 @@ -417,7 +429,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 @@ -460,7 +472,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() @@ -517,8 +529,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 ..() @@ -546,17 +558,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]...") @@ -605,27 +617,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/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..d0bed142a38 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -11,13 +11,13 @@ //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) && (!(istype(src, /mob/dead/observer)))) //Ghosts can hear even in vacuum. var/datum/gas_mixture/environment = T.return_air() var/pressure = (environment)? environment.return_pressure() : 0 if(pressure < SOUND_MINIMUM_PRESSURE && get_dist(speaker, src) > 1) return - 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 @@ -26,8 +26,8 @@ return //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(!speaker || (src.sdisabilities & BLIND || src.blinded) || !(speaker in view(src))) message = stars(message) if(!(language && (language.flags & INNATE))) // skip understanding checks for INNATE languages @@ -73,7 +73,7 @@ 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) @@ -92,8 +92,8 @@ 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(!speaker || (src.sdisabilities & BLIND || src.blinded) || !(speaker in view(src))) message = stars(message) if(!(language && (language.flags & INNATE))) // skip understanding checks for INNATE languages @@ -128,7 +128,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 +143,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 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/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..9996c3eeb89 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,13 +85,13 @@ 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 @@ -101,7 +101,7 @@ if(3.0) b_loss += 30 - if (prob(50) && !shielded) + if(prob(50) && !shielded) Paralyse(1) ear_damage += 15 ear_deaf += 60 @@ -112,13 +112,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 +153,7 @@ "The [M.name] has shocked [src]!") Weaken(power) - if (stuttering < power) + if(stuttering < power) stuttering = power Stun(power) @@ -161,7 +161,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 +183,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 +196,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 +216,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 +227,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 +251,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 +263,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 +272,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 +294,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 +310,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..d478194bc44 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) diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 2b5060468a1..e2862184b79 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" 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..c8bd8765a97 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,12 +76,12 @@ 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 @@ -92,7 +92,7 @@ if(3.0) b_loss += 30 - if (prob(50)) + if(prob(50)) Paralyse(1) ear_damage += 15 ear_deaf += 60 @@ -123,14 +123,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 +148,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 +160,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 +180,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 +194,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 +206,7 @@ switch(M.a_intent) - if (I_HELP) + if(I_HELP) sleeping = max(0,sleeping-5) resting = 0 AdjustParalysis(-3) @@ -215,7 +215,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/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..d558e50a1b4 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -23,29 +23,29 @@ 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 ..() diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 92c04ca0066..f75cfee8f9b 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 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..7b04e52f69b 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) @@ -192,7 +193,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..1fea808c660 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 @@ -890,51 +890,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 +966,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 diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm index 411dd7ec550..c8204e03bbd 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)" 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..40c935188cf --- /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(sdisabilities & 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 e5b252290c7..bc3439e8992 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -203,15 +203,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 @@ -414,16 +413,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 +460,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 +488,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 +500,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 +510,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 @@ -634,8 +633,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 +650,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 +668,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 +714,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 +827,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 +842,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 +865,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 +878,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 +895,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 +908,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 +936,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 +957,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 +971,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 +995,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 +1008,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 +1026,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 +1039,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 +1067,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 +1085,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 +1194,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 +1323,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 +1358,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]) @@ -1622,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 @@ -1655,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!") @@ -1885,7 +1884,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 066b14030c1..e6388e8673e 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -72,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 @@ -82,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..aa115ad8c4c 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 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..ec65c450792 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_wear_pda) 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) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index bde2c900636..47448a73262 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 @@ -150,7 +150,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) @@ -423,7 +423,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 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index c7c20904da4..28e39b53f6e 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 @@ -693,10 +708,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 +722,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 +771,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 +781,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 +793,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 @@ -951,7 +966,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) @@ -961,7 +976,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 @@ -1016,17 +1031,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) @@ -1052,7 +1067,8 @@ 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) @@ -1137,7 +1153,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++ @@ -1156,9 +1172,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..552daf2ba48 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -47,21 +47,21 @@ 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(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 - if (istype(other, /mob/living/carbon/slime)) + if(istype(other, /mob/living/carbon/slime)) return 1 //This is already covered by mob/say_understands() - //if (istype(other, /mob/living/simple_animal)) + //if(istype(other, /mob/living/simple_animal)) // if((other.universal_speak && !speaking) || src.universal_speak || src.universal_understand) // return 1 // return 0 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..40fcfb738b8 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -125,7 +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) + if(H.internals) H.internals.icon_state = "internal1" // Plasmamen are so fucking different that they need their own proc. 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 ad0d5b18c61..9091fcd9079 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 diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 4f366b8fd89..2beddf0359d 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -364,7 +364,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) + if(H.internals) H.internals.icon_state = "internal1" /datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H) @@ -692,7 +692,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 +703,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 +728,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 @@ -864,17 +862,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_HEAD_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 29b152bd85f..dfe570e8a98 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -609,7 +609,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]!") @@ -632,7 +632,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 @@ -641,10 +646,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) @@ -898,7 +903,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) @@ -916,7 +920,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]!") @@ -1264,13 +1268,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 @@ -1281,7 +1301,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 c26508b1374..671e289ee21 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -448,7 +448,7 @@ /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..b1c83a1e7c1 100644 --- a/code/modules/mob/living/carbon/shock.dm +++ b/code/modules/mob/living/carbon/shock.dm @@ -23,7 +23,7 @@ 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..d8a89b4d49f 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.sdisabilities & BLIND) src.blinded = 1 - if (src.sdisabilities & DEAF) + if(src.sdisabilities & 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,7 +240,7 @@ 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++ @@ -278,7 +278,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 +286,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 +340,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 +370,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 +456,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 +465,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..ab12c584259 100644 --- a/code/modules/mob/living/carbon/superheroes.dm +++ b/code/modules/mob/living/carbon/superheroes.dm @@ -191,14 +191,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/life.dm b/code/modules/mob/living/life.dm index 82f865621da..1bdc8e9eb57 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -95,7 +95,7 @@ if(paralysis) stat = UNCONSCIOUS - else if (status_flags & FAKEDEATH) + else if(status_flags & FAKEDEATH) stat = UNCONSCIOUS else diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index bd360456009..4e2007872a2 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -55,7 +55,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 +271,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 +323,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() @@ -440,26 +440,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 +473,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? @@ -854,7 +854,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..d4e6d613d9c 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -54,4 +54,6 @@ 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/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/say.dm b/code/modules/mob/living/say.dm index 85eea65bbab..876a1d9c98b 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -28,7 +28,8 @@ var/list/department_radio_keys = list( ":T" = "Syndicate", "#T" = "Syndicate", ".T" = "Syndicate", ":U" = "Supply", "#U" = "Supply", ".U" = "Supply", ":Z" = "Service", "#Z" = "Service", ".Z" = "Service", - ":P" = "AI Private", "#P" = "AI Private", ".P" = "AI Private" + ":P" = "AI Private", "#P" = "AI Private", ".P" = "AI Private", + ":-" = "Special Ops", "#-" = "Special Ops", ".-" = "Special Ops" ) @@ -48,14 +49,14 @@ proc/get_radio_key_from_channel(var/channel) /mob/living/proc/binarycheck() - if (istype(src, /mob/living/silicon/pai)) + if(istype(src, /mob/living/silicon/pai)) return - if (!ishuman(src)) + if(!ishuman(src)) return var/mob/living/carbon/human/H = src - if (H.l_ear || H.r_ear) + if(H.l_ear || H.r_ear) var/obj/item/device/radio/headset/dongle if(istype(H.l_ear,/obj/item/device/radio/headset)) dongle = H.l_ear @@ -93,10 +94,7 @@ proc/get_radio_key_from_channel(var/channel) verb = "stammers" speech_problem_flag = 1 - if(GREY in mutations) - message = "[message]" - - else if(COMIC in mutations) + if(COMIC in mutations) message = "[message]" if(!IsVocal()) @@ -141,8 +139,8 @@ proc/get_radio_key_from_channel(var/channel) return emote(copytext(message,2)) //parse the radio code and consume it - if (message_mode) - if (message_mode == "headset") + if(message_mode) + if(message_mode == "headset") message = copytext(message,2) //it would be really nice if the parse procs could do this for us. else message = copytext(message,3) @@ -209,18 +207,18 @@ proc/get_radio_key_from_channel(var/channel) for(var/mob/living/M in hearers(5, src)) if((M != src) && msg) M.show_message(msg) - if (speech_sound) + if(speech_sound) sound_vol *= 0.5 var/turf/T = get_turf(src) //handle nonverbal and sign languages here - if (speaking) - if (speaking.flags & NONVERBAL) - if (prob(30)) + if(speaking) + if(speaking.flags & NONVERBAL) + if(prob(30)) src.custom_emote(1, "[pick(speaking.signlang_verb)].") - if (speaking.flags & SIGNLANG) + if(speaking.flags & SIGNLANG) return say_signlang(message, pick(speaking.signlang_verb), speaking) var/list/listening = list() @@ -233,7 +231,7 @@ proc/get_radio_key_from_channel(var/channel) if(pressure < SOUND_MINIMUM_PRESSURE) message_range = 1 - 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 @@ -253,9 +251,9 @@ proc/get_radio_key_from_channel(var/channel) listening_obj |= O for(var/mob/M in player_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 == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS) && src.client) // src.client is so that ghosts don't have to listen to mice listening |= M @@ -286,7 +284,7 @@ proc/get_radio_key_from_channel(var/channel) return 1 /mob/living/proc/say_signlang(var/message, var/verb="gestures", var/datum/language/language) - for (var/mob/O in viewers(src, null)) + for(var/mob/O in viewers(src, null)) O.hear_signlang(message, verb, language, src) return 1 @@ -296,6 +294,34 @@ proc/get_radio_key_from_channel(var/channel) /mob/living/proc/GetVoice() return name +/mob/living/emote(var/act, var/type, var/message) //emote code is terrible, this is so that anything that isn't + if(stat) return 0 //already snowflaked to shit can call the parent and handle emoting sanely + + if(..(act, type, message)) + return 1 + + if(act && type && message) //parent call + log_emote("[name]/[key] : [message]") + + for(var/mob/M in dead_mob_list) + if(!M.client || istype(M, /mob/new_player)) + continue //skip monkeys, leavers and new players //who the hell knows why new players are in the dead mob list + + if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null))) + M.show_message(message) + + switch(type) + if(1) //Visible + visible_message(message) + return 1 + if(2) //Audible + audible_message(message) + return 1 + + else //everything else failed, emote is probably invalid + if(act == "help") return //except help, because help is handled individually + to_chat(src, "\blue Unusable emote '[act]'. Say *help for a list.") + /mob/living/whisper(message as text) message = trim_strip_html_properly(message) @@ -427,7 +453,7 @@ proc/get_radio_key_from_channel(var/channel) if(watching.len) var/rendered = "[src.name] [not_heard]." - for (var/mob/M in watching) + for(var/mob/M in watching) M.show_message(rendered, 2) log_whisper("[src.name]/[src.key] : [message]") diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 812d2e8df58..b2dffb540be 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 @@ -121,8 +121,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 +138,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 +154,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 +176,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 +219,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.") @@ -306,7 +306,7 @@ var/list/ai_verbs_default = list( //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" @@ -340,9 +340,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 +436,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 +452,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 +467,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 +481,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 +507,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 +515,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 +523,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 +531,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 +549,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 +575,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 +644,7 @@ var/list/ai_verbs_default = list( d += "Query network status
          " d += "
          NameVarietyEYMPrPtHarvestTempLightNutriWaterNotesAmount
          [seed.seed_name]#[seed.uid][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)]MultipleSingle[seed.get_trait(TRAIT_IDEAL_HEAT)] K[seed.get_trait(TRAIT_IDEAL_LIGHT)] LLow
          " - 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 += "" @@ -686,7 +686,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 +716,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 +770,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 @@ -815,7 +815,8 @@ var/list/ai_verbs_default = list( "default", "floating face", "xeno queen", - "eldritch" + "eldritch", + "ancient machine" ) input = input("Please select a hologram:") as null|anything in icon_list if(input) @@ -829,6 +830,8 @@ 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")) return /mob/living/silicon/ai/proc/corereturn() @@ -852,10 +855,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 +891,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 +939,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 +955,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 +1015,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 +1043,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..6e062860eed 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() @@ -521,30 +526,31 @@ 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..7b7713c8540 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) 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..90dc2a059ac 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() @@ -20,57 +20,32 @@ sleeping = 0 ear_deaf = 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 +207,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) 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..b18ff0abea3 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,8 +80,10 @@ 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 @@ -168,7 +169,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 +222,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 +232,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 @@ -375,7 +374,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 +410,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]

          Name

          Status

          Location

          Control

          [Bot.hacked ? "(!) [Bot.name]" : Bot.name] ([Bot.model])
          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 +465,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 +509,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 +518,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 +530,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 +543,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 +561,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 +576,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 +592,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 +614,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 +634,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 +644,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 +703,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 +723,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 +747,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 +857,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 +891,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 +970,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 +1002,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 +1025,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 +1034,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 +1057,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("") else if(activated(obj)) dat += text("") else dat += text("") - if (emagged) + if(emagged) if(activated(module.emag)) dat += text("") else @@ -1081,31 +1088,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 +1137,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 +1149,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 +1180,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 +1253,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 +1278,7 @@ var/list/robot_verbs_default = list( var/icontype - if (custom_sprite == 1) + if(custom_sprite == 1) icontype = "Custom" triesleft = 0 else @@ -1292,7 +1299,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 +1336,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 +1352,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 +1400,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 +1479,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) \ No newline at end of file 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..c3dd1b71ae4 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) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 700b47da3f3..39d54ab1696 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -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/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index c894b014a87..4cbf3dd91ce 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -40,12 +40,13 @@ return /mob/living/simple_animal/construct/examine(mob/user) + to_chat(user, "*---------*") ..(user) - var/msg = "" - if (src.health < src.maxHealth) + var/msg = "" + if(src.health < src.maxHealth) msg += "" - if (src.health >= src.maxHealth/2) + if(src.health >= src.maxHealth/2) msg += "It looks slightly dented.\n" else msg += "It looks severely dented!\n" @@ -251,7 +252,7 @@ set category = "Behemoth" set name = "Summon Cultist (300)" set desc = "Teleport a cultist to your location" - if (istype(usr,/mob/living/simple_animal/constructbehemoth)) + if(istype(usr,/mob/living/simple_animal/constructbehemoth)) if(usr.energy<300) to_chat(usr, "\red You do not have enough power stored!") @@ -263,12 +264,12 @@ usr.energy -= 300 var/list/mob/living/cultists = new for(var/datum/mind/H in ticker.mode.cult) - if (istype(H.current,/mob/living)) + if(istype(H.current,/mob/living)) cultists+=H.current var/mob/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - usr) if(!cultist) return - if (cultist == usr) //just to be sure. + if(cultist == usr) //just to be sure. return cultist.loc = usr.loc usr.visible_message("/red [cultist] appears in a flash of red light as [usr] glows with power")*/ diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index e8ba27fa07d..04e6c0d7a2f 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -26,10 +26,12 @@ 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() @@ -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() @@ -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 @@ -614,7 +622,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 +631,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 +647,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 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..06fb36b5787 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 diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index b269256f7a0..dee6489b9cb 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -112,7 +112,7 @@ 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' ..() diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm index eac1a448571..6bbadd7e8d5 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 diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index 590dfa47b5e..4ddfa827dc3 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -84,9 +84,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 +100,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 +128,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 +163,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() @@ -285,4 +285,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/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm new file mode 100644 index 00000000000..c4a71cca618 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm @@ -0,0 +1,75 @@ +/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 + + +/mob/living/simple_animal/hostile/illusion/Life() + ..() + if(world.time > life_span) + death() + +/mob/living/simple_animal/hostile/illusion/death(gibbed) + ..() + visible_message("\The [src] vanishes into thin air! It was a fake!") + ghostize() + qdel(src) + +/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/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 6d2efd88010..287c3aaa69d 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -456,8 +456,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/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 71d088a425c..9a64b5c4d3e 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -77,7 +77,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 +92,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 +116,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() @@ -151,7 +151,7 @@ /mob/living/simple_animal/hostile/retaliate/malf_drone/death() ..() - visible_message("\blue \icon[src] [src] suddenly breaks apart.") + visible_message("\blue [bicon(src)] [src] suddenly breaks apart.") qdel(src) /mob/living/simple_animal/hostile/retaliate/malf_drone/Destroy() //Seriously, what the actual hell. diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 32bdf5fc772..72388af0037 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -39,6 +39,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 +47,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]. ") diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 6e528516e3e..983faec63d6 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -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..736b6c9b599 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -41,15 +41,15 @@ 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..362846dfd4a 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" @@ -307,14 +308,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 +341,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 +377,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]!") @@ -439,14 +440,13 @@ 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.") @@ -481,12 +481,12 @@ /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 +526,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 diff --git a/code/modules/mob/living/simple_animal/tribbles.dm b/code/modules/mob/living/simple_animal/tribbles.dm index 23def05f072..a6eb14fb25d 100644 --- a/code/modules/mob/living/simple_animal/tribbles.dm +++ b/code/modules/mob/living/simple_animal/tribbles.dm @@ -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 index 1a46e46e4e4..ba68a18a12b 100644 --- a/code/modules/mob/living/simple_animal/vox.dm +++ b/code/modules/mob/living/simple_animal/vox.dm @@ -35,20 +35,20 @@ if(O.force) if(O.force >= 25) 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 for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) + 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 ))) + 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()) @@ -62,7 +62,7 @@ to_chat(src, "\red You launch a razor-sharp quill at [target]!") for(var/mob/O in oviewers()) - if ((O.client && !( O.blinded ))) + 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) @@ -81,7 +81,7 @@ icon_state = "quill" item_state = "quill" throwforce = 5 - w_class = 3.0 + w_class = 3 sharp = 1 edge = 0 @@ -98,7 +98,7 @@ 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) + if(!target || !text) return var/mob/M = targets[target] 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..cc9788a15fe 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -14,6 +14,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 +27,6 @@ else living_mob_list += src prepare_huds() - emoteHandler = new /datum/emoteHandler(src) ..() /atom/proc/prepare_huds() @@ -57,20 +60,20 @@ if(!client) return - if (type) + if(type) if(type & 1 && (sdisabilities & BLIND || blinded || paralysis) )//Vision related - if (!( alt )) + if(!( alt )) return else msg = alt type = alt_type - if (type & 2 && (sdisabilities & DEAF || ear_deaf))//Hearing related - if (!( alt )) + if(type & 2 && (sdisabilities & DEAF || ear_deaf))//Hearing related + if(!( alt )) return else msg = alt type = alt_type - if ((type & 1 && sdisabilities & BLIND)) + if((type & 1 && sdisabilities & BLIND)) return // Added voice muffling for Issue 41. if(stat == UNCONSCIOUS || (sleeping > 0 && stat != 2)) @@ -146,7 +149,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 @@ -171,7 +174,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,6 +251,7 @@ 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( \ @@ -402,7 +406,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 +485,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 +494,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 +550,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 +563,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 +606,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 +651,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 +675,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 +692,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 +746,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 +756,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 +767,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 +784,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 +873,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. @@ -1244,7 +1248,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 +1332,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 +1348,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!") diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 13d5d7c976e..0786320e9cb 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -167,7 +167,7 @@ Unlike the object spell system, it's also possible to attach verb procs from these objects to right-click menus. This requires creating a verb for the object proc holder. - 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) */ @@ -233,6 +233,4 @@ var/datum/vision_override/vision_type = null //Vision override datum. - var/list/permanent_huds = list() - - var/datum/emoteHandler/emoteHandler \ No newline at end of file + var/list/permanent_huds = list() \ No newline at end of file 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 6e0645866d5..ff29bda1d9d 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 @@ -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 @@ -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 8d57d115ebe..69e29fa9aa8 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 @@ -256,14 +256,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) @@ -284,11 +284,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 @@ -454,17 +454,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 += "
          Resource depleted
          [obj]Activated
          [obj]Activate
          [module.emag]Activated
          " + 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]: ' + + '
      ' + + '' + + ''; + 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 = "
      t
      "; + 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>" ); + + 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>" ) + 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("